metro 0.80.2 → 0.80.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +17 -17
- package/src/DeltaBundler/DeltaCalculator.js +0 -8
- package/src/DeltaBundler/DeltaCalculator.js.flow +0 -9
- package/src/DeltaBundler/Graph.js +290 -275
- package/src/DeltaBundler/Graph.js.flow +314 -278
- package/src/DeltaBundler/buildSubgraph.js +138 -0
- package/src/DeltaBundler/buildSubgraph.js.flow +161 -0
- package/src/DeltaBundler/types.flow.js.flow +29 -18
- package/src/ModuleGraph/worker/collectDependencies.js.flow +1 -1
- package/src/index.flow.js +1 -0
- package/src/index.flow.js.flow +1 -1
- package/src/lib/splitBundleOptions.js +1 -0
- package/src/lib/splitBundleOptions.js.flow +1 -0
- package/src/node-haste/DependencyGraph/ModuleResolution.js +4 -1
- package/src/node-haste/DependencyGraph/ModuleResolution.js.flow +2 -1
- package/src/node-haste/DependencyGraph.js +3 -14
- package/src/node-haste/DependencyGraph.js.flow +3 -14
- package/src/shared/types.flow.js.flow +1 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true,
|
|
5
|
+
});
|
|
6
|
+
exports.buildSubgraph = buildSubgraph;
|
|
7
|
+
var _contextModule = require("../lib/contextModule");
|
|
8
|
+
var _path = _interopRequireDefault(require("path"));
|
|
9
|
+
function _interopRequireDefault(obj) {
|
|
10
|
+
return obj && obj.__esModule ? obj : { default: obj };
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
14
|
+
*
|
|
15
|
+
* This source code is licensed under the MIT license found in the
|
|
16
|
+
* LICENSE file in the root directory of this source tree.
|
|
17
|
+
*
|
|
18
|
+
*
|
|
19
|
+
* @format
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
function resolveDependencies(parentPath, dependencies, resolve) {
|
|
23
|
+
const maybeResolvedDeps = new Map();
|
|
24
|
+
const resolvedContexts = new Map();
|
|
25
|
+
for (const dep of dependencies) {
|
|
26
|
+
let resolvedDep;
|
|
27
|
+
const key = dep.data.key;
|
|
28
|
+
|
|
29
|
+
// `require.context`
|
|
30
|
+
const { contextParams } = dep.data;
|
|
31
|
+
if (contextParams) {
|
|
32
|
+
// Ensure the filepath has uniqueness applied to ensure multiple `require.context`
|
|
33
|
+
// statements can be used to target the same file with different properties.
|
|
34
|
+
const from = _path.default.join(parentPath, "..", dep.name);
|
|
35
|
+
const absolutePath = (0, _contextModule.deriveAbsolutePathFromContext)(
|
|
36
|
+
from,
|
|
37
|
+
contextParams
|
|
38
|
+
);
|
|
39
|
+
const resolvedContext = {
|
|
40
|
+
from,
|
|
41
|
+
mode: contextParams.mode,
|
|
42
|
+
recursive: contextParams.recursive,
|
|
43
|
+
filter: new RegExp(
|
|
44
|
+
contextParams.filter.pattern,
|
|
45
|
+
contextParams.filter.flags
|
|
46
|
+
),
|
|
47
|
+
};
|
|
48
|
+
resolvedContexts.set(key, resolvedContext);
|
|
49
|
+
resolvedDep = {
|
|
50
|
+
absolutePath,
|
|
51
|
+
data: dep,
|
|
52
|
+
};
|
|
53
|
+
} else {
|
|
54
|
+
try {
|
|
55
|
+
resolvedDep = {
|
|
56
|
+
absolutePath: resolve(parentPath, dep).filePath,
|
|
57
|
+
data: dep,
|
|
58
|
+
};
|
|
59
|
+
} catch (error) {
|
|
60
|
+
// Ignore unavailable optional dependencies. They are guarded
|
|
61
|
+
// with a try-catch block and will be handled during runtime.
|
|
62
|
+
if (dep.data.isOptional !== true) {
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (maybeResolvedDeps.has(key)) {
|
|
68
|
+
throw new Error(
|
|
69
|
+
`resolveDependencies: Found duplicate dependency key '${key}' in ${parentPath}`
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
maybeResolvedDeps.set(key, resolvedDep);
|
|
73
|
+
}
|
|
74
|
+
const resolvedDeps = new Map();
|
|
75
|
+
// Return just the dependencies we successfully resolved.
|
|
76
|
+
// FIXME: This has a bad bug affecting all dependencies *after* an unresolved
|
|
77
|
+
// optional dependency. We'll need to propagate the nulls all the way to the
|
|
78
|
+
// serializer and the require() runtime to keep the dependency map from being
|
|
79
|
+
// desynced from the contents of the module.
|
|
80
|
+
for (const [key, resolvedDep] of maybeResolvedDeps) {
|
|
81
|
+
if (resolvedDep) {
|
|
82
|
+
resolvedDeps.set(key, resolvedDep);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
dependencies: resolvedDeps,
|
|
87
|
+
resolvedContexts,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
async function buildSubgraph(
|
|
91
|
+
entryPaths,
|
|
92
|
+
resolvedContexts,
|
|
93
|
+
{ resolve, transform, shouldTraverse }
|
|
94
|
+
) {
|
|
95
|
+
const moduleData = new Map();
|
|
96
|
+
const errors = new Map();
|
|
97
|
+
const visitedPaths = new Set();
|
|
98
|
+
async function visit(absolutePath, requireContext) {
|
|
99
|
+
if (visitedPaths.has(absolutePath)) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
visitedPaths.add(absolutePath);
|
|
103
|
+
const transformResult = await transform(absolutePath, requireContext);
|
|
104
|
+
|
|
105
|
+
// Get the absolute path of all sub-dependencies (some of them could have been
|
|
106
|
+
// moved but maintain the same relative path).
|
|
107
|
+
const resolutionResult = resolveDependencies(
|
|
108
|
+
absolutePath,
|
|
109
|
+
transformResult.dependencies,
|
|
110
|
+
resolve
|
|
111
|
+
);
|
|
112
|
+
moduleData.set(absolutePath, {
|
|
113
|
+
...transformResult,
|
|
114
|
+
...resolutionResult,
|
|
115
|
+
});
|
|
116
|
+
await Promise.all(
|
|
117
|
+
[...resolutionResult.dependencies]
|
|
118
|
+
.filter(([key, dependency]) => shouldTraverse(dependency))
|
|
119
|
+
.map(([key, dependency]) =>
|
|
120
|
+
visit(
|
|
121
|
+
dependency.absolutePath,
|
|
122
|
+
resolutionResult.resolvedContexts.get(dependency.data.data.key)
|
|
123
|
+
).catch((error) => errors.set(dependency.absolutePath, error))
|
|
124
|
+
)
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
await Promise.all(
|
|
128
|
+
[...entryPaths].map((absolutePath) =>
|
|
129
|
+
visit(absolutePath, resolvedContexts.get(absolutePath)).catch((error) =>
|
|
130
|
+
errors.set(absolutePath, error)
|
|
131
|
+
)
|
|
132
|
+
)
|
|
133
|
+
);
|
|
134
|
+
return {
|
|
135
|
+
moduleData,
|
|
136
|
+
errors,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
7
|
+
* @flow strict-local
|
|
8
|
+
* @format
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type {RequireContext} from '../lib/contextModule';
|
|
12
|
+
import type {
|
|
13
|
+
Dependency,
|
|
14
|
+
ModuleData,
|
|
15
|
+
ResolveFn,
|
|
16
|
+
TransformFn,
|
|
17
|
+
TransformResultDependency,
|
|
18
|
+
} from './types.flow';
|
|
19
|
+
|
|
20
|
+
import {deriveAbsolutePathFromContext} from '../lib/contextModule';
|
|
21
|
+
import path from 'path';
|
|
22
|
+
|
|
23
|
+
type Parameters<T> = $ReadOnly<{
|
|
24
|
+
resolve: ResolveFn,
|
|
25
|
+
transform: TransformFn<T>,
|
|
26
|
+
shouldTraverse: Dependency => boolean,
|
|
27
|
+
}>;
|
|
28
|
+
|
|
29
|
+
function resolveDependencies(
|
|
30
|
+
parentPath: string,
|
|
31
|
+
dependencies: $ReadOnlyArray<TransformResultDependency>,
|
|
32
|
+
resolve: ResolveFn,
|
|
33
|
+
): {
|
|
34
|
+
dependencies: Map<string, Dependency>,
|
|
35
|
+
resolvedContexts: Map<string, RequireContext>,
|
|
36
|
+
} {
|
|
37
|
+
const maybeResolvedDeps = new Map<string, void | Dependency>();
|
|
38
|
+
const resolvedContexts = new Map<string, RequireContext>();
|
|
39
|
+
|
|
40
|
+
for (const dep of dependencies) {
|
|
41
|
+
let resolvedDep;
|
|
42
|
+
const key = dep.data.key;
|
|
43
|
+
|
|
44
|
+
// `require.context`
|
|
45
|
+
const {contextParams} = dep.data;
|
|
46
|
+
if (contextParams) {
|
|
47
|
+
// Ensure the filepath has uniqueness applied to ensure multiple `require.context`
|
|
48
|
+
// statements can be used to target the same file with different properties.
|
|
49
|
+
const from = path.join(parentPath, '..', dep.name);
|
|
50
|
+
const absolutePath = deriveAbsolutePathFromContext(from, contextParams);
|
|
51
|
+
|
|
52
|
+
const resolvedContext: RequireContext = {
|
|
53
|
+
from,
|
|
54
|
+
mode: contextParams.mode,
|
|
55
|
+
recursive: contextParams.recursive,
|
|
56
|
+
filter: new RegExp(
|
|
57
|
+
contextParams.filter.pattern,
|
|
58
|
+
contextParams.filter.flags,
|
|
59
|
+
),
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
resolvedContexts.set(key, resolvedContext);
|
|
63
|
+
|
|
64
|
+
resolvedDep = {
|
|
65
|
+
absolutePath,
|
|
66
|
+
data: dep,
|
|
67
|
+
};
|
|
68
|
+
} else {
|
|
69
|
+
try {
|
|
70
|
+
resolvedDep = {
|
|
71
|
+
absolutePath: resolve(parentPath, dep).filePath,
|
|
72
|
+
data: dep,
|
|
73
|
+
};
|
|
74
|
+
} catch (error) {
|
|
75
|
+
// Ignore unavailable optional dependencies. They are guarded
|
|
76
|
+
// with a try-catch block and will be handled during runtime.
|
|
77
|
+
if (dep.data.isOptional !== true) {
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (maybeResolvedDeps.has(key)) {
|
|
84
|
+
throw new Error(
|
|
85
|
+
`resolveDependencies: Found duplicate dependency key '${key}' in ${parentPath}`,
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
maybeResolvedDeps.set(key, resolvedDep);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const resolvedDeps = new Map<string, Dependency>();
|
|
92
|
+
// Return just the dependencies we successfully resolved.
|
|
93
|
+
// FIXME: This has a bad bug affecting all dependencies *after* an unresolved
|
|
94
|
+
// optional dependency. We'll need to propagate the nulls all the way to the
|
|
95
|
+
// serializer and the require() runtime to keep the dependency map from being
|
|
96
|
+
// desynced from the contents of the module.
|
|
97
|
+
for (const [key, resolvedDep] of maybeResolvedDeps) {
|
|
98
|
+
if (resolvedDep) {
|
|
99
|
+
resolvedDeps.set(key, resolvedDep);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return {dependencies: resolvedDeps, resolvedContexts};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export async function buildSubgraph<T>(
|
|
106
|
+
entryPaths: $ReadOnlySet<string>,
|
|
107
|
+
resolvedContexts: $ReadOnlyMap<string, ?RequireContext>,
|
|
108
|
+
{resolve, transform, shouldTraverse}: Parameters<T>,
|
|
109
|
+
): Promise<{
|
|
110
|
+
moduleData: Map<string, ModuleData<T>>,
|
|
111
|
+
errors: Map<string, Error>,
|
|
112
|
+
}> {
|
|
113
|
+
const moduleData: Map<string, ModuleData<T>> = new Map();
|
|
114
|
+
const errors: Map<string, Error> = new Map();
|
|
115
|
+
const visitedPaths: Set<string> = new Set();
|
|
116
|
+
|
|
117
|
+
async function visit(
|
|
118
|
+
absolutePath: string,
|
|
119
|
+
requireContext: ?RequireContext,
|
|
120
|
+
): Promise<void> {
|
|
121
|
+
if (visitedPaths.has(absolutePath)) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
visitedPaths.add(absolutePath);
|
|
125
|
+
const transformResult = await transform(absolutePath, requireContext);
|
|
126
|
+
|
|
127
|
+
// Get the absolute path of all sub-dependencies (some of them could have been
|
|
128
|
+
// moved but maintain the same relative path).
|
|
129
|
+
const resolutionResult = resolveDependencies(
|
|
130
|
+
absolutePath,
|
|
131
|
+
transformResult.dependencies,
|
|
132
|
+
resolve,
|
|
133
|
+
);
|
|
134
|
+
|
|
135
|
+
moduleData.set(absolutePath, {
|
|
136
|
+
...transformResult,
|
|
137
|
+
...resolutionResult,
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
await Promise.all(
|
|
141
|
+
[...resolutionResult.dependencies]
|
|
142
|
+
.filter(([key, dependency]) => shouldTraverse(dependency))
|
|
143
|
+
.map(([key, dependency]) =>
|
|
144
|
+
visit(
|
|
145
|
+
dependency.absolutePath,
|
|
146
|
+
resolutionResult.resolvedContexts.get(dependency.data.data.key),
|
|
147
|
+
).catch(error => errors.set(dependency.absolutePath, error)),
|
|
148
|
+
),
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
await Promise.all(
|
|
153
|
+
[...entryPaths].map(absolutePath =>
|
|
154
|
+
visit(absolutePath, resolvedContexts.get(absolutePath)).catch(error =>
|
|
155
|
+
errors.set(absolutePath, error),
|
|
156
|
+
),
|
|
157
|
+
),
|
|
158
|
+
);
|
|
159
|
+
|
|
160
|
+
return {moduleData, errors};
|
|
161
|
+
}
|
|
@@ -25,41 +25,41 @@ export type MixedOutput = {
|
|
|
25
25
|
|
|
26
26
|
export type AsyncDependencyType = 'async' | 'prefetch' | 'weak';
|
|
27
27
|
|
|
28
|
-
export type TransformResultDependency = {
|
|
28
|
+
export type TransformResultDependency = $ReadOnly<{
|
|
29
29
|
/**
|
|
30
30
|
* The literal name provided to a require or import call. For example 'foo' in
|
|
31
31
|
* case of `require('foo')`.
|
|
32
32
|
*/
|
|
33
|
-
|
|
33
|
+
name: string,
|
|
34
34
|
|
|
35
35
|
/**
|
|
36
36
|
* Extra data returned by the dependency extractor.
|
|
37
37
|
*/
|
|
38
|
-
|
|
38
|
+
data: $ReadOnly<{
|
|
39
39
|
/**
|
|
40
40
|
* A locally unique key for this dependency within the current module.
|
|
41
41
|
*/
|
|
42
|
-
|
|
42
|
+
key: string,
|
|
43
43
|
/**
|
|
44
44
|
* If not null, this dependency is due to a dynamic `import()` or `__prefetchImport()` call.
|
|
45
45
|
*/
|
|
46
|
-
|
|
46
|
+
asyncType: AsyncDependencyType | null,
|
|
47
47
|
/**
|
|
48
48
|
* The dependency is enclosed in a try/catch block.
|
|
49
49
|
*/
|
|
50
|
-
|
|
50
|
+
isOptional?: boolean,
|
|
51
51
|
|
|
52
|
-
|
|
52
|
+
locs: $ReadOnlyArray<BabelSourceLocation>,
|
|
53
53
|
|
|
54
54
|
/** Context for requiring a collection of modules. */
|
|
55
|
-
|
|
56
|
-
}
|
|
57
|
-
}
|
|
55
|
+
contextParams?: RequireContextParams,
|
|
56
|
+
}>,
|
|
57
|
+
}>;
|
|
58
58
|
|
|
59
|
-
export type Dependency = {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
}
|
|
59
|
+
export type Dependency = $ReadOnly<{
|
|
60
|
+
absolutePath: string,
|
|
61
|
+
data: TransformResultDependency,
|
|
62
|
+
}>;
|
|
63
63
|
|
|
64
64
|
export type Module<T = MixedOutput> = $ReadOnly<{
|
|
65
65
|
dependencies: Map<string, Dependency>,
|
|
@@ -70,6 +70,14 @@ export type Module<T = MixedOutput> = $ReadOnly<{
|
|
|
70
70
|
unstable_transformResultKey?: ?string,
|
|
71
71
|
}>;
|
|
72
72
|
|
|
73
|
+
export type ModuleData<T = MixedOutput> = $ReadOnly<{
|
|
74
|
+
dependencies: $ReadOnlyMap<string, Dependency>,
|
|
75
|
+
resolvedContexts: $ReadOnlyMap<string, RequireContext>,
|
|
76
|
+
output: $ReadOnlyArray<T>,
|
|
77
|
+
getSource: () => Buffer,
|
|
78
|
+
unstable_transformResultKey?: ?string,
|
|
79
|
+
}>;
|
|
80
|
+
|
|
73
81
|
export type Dependencies<T = MixedOutput> = Map<string, Module<T>>;
|
|
74
82
|
export type ReadOnlyDependencies<T = MixedOutput> = $ReadOnlyMap<
|
|
75
83
|
string,
|
|
@@ -115,6 +123,12 @@ export type TransformFn<T = MixedOutput> = (
|
|
|
115
123
|
string,
|
|
116
124
|
?RequireContext,
|
|
117
125
|
) => Promise<TransformResultWithSource<T>>;
|
|
126
|
+
|
|
127
|
+
export type ResolveFn = (
|
|
128
|
+
from: string,
|
|
129
|
+
dependency: TransformResultDependency,
|
|
130
|
+
) => BundlerResolution;
|
|
131
|
+
|
|
118
132
|
export type AllowOptionalDependenciesWithOptions = {
|
|
119
133
|
+exclude: Array<string>,
|
|
120
134
|
};
|
|
@@ -128,10 +142,7 @@ export type BundlerResolution = $ReadOnly<{
|
|
|
128
142
|
}>;
|
|
129
143
|
|
|
130
144
|
export type Options<T = MixedOutput> = {
|
|
131
|
-
+resolve:
|
|
132
|
-
from: string,
|
|
133
|
-
dependency: TransformResultDependency,
|
|
134
|
-
) => BundlerResolution,
|
|
145
|
+
+resolve: ResolveFn,
|
|
135
146
|
+transform: TransformFn<T>,
|
|
136
147
|
+transformOptions: TransformInputOptions,
|
|
137
148
|
+onProgress: ?(numProcessed: number, total: number) => mixed,
|
|
@@ -38,7 +38,7 @@ export type Dependency = $ReadOnly<{
|
|
|
38
38
|
// TODO: Convert to a Flow enum
|
|
39
39
|
export type ContextMode = 'sync' | 'eager' | 'lazy' | 'lazy-once';
|
|
40
40
|
|
|
41
|
-
type ContextFilter = {pattern: string, flags: string}
|
|
41
|
+
type ContextFilter = $ReadOnly<{pattern: string, flags: string}>;
|
|
42
42
|
|
|
43
43
|
export type RequireContextParams = $ReadOnly<{
|
|
44
44
|
/* Should search for files recursively. Optional, default `true` when `require.context` is used */
|
package/src/index.flow.js
CHANGED
package/src/index.flow.js.flow
CHANGED
|
@@ -21,6 +21,7 @@ function splitBundleOptions(options: BundleOptions): SplitBundleOptions {
|
|
|
21
21
|
entryFile: options.entryFile,
|
|
22
22
|
resolverOptions: {
|
|
23
23
|
customResolverOptions: options.customResolverOptions,
|
|
24
|
+
dev: options.dev,
|
|
24
25
|
},
|
|
25
26
|
transformOptions: {
|
|
26
27
|
customTransformOptions: options.customTransformOptions,
|
|
@@ -53,7 +53,9 @@ class ModuleResolver {
|
|
|
53
53
|
},
|
|
54
54
|
false,
|
|
55
55
|
null,
|
|
56
|
-
/* resolverOptions */ {
|
|
56
|
+
/* resolverOptions */ {
|
|
57
|
+
dev: false,
|
|
58
|
+
}
|
|
57
59
|
);
|
|
58
60
|
this._cachedEmptyModule = emptyModule;
|
|
59
61
|
}
|
|
@@ -88,6 +90,7 @@ class ModuleResolver {
|
|
|
88
90
|
{
|
|
89
91
|
allowHaste,
|
|
90
92
|
assetExts,
|
|
93
|
+
dev: resolverOptions.dev,
|
|
91
94
|
disableHierarchicalLookup,
|
|
92
95
|
doesFileExist,
|
|
93
96
|
extraNodeModules,
|
|
@@ -120,7 +120,7 @@ class ModuleResolver<TPackage: Packageish> {
|
|
|
120
120
|
},
|
|
121
121
|
false,
|
|
122
122
|
null,
|
|
123
|
-
/* resolverOptions */ {},
|
|
123
|
+
/* resolverOptions */ {dev: false},
|
|
124
124
|
);
|
|
125
125
|
this._cachedEmptyModule = emptyModule;
|
|
126
126
|
}
|
|
@@ -157,6 +157,7 @@ class ModuleResolver<TPackage: Packageish> {
|
|
|
157
157
|
{
|
|
158
158
|
allowHaste,
|
|
159
159
|
assetExts,
|
|
160
|
+
dev: resolverOptions.dev,
|
|
160
161
|
disableHierarchicalLookup,
|
|
161
162
|
doesFileExist,
|
|
162
163
|
extraNodeModules,
|
|
@@ -190,14 +190,6 @@ class DependencyGraph extends EventEmitter {
|
|
|
190
190
|
return nullthrows(this._fileSystem).getAllFiles();
|
|
191
191
|
}
|
|
192
192
|
getSha1(filename) {
|
|
193
|
-
// TODO If it looks like we're trying to get the sha1 from a file located
|
|
194
|
-
// within a Zip archive, then we instead compute the sha1 for what looks
|
|
195
|
-
// like the Zip archive itself.
|
|
196
|
-
|
|
197
|
-
const splitIndex = filename.indexOf(".zip/");
|
|
198
|
-
const containerName =
|
|
199
|
-
splitIndex !== -1 ? filename.slice(0, splitIndex + 4) : filename;
|
|
200
|
-
|
|
201
193
|
// Prior to unstable_enableSymlinks:
|
|
202
194
|
// Calling realpath allows us to get a hash for a given path even when
|
|
203
195
|
// it's a symlink to a file, which prevents Metro from crashing in such a
|
|
@@ -208,8 +200,8 @@ class DependencyGraph extends EventEmitter {
|
|
|
208
200
|
//
|
|
209
201
|
// This is unnecessary with a symlink-aware fileSystem implementation.
|
|
210
202
|
const resolvedPath = this._config.resolver.unstable_enableSymlinks
|
|
211
|
-
?
|
|
212
|
-
: fs.realpathSync(
|
|
203
|
+
? filename
|
|
204
|
+
: fs.realpathSync(filename);
|
|
213
205
|
const sha1 = this._fileSystem.getSha1(resolvedPath);
|
|
214
206
|
if (!sha1) {
|
|
215
207
|
throw new ReferenceError(`SHA-1 for file ${filename} (${resolvedPath}) is not computed.
|
|
@@ -260,10 +252,7 @@ class DependencyGraph extends EventEmitter {
|
|
|
260
252
|
|
|
261
253
|
// Compound key for the resolver cache
|
|
262
254
|
const resolverOptionsKey =
|
|
263
|
-
JSON.stringify(
|
|
264
|
-
resolverOptions.customResolverOptions ?? {},
|
|
265
|
-
canonicalize
|
|
266
|
-
) ?? "";
|
|
255
|
+
JSON.stringify(resolverOptions ?? {}, canonicalize) ?? "";
|
|
267
256
|
const originKey = isSensitiveToOriginFolder ? path.dirname(from) : "";
|
|
268
257
|
const targetKey = to;
|
|
269
258
|
const platformKey = platform ?? NULL_PLATFORM;
|
|
@@ -248,14 +248,6 @@ class DependencyGraph extends EventEmitter {
|
|
|
248
248
|
}
|
|
249
249
|
|
|
250
250
|
getSha1(filename: string): string {
|
|
251
|
-
// TODO If it looks like we're trying to get the sha1 from a file located
|
|
252
|
-
// within a Zip archive, then we instead compute the sha1 for what looks
|
|
253
|
-
// like the Zip archive itself.
|
|
254
|
-
|
|
255
|
-
const splitIndex = filename.indexOf('.zip/');
|
|
256
|
-
const containerName =
|
|
257
|
-
splitIndex !== -1 ? filename.slice(0, splitIndex + 4) : filename;
|
|
258
|
-
|
|
259
251
|
// Prior to unstable_enableSymlinks:
|
|
260
252
|
// Calling realpath allows us to get a hash for a given path even when
|
|
261
253
|
// it's a symlink to a file, which prevents Metro from crashing in such a
|
|
@@ -266,8 +258,8 @@ class DependencyGraph extends EventEmitter {
|
|
|
266
258
|
//
|
|
267
259
|
// This is unnecessary with a symlink-aware fileSystem implementation.
|
|
268
260
|
const resolvedPath = this._config.resolver.unstable_enableSymlinks
|
|
269
|
-
?
|
|
270
|
-
: fs.realpathSync(
|
|
261
|
+
? filename
|
|
262
|
+
: fs.realpathSync(filename);
|
|
271
263
|
|
|
272
264
|
const sha1 = this._fileSystem.getSha1(resolvedPath);
|
|
273
265
|
|
|
@@ -335,10 +327,7 @@ class DependencyGraph extends EventEmitter {
|
|
|
335
327
|
|
|
336
328
|
// Compound key for the resolver cache
|
|
337
329
|
const resolverOptionsKey =
|
|
338
|
-
JSON.stringify(
|
|
339
|
-
resolverOptions.customResolverOptions ?? {},
|
|
340
|
-
canonicalize,
|
|
341
|
-
) ?? '';
|
|
330
|
+
JSON.stringify(resolverOptions ?? {}, canonicalize) ?? '';
|
|
342
331
|
const originKey = isSensitiveToOriginFolder ? path.dirname(from) : '';
|
|
343
332
|
const targetKey = to;
|
|
344
333
|
const platformKey = platform ?? NULL_PLATFORM;
|