@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.
Files changed (51) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/Atlaspack.js +5 -1
  3. package/dist/BundleGraph.js +105 -0
  4. package/dist/CommittedAsset.js +1 -1
  5. package/dist/Transformation.js +3 -2
  6. package/dist/UncommittedAsset.js +3 -3
  7. package/dist/assetUtils.js +2 -1
  8. package/dist/atlaspack-v3/worker/compat/mutable-asset.js +1 -1
  9. package/dist/atlaspack-v3/worker/worker.js +1 -1
  10. package/dist/public/BundleGraph.js +12 -0
  11. package/dist/requests/BundleGraphRequest.js +5 -3
  12. package/dist/resolveOptions.js +1 -0
  13. package/dist/worker.js +1 -1
  14. package/lib/Atlaspack.js +5 -1
  15. package/lib/BundleGraph.js +107 -0
  16. package/lib/CommittedAsset.js +1 -1
  17. package/lib/Transformation.js +9 -4
  18. package/lib/UncommittedAsset.js +3 -3
  19. package/lib/assetUtils.js +8 -1
  20. package/lib/atlaspack-v3/worker/compat/mutable-asset.js +1 -1
  21. package/lib/atlaspack-v3/worker/worker.js +1 -1
  22. package/lib/public/BundleGraph.js +13 -0
  23. package/lib/requests/BundleGraphRequest.js +4 -2
  24. package/lib/resolveOptions.js +1 -0
  25. package/lib/types/BundleGraph.d.ts +2 -0
  26. package/lib/types/CommittedAsset.d.ts +1 -1
  27. package/lib/types/PackagerRunner.d.ts +1 -1
  28. package/lib/types/UncommittedAsset.d.ts +1 -1
  29. package/lib/types/atlaspack-v3/worker/compat/mutable-asset.d.ts +1 -1
  30. package/lib/types/public/Asset.d.ts +1 -1
  31. package/lib/types/public/BundleGraph.d.ts +2 -0
  32. package/lib/types/types.d.ts +1 -0
  33. package/lib/worker.js +1 -1
  34. package/package.json +14 -14
  35. package/src/Atlaspack.ts +6 -2
  36. package/src/BundleGraph.ts +152 -0
  37. package/src/CommittedAsset.ts +1 -1
  38. package/src/PackagerRunner.ts +1 -1
  39. package/src/Transformation.ts +3 -2
  40. package/src/UncommittedAsset.ts +3 -3
  41. package/src/assetUtils.ts +2 -1
  42. package/src/atlaspack-v3/worker/compat/mutable-asset.ts +1 -1
  43. package/src/atlaspack-v3/worker/worker.ts +1 -1
  44. package/src/public/Asset.ts +1 -1
  45. package/src/public/BundleGraph.ts +21 -0
  46. package/src/requests/BundleGraphRequest.ts +9 -7
  47. package/src/resolveOptions.ts +1 -0
  48. package/src/types.ts +1 -0
  49. package/src/worker.ts +1 -1
  50. package/tsconfig.json +3 -0
  51. 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("@parcel/source-map");
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.
@@ -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));
@@ -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("@parcel/source-map"));
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) {
@@ -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?.toBuffer();
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?.toBuffer();
419
+ asset.mapBuffer = source_map_1.default.safeToBuffer(output.map);
419
420
  }
420
421
  // Load config for the transformer.
421
422
  let config = preloadedConfig;
@@ -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("@parcel/source-map"));
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 = map.toBuffer();
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: result.map ? result.map.toBuffer() : null,
298
+ mapBuffer: source_map_1.default.safeToBuffer(result.map),
299
299
  code: this.code,
300
300
  invalidations: this.invalidations,
301
301
  });
@@ -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?.toBuffer();
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("@parcel/source-map"));
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 || false,
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 api.runRequest(request, {
120
- force: Boolean(input.rustAtlaspack) ||
121
- (options.shouldBuildLazily && requestedAssetIds.size > 0),
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);
@@ -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("@parcel/source-map");
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("@parcel/source-map");
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.
@@ -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);
@@ -26,7 +26,7 @@ function _utils() {
26
26
  return data;
27
27
  }
28
28
  function _sourceMap() {
29
- const data = _interopRequireDefault(require("@parcel/source-map"));
29
+ const data = _interopRequireDefault(require("@atlaspack/source-map"));
30
30
  _sourceMap = function () {
31
31
  return data;
32
32
  };
@@ -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 = (_output$map = output.map) === null || _output$map === void 0 ? void 0 : _output$map.toBuffer();
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 = (_output$map2 = output.map) === null || _output$map2 === void 0 ? void 0 : _output$map2.toBuffer();
464
+ asset.mapBuffer = _sourceMap().default.safeToBuffer(output.map);
460
465
  }
461
466
 
462
467
  // Load config for the transformer.
@@ -19,7 +19,7 @@ function _stream() {
19
19
  return data;
20
20
  }
21
21
  function _sourceMap() {
22
- const data = _interopRequireDefault(require("@parcel/source-map"));
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 = map.toBuffer();
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: result.map ? result.map.toBuffer() : null,
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 = map === null || map === void 0 ? void 0 : map.toBuffer();
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("@parcel/source-map"));
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 || false,
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 api.runRequest(request, {
156
- force: Boolean(input.rustAtlaspack) || options.shouldBuildLazily && requestedAssetIds.size > 0
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);
@@ -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 '@parcel/source-map';
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;