@embroider/compat 0.49.0 → 0.50.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@embroider/compat",
3
- "version": "0.49.0",
3
+ "version": "0.50.0",
4
4
  "private": false,
5
5
  "description": "Backward compatibility layer for the Embroider build system.",
6
6
  "repository": {
@@ -29,8 +29,8 @@
29
29
  "@babel/plugin-syntax-dynamic-import": "^7.8.3",
30
30
  "@babel/preset-env": "^7.14.5",
31
31
  "@babel/traverse": "^7.14.5",
32
- "@embroider/macros": "0.49.0",
33
- "@embroider/shared-internals": "0.49.0",
32
+ "@embroider/macros": "0.50.0",
33
+ "@embroider/shared-internals": "0.50.0",
34
34
  "@types/babel__code-frame": "^7.0.2",
35
35
  "@types/yargs": "^17.0.3",
36
36
  "assert-never": "^1.1.0",
@@ -85,7 +85,7 @@
85
85
  "typescript": "*"
86
86
  },
87
87
  "peerDependencies": {
88
- "@embroider/core": "0.49.0"
88
+ "@embroider/core": "0.50.0"
89
89
  },
90
90
  "engines": {
91
91
  "node": "12.* || 14.* || >= 16"
@@ -12,7 +12,7 @@ const empty_package_tree_1 = __importDefault(require("./empty-package-tree"));
12
12
  function cachedBuildCompatAddon(originalPackage, v1Cache) {
13
13
  let tree = buildCompatAddon(originalPackage, v1Cache);
14
14
  if (!originalPackage.mayRebuild) {
15
- tree = new one_shot_1.default(tree, originalPackage.name);
15
+ tree = one_shot_1.default.create(tree, originalPackage.name);
16
16
  }
17
17
  return tree;
18
18
  }
@@ -56,7 +56,7 @@ function buildCompatAddon(originalPackage, v1Cache) {
56
56
  function withoutNodeModules(originalPackage) {
57
57
  let Klass = originalPackage.mayRebuild ? broccoli_source_1.WatchedDir : broccoli_source_1.UnwatchedDir;
58
58
  return (0, broccoli_funnel_1.default)(new Klass(originalPackage.root), {
59
- exclude: ['node_modules'],
59
+ exclude: ['node_modules', '*/node_modules'],
60
60
  });
61
61
  }
62
62
  //# sourceMappingURL=build-compat-addon.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"build-compat-addon.js","sourceRoot":"","sources":["build-compat-addon.ts"],"names":[],"mappings":";;;;;AAEA,gFAAsD;AACtD,gFAAsD;AAEtD,0DAAiC;AACjC,sEAA0C;AAC1C,qDAA2D;AAC3D,8EAAoD;AAEpD,SAAwB,sBAAsB,CAAC,eAAwB,EAAE,OAAwB;IAC/F,IAAI,IAAI,GAAG,gBAAgB,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IACtD,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE;QAC/B,IAAI,GAAG,IAAI,kBAAO,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;KAChD;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAND,yCAMC;AAED,SAAS,gBAAgB,CAAC,eAAwB,EAAE,OAAwB;IAC1E,IAAI,eAAe,CAAC,SAAS,EAAE,EAAE;QAC/B,0DAA0D;QAC1D,kEAAkE;QAClE,0EAA0E;QAC1E,aAAa;QACb,OAAO,kBAAkB,CAAC,eAAe,CAAC,CAAC;KAC5C;IAED,IAAI,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IAE1D,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;QAC1B,sEAAsE;QACtE,2EAA2E;QAC3E,+BAA+B;QAC/B,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;KAC3D;IAED,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;QAC5B,yEAAyE;QACzE,4EAA4E;QAC5E,kCAAkC;QAClC,EAAE;QACF,yEAAyE;QACzE,gEAAgE;QAChE,0EAA0E;QAC1E,2BAA2B;QAC3B,OAAO,IAAI,4BAAgB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;KACnD;IAED,IAAI,cAAc,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5E,IAAI,cAAc,EAAE;QAClB,IAAI,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;QACzD,IAAI,QAAQ,GAAG,IAAI,6BAAiB,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC;QAClF,OAAO,IAAA,8BAAkB,EAAC,CAAC,GAAG,KAAK,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;KACtE;SAAM;QACL,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;KAC9B;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,eAAwB;IAClD,IAAI,KAAK,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,4BAAU,CAAC,CAAC,CAAC,8BAAY,CAAC;IACnE,OAAO,IAAA,yBAAW,EAAC,IAAI,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE;QAClD,OAAO,EAAE,CAAC,cAAc,CAAC;KAC1B,CAAC,CAAC;AACL,CAAC","sourcesContent":["import V1InstanceCache from './v1-instance-cache';\nimport { Package } from '@embroider/core';\nimport SmooshPackageJSON from './smoosh-package-json';\nimport broccoliMergeTrees from 'broccoli-merge-trees';\nimport { Node } from 'broccoli-node-api';\nimport OneShot from './one-shot';\nimport buildFunnel from 'broccoli-funnel';\nimport { UnwatchedDir, WatchedDir } from 'broccoli-source';\nimport EmptyPackageTree from './empty-package-tree';\n\nexport default function cachedBuildCompatAddon(originalPackage: Package, v1Cache: V1InstanceCache): Node {\n let tree = buildCompatAddon(originalPackage, v1Cache);\n if (!originalPackage.mayRebuild) {\n tree = new OneShot(tree, originalPackage.name);\n }\n return tree;\n}\n\nfunction buildCompatAddon(originalPackage: Package, v1Cache: V1InstanceCache): Node {\n if (originalPackage.isV2Addon()) {\n // this case is needed when a native-v2 addon depends on a\n // non-native-v2 addon. (The non-native one will get rewritten and\n // therefore moved, so to continue depending on it the native one needs to\n // move too.)\n return withoutNodeModules(originalPackage);\n }\n\n let oldPackages = v1Cache.getAddons(originalPackage.root);\n\n if (oldPackages.length > 1) {\n // extensibility hook that allows a compat adapter to optimize its own\n // smooshing. We do it early so that if it reduces all the way to zero, the\n // next check will handle that.\n oldPackages = oldPackages[0].reduceInstances(oldPackages);\n }\n\n if (oldPackages.length === 0) {\n // this happens when the v1 addon wasn't actually getting instantiated at\n // all, which can happen if the app uses `addons.blacklist` or another addon\n // uses `shouldIncludeChildAddon`.\n //\n // we still keep a place for this addon in the rewritten addon workspace,\n // because that whole process only depends on looking at all the\n // package.json files on disk -- it can't know which ones are going to end\n // up unused at this point.\n return new EmptyPackageTree(originalPackage.name);\n }\n\n let needsSmooshing = oldPackages.length > 1 && oldPackages[0].hasAnyTrees();\n if (needsSmooshing) {\n let trees = oldPackages.map(pkg => pkg.v2Tree).reverse();\n let smoosher = new SmooshPackageJSON(trees, { annotation: originalPackage.name });\n return broccoliMergeTrees([...trees, smoosher], { overwrite: true });\n } else {\n return oldPackages[0].v2Tree;\n }\n}\n\nfunction withoutNodeModules(originalPackage: Package): Node {\n let Klass = originalPackage.mayRebuild ? WatchedDir : UnwatchedDir;\n return buildFunnel(new Klass(originalPackage.root), {\n exclude: ['node_modules'],\n });\n}\n"]}
1
+ {"version":3,"file":"build-compat-addon.js","sourceRoot":"","sources":["build-compat-addon.ts"],"names":[],"mappings":";;;;;AAEA,gFAAsD;AACtD,gFAAsD;AAEtD,0DAAiC;AACjC,sEAA0C;AAC1C,qDAA2D;AAC3D,8EAAoD;AAEpD,SAAwB,sBAAsB,CAAC,eAAwB,EAAE,OAAwB;IAC/F,IAAI,IAAI,GAAG,gBAAgB,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IACtD,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE;QAC/B,IAAI,GAAG,kBAAO,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;KACnD;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAND,yCAMC;AAED,SAAS,gBAAgB,CAAC,eAAwB,EAAE,OAAwB;IAC1E,IAAI,eAAe,CAAC,SAAS,EAAE,EAAE;QAC/B,0DAA0D;QAC1D,kEAAkE;QAClE,0EAA0E;QAC1E,aAAa;QACb,OAAO,kBAAkB,CAAC,eAAe,CAAC,CAAC;KAC5C;IAED,IAAI,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IAE1D,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;QAC1B,sEAAsE;QACtE,2EAA2E;QAC3E,+BAA+B;QAC/B,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;KAC3D;IAED,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;QAC5B,yEAAyE;QACzE,4EAA4E;QAC5E,kCAAkC;QAClC,EAAE;QACF,yEAAyE;QACzE,gEAAgE;QAChE,0EAA0E;QAC1E,2BAA2B;QAC3B,OAAO,IAAI,4BAAgB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;KACnD;IAED,IAAI,cAAc,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5E,IAAI,cAAc,EAAE;QAClB,IAAI,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;QACzD,IAAI,QAAQ,GAAG,IAAI,6BAAiB,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC;QAClF,OAAO,IAAA,8BAAkB,EAAC,CAAC,GAAG,KAAK,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;KACtE;SAAM;QACL,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;KAC9B;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,eAAwB;IAClD,IAAI,KAAK,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,4BAAU,CAAC,CAAC,CAAC,8BAAY,CAAC;IACnE,OAAO,IAAA,yBAAW,EAAC,IAAI,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE;QAClD,OAAO,EAAE,CAAC,cAAc,EAAE,gBAAgB,CAAC;KAC5C,CAAC,CAAC;AACL,CAAC","sourcesContent":["import V1InstanceCache from './v1-instance-cache';\nimport { Package } from '@embroider/core';\nimport SmooshPackageJSON from './smoosh-package-json';\nimport broccoliMergeTrees from 'broccoli-merge-trees';\nimport { Node } from 'broccoli-node-api';\nimport OneShot from './one-shot';\nimport buildFunnel from 'broccoli-funnel';\nimport { UnwatchedDir, WatchedDir } from 'broccoli-source';\nimport EmptyPackageTree from './empty-package-tree';\n\nexport default function cachedBuildCompatAddon(originalPackage: Package, v1Cache: V1InstanceCache): Node {\n let tree = buildCompatAddon(originalPackage, v1Cache);\n if (!originalPackage.mayRebuild) {\n tree = OneShot.create(tree, originalPackage.name);\n }\n return tree;\n}\n\nfunction buildCompatAddon(originalPackage: Package, v1Cache: V1InstanceCache): Node {\n if (originalPackage.isV2Addon()) {\n // this case is needed when a native-v2 addon depends on a\n // non-native-v2 addon. (The non-native one will get rewritten and\n // therefore moved, so to continue depending on it the native one needs to\n // move too.)\n return withoutNodeModules(originalPackage);\n }\n\n let oldPackages = v1Cache.getAddons(originalPackage.root);\n\n if (oldPackages.length > 1) {\n // extensibility hook that allows a compat adapter to optimize its own\n // smooshing. We do it early so that if it reduces all the way to zero, the\n // next check will handle that.\n oldPackages = oldPackages[0].reduceInstances(oldPackages);\n }\n\n if (oldPackages.length === 0) {\n // this happens when the v1 addon wasn't actually getting instantiated at\n // all, which can happen if the app uses `addons.blacklist` or another addon\n // uses `shouldIncludeChildAddon`.\n //\n // we still keep a place for this addon in the rewritten addon workspace,\n // because that whole process only depends on looking at all the\n // package.json files on disk -- it can't know which ones are going to end\n // up unused at this point.\n return new EmptyPackageTree(originalPackage.name);\n }\n\n let needsSmooshing = oldPackages.length > 1 && oldPackages[0].hasAnyTrees();\n if (needsSmooshing) {\n let trees = oldPackages.map(pkg => pkg.v2Tree).reverse();\n let smoosher = new SmooshPackageJSON(trees, { annotation: originalPackage.name });\n return broccoliMergeTrees([...trees, smoosher], { overwrite: true });\n } else {\n return oldPackages[0].v2Tree;\n }\n}\n\nfunction withoutNodeModules(originalPackage: Package): Node {\n let Klass = originalPackage.mayRebuild ? WatchedDir : UnwatchedDir;\n return buildFunnel(new Klass(originalPackage.root), {\n exclude: ['node_modules', '*/node_modules'],\n });\n}\n"]}
package/src/one-shot.d.ts CHANGED
@@ -3,6 +3,7 @@ import { Node } from 'broccoli-node-api';
3
3
  export default class OneShot extends Plugin {
4
4
  private addonName;
5
5
  private builder;
6
- constructor(originalTree: Node, addonName: string);
6
+ static create(originalTree: Node, privateAddonName: string): Node;
7
+ private constructor();
7
8
  build(): Promise<void>;
8
9
  }
package/src/one-shot.js CHANGED
@@ -19,6 +19,7 @@ class NerfHeimdallBuilder extends broccoli_1.Builder {
19
19
  setupHeimdall() { }
20
20
  buildHeimdallTree() { }
21
21
  }
22
+ let seen = new WeakMap();
22
23
  // Wraps a broccoli tree such that it (and everything it depends on) will only
23
24
  // build a single time.
24
25
  class OneShot extends broccoli_plugin_1.default {
@@ -33,6 +34,14 @@ class OneShot extends broccoli_plugin_1.default {
33
34
  // create a nested builder in order to isolate the specific addon
34
35
  this.builder = new NerfHeimdallBuilder(originalTree);
35
36
  }
37
+ static create(originalTree, privateAddonName) {
38
+ let output = seen.get(originalTree);
39
+ if (!output) {
40
+ output = new this(originalTree, privateAddonName);
41
+ seen.set(originalTree, output);
42
+ }
43
+ return output;
44
+ }
36
45
  async build() {
37
46
  const { builder } = this;
38
47
  // only build the first time
@@ -1 +1 @@
1
- {"version":3,"file":"one-shot.js","sourceRoot":"","sources":["one-shot.ts"],"names":[],"mappings":";;;;;AAAA,sEAAqC;AAErC,uCAAmC;AACnC,uCAAoC;AACpC,4DAAkC;AAElC,MAAM,mBAAoB,SAAQ,kBAAO;IACvC;;;;;;;MAOE;IACF,aAAa,KAAI,CAAC;IAClB,iBAAiB,KAAI,CAAC;CACvB;AAED,8EAA8E;AAC9E,uBAAuB;AACvB,MAAqB,OAAQ,SAAQ,yBAAM;IAGzC,YAAY,YAAkB,EAAU,SAAiB;QACvD,mEAAmE;QACnE,KAAK,CAAC,EAAE,EAAE;YACR,UAAU,EAAE,sBAAsB,SAAS,EAAE;YAC7C,gBAAgB,EAAE,IAAI;YACtB,UAAU,EAAE,KAAK;SAClB,CAAC,CAAC;QANmC,cAAS,GAAT,SAAS,CAAQ;QAQvD,iEAAiE;QACjE,IAAI,CAAC,OAAO,GAAG,IAAI,mBAAmB,CAAC,YAAY,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAEzB,4BAA4B;QAC5B,IAAI,OAAO,KAAK,IAAI,EAAE;YACpB,OAAO;SACR;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,8EAA8E;QAC9E,qCAAqC;QACrC,MAAM,aAAa,GAAG,oBAAQ,CAAC,KAAK,CAAC;YACnC,IAAI,EAAE,+BAA+B,IAAI,CAAC,SAAS,GAAG;SACvD,CAAC,CAAC;QACH,MAAM,mBAAmB,GAAG,oBAAQ,CAAC,OAAO,CAAC;QAE7C,IAAI;YACF,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACtB,IAAA,mBAAQ,EAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;YACrE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;SACzB;gBAAS;YACR,aAAa,CAAC,IAAI,EAAE,CAAC;YACrB;;;;cAIE;YACF,mBAAmB,CAAC,MAAM,EAAE,CAAC;SAC9B;IACH,CAAC;CACF;AA7CD,0BA6CC","sourcesContent":["import Plugin from 'broccoli-plugin';\nimport { Node } from 'broccoli-node-api';\nimport { Builder } from 'broccoli';\nimport { copySync } from 'fs-extra';\nimport heimdall from 'heimdalljs';\n\nclass NerfHeimdallBuilder extends Builder {\n /*\n Replace the code used to track heimdall nodes: https://github.com/broccolijs/broccoli/blob/v3.5.2/lib/builder.ts#L463-L503\n\n This reduces the amount of memory that these one-shot's create by:\n\n - Avoiding creating Heimdall nodes for each broccoli plugin\n - Disabling the \"re-parenting\" process done by Broccoli builder (which ends up creating **double** the heimdall nodes)\n */\n setupHeimdall() {}\n buildHeimdallTree() {}\n}\n\n// Wraps a broccoli tree such that it (and everything it depends on) will only\n// build a single time.\nexport default class OneShot extends Plugin {\n private builder: NerfHeimdallBuilder | null;\n\n constructor(originalTree: Node, private addonName: string) {\n // from broccoli's perspective, we don't depend on any input trees!\n super([], {\n annotation: `@embroider/compat: ${addonName}`,\n persistentOutput: true,\n needsCache: false,\n });\n\n // create a nested builder in order to isolate the specific addon\n this.builder = new NerfHeimdallBuilder(originalTree);\n }\n\n async build() {\n const { builder } = this;\n\n // only build the first time\n if (builder === null) {\n return;\n }\n this.builder = null;\n\n // Make a heimdall node so that we know for sure, all nodes created during our\n // inner builder can be remove easily\n const oneshotCookie = heimdall.start({\n name: `@embroider/compat: OneShot (${this.addonName})`,\n });\n const oneshotHeimdallNode = heimdall.current;\n\n try {\n await builder.build();\n copySync(builder.outputPath, this.outputPath, { dereference: true });\n await builder.cleanup();\n } finally {\n oneshotCookie.stop();\n /*\n Remove any of the current node's direct children, this ensures that we do not bloat the\n current Broccoli builder's heimdall node graph (e.g. the one that is calling\n OneShotPlugin; **not** the one that the OneShotPlugin internally creates).\n */\n oneshotHeimdallNode.remove();\n }\n }\n}\n"]}
1
+ {"version":3,"file":"one-shot.js","sourceRoot":"","sources":["one-shot.ts"],"names":[],"mappings":";;;;;AAAA,sEAAqC;AAErC,uCAAmC;AACnC,uCAAoC;AACpC,4DAAkC;AAElC,MAAM,mBAAoB,SAAQ,kBAAO;IACvC;;;;;;;MAOE;IACF,aAAa,KAAI,CAAC;IAClB,iBAAiB,KAAI,CAAC;CACvB;AAED,IAAI,IAAI,GAAG,IAAI,OAAO,EAAc,CAAC;AAErC,8EAA8E;AAC9E,uBAAuB;AACvB,MAAqB,OAAQ,SAAQ,yBAAM;IAYzC,YAAoB,YAAkB,EAAU,SAAiB;QAC/D,mEAAmE;QACnE,KAAK,CAAC,EAAE,EAAE;YACR,UAAU,EAAE,sBAAsB,SAAS,EAAE;YAC7C,gBAAgB,EAAE,IAAI;YACtB,UAAU,EAAE,KAAK;SAClB,CAAC,CAAC;QAN2C,cAAS,GAAT,SAAS,CAAQ;QAQ/D,iEAAiE;QACjE,IAAI,CAAC,OAAO,GAAG,IAAI,mBAAmB,CAAC,YAAY,CAAC,CAAC;IACvD,CAAC;IAnBD,MAAM,CAAC,MAAM,CAAC,YAAkB,EAAE,gBAAwB;QACxD,IAAI,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,EAAE;YACX,MAAM,GAAG,IAAI,IAAI,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;YAClD,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;SAChC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAcD,KAAK,CAAC,KAAK;QACT,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAEzB,4BAA4B;QAC5B,IAAI,OAAO,KAAK,IAAI,EAAE;YACpB,OAAO;SACR;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,8EAA8E;QAC9E,qCAAqC;QACrC,MAAM,aAAa,GAAG,oBAAQ,CAAC,KAAK,CAAC;YACnC,IAAI,EAAE,+BAA+B,IAAI,CAAC,SAAS,GAAG;SACvD,CAAC,CAAC;QACH,MAAM,mBAAmB,GAAG,oBAAQ,CAAC,OAAO,CAAC;QAE7C,IAAI;YACF,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACtB,IAAA,mBAAQ,EAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;YACrE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;SACzB;gBAAS;YACR,aAAa,CAAC,IAAI,EAAE,CAAC;YACrB;;;;cAIE;YACF,mBAAmB,CAAC,MAAM,EAAE,CAAC;SAC9B;IACH,CAAC;CACF;AAtDD,0BAsDC","sourcesContent":["import Plugin from 'broccoli-plugin';\nimport { Node } from 'broccoli-node-api';\nimport { Builder } from 'broccoli';\nimport { copySync } from 'fs-extra';\nimport heimdall from 'heimdalljs';\n\nclass NerfHeimdallBuilder extends Builder {\n /*\n Replace the code used to track heimdall nodes: https://github.com/broccolijs/broccoli/blob/v3.5.2/lib/builder.ts#L463-L503\n\n This reduces the amount of memory that these one-shot's create by:\n\n - Avoiding creating Heimdall nodes for each broccoli plugin\n - Disabling the \"re-parenting\" process done by Broccoli builder (which ends up creating **double** the heimdall nodes)\n */\n setupHeimdall() {}\n buildHeimdallTree() {}\n}\n\nlet seen = new WeakMap<Node, Node>();\n\n// Wraps a broccoli tree such that it (and everything it depends on) will only\n// build a single time.\nexport default class OneShot extends Plugin {\n private builder: NerfHeimdallBuilder | null;\n\n static create(originalTree: Node, privateAddonName: string) {\n let output = seen.get(originalTree);\n if (!output) {\n output = new this(originalTree, privateAddonName);\n seen.set(originalTree, output);\n }\n return output;\n }\n\n private constructor(originalTree: Node, private addonName: string) {\n // from broccoli's perspective, we don't depend on any input trees!\n super([], {\n annotation: `@embroider/compat: ${addonName}`,\n persistentOutput: true,\n needsCache: false,\n });\n\n // create a nested builder in order to isolate the specific addon\n this.builder = new NerfHeimdallBuilder(originalTree);\n }\n\n async build() {\n const { builder } = this;\n\n // only build the first time\n if (builder === null) {\n return;\n }\n this.builder = null;\n\n // Make a heimdall node so that we know for sure, all nodes created during our\n // inner builder can be remove easily\n const oneshotCookie = heimdall.start({\n name: `@embroider/compat: OneShot (${this.addonName})`,\n });\n const oneshotHeimdallNode = heimdall.current;\n\n try {\n await builder.build();\n copySync(builder.outputPath, this.outputPath, { dereference: true });\n await builder.cleanup();\n } finally {\n oneshotCookie.stop();\n /*\n Remove any of the current node's direct children, this ensures that we do not bloat the\n current Broccoli builder's heimdall node graph (e.g. the one that is calling\n OneShotPlugin; **not** the one that the OneShotPlugin internally creates).\n */\n oneshotHeimdallNode.remove();\n }\n }\n}\n"]}