@atlaspack/core 2.27.0 → 2.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -0
- package/dist/Atlaspack.js +5 -1
- package/dist/BundleGraph.js +105 -0
- package/dist/CommittedAsset.js +1 -1
- package/dist/Transformation.js +3 -2
- package/dist/UncommittedAsset.js +3 -3
- package/dist/assetUtils.js +2 -1
- package/dist/atlaspack-v3/worker/compat/mutable-asset.js +1 -1
- package/dist/atlaspack-v3/worker/worker.js +1 -1
- package/dist/public/BundleGraph.js +12 -0
- package/dist/requests/BundleGraphRequest.js +5 -3
- package/dist/resolveOptions.js +1 -0
- package/dist/worker.js +1 -1
- package/lib/Atlaspack.js +5 -1
- package/lib/BundleGraph.js +107 -0
- package/lib/CommittedAsset.js +1 -1
- package/lib/Transformation.js +9 -4
- package/lib/UncommittedAsset.js +3 -3
- package/lib/assetUtils.js +8 -1
- package/lib/atlaspack-v3/worker/compat/mutable-asset.js +1 -1
- package/lib/atlaspack-v3/worker/worker.js +1 -1
- package/lib/public/BundleGraph.js +13 -0
- package/lib/requests/BundleGraphRequest.js +4 -2
- package/lib/resolveOptions.js +1 -0
- package/lib/types/BundleGraph.d.ts +2 -0
- package/lib/types/CommittedAsset.d.ts +1 -1
- package/lib/types/PackagerRunner.d.ts +1 -1
- package/lib/types/UncommittedAsset.d.ts +1 -1
- package/lib/types/atlaspack-v3/worker/compat/mutable-asset.d.ts +1 -1
- package/lib/types/public/Asset.d.ts +1 -1
- package/lib/types/public/BundleGraph.d.ts +2 -0
- package/lib/types/types.d.ts +1 -0
- package/lib/worker.js +1 -1
- package/package.json +14 -14
- package/src/Atlaspack.ts +6 -2
- package/src/BundleGraph.ts +152 -0
- package/src/CommittedAsset.ts +1 -1
- package/src/PackagerRunner.ts +1 -1
- package/src/Transformation.ts +3 -2
- package/src/UncommittedAsset.ts +3 -3
- package/src/assetUtils.ts +2 -1
- package/src/atlaspack-v3/worker/compat/mutable-asset.ts +1 -1
- package/src/atlaspack-v3/worker/worker.ts +1 -1
- package/src/public/Asset.ts +1 -1
- package/src/public/BundleGraph.ts +21 -0
- package/src/requests/BundleGraphRequest.ts +9 -7
- package/src/resolveOptions.ts +1 -0
- package/src/types.ts +1 -0
- package/src/worker.ts +1 -1
- package/tsconfig.json +3 -0
- package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,34 @@
|
|
|
1
1
|
# @atlaspack/core
|
|
2
2
|
|
|
3
|
+
## 2.28.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#858](https://github.com/atlassian-labs/atlaspack/pull/858) [`8eb84ee`](https://github.com/atlassian-labs/atlaspack/commit/8eb84ee61a42bfe87c58079b610802b07a6a13e4) Thanks [@marcins](https://github.com/marcins)! - Introduce a new `getReferencedAssets(bundle)` method to the BundleGraph to pre-compute referenced assets, this is used by the scope hoisting packager behind a new `precomputeReferencedAssets` feature flag.
|
|
8
|
+
|
|
9
|
+
- [#789](https://github.com/atlassian-labs/atlaspack/pull/789) [`73168c2`](https://github.com/atlassian-labs/atlaspack/commit/73168c275a5d9abff9907bcf536b340bca1ed5f0) Thanks [@marcins](https://github.com/marcins)! - Use an in-sourced version of @parcel/source-map, as @atlaspack/source-map
|
|
10
|
+
|
|
11
|
+
- [#892](https://github.com/atlassian-labs/atlaspack/pull/892) [`617a318`](https://github.com/atlassian-labs/atlaspack/commit/617a318ddc9419b38360257353fec50b9051ee13) Thanks [@marcins](https://github.com/marcins)! - Added a new `shouldProfileNative` option that provides a way to pause and connect a native profiler to Atlaspack.
|
|
12
|
+
|
|
13
|
+
### Patch Changes
|
|
14
|
+
|
|
15
|
+
- [#890](https://github.com/atlassian-labs/atlaspack/pull/890) [`7dd5bd8`](https://github.com/atlassian-labs/atlaspack/commit/7dd5bd89ff60c7b324347d772729eb4c3314f01e) Thanks [@matt-koko](https://github.com/matt-koko)! - fix sideEffects not defaulting to true correctly in v3
|
|
16
|
+
|
|
17
|
+
- Updated dependencies [[`7dd5bd8`](https://github.com/atlassian-labs/atlaspack/commit/7dd5bd89ff60c7b324347d772729eb4c3314f01e), [`c8a0e51`](https://github.com/atlassian-labs/atlaspack/commit/c8a0e51b1096d038a64644ad02fe68383f58682a), [`8eb84ee`](https://github.com/atlassian-labs/atlaspack/commit/8eb84ee61a42bfe87c58079b610802b07a6a13e4), [`71900f3`](https://github.com/atlassian-labs/atlaspack/commit/71900f3508d53c3882ca8ea71501ba3069687d4e), [`73168c2`](https://github.com/atlassian-labs/atlaspack/commit/73168c275a5d9abff9907bcf536b340bca1ed5f0), [`617a318`](https://github.com/atlassian-labs/atlaspack/commit/617a318ddc9419b38360257353fec50b9051ee13), [`2c4953e`](https://github.com/atlassian-labs/atlaspack/commit/2c4953e20dc1a6b012792081667aefeb9340505e), [`3fe7d4e`](https://github.com/atlassian-labs/atlaspack/commit/3fe7d4e821bee162fcbbaf9278b107a5eead944f)]:
|
|
18
|
+
- @atlaspack/rust@3.11.0
|
|
19
|
+
- @atlaspack/feature-flags@2.27.0
|
|
20
|
+
- @atlaspack/source-map@3.1.0
|
|
21
|
+
- @atlaspack/utils@3.2.0
|
|
22
|
+
- @atlaspack/profiler@2.15.0
|
|
23
|
+
- @atlaspack/cache@3.2.34
|
|
24
|
+
- @atlaspack/fs@2.15.34
|
|
25
|
+
- @atlaspack/logger@2.14.31
|
|
26
|
+
- @atlaspack/graph@3.6.1
|
|
27
|
+
- @atlaspack/plugin@2.14.39
|
|
28
|
+
- @atlaspack/types@2.15.29
|
|
29
|
+
- @atlaspack/workers@2.14.39
|
|
30
|
+
- @atlaspack/package-manager@2.14.39
|
|
31
|
+
|
|
3
32
|
## 2.27.0
|
|
4
33
|
|
|
5
34
|
### Minor Changes
|
package/dist/Atlaspack.js
CHANGED
|
@@ -76,7 +76,7 @@ const PathRequest_1 = __importDefault(require("./requests/PathRequest"));
|
|
|
76
76
|
const Environment_1 = require("./Environment");
|
|
77
77
|
const Dependency_1 = require("./Dependency");
|
|
78
78
|
const events_2 = require("@atlaspack/events");
|
|
79
|
-
const source_map_1 = require("@
|
|
79
|
+
const source_map_1 = require("@atlaspack/source-map");
|
|
80
80
|
const cache_1 = require("@atlaspack/cache");
|
|
81
81
|
const rust_1 = require("@atlaspack/rust");
|
|
82
82
|
const projectPath_1 = require("./projectPath");
|
|
@@ -356,6 +356,10 @@ class Atlaspack {
|
|
|
356
356
|
if (options.shouldProfile) {
|
|
357
357
|
await this.startProfiling();
|
|
358
358
|
}
|
|
359
|
+
if (options.nativeProfiler) {
|
|
360
|
+
const nativeProfiler = new profiler_1.NativeProfiler();
|
|
361
|
+
await nativeProfiler.startProfiling(options.nativeProfiler);
|
|
362
|
+
}
|
|
359
363
|
if (options.shouldTrace) {
|
|
360
364
|
profiler_1.tracer.enable();
|
|
361
365
|
// We need to ensure the tracer is disabled when Atlaspack is disposed as it is a module level object.
|
package/dist/BundleGraph.js
CHANGED
|
@@ -920,6 +920,111 @@ class BundleGraph {
|
|
|
920
920
|
return isReferenced;
|
|
921
921
|
});
|
|
922
922
|
}
|
|
923
|
+
// New method: Fast checks only (no caching of results)
|
|
924
|
+
isAssetReferencedFastCheck(bundle, asset) {
|
|
925
|
+
// Fast Check #1: If asset is in multiple bundles in same target, it's referenced
|
|
926
|
+
let bundlesWithAsset = this.getBundlesWithAsset(asset).filter((b) => b.target.name === bundle.target.name &&
|
|
927
|
+
b.target.distDir === bundle.target.distDir);
|
|
928
|
+
if (bundlesWithAsset.length > 1) {
|
|
929
|
+
return true;
|
|
930
|
+
}
|
|
931
|
+
// Fast Check #2: If asset is referenced by any async/conditional dependency, it's referenced
|
|
932
|
+
let assetNodeId = (0, nullthrows_1.default)(this._graph.getNodeIdByContentKey(asset.id));
|
|
933
|
+
if (this._graph
|
|
934
|
+
.getNodeIdsConnectedTo(assetNodeId, exports.bundleGraphEdgeTypes.references)
|
|
935
|
+
.map((id) => this._graph.getNode(id))
|
|
936
|
+
.some((node) => node?.type === 'dependency' &&
|
|
937
|
+
(node.value.priority === types_1.Priority.lazy ||
|
|
938
|
+
node.value.priority === types_1.Priority.conditional) &&
|
|
939
|
+
node.value.specifierType !== types_1.SpecifierType.url)) {
|
|
940
|
+
return true;
|
|
941
|
+
}
|
|
942
|
+
// Fast checks failed - return null to indicate expensive computation needed
|
|
943
|
+
return null;
|
|
944
|
+
}
|
|
945
|
+
getReferencedAssets(bundle) {
|
|
946
|
+
let referencedAssets = new Set();
|
|
947
|
+
// Build a map of all assets in this bundle with their dependencies
|
|
948
|
+
// This allows us to check all assets in a single traversal
|
|
949
|
+
let assetDependenciesMap = new Map();
|
|
950
|
+
this.traverseAssets(bundle, (asset) => {
|
|
951
|
+
// Always do fast checks (no caching)
|
|
952
|
+
let fastCheckResult = this.isAssetReferencedFastCheck(bundle, asset);
|
|
953
|
+
if (fastCheckResult === true) {
|
|
954
|
+
referencedAssets.add(asset);
|
|
955
|
+
return;
|
|
956
|
+
}
|
|
957
|
+
// Fast checks failed (fastCheckResult === null), need expensive computation
|
|
958
|
+
// Check if it's actually referenced via traversal
|
|
959
|
+
// Store dependencies for later batch checking
|
|
960
|
+
let dependencies = this._graph
|
|
961
|
+
.getNodeIdsConnectedTo((0, nullthrows_1.default)(this._graph.getNodeIdByContentKey(asset.id)))
|
|
962
|
+
.map((id) => (0, nullthrows_1.default)(this._graph.getNode(id)))
|
|
963
|
+
.filter((node) => node.type === 'dependency')
|
|
964
|
+
.map((node) => {
|
|
965
|
+
(0, assert_2.default)(node.type === 'dependency');
|
|
966
|
+
return node.value;
|
|
967
|
+
});
|
|
968
|
+
if (dependencies.length > 0) {
|
|
969
|
+
assetDependenciesMap.set(asset, dependencies);
|
|
970
|
+
}
|
|
971
|
+
});
|
|
972
|
+
// If no assets need the expensive check, return early
|
|
973
|
+
if (assetDependenciesMap.size === 0) {
|
|
974
|
+
return referencedAssets;
|
|
975
|
+
}
|
|
976
|
+
// Get the assets we need to check once
|
|
977
|
+
let assetsToCheck = Array.from(assetDependenciesMap.keys());
|
|
978
|
+
// Helper function to check if all assets from assetDependenciesMap are in referencedAssets
|
|
979
|
+
const allAssetsReferenced = () => assetsToCheck.length <= referencedAssets.size &&
|
|
980
|
+
assetsToCheck.every((asset) => referencedAssets.has(asset));
|
|
981
|
+
// Do ONE traversal to check all remaining assets
|
|
982
|
+
// We can share visitedBundles across all assets because we check every asset
|
|
983
|
+
// against every visited bundle, which matches the original per-asset behavior
|
|
984
|
+
let siblingBundles = new Set(this.getBundleGroupsContainingBundle(bundle).flatMap((bundleGroup) => this.getBundlesInBundleGroup(bundleGroup, { includeInline: true })));
|
|
985
|
+
let visitedBundles = new Set();
|
|
986
|
+
// Single traversal from all referencers
|
|
987
|
+
for (let referencer of siblingBundles) {
|
|
988
|
+
this.traverseBundles((descendant, _, actions) => {
|
|
989
|
+
if (descendant.id === bundle.id) {
|
|
990
|
+
return;
|
|
991
|
+
}
|
|
992
|
+
if (visitedBundles.has(descendant)) {
|
|
993
|
+
actions.skipChildren();
|
|
994
|
+
return;
|
|
995
|
+
}
|
|
996
|
+
visitedBundles.add(descendant);
|
|
997
|
+
if (descendant.type !== bundle.type ||
|
|
998
|
+
(0, EnvironmentManager_1.fromEnvironmentId)(descendant.env).context !==
|
|
999
|
+
(0, EnvironmentManager_1.fromEnvironmentId)(bundle.env).context) {
|
|
1000
|
+
// Don't skip children - they might be the right type!
|
|
1001
|
+
return;
|
|
1002
|
+
}
|
|
1003
|
+
// Check ALL assets at once in this descendant bundle
|
|
1004
|
+
for (let [asset, dependencies] of assetDependenciesMap) {
|
|
1005
|
+
// Skip if already marked as referenced
|
|
1006
|
+
if (referencedAssets.has(asset)) {
|
|
1007
|
+
continue;
|
|
1008
|
+
}
|
|
1009
|
+
// Check if this descendant bundle references the asset
|
|
1010
|
+
if (!this.bundleHasAsset(descendant, asset) &&
|
|
1011
|
+
dependencies.some((dependency) => this.bundleHasDependency(descendant, dependency))) {
|
|
1012
|
+
referencedAssets.add(asset);
|
|
1013
|
+
}
|
|
1014
|
+
}
|
|
1015
|
+
// If all assets from assetDependenciesMap are now marked as referenced, we can stop early
|
|
1016
|
+
if (allAssetsReferenced()) {
|
|
1017
|
+
actions.stop();
|
|
1018
|
+
return;
|
|
1019
|
+
}
|
|
1020
|
+
}, referencer);
|
|
1021
|
+
// If all assets from assetDependenciesMap are referenced, no need to check more sibling bundles
|
|
1022
|
+
if (allAssetsReferenced()) {
|
|
1023
|
+
break;
|
|
1024
|
+
}
|
|
1025
|
+
}
|
|
1026
|
+
return referencedAssets;
|
|
1027
|
+
}
|
|
923
1028
|
hasParentBundleOfType(bundle, type) {
|
|
924
1029
|
let parents = this.getParentBundles(bundle);
|
|
925
1030
|
return (parents.length > 0 && parents.every((parent) => parent.type === type));
|
package/dist/CommittedAsset.js
CHANGED
|
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
const stream_1 = require("stream");
|
|
7
7
|
const build_cache_1 = require("@atlaspack/build-cache");
|
|
8
8
|
const utils_1 = require("@atlaspack/utils");
|
|
9
|
-
const source_map_1 = __importDefault(require("@
|
|
9
|
+
const source_map_1 = __importDefault(require("@atlaspack/source-map"));
|
|
10
10
|
const assetUtils_1 = require("./assetUtils");
|
|
11
11
|
class CommittedAsset {
|
|
12
12
|
constructor(value, options) {
|
package/dist/Transformation.js
CHANGED
|
@@ -58,6 +58,7 @@ const projectPath_1 = require("./projectPath");
|
|
|
58
58
|
const utils_3 = require("./utils");
|
|
59
59
|
const assert_1 = __importDefault(require("assert"));
|
|
60
60
|
const profiler_1 = require("@atlaspack/profiler");
|
|
61
|
+
const source_map_1 = __importDefault(require("@atlaspack/source-map"));
|
|
61
62
|
const feature_flags_1 = require("@atlaspack/feature-flags");
|
|
62
63
|
class Transformation {
|
|
63
64
|
constructor({ request, options, config, workerApi }) {
|
|
@@ -316,7 +317,7 @@ class Transformation {
|
|
|
316
317
|
if (asset.isASTDirty && asset.generate) {
|
|
317
318
|
let output = await asset.generate();
|
|
318
319
|
asset.content = output.content;
|
|
319
|
-
asset.mapBuffer = output.map
|
|
320
|
+
asset.mapBuffer = source_map_1.default.safeToBuffer(output.map);
|
|
320
321
|
}
|
|
321
322
|
asset.clearAST();
|
|
322
323
|
}));
|
|
@@ -415,7 +416,7 @@ class Transformation {
|
|
|
415
416
|
asset.generate) {
|
|
416
417
|
let output = await asset.generate();
|
|
417
418
|
asset.content = output.content;
|
|
418
|
-
asset.mapBuffer = output.map
|
|
419
|
+
asset.mapBuffer = source_map_1.default.safeToBuffer(output.map);
|
|
419
420
|
}
|
|
420
421
|
// Load config for the transformer.
|
|
421
422
|
let config = preloadedConfig;
|
package/dist/UncommittedAsset.js
CHANGED
|
@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const assert_1 = __importDefault(require("assert"));
|
|
7
7
|
const stream_1 = require("stream");
|
|
8
|
-
const source_map_1 = __importDefault(require("@
|
|
8
|
+
const source_map_1 = __importDefault(require("@atlaspack/source-map"));
|
|
9
9
|
const build_cache_1 = require("@atlaspack/build-cache");
|
|
10
10
|
const utils_1 = require("@atlaspack/utils");
|
|
11
11
|
const rust_1 = require("@atlaspack/rust");
|
|
@@ -163,7 +163,7 @@ class UncommittedAsset {
|
|
|
163
163
|
});
|
|
164
164
|
if (map) {
|
|
165
165
|
this.map = map;
|
|
166
|
-
this.mapBuffer =
|
|
166
|
+
this.mapBuffer = source_map_1.default.safeToBuffer(map);
|
|
167
167
|
this.setCode(code.replace(utils_1.SOURCEMAP_RE, ''));
|
|
168
168
|
}
|
|
169
169
|
return this.map;
|
|
@@ -295,7 +295,7 @@ class UncommittedAsset {
|
|
|
295
295
|
content,
|
|
296
296
|
ast: result.ast,
|
|
297
297
|
isASTDirty: result.ast === this.ast ? this.isASTDirty : true,
|
|
298
|
-
mapBuffer:
|
|
298
|
+
mapBuffer: source_map_1.default.safeToBuffer(result.map),
|
|
299
299
|
code: this.code,
|
|
300
300
|
invalidations: this.invalidations,
|
|
301
301
|
});
|
package/dist/assetUtils.js
CHANGED
|
@@ -23,6 +23,7 @@ const types_1 = require("./types");
|
|
|
23
23
|
const profiler_1 = require("@atlaspack/profiler");
|
|
24
24
|
const IdentifierRegistry_1 = require("./IdentifierRegistry");
|
|
25
25
|
const EnvironmentManager_1 = require("./EnvironmentManager");
|
|
26
|
+
const source_map_1 = __importDefault(require("@atlaspack/source-map"));
|
|
26
27
|
function createAssetIdFromOptions(options) {
|
|
27
28
|
const data = {
|
|
28
29
|
environmentId: (0, EnvironmentManager_1.toEnvironmentId)(options.env),
|
|
@@ -102,7 +103,7 @@ async function _generateFromAST(asset) {
|
|
|
102
103
|
logger: new logger_1.PluginLogger({ origin: pluginName }),
|
|
103
104
|
tracer: new profiler_1.PluginTracer({ origin: pluginName, category: 'asset-generate' }),
|
|
104
105
|
});
|
|
105
|
-
let mapBuffer = map
|
|
106
|
+
let mapBuffer = source_map_1.default.safeToBuffer(map);
|
|
106
107
|
// Store the results in the cache so we can avoid generating again next time
|
|
107
108
|
await Promise.all([
|
|
108
109
|
asset.options.cache.setStream((0, nullthrows_1.default)(asset.value.contentKey), (0, utils_1.blobToStream)(content)),
|
|
@@ -16,7 +16,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
16
16
|
var _MutableAsset_astDirty, _MutableAsset_ast, _MutableAsset_contents, _MutableAsset_inner, _MutableAsset_map, _MutableAsset_projectRoot, _MutableAsset_sourceMap;
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
18
|
exports.MutableAsset = void 0;
|
|
19
|
-
const source_map_1 = __importDefault(require("@
|
|
19
|
+
const source_map_1 = __importDefault(require("@atlaspack/source-map"));
|
|
20
20
|
const stream_1 = require("stream");
|
|
21
21
|
const bitflags_1 = require("./bitflags");
|
|
22
22
|
const asset_symbols_1 = require("./asset-symbols");
|
|
@@ -162,7 +162,7 @@ class AtlaspackWorker {
|
|
|
162
162
|
type: 'resolved',
|
|
163
163
|
filePath: result.filePath || '',
|
|
164
164
|
canDefer: result.canDefer || false,
|
|
165
|
-
sideEffects: result.sideEffects
|
|
165
|
+
sideEffects: result.sideEffects ?? true,
|
|
166
166
|
code: result.code || undefined,
|
|
167
167
|
meta: result.meta || undefined,
|
|
168
168
|
pipeline: result.pipeline || undefined,
|
|
@@ -148,6 +148,18 @@ class BundleGraph {
|
|
|
148
148
|
isAssetReferenced(bundle, asset) {
|
|
149
149
|
return __classPrivateFieldGet(this, _BundleGraph_graph, "f").isAssetReferenced((0, Bundle_1.bundleToInternalBundle)(bundle), (0, Asset_1.assetToAssetValue)(asset));
|
|
150
150
|
}
|
|
151
|
+
isAssetReferencedFastCheck(bundle, asset) {
|
|
152
|
+
return __classPrivateFieldGet(this, _BundleGraph_graph, "f").isAssetReferencedFastCheck((0, Bundle_1.bundleToInternalBundle)(bundle), (0, Asset_1.assetToAssetValue)(asset));
|
|
153
|
+
}
|
|
154
|
+
getReferencedAssets(bundle) {
|
|
155
|
+
let internalReferencedAssets = __classPrivateFieldGet(this, _BundleGraph_graph, "f").getReferencedAssets((0, Bundle_1.bundleToInternalBundle)(bundle));
|
|
156
|
+
// Convert internal assets to public assets
|
|
157
|
+
let publicReferencedAssets = new Set();
|
|
158
|
+
for (let internalAsset of internalReferencedAssets) {
|
|
159
|
+
publicReferencedAssets.add((0, Asset_1.assetFromValue)(internalAsset, __classPrivateFieldGet(this, _BundleGraph_options, "f")));
|
|
160
|
+
}
|
|
161
|
+
return publicReferencedAssets;
|
|
162
|
+
}
|
|
151
163
|
hasParentBundleOfType(bundle, type) {
|
|
152
164
|
return __classPrivateFieldGet(this, _BundleGraph_graph, "f").hasParentBundleOfType((0, Bundle_1.bundleToInternalBundle)(bundle), type);
|
|
153
165
|
}
|
|
@@ -116,9 +116,11 @@ function createBundleGraphRequest(input) {
|
|
|
116
116
|
lazyExcludes: options.lazyExcludes,
|
|
117
117
|
requestedAssetIds,
|
|
118
118
|
});
|
|
119
|
-
let { assetGraph, changedAssets, assetRequests } = await
|
|
120
|
-
|
|
121
|
-
(
|
|
119
|
+
let { assetGraph, changedAssets, assetRequests } = await (0, logger_1.instrumentAsync)('asset-graph-request', () => {
|
|
120
|
+
return api.runRequest(request, {
|
|
121
|
+
force: Boolean(input.rustAtlaspack) ||
|
|
122
|
+
(options.shouldBuildLazily && requestedAssetIds.size > 0),
|
|
123
|
+
});
|
|
122
124
|
});
|
|
123
125
|
if (input.options.featureFlags?.loadableSideEffects) {
|
|
124
126
|
applySideEffectsForLoadableImports(assetGraph);
|
package/dist/resolveOptions.js
CHANGED
|
@@ -190,6 +190,7 @@ async function resolveOptions(initialOptions) {
|
|
|
190
190
|
: false,
|
|
191
191
|
shouldDisableCache: initialOptions.shouldDisableCache ?? false,
|
|
192
192
|
shouldProfile: initialOptions.shouldProfile ?? false,
|
|
193
|
+
nativeProfiler: initialOptions.nativeProfiler,
|
|
193
194
|
shouldTrace: initialOptions.shouldTrace ?? false,
|
|
194
195
|
cacheDir,
|
|
195
196
|
watchDir,
|
package/dist/worker.js
CHANGED
|
@@ -21,7 +21,7 @@ const Validation_1 = __importDefault(require("./Validation"));
|
|
|
21
21
|
const AtlaspackConfig_1 = require("./AtlaspackConfig");
|
|
22
22
|
const registerCoreWithSerializer_1 = require("./registerCoreWithSerializer");
|
|
23
23
|
const build_cache_1 = require("@atlaspack/build-cache");
|
|
24
|
-
const source_map_1 = require("@
|
|
24
|
+
const source_map_1 = require("@atlaspack/source-map");
|
|
25
25
|
// @ts-expect-error TS2305
|
|
26
26
|
const rust_1 = require("@atlaspack/rust");
|
|
27
27
|
const workers_1 = __importDefault(require("@atlaspack/workers"));
|
package/lib/Atlaspack.js
CHANGED
|
@@ -80,7 +80,7 @@ var _PathRequest = _interopRequireDefault(require("./requests/PathRequest"));
|
|
|
80
80
|
var _Environment = require("./Environment");
|
|
81
81
|
var _Dependency = require("./Dependency");
|
|
82
82
|
function _sourceMap() {
|
|
83
|
-
const data = require("@
|
|
83
|
+
const data = require("@atlaspack/source-map");
|
|
84
84
|
_sourceMap = function () {
|
|
85
85
|
return data;
|
|
86
86
|
};
|
|
@@ -410,6 +410,10 @@ class Atlaspack {
|
|
|
410
410
|
if (options.shouldProfile) {
|
|
411
411
|
await this.startProfiling();
|
|
412
412
|
}
|
|
413
|
+
if (options.nativeProfiler) {
|
|
414
|
+
const nativeProfiler = new (_profiler().NativeProfiler)();
|
|
415
|
+
await nativeProfiler.startProfiling(options.nativeProfiler);
|
|
416
|
+
}
|
|
413
417
|
if (options.shouldTrace) {
|
|
414
418
|
_profiler().tracer.enable();
|
|
415
419
|
// We need to ensure the tracer is disabled when Atlaspack is disposed as it is a module level object.
|
package/lib/BundleGraph.js
CHANGED
|
@@ -914,6 +914,113 @@ class BundleGraph {
|
|
|
914
914
|
return isReferenced;
|
|
915
915
|
});
|
|
916
916
|
}
|
|
917
|
+
|
|
918
|
+
// New method: Fast checks only (no caching of results)
|
|
919
|
+
isAssetReferencedFastCheck(bundle, asset) {
|
|
920
|
+
// Fast Check #1: If asset is in multiple bundles in same target, it's referenced
|
|
921
|
+
let bundlesWithAsset = this.getBundlesWithAsset(asset).filter(b => b.target.name === bundle.target.name && b.target.distDir === bundle.target.distDir);
|
|
922
|
+
if (bundlesWithAsset.length > 1) {
|
|
923
|
+
return true;
|
|
924
|
+
}
|
|
925
|
+
|
|
926
|
+
// Fast Check #2: If asset is referenced by any async/conditional dependency, it's referenced
|
|
927
|
+
let assetNodeId = (0, _nullthrows().default)(this._graph.getNodeIdByContentKey(asset.id));
|
|
928
|
+
if (this._graph.getNodeIdsConnectedTo(assetNodeId, bundleGraphEdgeTypes.references).map(id => this._graph.getNode(id)).some(node => (node === null || node === void 0 ? void 0 : node.type) === 'dependency' && (node.value.priority === _types.Priority.lazy || node.value.priority === _types.Priority.conditional) && node.value.specifierType !== _types.SpecifierType.url)) {
|
|
929
|
+
return true;
|
|
930
|
+
}
|
|
931
|
+
|
|
932
|
+
// Fast checks failed - return null to indicate expensive computation needed
|
|
933
|
+
return null;
|
|
934
|
+
}
|
|
935
|
+
getReferencedAssets(bundle) {
|
|
936
|
+
let referencedAssets = new Set();
|
|
937
|
+
|
|
938
|
+
// Build a map of all assets in this bundle with their dependencies
|
|
939
|
+
// This allows us to check all assets in a single traversal
|
|
940
|
+
let assetDependenciesMap = new Map();
|
|
941
|
+
this.traverseAssets(bundle, asset => {
|
|
942
|
+
// Always do fast checks (no caching)
|
|
943
|
+
let fastCheckResult = this.isAssetReferencedFastCheck(bundle, asset);
|
|
944
|
+
if (fastCheckResult === true) {
|
|
945
|
+
referencedAssets.add(asset);
|
|
946
|
+
return;
|
|
947
|
+
}
|
|
948
|
+
|
|
949
|
+
// Fast checks failed (fastCheckResult === null), need expensive computation
|
|
950
|
+
// Check if it's actually referenced via traversal
|
|
951
|
+
|
|
952
|
+
// Store dependencies for later batch checking
|
|
953
|
+
let dependencies = this._graph.getNodeIdsConnectedTo((0, _nullthrows().default)(this._graph.getNodeIdByContentKey(asset.id))).map(id => (0, _nullthrows().default)(this._graph.getNode(id))).filter(node => node.type === 'dependency').map(node => {
|
|
954
|
+
(0, _assert().default)(node.type === 'dependency');
|
|
955
|
+
return node.value;
|
|
956
|
+
});
|
|
957
|
+
if (dependencies.length > 0) {
|
|
958
|
+
assetDependenciesMap.set(asset, dependencies);
|
|
959
|
+
}
|
|
960
|
+
});
|
|
961
|
+
|
|
962
|
+
// If no assets need the expensive check, return early
|
|
963
|
+
if (assetDependenciesMap.size === 0) {
|
|
964
|
+
return referencedAssets;
|
|
965
|
+
}
|
|
966
|
+
|
|
967
|
+
// Get the assets we need to check once
|
|
968
|
+
let assetsToCheck = Array.from(assetDependenciesMap.keys());
|
|
969
|
+
|
|
970
|
+
// Helper function to check if all assets from assetDependenciesMap are in referencedAssets
|
|
971
|
+
const allAssetsReferenced = () => assetsToCheck.length <= referencedAssets.size && assetsToCheck.every(asset => referencedAssets.has(asset));
|
|
972
|
+
|
|
973
|
+
// Do ONE traversal to check all remaining assets
|
|
974
|
+
// We can share visitedBundles across all assets because we check every asset
|
|
975
|
+
// against every visited bundle, which matches the original per-asset behavior
|
|
976
|
+
let siblingBundles = new Set(this.getBundleGroupsContainingBundle(bundle).flatMap(bundleGroup => this.getBundlesInBundleGroup(bundleGroup, {
|
|
977
|
+
includeInline: true
|
|
978
|
+
})));
|
|
979
|
+
let visitedBundles = new Set();
|
|
980
|
+
|
|
981
|
+
// Single traversal from all referencers
|
|
982
|
+
for (let referencer of siblingBundles) {
|
|
983
|
+
this.traverseBundles((descendant, _, actions) => {
|
|
984
|
+
if (descendant.id === bundle.id) {
|
|
985
|
+
return;
|
|
986
|
+
}
|
|
987
|
+
if (visitedBundles.has(descendant)) {
|
|
988
|
+
actions.skipChildren();
|
|
989
|
+
return;
|
|
990
|
+
}
|
|
991
|
+
visitedBundles.add(descendant);
|
|
992
|
+
if (descendant.type !== bundle.type || (0, _EnvironmentManager.fromEnvironmentId)(descendant.env).context !== (0, _EnvironmentManager.fromEnvironmentId)(bundle.env).context) {
|
|
993
|
+
// Don't skip children - they might be the right type!
|
|
994
|
+
return;
|
|
995
|
+
}
|
|
996
|
+
|
|
997
|
+
// Check ALL assets at once in this descendant bundle
|
|
998
|
+
for (let [asset, dependencies] of assetDependenciesMap) {
|
|
999
|
+
// Skip if already marked as referenced
|
|
1000
|
+
if (referencedAssets.has(asset)) {
|
|
1001
|
+
continue;
|
|
1002
|
+
}
|
|
1003
|
+
|
|
1004
|
+
// Check if this descendant bundle references the asset
|
|
1005
|
+
if (!this.bundleHasAsset(descendant, asset) && dependencies.some(dependency => this.bundleHasDependency(descendant, dependency))) {
|
|
1006
|
+
referencedAssets.add(asset);
|
|
1007
|
+
}
|
|
1008
|
+
}
|
|
1009
|
+
|
|
1010
|
+
// If all assets from assetDependenciesMap are now marked as referenced, we can stop early
|
|
1011
|
+
if (allAssetsReferenced()) {
|
|
1012
|
+
actions.stop();
|
|
1013
|
+
return;
|
|
1014
|
+
}
|
|
1015
|
+
}, referencer);
|
|
1016
|
+
|
|
1017
|
+
// If all assets from assetDependenciesMap are referenced, no need to check more sibling bundles
|
|
1018
|
+
if (allAssetsReferenced()) {
|
|
1019
|
+
break;
|
|
1020
|
+
}
|
|
1021
|
+
}
|
|
1022
|
+
return referencedAssets;
|
|
1023
|
+
}
|
|
917
1024
|
hasParentBundleOfType(bundle, type) {
|
|
918
1025
|
let parents = this.getParentBundles(bundle);
|
|
919
1026
|
return parents.length > 0 && parents.every(parent => parent.type === type);
|
package/lib/CommittedAsset.js
CHANGED
|
@@ -26,7 +26,7 @@ function _utils() {
|
|
|
26
26
|
return data;
|
|
27
27
|
}
|
|
28
28
|
function _sourceMap() {
|
|
29
|
-
const data = _interopRequireDefault(require("@
|
|
29
|
+
const data = _interopRequireDefault(require("@atlaspack/source-map"));
|
|
30
30
|
_sourceMap = function () {
|
|
31
31
|
return data;
|
|
32
32
|
};
|
package/lib/Transformation.js
CHANGED
|
@@ -72,6 +72,13 @@ function _profiler() {
|
|
|
72
72
|
};
|
|
73
73
|
return data;
|
|
74
74
|
}
|
|
75
|
+
function _sourceMap() {
|
|
76
|
+
const data = _interopRequireDefault(require("@atlaspack/source-map"));
|
|
77
|
+
_sourceMap = function () {
|
|
78
|
+
return data;
|
|
79
|
+
};
|
|
80
|
+
return data;
|
|
81
|
+
}
|
|
75
82
|
function _featureFlags() {
|
|
76
83
|
const data = require("@atlaspack/feature-flags");
|
|
77
84
|
_featureFlags = function () {
|
|
@@ -343,10 +350,9 @@ class Transformation {
|
|
|
343
350
|
// generate all assets in a large bundle during packaging.
|
|
344
351
|
await Promise.all(resultingAssets.filter(asset => asset.ast != null && !(this.options.mode === 'production' && asset.value.type === 'css' && asset.value.symbols)).map(async asset => {
|
|
345
352
|
if (asset.isASTDirty && asset.generate) {
|
|
346
|
-
var _output$map;
|
|
347
353
|
let output = await asset.generate();
|
|
348
354
|
asset.content = output.content;
|
|
349
|
-
asset.mapBuffer = (
|
|
355
|
+
asset.mapBuffer = _sourceMap().default.safeToBuffer(output.map);
|
|
350
356
|
}
|
|
351
357
|
asset.clearAST();
|
|
352
358
|
}));
|
|
@@ -453,10 +459,9 @@ class Transformation {
|
|
|
453
459
|
logger,
|
|
454
460
|
tracer
|
|
455
461
|
})) && asset.generate) {
|
|
456
|
-
var _output$map2;
|
|
457
462
|
let output = await asset.generate();
|
|
458
463
|
asset.content = output.content;
|
|
459
|
-
asset.mapBuffer = (
|
|
464
|
+
asset.mapBuffer = _sourceMap().default.safeToBuffer(output.map);
|
|
460
465
|
}
|
|
461
466
|
|
|
462
467
|
// Load config for the transformer.
|
package/lib/UncommittedAsset.js
CHANGED
|
@@ -19,7 +19,7 @@ function _stream() {
|
|
|
19
19
|
return data;
|
|
20
20
|
}
|
|
21
21
|
function _sourceMap() {
|
|
22
|
-
const data = _interopRequireDefault(require("@
|
|
22
|
+
const data = _interopRequireDefault(require("@atlaspack/source-map"));
|
|
23
23
|
_sourceMap = function () {
|
|
24
24
|
return data;
|
|
25
25
|
};
|
|
@@ -218,7 +218,7 @@ class UncommittedAsset {
|
|
|
218
218
|
});
|
|
219
219
|
if (map) {
|
|
220
220
|
this.map = map;
|
|
221
|
-
this.mapBuffer =
|
|
221
|
+
this.mapBuffer = _sourceMap().default.safeToBuffer(map);
|
|
222
222
|
this.setCode(code.replace(_utils().SOURCEMAP_RE, ''));
|
|
223
223
|
}
|
|
224
224
|
return this.map;
|
|
@@ -349,7 +349,7 @@ class UncommittedAsset {
|
|
|
349
349
|
content,
|
|
350
350
|
ast: result.ast,
|
|
351
351
|
isASTDirty: result.ast === this.ast ? this.isASTDirty : true,
|
|
352
|
-
mapBuffer:
|
|
352
|
+
mapBuffer: _sourceMap().default.safeToBuffer(result.map),
|
|
353
353
|
code: this.code,
|
|
354
354
|
invalidations: this.invalidations
|
|
355
355
|
});
|
package/lib/assetUtils.js
CHANGED
|
@@ -65,6 +65,13 @@ function _profiler() {
|
|
|
65
65
|
}
|
|
66
66
|
var _IdentifierRegistry = require("./IdentifierRegistry");
|
|
67
67
|
var _EnvironmentManager = require("./EnvironmentManager");
|
|
68
|
+
function _sourceMap() {
|
|
69
|
+
const data = _interopRequireDefault(require("@atlaspack/source-map"));
|
|
70
|
+
_sourceMap = function () {
|
|
71
|
+
return data;
|
|
72
|
+
};
|
|
73
|
+
return data;
|
|
74
|
+
}
|
|
68
75
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
69
76
|
function createAssetIdFromOptions(options) {
|
|
70
77
|
const data = {
|
|
@@ -150,7 +157,7 @@ async function _generateFromAST(asset) {
|
|
|
150
157
|
category: 'asset-generate'
|
|
151
158
|
})
|
|
152
159
|
});
|
|
153
|
-
let mapBuffer =
|
|
160
|
+
let mapBuffer = _sourceMap().default.safeToBuffer(map);
|
|
154
161
|
// Store the results in the cache so we can avoid generating again next time
|
|
155
162
|
await Promise.all([asset.options.cache.setStream((0, _nullthrows().default)(asset.value.contentKey), (0, _utils().blobToStream)(content)), mapBuffer != null && asset.options.cache.setBlob((0, _nullthrows().default)(asset.value.mapKey), mapBuffer)]);
|
|
156
163
|
return {
|
|
@@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.MutableAsset = void 0;
|
|
7
7
|
function _sourceMap() {
|
|
8
|
-
const data = _interopRequireDefault(require("@
|
|
8
|
+
const data = _interopRequireDefault(require("@atlaspack/source-map"));
|
|
9
9
|
_sourceMap = function () {
|
|
10
10
|
return data;
|
|
11
11
|
};
|
|
@@ -183,7 +183,7 @@ class AtlaspackWorker {
|
|
|
183
183
|
type: 'resolved',
|
|
184
184
|
filePath: result.filePath || '',
|
|
185
185
|
canDefer: result.canDefer || false,
|
|
186
|
-
sideEffects: result.sideEffects
|
|
186
|
+
sideEffects: result.sideEffects ?? true,
|
|
187
187
|
code: result.code || undefined,
|
|
188
188
|
meta: result.meta || undefined,
|
|
189
189
|
pipeline: result.pipeline || undefined,
|
|
@@ -114,6 +114,19 @@ class BundleGraph {
|
|
|
114
114
|
isAssetReferenced(bundle, asset) {
|
|
115
115
|
return this.#graph.isAssetReferenced((0, _Bundle.bundleToInternalBundle)(bundle), (0, _Asset.assetToAssetValue)(asset));
|
|
116
116
|
}
|
|
117
|
+
isAssetReferencedFastCheck(bundle, asset) {
|
|
118
|
+
return this.#graph.isAssetReferencedFastCheck((0, _Bundle.bundleToInternalBundle)(bundle), (0, _Asset.assetToAssetValue)(asset));
|
|
119
|
+
}
|
|
120
|
+
getReferencedAssets(bundle) {
|
|
121
|
+
let internalReferencedAssets = this.#graph.getReferencedAssets((0, _Bundle.bundleToInternalBundle)(bundle));
|
|
122
|
+
|
|
123
|
+
// Convert internal assets to public assets
|
|
124
|
+
let publicReferencedAssets = new Set();
|
|
125
|
+
for (let internalAsset of internalReferencedAssets) {
|
|
126
|
+
publicReferencedAssets.add((0, _Asset.assetFromValue)(internalAsset, this.#options));
|
|
127
|
+
}
|
|
128
|
+
return publicReferencedAssets;
|
|
129
|
+
}
|
|
117
130
|
hasParentBundleOfType(bundle, type) {
|
|
118
131
|
return this.#graph.hasParentBundleOfType((0, _Bundle.bundleToInternalBundle)(bundle), type);
|
|
119
132
|
}
|
|
@@ -152,8 +152,10 @@ function createBundleGraphRequest(input) {
|
|
|
152
152
|
assetGraph,
|
|
153
153
|
changedAssets,
|
|
154
154
|
assetRequests
|
|
155
|
-
} = await
|
|
156
|
-
|
|
155
|
+
} = await (0, _logger().instrumentAsync)('asset-graph-request', () => {
|
|
156
|
+
return api.runRequest(request, {
|
|
157
|
+
force: Boolean(input.rustAtlaspack) || options.shouldBuildLazily && requestedAssetIds.size > 0
|
|
158
|
+
});
|
|
157
159
|
});
|
|
158
160
|
if ((_input$options$featur = input.options.featureFlags) !== null && _input$options$featur !== void 0 && _input$options$featur.loadableSideEffects) {
|
|
159
161
|
applySideEffectsForLoadableImports(assetGraph);
|
package/lib/resolveOptions.js
CHANGED
|
@@ -219,6 +219,7 @@ async function resolveOptions(initialOptions) {
|
|
|
219
219
|
} : false,
|
|
220
220
|
shouldDisableCache: initialOptions.shouldDisableCache ?? false,
|
|
221
221
|
shouldProfile: initialOptions.shouldProfile ?? false,
|
|
222
|
+
nativeProfiler: initialOptions.nativeProfiler,
|
|
222
223
|
shouldTrace: initialOptions.shouldTrace ?? false,
|
|
223
224
|
cacheDir,
|
|
224
225
|
watchDir,
|
|
@@ -129,6 +129,8 @@ export default class BundleGraph {
|
|
|
129
129
|
getDependencies(asset: Asset): Array<Dependency>;
|
|
130
130
|
traverseAssets<TContext>(bundle: Bundle, visit: GraphVisitor<Asset, TContext>, startAsset?: Asset): TContext | null | undefined;
|
|
131
131
|
isAssetReferenced(bundle: Bundle, asset: Asset): boolean;
|
|
132
|
+
isAssetReferencedFastCheck(bundle: Bundle, asset: Asset): boolean | null;
|
|
133
|
+
getReferencedAssets(bundle: Bundle): Set<Asset>;
|
|
132
134
|
hasParentBundleOfType(bundle: Bundle, type: string): boolean;
|
|
133
135
|
getParentBundles(bundle: Bundle): Array<Bundle>;
|
|
134
136
|
isAssetReachableFromBundle(asset: Asset, bundle: Bundle): boolean;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Readable } from 'stream';
|
|
2
2
|
import type { AST, Blob } from '@atlaspack/types';
|
|
3
|
-
import SourceMap from '@
|
|
3
|
+
import SourceMap from '@atlaspack/source-map';
|
|
4
4
|
import type { Asset, Dependency, AtlaspackOptions } from './types';
|
|
5
5
|
export default class CommittedAsset {
|
|
6
6
|
key: string | null | undefined;
|