@atlaspack/core 2.12.1-dev.3401 → 2.12.1-dev.3443

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 (70) hide show
  1. package/lib/AssetGraph.js +1 -2
  2. package/lib/Atlaspack.js +25 -3
  3. package/lib/AtlaspackConfig.schema.js +10 -36
  4. package/lib/BundleGraph.js +59 -5
  5. package/lib/Dependency.js +46 -1
  6. package/lib/Environment.js +12 -2
  7. package/lib/PackagerRunner.js +3 -45
  8. package/lib/RequestTracker.js +112 -30
  9. package/lib/SymbolPropagation.js +1 -1
  10. package/lib/Transformation.js +1 -15
  11. package/lib/UncommittedAsset.js +4 -4
  12. package/lib/Validation.js +1 -13
  13. package/lib/applyRuntimes.js +96 -20
  14. package/lib/assetUtils.js +9 -3
  15. package/lib/atlaspack-v3/AtlaspackV3.js +6 -8
  16. package/lib/atlaspack-v3/fs.js +8 -1
  17. package/lib/atlaspack-v3/worker/compat.js +57 -0
  18. package/lib/atlaspack-v3/worker/worker.js +156 -1
  19. package/lib/public/BundleGraph.js +68 -0
  20. package/lib/requests/AssetGraphRequestRust.js +79 -12
  21. package/lib/requests/BundleGraphRequest.js +19 -0
  22. package/lib/requests/WriteBundleRequest.js +15 -15
  23. package/lib/requests/asset-graph-diff.js +128 -0
  24. package/lib/resolveOptions.js +15 -8
  25. package/lib/types.js +2 -1
  26. package/package.json +19 -17
  27. package/src/AssetGraph.js +1 -1
  28. package/src/Atlaspack.js +28 -6
  29. package/src/AtlaspackConfig.schema.js +13 -36
  30. package/src/BundleGraph.js +77 -1
  31. package/src/CommittedAsset.js +1 -1
  32. package/src/Dependency.js +50 -12
  33. package/src/Environment.js +13 -15
  34. package/src/PackagerRunner.js +5 -53
  35. package/src/RequestTracker.js +144 -38
  36. package/src/SymbolPropagation.js +5 -2
  37. package/src/Transformation.js +1 -9
  38. package/src/UncommittedAsset.js +6 -6
  39. package/src/Validation.js +1 -7
  40. package/src/applyRuntimes.js +86 -22
  41. package/src/assetUtils.js +12 -19
  42. package/src/atlaspack-v3/AtlaspackV3.js +8 -11
  43. package/src/atlaspack-v3/fs.js +8 -3
  44. package/src/atlaspack-v3/jsCallable.js +4 -0
  45. package/src/atlaspack-v3/worker/compat.js +82 -0
  46. package/src/atlaspack-v3/worker/worker.js +209 -2
  47. package/src/public/BundleGraph.js +106 -0
  48. package/src/requests/AssetGraphRequestRust.js +105 -17
  49. package/src/requests/BundleGraphRequest.js +18 -0
  50. package/src/requests/WriteBundleRequest.js +17 -23
  51. package/src/requests/asset-graph-diff.js +145 -0
  52. package/src/resolveOptions.js +12 -2
  53. package/src/types.js +10 -0
  54. package/test/AssetGraph.test.js +23 -9
  55. package/test/AtlaspackConfigRequest.test.js +0 -161
  56. package/test/BundleGraph.test.js +8 -3
  57. package/test/Dependency.test.js +21 -0
  58. package/test/Environment.test.js +16 -5
  59. package/test/InternalAsset.test.js +8 -2
  60. package/test/PublicAsset.test.js +6 -2
  61. package/test/PublicBundle.test.js +1 -0
  62. package/test/PublicMutableBundleGraph.test.js +9 -4
  63. package/test/RequestTracker.test.js +139 -2
  64. package/test/SymbolPropagation.test.js +1 -0
  65. package/test/TargetRequest.test.js +25 -25
  66. package/test/requests/WriteBundleRequest.test.js +132 -0
  67. package/lib/atlaspack-v3/plugins/Resolver.js +0 -12
  68. package/lib/atlaspack-v3/plugins/index.js +0 -16
  69. package/src/atlaspack-v3/plugins/Resolver.js +0 -9
  70. package/src/atlaspack-v3/plugins/index.js +0 -3
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.AssetCompat = void 0;
7
+ var _Environment = _interopRequireDefault(require("../../public/Environment"));
8
+ var _types = require("../../types");
9
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
+ class AssetCompat {
11
+ // TODO: Type properly
12
+
13
+ constructor(_inner, options) {
14
+ this._inner = _inner;
15
+ // $FlowFixMe This isn't correct to flow but is enough to satisfy the runtime checks
16
+ this.env = new _Environment.default(_inner.env, options);
17
+ this._dependencies = [];
18
+ }
19
+ get id() {
20
+ return this._inner.id;
21
+ }
22
+ get filePath() {
23
+ return this._inner.filePath;
24
+ }
25
+ get type() {
26
+ return this._inner.type;
27
+ }
28
+ set type(value) {
29
+ this._inner.type = value;
30
+ }
31
+ get bundleBehavior() {
32
+ let bundleBehavior = this._inner.bundleBehavior;
33
+ return bundleBehavior == null ? null : _types.BundleBehaviorNames[bundleBehavior];
34
+ }
35
+ set bundleBehavior(bundleBehavior) {
36
+ this._inner.bundleBehavior = bundleBehavior ? _types.BundleBehavior[bundleBehavior] : null;
37
+ }
38
+ getCode() {
39
+ return Buffer.from(this._inner.code).toString();
40
+ }
41
+ setCode(code) {
42
+ this._inner.code = Array.from(new TextEncoder().encode(code));
43
+ }
44
+ getAST() {
45
+ return this._ast;
46
+ }
47
+ setAST(ast) {
48
+ this._ast = ast;
49
+ }
50
+ addDependency() {
51
+ throw new Error('[V3] Unimplemented: Asset.addDependency not yet implemented');
52
+ }
53
+ addURLDependency() {
54
+ throw new Error('[V3] Unimplemented: Asset.addURLDependency not yet implemented');
55
+ }
56
+ }
57
+ exports.AssetCompat = AssetCompat;
@@ -4,6 +4,13 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.AtlaspackWorker = void 0;
7
+ function _assert() {
8
+ const data = _interopRequireDefault(require("assert"));
9
+ _assert = function () {
10
+ return data;
11
+ };
12
+ return data;
13
+ }
7
14
  function napi() {
8
15
  const data = _interopRequireWildcard(require("@atlaspack/rust"));
9
16
  napi = function () {
@@ -18,13 +25,161 @@ function _worker_threads() {
18
25
  };
19
26
  return data;
20
27
  }
28
+ function _module() {
29
+ const data = _interopRequireWildcard(require("module"));
30
+ _module = function () {
31
+ return data;
32
+ };
33
+ return data;
34
+ }
35
+ var _compat = require("./compat");
36
+ var _jsCallable = require("../jsCallable");
21
37
  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); }
22
38
  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; }
39
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
40
+ const CONFIG = Symbol.for('parcel-plugin-config');
23
41
  class AtlaspackWorker {
24
42
  #resolvers;
43
+ constructor() {
44
+ this.#resolvers = new Map();
45
+ }
46
+ loadPlugin = (0, _jsCallable.jsCallable)(async ({
47
+ kind,
48
+ specifier,
49
+ resolveFrom
50
+ }) => {
51
+ let customRequire = _module().createRequire(resolveFrom);
52
+ let resolvedPath = customRequire.resolve(specifier);
53
+ // $FlowFixMe
54
+ let resolvedModule = await import(resolvedPath);
55
+ let instance = undefined;
56
+ if (resolvedModule.default && resolvedModule.default[CONFIG]) {
57
+ instance = resolvedModule.default[CONFIG];
58
+ } else if (resolvedModule.default && resolvedModule.default.default[CONFIG]) {
59
+ instance = resolvedModule.default.default[CONFIG];
60
+ } else {
61
+ throw new Error(`Plugin could not be resolved\n\t${kind}\n\t${resolveFrom}\n\t${specifier}`);
62
+ }
63
+ switch (kind) {
64
+ case 'resolver':
65
+ this.#resolvers.set(specifier, instance);
66
+ break;
67
+ }
68
+ });
69
+ runResolverResolve = (0, _jsCallable.jsCallable)(async ({
70
+ key,
71
+ dependency,
72
+ specifier
73
+ }) => {
74
+ const resolver = this.#resolvers.get(key);
75
+ if (!resolver) {
76
+ throw new Error(`Resolver not found: ${key}`);
77
+ }
78
+ const result = await resolver.resolve({
79
+ specifier,
80
+ dependency,
81
+ get options() {
82
+ throw new Error('TODO: Resolver.resolve.options');
83
+ },
84
+ get logger() {
85
+ throw new Error('TODO: Resolver.resolve.logger');
86
+ },
87
+ get tracer() {
88
+ throw new Error('TODO: Resolver.resolve.tracer');
89
+ },
90
+ get pipeline() {
91
+ throw new Error('TODO: Resolver.resolve.pipeline');
92
+ },
93
+ get config() {
94
+ throw new Error('TODO: Resolver.resolve.config');
95
+ }
96
+ });
97
+ if (!result) {
98
+ return {
99
+ invalidations: [],
100
+ resolution: {
101
+ type: 'unresolved'
102
+ }
103
+ };
104
+ }
105
+ return {
106
+ invalidations: [],
107
+ resolution: {
108
+ type: 'resolved',
109
+ filePath: result.filePath || '',
110
+ canDefer: result.canDefer || false,
111
+ sideEffects: result.sideEffects || false,
112
+ code: result.code || undefined,
113
+ meta: result.meta || undefined,
114
+ pipeline: result.pipeline || undefined,
115
+ priority: result.priority && PriorityMap[result.priority],
116
+ query: result.query && result.query.toString()
117
+ }
118
+ };
119
+ });
25
120
  ping() {
26
121
  // console.log('Hi');
27
122
  }
123
+ async runTransformer({
124
+ resolveFrom,
125
+ specifier,
126
+ options,
127
+ asset
128
+ }) {
129
+ const customRequire = _module().createRequire(resolveFrom);
130
+ const resolvedPath = customRequire.resolve(specifier);
131
+ // $FlowFixMe
132
+ const transformerModule = await import(resolvedPath);
133
+ const transformer = transformerModule.default.default[CONFIG];
134
+ let assetCompat = new _compat.AssetCompat(asset, options);
135
+ try {
136
+ if (transformer.parse) {
137
+ // $FlowFixMe
138
+ const ast = await transformer.parse({
139
+ asset: assetCompat
140
+ }); // missing "config"
141
+ // $FlowFixMe
142
+ assetCompat.setAST(ast);
143
+ }
144
+
145
+ // $FlowFixMe
146
+ const result = await transformer.transform({
147
+ // $FlowFixMe
148
+ asset: assetCompat,
149
+ options,
150
+ config: null
151
+ });
152
+ if (transformer.generate) {
153
+ // $FlowFixMe
154
+ let output = await transformer.generate({
155
+ // $FlowFixMe
156
+ asset: assetCompat,
157
+ // $FlowFixMe
158
+ ast: assetCompat.getAST()
159
+ });
160
+ // $FlowFixMe
161
+ assetCompat.setCode(output.content);
162
+ }
163
+ (0, _assert().default)(result.length === 1, '[V3] Unimplemented: Multiple asset return from Node transformer');
164
+ (0, _assert().default)(result[0] === assetCompat, '[V3] Unimplemented: New asset returned from Node transformer');
165
+ return {
166
+ asset,
167
+ dependencies: assetCompat._dependencies
168
+ };
169
+ } catch (e) {
170
+ // TODO: Improve error logging from JS plugins. Without this you currently
171
+ // only see the error message, no stack trace.
172
+ // eslint-disable-next-line no-console
173
+ console.error(e);
174
+ throw e;
175
+ }
176
+ }
28
177
  }
29
178
  exports.AtlaspackWorker = AtlaspackWorker;
30
- napi().registerWorker(_worker_threads().workerData.tx_worker, new AtlaspackWorker());
179
+ napi().registerWorker(_worker_threads().workerData.tx_worker, new AtlaspackWorker());
180
+ const PriorityMap = {
181
+ sync: 0,
182
+ parallel: 1,
183
+ lazy: 2,
184
+ conditional: 3
185
+ };
@@ -189,5 +189,73 @@ class BundleGraph {
189
189
  getEntryRoot(target) {
190
190
  return this.#graph.getEntryRoot(this.#options.projectRoot, (0, _Target.targetToInternalTarget)(target));
191
191
  }
192
+
193
+ // Given a set of dependencies, return any conditions where those dependencies are either
194
+ // the true or false dependency for those conditions. This is currently used to work out which
195
+ // conditions belong to a bundle in packaging.
196
+ getConditionsForDependencies(deps) {
197
+ const conditions = new Set();
198
+ const depIds = deps.map(dep => dep.id);
199
+ for (const condition of this.#graph._conditions.values()) {
200
+ if (depIds.includes(condition.ifTrueDependency.id) || depIds.includes(condition.ifFalseDependency.id)) {
201
+ const [trueAsset, falseAsset] = [condition.ifTrueDependency, condition.ifFalseDependency].map(dep => {
202
+ const resolved = (0, _nullthrows().default)(this.#graph.resolveAsyncDependency(dep));
203
+ if (resolved.type === 'asset') {
204
+ return resolved.value;
205
+ } else {
206
+ return this.#graph.getAssetById(resolved.value.entryAssetId);
207
+ }
208
+ });
209
+ conditions.add({
210
+ publicId: condition.publicId,
211
+ key: condition.key,
212
+ ifTrueDependency: (0, _nullthrows().default)(deps.find(dep => dep.id === condition.ifTrueDependency.id), 'ifTrueDependency was null'),
213
+ ifFalseDependency: (0, _nullthrows().default)(deps.find(dep => dep.id === condition.ifFalseDependency.id), 'ifFalseDependency was null'),
214
+ ifTrueAssetId: this.#graph.getAssetPublicId(trueAsset),
215
+ ifFalseAssetId: this.#graph.getAssetPublicId(falseAsset)
216
+ });
217
+ }
218
+ }
219
+ return conditions;
220
+ }
221
+
222
+ // This is used to generate information for building a manifest that can
223
+ // be used by a webserver to understand which conditions are used by which bundles,
224
+ // and which bundles those conditions require depending on what they evaluate to.
225
+ getConditionalBundleMapping() {
226
+ let bundleConditions = new Map();
227
+
228
+ // Convert the internal references in conditions to public API references
229
+ for (const cond of this.#graph._conditions.values()) {
230
+ let assets = Array.from(cond.assets).map(asset => (0, _nullthrows().default)(this.getAssetById(asset.id)));
231
+ let bundles = new Set();
232
+ let ifTrueBundles = [];
233
+ let ifFalseBundles = [];
234
+ for (const asset of assets) {
235
+ const bundlesWithAsset = this.getBundlesWithAsset(asset);
236
+ for (const bundle of bundlesWithAsset) {
237
+ bundles.add(bundle);
238
+ }
239
+ const assetDeps = this.getDependencies(asset);
240
+ const depToBundles = dep => {
241
+ const publicDep = (0, _nullthrows().default)(assetDeps.find(assetDep => dep.id === assetDep.id));
242
+ const resolved = (0, _nullthrows().default)(this.resolveAsyncDependency(publicDep));
243
+ (0, _assert().default)(resolved.type === 'bundle_group');
244
+ return this.getBundlesInBundleGroup(resolved.value);
245
+ };
246
+ ifTrueBundles.push(...depToBundles(cond.ifTrueDependency));
247
+ ifFalseBundles.push(...depToBundles(cond.ifFalseDependency));
248
+ }
249
+ for (let bundle of bundles) {
250
+ const conditions = bundleConditions.get(bundle) ?? new Map();
251
+ conditions.set(cond.key, {
252
+ ifTrueBundles,
253
+ ifFalseBundles
254
+ });
255
+ bundleConditions.set(bundle, conditions);
256
+ }
257
+ }
258
+ return bundleConditions;
259
+ }
192
260
  }
193
261
  exports.default = BundleGraph;
@@ -81,9 +81,43 @@ function getAssetGraph(serializedGraph, options) {
81
81
  _nodeIdToContentKey: new Map()
82
82
  });
83
83
  graph.safeToIncrementallyBundle = false;
84
+ function mapSymbols({
85
+ exported,
86
+ ...symbol
87
+ }) {
88
+ let jsSymbol = {
89
+ local: symbol.local ?? undefined,
90
+ loc: symbol.loc ?? undefined,
91
+ meta: undefined,
92
+ isWeak: symbol.isWeak
93
+ };
94
+ if (symbol.exported) {
95
+ // $FlowFixMe
96
+ jsSymbol.exported = symbol.exported;
97
+ }
98
+ if (symbol.isEsmExport) {
99
+ // $FlowFixMe
100
+ jsSymbol.meta = {
101
+ isEsm: true
102
+ };
103
+ }
104
+ return [exported, jsSymbol];
105
+ }
106
+
107
+ // See crates/atlaspack_core/src/types/environment.rs
84
108
  let cachedAssets = new Map();
85
109
  let changedAssets = new Map();
86
110
  let entry = 0;
111
+ let envs = new Map();
112
+ let getEnvId = env => {
113
+ let envKey = [env.context, env.engines.atlaspack, env.engines.browsers, env.engines.electron, env.engines.node, env.includeNodeModules, env.isLibrary, env.outputFormat, env.shouldScopeHoist, env.shouldOptimize, env.sourceType].join(':');
114
+ let envId = envs.get(envKey);
115
+ if (envId == null) {
116
+ envId = envs.size;
117
+ envs.set(envKey, envId);
118
+ }
119
+ return envId;
120
+ };
87
121
  for (let node of serializedGraph.nodes) {
88
122
  if (node.type === 'root') {
89
123
  let index = graph.addNodeByContentKey('@@root', {
@@ -100,18 +134,34 @@ function getAssetGraph(serializedGraph, options) {
100
134
  value: null
101
135
  });
102
136
  } else if (node.type === 'asset') {
103
- let id = node.value.id;
104
- let asset = node.value.asset;
137
+ let asset = node.value;
138
+ let id = asset.id;
139
+ asset.meta.id = id;
105
140
  asset = {
106
141
  ...asset,
107
- id,
142
+ uniqueKey: asset.uniqueKey ?? undefined,
143
+ pipeline: asset.pipeline ?? undefined,
144
+ range: asset.range ?? undefined,
145
+ resolveFrom: asset.resolveFrom ?? undefined,
146
+ target: asset.target ?? undefined,
147
+ plugin: asset.plugin ?? undefined,
148
+ query: asset.query ?? undefined,
149
+ configPath: asset.configPath ?? undefined,
150
+ configKeyPath: asset.configKeyPath ?? undefined,
151
+ isLargeBlob: asset.isLargeBlob ?? false,
152
+ isSource: asset.isSource ?? false,
153
+ sourcePath: asset.sourcePath ?? undefined,
154
+ env: {
155
+ ...asset.env,
156
+ loc: asset.env.loc ?? undefined,
157
+ id: getEnvId(asset.env),
158
+ sourceType: asset.env.sourceType
159
+ },
160
+ bundleBehavior: asset.bundleBehavior === 255 ? null : asset.bundleBehavior,
108
161
  committed: true,
109
162
  contentKey: id,
110
163
  filePath: (0, _projectPath.toProjectPath)(options.projectRoot, asset.filePath),
111
- symbols: asset.hasSymbols ? new Map(asset.symbols.map(({
112
- exported,
113
- ...symbol
114
- }) => [exported, symbol])) : null
164
+ symbols: asset.symbols != null ? new Map(asset.symbols.map(mapSymbols)) : null
115
165
  };
116
166
  cachedAssets.set(id, asset.code);
117
167
  changedAssets.set(id, asset);
@@ -124,17 +174,34 @@ function getAssetGraph(serializedGraph, options) {
124
174
  value: asset
125
175
  });
126
176
  } else if (node.type === 'dependency') {
177
+ var _dependency$symbols;
127
178
  let id = node.value.id;
128
179
  let dependency = node.value.dependency;
129
180
  dependency = {
130
181
  ...dependency,
131
182
  id,
183
+ env: {
184
+ ...dependency.env,
185
+ id: getEnvId(dependency.env),
186
+ sourceType: dependency.env.sourceType,
187
+ loc: dependency.env.loc ?? undefined
188
+ },
189
+ pipeline: dependency.pipeline ?? undefined,
190
+ range: dependency.range ?? undefined,
191
+ resolveFrom: dependency.resolveFrom ?? undefined,
192
+ target: dependency.target ?? undefined,
193
+ bundleBehavior: dependency.bundleBehavior === 255 ? null : dependency.bundleBehavior,
132
194
  contentKey: id,
133
- sourcePath: dependency.sourcePath ? (0, _projectPath.toProjectPath)(options.projectRoot, dependency.sourcePath) : null,
134
- symbols: dependency.hasSymbols ? new Map(dependency.symbols.map(({
135
- exported,
136
- ...symbol
137
- }) => [exported, symbol])) : null
195
+ loc: dependency.loc ? {
196
+ ...dependency.loc,
197
+ filePath: (0, _projectPath.toProjectPath)(options.projectRoot, dependency.loc.filePath)
198
+ } : undefined,
199
+ sourcePath: dependency.sourcePath ? (0, _projectPath.toProjectPath)(options.projectRoot, dependency.sourcePath) : undefined,
200
+ symbols:
201
+ // Dependency.symbols are always set to an empty map when scope hoisting
202
+ // is enabled. Some tests will fail if this is not the case. We should
203
+ // make this consistant when we re-visit packaging.
204
+ dependency.symbols != null || dependency.env.shouldScopeHoist ? new Map((_dependency$symbols = dependency.symbols) === null || _dependency$symbols === void 0 ? void 0 : _dependency$symbols.map(mapSymbols)) : undefined
138
205
  };
139
206
  let usedSymbolsDown = new Set();
140
207
  let usedSymbolsUp = new Map();
@@ -109,6 +109,25 @@ function createBundleGraphRequest(input) {
109
109
  } = await api.runRequest(request, {
110
110
  force: options.shouldBuildLazily && requestedAssetIds.size > 0
111
111
  });
112
+
113
+ // if (input.rustAtlaspack && process.env.NATIVE_COMPARE === 'true') {
114
+ // let {assetGraph: jsAssetGraph} = await api.runRequest(
115
+ // createAssetGraphRequestJS({
116
+ // name: 'Main',
117
+ // entries: options.entries,
118
+ // optionsRef,
119
+ // shouldBuildLazily: options.shouldBuildLazily,
120
+ // lazyIncludes: options.lazyIncludes,
121
+ // lazyExcludes: options.lazyExcludes,
122
+ // requestedAssetIds,
123
+ // }),
124
+ // {
125
+ // force: true,
126
+ // },
127
+ // );
128
+ // require('./asset-graph-diff.js')(jsAssetGraph, assetGraph);
129
+ // }
130
+
112
131
  measurement && measurement.end();
113
132
  (0, _utils2.assertSignalNotAborted)(signal);
114
133
 
@@ -4,6 +4,14 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = createWriteBundleRequest;
7
+ exports.replaceStream = replaceStream;
8
+ function _rust() {
9
+ const data = require("@atlaspack/rust");
10
+ _rust = function () {
11
+ return data;
12
+ };
13
+ return data;
14
+ }
7
15
  var _constants = require("../constants");
8
16
  function _nullthrows() {
9
17
  const data = _interopRequireDefault(require("nullthrows"));
@@ -127,16 +135,8 @@ async function run({
127
135
  let writeOptions = publicBundle.env.isBrowser() || !mainEntry ? undefined : {
128
136
  mode: (await inputFS.stat(mainEntry.filePath)).mode
129
137
  };
130
- let contentStream;
131
- if (info.isLargeBlob) {
132
- contentStream = options.cache.getStream(cacheKeys.content);
133
- } else {
134
- contentStream = (0, _utils().blobToStream)(await options.cache.getBlob(cacheKeys.content));
135
- }
136
- let size = 0;
137
- contentStream = contentStream.pipe(new (_utils().TapStream)(buf => {
138
- size += buf.length;
139
- }));
138
+ const contents = await options.cache.getBlob(cacheKeys.content);
139
+ const size = contents.byteLength;
140
140
  let configResult = (0, _nullthrows().default)(await api.runRequest((0, _AtlaspackConfigRequest.default)()));
141
141
  let config = (0, _AtlaspackConfigRequest.getCachedAtlaspackConfig)(configResult, options);
142
142
  let {
@@ -144,9 +144,9 @@ async function run({
144
144
  invalidDevDeps
145
145
  } = await (0, _DevDepRequest.getDevDepRequests)(api);
146
146
  (0, _DevDepRequest.invalidateDevDeps)(invalidDevDeps, options, config);
147
- await writeFiles(contentStream, info, hashRefToNameHash, options, config, outputFS, filePath, writeOptions, devDeps, api);
147
+ await writeFiles(contents, info, hashRefToNameHash, options, config, outputFS, filePath, writeOptions, devDeps, api);
148
148
  if (mapKey && bundle.env.sourceMap && !bundle.env.sourceMap.inline && (await options.cache.has(mapKey))) {
149
- await writeFiles((0, _utils().blobToStream)(await options.cache.getBlob(mapKey)), info, hashRefToNameHash, options, config, outputFS, (0, _projectPath.toProjectPathUnsafe)((0, _projectPath.fromProjectPathRelative)(filePath) + '.map'), writeOptions, devDeps, api);
149
+ await writeFiles(await options.cache.getBlob(mapKey), info, hashRefToNameHash, options, config, outputFS, (0, _projectPath.toProjectPathUnsafe)((0, _projectPath.fromProjectPathRelative)(filePath) + '.map'), writeOptions, devDeps, api);
150
150
  }
151
151
  let res = {
152
152
  filePath,
@@ -159,13 +159,13 @@ async function run({
159
159
  api.storeResult(res);
160
160
  return res;
161
161
  }
162
- async function writeFiles(inputStream, info, hashRefToNameHash, options, config, outputFS, filePath, writeOptions, devDeps, api) {
162
+ async function writeFiles(contents, info, hashRefToNameHash, options, config, outputFS, filePath, writeOptions, devDeps, api) {
163
163
  let compressors = await config.getCompressors((0, _projectPath.fromProjectPathRelative)(filePath));
164
164
  let fullPath = (0, _projectPath.fromProjectPath)(options.projectRoot, filePath);
165
- let stream = info.hashReferences.length ? inputStream.pipe(replaceStream(hashRefToNameHash)) : inputStream;
165
+ const stream = info.hashReferences.length ? (0, _rust().replaceHashReferences)(contents, Object.fromEntries(hashRefToNameHash.entries())) : contents;
166
166
  let promises = [];
167
167
  for (let compressor of compressors) {
168
- promises.push(runCompressor(compressor, cloneStream(stream), options, outputFS, fullPath, writeOptions, devDeps, api));
168
+ promises.push(runCompressor(compressor, (0, _utils().blobToStream)(stream), options, outputFS, fullPath, writeOptions, devDeps, api));
169
169
  }
170
170
  await Promise.all(promises);
171
171
  }
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+
3
+ function _default() {
4
+ const data = _interopRequireDefault(require("rfdc/default"));
5
+ _default = function () {
6
+ return data;
7
+ };
8
+ return data;
9
+ }
10
+ function _jestDiff() {
11
+ const data = require("jest-diff");
12
+ _jestDiff = function () {
13
+ return data;
14
+ };
15
+ return data;
16
+ }
17
+ var _AssetGraph = _interopRequireDefault(require("../AssetGraph"));
18
+ var _projectPath = require("../projectPath");
19
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
20
+ /* eslint-disable no-console */ // $FlowFixMe
21
+ // $FlowFixMe
22
+ function filterNode(node) {
23
+ let clone = (0, _default().default)(node);
24
+
25
+ // Clean up anything you don't want to see in the diff
26
+ // delete clone.id;
27
+ delete clone.value.id;
28
+ delete clone.value.meta.id;
29
+ delete clone.value.sourceAssetId;
30
+ delete clone.value.env.id;
31
+ delete clone.value.isEsm;
32
+ delete clone.value.shouldWrap;
33
+ delete clone.value.contentKey;
34
+ delete clone.value.placeholder;
35
+ delete clone.value.code;
36
+ delete clone.value.hasCjsExports;
37
+ delete clone.value.staticExports;
38
+ delete clone.value.isConstantModule;
39
+ delete clone.value.hasNodeReplacements;
40
+ delete clone.value.stats;
41
+ delete clone.value.astKey;
42
+ delete clone.value.astGenerator;
43
+ delete clone.value.dependencies;
44
+ return clone;
45
+ }
46
+ function compactDeep(obj, ignoredPatterns = [], currentPath = '$') {
47
+ if (obj instanceof Map) {
48
+ const copy = {};
49
+ Array.from(obj.entries()).forEach(([k, v]) => {
50
+ if (v != null) {
51
+ copy[k] = compactDeep(v, ignoredPatterns, `${currentPath}.${k}`);
52
+ }
53
+ });
54
+ return copy;
55
+ } else if (Array.isArray(obj)) {
56
+ return obj.map(v => compactDeep(v, ignoredPatterns, `${currentPath}[]`));
57
+ } else if (typeof obj === 'object') {
58
+ const copy = {};
59
+ Object.entries(obj ?? {}).forEach(([key, value]) => {
60
+ const path = `${currentPath}.${key}`;
61
+ if (ignoredPatterns.some(pattern => path.includes(pattern))) {
62
+ return;
63
+ }
64
+ // Equivalent false == null
65
+ if (key === 'isWeak' && value === false) {
66
+ return;
67
+ }
68
+ if (value != null) {
69
+ copy[key] = compactDeep(value, ignoredPatterns, path);
70
+ }
71
+ });
72
+ return copy;
73
+ } else if (obj != null) {
74
+ return obj;
75
+ }
76
+ }
77
+ function assetGraphDiff(jsAssetGraph, rustAssetGraph) {
78
+ const getNodes = graph => {
79
+ let nodes = {};
80
+ graph.traverse(nodeId => {
81
+ let node = graph.getNode(nodeId) ?? null;
82
+ if (!node) return;
83
+ if (node.type === 'dependency') {
84
+ let sourcePath = node.value.sourcePath ?? (0, _projectPath.toProjectPath)('', 'entry');
85
+ nodes[`dep:${(0, _projectPath.fromProjectPathRelative)(sourcePath)}:${node.value.specifier}`] = filterNode(node);
86
+ } else if (node.type === 'asset') {
87
+ nodes[`asset:${(0, _projectPath.fromProjectPathRelative)(node.value.filePath)}`] = filterNode(node);
88
+ }
89
+ });
90
+ return nodes;
91
+ };
92
+ const jsNodes = getNodes(jsAssetGraph);
93
+ const rustNodes = getNodes(rustAssetGraph);
94
+ const all = new Set([...Object.keys(jsNodes), ...Object.keys(rustNodes)]);
95
+ const missing = [];
96
+ const extra = [];
97
+ for (const key of all.keys()) {
98
+ if (process.env.NATIVE_COMPARE !== 'true') {
99
+ continue;
100
+ }
101
+ let jsNode = jsNodes[key];
102
+ let rustNode = rustNodes[key];
103
+ if (!rustNode) {
104
+ missing.push(key);
105
+ continue;
106
+ }
107
+ if (!jsNode) {
108
+ extra.push(key);
109
+ continue;
110
+ }
111
+ console.log(key);
112
+ const ignoredPatterns = [
113
+ // ignored because we don't copy the environment ID back from rust
114
+ // in the target value
115
+ '$.value.target.env.id',
116
+ // ignore asset.mapKey because we don't do persistence on rust yet
117
+ '$.value.mapKey',
118
+ // ignore this because it's just the output hash. We don't need to compute
119
+ // this yet
120
+ '$.value.outputHash',
121
+ // ignore correspondingRequest from all nodes
122
+ '$.correspondingRequest'];
123
+ console.log((0, _jestDiff().diff)(compactDeep(rustNode, ignoredPatterns), compactDeep(jsNode, ignoredPatterns)));
124
+ }
125
+ console.log('Missing', missing);
126
+ console.log('Extra', extra);
127
+ }
128
+ module.exports = assetGraphDiff;