Skip to content

Commit 900944c

Browse files
Statically type all request results (#9750)
* Statically type all request results This PR adds a union type for all request results. It fixes a case which was mistyped and was caught by this change, in DevDepRequest. * Remove unused type import --------- Co-authored-by: pyamada (Remote Dev Environment) <[email protected]>
1 parent 1180254 commit 900944c

19 files changed

+118
-57
lines changed

packages/core/core/src/PackagerRunner.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ type Opts = {|
7171
previousInvalidations: Array<RequestInvalidation>,
7272
|};
7373

74-
export type PackageRequestResult = {|
74+
export type RunPackagerRunnerResult = {|
7575
bundleInfo: BundleInfo,
7676
configRequests: Array<ConfigRequest>,
7777
devDepRequests: Array<DevDepRequest>,
@@ -142,7 +142,7 @@ export default class PackagerRunner {
142142
bundleGraph: InternalBundleGraph,
143143
bundle: InternalBundle,
144144
invalidDevDeps: Array<DevDepSpecifier>,
145-
): Promise<PackageRequestResult> {
145+
): Promise<RunPackagerRunnerResult> {
146146
invalidateDevDeps(invalidDevDeps, this.options, this.config);
147147

148148
let {configs, bundleConfigs} = await this.loadConfigs(bundleGraph, bundle);

packages/core/core/src/RequestTracker.js

+41-12
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,19 @@ import {
5959
storeRequestTrackerCacheInfo,
6060
clearRequestTrackerCacheInfo,
6161
} from './RequestTrackerCacheInfo';
62+
import type {AssetGraphRequestResult} from './requests/AssetGraphRequest';
63+
import type {PackageRequestResult} from './requests/PackageRequest';
64+
import type {ConfigRequestResult} from './requests/ConfigRequest';
65+
import type {DevDepRequestResult} from './requests/DevDepRequest';
66+
import type {WriteBundlesRequestResult} from './requests/WriteBundlesRequest';
67+
import type {WriteBundleRequestResult} from './requests/WriteBundleRequest';
68+
import type {TargetRequestResult} from './requests/TargetRequest';
69+
import type {PathRequestResult} from './requests/PathRequest';
70+
import type {ParcelConfigRequestResult} from './requests/ParcelConfigRequest';
71+
import type {ParcelBuildRequestResult} from './requests/ParcelBuildRequest';
72+
import type {EntryRequestResult} from './requests/EntryRequest';
73+
import type {BundleGraphResult} from './requests/BundleGraphRequest';
74+
import type {AssetRequestResult} from './types';
6275

6376
export const requestGraphEdgeTypes = {
6477
subrequest: 2,
@@ -144,13 +157,28 @@ type Request<TInput, TResult> = {|
144157
run: ({|input: TInput, ...StaticRunOpts<TResult>|}) => Async<TResult>,
145158
|};
146159

160+
export type RequestResult =
161+
| AssetGraphRequestResult
162+
| PackageRequestResult
163+
| ConfigRequestResult
164+
| DevDepRequestResult
165+
| WriteBundlesRequestResult
166+
| WriteBundleRequestResult
167+
| TargetRequestResult
168+
| PathRequestResult
169+
| ParcelConfigRequestResult
170+
| ParcelBuildRequestResult
171+
| EntryRequestResult
172+
| BundleGraphResult
173+
| AssetRequestResult;
174+
147175
type InvalidateReason = number;
148176
type RequestNode = {|
149177
id: ContentKey,
150178
+type: typeof REQUEST,
151179
+requestType: RequestType,
152180
invalidateReason: InvalidateReason,
153-
result?: mixed,
181+
result?: RequestResult,
154182
resultCacheKey?: ?string,
155183
hash?: string,
156184
|};
@@ -184,7 +212,7 @@ type RequestGraphNode =
184212
| OptionNode
185213
| ConfigKeyNode;
186214

187-
export type RunAPI<TResult> = {|
215+
export type RunAPI<TResult: RequestResult> = {|
188216
invalidateOnFileCreate: InternalFileCreateInvalidation => void,
189217
invalidateOnFileDelete: ProjectPath => void,
190218
invalidateOnFileUpdate: ProjectPath => void,
@@ -199,12 +227,12 @@ export type RunAPI<TResult> = {|
199227
invalidateOnOptionChange: string => void,
200228
getInvalidations(): Array<RequestInvalidation>,
201229
storeResult(result: TResult, cacheKey?: string): void,
202-
getRequestResult<T>(contentKey: ContentKey): Async<?T>,
203-
getPreviousResult<T>(ifMatch?: string): Async<?T>,
230+
getRequestResult<T: RequestResult>(contentKey: ContentKey): Async<?T>,
231+
getPreviousResult<T: RequestResult>(ifMatch?: string): Async<?T>,
204232
getSubRequests(): Array<RequestNode>,
205233
getInvalidSubRequests(): Array<RequestNode>,
206234
canSkipSubrequest(ContentKey): boolean,
207-
runRequest: <TInput, TResult>(
235+
runRequest: <TInput, TResult: RequestResult>(
208236
subRequest: Request<TInput, TResult>,
209237
opts?: RunRequestOpts,
210238
) => Promise<TResult>,
@@ -1096,7 +1124,7 @@ export default class RequestTracker {
10961124
}
10971125

10981126
// If a cache key is provided, the result will be removed from the node and stored in a separate cache entry
1099-
storeResult(nodeId: NodeId, result: mixed, cacheKey: ?string) {
1127+
storeResult(nodeId: NodeId, result: RequestResult, cacheKey: ?string) {
11001128
let node = this.graph.getNode(nodeId);
11011129
if (node && node.type === REQUEST) {
11021130
node.result = result;
@@ -1112,7 +1140,7 @@ export default class RequestTracker {
11121140
);
11131141
}
11141142

1115-
async getRequestResult<T>(
1143+
async getRequestResult<T: RequestResult>(
11161144
contentKey: ContentKey,
11171145
ifMatch?: string,
11181146
): Promise<?T> {
@@ -1184,7 +1212,7 @@ export default class RequestTracker {
11841212
this.graph.replaceSubrequests(requestNodeId, subrequestContextKeys);
11851213
}
11861214

1187-
async runRequest<TInput, TResult>(
1215+
async runRequest<TInput, TResult: RequestResult>(
11881216
request: Request<TInput, TResult>,
11891217
opts?: ?RunRequestOpts,
11901218
): Promise<TResult> {
@@ -1289,7 +1317,7 @@ export default class RequestTracker {
12891317
return formattedStats;
12901318
}
12911319

1292-
createAPI<TResult>(
1320+
createAPI<TResult: RequestResult>(
12931321
requestId: NodeId,
12941322
previousInvalidations: Array<RequestInvalidation>,
12951323
): {|api: RunAPI<TResult>, subRequestContentKeys: Set<ContentKey>|} {
@@ -1324,11 +1352,12 @@ export default class RequestTracker {
13241352
},
13251353
getSubRequests: () => this.graph.getSubRequests(requestId),
13261354
getInvalidSubRequests: () => this.graph.getInvalidSubRequests(requestId),
1327-
getPreviousResult: <T>(ifMatch?: string): Async<?T> => {
1355+
getPreviousResult: <T: RequestResult>(ifMatch?: string): Async<?T> => {
13281356
let contentKey = nullthrows(this.graph.getNode(requestId)?.id);
13291357
return this.getRequestResult<T>(contentKey, ifMatch);
13301358
},
1331-
getRequestResult: <T>(id): Async<?T> => this.getRequestResult<T>(id),
1359+
getRequestResult: <T: RequestResult>(id): Async<?T> =>
1360+
this.getRequestResult<T>(id),
13321361
canSkipSubrequest: contentKey => {
13331362
if (
13341363
this.graph.hasContentKey(contentKey) &&
@@ -1340,7 +1369,7 @@ export default class RequestTracker {
13401369

13411370
return false;
13421371
},
1343-
runRequest: <TInput, TResult>(
1372+
runRequest: <TInput, TResult: RequestResult>(
13441373
subRequest: Request<TInput, TResult>,
13451374
opts?: RunRequestOpts,
13461375
): Promise<TResult> => {

packages/core/core/src/applyRuntimes.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import type {
1313
} from './types';
1414
import type ParcelConfig from './ParcelConfig';
1515
import type PluginOptions from './public/PluginOptions';
16-
import type {RunAPI} from './RequestTracker';
16+
import type {RequestResult, RunAPI} from './RequestTracker';
1717

1818
import path from 'path';
1919
import assert from 'assert';
@@ -60,7 +60,7 @@ function nameRuntimeBundle(
6060
bundle.displayName = name.replace(hashReference, '[hash]');
6161
}
6262

63-
export default async function applyRuntimes<TResult>({
63+
export default async function applyRuntimes<TResult: RequestResult>({
6464
bundleGraph,
6565
config,
6666
options,
@@ -324,7 +324,7 @@ export default async function applyRuntimes<TResult>({
324324
return changedAssets;
325325
}
326326

327-
function reconcileNewRuntimes<TResult>(
327+
function reconcileNewRuntimes<TResult: RequestResult>(
328328
api: RunAPI<TResult>,
329329
connections: Array<RuntimeConnection>,
330330
optionsRef: SharedReference,

packages/core/core/src/requests/AssetGraphRequest.js

+8-5
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import type {
1313
Target,
1414
} from '../types';
1515
import type {StaticRunOpts, RunAPI} from '../RequestTracker';
16-
import type {EntryResult} from './EntryRequest';
16+
import type {EntryRequestResult} from './EntryRequest';
1717
import type {PathRequestInput} from './PathRequest';
1818
import type {Diagnostic} from '@parcel/diagnostic';
1919
import logger from '@parcel/logger';
@@ -46,7 +46,7 @@ type AssetGraphRequestInput = {|
4646
requestedAssetIds?: Set<string>,
4747
|};
4848

49-
type AssetGraphRequestResult = {|
49+
export type AssetGraphRequestResult = {|
5050
assetGraph: AssetGraph,
5151
/** Assets added/modified since the last successful build. */
5252
changedAssets: Map<string, Asset>,
@@ -468,9 +468,12 @@ export class AssetGraphBuilder {
468468
: [];
469469

470470
let request = createEntryRequest(input);
471-
let result = await this.api.runRequest<ProjectPath, EntryResult>(request, {
472-
force: true,
473-
});
471+
let result = await this.api.runRequest<ProjectPath, EntryRequestResult>(
472+
request,
473+
{
474+
force: true,
475+
},
476+
);
474477
this.assetGraph.resolveEntry(request.input, result.entries, request.id);
475478

476479
if (this.assetGraph.safeToIncrementallyBundle) {

packages/core/core/src/requests/AssetRequest.js

+5-5
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import type {StaticRunOpts} from '../RequestTracker';
66
import type {
77
AssetRequestInput,
88
AssetRequestResult,
9-
DevDepRequest,
109
TransformationRequest,
1110
} from '../types';
1211
import type {ConfigAndCachePath} from './ParcelConfigRequest';
@@ -21,6 +20,7 @@ import {runConfigRequest} from './ConfigRequest';
2120
import {fromProjectPath, fromProjectPathRelative} from '../projectPath';
2221
import {report} from '../ReporterRunner';
2322
import {requestTypes} from '../RequestTracker';
23+
import type {DevDepRequestResult} from './DevDepRequest';
2424

2525
type RunInput<TResult> = {|
2626
input: AssetRequestInput,
@@ -78,14 +78,14 @@ async function run({input, api, farm, invalidateReason, options}) {
7878
await api.runRequest<null, ConfigAndCachePath>(createParcelConfigRequest()),
7979
);
8080

81-
let previousDevDepRequests = new Map(
81+
let previousDevDepRequests: Map<string, DevDepRequestResult> = new Map(
8282
await Promise.all(
8383
api
8484
.getSubRequests()
8585
.filter(req => req.requestType === requestTypes.dev_dep_request)
8686
.map(async req => [
8787
req.id,
88-
nullthrows(await api.getRequestResult<DevDepRequest>(req.id)),
88+
nullthrows(await api.getRequestResult<DevDepRequestResult>(req.id)),
8989
]),
9090
),
9191
);
@@ -96,15 +96,15 @@ async function run({input, api, farm, invalidateReason, options}) {
9696
devDeps: new Map(
9797
[...previousDevDepRequests.entries()]
9898
.filter(([id]) => api.canSkipSubrequest(id))
99-
.map(([, req]) => [
99+
.map(([, req]: [string, DevDepRequestResult]) => [
100100
`${req.specifier}:${fromProjectPathRelative(req.resolveFrom)}`,
101101
req.hash,
102102
]),
103103
),
104104
invalidDevDeps: await Promise.all(
105105
[...previousDevDepRequests.entries()]
106106
.filter(([id]) => !api.canSkipSubrequest(id))
107-
.flatMap(([, req]) => {
107+
.flatMap(([, req]: [string, DevDepRequestResult]) => {
108108
return [
109109
{
110110
specifier: req.specifier,

packages/core/core/src/requests/BundleGraphRequest.js

+1
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ type RunInput = {|
7171
...StaticRunOpts<BundleGraphResult>,
7272
|};
7373

74+
// TODO: Rename to BundleGraphRequestResult
7475
export type BundleGraphResult = {|
7576
bundleGraph: InternalBundleGraph,
7677
changedAssets: Map<string, Asset>,

packages/core/core/src/requests/ConfigRequest.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import type {
1515
InternalFileCreateInvalidation,
1616
} from '../types';
1717
import type {LoadedPlugin} from '../ParcelConfig';
18-
import type {RunAPI} from '../RequestTracker';
18+
import type {RequestResult, RunAPI} from '../RequestTracker';
1919
import type {ProjectPath} from '../projectPath';
2020
import {napiRunConfigRequest} from '@parcel/rust';
2121

@@ -76,6 +76,8 @@ export type ConfigRequest = {
7676
...
7777
};
7878

79+
export type ConfigRequestResult = void;
80+
7981
export async function loadPluginConfig<T: PluginWithLoadConfig>(
8082
loadedPlugin: LoadedPlugin<T>,
8183
config: Config,
@@ -143,7 +145,7 @@ export async function getConfigKeyContentHash(
143145
return contentHash;
144146
}
145147

146-
export async function runConfigRequest<TResult>(
148+
export async function runConfigRequest<TResult: RequestResult>(
147149
api: RunAPI<TResult>,
148150
configRequest: ConfigRequest,
149151
) {

packages/core/core/src/requests/DevDepRequest.js

+14-10
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
// @flow
2-
import type {DependencySpecifier, SemverRange} from '@parcel/types';
2+
import type {
3+
DependencySpecifier,
4+
SemverRange,
5+
Invalidations,
6+
} from '@parcel/types';
37
import type ParcelConfig from '../ParcelConfig';
48
import type {
59
DevDepRequest,
610
ParcelOptions,
711
InternalDevDepOptions,
812
} from '../types';
9-
import type {RunAPI} from '../RequestTracker';
13+
import type {RequestResult, RunAPI} from '../RequestTracker';
1014
import type {ProjectPath} from '../projectPath';
1115

1216
import nullthrows from 'nullthrows';
@@ -24,7 +28,7 @@ import {requestTypes} from '../RequestTracker';
2428
// If the package manager returns the same invalidation object, then
2529
// we can reuse the dev dep request rather than recomputing the project
2630
// paths and hashes.
27-
const devDepRequestCache = new WeakMap();
31+
const devDepRequestCache: WeakMap<Invalidations, DevDepRequest> = new WeakMap();
2832

2933
export async function createDevDependency(
3034
opts: InternalDevDepOptions,
@@ -107,17 +111,17 @@ type DevDepRequests = {|
107111
invalidDevDeps: Array<DevDepSpecifier>,
108112
|};
109113

110-
export async function getDevDepRequests<TResult>(
114+
export async function getDevDepRequests<TResult: RequestResult>(
111115
api: RunAPI<TResult>,
112116
): Promise<DevDepRequests> {
113-
let previousDevDepRequests = new Map(
117+
let previousDevDepRequests: Map<string, DevDepRequestResult> = new Map(
114118
await Promise.all(
115119
api
116120
.getSubRequests()
117121
.filter(req => req.requestType === requestTypes.dev_dep_request)
118122
.map(async req => [
119123
req.id,
120-
nullthrows(await api.getRequestResult<DevDepRequest>(req.id)),
124+
nullthrows(await api.getRequestResult<DevDepRequestResult>(req.id)),
121125
]),
122126
),
123127
);
@@ -126,15 +130,15 @@ export async function getDevDepRequests<TResult>(
126130
devDeps: new Map(
127131
[...previousDevDepRequests.entries()]
128132
.filter(([id]) => api.canSkipSubrequest(id))
129-
.map(([, req]) => [
133+
.map(([, req]: [string, DevDepRequestResult]) => [
130134
`${req.specifier}:${fromProjectPathRelative(req.resolveFrom)}`,
131135
req.hash,
132136
]),
133137
),
134138
invalidDevDeps: await Promise.all(
135139
[...previousDevDepRequests.entries()]
136140
.filter(([id]) => !api.canSkipSubrequest(id))
137-
.flatMap(([, req]) => {
141+
.flatMap(([, req]: [string, DevDepRequestResult]) => {
138142
return [
139143
{
140144
specifier: req.specifier,
@@ -172,7 +176,7 @@ export function invalidateDevDeps(
172176
}
173177
}
174178

175-
type DevDepRequestResult = {|
179+
export type DevDepRequestResult = {|
176180
specifier: DependencySpecifier,
177181
resolveFrom: ProjectPath,
178182
hash: string,
@@ -183,7 +187,7 @@ type DevDepRequestResult = {|
183187
|}>,
184188
|};
185189

186-
export async function runDevDepRequest<TResult>(
190+
export async function runDevDepRequest<TResult: RequestResult>(
187191
api: RunAPI<TResult>,
188192
devDepRequest: DevDepRequest,
189193
) {

0 commit comments

Comments
 (0)