@atlaspack/core 2.13.2-dev.3682 → 2.14.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.
Files changed (87) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/package.json +20 -20
  3. package/src/Atlaspack.js +3 -2
  4. package/src/atlaspack-v3/AtlaspackV3.js +24 -8
  5. package/src/loadAtlaspackPlugin.js +26 -71
  6. package/src/projectPath.js +14 -1
  7. package/src/requests/WriteBundlesRequest.js +31 -22
  8. package/LICENSE +0 -201
  9. package/lib/AssetGraph.js +0 -521
  10. package/lib/Atlaspack.js +0 -676
  11. package/lib/AtlaspackConfig.js +0 -298
  12. package/lib/AtlaspackConfig.schema.js +0 -103
  13. package/lib/BundleGraph.js +0 -1527
  14. package/lib/CommittedAsset.js +0 -155
  15. package/lib/Dependency.js +0 -136
  16. package/lib/Environment.js +0 -144
  17. package/lib/IdentifierRegistry.js +0 -36
  18. package/lib/InternalConfig.js +0 -56
  19. package/lib/PackagerRunner.js +0 -525
  20. package/lib/ReporterRunner.js +0 -151
  21. package/lib/RequestTracker.js +0 -1178
  22. package/lib/SymbolPropagation.js +0 -618
  23. package/lib/TargetDescriptor.schema.js +0 -118
  24. package/lib/Transformation.js +0 -522
  25. package/lib/UncommittedAsset.js +0 -348
  26. package/lib/Validation.js +0 -203
  27. package/lib/applyRuntimes.js +0 -355
  28. package/lib/assetUtils.js +0 -205
  29. package/lib/atlaspack-v3/AtlaspackV3.js +0 -57
  30. package/lib/atlaspack-v3/NapiWorkerPool.js +0 -71
  31. package/lib/atlaspack-v3/fs.js +0 -39
  32. package/lib/atlaspack-v3/index.js +0 -26
  33. package/lib/atlaspack-v3/jsCallable.js +0 -20
  34. package/lib/atlaspack-v3/worker/compat/asset-symbols.js +0 -197
  35. package/lib/atlaspack-v3/worker/compat/bitflags.js +0 -84
  36. package/lib/atlaspack-v3/worker/compat/dependency.js +0 -44
  37. package/lib/atlaspack-v3/worker/compat/environment.js +0 -57
  38. package/lib/atlaspack-v3/worker/compat/index.js +0 -104
  39. package/lib/atlaspack-v3/worker/compat/mutable-asset.js +0 -164
  40. package/lib/atlaspack-v3/worker/compat/plugin-config.js +0 -78
  41. package/lib/atlaspack-v3/worker/compat/plugin-logger.js +0 -29
  42. package/lib/atlaspack-v3/worker/compat/plugin-options.js +0 -113
  43. package/lib/atlaspack-v3/worker/compat/plugin-tracer.js +0 -12
  44. package/lib/atlaspack-v3/worker/compat/target.js +0 -17
  45. package/lib/atlaspack-v3/worker/index.js +0 -3
  46. package/lib/atlaspack-v3/worker/worker.js +0 -280
  47. package/lib/constants.js +0 -21
  48. package/lib/dumpGraphToGraphViz.js +0 -206
  49. package/lib/index.js +0 -70
  50. package/lib/loadAtlaspackPlugin.js +0 -136
  51. package/lib/loadDotEnv.js +0 -54
  52. package/lib/projectPath.js +0 -94
  53. package/lib/public/Asset.js +0 -259
  54. package/lib/public/Bundle.js +0 -236
  55. package/lib/public/BundleGraph.js +0 -279
  56. package/lib/public/BundleGroup.js +0 -50
  57. package/lib/public/Config.js +0 -202
  58. package/lib/public/Dependency.js +0 -131
  59. package/lib/public/Environment.js +0 -247
  60. package/lib/public/MutableBundleGraph.js +0 -204
  61. package/lib/public/PluginOptions.js +0 -71
  62. package/lib/public/Symbols.js +0 -247
  63. package/lib/public/Target.js +0 -64
  64. package/lib/registerCoreWithSerializer.js +0 -51
  65. package/lib/requests/AssetGraphRequest.js +0 -432
  66. package/lib/requests/AssetGraphRequestRust.js +0 -220
  67. package/lib/requests/AssetRequest.js +0 -132
  68. package/lib/requests/AtlaspackBuildRequest.js +0 -79
  69. package/lib/requests/AtlaspackConfigRequest.js +0 -479
  70. package/lib/requests/BundleGraphRequest.js +0 -485
  71. package/lib/requests/ConfigRequest.js +0 -203
  72. package/lib/requests/DevDepRequest.js +0 -193
  73. package/lib/requests/EntryRequest.js +0 -295
  74. package/lib/requests/PackageRequest.js +0 -88
  75. package/lib/requests/PathRequest.js +0 -357
  76. package/lib/requests/TargetRequest.js +0 -1179
  77. package/lib/requests/ValidationRequest.js +0 -66
  78. package/lib/requests/WriteBundleRequest.js +0 -252
  79. package/lib/requests/WriteBundlesRequest.js +0 -153
  80. package/lib/requests/asset-graph-diff.js +0 -128
  81. package/lib/requests/asset-graph-dot.js +0 -131
  82. package/lib/resolveOptions.js +0 -265
  83. package/lib/serializerCore.browser.js +0 -29
  84. package/lib/summarizeRequest.js +0 -55
  85. package/lib/types.js +0 -35
  86. package/lib/utils.js +0 -160
  87. package/lib/worker.js +0 -184
@@ -1,618 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.propagateSymbols = propagateSymbols;
7
- function _assert() {
8
- const data = _interopRequireDefault(require("assert"));
9
- _assert = function () {
10
- return data;
11
- };
12
- return data;
13
- }
14
- function _nullthrows() {
15
- const data = _interopRequireDefault(require("nullthrows"));
16
- _nullthrows = function () {
17
- return data;
18
- };
19
- return data;
20
- }
21
- function _utils() {
22
- const data = require("@atlaspack/utils");
23
- _utils = function () {
24
- return data;
25
- };
26
- return data;
27
- }
28
- function _logger() {
29
- const data = _interopRequireWildcard(require("@atlaspack/logger"));
30
- _logger = function () {
31
- return data;
32
- };
33
- return data;
34
- }
35
- function _diagnostic() {
36
- const data = require("@atlaspack/diagnostic");
37
- _diagnostic = function () {
38
- return data;
39
- };
40
- return data;
41
- }
42
- var _types = require("./types");
43
- var _projectPath = require("./projectPath");
44
- function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
45
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
46
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
47
- function propagateSymbols({
48
- options,
49
- assetGraph,
50
- changedAssetsPropagation,
51
- assetGroupsWithRemovedParents,
52
- previousErrors
53
- }) {
54
- return (0, _logger().instrument)('propagateSymbols', () => {
55
- let changedAssets = new Set([...changedAssetsPropagation].map(id => assetGraph.getNodeIdByContentKey(id)));
56
-
57
- // To reorder once at the end
58
- let changedDeps = new Set();
59
-
60
- // For the down traversal, the nodes with `usedSymbolsDownDirty = true` are exactly
61
- // `changedAssetsPropagation` (= asset and therefore potentially dependencies changed) or the
62
- // asset children of `assetGroupsWithRemovedParents` (= fewer incoming dependencies causing less
63
- // used symbols).
64
- //
65
- // The up traversal has to consider all nodes that changed in the down traversal
66
- // (`useSymbolsUpDirtyDown = true`) which are listed in `changedDepsUsedSymbolsUpDirtyDown`
67
- // (more or less requested symbols) and in `changedAssetsPropagation` (changing an asset might
68
- // change exports).
69
-
70
- // The dependencies that changed in the down traversal causing an update in the up traversal.
71
- let changedDepsUsedSymbolsUpDirtyDown = new Set();
72
-
73
- // Propagate the requested symbols down from the root to the leaves
74
- propagateSymbolsDown(assetGraph, changedAssets, assetGroupsWithRemovedParents, (assetNode, incomingDeps, outgoingDeps) => {
75
- // exportSymbol -> identifier
76
- let assetSymbols = assetNode.value.symbols;
77
- // identifier -> exportSymbol
78
- let assetSymbolsInverse;
79
- if (assetSymbols) {
80
- assetSymbolsInverse = new Map();
81
- for (let [s, {
82
- local
83
- }] of assetSymbols) {
84
- let set = assetSymbolsInverse.get(local);
85
- if (!set) {
86
- set = new Set();
87
- assetSymbolsInverse.set(local, set);
88
- }
89
- set.add(s);
90
- }
91
- }
92
- let hasNamespaceOutgoingDeps = outgoingDeps.some(d => {
93
- var _d$value$symbols;
94
- return ((_d$value$symbols = d.value.symbols) === null || _d$value$symbols === void 0 || (_d$value$symbols = _d$value$symbols.get('*')) === null || _d$value$symbols === void 0 ? void 0 : _d$value$symbols.local) === '*';
95
- });
96
-
97
- // 1) Determine what the incomingDeps requests from the asset
98
- // ----------------------------------------------------------
99
-
100
- let isEntry = false;
101
- let addAll = false;
102
-
103
- // Used symbols that are exported or reexported (symbol will be removed again later) by asset.
104
- assetNode.usedSymbols = new Set();
105
-
106
- // Symbols that have to be namespace reexported by outgoingDeps.
107
- let namespaceReexportedSymbols = new Set();
108
- if (incomingDeps.length === 0) {
109
- // Root in the runtimes Graph
110
- assetNode.usedSymbols.add('*');
111
- namespaceReexportedSymbols.add('*');
112
- } else {
113
- for (let incomingDep of incomingDeps) {
114
- if (incomingDep.value.symbols == null || incomingDep.value.priority === _types.Priority.conditional) {
115
- if (incomingDep.value.sourceAssetId == null) {
116
- // The root dependency on non-library builds
117
- isEntry = true;
118
- } else {
119
- // A regular dependency with cleared symbols
120
- addAll = true;
121
- }
122
- continue;
123
- }
124
- for (let exportSymbol of incomingDep.usedSymbolsDown) {
125
- if (exportSymbol === '*') {
126
- assetNode.usedSymbols.add('*');
127
- namespaceReexportedSymbols.add('*');
128
- }
129
- if (!assetSymbols || assetSymbols.has(exportSymbol) || assetSymbols.has('*')) {
130
- // An own symbol or a non-namespace reexport
131
- assetNode.usedSymbols.add(exportSymbol);
132
- }
133
- // A namespace reexport
134
- // (but only if we actually have namespace-exporting outgoing dependencies,
135
- // This usually happens with a reexporting asset with many namespace exports which means that
136
- // we cannot match up the correct asset with the used symbol at this level.)
137
- else if (hasNamespaceOutgoingDeps && exportSymbol !== 'default') {
138
- namespaceReexportedSymbols.add(exportSymbol);
139
- }
140
- }
141
- }
142
- }
143
-
144
- // Incomding dependency with cleared symbols, add everything
145
- if (addAll) {
146
- assetSymbols === null || assetSymbols === void 0 || assetSymbols.forEach((_, exportSymbol) => assetNode.usedSymbols.add(exportSymbol));
147
- }
148
-
149
- // 2) Distribute the symbols to the outgoing dependencies
150
- // ----------------------------------------------------------
151
- for (let dep of outgoingDeps) {
152
- let depUsedSymbolsDownOld = dep.usedSymbolsDown;
153
- let depUsedSymbolsDown = new Set();
154
- dep.usedSymbolsDown = depUsedSymbolsDown;
155
- if (assetNode.value.sideEffects ||
156
- // Incoming dependency with cleared symbols
157
- addAll ||
158
- // For entries, we still need to add dep.value.symbols of the entry (which are "used" but not according to the symbols data)
159
- isEntry ||
160
- // If not a single symbol is used, we can say the entire subgraph is not used.
161
- // This is e.g. needed when some symbol is imported and then used for a export which isn't used (= "semi-weak" reexport)
162
- // index.js: `import {bar} from "./lib"; ...`
163
- // lib/index.js: `export * from "./foo.js"; export * from "./bar.js";`
164
- // lib/foo.js: `import { data } from "./bar.js"; export const foo = data + " esm2";`
165
- assetNode.usedSymbols.size > 0 || namespaceReexportedSymbols.size > 0) {
166
- var _depSymbols$get;
167
- let depSymbols = dep.value.symbols;
168
- if (!depSymbols) continue;
169
- if (((_depSymbols$get = depSymbols.get('*')) === null || _depSymbols$get === void 0 ? void 0 : _depSymbols$get.local) === '*') {
170
- if (addAll) {
171
- depUsedSymbolsDown.add('*');
172
- } else {
173
- for (let s of namespaceReexportedSymbols) {
174
- // We need to propagate the namespaceReexportedSymbols to all namespace dependencies (= even wrong ones because we don't know yet)
175
- depUsedSymbolsDown.add(s);
176
- }
177
- }
178
- }
179
- for (let [symbol, {
180
- local
181
- }] of depSymbols) {
182
- var _depSymbols$get2;
183
- // Was already handled above
184
- if (local === '*') continue;
185
- if (!assetSymbolsInverse || !((_depSymbols$get2 = depSymbols.get(symbol)) !== null && _depSymbols$get2 !== void 0 && _depSymbols$get2.isWeak)) {
186
- // Bailout or non-weak symbol (= used in the asset itself = not a reexport)
187
- depUsedSymbolsDown.add(symbol);
188
- } else {
189
- let reexportedExportSymbols = assetSymbolsInverse.get(local);
190
- if (reexportedExportSymbols == null) {
191
- // not reexported = used in asset itself
192
- depUsedSymbolsDown.add(symbol);
193
- } else if (assetNode.usedSymbols.has('*')) {
194
- // we need everything
195
- depUsedSymbolsDown.add(symbol);
196
- [...reexportedExportSymbols].forEach(s => assetNode.usedSymbols.delete(s));
197
- } else {
198
- let usedReexportedExportSymbols = [...reexportedExportSymbols].filter(s => assetNode.usedSymbols.has(s));
199
- if (usedReexportedExportSymbols.length > 0) {
200
- // The symbol is indeed a reexport, so it's not used from the asset itself
201
- depUsedSymbolsDown.add(symbol);
202
- usedReexportedExportSymbols.forEach(s => assetNode.usedSymbols.delete(s));
203
- }
204
- }
205
- }
206
- }
207
- } else {
208
- depUsedSymbolsDown.clear();
209
- }
210
- if (!(0, _utils().setEqual)(depUsedSymbolsDownOld, depUsedSymbolsDown)) {
211
- dep.usedSymbolsDownDirty = true;
212
- dep.usedSymbolsUpDirtyDown = true;
213
- changedDepsUsedSymbolsUpDirtyDown.add(dep.id);
214
- }
215
- if (dep.usedSymbolsUpDirtyDown) {
216
- // Set on node creation
217
- changedDepsUsedSymbolsUpDirtyDown.add(dep.id);
218
- }
219
- }
220
- });
221
- const logFallbackNamespaceInsertion = (assetNode, symbol, depNode1, depNode2) => {
222
- if (options.logLevel === 'verbose') {
223
- _logger().default.warn({
224
- message: `${(0, _projectPath.fromProjectPathRelative)(assetNode.value.filePath)} reexports "${symbol}", which could be resolved either to the dependency "${depNode1.value.specifier}" or "${depNode2.value.specifier}" at runtime. Adding a namespace object to fall back on.`,
225
- origin: '@atlaspack/core'
226
- });
227
- }
228
- };
229
-
230
- // Because namespace reexports introduce ambiguity, go up the graph from the leaves to the
231
- // root and remove requested symbols that aren't actually exported
232
- let errors = propagateSymbolsUp(assetGraph, changedAssets, changedDepsUsedSymbolsUpDirtyDown, previousErrors, (assetNode, incomingDeps, outgoingDeps) => {
233
- let assetSymbols = assetNode.value.symbols;
234
- let assetSymbolsInverse = null;
235
- if (assetSymbols) {
236
- assetSymbolsInverse = new Map();
237
- for (let [s, {
238
- local
239
- }] of assetSymbols) {
240
- let set = assetSymbolsInverse.get(local);
241
- if (!set) {
242
- set = new Set();
243
- assetSymbolsInverse.set(local, set);
244
- }
245
- set.add(s);
246
- }
247
- }
248
-
249
- // the symbols that are reexported (not used in `asset`) -> asset they resolved to
250
- let reexportedSymbols = new Map();
251
- // the symbols that are reexported (not used in `asset`) -> the corresponding outgoingDep(s)
252
- // To generate the diagnostic when there are multiple dependencies with non-statically
253
- // analyzable exports
254
- let reexportedSymbolsSource = new Map();
255
- for (let outgoingDep of outgoingDeps) {
256
- var _outgoingDepSymbols$g;
257
- let outgoingDepSymbols = outgoingDep.value.symbols;
258
- if (!outgoingDepSymbols) continue;
259
- let isExcluded = assetGraph.getNodeIdsConnectedFrom(assetGraph.getNodeIdByContentKey(outgoingDep.id)).length === 0;
260
- // excluded, assume everything that is requested exists
261
- if (isExcluded) {
262
- outgoingDep.usedSymbolsDown.forEach((_, s) => outgoingDep.usedSymbolsUp.set(s, null));
263
- }
264
- if (((_outgoingDepSymbols$g = outgoingDepSymbols.get('*')) === null || _outgoingDepSymbols$g === void 0 ? void 0 : _outgoingDepSymbols$g.local) === '*') {
265
- outgoingDep.usedSymbolsUp.forEach((sResolved, s) => {
266
- if (s === 'default') {
267
- return;
268
- }
269
-
270
- // If the symbol could come from multiple assets at runtime, assetNode's
271
- // namespace will be needed at runtime to perform the lookup on.
272
- if (reexportedSymbols.has(s)) {
273
- if (!assetNode.usedSymbols.has('*')) {
274
- logFallbackNamespaceInsertion(assetNode, s, (0, _nullthrows().default)(reexportedSymbolsSource.get(s)), outgoingDep);
275
- }
276
- assetNode.usedSymbols.add('*');
277
- reexportedSymbols.set(s, {
278
- asset: assetNode.id,
279
- symbol: s
280
- });
281
- } else {
282
- reexportedSymbols.set(s, sResolved);
283
- reexportedSymbolsSource.set(s, outgoingDep);
284
- }
285
- });
286
- }
287
- for (let [s, sResolved] of outgoingDep.usedSymbolsUp) {
288
- var _outgoingDepSymbols$g2, _assetSymbolsInverse;
289
- if (!outgoingDep.usedSymbolsDown.has(s)) {
290
- // usedSymbolsDown is a superset of usedSymbolsUp
291
- continue;
292
- }
293
- let local = (_outgoingDepSymbols$g2 = outgoingDepSymbols.get(s)) === null || _outgoingDepSymbols$g2 === void 0 ? void 0 : _outgoingDepSymbols$g2.local;
294
- if (local == null) {
295
- // Caused by '*' => '*', already handled
296
- continue;
297
- }
298
- let reexported = (_assetSymbolsInverse = assetSymbolsInverse) === null || _assetSymbolsInverse === void 0 ? void 0 : _assetSymbolsInverse.get(local);
299
- if (reexported != null) {
300
- reexported.forEach(s => {
301
- // see same code above
302
- if (reexportedSymbols.has(s)) {
303
- if (!assetNode.usedSymbols.has('*')) {
304
- logFallbackNamespaceInsertion(assetNode, s, (0, _nullthrows().default)(reexportedSymbolsSource.get(s)), outgoingDep);
305
- }
306
- assetNode.usedSymbols.add('*');
307
- reexportedSymbols.set(s, {
308
- asset: assetNode.id,
309
- symbol: s
310
- });
311
- } else {
312
- reexportedSymbols.set(s, sResolved);
313
- reexportedSymbolsSource.set(s, outgoingDep);
314
- }
315
- });
316
- }
317
- }
318
- }
319
- let errors = [];
320
- function usedSymbolsUpAmbiguous(old, current, s, value) {
321
- if (old.has(s)) {
322
- let valueOld = old.get(s);
323
- if (valueOld !== value && !((valueOld === null || valueOld === void 0 ? void 0 : valueOld.asset) === value.asset && (valueOld === null || valueOld === void 0 ? void 0 : valueOld.symbol) === value.symbol)) {
324
- // The dependency points to multiple assets (via an asset group).
325
- current.set(s, undefined);
326
- return;
327
- }
328
- }
329
- current.set(s, value);
330
- }
331
- for (let incomingDep of incomingDeps) {
332
- var _incomingDepSymbols$g;
333
- let incomingDepUsedSymbolsUpOld = incomingDep.usedSymbolsUp;
334
- incomingDep.usedSymbolsUp = new Map();
335
- let incomingDepSymbols = incomingDep.value.symbols;
336
- if (!incomingDepSymbols) continue;
337
- let hasNamespaceReexport = ((_incomingDepSymbols$g = incomingDepSymbols.get('*')) === null || _incomingDepSymbols$g === void 0 ? void 0 : _incomingDepSymbols$g.local) === '*';
338
- for (let s of incomingDep.usedSymbolsDown) {
339
- if (assetSymbols == null ||
340
- // Assume everything could be provided if symbols are cleared
341
- assetNode.value.bundleBehavior === _types.BundleBehavior.isolated || assetNode.value.bundleBehavior === _types.BundleBehavior.inline || s === '*' || assetNode.usedSymbols.has(s)) {
342
- usedSymbolsUpAmbiguous(incomingDepUsedSymbolsUpOld, incomingDep.usedSymbolsUp, s, {
343
- asset: assetNode.id,
344
- symbol: s
345
- });
346
- } else if (reexportedSymbols.has(s)) {
347
- let reexport = reexportedSymbols.get(s);
348
- let v =
349
- // Forward a reexport only if the current asset is side-effect free and not external
350
- !assetNode.value.sideEffects && reexport != null ? reexport : {
351
- asset: assetNode.id,
352
- symbol: s
353
- };
354
- usedSymbolsUpAmbiguous(incomingDepUsedSymbolsUpOld, incomingDep.usedSymbolsUp, s, v);
355
- } else if (!hasNamespaceReexport) {
356
- var _incomingDep$value$sy;
357
- let loc = (_incomingDep$value$sy = incomingDep.value.symbols) === null || _incomingDep$value$sy === void 0 || (_incomingDep$value$sy = _incomingDep$value$sy.get(s)) === null || _incomingDep$value$sy === void 0 ? void 0 : _incomingDep$value$sy.loc;
358
- let [resolutionNodeId] = assetGraph.getNodeIdsConnectedFrom(assetGraph.getNodeIdByContentKey(incomingDep.id));
359
- let resolution = (0, _nullthrows().default)(assetGraph.getNode(resolutionNodeId));
360
- (0, _assert().default)(resolution && (resolution.type === 'asset_group' || resolution.type === 'asset'));
361
- errors.push({
362
- message: (0, _diagnostic().md)`${(0, _projectPath.fromProjectPathRelative)(resolution.value.filePath)} does not export '${s}'`,
363
- origin: '@atlaspack/core',
364
- codeFrames: loc ? [{
365
- filePath: (0, _projectPath.fromProjectPath)(options.projectRoot, loc === null || loc === void 0 ? void 0 : loc.filePath) ?? undefined,
366
- language: incomingDep.value.sourceAssetType ?? undefined,
367
- codeHighlights: [(0, _diagnostic().convertSourceLocationToHighlight)(loc)]
368
- }] : undefined
369
- });
370
- }
371
- }
372
- if (!equalMap(incomingDepUsedSymbolsUpOld, incomingDep.usedSymbolsUp)) {
373
- changedDeps.add(incomingDep);
374
- incomingDep.usedSymbolsUpDirtyUp = true;
375
- }
376
- incomingDep.excluded = false;
377
- if (incomingDep.value.symbols != null && incomingDep.usedSymbolsUp.size === 0) {
378
- let assetGroups = assetGraph.getNodeIdsConnectedFrom(assetGraph.getNodeIdByContentKey(incomingDep.id));
379
- if (assetGroups.length === 1) {
380
- let [assetGroupId] = assetGroups;
381
- let assetGroup = (0, _nullthrows().default)(assetGraph.getNode(assetGroupId));
382
- if (assetGroup.type === 'asset_group' && assetGroup.value.sideEffects === false) {
383
- incomingDep.excluded = true;
384
- }
385
- } else {
386
- (0, _assert().default)(assetGroups.length === 0);
387
- }
388
- }
389
- }
390
- return errors;
391
- });
392
-
393
- // Sort usedSymbolsUp so they are a consistent order across builds.
394
- // This ensures a consistent ordering of these symbols when packaging.
395
- // See https://github.com/parcel-bundler/parcel/pull/8212
396
- for (let dep of changedDeps) {
397
- dep.usedSymbolsUp = new Map([...dep.usedSymbolsUp].sort(([a], [b]) => a.localeCompare(b)));
398
- }
399
- return errors;
400
- });
401
- }
402
- function propagateSymbolsDown(assetGraph, changedAssets, assetGroupsWithRemovedParents, visit) {
403
- if (changedAssets.size === 0 && assetGroupsWithRemovedParents.size === 0) {
404
- return;
405
- }
406
-
407
- // We care about changed assets and their changed dependencies. So start with the first changed
408
- // asset or dependency and continue while the symbols change. If the queue becomes empty,
409
- // continue with the next unvisited changed asset.
410
- //
411
- // In the end, nodes, which are neither listed in changedAssets nor in
412
- // assetGroupsWithRemovedParents nor reached via a dirty flag, don't have to be visited at all.
413
- //
414
- // In the worst case, some nodes have to be revisited because we don't want to sort the assets
415
- // into topological order. For example in a diamond graph where the join point is visited twice
416
- // via each parent (the numbers signifiying the order of re/visiting, `...` being unvisited).
417
- // However, this only continues as long as there are changes in the used symbols that influence
418
- // child nodes.
419
- //
420
- // |
421
- // ...
422
- // / \
423
- // 1 4
424
- // \ /
425
- // 2+5
426
- // |
427
- // 3+6
428
- // |
429
- // ...
430
- // |
431
- //
432
-
433
- let unreachedAssets = new Set([...changedAssets, ...assetGroupsWithRemovedParents]);
434
- let queue = new Set([setPop(unreachedAssets)]);
435
- while (queue.size > 0) {
436
- let queuedNodeId = setPop(queue);
437
- unreachedAssets.delete(queuedNodeId);
438
- let outgoing = assetGraph.getNodeIdsConnectedFrom(queuedNodeId);
439
- let node = (0, _nullthrows().default)(assetGraph.getNode(queuedNodeId));
440
- let wasNodeDirty = false;
441
- if (node.type === 'dependency' || node.type === 'asset_group') {
442
- wasNodeDirty = node.usedSymbolsDownDirty;
443
- node.usedSymbolsDownDirty = false;
444
- } else if (node.type === 'asset' && node.usedSymbolsDownDirty) {
445
- visit(node, incomingDependencyNodesFromAsset(assetGraph, node.value), dependencyNodesFromIds(assetGraph, outgoing));
446
- node.usedSymbolsDownDirty = false;
447
- }
448
- for (let child of outgoing) {
449
- let childNode = (0, _nullthrows().default)(assetGraph.getNode(child));
450
- let childDirty = false;
451
- if ((childNode.type === 'asset' || childNode.type === 'asset_group') && wasNodeDirty) {
452
- childNode.usedSymbolsDownDirty = true;
453
- childDirty = true;
454
- } else if (childNode.type === 'dependency') {
455
- childDirty = childNode.usedSymbolsDownDirty;
456
- }
457
- if (childDirty) {
458
- queue.add(child);
459
- }
460
- }
461
- if (queue.size === 0 && unreachedAssets.size > 0) {
462
- queue.add(setPop(unreachedAssets));
463
- }
464
- }
465
- }
466
- function propagateSymbolsUp(assetGraph, changedAssets, changedDepsUsedSymbolsUpDirtyDown, previousErrors, visit) {
467
- // For graphs in general (so with cyclic dependencies), some nodes will have to be revisited. So
468
- // run a regular queue-based BFS for anything that's still dirty.
469
- //
470
- // (Previously, there was first a recursive post-order DFS, with the idea that all children of a
471
- // node should be processed first. With a tree, this would result in a minimal amount of work by
472
- // processing every asset exactly once and then the remaining cycles would have been handled
473
- // with the loop. This was slightly faster for initial builds but had O(project) instead of
474
- // O(changes).)
475
-
476
- let errors = previousErrors ?
477
- // Some nodes might have been removed since the last build
478
- new Map([...previousErrors].filter(([n]) => assetGraph.hasNode(n))) : new Map();
479
- let changedDepsUsedSymbolsUpDirtyDownAssets = new Set([...[...changedDepsUsedSymbolsUpDirtyDown].reverse().flatMap(id => getDependencyResolution(assetGraph, id)), ...changedAssets]);
480
-
481
- // Do a more efficient full traversal (less recomputations) if more than half of the assets
482
- // changed.
483
- let runFullPass =
484
- // If there are n nodes in the graph, then the asset count is approximately
485
- // n/6 (for every asset, there are ~4 dependencies and ~1 asset_group).
486
- assetGraph.nodes.length * (1 / 6) * 0.5 < changedDepsUsedSymbolsUpDirtyDownAssets.size;
487
- let dirtyDeps;
488
- if (runFullPass) {
489
- dirtyDeps = new Set();
490
- let rootNodeId = (0, _nullthrows().default)(assetGraph.rootNodeId, 'A root node is required to traverse');
491
- const nodeVisitor = nodeId => {
492
- let node = (0, _nullthrows().default)(assetGraph.getNode(nodeId));
493
- if (node.type === 'asset') {
494
- let outgoing = outgoingDependencyNodesFromAsset(assetGraph, nodeId);
495
- for (let child of outgoing) {
496
- if (child.usedSymbolsUpDirtyUp) {
497
- node.usedSymbolsUpDirty = true;
498
- child.usedSymbolsUpDirtyUp = false;
499
- }
500
- }
501
- let incoming = incomingDependencyNodesFromAsset(assetGraph, node.value);
502
- for (let dep of incoming) {
503
- if (dep.usedSymbolsUpDirtyDown) {
504
- dep.usedSymbolsUpDirtyDown = false;
505
- node.usedSymbolsUpDirty = true;
506
- }
507
- }
508
- if (node.usedSymbolsUpDirty) {
509
- let e = visit(node, incoming, outgoing);
510
- if (e.length > 0) {
511
- node.usedSymbolsUpDirty = true;
512
- errors.set(nodeId, e);
513
- } else {
514
- node.usedSymbolsUpDirty = false;
515
- errors.delete(nodeId);
516
- }
517
- }
518
- } else {
519
- if (node.type === 'dependency') {
520
- if (node.usedSymbolsUpDirtyUp) {
521
- dirtyDeps.add(nodeId);
522
- } else {
523
- dirtyDeps.delete(nodeId);
524
- }
525
- }
526
- }
527
- };
528
- assetGraph.postOrderDfsFast(nodeVisitor, rootNodeId);
529
- }
530
- let queue = dirtyDeps ?? changedDepsUsedSymbolsUpDirtyDownAssets;
531
- while (queue.size > 0) {
532
- let queuedNodeId = setPop(queue);
533
- let node = (0, _nullthrows().default)(assetGraph.getNode(queuedNodeId));
534
- if (node.type === 'asset') {
535
- let incoming = incomingDependencyNodesFromAsset(assetGraph, node.value);
536
- for (let dep of incoming) {
537
- if (dep.usedSymbolsUpDirtyDown) {
538
- dep.usedSymbolsUpDirtyDown = false;
539
- node.usedSymbolsUpDirty = true;
540
- }
541
- }
542
- let outgoing = outgoingDependencyNodesFromAsset(assetGraph, queuedNodeId);
543
- for (let dep of outgoing) {
544
- if (dep.usedSymbolsUpDirtyUp) {
545
- node.usedSymbolsUpDirty = true;
546
- dep.usedSymbolsUpDirtyUp = false;
547
- }
548
- }
549
- if (node.usedSymbolsUpDirty) {
550
- let e = visit(node, incoming, outgoing);
551
- if (e.length > 0) {
552
- node.usedSymbolsUpDirty = true;
553
- errors.set(queuedNodeId, e);
554
- } else {
555
- node.usedSymbolsUpDirty = false;
556
- errors.delete(queuedNodeId);
557
- }
558
- }
559
- for (let i of incoming) {
560
- if (i.usedSymbolsUpDirtyUp) {
561
- queue.add(assetGraph.getNodeIdByContentKey(i.id));
562
- }
563
- }
564
- } else {
565
- let connectedNodes = assetGraph.getNodeIdsConnectedTo(queuedNodeId);
566
- if (connectedNodes.length > 0) {
567
- queue.add(...connectedNodes);
568
- }
569
- }
570
- }
571
- return errors;
572
- }
573
- function getDependencyResolution(graph, depId) {
574
- let depNodeId = graph.getNodeIdByContentKey(depId);
575
- let connected = graph.getNodeIdsConnectedFrom(depNodeId);
576
- (0, _assert().default)(connected.length <= 1);
577
- let child = connected[0];
578
- if (child) {
579
- let childNode = (0, _nullthrows().default)(graph.getNode(child));
580
- if (childNode.type === 'asset_group') {
581
- return graph.getNodeIdsConnectedFrom(child);
582
- } else {
583
- return [child];
584
- }
585
- }
586
- return [];
587
- }
588
- function equalMap(a, b) {
589
- if (a.size !== b.size) return false;
590
- for (let [k, v] of a) {
591
- if (!b.has(k)) return false;
592
- let vB = b.get(k);
593
- if ((vB === null || vB === void 0 ? void 0 : vB.asset) !== (v === null || v === void 0 ? void 0 : v.asset) || (vB === null || vB === void 0 ? void 0 : vB.symbol) !== (v === null || v === void 0 ? void 0 : v.symbol)) return false;
594
- }
595
- return true;
596
- }
597
- function setPop(set) {
598
- let v = (0, _nullthrows().default)(set.values().next().value);
599
- set.delete(v);
600
- return v;
601
- }
602
- function outgoingDependencyNodesFromAsset(assetGraph, assetNode) {
603
- return dependencyNodesFromIds(assetGraph, assetGraph.getNodeIdsConnectedFrom(assetNode));
604
- }
605
- function dependencyNodesFromIds(assetGraph, dependencyIds) {
606
- return dependencyIds.map(depNodeId => {
607
- let depNode = (0, _nullthrows().default)(assetGraph.getNode(depNodeId));
608
- (0, _assert().default)(depNode.type === 'dependency');
609
- return depNode;
610
- });
611
- }
612
- function incomingDependencyNodesFromAsset(assetGraph, assetNodeValue) {
613
- return assetGraph.getIncomingDependencies(assetNodeValue).map(d => {
614
- let n = assetGraph.getNodeByContentKey(d.id);
615
- (0, _assert().default)(n && n.type === 'dependency');
616
- return n;
617
- });
618
- }