@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.
- package/lib/AssetGraph.js +1 -2
- package/lib/Atlaspack.js +25 -3
- package/lib/AtlaspackConfig.schema.js +10 -36
- package/lib/BundleGraph.js +59 -5
- package/lib/Dependency.js +46 -1
- package/lib/Environment.js +12 -2
- package/lib/PackagerRunner.js +3 -45
- package/lib/RequestTracker.js +112 -30
- package/lib/SymbolPropagation.js +1 -1
- package/lib/Transformation.js +1 -15
- package/lib/UncommittedAsset.js +4 -4
- package/lib/Validation.js +1 -13
- package/lib/applyRuntimes.js +96 -20
- package/lib/assetUtils.js +9 -3
- package/lib/atlaspack-v3/AtlaspackV3.js +6 -8
- package/lib/atlaspack-v3/fs.js +8 -1
- package/lib/atlaspack-v3/worker/compat.js +57 -0
- package/lib/atlaspack-v3/worker/worker.js +156 -1
- package/lib/public/BundleGraph.js +68 -0
- package/lib/requests/AssetGraphRequestRust.js +79 -12
- package/lib/requests/BundleGraphRequest.js +19 -0
- package/lib/requests/WriteBundleRequest.js +15 -15
- package/lib/requests/asset-graph-diff.js +128 -0
- package/lib/resolveOptions.js +15 -8
- package/lib/types.js +2 -1
- package/package.json +19 -17
- package/src/AssetGraph.js +1 -1
- package/src/Atlaspack.js +28 -6
- package/src/AtlaspackConfig.schema.js +13 -36
- package/src/BundleGraph.js +77 -1
- package/src/CommittedAsset.js +1 -1
- package/src/Dependency.js +50 -12
- package/src/Environment.js +13 -15
- package/src/PackagerRunner.js +5 -53
- package/src/RequestTracker.js +144 -38
- package/src/SymbolPropagation.js +5 -2
- package/src/Transformation.js +1 -9
- package/src/UncommittedAsset.js +6 -6
- package/src/Validation.js +1 -7
- package/src/applyRuntimes.js +86 -22
- package/src/assetUtils.js +12 -19
- package/src/atlaspack-v3/AtlaspackV3.js +8 -11
- package/src/atlaspack-v3/fs.js +8 -3
- package/src/atlaspack-v3/jsCallable.js +4 -0
- package/src/atlaspack-v3/worker/compat.js +82 -0
- package/src/atlaspack-v3/worker/worker.js +209 -2
- package/src/public/BundleGraph.js +106 -0
- package/src/requests/AssetGraphRequestRust.js +105 -17
- package/src/requests/BundleGraphRequest.js +18 -0
- package/src/requests/WriteBundleRequest.js +17 -23
- package/src/requests/asset-graph-diff.js +145 -0
- package/src/resolveOptions.js +12 -2
- package/src/types.js +10 -0
- package/test/AssetGraph.test.js +23 -9
- package/test/AtlaspackConfigRequest.test.js +0 -161
- package/test/BundleGraph.test.js +8 -3
- package/test/Dependency.test.js +21 -0
- package/test/Environment.test.js +16 -5
- package/test/InternalAsset.test.js +8 -2
- package/test/PublicAsset.test.js +6 -2
- package/test/PublicBundle.test.js +1 -0
- package/test/PublicMutableBundleGraph.test.js +9 -4
- package/test/RequestTracker.test.js +139 -2
- package/test/SymbolPropagation.test.js +1 -0
- package/test/TargetRequest.test.js +25 -25
- package/test/requests/WriteBundleRequest.test.js +132 -0
- package/lib/atlaspack-v3/plugins/Resolver.js +0 -12
- package/lib/atlaspack-v3/plugins/index.js +0 -16
- package/src/atlaspack-v3/plugins/Resolver.js +0 -9
- 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
|
|
104
|
-
let
|
|
137
|
+
let asset = node.value;
|
|
138
|
+
let id = asset.id;
|
|
139
|
+
asset.meta.id = id;
|
|
105
140
|
asset = {
|
|
106
141
|
...asset,
|
|
107
|
-
|
|
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.
|
|
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
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
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
|
-
|
|
131
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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,
|
|
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;
|