@atlaspack/core 2.24.0 → 2.24.2-dev-ts-project-refs-d30e9754f.0
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/CHANGELOG.md +26 -0
- package/LICENSE +201 -0
- package/dist/AssetGraph.js +591 -0
- package/dist/Atlaspack.js +656 -0
- package/dist/AtlaspackConfig.js +324 -0
- package/dist/AtlaspackConfig.schema.js +108 -0
- package/dist/BundleGraph.js +1628 -0
- package/dist/CommittedAsset.js +142 -0
- package/dist/Dependency.js +125 -0
- package/dist/Environment.js +132 -0
- package/dist/EnvironmentManager.js +108 -0
- package/dist/IdentifierRegistry.js +38 -0
- package/dist/InternalConfig.js +37 -0
- package/dist/PackagerRunner.js +531 -0
- package/dist/ReporterRunner.js +151 -0
- package/dist/RequestTracker.js +1368 -0
- package/dist/SymbolPropagation.js +620 -0
- package/dist/TargetDescriptor.schema.js +143 -0
- package/dist/Transformation.js +487 -0
- package/dist/UncommittedAsset.js +315 -0
- package/dist/Validation.js +196 -0
- package/dist/applyRuntimes.js +305 -0
- package/dist/assetUtils.js +168 -0
- package/dist/atlaspack-v3/AtlaspackV3.js +70 -0
- package/dist/atlaspack-v3/NapiWorkerPool.js +57 -0
- package/dist/atlaspack-v3/fs.js +52 -0
- package/dist/atlaspack-v3/index.js +25 -0
- package/dist/atlaspack-v3/jsCallable.js +16 -0
- package/dist/atlaspack-v3/worker/compat/asset-symbols.js +190 -0
- package/dist/atlaspack-v3/worker/compat/bitflags.js +94 -0
- package/dist/atlaspack-v3/worker/compat/dependency.js +43 -0
- package/dist/atlaspack-v3/worker/compat/environment.js +57 -0
- package/dist/atlaspack-v3/worker/compat/index.js +25 -0
- package/dist/atlaspack-v3/worker/compat/mutable-asset.js +152 -0
- package/dist/atlaspack-v3/worker/compat/plugin-config.js +76 -0
- package/dist/atlaspack-v3/worker/compat/plugin-logger.js +26 -0
- package/dist/atlaspack-v3/worker/compat/plugin-options.js +122 -0
- package/dist/atlaspack-v3/worker/compat/plugin-tracer.js +10 -0
- package/dist/atlaspack-v3/worker/compat/target.js +14 -0
- package/dist/atlaspack-v3/worker/worker.js +292 -0
- package/dist/constants.js +17 -0
- package/dist/dumpGraphToGraphViz.js +281 -0
- package/dist/index.js +62 -0
- package/dist/loadAtlaspackPlugin.js +128 -0
- package/dist/loadDotEnv.js +41 -0
- package/dist/projectPath.js +83 -0
- package/dist/public/Asset.js +279 -0
- package/dist/public/Bundle.js +224 -0
- package/dist/public/BundleGraph.js +359 -0
- package/dist/public/BundleGroup.js +53 -0
- package/dist/public/Config.js +286 -0
- package/dist/public/Dependency.js +138 -0
- package/dist/public/Environment.js +278 -0
- package/dist/public/MutableBundleGraph.js +277 -0
- package/dist/public/PluginOptions.js +80 -0
- package/dist/public/Symbols.js +248 -0
- package/dist/public/Target.js +69 -0
- package/dist/registerCoreWithSerializer.js +38 -0
- package/dist/requests/AssetGraphRequest.js +429 -0
- package/dist/requests/AssetGraphRequestRust.js +246 -0
- package/dist/requests/AssetRequest.js +130 -0
- package/dist/requests/AtlaspackBuildRequest.js +60 -0
- package/dist/requests/AtlaspackConfigRequest.js +490 -0
- package/dist/requests/BundleGraphRequest.js +441 -0
- package/dist/requests/ConfigRequest.js +222 -0
- package/dist/requests/DevDepRequest.js +204 -0
- package/dist/requests/EntryRequest.js +314 -0
- package/dist/requests/PackageRequest.js +65 -0
- package/dist/requests/PathRequest.js +349 -0
- package/dist/requests/TargetRequest.js +1310 -0
- package/dist/requests/ValidationRequest.js +49 -0
- package/dist/requests/WriteBundleRequest.js +254 -0
- package/dist/requests/WriteBundlesRequest.js +165 -0
- package/dist/requests/asset-graph-diff.js +126 -0
- package/dist/requests/asset-graph-dot.js +131 -0
- package/dist/resolveOptions.js +268 -0
- package/dist/rustWorkerThreadDylibHack.js +19 -0
- package/dist/serializerCore.browser.js +43 -0
- package/dist/summarizeRequest.js +39 -0
- package/dist/types.js +31 -0
- package/dist/utils.js +172 -0
- package/dist/worker.js +130 -0
- package/lib/AssetGraph.js +1 -0
- package/lib/atlaspack-v3/AtlaspackV3.js +7 -3
- package/lib/requests/AssetGraphRequestRust.js +1 -1
- package/lib/types/atlaspack-v3/AtlaspackV3.d.ts +1 -1
- package/package.json +22 -22
- package/src/AssetGraph.ts +1 -0
- package/src/atlaspack-v3/AtlaspackV3.ts +12 -3
- package/src/requests/AssetGraphRequestRust.ts +1 -1
- package/tsconfig.json +55 -2
- package/tsconfig.tsbuildinfo +1 -0
|
@@ -0,0 +1,591 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
6
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
|
+
};
|
|
8
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
9
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
10
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
11
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
|
+
};
|
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
16
|
+
var _AssetGraph_bundlingVersion, _AssetGraph_disableIncrementalBundling;
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.nodeFromDep = nodeFromDep;
|
|
19
|
+
exports.nodeFromAssetGroup = nodeFromAssetGroup;
|
|
20
|
+
exports.nodeFromAsset = nodeFromAsset;
|
|
21
|
+
exports.nodeFromEntrySpecifier = nodeFromEntrySpecifier;
|
|
22
|
+
exports.nodeFromEntryFile = nodeFromEntryFile;
|
|
23
|
+
const assert_1 = __importDefault(require("assert"));
|
|
24
|
+
const rust_1 = require("@atlaspack/rust");
|
|
25
|
+
const utils_1 = require("@atlaspack/utils");
|
|
26
|
+
const nullthrows_1 = __importDefault(require("nullthrows"));
|
|
27
|
+
const graph_1 = require("@atlaspack/graph");
|
|
28
|
+
const Dependency_1 = require("./Dependency");
|
|
29
|
+
const projectPath_1 = require("./projectPath");
|
|
30
|
+
const EnvironmentManager_1 = require("./EnvironmentManager");
|
|
31
|
+
const feature_flags_1 = require("@atlaspack/feature-flags");
|
|
32
|
+
function nodeFromDep(dep) {
|
|
33
|
+
return {
|
|
34
|
+
id: dep.id,
|
|
35
|
+
type: 'dependency',
|
|
36
|
+
value: dep,
|
|
37
|
+
deferred: false,
|
|
38
|
+
excluded: false,
|
|
39
|
+
usedSymbolsDown: new Set(),
|
|
40
|
+
usedSymbolsUp: new Map(),
|
|
41
|
+
usedSymbolsDownDirty: true,
|
|
42
|
+
usedSymbolsUpDirtyDown: true,
|
|
43
|
+
usedSymbolsUpDirtyUp: true,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function nodeFromAssetGroup(assetGroup) {
|
|
47
|
+
return {
|
|
48
|
+
id: (0, rust_1.hashString)(
|
|
49
|
+
// @ts-expect-error TS2345
|
|
50
|
+
(0, projectPath_1.fromProjectPathRelative)(assetGroup.filePath) +
|
|
51
|
+
// @ts-expect-error TS2345
|
|
52
|
+
(0, EnvironmentManager_1.toEnvironmentId)(assetGroup.env) +
|
|
53
|
+
String(assetGroup.isSource) +
|
|
54
|
+
String(assetGroup.sideEffects) +
|
|
55
|
+
(assetGroup.code ?? '') +
|
|
56
|
+
':' +
|
|
57
|
+
(assetGroup.pipeline ?? '') +
|
|
58
|
+
':' +
|
|
59
|
+
(assetGroup.query ?? '')),
|
|
60
|
+
type: 'asset_group',
|
|
61
|
+
value: assetGroup,
|
|
62
|
+
usedSymbolsDownDirty: true,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function nodeFromAsset(asset) {
|
|
66
|
+
return {
|
|
67
|
+
id: asset.id,
|
|
68
|
+
type: 'asset',
|
|
69
|
+
value: asset,
|
|
70
|
+
usedSymbols: new Set(),
|
|
71
|
+
usedSymbolsDownDirty: true,
|
|
72
|
+
usedSymbolsUpDirty: true,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
function nodeFromEntrySpecifier(entry) {
|
|
76
|
+
return {
|
|
77
|
+
id: 'entry_specifier:' + (0, projectPath_1.fromProjectPathRelative)(entry),
|
|
78
|
+
type: 'entry_specifier',
|
|
79
|
+
value: entry,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
function nodeFromEntryFile(entry) {
|
|
83
|
+
return {
|
|
84
|
+
id: 'entry_file:' + (0, utils_1.hashObject)(entry),
|
|
85
|
+
type: 'entry_file',
|
|
86
|
+
value: entry,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
// @ts-expect-error TS2417
|
|
90
|
+
class AssetGraph extends graph_1.ContentGraph {
|
|
91
|
+
constructor(opts) {
|
|
92
|
+
/**
|
|
93
|
+
* Incremented when the asset graph is modified such that it requires a bundling pass.
|
|
94
|
+
*/
|
|
95
|
+
_AssetGraph_bundlingVersion.set(this, 0);
|
|
96
|
+
/**
|
|
97
|
+
* Force incremental bundling to be disabled.
|
|
98
|
+
*/
|
|
99
|
+
_AssetGraph_disableIncrementalBundling.set(this, false);
|
|
100
|
+
/**
|
|
101
|
+
* @deprecated
|
|
102
|
+
*/
|
|
103
|
+
this.safeToIncrementallyBundle = true;
|
|
104
|
+
if (opts) {
|
|
105
|
+
let { hash, bundlingVersion, disableIncrementalBundling, ...rest } = opts;
|
|
106
|
+
// @ts-expect-error TS2345
|
|
107
|
+
super(rest);
|
|
108
|
+
this.hash = hash;
|
|
109
|
+
__classPrivateFieldSet(this, _AssetGraph_bundlingVersion, bundlingVersion ?? 0, "f");
|
|
110
|
+
__classPrivateFieldSet(this, _AssetGraph_disableIncrementalBundling, disableIncrementalBundling ?? false, "f");
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
super();
|
|
114
|
+
this.setRootNodeId(this.addNode({
|
|
115
|
+
id: '@@root',
|
|
116
|
+
type: 'root',
|
|
117
|
+
value: null,
|
|
118
|
+
}));
|
|
119
|
+
}
|
|
120
|
+
this.undeferredDependencies = new Set();
|
|
121
|
+
this.envCache = new Map();
|
|
122
|
+
}
|
|
123
|
+
static deserialize(opts) {
|
|
124
|
+
return new AssetGraph(opts);
|
|
125
|
+
}
|
|
126
|
+
serialize() {
|
|
127
|
+
return {
|
|
128
|
+
...super.serialize(),
|
|
129
|
+
bundlingVersion: __classPrivateFieldGet(this, _AssetGraph_bundlingVersion, "f"),
|
|
130
|
+
disableIncrementalBundling: __classPrivateFieldGet(this, _AssetGraph_disableIncrementalBundling, "f"),
|
|
131
|
+
hash: this.hash,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Force incremental bundling to be disabled.
|
|
136
|
+
*/
|
|
137
|
+
setDisableIncrementalBundling(disable) {
|
|
138
|
+
__classPrivateFieldSet(this, _AssetGraph_disableIncrementalBundling, disable, "f");
|
|
139
|
+
}
|
|
140
|
+
testing_getDisableIncrementalBundling() {
|
|
141
|
+
return __classPrivateFieldGet(this, _AssetGraph_disableIncrementalBundling, "f");
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Make sure this asset graph is marked as needing a full bundling pass.
|
|
145
|
+
*/
|
|
146
|
+
setNeedsBundling() {
|
|
147
|
+
if (!(0, feature_flags_1.getFeatureFlag)('incrementalBundlingVersioning')) {
|
|
148
|
+
// In legacy mode, we rely solely on safeToIncrementallyBundle to
|
|
149
|
+
// invalidate incremental bundling, so we skip bumping the version.
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
__classPrivateFieldSet(this, _AssetGraph_bundlingVersion, __classPrivateFieldGet(this, _AssetGraph_bundlingVersion, "f") + 1, "f");
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Get the current bundling version.
|
|
156
|
+
*
|
|
157
|
+
* Each bundle pass should keep this version around. Whenever an asset graph has a new version,
|
|
158
|
+
* bundling should be re-run.
|
|
159
|
+
*/
|
|
160
|
+
getBundlingVersion() {
|
|
161
|
+
if (!(0, feature_flags_1.getFeatureFlag)('incrementalBundlingVersioning')) {
|
|
162
|
+
return 0;
|
|
163
|
+
}
|
|
164
|
+
return __classPrivateFieldGet(this, _AssetGraph_bundlingVersion, "f");
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* If the `bundlingVersion` has not changed since the last bundling pass,
|
|
168
|
+
* we can incrementally bundle, which will not require a full bundling pass
|
|
169
|
+
* but just update assets into the bundle graph output.
|
|
170
|
+
*/
|
|
171
|
+
canIncrementallyBundle(lastVersion) {
|
|
172
|
+
if (!(0, feature_flags_1.getFeatureFlag)('incrementalBundlingVersioning')) {
|
|
173
|
+
return (this.safeToIncrementallyBundle && !__classPrivateFieldGet(this, _AssetGraph_disableIncrementalBundling, "f"));
|
|
174
|
+
}
|
|
175
|
+
return (this.safeToIncrementallyBundle &&
|
|
176
|
+
__classPrivateFieldGet(this, _AssetGraph_bundlingVersion, "f") === lastVersion &&
|
|
177
|
+
!__classPrivateFieldGet(this, _AssetGraph_disableIncrementalBundling, "f"));
|
|
178
|
+
}
|
|
179
|
+
// Deduplicates Environments by making them referentially equal
|
|
180
|
+
normalizeEnvironment(input) {
|
|
181
|
+
if ((0, feature_flags_1.getFeatureFlag)('environmentDeduplication')) {
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
// @ts-expect-error TS2345
|
|
185
|
+
let { id, context } = (0, EnvironmentManager_1.fromEnvironmentId)(input.env);
|
|
186
|
+
let idAndContext = `${id}-${context}`;
|
|
187
|
+
let env = this.envCache.get(idAndContext);
|
|
188
|
+
if (env) {
|
|
189
|
+
input.env = (0, EnvironmentManager_1.toEnvironmentRef)(env);
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
// @ts-expect-error TS2345
|
|
193
|
+
this.envCache.set(idAndContext, (0, EnvironmentManager_1.fromEnvironmentId)(input.env));
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
setRootConnections({ entries, assetGroups }) {
|
|
197
|
+
let nodes = [];
|
|
198
|
+
if (entries) {
|
|
199
|
+
for (let entry of entries) {
|
|
200
|
+
let node = nodeFromEntrySpecifier(entry);
|
|
201
|
+
nodes.push(node);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
else if (assetGroups) {
|
|
205
|
+
for (const assetGroup of assetGroups) {
|
|
206
|
+
// Adding nodes individually ensures we do not encounter a range stack size exceeded error
|
|
207
|
+
// when there are >100000 asset groups
|
|
208
|
+
nodes.push(nodeFromAssetGroup(assetGroup));
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
this.replaceNodeIdsConnectedTo((0, nullthrows_1.default)(this.rootNodeId), nodes.map((node) => this.addNode(node)));
|
|
212
|
+
}
|
|
213
|
+
addNode(node) {
|
|
214
|
+
this.hash = null;
|
|
215
|
+
let existing = this.getNodeByContentKey(node.id);
|
|
216
|
+
if (existing != null) {
|
|
217
|
+
(0, assert_1.default)(existing.type === node.type);
|
|
218
|
+
existing.value = node.value;
|
|
219
|
+
let existingId = this.getNodeIdByContentKey(node.id);
|
|
220
|
+
this.updateNode(existingId, existing);
|
|
221
|
+
return existingId;
|
|
222
|
+
}
|
|
223
|
+
return super.addNodeByContentKey(node.id, node);
|
|
224
|
+
}
|
|
225
|
+
removeNode(nodeId) {
|
|
226
|
+
this.hash = null;
|
|
227
|
+
this.onNodeRemoved && this.onNodeRemoved(nodeId);
|
|
228
|
+
return super.removeNode(nodeId);
|
|
229
|
+
}
|
|
230
|
+
resolveEntry(entry, resolved, correspondingRequest) {
|
|
231
|
+
let entrySpecifierNodeId = this.getNodeIdByContentKey(nodeFromEntrySpecifier(entry).id);
|
|
232
|
+
let entrySpecifierNode = (0, nullthrows_1.default)(this.getNode(entrySpecifierNodeId));
|
|
233
|
+
(0, assert_1.default)(entrySpecifierNode.type === 'entry_specifier');
|
|
234
|
+
entrySpecifierNode.correspondingRequest = correspondingRequest;
|
|
235
|
+
this.replaceNodeIdsConnectedTo(entrySpecifierNodeId, resolved.map((file) => this.addNode(nodeFromEntryFile(file))));
|
|
236
|
+
}
|
|
237
|
+
resolveTargets(entry, targets, correspondingRequest) {
|
|
238
|
+
let depNodes = targets.map((target) => {
|
|
239
|
+
let node = nodeFromDep(
|
|
240
|
+
// The passed project path is ignored in this case, because there is no `loc`
|
|
241
|
+
(0, Dependency_1.createDependency)('', {
|
|
242
|
+
specifier: (0, projectPath_1.fromProjectPathRelative)(entry.filePath),
|
|
243
|
+
specifierType: 'url',
|
|
244
|
+
pipeline: target.pipeline,
|
|
245
|
+
target: target,
|
|
246
|
+
env: target.env,
|
|
247
|
+
isEntry: true,
|
|
248
|
+
needsStableName: true,
|
|
249
|
+
// @ts-expect-error TS2322
|
|
250
|
+
symbols: (0, EnvironmentManager_1.fromEnvironmentId)(target.env).isLibrary
|
|
251
|
+
? new Map([['*', { local: '*', isWeak: true, loc: null }]])
|
|
252
|
+
: undefined,
|
|
253
|
+
}));
|
|
254
|
+
if ((0, EnvironmentManager_1.fromEnvironmentId)(node.value.env).isLibrary) {
|
|
255
|
+
// in library mode, all of the entry's symbols are "used"
|
|
256
|
+
node.usedSymbolsDown.add('*');
|
|
257
|
+
node.usedSymbolsUp.set('*', undefined);
|
|
258
|
+
}
|
|
259
|
+
return node;
|
|
260
|
+
});
|
|
261
|
+
let entryNodeId = this.getNodeIdByContentKey(nodeFromEntryFile(entry).id);
|
|
262
|
+
let entryNode = (0, nullthrows_1.default)(this.getNode(entryNodeId));
|
|
263
|
+
(0, assert_1.default)(entryNode.type === 'entry_file');
|
|
264
|
+
entryNode.correspondingRequest = correspondingRequest;
|
|
265
|
+
this.replaceNodeIdsConnectedTo(entryNodeId, depNodes.map((node) => this.addNode(node)));
|
|
266
|
+
}
|
|
267
|
+
resolveDependency(dependency, assetGroup, correspondingRequest) {
|
|
268
|
+
let depNodeId = this.getNodeIdByContentKey(dependency.id);
|
|
269
|
+
let depNode = (0, nullthrows_1.default)(this.getNode(depNodeId));
|
|
270
|
+
(0, assert_1.default)(depNode.type === 'dependency');
|
|
271
|
+
depNode.correspondingRequest = correspondingRequest;
|
|
272
|
+
if (!assetGroup) {
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
let assetGroupNode = nodeFromAssetGroup(assetGroup);
|
|
276
|
+
let existing = this.getNodeByContentKey(assetGroupNode.id);
|
|
277
|
+
if (existing != null) {
|
|
278
|
+
(0, assert_1.default)(existing.type === 'asset_group');
|
|
279
|
+
assetGroupNode.value.canDefer =
|
|
280
|
+
assetGroupNode.value.canDefer && existing.value.canDefer;
|
|
281
|
+
}
|
|
282
|
+
let assetGroupNodeId = this.addNode(assetGroupNode);
|
|
283
|
+
this.replaceNodeIdsConnectedTo(this.getNodeIdByContentKey(dependency.id), [
|
|
284
|
+
assetGroupNodeId,
|
|
285
|
+
]);
|
|
286
|
+
this.replaceNodeIdsConnectedTo(depNodeId, [assetGroupNodeId]);
|
|
287
|
+
}
|
|
288
|
+
shouldVisitChild(nodeId, childNodeId) {
|
|
289
|
+
let node = (0, nullthrows_1.default)(this.getNode(nodeId));
|
|
290
|
+
let childNode = (0, nullthrows_1.default)(this.getNode(childNodeId));
|
|
291
|
+
if (node.type !== 'dependency' ||
|
|
292
|
+
childNode.type !== 'asset_group' ||
|
|
293
|
+
childNode.deferred === false) {
|
|
294
|
+
return true;
|
|
295
|
+
}
|
|
296
|
+
// Node types are proved above
|
|
297
|
+
let dependencyNode = node;
|
|
298
|
+
let assetGroupNode = childNode;
|
|
299
|
+
let { sideEffects, canDefer = true } = assetGroupNode.value;
|
|
300
|
+
let dependency = dependencyNode.value;
|
|
301
|
+
let dependencyPreviouslyDeferred = dependencyNode.hasDeferred;
|
|
302
|
+
let assetGroupPreviouslyDeferred = assetGroupNode.deferred;
|
|
303
|
+
let defer = this.shouldDeferDependency(dependency, sideEffects, canDefer);
|
|
304
|
+
dependencyNode.hasDeferred = defer;
|
|
305
|
+
assetGroupNode.deferred = defer;
|
|
306
|
+
if (!dependencyPreviouslyDeferred && defer) {
|
|
307
|
+
this.markParentsWithHasDeferred(nodeId);
|
|
308
|
+
}
|
|
309
|
+
else if (assetGroupPreviouslyDeferred && !defer) {
|
|
310
|
+
this.unmarkParentsWithHasDeferred(childNodeId);
|
|
311
|
+
}
|
|
312
|
+
return !defer;
|
|
313
|
+
}
|
|
314
|
+
// Dependency: mark parent Asset <- AssetGroup with hasDeferred true
|
|
315
|
+
markParentsWithHasDeferred(nodeId) {
|
|
316
|
+
this.traverseAncestors(nodeId, (traversedNodeId, _, actions) => {
|
|
317
|
+
let traversedNode = (0, nullthrows_1.default)(this.getNode(traversedNodeId));
|
|
318
|
+
if (traversedNode.type === 'asset') {
|
|
319
|
+
traversedNode.hasDeferred = true;
|
|
320
|
+
}
|
|
321
|
+
else if (traversedNode.type === 'asset_group') {
|
|
322
|
+
traversedNode.hasDeferred = true;
|
|
323
|
+
actions.skipChildren();
|
|
324
|
+
}
|
|
325
|
+
else if (nodeId !== traversedNodeId) {
|
|
326
|
+
actions.skipChildren();
|
|
327
|
+
}
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
// AssetGroup: update hasDeferred of all parent Dependency <- Asset <- AssetGroup
|
|
331
|
+
unmarkParentsWithHasDeferred(nodeId) {
|
|
332
|
+
this.traverseAncestors(nodeId, (traversedNodeId, ctx, actions) => {
|
|
333
|
+
let traversedNode = (0, nullthrows_1.default)(this.getNode(traversedNodeId));
|
|
334
|
+
if (traversedNode.type === 'asset') {
|
|
335
|
+
let hasDeferred = this.getNodeIdsConnectedFrom(traversedNodeId).some((childNodeId) => {
|
|
336
|
+
let childNode = (0, nullthrows_1.default)(this.getNode(childNodeId));
|
|
337
|
+
// @ts-expect-error TS2339
|
|
338
|
+
return childNode.hasDeferred == null
|
|
339
|
+
? false
|
|
340
|
+
: // @ts-expect-error TS2339
|
|
341
|
+
childNode.hasDeferred;
|
|
342
|
+
});
|
|
343
|
+
if (!hasDeferred) {
|
|
344
|
+
delete traversedNode.hasDeferred;
|
|
345
|
+
}
|
|
346
|
+
return { hasDeferred };
|
|
347
|
+
}
|
|
348
|
+
else if (traversedNode.type === 'asset_group' &&
|
|
349
|
+
nodeId !== traversedNodeId) {
|
|
350
|
+
// @ts-expect-error TS2339
|
|
351
|
+
if (!ctx?.hasDeferred) {
|
|
352
|
+
this.safeToIncrementallyBundle = false;
|
|
353
|
+
this.setNeedsBundling();
|
|
354
|
+
delete traversedNode.hasDeferred;
|
|
355
|
+
}
|
|
356
|
+
actions.skipChildren();
|
|
357
|
+
}
|
|
358
|
+
else if (traversedNode.type === 'dependency') {
|
|
359
|
+
this.safeToIncrementallyBundle = false;
|
|
360
|
+
this.setNeedsBundling();
|
|
361
|
+
traversedNode.hasDeferred = false;
|
|
362
|
+
}
|
|
363
|
+
else if (nodeId !== traversedNodeId) {
|
|
364
|
+
actions.skipChildren();
|
|
365
|
+
}
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
// Defer transforming this dependency if it is marked as weak, there are no side effects,
|
|
369
|
+
// no re-exported symbols are used by ancestor dependencies and the re-exporting asset isn't
|
|
370
|
+
// using a wildcard and isn't an entry (in library mode).
|
|
371
|
+
// This helps with performance building large libraries like `lodash-es`, which re-exports
|
|
372
|
+
// a huge number of functions since we can avoid even transforming the files that aren't used.
|
|
373
|
+
shouldDeferDependency(dependency, sideEffects, canDefer) {
|
|
374
|
+
let dependencySymbols = dependency.symbols;
|
|
375
|
+
// Doing this separately keeps Flow happy further down
|
|
376
|
+
if (!dependencySymbols) {
|
|
377
|
+
return false;
|
|
378
|
+
}
|
|
379
|
+
let isDeferrable = [...dependencySymbols].every(([, { isWeak }]) => isWeak) &&
|
|
380
|
+
sideEffects === false &&
|
|
381
|
+
canDefer &&
|
|
382
|
+
!dependencySymbols.has('*');
|
|
383
|
+
if (!isDeferrable) {
|
|
384
|
+
return false;
|
|
385
|
+
}
|
|
386
|
+
let depNodeId = this.getNodeIdByContentKey(dependency.id);
|
|
387
|
+
let depNode = this.getNode(depNodeId);
|
|
388
|
+
(0, assert_1.default)(depNode);
|
|
389
|
+
let assets = this.getNodeIdsConnectedTo(depNodeId);
|
|
390
|
+
let symbols = new Map([...dependencySymbols].map(([key, val]) => [val.local, key]));
|
|
391
|
+
(0, assert_1.default)(assets.length === 1);
|
|
392
|
+
let firstAsset = (0, nullthrows_1.default)(this.getNode(assets[0]));
|
|
393
|
+
(0, assert_1.default)(firstAsset.type === 'asset');
|
|
394
|
+
let resolvedAsset = firstAsset.value;
|
|
395
|
+
// This doesn't change from here, so checking it now saves
|
|
396
|
+
// us some calls to `getIncomingDependency`
|
|
397
|
+
if (!resolvedAsset.symbols) {
|
|
398
|
+
return true;
|
|
399
|
+
}
|
|
400
|
+
let deps = this.getIncomingDependencies(resolvedAsset);
|
|
401
|
+
return deps.every((d) => {
|
|
402
|
+
// If this dependency has already been through this process, and we
|
|
403
|
+
// know it's not deferrable, then there's no need to re-check
|
|
404
|
+
if (this.undeferredDependencies.has(d)) {
|
|
405
|
+
return false;
|
|
406
|
+
}
|
|
407
|
+
let depIsDeferrable = d.symbols &&
|
|
408
|
+
!((0, EnvironmentManager_1.fromEnvironmentId)(d.env).isLibrary && d.isEntry) &&
|
|
409
|
+
!d.symbols.has('*') &&
|
|
410
|
+
![...d.symbols.keys()].some((symbol) => {
|
|
411
|
+
let assetSymbol = resolvedAsset.symbols?.get(symbol)?.local;
|
|
412
|
+
return assetSymbol != null && symbols.has(assetSymbol);
|
|
413
|
+
});
|
|
414
|
+
if (!depIsDeferrable) {
|
|
415
|
+
// Mark this dep as not deferrable so it doesn't have to be re-checked
|
|
416
|
+
this.undeferredDependencies.add(d);
|
|
417
|
+
return false;
|
|
418
|
+
}
|
|
419
|
+
});
|
|
420
|
+
}
|
|
421
|
+
resolveAssetGroup(assetGroup, assets, correspondingRequest) {
|
|
422
|
+
this.normalizeEnvironment(assetGroup);
|
|
423
|
+
let assetGroupNode = nodeFromAssetGroup(assetGroup);
|
|
424
|
+
// @ts-expect-error TS2322
|
|
425
|
+
assetGroupNode = this.getNodeByContentKey(assetGroupNode.id);
|
|
426
|
+
if (!assetGroupNode) {
|
|
427
|
+
return;
|
|
428
|
+
}
|
|
429
|
+
(0, assert_1.default)(assetGroupNode.type === 'asset_group');
|
|
430
|
+
assetGroupNode.correspondingRequest = correspondingRequest;
|
|
431
|
+
let assetsByKey = new Map();
|
|
432
|
+
for (let asset of assets) {
|
|
433
|
+
if (asset.uniqueKey != null) {
|
|
434
|
+
assetsByKey.set(asset.uniqueKey, asset);
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
let dependentAssetKeys = new Set();
|
|
438
|
+
for (let asset of assets) {
|
|
439
|
+
for (let dep of asset.dependencies.values()) {
|
|
440
|
+
if (assetsByKey.has(dep.specifier)) {
|
|
441
|
+
dependentAssetKeys.add(dep.specifier);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
let assetObjects = [];
|
|
446
|
+
let assetNodeIds = [];
|
|
447
|
+
for (let asset of assets) {
|
|
448
|
+
this.normalizeEnvironment(asset);
|
|
449
|
+
let isDirect = !dependentAssetKeys.has(asset.uniqueKey);
|
|
450
|
+
let dependentAssets = [];
|
|
451
|
+
for (let dep of asset.dependencies.values()) {
|
|
452
|
+
let dependentAsset = assetsByKey.get(dep.specifier);
|
|
453
|
+
if (dependentAsset) {
|
|
454
|
+
dependentAssets.push(dependentAsset);
|
|
455
|
+
if (dependentAsset.id === asset.id) {
|
|
456
|
+
// Don't orphan circular dependencies.
|
|
457
|
+
isDirect = true;
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
let id = this.addNode(nodeFromAsset(asset));
|
|
462
|
+
assetObjects.push({
|
|
463
|
+
assetNodeId: id,
|
|
464
|
+
dependentAssets,
|
|
465
|
+
});
|
|
466
|
+
if (isDirect) {
|
|
467
|
+
assetNodeIds.push(id);
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
this.replaceNodeIdsConnectedTo(this.getNodeIdByContentKey(assetGroupNode.id), assetNodeIds);
|
|
471
|
+
for (let { assetNodeId, dependentAssets } of assetObjects) {
|
|
472
|
+
// replaceNodesConnectedTo has merged the value into the existing node, retrieve
|
|
473
|
+
// the actual current node.
|
|
474
|
+
let assetNode = (0, nullthrows_1.default)(this.getNode(assetNodeId));
|
|
475
|
+
(0, assert_1.default)(assetNode.type === 'asset');
|
|
476
|
+
this.resolveAsset(assetNode, dependentAssets);
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
resolveAsset(assetNode, dependentAssets) {
|
|
480
|
+
let depNodeIds = [];
|
|
481
|
+
let depNodesWithAssets = [];
|
|
482
|
+
for (let dep of assetNode.value.dependencies.values()) {
|
|
483
|
+
this.normalizeEnvironment(dep);
|
|
484
|
+
let depNode = nodeFromDep(dep);
|
|
485
|
+
let existing = this.getNodeByContentKey(depNode.id);
|
|
486
|
+
if (existing?.type === 'dependency' &&
|
|
487
|
+
existing.value.resolverMeta != null) {
|
|
488
|
+
depNode.value.meta = {
|
|
489
|
+
...depNode.value.meta,
|
|
490
|
+
...existing.value.resolverMeta,
|
|
491
|
+
};
|
|
492
|
+
if ((0, feature_flags_1.getFeatureFlag)('hmrImprovements')) {
|
|
493
|
+
depNode.value.resolverMeta = existing.value.resolverMeta;
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
if ((0, feature_flags_1.getFeatureFlag)('hmrImprovements')) {
|
|
497
|
+
if (existing?.type === 'dependency' &&
|
|
498
|
+
existing.value.resolverPriority != null) {
|
|
499
|
+
depNode.value.priority = existing.value.resolverPriority;
|
|
500
|
+
depNode.value.resolverPriority = existing.value.resolverPriority;
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
let dependentAsset = dependentAssets.find((a) => a.uniqueKey === dep.specifier);
|
|
504
|
+
if (dependentAsset) {
|
|
505
|
+
depNode.complete = true;
|
|
506
|
+
depNodesWithAssets.push([depNode, nodeFromAsset(dependentAsset)]);
|
|
507
|
+
}
|
|
508
|
+
depNode.value.sourceAssetType = assetNode.value.type;
|
|
509
|
+
depNodeIds.push(this.addNode(depNode));
|
|
510
|
+
}
|
|
511
|
+
assetNode.usedSymbolsUpDirty = true;
|
|
512
|
+
assetNode.usedSymbolsDownDirty = true;
|
|
513
|
+
this.replaceNodeIdsConnectedTo(this.getNodeIdByContentKey(assetNode.id), depNodeIds);
|
|
514
|
+
for (let [depNode, dependentAssetNode] of depNodesWithAssets) {
|
|
515
|
+
let depAssetNodeId = this.addNode(dependentAssetNode);
|
|
516
|
+
this.replaceNodeIdsConnectedTo(this.getNodeIdByContentKey(depNode.id), [
|
|
517
|
+
depAssetNodeId,
|
|
518
|
+
]);
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
getIncomingDependencies(asset) {
|
|
522
|
+
let nodeId = this.getNodeIdByContentKey(asset.id);
|
|
523
|
+
let assetGroupIds = this.getNodeIdsConnectedTo(nodeId);
|
|
524
|
+
let dependencies = [];
|
|
525
|
+
for (let i = 0; i < assetGroupIds.length; i++) {
|
|
526
|
+
let assetGroupId = assetGroupIds[i];
|
|
527
|
+
// Sometimes assets are connected directly to dependencies
|
|
528
|
+
// rather than through an asset group. This happens due to
|
|
529
|
+
// inline dependencies on assets via uniqueKey. See resolveAsset.
|
|
530
|
+
let node = this.getNode(assetGroupId);
|
|
531
|
+
if (node?.type === 'dependency') {
|
|
532
|
+
dependencies.push(node.value);
|
|
533
|
+
continue;
|
|
534
|
+
}
|
|
535
|
+
let assetIds = this.getNodeIdsConnectedTo(assetGroupId);
|
|
536
|
+
for (let j = 0; j < assetIds.length; j++) {
|
|
537
|
+
let node = this.getNode(assetIds[j]);
|
|
538
|
+
if (!node || node.type !== 'dependency') {
|
|
539
|
+
continue;
|
|
540
|
+
}
|
|
541
|
+
dependencies.push(node.value);
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
return dependencies;
|
|
545
|
+
}
|
|
546
|
+
traverseAssets(visit, startNodeId) {
|
|
547
|
+
return this.filteredTraverse((nodeId) => {
|
|
548
|
+
let node = (0, nullthrows_1.default)(this.getNode(nodeId));
|
|
549
|
+
return node.type === 'asset' ? node.value : null;
|
|
550
|
+
}, visit, startNodeId);
|
|
551
|
+
}
|
|
552
|
+
getEntryAssetGroupNodes() {
|
|
553
|
+
let entryNodes = [];
|
|
554
|
+
this.traverse((nodeId, _, actions) => {
|
|
555
|
+
let node = (0, nullthrows_1.default)(this.getNode(nodeId));
|
|
556
|
+
if (node.type === 'asset_group') {
|
|
557
|
+
entryNodes.push(node);
|
|
558
|
+
actions.skipChildren();
|
|
559
|
+
}
|
|
560
|
+
});
|
|
561
|
+
return entryNodes;
|
|
562
|
+
}
|
|
563
|
+
getEntryAssets() {
|
|
564
|
+
let entries = [];
|
|
565
|
+
this.traverseAssets((asset, ctx, traversal) => {
|
|
566
|
+
entries.push(asset);
|
|
567
|
+
traversal.skipChildren();
|
|
568
|
+
});
|
|
569
|
+
return entries;
|
|
570
|
+
}
|
|
571
|
+
getHash() {
|
|
572
|
+
if (this.hash != null) {
|
|
573
|
+
return this.hash;
|
|
574
|
+
}
|
|
575
|
+
let hash = new rust_1.Hash();
|
|
576
|
+
// TODO: sort??
|
|
577
|
+
this.traverse((nodeId) => {
|
|
578
|
+
let node = (0, nullthrows_1.default)(this.getNode(nodeId));
|
|
579
|
+
if (node.type === 'asset') {
|
|
580
|
+
hash.writeString((0, nullthrows_1.default)(node.value.outputHash));
|
|
581
|
+
}
|
|
582
|
+
else if (node.type === 'dependency' && node.value.target) {
|
|
583
|
+
hash.writeString(JSON.stringify(node.value.target));
|
|
584
|
+
}
|
|
585
|
+
});
|
|
586
|
+
this.hash = hash.finish();
|
|
587
|
+
return this.hash;
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
_AssetGraph_bundlingVersion = new WeakMap(), _AssetGraph_disableIncrementalBundling = new WeakMap();
|
|
591
|
+
exports.default = AssetGraph;
|