@embroider/compat 1.0.0 → 1.3.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": "1.0.0",
3
+ "version": "1.3.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": "1.0.0",
33
- "@embroider/shared-internals": "1.0.0",
32
+ "@embroider/macros": "1.3.0",
33
+ "@embroider/shared-internals": "1.3.0",
34
34
  "@types/babel__code-frame": "^7.0.2",
35
35
  "@types/yargs": "^17.0.3",
36
36
  "assert-never": "^1.1.0",
@@ -49,7 +49,6 @@
49
49
  "debug": "^4.3.2",
50
50
  "fs-extra": "^9.1.0",
51
51
  "fs-tree-diff": "^2.0.1",
52
- "heimdalljs": "^0.2.6",
53
52
  "jsdom": "^16.6.0",
54
53
  "lodash": "^4.17.21",
55
54
  "pkg-up": "^3.1.0",
@@ -85,7 +84,7 @@
85
84
  "typescript": "*"
86
85
  },
87
86
  "peerDependencies": {
88
- "@embroider/core": "1.0.0"
87
+ "@embroider/core": "1.3.0"
89
88
  },
90
89
  "engines": {
91
90
  "node": "12.* || 14.* || >= 16"
@@ -7,6 +7,12 @@ let rules = [
7
7
  '-private.js': {
8
8
  dependsOnModules: ['@ember-data/record-data/-private'],
9
9
  },
10
+ '-private/system/core-store.js': {
11
+ dependsOnModules: ['@ember-data/record-data/-private'],
12
+ },
13
+ '-private/system/model/internal-model.js': {
14
+ dependsOnModules: ['@ember-data/model/-private'],
15
+ },
10
16
  },
11
17
  },
12
18
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"ember-data.js","sourceRoot":"","sources":["ember-data.ts"],"names":[],"mappings":";;AAEA,IAAI,KAAK,GAAmB;IAC1B;QACE,OAAO,EAAE,mBAAmB;QAC5B,YAAY,EAAE;YACZ,aAAa,EAAE;gBACb,gBAAgB,EAAE,CAAC,kCAAkC,CAAC;aACvD;SACF;KACF;CACF,CAAC;AAEF,kBAAe,KAAK,CAAC","sourcesContent":["import { PackageRules } from '..';\n\nlet rules: PackageRules[] = [\n {\n package: '@ember-data/store',\n addonModules: {\n '-private.js': {\n dependsOnModules: ['@ember-data/record-data/-private'],\n },\n },\n },\n];\n\nexport default rules;\n"]}
1
+ {"version":3,"file":"ember-data.js","sourceRoot":"","sources":["ember-data.ts"],"names":[],"mappings":";;AAEA,IAAI,KAAK,GAAmB;IAC1B;QACE,OAAO,EAAE,mBAAmB;QAC5B,YAAY,EAAE;YACZ,aAAa,EAAE;gBACb,gBAAgB,EAAE,CAAC,kCAAkC,CAAC;aACvD;YACD,+BAA+B,EAAE;gBAC/B,gBAAgB,EAAE,CAAC,kCAAkC,CAAC;aACvD;YACD,yCAAyC,EAAE;gBACzC,gBAAgB,EAAE,CAAC,4BAA4B,CAAC;aACjD;SACF;KACF;CACF,CAAC;AAEF,kBAAe,KAAK,CAAC","sourcesContent":["import { PackageRules } from '..';\n\nlet rules: PackageRules[] = [\n {\n package: '@ember-data/store',\n addonModules: {\n '-private.js': {\n dependsOnModules: ['@ember-data/record-data/-private'],\n },\n '-private/system/core-store.js': {\n dependsOnModules: ['@ember-data/record-data/-private'],\n },\n '-private/system/model/internal-model.js': {\n dependsOnModules: ['@ember-data/model/-private'],\n },\n },\n },\n];\n\nexport default rules;\n"]}
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  let rules = {
4
4
  package: 'ember-power-select',
5
+ semverRange: '< 5.0.1',
5
6
  addonModules: {
6
7
  './components/power-select.js': {
7
8
  dependsOnComponents: [
@@ -1 +1 @@
1
- {"version":3,"file":"ember-power-select.js","sourceRoot":"","sources":["ember-power-select.ts"],"names":[],"mappings":";;AAEA,IAAI,KAAK,GAAiB;IACxB,OAAO,EAAE,oBAAoB;IAC7B,YAAY,EAAE;QACZ,8BAA8B,EAAE;YAC9B,mBAAmB,EAAE;gBACnB,iCAAiC;gBACjC,0BAA0B;gBAC1B,qCAAqC;gBACrC,0BAA0B;gBAC1B,iCAAiC;gBACjC,8BAA8B;aAC/B;SACF;QACD,uCAAuC,EAAE;YACvC,mBAAmB,EAAE,CAAC,mCAAmC,CAAC;SAC3D;KACF;IACD,UAAU,EAAE;QACV,kBAAkB,EAAE;YAClB,MAAM,EAAE;gBACN,SAAS,EAAE,uCAAuC;aACnD;YACD,yBAAyB,EAAE;gBACzB,uBAAuB;gBACvB,wBAAwB;gBACxB,kBAAkB;gBAClB,sBAAsB;gBACtB,wBAAwB;gBACxB,uBAAuB;gBACvB,kBAAkB;aACnB;SACF;QACD,2BAA2B,EAAE;YAC3B,MAAM,EAAE;gBACN,SAAS,EAAE,gDAAgD;aAC5D;YACD,yBAAyB,EAAE;gBACzB,uBAAuB;gBACvB,wBAAwB;gBACxB,gBAAgB;gBAChB,kBAAkB;gBAClB,sBAAsB;gBACtB,wBAAwB;gBACxB,uBAAuB;gBACvB,kBAAkB;aACnB;SACF;QACD,0BAA0B,EAAE;YAC1B,MAAM,EAAE;gBACN,SAAS,EAAE,+CAA+C;aAC3D;YACD,yBAAyB,EAAE,CAAC,uBAAuB,EAAE,sBAAsB,CAAC;SAC7E;QACD,0BAA0B,EAAE;YAC1B,MAAM,EAAE;gBACN,SAAS,EAAE,+CAA+C;aAC3D;YACD,yBAAyB,EAAE,CAAC,gBAAgB,EAAE,kBAAkB,CAAC;SAClE;QACD,mCAAmC,EAAE;YACnC,MAAM,EAAE;gBACN,SAAS,EAAE,wDAAwD;aACpE;YACD,yBAAyB,EAAE,CAAC,uBAAuB,CAAC;SACrD;KACF;CACF,CAAC;AAEF,kBAAe,CAAC,KAAK,CAAC,CAAC","sourcesContent":["import { PackageRules } from '..';\n\nlet rules: PackageRules = {\n package: 'ember-power-select',\n addonModules: {\n './components/power-select.js': {\n dependsOnComponents: [\n '{{power-select/before-options}}',\n '{{power-select/options}}',\n '{{power-select/power-select-group}}',\n '{{power-select/trigger}}',\n '{{power-select/search-message}}',\n '{{power-select/placeholder}}',\n ],\n },\n './components/power-select-multiple.js': {\n dependsOnComponents: ['{{power-select-multiple/trigger}}'],\n },\n },\n components: {\n '{{power-select}}': {\n layout: {\n addonPath: 'templates/components/power-select.hbs',\n },\n acceptsComponentArguments: [\n 'afterOptionsComponent',\n 'beforeOptionsComponent',\n 'optionsComponent',\n 'placeholderComponent',\n 'searchMessageComponent',\n 'selectedItemComponent',\n 'triggerComponent',\n ],\n },\n '{{power-select-multiple}}': {\n layout: {\n addonPath: 'templates/components/power-select-multiple.hbs',\n },\n acceptsComponentArguments: [\n 'afterOptionsComponent',\n 'beforeOptionsComponent',\n 'groupComponent',\n 'optionsComponent',\n 'placeholderComponent',\n 'searchMessageComponent',\n 'selectedItemComponent',\n 'triggerComponent',\n ],\n },\n '{{power-select/trigger}}': {\n layout: {\n addonPath: 'templates/components/power-select/trigger.hbs',\n },\n acceptsComponentArguments: ['selectedItemComponent', 'placeholderComponent'],\n },\n '{{power-select/options}}': {\n layout: {\n addonPath: 'templates/components/power-select/options.hbs',\n },\n acceptsComponentArguments: ['groupComponent', 'optionsComponent'],\n },\n '{{power-select-multiple/trigger}}': {\n layout: {\n addonPath: 'templates/components/power-select-multiple/trigger.hbs',\n },\n acceptsComponentArguments: ['selectedItemComponent'],\n },\n },\n};\n\nexport default [rules];\n"]}
1
+ {"version":3,"file":"ember-power-select.js","sourceRoot":"","sources":["ember-power-select.ts"],"names":[],"mappings":";;AAEA,IAAI,KAAK,GAAiB;IACxB,OAAO,EAAE,oBAAoB;IAC7B,WAAW,EAAE,SAAS;IACtB,YAAY,EAAE;QACZ,8BAA8B,EAAE;YAC9B,mBAAmB,EAAE;gBACnB,iCAAiC;gBACjC,0BAA0B;gBAC1B,qCAAqC;gBACrC,0BAA0B;gBAC1B,iCAAiC;gBACjC,8BAA8B;aAC/B;SACF;QACD,uCAAuC,EAAE;YACvC,mBAAmB,EAAE,CAAC,mCAAmC,CAAC;SAC3D;KACF;IACD,UAAU,EAAE;QACV,kBAAkB,EAAE;YAClB,MAAM,EAAE;gBACN,SAAS,EAAE,uCAAuC;aACnD;YACD,yBAAyB,EAAE;gBACzB,uBAAuB;gBACvB,wBAAwB;gBACxB,kBAAkB;gBAClB,sBAAsB;gBACtB,wBAAwB;gBACxB,uBAAuB;gBACvB,kBAAkB;aACnB;SACF;QACD,2BAA2B,EAAE;YAC3B,MAAM,EAAE;gBACN,SAAS,EAAE,gDAAgD;aAC5D;YACD,yBAAyB,EAAE;gBACzB,uBAAuB;gBACvB,wBAAwB;gBACxB,gBAAgB;gBAChB,kBAAkB;gBAClB,sBAAsB;gBACtB,wBAAwB;gBACxB,uBAAuB;gBACvB,kBAAkB;aACnB;SACF;QACD,0BAA0B,EAAE;YAC1B,MAAM,EAAE;gBACN,SAAS,EAAE,+CAA+C;aAC3D;YACD,yBAAyB,EAAE,CAAC,uBAAuB,EAAE,sBAAsB,CAAC;SAC7E;QACD,0BAA0B,EAAE;YAC1B,MAAM,EAAE;gBACN,SAAS,EAAE,+CAA+C;aAC3D;YACD,yBAAyB,EAAE,CAAC,gBAAgB,EAAE,kBAAkB,CAAC;SAClE;QACD,mCAAmC,EAAE;YACnC,MAAM,EAAE;gBACN,SAAS,EAAE,wDAAwD;aACpE;YACD,yBAAyB,EAAE,CAAC,uBAAuB,CAAC;SACrD;KACF;CACF,CAAC;AAEF,kBAAe,CAAC,KAAK,CAAC,CAAC","sourcesContent":["import { PackageRules } from '..';\n\nlet rules: PackageRules = {\n package: 'ember-power-select',\n semverRange: '< 5.0.1',\n addonModules: {\n './components/power-select.js': {\n dependsOnComponents: [\n '{{power-select/before-options}}',\n '{{power-select/options}}',\n '{{power-select/power-select-group}}',\n '{{power-select/trigger}}',\n '{{power-select/search-message}}',\n '{{power-select/placeholder}}',\n ],\n },\n './components/power-select-multiple.js': {\n dependsOnComponents: ['{{power-select-multiple/trigger}}'],\n },\n },\n components: {\n '{{power-select}}': {\n layout: {\n addonPath: 'templates/components/power-select.hbs',\n },\n acceptsComponentArguments: [\n 'afterOptionsComponent',\n 'beforeOptionsComponent',\n 'optionsComponent',\n 'placeholderComponent',\n 'searchMessageComponent',\n 'selectedItemComponent',\n 'triggerComponent',\n ],\n },\n '{{power-select-multiple}}': {\n layout: {\n addonPath: 'templates/components/power-select-multiple.hbs',\n },\n acceptsComponentArguments: [\n 'afterOptionsComponent',\n 'beforeOptionsComponent',\n 'groupComponent',\n 'optionsComponent',\n 'placeholderComponent',\n 'searchMessageComponent',\n 'selectedItemComponent',\n 'triggerComponent',\n ],\n },\n '{{power-select/trigger}}': {\n layout: {\n addonPath: 'templates/components/power-select/trigger.hbs',\n },\n acceptsComponentArguments: ['selectedItemComponent', 'placeholderComponent'],\n },\n '{{power-select/options}}': {\n layout: {\n addonPath: 'templates/components/power-select/options.hbs',\n },\n acceptsComponentArguments: ['groupComponent', 'optionsComponent'],\n },\n '{{power-select-multiple/trigger}}': {\n layout: {\n addonPath: 'templates/components/power-select-multiple/trigger.hbs',\n },\n acceptsComponentArguments: ['selectedItemComponent'],\n },\n },\n};\n\nexport default [rules];\n"]}
@@ -1,4 +1,4 @@
1
1
  import V1InstanceCache from './v1-instance-cache';
2
2
  import { Package } from '@embroider/core';
3
3
  import { Node } from 'broccoli-node-api';
4
- export default function cachedBuildCompatAddon(originalPackage: Package, v1Cache: V1InstanceCache): Node;
4
+ export default function buildCompatAddon(originalPackage: Package, v1Cache: V1InstanceCache): Node;
@@ -5,18 +5,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const smoosh_package_json_1 = __importDefault(require("./smoosh-package-json"));
7
7
  const broccoli_merge_trees_1 = __importDefault(require("broccoli-merge-trees"));
8
- const one_shot_1 = __importDefault(require("./one-shot"));
9
8
  const broccoli_funnel_1 = __importDefault(require("broccoli-funnel"));
10
9
  const broccoli_source_1 = require("broccoli-source");
11
10
  const empty_package_tree_1 = __importDefault(require("./empty-package-tree"));
12
- function cachedBuildCompatAddon(originalPackage, v1Cache) {
13
- let tree = buildCompatAddon(originalPackage, v1Cache);
14
- if (!originalPackage.mayRebuild) {
15
- tree = one_shot_1.default.create(tree, originalPackage.name);
16
- }
17
- return tree;
18
- }
19
- exports.default = cachedBuildCompatAddon;
20
11
  function buildCompatAddon(originalPackage, v1Cache) {
21
12
  if (originalPackage.isV2Addon()) {
22
13
  // this case is needed when a native-v2 addon depends on a
@@ -53,6 +44,7 @@ function buildCompatAddon(originalPackage, v1Cache) {
53
44
  return oldPackages[0].v2Tree;
54
45
  }
55
46
  }
47
+ exports.default = buildCompatAddon;
56
48
  function withoutNodeModules(originalPackage) {
57
49
  let Klass = originalPackage.mayRebuild ? broccoli_source_1.WatchedDir : broccoli_source_1.UnwatchedDir;
58
50
  return (0, broccoli_funnel_1.default)(new Klass(originalPackage.root), {
@@ -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,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"]}
1
+ {"version":3,"file":"build-compat-addon.js","sourceRoot":"","sources":["build-compat-addon.ts"],"names":[],"mappings":";;;;;AAEA,gFAAsD;AACtD,gFAAsD;AAEtD,sEAA0C;AAC1C,qDAA2D;AAC3D,8EAAoD;AAEpD,SAAwB,gBAAgB,CAAC,eAAwB,EAAE,OAAwB;IACzF,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;AAtCD,mCAsCC;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 buildFunnel from 'broccoli-funnel';\nimport { UnwatchedDir, WatchedDir } from 'broccoli-source';\nimport EmptyPackageTree from './empty-package-tree';\n\nexport default function 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"]}
@@ -23,7 +23,12 @@ class RedirectToEmber extends broccoli_plugin_1.default {
23
23
  build() {
24
24
  if (!this.didBuild) {
25
25
  (0, fs_extra_1.copyFileSync)((0, path_1.join)(this.inputPaths[0], 'package.json'), (0, path_1.join)(this.outputPath, 'package.json'));
26
- (0, fs_extra_1.outputFileSync)((0, path_1.join)(this.outputPath, 'index.js'), `export { tracked } from '@ember/-internals/metal';`);
26
+ (0, fs_extra_1.outputFileSync)((0, path_1.join)(this.outputPath, 'index.js'),
27
+ // Prior to ember-source 4.1, cached didn't exist
28
+ // using this way of importing from metal, cached will be undefined if pre 4.1
29
+ `import * as metal from "@ember/-internals/metal";
30
+ const { cached, tracked } = metal;
31
+ export { cached, tracked };`);
27
32
  (0, fs_extra_1.outputFileSync)((0, path_1.join)(this.outputPath, 'primitives', 'cache.js'), `export { createCache, getValue, isConst } from "@ember/-internals/metal";`);
28
33
  this.didBuild = true;
29
34
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tracking.js","sourceRoot":"","sources":["tracking.ts"],"names":[],"mappings":";;;;;AAAA,8DAAqC;AACrC,sEAAqC;AACrC,+BAA4B;AAC5B,uCAAwD;AAExD;;;;;;;EAOE;AACF,MAAM,eAAgB,SAAQ,yBAAM;IAApC;;QACU,aAAQ,GAAG,KAAK,CAAC;IAa3B,CAAC;IAXC,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClB,IAAA,uBAAY,EAAC,IAAA,WAAI,EAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,EAAE,IAAA,WAAI,EAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC;YAC9F,IAAA,yBAAc,EAAC,IAAA,WAAI,EAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,oDAAoD,CAAC,CAAC;YACxG,IAAA,yBAAc,EACZ,IAAA,WAAI,EAAC,IAAI,CAAC,UAAU,EAAE,YAAY,EAAE,UAAU,CAAC,EAC/C,2EAA2E,CAC5E,CAAC;YACF,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;SACtB;IACH,CAAC;CACF;AAED,eAAqB,SAAQ,kBAAO;IAClC,IAAI,MAAM;QACR,OAAO,IAAI,eAAe,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7C,CAAC;CACF;AAJD,4BAIC","sourcesContent":["import V1Addon from '../../v1-addon';\nimport Plugin from 'broccoli-plugin';\nimport { join } from 'path';\nimport { outputFileSync, copyFileSync } from 'fs-extra';\n\n/*\n @glimmer/tracking is a real package but it has no working implementation. The\n real implementation is in ember-source.\n\n Since embroider prioritizes real packages, it's best to provide a compat\n adapter here to make it into a valid package. It's easy enough for it to\n reexport the things from ember that are needed.\n*/\nclass RedirectToEmber extends Plugin {\n private didBuild = false;\n\n build() {\n if (!this.didBuild) {\n copyFileSync(join(this.inputPaths[0], 'package.json'), join(this.outputPath, 'package.json'));\n outputFileSync(join(this.outputPath, 'index.js'), `export { tracked } from '@ember/-internals/metal';`);\n outputFileSync(\n join(this.outputPath, 'primitives', 'cache.js'),\n `export { createCache, getValue, isConst } from \"@ember/-internals/metal\";`\n );\n this.didBuild = true;\n }\n }\n}\n\nexport default class extends V1Addon {\n get v2Tree() {\n return new RedirectToEmber([super.v2Tree]);\n }\n}\n"]}
1
+ {"version":3,"file":"tracking.js","sourceRoot":"","sources":["tracking.ts"],"names":[],"mappings":";;;;;AAAA,8DAAqC;AACrC,sEAAqC;AACrC,+BAA4B;AAC5B,uCAAwD;AAExD;;;;;;;EAOE;AACF,MAAM,eAAgB,SAAQ,yBAAM;IAApC;;QACU,aAAQ,GAAG,KAAK,CAAC;IAoB3B,CAAC;IAlBC,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClB,IAAA,uBAAY,EAAC,IAAA,WAAI,EAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,EAAE,IAAA,WAAI,EAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC;YAC9F,IAAA,yBAAc,EACZ,IAAA,WAAI,EAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC;YACjC,iDAAiD;YACjD,8EAA8E;YAC9E;;4BAEoB,CACrB,CAAC;YACF,IAAA,yBAAc,EACZ,IAAA,WAAI,EAAC,IAAI,CAAC,UAAU,EAAE,YAAY,EAAE,UAAU,CAAC,EAC/C,2EAA2E,CAC5E,CAAC;YACF,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;SACtB;IACH,CAAC;CACF;AAED,eAAqB,SAAQ,kBAAO;IAClC,IAAI,MAAM;QACR,OAAO,IAAI,eAAe,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7C,CAAC;CACF;AAJD,4BAIC","sourcesContent":["import V1Addon from '../../v1-addon';\nimport Plugin from 'broccoli-plugin';\nimport { join } from 'path';\nimport { outputFileSync, copyFileSync } from 'fs-extra';\n\n/*\n @glimmer/tracking is a real package but it has no working implementation. The\n real implementation is in ember-source.\n\n Since embroider prioritizes real packages, it's best to provide a compat\n adapter here to make it into a valid package. It's easy enough for it to\n reexport the things from ember that are needed.\n*/\nclass RedirectToEmber extends Plugin {\n private didBuild = false;\n\n build() {\n if (!this.didBuild) {\n copyFileSync(join(this.inputPaths[0], 'package.json'), join(this.outputPath, 'package.json'));\n outputFileSync(\n join(this.outputPath, 'index.js'),\n // Prior to ember-source 4.1, cached didn't exist\n // using this way of importing from metal, cached will be undefined if pre 4.1\n `import * as metal from \"@ember/-internals/metal\";\nconst { cached, tracked } = metal;\nexport { cached, tracked };`\n );\n outputFileSync(\n join(this.outputPath, 'primitives', 'cache.js'),\n `export { createCache, getValue, isConst } from \"@ember/-internals/metal\";`\n );\n this.didBuild = true;\n }\n }\n}\n\nexport default class extends V1Addon {\n get v2Tree() {\n return new RedirectToEmber([super.v2Tree]);\n }\n}\n"]}
@@ -18,6 +18,16 @@ const build_compat_addon_1 = __importDefault(require("./build-compat-addon"));
18
18
  const options_1 = require("./options");
19
19
  const tree_sync_1 = __importDefault(require("tree-sync"));
20
20
  const broccoli_source_1 = require("broccoli-source");
21
+ // This build stage expects to be run with broccoli memoization enabled in order
22
+ // to get good rebuild performance. We turn it on by default here, but you can
23
+ // still explicitly turn it off by setting the env var to "false".
24
+ //
25
+ // As for safetly mutating process.env: broccoli doesn't read this until a Node
26
+ // executes its build hook, so as far as I can tell there's no way we could set
27
+ // this too late.
28
+ if (typeof process.env.BROCCOLI_ENABLED_MEMOIZE === 'undefined') {
29
+ process.env.BROCCOLI_ENABLED_MEMOIZE = 'true';
30
+ }
21
31
  class CompatAddons {
22
32
  constructor(legacyEmberAppInstance, maybeOptions) {
23
33
  this.didBuild = false;
@@ -1 +1 @@
1
- {"version":3,"file":"compat-addons.js","sourceRoot":"","sources":["compat-addons.ts"],"names":[],"mappings":";;;;;;;;;;;AACA,+BAA2D;AAC3D,uCAAiH;AACjH,0CAAgG;AAChG,4EAAkD;AAElD,2DAA6C;AAC7C,8EAAoD;AACpD,uCAAyD;AAEzD,0DAAiC;AACjC,qDAA6C;AAE7C,MAAqB,YAAY;IAQ/B,YAAY,sBAA8B,EAAE,YAAsB;QAP1D,aAAQ,GAAG,KAAK,CAAC;QAQvB,IAAI,OAAO,GAAG,IAAA,6BAAmB,EAAC,YAAY,CAAC,CAAC;QAChD,IAAI,OAAO,GAAG,2BAAe,CAAC,MAAM,CAAC,sBAAsB,EAAE,OAAO,CAAC,CAAC;QAEtE,0EAA0E;QAC1E,yEAAyE;QACzE,oDAAoD;QACpD,IAAA,wBAAa,EAAC,OAAO,CAAC,YAAa,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO,GAAG,IAAA,uBAAY,EAAC,OAAO,CAAC,YAAa,CAAC,CAAC;QAEnD,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtE,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QAClC,IAAI,CAAC,WAAW,GAAG,IAAI,OAAO,EAAE,CAAC;QACjC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,IAAI,IAAI;QACN,IAAI,WAAW,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAA,4BAAgB,EAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QAE5G,qEAAqE;QACrE,yEAAyE;QACzE,0EAA0E;QAC1E,iDAAiD;QACjD,IAAI,oBAAoB,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC;aAC5D,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC;aAC7B,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,4BAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QAExC,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QAC5F,OAAO,IAAI,mBAAY,CACrB,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,oBAAoB,EAAE,EAC/D,0BAA0B,EAC1B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CACtB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAC9B,IAAA,wBAAa,EAAC,IAAA,WAAI,EAAC,IAAI,CAAC,OAAO,EAAE,uBAAuB,CAAC,EAAE;YACzD,UAAU,EAAE,IAAA,eAAQ,EAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;SAC9D,CAAC,CAAC;QACH,OAAO;YACL,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,OAAO;YACrC,YAAY,EAAE,IAAI,CAAC,YAAY;SAChC,CAAC;IACJ,CAAC;IAED,IAAY,UAAU;QACpB,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;IACnC,CAAC;IAED,IAAY,GAAG;QACb,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;IAC/B,CAAC;IAEO,KAAK,CAAC,KAAK,CACjB,EACE,WAAW,EACX,WAAW,EACX,WAAW,GAKZ,EACD,UAAgC;QAEhC,6CAA6C;QAC7C,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClB,IAAA,uBAAY,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC;SAC5B;QAED,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE;YACzE,IAAI,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAEhD,uEAAuE;YACvE,6DAA6D;YAC7D,gBAAgB;YAChB,IAAI,QAAQ,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;YAEjC,yEAAyE;YACzE,yEAAyE;YACzE,QAAQ;YACR,IAAI,WAAW,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAA,wBAAiB,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;YAErE,IAAI,CAAC,YAAY,EAAE;gBACjB,IAAI,MAAM,GAAG,CAAC,iBAAiB,CAAC,CAAC;gBAEjC,IAAI,GAAG,GAAG,IAAA,eAAQ,EAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;gBACjD,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAA,iBAAU,EAAC,GAAG,CAAC,EAAE;oBAC7C,mEAAmE;oBACnE,8DAA8D;oBAC9D,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAEjB,IAAI,GAAG,KAAK,aAAa,EAAE;wBACzB,kEAAkE;wBAClE,oEAAoE;wBACpE,mCAAmC;wBACnC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;qBACtB;iBACF;gBAED,YAAY,GAAG,IAAI,mBAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE;oBAC3D,MAAM;iBACP,CAAC,CAAC;gBAEH,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;aAC5C;YAED,IACE,CAAC,IAAI,CAAC,QAAQ,IAAI,iCAAiC;gBACnD,CAAC,MAAM,CAAC,UAAU,IAAI,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,EACzD;gBACA,YAAY,CAAC,IAAI,EAAE,CAAC;gBACpB,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,QAAQ,EAAE;oBAC9B,kEAAkE;oBAClE,uCAAuC;oBACvC,IAAA,mBAAQ,EAAC,IAAA,WAAI,EAAC,WAAW,EAAE,cAAc,CAAC,EAAE,IAAA,WAAI,EAAC,MAAM,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;iBAChF;gBAED,iEAAiE;gBACjE,wEAAwE;gBACxE,WAAW;gBACX,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;aAC7C;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAClD,MAAM,IAAI,CAAC,YAAY,CAAC,mCAAmC,EAAE,CAAC;QAE9D,IAAI,UAAU,IAAI,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE;YAC7C,IAAA,mBAAQ,EAAC,WAAW,EAAE,IAAA,WAAI,EAAC,IAAI,CAAC,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,oBAAoB,CAAC,EAAE;gBAC/F,WAAW,EAAE,IAAI;gBACjB,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;SACJ;QAED,IAAI,UAAU,IAAI,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE;YAC7C,IAAA,mBAAQ,EAAC,WAAW,EAAE,IAAA,WAAI,EAAC,IAAI,CAAC,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,oBAAoB,CAAC,EAAE;gBAC/F,WAAW,EAAE,IAAI;gBACjB,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;SACJ;QAED,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClB,IAAI,CAAC,uBAAuB,EAAE,CAAC;SAChC;QACD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;IAC5B,CAAC;IAEO,uBAAuB;QAC7B,gCAAgC;QAChC,KAAK,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE;YAC9D,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE;gBAC7B,SAAS;aACV;YACD,KAAK,IAAI,GAAG,IAAI,MAAM,CAAC,iBAAiB,CAAC,MAAM,EAAE,EAAE;gBACjD,IAAI,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC7C,IAAI,KAAK,EAAE;oBACT,GAAG,GAAG,KAAK,CAAC;iBACb;gBACD,IAAI,MAAM,GAAG,IAAA,WAAI,EAAC,MAAM,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;gBACzD,IAAA,wBAAa,EAAC,IAAA,cAAO,EAAC,MAAM,CAAC,CAAC,CAAC;gBAC/B,IAAA,4BAAiB,EAAC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;aAC5C;SACF;QACD,6BAA6B;QAC7B,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,iBAAiB,EAAE;YAC3C,KAAK,IAAI,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,iBAAiB,CAAC,MAAM,EAAE,EAAE;gBAChE,IAAI,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC7C,IAAI,KAAK,EAAE;oBACT,GAAG,GAAG,KAAK,CAAC;iBACb;gBACD,IAAI,MAAM,GAAG,IAAA,WAAI,EAAC,IAAI,CAAC,UAAU,EAAE,cAAc,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC7D,IAAA,wBAAa,EAAC,IAAA,cAAO,EAAC,MAAM,CAAC,CAAC,CAAC;gBAC/B,IAAA,4BAAiB,EAAC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;aAC5C;SACF;IACH,CAAC;IAEO,oBAAoB,CAAC,KAAY,EAAE,WAAmB;QAC5D,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,kBAAkB,GAAG,EAAE,CAAC;QAC5B,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE;YACtD,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE;gBACvB,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;aAC7C;YACD,KAAK,EAAE,CAAC;SACT;QACD,OAAO;YACL,WAAW,EAAE,KAAK,CAAC,uBAAuB,CAAC,kBAAkB,CAAC;YAC9D,WAAW,EAAE,KAAK,CAAC,uBAAuB,CAAC,kBAAkB,CAAC;SAC/D,CAAC;IACJ,CAAC;IAGD,IAAY,UAAU;QACpB,IAAI,OAAiB,CAAC;QACtB,IAAI,OAAO,GAAkB,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;QAC7D,OAAO,EAAE,OAAO,EAAE,OAAQ,EAAE,OAAO,EAAE,CAAC;IACxC,CAAC;IAGO,OAAO,CAAC,GAAY;QAC1B,KAAK,IAAI,SAAS,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE;YACtD,IAAI,SAAS,KAAK,GAAG,EAAE;gBACrB,OAAO,IAAI,CAAC;aACb;SACF;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,iBAAiB,CAAC,GAAY,EAAE,QAAgB;QACtD,KAAK,IAAI,GAAG,IAAI,GAAG,CAAC,YAAY,EAAE;YAChC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;gBACtB,IAAA,4BAAiB,EAAC,GAAG,CAAC,IAAI,EAAE,IAAA,WAAI,EAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;aACnF;SACF;IACH,CAAC;CACF;AAvBC;IADC,IAAA,4BAAO,GAAE;8CAKT;AAGD;IADC,IAAA,4BAAO,GAAE;2CAQT;AA1NH,+BAmOC","sourcesContent":["import { Node } from 'broccoli-node-api';\nimport { join, relative, dirname, isAbsolute } from 'path';\nimport { emptyDirSync, ensureSymlinkSync, ensureDirSync, realpathSync, copySync, writeJSONSync } from 'fs-extra';\nimport { Stage, Package, PackageCache, WaitForTrees, mangledEngineRoot } from '@embroider/core';\nimport V1InstanceCache from './v1-instance-cache';\nimport { MovedPackageCache } from './moved-package-cache';\nimport { Memoize } from 'typescript-memoize';\nimport buildCompatAddon from './build-compat-addon';\nimport Options, { optionsWithDefaults } from './options';\nimport V1App from './v1-app';\nimport TreeSync from 'tree-sync';\nimport { WatchedDir } from 'broccoli-source';\n\nexport default class CompatAddons implements Stage {\n private didBuild = false;\n private destDir: string;\n private packageCache: MovedPackageCache;\n private treeSyncMap: WeakMap<Package, TreeSync>;\n private v1Cache: V1InstanceCache;\n readonly inputPath: string;\n\n constructor(legacyEmberAppInstance: object, maybeOptions?: Options) {\n let options = optionsWithDefaults(maybeOptions);\n let v1Cache = V1InstanceCache.forApp(legacyEmberAppInstance, options);\n\n // we want this to be stable across builds, because it becomes part of the\n // path to all of the files that the stage3 packager sees, and we want to\n // benefit from on-disk caching in stage3 packagers.\n ensureDirSync(options.workspaceDir!);\n this.destDir = realpathSync(options.workspaceDir!);\n\n this.packageCache = v1Cache.app.packageCache.moveAddons(this.destDir);\n this.inputPath = v1Cache.app.root;\n this.treeSyncMap = new WeakMap();\n this.v1Cache = v1Cache;\n }\n\n get tree(): Node {\n let movedAddons = [...this.packageCache.moved.keys()].map(oldPkg => buildCompatAddon(oldPkg, this.v1Cache));\n\n // these get watched so that EMBROIDER_REBUILD_ADDONS will still work\n // correctly, even for v2 addons that have no v1 addon deps and therefore\n // don't need to be moved. We don't consume these trees in our build step,\n // we only do this to trigger rebuilds to happen.\n let watchedUnmovedAddons = [...this.packageCache.unmovedAddons]\n .filter(pkg => pkg.mayRebuild)\n .map(pkg => new WatchedDir(pkg.root));\n\n let { synthVendor, synthStyles } = this.getSyntheticPackages(this.v1Cache.app, movedAddons);\n return new WaitForTrees(\n { movedAddons, synthVendor, synthStyles, watchedUnmovedAddons },\n '@embroider/compat/addons',\n this.build.bind(this)\n );\n }\n\n async ready(): Promise<{ outputPath: string; packageCache: PackageCache }> {\n await this.deferReady.promise;\n writeJSONSync(join(this.destDir, '.embroider-reuse.json'), {\n appDestDir: relative(this.destDir, this.packageCache.appRoot),\n });\n return {\n outputPath: this.packageCache.appRoot,\n packageCache: this.packageCache,\n };\n }\n\n private get appDestDir(): string {\n return this.packageCache.appRoot;\n }\n\n private get app(): Package {\n return this.packageCache.app;\n }\n\n private async build(\n {\n movedAddons,\n synthVendor,\n synthStyles,\n }: {\n movedAddons: string[];\n synthVendor: string;\n synthStyles: string;\n },\n changedMap: Map<string, boolean>\n ) {\n // empty the directory only on the first pass\n if (!this.didBuild) {\n emptyDirSync(this.destDir);\n }\n\n [...this.packageCache.moved.entries()].forEach(([oldPkg, newPkg], index) => {\n let treeInstance = this.treeSyncMap.get(newPkg);\n\n // we need to pull metadata off the oldPkg, not the newPkg, because the\n // newPkg doesn't actually have anything in it yet (including\n // package.json)\n let isEngine = oldPkg.isEngine();\n\n // Engines get built not into their real package name, but a mangled one.\n // Their real one needs to be free for us to merge all their dependencies\n // into.\n let destination = isEngine ? mangledEngineRoot(newPkg) : newPkg.root;\n\n if (!treeInstance) {\n let ignore = ['**/node_modules'];\n\n let rel = relative(destination, this.appDestDir);\n if (!rel.startsWith('..') && !isAbsolute(rel)) {\n // the app is inside our addon. We must not copy the app as part of\n // the addon, because that would overwrite the real app build.\n ignore.push(rel);\n\n if (rel === 'tests/dummy') {\n // special case: classic dummy apps are weird because they put the\n // tests (which are truly part of the app, not the addon) inside the\n // addon instead of inside the app.\n ignore.push('tests');\n }\n }\n\n treeInstance = new TreeSync(movedAddons[index], destination, {\n ignore,\n });\n\n this.treeSyncMap.set(newPkg, treeInstance);\n }\n\n if (\n !this.didBuild || // always copy on the first build\n (newPkg.mayRebuild && changedMap.get(movedAddons[index]))\n ) {\n treeInstance.sync();\n if (!this.didBuild && isEngine) {\n // The first time we encounter an engine, we also create the empty\n // shell for its real module namespace.\n copySync(join(destination, 'package.json'), join(newPkg.root, 'package.json'));\n }\n\n // for engines, this isn't the mangled destination (we don't need\n // resolvable node_modules there), this is the empty shell of their real\n // location\n this.linkNonCopiedDeps(newPkg, newPkg.root);\n }\n });\n\n this.linkNonCopiedDeps(this.app, this.appDestDir);\n await this.packageCache.updatePreexistingResolvableSymlinks();\n\n if (changedMap && changedMap.get(synthVendor)) {\n copySync(synthVendor, join(this.appDestDir, 'node_modules', '@embroider', 'synthesized-vendor'), {\n dereference: true,\n overwrite: true,\n });\n }\n\n if (changedMap && changedMap.get(synthStyles)) {\n copySync(synthStyles, join(this.appDestDir, 'node_modules', '@embroider', 'synthesized-styles'), {\n dereference: true,\n overwrite: true,\n });\n }\n\n if (!this.didBuild) {\n this.handleNonResolvableDeps();\n }\n this.didBuild = true;\n this.deferReady.resolve();\n }\n\n private handleNonResolvableDeps() {\n // non-resolvable deps in addons\n for (let [oldPkg, newPkg] of this.packageCache.moved.entries()) {\n if (!oldPkg.nonResolvableDeps) {\n continue;\n }\n for (let dep of oldPkg.nonResolvableDeps.values()) {\n let moved = this.packageCache.moved.get(dep);\n if (moved) {\n dep = moved;\n }\n let target = join(newPkg.root, 'node_modules', dep.name);\n ensureDirSync(dirname(target));\n ensureSymlinkSync(dep.root, target, 'dir');\n }\n }\n // non-resolvable deps in app\n if (this.packageCache.app.nonResolvableDeps) {\n for (let dep of this.packageCache.app.nonResolvableDeps.values()) {\n let moved = this.packageCache.moved.get(dep);\n if (moved) {\n dep = moved;\n }\n let target = join(this.appDestDir, 'node_modules', dep.name);\n ensureDirSync(dirname(target));\n ensureSymlinkSync(dep.root, target, 'dir');\n }\n }\n }\n\n private getSyntheticPackages(v1App: V1App, movedAddons: Node[]): { synthVendor: Node; synthStyles: Node } {\n let index = 0;\n let upgradedAddonTrees = [];\n for (let [oldPkg] of this.packageCache.moved.entries()) {\n if (!oldPkg.isV2Ember()) {\n upgradedAddonTrees.push(movedAddons[index]);\n }\n index++;\n }\n return {\n synthVendor: v1App.synthesizeVendorPackage(upgradedAddonTrees),\n synthStyles: v1App.synthesizeStylesPackage(upgradedAddonTrees),\n };\n }\n\n @Memoize()\n private get deferReady() {\n let resolve: Function;\n let promise: Promise<void> = new Promise(r => (resolve = r));\n return { resolve: resolve!, promise };\n }\n\n @Memoize()\n private isMoved(pkg: Package) {\n for (let candidate of this.packageCache.moved.values()) {\n if (candidate === pkg) {\n return true;\n }\n }\n return false;\n }\n\n private linkNonCopiedDeps(pkg: Package, destRoot: string) {\n for (let dep of pkg.dependencies) {\n if (!this.isMoved(dep)) {\n ensureSymlinkSync(dep.root, join(destRoot, 'node_modules', dep.packageJSON.name));\n }\n }\n }\n}\n"]}
1
+ {"version":3,"file":"compat-addons.js","sourceRoot":"","sources":["compat-addons.ts"],"names":[],"mappings":"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","sourcesContent":["import { Node } from 'broccoli-node-api';\nimport { join, relative, dirname, isAbsolute } from 'path';\nimport { emptyDirSync, ensureSymlinkSync, ensureDirSync, realpathSync, copySync, writeJSONSync } from 'fs-extra';\nimport { Stage, Package, PackageCache, WaitForTrees, mangledEngineRoot } from '@embroider/core';\nimport V1InstanceCache from './v1-instance-cache';\nimport { MovedPackageCache } from './moved-package-cache';\nimport { Memoize } from 'typescript-memoize';\nimport buildCompatAddon from './build-compat-addon';\nimport Options, { optionsWithDefaults } from './options';\nimport V1App from './v1-app';\nimport TreeSync from 'tree-sync';\nimport { WatchedDir } from 'broccoli-source';\n\n// This build stage expects to be run with broccoli memoization enabled in order\n// to get good rebuild performance. We turn it on by default here, but you can\n// still explicitly turn it off by setting the env var to \"false\".\n//\n// As for safetly mutating process.env: broccoli doesn't read this until a Node\n// executes its build hook, so as far as I can tell there's no way we could set\n// this too late.\nif (typeof process.env.BROCCOLI_ENABLED_MEMOIZE === 'undefined') {\n process.env.BROCCOLI_ENABLED_MEMOIZE = 'true';\n}\n\nexport default class CompatAddons implements Stage {\n private didBuild = false;\n private destDir: string;\n private packageCache: MovedPackageCache;\n private treeSyncMap: WeakMap<Package, TreeSync>;\n private v1Cache: V1InstanceCache;\n readonly inputPath: string;\n\n constructor(legacyEmberAppInstance: object, maybeOptions?: Options) {\n let options = optionsWithDefaults(maybeOptions);\n let v1Cache = V1InstanceCache.forApp(legacyEmberAppInstance, options);\n\n // we want this to be stable across builds, because it becomes part of the\n // path to all of the files that the stage3 packager sees, and we want to\n // benefit from on-disk caching in stage3 packagers.\n ensureDirSync(options.workspaceDir!);\n this.destDir = realpathSync(options.workspaceDir!);\n\n this.packageCache = v1Cache.app.packageCache.moveAddons(this.destDir);\n this.inputPath = v1Cache.app.root;\n this.treeSyncMap = new WeakMap();\n this.v1Cache = v1Cache;\n }\n\n get tree(): Node {\n let movedAddons = [...this.packageCache.moved.keys()].map(oldPkg => buildCompatAddon(oldPkg, this.v1Cache));\n\n // these get watched so that EMBROIDER_REBUILD_ADDONS will still work\n // correctly, even for v2 addons that have no v1 addon deps and therefore\n // don't need to be moved. We don't consume these trees in our build step,\n // we only do this to trigger rebuilds to happen.\n let watchedUnmovedAddons = [...this.packageCache.unmovedAddons]\n .filter(pkg => pkg.mayRebuild)\n .map(pkg => new WatchedDir(pkg.root));\n\n let { synthVendor, synthStyles } = this.getSyntheticPackages(this.v1Cache.app, movedAddons);\n return new WaitForTrees(\n { movedAddons, synthVendor, synthStyles, watchedUnmovedAddons },\n '@embroider/compat/addons',\n this.build.bind(this)\n );\n }\n\n async ready(): Promise<{ outputPath: string; packageCache: PackageCache }> {\n await this.deferReady.promise;\n writeJSONSync(join(this.destDir, '.embroider-reuse.json'), {\n appDestDir: relative(this.destDir, this.packageCache.appRoot),\n });\n return {\n outputPath: this.packageCache.appRoot,\n packageCache: this.packageCache,\n };\n }\n\n private get appDestDir(): string {\n return this.packageCache.appRoot;\n }\n\n private get app(): Package {\n return this.packageCache.app;\n }\n\n private async build(\n {\n movedAddons,\n synthVendor,\n synthStyles,\n }: {\n movedAddons: string[];\n synthVendor: string;\n synthStyles: string;\n },\n changedMap: Map<string, boolean>\n ) {\n // empty the directory only on the first pass\n if (!this.didBuild) {\n emptyDirSync(this.destDir);\n }\n\n [...this.packageCache.moved.entries()].forEach(([oldPkg, newPkg], index) => {\n let treeInstance = this.treeSyncMap.get(newPkg);\n\n // we need to pull metadata off the oldPkg, not the newPkg, because the\n // newPkg doesn't actually have anything in it yet (including\n // package.json)\n let isEngine = oldPkg.isEngine();\n\n // Engines get built not into their real package name, but a mangled one.\n // Their real one needs to be free for us to merge all their dependencies\n // into.\n let destination = isEngine ? mangledEngineRoot(newPkg) : newPkg.root;\n\n if (!treeInstance) {\n let ignore = ['**/node_modules'];\n\n let rel = relative(destination, this.appDestDir);\n if (!rel.startsWith('..') && !isAbsolute(rel)) {\n // the app is inside our addon. We must not copy the app as part of\n // the addon, because that would overwrite the real app build.\n ignore.push(rel);\n\n if (rel === 'tests/dummy') {\n // special case: classic dummy apps are weird because they put the\n // tests (which are truly part of the app, not the addon) inside the\n // addon instead of inside the app.\n ignore.push('tests');\n }\n }\n\n treeInstance = new TreeSync(movedAddons[index], destination, {\n ignore,\n });\n\n this.treeSyncMap.set(newPkg, treeInstance);\n }\n\n if (\n !this.didBuild || // always copy on the first build\n (newPkg.mayRebuild && changedMap.get(movedAddons[index]))\n ) {\n treeInstance.sync();\n if (!this.didBuild && isEngine) {\n // The first time we encounter an engine, we also create the empty\n // shell for its real module namespace.\n copySync(join(destination, 'package.json'), join(newPkg.root, 'package.json'));\n }\n\n // for engines, this isn't the mangled destination (we don't need\n // resolvable node_modules there), this is the empty shell of their real\n // location\n this.linkNonCopiedDeps(newPkg, newPkg.root);\n }\n });\n\n this.linkNonCopiedDeps(this.app, this.appDestDir);\n await this.packageCache.updatePreexistingResolvableSymlinks();\n\n if (changedMap && changedMap.get(synthVendor)) {\n copySync(synthVendor, join(this.appDestDir, 'node_modules', '@embroider', 'synthesized-vendor'), {\n dereference: true,\n overwrite: true,\n });\n }\n\n if (changedMap && changedMap.get(synthStyles)) {\n copySync(synthStyles, join(this.appDestDir, 'node_modules', '@embroider', 'synthesized-styles'), {\n dereference: true,\n overwrite: true,\n });\n }\n\n if (!this.didBuild) {\n this.handleNonResolvableDeps();\n }\n this.didBuild = true;\n this.deferReady.resolve();\n }\n\n private handleNonResolvableDeps() {\n // non-resolvable deps in addons\n for (let [oldPkg, newPkg] of this.packageCache.moved.entries()) {\n if (!oldPkg.nonResolvableDeps) {\n continue;\n }\n for (let dep of oldPkg.nonResolvableDeps.values()) {\n let moved = this.packageCache.moved.get(dep);\n if (moved) {\n dep = moved;\n }\n let target = join(newPkg.root, 'node_modules', dep.name);\n ensureDirSync(dirname(target));\n ensureSymlinkSync(dep.root, target, 'dir');\n }\n }\n // non-resolvable deps in app\n if (this.packageCache.app.nonResolvableDeps) {\n for (let dep of this.packageCache.app.nonResolvableDeps.values()) {\n let moved = this.packageCache.moved.get(dep);\n if (moved) {\n dep = moved;\n }\n let target = join(this.appDestDir, 'node_modules', dep.name);\n ensureDirSync(dirname(target));\n ensureSymlinkSync(dep.root, target, 'dir');\n }\n }\n }\n\n private getSyntheticPackages(v1App: V1App, movedAddons: Node[]): { synthVendor: Node; synthStyles: Node } {\n let index = 0;\n let upgradedAddonTrees = [];\n for (let [oldPkg] of this.packageCache.moved.entries()) {\n if (!oldPkg.isV2Ember()) {\n upgradedAddonTrees.push(movedAddons[index]);\n }\n index++;\n }\n return {\n synthVendor: v1App.synthesizeVendorPackage(upgradedAddonTrees),\n synthStyles: v1App.synthesizeStylesPackage(upgradedAddonTrees),\n };\n }\n\n @Memoize()\n private get deferReady() {\n let resolve: Function;\n let promise: Promise<void> = new Promise(r => (resolve = r));\n return { resolve: resolve!, promise };\n }\n\n @Memoize()\n private isMoved(pkg: Package) {\n for (let candidate of this.packageCache.moved.values()) {\n if (candidate === pkg) {\n return true;\n }\n }\n return false;\n }\n\n private linkNonCopiedDeps(pkg: Package, destRoot: string) {\n for (let dep of pkg.dependencies) {\n if (!this.isMoved(dep)) {\n ensureSymlinkSync(dep.root, join(destRoot, 'node_modules', dep.packageJSON.name));\n }\n }\n }\n}\n"]}
@@ -75,6 +75,10 @@ function makeResolverTransform(resolver) {
75
75
  handleComponentHelper(node.params[0], resolver, filename, scopeStack);
76
76
  return;
77
77
  }
78
+ if (node.path.original === 'helper' && node.params.length > 0) {
79
+ handleDynamicHelper(node.params[0], resolver, filename);
80
+ return;
81
+ }
78
82
  resolver.resolveSubExpression(node.path.original, filename, node.path.loc);
79
83
  },
80
84
  MustacheStatement(node) {
@@ -98,6 +102,10 @@ function makeResolverTransform(resolver) {
98
102
  handleComponentHelper(node.params[0], resolver, filename, scopeStack);
99
103
  return;
100
104
  }
105
+ if (node.path.original === 'helper' && node.params.length > 0) {
106
+ handleDynamicHelper(node.params[0], resolver, filename);
107
+ return;
108
+ }
101
109
  let hasArgs = node.params.length > 0 || node.hash.pairs.length > 0;
102
110
  let resolution = resolver.resolveMustache(node.path.original, hasArgs, filename, node.path.loc);
103
111
  if (resolution && resolution.type === 'component') {
@@ -299,30 +307,17 @@ function handleComponentHelper(param, resolver, moduleName, scopeStack, impliedB
299
307
  return;
300
308
  }
301
309
  resolver.resolveComponentHelper(locator, moduleName, param.loc, impliedBecause);
302
- // if (
303
- // param.type === 'MustacheStatement' &&
304
- // param.hash.pairs.length === 0 &&
305
- // param.params.length === 0 &&
306
- // handleComponentHelper(param.path, resolver, moduleName, scopeStack)
307
- // ) {
308
- // return;
309
- // }
310
- // if (
311
- // param.type === 'MustacheStatement' &&
312
- // param.path.type === 'PathExpression' &&
313
- // param.path.original === 'component'
314
- // ) {
315
- // // safe because we will handle this inner `{{component ...}}` mustache on its own
316
- // return;
317
- // }
318
- // if (param.type === 'TextNode') {
319
- // resolver.resolveComponentHelper({ type: 'literal', path: param.chars }, moduleName, param.loc);
320
- // return;
321
- // }
322
- // if (param.type === 'SubExpression' && param.path.type === 'PathExpression' && param.path.original === 'component') {
323
- // // safe because we will handle this inner `(component ...)` subexpression on its own
324
- // return;
325
- // }
326
- // resolver.unresolvableComponentArgument(componentName, argumentName, moduleName, param.loc);
310
+ }
311
+ function handleDynamicHelper(param, resolver, moduleName) {
312
+ switch (param.type) {
313
+ case 'StringLiteral':
314
+ resolver.resolveDynamicHelper({ type: 'literal', path: param.value }, moduleName, param.loc);
315
+ break;
316
+ case 'TextNode':
317
+ resolver.resolveDynamicHelper({ type: 'literal', path: param.chars }, moduleName, param.loc);
318
+ break;
319
+ default:
320
+ resolver.resolveDynamicHelper({ type: 'other' }, moduleName, param.loc);
321
+ }
327
322
  }
328
323
  //# sourceMappingURL=resolver-transform.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolver-transform.js","sourceRoot":"","sources":["resolver-transform.ts"],"names":[],"mappings":"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","sourcesContent":["import { default as Resolver, ComponentResolution, ComponentLocator } from './resolver';\nimport type { ASTv1 } from '@glimmer/syntax';\n\n// This is the AST transform that resolves components, helpers and modifiers at build time\n// and puts them into `dependencies`.\nexport function makeResolverTransform(resolver: Resolver) {\n function resolverTransform({ filename }: { filename: string }) {\n resolver.enter(filename);\n\n let scopeStack = new ScopeStack();\n\n return {\n name: 'embroider-build-time-resolver',\n\n visitor: {\n Program: {\n enter(node: ASTv1.Program) {\n scopeStack.push(node.blockParams);\n },\n exit() {\n scopeStack.pop();\n },\n },\n BlockStatement(node: ASTv1.BlockStatement) {\n if (node.path.type !== 'PathExpression') {\n return;\n }\n if (scopeStack.inScope(node.path.parts[0])) {\n return;\n }\n if (node.path.this === true) {\n return;\n }\n if (node.path.parts.length > 1) {\n // paths with a dot in them (which therefore split into more than\n // one \"part\") are classically understood by ember to be contextual\n // components, which means there's nothing to resolve at this\n // location.\n return;\n }\n if (node.path.original === 'component' && node.params.length > 0) {\n handleComponentHelper(node.params[0], resolver, filename, scopeStack);\n return;\n }\n // a block counts as args from our perpsective (it's enough to prove\n // this thing must be a component, not content)\n let hasArgs = true;\n const resolution = resolver.resolveMustache(node.path.original, hasArgs, filename, node.path.loc);\n if (resolution && resolution.type === 'component') {\n scopeStack.enteringComponentBlock(resolution, ({ argumentsAreComponents }) => {\n for (let name of argumentsAreComponents) {\n let pair = node.hash.pairs.find((pair: ASTv1.HashPair) => pair.key === name);\n if (pair) {\n handleComponentHelper(pair.value, resolver, filename, scopeStack, {\n componentName: (node.path as ASTv1.PathExpression).original,\n argumentName: name,\n });\n }\n }\n });\n }\n },\n SubExpression(node: ASTv1.SubExpression) {\n if (node.path.type !== 'PathExpression') {\n return;\n }\n if (node.path.this === true) {\n return;\n }\n if (scopeStack.inScope(node.path.parts[0])) {\n return;\n }\n if (node.path.original === 'component' && node.params.length > 0) {\n handleComponentHelper(node.params[0], resolver, filename, scopeStack);\n return;\n }\n resolver.resolveSubExpression(node.path.original, filename, node.path.loc);\n },\n MustacheStatement(node: ASTv1.MustacheStatement) {\n if (node.path.type !== 'PathExpression') {\n return;\n }\n if (scopeStack.inScope(node.path.parts[0])) {\n return;\n }\n if (node.path.this === true) {\n return;\n }\n if (node.path.parts.length > 1) {\n // paths with a dot in them (which therefore split into more than\n // one \"part\") are classically understood by ember to be contextual\n // components, which means there's nothing to resolve at this\n // location.\n return;\n }\n if (node.path.original === 'component' && node.params.length > 0) {\n handleComponentHelper(node.params[0], resolver, filename, scopeStack);\n return;\n }\n let hasArgs = node.params.length > 0 || node.hash.pairs.length > 0;\n let resolution = resolver.resolveMustache(node.path.original, hasArgs, filename, node.path.loc);\n if (resolution && resolution.type === 'component') {\n for (let name of resolution.argumentsAreComponents) {\n let pair = node.hash.pairs.find((pair: ASTv1.HashPair) => pair.key === name);\n if (pair) {\n handleComponentHelper(pair.value, resolver, filename, scopeStack, {\n componentName: node.path.original,\n argumentName: name,\n });\n }\n }\n }\n },\n ElementModifierStatement(node: ASTv1.ElementModifierStatement) {\n if (node.path.type !== 'PathExpression') {\n return;\n }\n if (scopeStack.inScope(node.path.parts[0])) {\n return;\n }\n if (node.path.this === true) {\n return;\n }\n if (node.path.data === true) {\n return;\n }\n if (node.path.parts.length > 1) {\n // paths with a dot in them (which therefore split into more than\n // one \"part\") are classically understood by ember to be contextual\n // components. With the introduction of `Template strict mode` in Ember 3.25\n // it is also possible to pass modifiers this way which means there's nothing\n // to resolve at this location.\n return;\n }\n\n resolver.resolveElementModifierStatement(node.path.original, filename, node.path.loc);\n },\n ElementNode: {\n enter(node: ASTv1.ElementNode) {\n if (!scopeStack.inScope(node.tag.split('.')[0])) {\n const resolution = resolver.resolveElement(node.tag, filename, node.loc);\n if (resolution && resolution.type === 'component') {\n scopeStack.enteringComponentBlock(resolution, ({ argumentsAreComponents }) => {\n for (let name of argumentsAreComponents) {\n let attr = node.attributes.find((attr: ASTv1.AttrNode) => attr.name === '@' + name);\n if (attr) {\n handleComponentHelper(attr.value, resolver, filename, scopeStack, {\n componentName: node.tag,\n argumentName: name,\n });\n }\n }\n });\n }\n }\n scopeStack.push(node.blockParams);\n },\n exit() {\n scopeStack.pop();\n },\n },\n },\n };\n }\n resolverTransform.parallelBabel = {\n requireFile: __filename,\n buildUsing: 'makeResolverTransform',\n params: Resolver,\n };\n return resolverTransform;\n}\n\ninterface ComponentBlockMarker {\n type: 'componentBlockMarker';\n resolution: ComponentResolution;\n argumentsAreComponents: string[];\n exit: (marker: ComponentBlockMarker) => void;\n}\n\ntype ScopeEntry = { type: 'blockParams'; blockParams: string[] } | ComponentBlockMarker;\n\nclass ScopeStack {\n private stack: ScopeEntry[] = [];\n\n // as we enter a block, we push the block params onto here to mark them as\n // being in scope\n push(blockParams: string[]) {\n this.stack.unshift({ type: 'blockParams', blockParams });\n }\n\n // and when we leave the block they go out of scope. If this block was tagged\n // by a safe component marker, we also clear that.\n pop() {\n this.stack.shift();\n let next = this.stack[0];\n if (next && next.type === 'componentBlockMarker') {\n next.exit(next);\n this.stack.shift();\n }\n }\n\n // right before we enter a block, we might determine that some of the values\n // that will be yielded as marked (by a rule) as safe to be used with the\n // {{component}} helper.\n enteringComponentBlock(resolution: ComponentResolution, exit: ComponentBlockMarker['exit']) {\n this.stack.unshift({\n type: 'componentBlockMarker',\n resolution,\n argumentsAreComponents: resolution.argumentsAreComponents.slice(),\n exit,\n });\n }\n\n inScope(name: string) {\n for (let scope of this.stack) {\n if (scope.type === 'blockParams' && scope.blockParams.includes(name)) {\n return true;\n }\n }\n return false;\n }\n\n safeComponentInScope(name: string): boolean {\n let parts = name.split('.');\n if (parts.length > 2) {\n // we let component rules specify that they yield components or objects\n // containing components. But not deeper than that. So the max path length\n // that can refer to a marked-safe component is two segments.\n return false;\n }\n for (let i = 0; i < this.stack.length - 1; i++) {\n let here = this.stack[i];\n let next = this.stack[i + 1];\n if (here.type === 'blockParams' && next.type === 'componentBlockMarker') {\n let positionalIndex = here.blockParams.indexOf(parts[0]);\n if (positionalIndex === -1) {\n continue;\n }\n\n if (parts.length === 1) {\n if (next.resolution.yieldsComponents[positionalIndex] === true) {\n return true;\n }\n let sourceArg = next.resolution.yieldsArguments[positionalIndex];\n if (typeof sourceArg === 'string') {\n next.argumentsAreComponents.push(sourceArg);\n return true;\n }\n } else {\n let entry = next.resolution.yieldsComponents[positionalIndex];\n if (entry && typeof entry === 'object') {\n return entry[parts[1]] === true;\n }\n\n let argsEntry = next.resolution.yieldsArguments[positionalIndex];\n if (argsEntry && typeof argsEntry === 'object') {\n let sourceArg = argsEntry[parts[1]];\n if (typeof sourceArg === 'string') {\n next.argumentsAreComponents.push(sourceArg);\n return true;\n }\n }\n }\n // we found the source of the name, but there were no rules to cover it.\n // Don't keep searching higher, those are different names.\n return false;\n }\n }\n return false;\n }\n}\n\nfunction handleComponentHelper(\n param: ASTv1.Node,\n resolver: Resolver,\n moduleName: string,\n scopeStack: ScopeStack,\n impliedBecause?: { componentName: string; argumentName: string }\n): void {\n let locator: ComponentLocator;\n switch (param.type) {\n case 'StringLiteral':\n locator = { type: 'literal', path: param.value };\n break;\n case 'PathExpression':\n locator = { type: 'path', path: param.original };\n break;\n case 'MustacheStatement':\n if (param.hash.pairs.length === 0 && param.params.length === 0) {\n handleComponentHelper(param.path, resolver, moduleName, scopeStack, impliedBecause);\n return;\n } else if (param.path.type === 'PathExpression' && param.path.original === 'component') {\n // safe because we will handle this inner `{{component ...}}` mustache on its own\n return;\n } else {\n locator = { type: 'other' };\n }\n break;\n case 'TextNode':\n locator = { type: 'literal', path: param.chars };\n break;\n case 'SubExpression':\n if (param.path.type === 'PathExpression' && param.path.original === 'component') {\n // safe because we will handle this inner `(component ...)` subexpression on its own\n return;\n }\n if (param.path.type === 'PathExpression' && param.path.original === 'ensure-safe-component') {\n // safe because we trust ensure-safe-component\n return;\n }\n locator = { type: 'other' };\n break;\n default:\n locator = { type: 'other' };\n }\n\n if (locator.type === 'path' && scopeStack.safeComponentInScope(locator.path)) {\n return;\n }\n\n resolver.resolveComponentHelper(locator, moduleName, param.loc, impliedBecause);\n\n // if (\n // param.type === 'MustacheStatement' &&\n // param.hash.pairs.length === 0 &&\n // param.params.length === 0 &&\n // handleComponentHelper(param.path, resolver, moduleName, scopeStack)\n // ) {\n // return;\n // }\n\n // if (\n // param.type === 'MustacheStatement' &&\n // param.path.type === 'PathExpression' &&\n // param.path.original === 'component'\n // ) {\n // // safe because we will handle this inner `{{component ...}}` mustache on its own\n // return;\n // }\n\n // if (param.type === 'TextNode') {\n // resolver.resolveComponentHelper({ type: 'literal', path: param.chars }, moduleName, param.loc);\n // return;\n // }\n\n // if (param.type === 'SubExpression' && param.path.type === 'PathExpression' && param.path.original === 'component') {\n // // safe because we will handle this inner `(component ...)` subexpression on its own\n // return;\n // }\n\n // resolver.unresolvableComponentArgument(componentName, argumentName, moduleName, param.loc);\n}\n"]}
1
+ {"version":3,"file":"resolver-transform.js","sourceRoot":"","sources":["resolver-transform.ts"],"names":[],"mappings":"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","sourcesContent":["import { default as Resolver, ComponentResolution, ComponentLocator } from './resolver';\nimport type { ASTv1 } from '@glimmer/syntax';\n\n// This is the AST transform that resolves components, helpers and modifiers at build time\n// and puts them into `dependencies`.\nexport function makeResolverTransform(resolver: Resolver) {\n function resolverTransform({ filename }: { filename: string }) {\n resolver.enter(filename);\n\n let scopeStack = new ScopeStack();\n\n return {\n name: 'embroider-build-time-resolver',\n\n visitor: {\n Program: {\n enter(node: ASTv1.Program) {\n scopeStack.push(node.blockParams);\n },\n exit() {\n scopeStack.pop();\n },\n },\n BlockStatement(node: ASTv1.BlockStatement) {\n if (node.path.type !== 'PathExpression') {\n return;\n }\n if (scopeStack.inScope(node.path.parts[0])) {\n return;\n }\n if (node.path.this === true) {\n return;\n }\n if (node.path.parts.length > 1) {\n // paths with a dot in them (which therefore split into more than\n // one \"part\") are classically understood by ember to be contextual\n // components, which means there's nothing to resolve at this\n // location.\n return;\n }\n if (node.path.original === 'component' && node.params.length > 0) {\n handleComponentHelper(node.params[0], resolver, filename, scopeStack);\n return;\n }\n // a block counts as args from our perpsective (it's enough to prove\n // this thing must be a component, not content)\n let hasArgs = true;\n const resolution = resolver.resolveMustache(node.path.original, hasArgs, filename, node.path.loc);\n if (resolution && resolution.type === 'component') {\n scopeStack.enteringComponentBlock(resolution, ({ argumentsAreComponents }) => {\n for (let name of argumentsAreComponents) {\n let pair = node.hash.pairs.find((pair: ASTv1.HashPair) => pair.key === name);\n if (pair) {\n handleComponentHelper(pair.value, resolver, filename, scopeStack, {\n componentName: (node.path as ASTv1.PathExpression).original,\n argumentName: name,\n });\n }\n }\n });\n }\n },\n SubExpression(node: ASTv1.SubExpression) {\n if (node.path.type !== 'PathExpression') {\n return;\n }\n if (node.path.this === true) {\n return;\n }\n if (scopeStack.inScope(node.path.parts[0])) {\n return;\n }\n if (node.path.original === 'component' && node.params.length > 0) {\n handleComponentHelper(node.params[0], resolver, filename, scopeStack);\n return;\n }\n if (node.path.original === 'helper' && node.params.length > 0) {\n handleDynamicHelper(node.params[0], resolver, filename);\n return;\n }\n resolver.resolveSubExpression(node.path.original, filename, node.path.loc);\n },\n MustacheStatement(node: ASTv1.MustacheStatement) {\n if (node.path.type !== 'PathExpression') {\n return;\n }\n if (scopeStack.inScope(node.path.parts[0])) {\n return;\n }\n if (node.path.this === true) {\n return;\n }\n if (node.path.parts.length > 1) {\n // paths with a dot in them (which therefore split into more than\n // one \"part\") are classically understood by ember to be contextual\n // components, which means there's nothing to resolve at this\n // location.\n return;\n }\n if (node.path.original === 'component' && node.params.length > 0) {\n handleComponentHelper(node.params[0], resolver, filename, scopeStack);\n return;\n }\n if (node.path.original === 'helper' && node.params.length > 0) {\n handleDynamicHelper(node.params[0], resolver, filename);\n return;\n }\n let hasArgs = node.params.length > 0 || node.hash.pairs.length > 0;\n let resolution = resolver.resolveMustache(node.path.original, hasArgs, filename, node.path.loc);\n if (resolution && resolution.type === 'component') {\n for (let name of resolution.argumentsAreComponents) {\n let pair = node.hash.pairs.find((pair: ASTv1.HashPair) => pair.key === name);\n if (pair) {\n handleComponentHelper(pair.value, resolver, filename, scopeStack, {\n componentName: node.path.original,\n argumentName: name,\n });\n }\n }\n }\n },\n ElementModifierStatement(node: ASTv1.ElementModifierStatement) {\n if (node.path.type !== 'PathExpression') {\n return;\n }\n if (scopeStack.inScope(node.path.parts[0])) {\n return;\n }\n if (node.path.this === true) {\n return;\n }\n if (node.path.data === true) {\n return;\n }\n if (node.path.parts.length > 1) {\n // paths with a dot in them (which therefore split into more than\n // one \"part\") are classically understood by ember to be contextual\n // components. With the introduction of `Template strict mode` in Ember 3.25\n // it is also possible to pass modifiers this way which means there's nothing\n // to resolve at this location.\n return;\n }\n\n resolver.resolveElementModifierStatement(node.path.original, filename, node.path.loc);\n },\n ElementNode: {\n enter(node: ASTv1.ElementNode) {\n if (!scopeStack.inScope(node.tag.split('.')[0])) {\n const resolution = resolver.resolveElement(node.tag, filename, node.loc);\n if (resolution && resolution.type === 'component') {\n scopeStack.enteringComponentBlock(resolution, ({ argumentsAreComponents }) => {\n for (let name of argumentsAreComponents) {\n let attr = node.attributes.find((attr: ASTv1.AttrNode) => attr.name === '@' + name);\n if (attr) {\n handleComponentHelper(attr.value, resolver, filename, scopeStack, {\n componentName: node.tag,\n argumentName: name,\n });\n }\n }\n });\n }\n }\n scopeStack.push(node.blockParams);\n },\n exit() {\n scopeStack.pop();\n },\n },\n },\n };\n }\n resolverTransform.parallelBabel = {\n requireFile: __filename,\n buildUsing: 'makeResolverTransform',\n params: Resolver,\n };\n return resolverTransform;\n}\n\ninterface ComponentBlockMarker {\n type: 'componentBlockMarker';\n resolution: ComponentResolution;\n argumentsAreComponents: string[];\n exit: (marker: ComponentBlockMarker) => void;\n}\n\ntype ScopeEntry = { type: 'blockParams'; blockParams: string[] } | ComponentBlockMarker;\n\nclass ScopeStack {\n private stack: ScopeEntry[] = [];\n\n // as we enter a block, we push the block params onto here to mark them as\n // being in scope\n push(blockParams: string[]) {\n this.stack.unshift({ type: 'blockParams', blockParams });\n }\n\n // and when we leave the block they go out of scope. If this block was tagged\n // by a safe component marker, we also clear that.\n pop() {\n this.stack.shift();\n let next = this.stack[0];\n if (next && next.type === 'componentBlockMarker') {\n next.exit(next);\n this.stack.shift();\n }\n }\n\n // right before we enter a block, we might determine that some of the values\n // that will be yielded as marked (by a rule) as safe to be used with the\n // {{component}} helper.\n enteringComponentBlock(resolution: ComponentResolution, exit: ComponentBlockMarker['exit']) {\n this.stack.unshift({\n type: 'componentBlockMarker',\n resolution,\n argumentsAreComponents: resolution.argumentsAreComponents.slice(),\n exit,\n });\n }\n\n inScope(name: string) {\n for (let scope of this.stack) {\n if (scope.type === 'blockParams' && scope.blockParams.includes(name)) {\n return true;\n }\n }\n return false;\n }\n\n safeComponentInScope(name: string): boolean {\n let parts = name.split('.');\n if (parts.length > 2) {\n // we let component rules specify that they yield components or objects\n // containing components. But not deeper than that. So the max path length\n // that can refer to a marked-safe component is two segments.\n return false;\n }\n for (let i = 0; i < this.stack.length - 1; i++) {\n let here = this.stack[i];\n let next = this.stack[i + 1];\n if (here.type === 'blockParams' && next.type === 'componentBlockMarker') {\n let positionalIndex = here.blockParams.indexOf(parts[0]);\n if (positionalIndex === -1) {\n continue;\n }\n\n if (parts.length === 1) {\n if (next.resolution.yieldsComponents[positionalIndex] === true) {\n return true;\n }\n let sourceArg = next.resolution.yieldsArguments[positionalIndex];\n if (typeof sourceArg === 'string') {\n next.argumentsAreComponents.push(sourceArg);\n return true;\n }\n } else {\n let entry = next.resolution.yieldsComponents[positionalIndex];\n if (entry && typeof entry === 'object') {\n return entry[parts[1]] === true;\n }\n\n let argsEntry = next.resolution.yieldsArguments[positionalIndex];\n if (argsEntry && typeof argsEntry === 'object') {\n let sourceArg = argsEntry[parts[1]];\n if (typeof sourceArg === 'string') {\n next.argumentsAreComponents.push(sourceArg);\n return true;\n }\n }\n }\n // we found the source of the name, but there were no rules to cover it.\n // Don't keep searching higher, those are different names.\n return false;\n }\n }\n return false;\n }\n}\n\nfunction handleComponentHelper(\n param: ASTv1.Node,\n resolver: Resolver,\n moduleName: string,\n scopeStack: ScopeStack,\n impliedBecause?: { componentName: string; argumentName: string }\n): void {\n let locator: ComponentLocator;\n switch (param.type) {\n case 'StringLiteral':\n locator = { type: 'literal', path: param.value };\n break;\n case 'PathExpression':\n locator = { type: 'path', path: param.original };\n break;\n case 'MustacheStatement':\n if (param.hash.pairs.length === 0 && param.params.length === 0) {\n handleComponentHelper(param.path, resolver, moduleName, scopeStack, impliedBecause);\n return;\n } else if (param.path.type === 'PathExpression' && param.path.original === 'component') {\n // safe because we will handle this inner `{{component ...}}` mustache on its own\n return;\n } else {\n locator = { type: 'other' };\n }\n break;\n case 'TextNode':\n locator = { type: 'literal', path: param.chars };\n break;\n case 'SubExpression':\n if (param.path.type === 'PathExpression' && param.path.original === 'component') {\n // safe because we will handle this inner `(component ...)` subexpression on its own\n return;\n }\n if (param.path.type === 'PathExpression' && param.path.original === 'ensure-safe-component') {\n // safe because we trust ensure-safe-component\n return;\n }\n locator = { type: 'other' };\n break;\n default:\n locator = { type: 'other' };\n }\n\n if (locator.type === 'path' && scopeStack.safeComponentInScope(locator.path)) {\n return;\n }\n\n resolver.resolveComponentHelper(locator, moduleName, param.loc, impliedBecause);\n}\n\nfunction handleDynamicHelper(param: ASTv1.Node, resolver: Resolver, moduleName: string): void {\n switch (param.type) {\n case 'StringLiteral':\n resolver.resolveDynamicHelper({ type: 'literal', path: param.value }, moduleName, param.loc);\n break;\n case 'TextNode':\n resolver.resolveDynamicHelper({ type: 'literal', path: param.chars }, moduleName, param.loc);\n break;\n default:\n resolver.resolveDynamicHelper({ type: 'other' }, moduleName, param.loc);\n }\n}\n"]}
package/src/resolver.d.ts CHANGED
@@ -108,6 +108,7 @@ export default class CompatResolver implements Resolver {
108
108
  componentName: string;
109
109
  argumentName: string;
110
110
  }): Resolution | null;
111
+ resolveDynamicHelper(helper: ComponentLocator, from: string, loc: Loc): Resolution | null;
111
112
  }
112
113
  export declare type ComponentLocator = {
113
114
  type: 'literal';
package/src/resolver.js CHANGED
@@ -39,12 +39,14 @@ const builtInHelpers = [
39
39
  'hasBlock',
40
40
  'hasBlockParams',
41
41
  'hash',
42
+ 'helper',
42
43
  'if',
43
44
  'input',
44
45
  'let',
45
46
  'link-to',
46
47
  'loc',
47
48
  'log',
49
+ // 'modifier',
48
50
  'mount',
49
51
  'mut',
50
52
  'on',
@@ -632,6 +634,35 @@ class CompatResolver {
632
634
  loc,
633
635
  }, from);
634
636
  }
637
+ resolveDynamicHelper(helper, from, loc) {
638
+ if (!this.staticHelpersEnabled) {
639
+ return null;
640
+ }
641
+ if (helper.type === 'literal') {
642
+ let helperName = helper.path;
643
+ if (builtInHelpers.includes(helperName)) {
644
+ return null;
645
+ }
646
+ let found = this.tryHelper(helperName, from);
647
+ if (found) {
648
+ return this.add(found, from);
649
+ }
650
+ return this.add({
651
+ type: 'error',
652
+ message: `Missing helper`,
653
+ detail: helperName,
654
+ loc,
655
+ }, from);
656
+ }
657
+ else {
658
+ return this.add({
659
+ type: 'error',
660
+ message: 'Unsafe dynamic helper',
661
+ detail: `cannot statically analyze this expression`,
662
+ loc,
663
+ }, from);
664
+ }
665
+ }
635
666
  }
636
667
  __decorate([
637
668
  (0, typescript_memoize_1.Memoize)()