@atlaspack/core 2.26.1-dev-yarn-8750a7d2e.0 → 2.26.1

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 CHANGED
@@ -1,5 +1,36 @@
1
1
  # @atlaspack/core
2
2
 
3
+ ## 2.26.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [#847](https://github.com/atlassian-labs/atlaspack/pull/847) [`9cd9521`](https://github.com/atlassian-labs/atlaspack/commit/9cd9521978f783046e2ae4ce78f2de7aeb07d073) Thanks [@marcins](https://github.com/marcins)! - Ensure feature flags are set in V3 workers
8
+
9
+ - [#844](https://github.com/atlassian-labs/atlaspack/pull/844) [`d0c7bea`](https://github.com/atlassian-labs/atlaspack/commit/d0c7bea04458255b4c5d4299600e734b5f919fe1) Thanks [@vykimnguyen](https://github.com/vykimnguyen)! - deduplicate reporters from config
10
+
11
+ - [#851](https://github.com/atlassian-labs/atlaspack/pull/851) [`1086c6a`](https://github.com/atlassian-labs/atlaspack/commit/1086c6a2c59271b63b3fb78e6acdb9d3a0dbf354) Thanks [@benjervis](https://github.com/benjervis)! - Remove asset groups from V3.
12
+
13
+ Asset groups were initially created to address the problem of a single asset being transformed into multiple assets (e.g. css modules).
14
+
15
+ This did the job, but means that an asset group is created for every single asset, and most groups only have a single asset inside.
16
+ This is a lot of unnecessary nodes, and we don't need to carry that over to the native rewrite.
17
+
18
+ This PR deletes the step that used to create them, and updates things like symbol prop to handle there potentially being no asset groups.
19
+
20
+ - Updated dependencies [[`02f6aa1`](https://github.com/atlassian-labs/atlaspack/commit/02f6aa1906953fc184d2b49c905c2ef815cb878d), [`58527ee`](https://github.com/atlassian-labs/atlaspack/commit/58527eec15c1aebaaadbeb63586f3082c16beae3), [`525898e`](https://github.com/atlassian-labs/atlaspack/commit/525898e33cc229a4bc938ae853732be36d20c01a), [`cfb39a0`](https://github.com/atlassian-labs/atlaspack/commit/cfb39a0d729eb620cf2ca1611750a2bf7a080d08), [`d0c7bea`](https://github.com/atlassian-labs/atlaspack/commit/d0c7bea04458255b4c5d4299600e734b5f919fe1), [`1086c6a`](https://github.com/atlassian-labs/atlaspack/commit/1086c6a2c59271b63b3fb78e6acdb9d3a0dbf354), [`9cd9521`](https://github.com/atlassian-labs/atlaspack/commit/9cd9521978f783046e2ae4ce78f2de7aeb07d073), [`5776be2`](https://github.com/atlassian-labs/atlaspack/commit/5776be21f70a3f2b9471ba33da3ba1a883f21f1a)]:
21
+ - @atlaspack/rust@3.9.0
22
+ - @atlaspack/feature-flags@2.26.0
23
+ - @atlaspack/utils@3.1.0
24
+ - @atlaspack/cache@3.2.31
25
+ - @atlaspack/fs@2.15.31
26
+ - @atlaspack/logger@2.14.28
27
+ - @atlaspack/graph@3.5.25
28
+ - @atlaspack/package-manager@2.14.36
29
+ - @atlaspack/workers@2.14.36
30
+ - @atlaspack/plugin@2.14.36
31
+ - @atlaspack/profiler@2.14.33
32
+ - @atlaspack/types@2.15.26
33
+
3
34
  ## 2.26.0
4
35
 
5
36
  ### Minor Changes
@@ -345,17 +345,16 @@ function propagateSymbols({ options, assetGraph, changedAssetsPropagation, asset
345
345
  incomingDep.excluded = false;
346
346
  if (incomingDep.value.symbols != null &&
347
347
  incomingDep.usedSymbolsUp.size === 0) {
348
- let assetGroups = assetGraph.getNodeIdsConnectedFrom(assetGraph.getNodeIdByContentKey(incomingDep.id));
349
- if (assetGroups.length === 1) {
350
- let [assetGroupId] = assetGroups;
351
- let assetGroup = (0, nullthrows_1.default)(assetGraph.getNode(assetGroupId));
352
- if (assetGroup.type === 'asset_group' &&
353
- assetGroup.value.sideEffects === false) {
354
- incomingDep.excluded = true;
355
- }
356
- }
357
- else {
358
- (0, assert_1.default)(assetGroups.length === 0);
348
+ let connectedNodeIds = assetGraph.getNodeIdsConnectedFrom(assetGraph.getNodeIdByContentKey(incomingDep.id));
349
+ let sideEffectFree = connectedNodeIds.every((nodeId) => {
350
+ let connectedNode = (0, nullthrows_1.default)(assetGraph.getNode(nodeId));
351
+ // Dependencies should only connect to asset_groups or assets
352
+ (0, assert_1.default)(connectedNode.type === 'asset' ||
353
+ connectedNode.type === 'asset_group');
354
+ return connectedNode.value.sideEffects === false;
355
+ });
356
+ if (sideEffectFree) {
357
+ incomingDep.excluded = true;
359
358
  }
360
359
  }
361
360
  }
@@ -566,18 +565,22 @@ function propagateSymbolsUp(assetGraph, changedAssets, changedDepsUsedSymbolsUpD
566
565
  function getDependencyResolution(graph, depId) {
567
566
  let depNodeId = graph.getNodeIdByContentKey(depId);
568
567
  let connected = graph.getNodeIdsConnectedFrom(depNodeId);
569
- (0, assert_1.default)(connected.length <= 1);
570
- let child = connected[0];
571
- if (child) {
568
+ let resolvedNodeIds = [];
569
+ // If any of the resolved nodes is an asset_group, we need to resolve its
570
+ // assets here.
571
+ for (let child of connected) {
572
+ if (!child) {
573
+ continue;
574
+ }
572
575
  let childNode = (0, nullthrows_1.default)(graph.getNode(child));
573
576
  if (childNode.type === 'asset_group') {
574
- return graph.getNodeIdsConnectedFrom(child);
577
+ resolvedNodeIds.push(...graph.getNodeIdsConnectedFrom(child));
575
578
  }
576
579
  else {
577
- return [child];
580
+ resolvedNodeIds.push(child);
578
581
  }
579
582
  }
580
- return [];
583
+ return resolvedNodeIds;
581
584
  }
582
585
  function equalMap(a, b) {
583
586
  if (a.size !== b.size)
@@ -63,7 +63,7 @@ class AtlaspackWorker {
63
63
  _AtlaspackWorker_resolvers.set(this, void 0);
64
64
  _AtlaspackWorker_transformers.set(this, void 0);
65
65
  _AtlaspackWorker_fs.set(this, void 0);
66
- this.loadPlugin = (0, jsCallable_1.jsCallable)(async ({ kind, specifier, resolveFrom }) => {
66
+ this.loadPlugin = (0, jsCallable_1.jsCallable)(async ({ kind, specifier, resolveFrom, featureFlags }) => {
67
67
  let customRequire = module.createRequire(resolveFrom);
68
68
  let resolvedPath = customRequire.resolve(specifier);
69
69
  let resolvedModule = await import(resolvedPath);
@@ -79,6 +79,11 @@ class AtlaspackWorker {
79
79
  else {
80
80
  throw new Error(`Plugin could not be resolved\n\t${kind}\n\t${resolveFrom}\n\t${specifier}`);
81
81
  }
82
+ // Set feature flags in the worker process
83
+ if (featureFlags) {
84
+ const { setFeatureFlags } = await import('@atlaspack/feature-flags');
85
+ setFeatureFlags(featureFlags);
86
+ }
82
87
  switch (kind) {
83
88
  case 'resolver':
84
89
  __classPrivateFieldGet(this, _AtlaspackWorker_resolvers, "f").set(specifier, { resolver: instance });
@@ -5,7 +5,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.default = loadEnv;
7
7
  const utils_1 = require("@atlaspack/utils");
8
- // @ts-expect-error TS7016
9
8
  const dotenv_1 = __importDefault(require("dotenv"));
10
9
  const dotenv_expand_1 = __importDefault(require("dotenv-expand"));
11
10
  async function loadEnv(env, fs, filePath, projectRoot) {
@@ -1,37 +1,4 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
36
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
4
  };
@@ -42,7 +9,7 @@ const assert_1 = __importDefault(require("assert"));
42
9
  const diagnostic_1 = __importDefault(require("@atlaspack/diagnostic"));
43
10
  const logger_1 = require("@atlaspack/logger");
44
11
  const feature_flags_1 = require("@atlaspack/feature-flags");
45
- const AssetGraph_1 = __importStar(require("../AssetGraph"));
12
+ const AssetGraph_1 = __importDefault(require("../AssetGraph"));
46
13
  const RequestTracker_1 = require("../RequestTracker");
47
14
  const SymbolPropagation_1 = require("../SymbolPropagation");
48
15
  const EnvironmentManager_1 = require("../EnvironmentManager");
@@ -219,24 +186,11 @@ function getAssetGraph(serializedGraph) {
219
186
  let toNode = graph.getNode(to);
220
187
  if (fromNode?.type === 'dependency') {
221
188
  (0, assert_1.default)(toNode?.type === 'asset');
222
- // For backwards compatibility, create asset group node if needed.
223
- let assetGroupNode = (0, AssetGraph_1.nodeFromAssetGroup)({
224
- filePath: toNode.value.filePath,
225
- env: fromNode.value.env,
226
- pipeline: toNode.value.pipeline,
227
- sideEffects: Boolean(toNode.value.sideEffects),
228
- });
229
- let index = graph.addNodeByContentKeyIfNeeded(assetGroupNode.id, assetGroupNode);
230
- graph.addEdge(from, index);
231
- graph.addEdge(index, to);
232
189
  }
233
- else if (fromNode?.type === 'asset' && toNode?.type === 'dependency') {
190
+ if (fromNode?.type === 'asset' && toNode?.type === 'dependency') {
234
191
  fromNode.value.dependencies.set(toNode.value.id, toNode.value);
235
- graph.addEdge(from, to);
236
- }
237
- else {
238
- graph.addEdge(from, to);
239
192
  }
193
+ graph.addEdge(from, to);
240
194
  }
241
195
  return {
242
196
  assetGraph: graph,
@@ -383,15 +383,15 @@ function propagateSymbols({
383
383
  }
384
384
  incomingDep.excluded = false;
385
385
  if (incomingDep.value.symbols != null && incomingDep.usedSymbolsUp.size === 0) {
386
- let assetGroups = assetGraph.getNodeIdsConnectedFrom(assetGraph.getNodeIdByContentKey(incomingDep.id));
387
- if (assetGroups.length === 1) {
388
- let [assetGroupId] = assetGroups;
389
- let assetGroup = (0, _nullthrows().default)(assetGraph.getNode(assetGroupId));
390
- if (assetGroup.type === 'asset_group' && assetGroup.value.sideEffects === false) {
391
- incomingDep.excluded = true;
392
- }
393
- } else {
394
- (0, _assert().default)(assetGroups.length === 0);
386
+ let connectedNodeIds = assetGraph.getNodeIdsConnectedFrom(assetGraph.getNodeIdByContentKey(incomingDep.id));
387
+ let sideEffectFree = connectedNodeIds.every(nodeId => {
388
+ let connectedNode = (0, _nullthrows().default)(assetGraph.getNode(nodeId));
389
+ // Dependencies should only connect to asset_groups or assets
390
+ (0, _assert().default)(connectedNode.type === 'asset' || connectedNode.type === 'asset_group');
391
+ return connectedNode.value.sideEffects === false;
392
+ });
393
+ if (sideEffectFree) {
394
+ incomingDep.excluded = true;
395
395
  }
396
396
  }
397
397
  }
@@ -590,17 +590,22 @@ function propagateSymbolsUp(assetGraph, changedAssets, changedDepsUsedSymbolsUpD
590
590
  function getDependencyResolution(graph, depId) {
591
591
  let depNodeId = graph.getNodeIdByContentKey(depId);
592
592
  let connected = graph.getNodeIdsConnectedFrom(depNodeId);
593
- (0, _assert().default)(connected.length <= 1);
594
- let child = connected[0];
595
- if (child) {
593
+ let resolvedNodeIds = [];
594
+
595
+ // If any of the resolved nodes is an asset_group, we need to resolve its
596
+ // assets here.
597
+ for (let child of connected) {
598
+ if (!child) {
599
+ continue;
600
+ }
596
601
  let childNode = (0, _nullthrows().default)(graph.getNode(child));
597
602
  if (childNode.type === 'asset_group') {
598
- return graph.getNodeIdsConnectedFrom(child);
603
+ resolvedNodeIds.push(...graph.getNodeIdsConnectedFrom(child));
599
604
  } else {
600
- return [child];
605
+ resolvedNodeIds.push(child);
601
606
  }
602
607
  }
603
- return [];
608
+ return resolvedNodeIds;
604
609
  }
605
610
  function equalMap(a, b) {
606
611
  if (a.size !== b.size) return false;
@@ -66,7 +66,8 @@ class AtlaspackWorker {
66
66
  loadPlugin = (0, _jsCallable.jsCallable)(async ({
67
67
  kind,
68
68
  specifier,
69
- resolveFrom
69
+ resolveFrom,
70
+ featureFlags
70
71
  }) => {
71
72
  let customRequire = _module().createRequire(resolveFrom);
72
73
  let resolvedPath = customRequire.resolve(specifier);
@@ -79,6 +80,13 @@ class AtlaspackWorker {
79
80
  } else {
80
81
  throw new Error(`Plugin could not be resolved\n\t${kind}\n\t${resolveFrom}\n\t${specifier}`);
81
82
  }
83
+ // Set feature flags in the worker process
84
+ if (featureFlags) {
85
+ const {
86
+ setFeatureFlags
87
+ } = await import('@atlaspack/feature-flags');
88
+ setFeatureFlags(featureFlags);
89
+ }
82
90
  switch (kind) {
83
91
  case 'resolver':
84
92
  this.#resolvers.set(specifier, {
package/lib/loadDotEnv.js CHANGED
@@ -26,8 +26,6 @@ function _dotenvExpand() {
26
26
  return data;
27
27
  }
28
28
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
29
- // @ts-expect-error TS7016
30
-
31
29
  async function loadEnv(env, fs, filePath, projectRoot) {
32
30
  const NODE_ENV = env.NODE_ENV ?? 'development';
33
31
  const dotenvFiles = ['.env',
@@ -33,13 +33,11 @@ function _featureFlags() {
33
33
  };
34
34
  return data;
35
35
  }
36
- var _AssetGraph = _interopRequireWildcard(require("../AssetGraph"));
36
+ var _AssetGraph = _interopRequireDefault(require("../AssetGraph"));
37
37
  var _RequestTracker = require("../RequestTracker");
38
38
  var _SymbolPropagation = require("../SymbolPropagation");
39
39
  var _EnvironmentManager = require("../EnvironmentManager");
40
40
  var _Environment = require("../Environment");
41
- 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); }
42
- 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; }
43
41
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
44
42
  function createAssetGraphRequestRust(rustAtlaspack) {
45
43
  return input => ({
@@ -212,23 +210,11 @@ function getAssetGraph(serializedGraph) {
212
210
  let toNode = graph.getNode(to);
213
211
  if ((fromNode === null || fromNode === void 0 ? void 0 : fromNode.type) === 'dependency') {
214
212
  (0, _assert().default)((toNode === null || toNode === void 0 ? void 0 : toNode.type) === 'asset');
215
-
216
- // For backwards compatibility, create asset group node if needed.
217
- let assetGroupNode = (0, _AssetGraph.nodeFromAssetGroup)({
218
- filePath: toNode.value.filePath,
219
- env: fromNode.value.env,
220
- pipeline: toNode.value.pipeline,
221
- sideEffects: Boolean(toNode.value.sideEffects)
222
- });
223
- let index = graph.addNodeByContentKeyIfNeeded(assetGroupNode.id, assetGroupNode);
224
- graph.addEdge(from, index);
225
- graph.addEdge(index, to);
226
- } else if ((fromNode === null || fromNode === void 0 ? void 0 : fromNode.type) === 'asset' && (toNode === null || toNode === void 0 ? void 0 : toNode.type) === 'dependency') {
213
+ }
214
+ if ((fromNode === null || fromNode === void 0 ? void 0 : fromNode.type) === 'asset' && (toNode === null || toNode === void 0 ? void 0 : toNode.type) === 'dependency') {
227
215
  fromNode.value.dependencies.set(toNode.value.id, toNode.value);
228
- graph.addEdge(from, to);
229
- } else {
230
- graph.addEdge(from, to);
231
216
  }
217
+ graph.addEdge(from, to);
232
218
  }
233
219
  return {
234
220
  assetGraph: graph,
@@ -1,6 +1,7 @@
1
1
  import * as napi from '@atlaspack/rust';
2
2
  import type { JsCallable } from '@atlaspack/rust';
3
3
  import type { FilePath } from '@atlaspack/types';
4
+ import { FeatureFlags } from '@atlaspack/feature-flags';
4
5
  export declare class AtlaspackWorker {
5
6
  #private;
6
7
  constructor();
@@ -18,6 +19,7 @@ type LoadPluginOptions = {
18
19
  kind: 'resolver' | 'transformer';
19
20
  specifier: string;
20
21
  resolveFrom: string;
22
+ featureFlags?: FeatureFlags;
21
23
  };
22
24
  type RpcPluginOptions = {
23
25
  projectRoot: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaspack/core",
3
- "version": "2.26.1-dev-yarn-8750a7d2e.0",
3
+ "version": "2.26.1",
4
4
  "license": "(MIT OR Apache-2.0)",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -22,22 +22,22 @@
22
22
  "build:lib": "gulp build --gulpfile ../../../gulpfile.js --cwd ."
23
23
  },
24
24
  "dependencies": {
25
- "@atlaspack/build-cache": "2.13.7-dev-yarn-8750a7d2e.0",
26
- "@atlaspack/cache": "3.2.31-dev-yarn-8750a7d2e.0",
27
- "@atlaspack/diagnostic": "2.14.5-dev-yarn-8750a7d2e.0",
28
- "@atlaspack/events": "2.14.5-dev-yarn-8750a7d2e.0",
29
- "@atlaspack/feature-flags": "2.25.6-dev-yarn-8750a7d2e.0",
30
- "@atlaspack/fs": "2.15.31-dev-yarn-8750a7d2e.0",
31
- "@atlaspack/graph": "3.5.25-dev-yarn-8750a7d2e.0",
32
- "@atlaspack/logger": "2.14.28-dev-yarn-8750a7d2e.0",
33
- "@atlaspack/package-manager": "2.14.36-dev-yarn-8750a7d2e.0",
34
- "@atlaspack/plugin": "2.14.36-dev-yarn-8750a7d2e.0",
35
- "@atlaspack/profiler": "2.14.33-dev-yarn-8750a7d2e.0",
36
- "@atlaspack/rust": "3.8.4-dev-yarn-8750a7d2e.0",
37
- "@atlaspack/types": "2.15.26-dev-yarn-8750a7d2e.0",
38
- "@atlaspack/utils": "3.0.4-dev-yarn-8750a7d2e.0",
39
- "@atlaspack/workers": "2.14.36-dev-yarn-8750a7d2e.0",
40
25
  "@mischnic/json-sourcemap": "^0.1.0",
26
+ "@atlaspack/build-cache": "2.13.6",
27
+ "@atlaspack/cache": "3.2.31",
28
+ "@atlaspack/diagnostic": "2.14.4",
29
+ "@atlaspack/events": "2.14.4",
30
+ "@atlaspack/feature-flags": "2.26.0",
31
+ "@atlaspack/fs": "2.15.31",
32
+ "@atlaspack/graph": "3.5.25",
33
+ "@atlaspack/logger": "2.14.28",
34
+ "@atlaspack/package-manager": "2.14.36",
35
+ "@atlaspack/plugin": "2.14.36",
36
+ "@atlaspack/profiler": "2.14.33",
37
+ "@atlaspack/rust": "3.9.0",
38
+ "@atlaspack/types": "2.15.26",
39
+ "@atlaspack/utils": "3.1.0",
40
+ "@atlaspack/workers": "2.14.36",
41
41
  "@parcel/source-map": "^2.1.1",
42
42
  "base-x": "^3.0.8",
43
43
  "browserslist": "^4.6.6",
@@ -50,16 +50,15 @@
50
50
  "semver": "^7.5.2"
51
51
  },
52
52
  "devDependencies": {
53
- "@atlaspack/babel-register": "2.14.5-dev-yarn-8750a7d2e.0",
53
+ "@atlaspack/babel-register": "2.14.4",
54
54
  "@types/node": ">= 18",
55
- "graphviz": "^0.0.9",
56
- "jest-diff": "*",
57
55
  "rfdc": "1",
56
+ "jest-diff": "*",
57
+ "graphviz": "^0.0.9",
58
58
  "tempy": "^0.2.1"
59
59
  },
60
60
  "browser": {
61
61
  "./src/serializerCore.js": "./src/serializerCore.browser.js"
62
62
  },
63
- "type": "commonjs",
64
- "gitHead": "8750a7d2e6330244dd618c28a20d5a391080e4a3"
63
+ "type": "commonjs"
65
64
  }
@@ -533,20 +533,22 @@ export function propagateSymbols({
533
533
  incomingDep.value.symbols != null &&
534
534
  incomingDep.usedSymbolsUp.size === 0
535
535
  ) {
536
- let assetGroups = assetGraph.getNodeIdsConnectedFrom(
536
+ let connectedNodeIds = assetGraph.getNodeIdsConnectedFrom(
537
537
  assetGraph.getNodeIdByContentKey(incomingDep.id),
538
538
  );
539
- if (assetGroups.length === 1) {
540
- let [assetGroupId] = assetGroups;
541
- let assetGroup = nullthrows(assetGraph.getNode(assetGroupId));
542
- if (
543
- assetGroup.type === 'asset_group' &&
544
- assetGroup.value.sideEffects === false
545
- ) {
546
- incomingDep.excluded = true;
547
- }
548
- } else {
549
- invariant(assetGroups.length === 0);
539
+
540
+ let sideEffectFree = connectedNodeIds.every((nodeId) => {
541
+ let connectedNode = nullthrows(assetGraph.getNode(nodeId));
542
+ // Dependencies should only connect to asset_groups or assets
543
+ invariant(
544
+ connectedNode.type === 'asset' ||
545
+ connectedNode.type === 'asset_group',
546
+ );
547
+ return connectedNode.value.sideEffects === false;
548
+ });
549
+
550
+ if (sideEffectFree) {
551
+ incomingDep.excluded = true;
550
552
  }
551
553
  }
552
554
  }
@@ -807,17 +809,25 @@ function getDependencyResolution(
807
809
  ): Array<NodeId> {
808
810
  let depNodeId = graph.getNodeIdByContentKey(depId);
809
811
  let connected = graph.getNodeIdsConnectedFrom(depNodeId);
810
- invariant(connected.length <= 1);
811
- let child = connected[0];
812
- if (child) {
812
+
813
+ let resolvedNodeIds: Array<NodeId> = [];
814
+
815
+ // If any of the resolved nodes is an asset_group, we need to resolve its
816
+ // assets here.
817
+ for (let child of connected) {
818
+ if (!child) {
819
+ continue;
820
+ }
821
+
813
822
  let childNode = nullthrows(graph.getNode(child));
814
823
  if (childNode.type === 'asset_group') {
815
- return graph.getNodeIdsConnectedFrom(child);
824
+ resolvedNodeIds.push(...graph.getNodeIdsConnectedFrom(child));
816
825
  } else {
817
- return [child];
826
+ resolvedNodeIds.push(child);
818
827
  }
819
828
  }
820
- return [];
829
+
830
+ return resolvedNodeIds;
821
831
  }
822
832
 
823
833
  function equalMap<K>(
@@ -25,6 +25,7 @@ import {
25
25
  bundleBehaviorMap,
26
26
  dependencyPriorityMap,
27
27
  } from './compat';
28
+ import {FeatureFlags} from '@atlaspack/feature-flags';
28
29
 
29
30
  const CONFIG = Symbol.for('parcel-plugin-config');
30
31
 
@@ -40,7 +41,7 @@ export class AtlaspackWorker {
40
41
  }
41
42
 
42
43
  loadPlugin: JsCallable<[LoadPluginOptions], Promise<undefined>> = jsCallable(
43
- async ({kind, specifier, resolveFrom}) => {
44
+ async ({kind, specifier, resolveFrom, featureFlags}) => {
44
45
  let customRequire = module.createRequire(resolveFrom);
45
46
  let resolvedPath = customRequire.resolve(specifier);
46
47
  let resolvedModule = await import(resolvedPath);
@@ -59,6 +60,11 @@ export class AtlaspackWorker {
59
60
  `Plugin could not be resolved\n\t${kind}\n\t${resolveFrom}\n\t${specifier}`,
60
61
  );
61
62
  }
63
+ // Set feature flags in the worker process
64
+ if (featureFlags) {
65
+ const {setFeatureFlags} = await import('@atlaspack/feature-flags');
66
+ setFeatureFlags(featureFlags);
67
+ }
62
68
 
63
69
  switch (kind) {
64
70
  case 'resolver':
@@ -340,6 +346,7 @@ type LoadPluginOptions = {
340
346
  kind: 'resolver' | 'transformer';
341
347
  specifier: string;
342
348
  resolveFrom: string;
349
+ featureFlags?: FeatureFlags;
343
350
  };
344
351
 
345
352
  type RpcPluginOptions = {
package/src/loadDotEnv.ts CHANGED
@@ -2,7 +2,6 @@ import type {FileSystem} from '@atlaspack/fs';
2
2
  import type {EnvMap, FilePath} from '@atlaspack/types';
3
3
 
4
4
  import {resolveConfig} from '@atlaspack/utils';
5
- // @ts-expect-error TS7016
6
5
  import dotenv from 'dotenv';
7
6
  import variableExpansion from 'dotenv-expand';
8
7
 
@@ -238,28 +238,13 @@ export function getAssetGraph(serializedGraph: any): {
238
238
 
239
239
  if (fromNode?.type === 'dependency') {
240
240
  invariant(toNode?.type === 'asset');
241
+ }
241
242
 
242
- // For backwards compatibility, create asset group node if needed.
243
- let assetGroupNode = nodeFromAssetGroup({
244
- filePath: toNode.value.filePath,
245
- env: fromNode.value.env,
246
- pipeline: toNode.value.pipeline,
247
- sideEffects: Boolean(toNode.value.sideEffects),
248
- });
249
-
250
- let index = graph.addNodeByContentKeyIfNeeded(
251
- assetGroupNode.id,
252
- assetGroupNode,
253
- );
254
-
255
- graph.addEdge(from, index);
256
- graph.addEdge(index, to);
257
- } else if (fromNode?.type === 'asset' && toNode?.type === 'dependency') {
243
+ if (fromNode?.type === 'asset' && toNode?.type === 'dependency') {
258
244
  fromNode.value.dependencies.set(toNode.value.id, toNode.value);
259
- graph.addEdge(from, to);
260
- } else {
261
- graph.addEdge(from, to);
262
245
  }
246
+
247
+ graph.addEdge(from, to);
263
248
  }
264
249
 
265
250
  return {