@embroider/compat 1.8.3 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/package.json +7 -8
  2. package/src/audit/capture.d.ts +1 -0
  3. package/src/compat-adapters/ember-cli-fastboot.d.ts +1 -1
  4. package/src/compat-adapters/ember-cli-fastboot.js.map +1 -1
  5. package/src/compat-addons.js +10 -1
  6. package/src/compat-addons.js.map +1 -1
  7. package/src/compat-app.js +12 -38
  8. package/src/compat-app.js.map +1 -1
  9. package/src/dasherize-component-name.d.ts +1 -0
  10. package/src/dasherize-component-name.js +10 -1
  11. package/src/dasherize-component-name.js.map +1 -1
  12. package/src/default-pipeline.js +2 -2
  13. package/src/default-pipeline.js.map +1 -1
  14. package/src/dependency-rules.js +6 -1
  15. package/src/dependency-rules.js.map +1 -1
  16. package/src/{template-compiler-broccoli-plugin.d.ts → hbs-to-js-broccoli-plugin.d.ts} +2 -4
  17. package/src/hbs-to-js-broccoli-plugin.js +39 -0
  18. package/src/hbs-to-js-broccoli-plugin.js.map +1 -0
  19. package/src/moved-package-cache.js +5 -1
  20. package/src/moved-package-cache.js.map +1 -1
  21. package/src/resolver-transform.d.ts +11 -27
  22. package/src/resolver-transform.js +163 -65
  23. package/src/resolver-transform.js.map +1 -1
  24. package/src/resolver.d.ts +26 -27
  25. package/src/resolver.js +125 -169
  26. package/src/resolver.js.map +1 -1
  27. package/src/synthesize-template-only-components.js +8 -8
  28. package/src/synthesize-template-only-components.js.map +1 -1
  29. package/src/v1-addon.d.ts +2 -26
  30. package/src/v1-addon.js +29 -68
  31. package/src/v1-addon.js.map +1 -1
  32. package/src/v1-app.d.ts +3 -2
  33. package/src/v1-app.js +11 -3
  34. package/src/v1-app.js.map +1 -1
  35. package/src/template-compiler-broccoli-plugin.js +0 -28
  36. package/src/template-compiler-broccoli-plugin.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"dependency-rules.js","sourceRoot":"","sources":["dependency-rules.ts"],"names":[],"mappings":"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","sourcesContent":["import { Package, explicitRelative, getOrCreate } from '@embroider/core';\nimport { satisfies } from 'semver';\nimport CompatResolver from './resolver';\nimport { dirname } from 'path';\n\nexport interface PackageRules {\n // This whole set of rules will only apply when the given addon package\n // matching the given semver range is present and active.\n package: string;\n semverRange?: string;\n\n components?: {\n // I would prefer to write the key type here as `ComponentSnippet` to aid\n // documentation, but Typescript won't allow it. See ComponentSnippet below.\n [key: string]: ComponentRules;\n };\n\n addonModules?: {\n // `filename` is relative to your package root, and it assumes v2 package\n // format. Like \"templates/components/foo.hbs\".\n [filename: string]: ModuleRules;\n };\n\n appModules?: {\n // `filename` is relative to the app's root, and it assumes v2 package\n // format. Like \"templates/components/foo.hbs\".\n [filename: string]: ModuleRules;\n };\n\n addonTemplates?: {\n // `filename` is relative to your package root, and it assumes v2 package\n // format. Like \"templates/foo.hbs\".\n [filename: string]: TemplateRules;\n };\n\n appTemplates?: {\n // `filename` is relative to the app's root, and it assumes v2 package\n // format. Like \"templates/foo.hbs\".\n [filename: string]: TemplateRules;\n };\n}\n\nexport interface ActivePackageRules extends PackageRules {\n // the location(s) of active packages that match this rule.\n roots: string[];\n}\n\nexport interface TemplateRules {\n // Tells embroider which list of components may be needed for a given path.\n // For example, if your template says `{{component this.panel}}` and you know\n // that `this.panel` can be either \"light-panel\" or \"dark-panel\", you would\n // say: `invokes: { \"this.panel\": [\"<LightPanel/>\", \"<DarkPanel/>\"] }`\n invokes?: {\n [path: string]: ComponentSnippet[];\n };\n}\n\nexport interface ComponentRules extends TemplateRules {\n // This declares that our component yields other components that are safe to\n // invoke with the {{component}} helper.\n //\n // The array corresponds to your yielded positional arguments. Any value that\n // is true is considered a safe component. Any value can be a hash in which\n // individual keys that are true are considered safe components.\n //\n // Examples:\n //\n // If you do: {{yield (component \"x\") }}\n // Then say: yieldsSafeComponents: [true]\n //\n // If you do: {{yield (hash x=(component \"x\") y=(component \"y\")) }}\n // Then say: yieldsSafeComponents: [{x: true, y: true}]\n //\n yieldsSafeComponents?: (boolean | { [name: string]: boolean })[];\n\n // This declares that our component yields some of its arguments unchanged.\n //\n // The array corresponds to your yielded positional arguments. Each value can\n // be:\n // false, meaning this yielded value is not one of our arguments\n // a string, meaning this yielded value is our argument with that name\n // or a POJO, whose individual properties are string naming which arguments\n // from whence they came.\n //\n // Examples:\n //\n // If you do: {{yield @foo}}\n // Then say: yieldsArguments: ['foo']\n //\n // If you do: {{yield (hash x=@foo) }}\n // Then say: yieldsArguments: [{ x: 'foo' }]\n yieldsArguments?: (string | { [name: string]: string })[];\n\n // This declares that our component accepts arguments that will be invoked\n // with the {{component}} helper. This silences warnings in the places where\n // we consume them, while introducing warnings in the places where people are\n // passing them to us (if they are doing so in a way that is too dynamic to\n // analyze).\n //\n // If you use this, you may also need to set `layout`, see below.\n acceptsComponentArguments?: ArgumentMapping[];\n\n // If you want to use `acceptsComponentArguments` on a component that\n // customies its own `layout` (which is most addon-provided components), you\n // need to tell us here how to find its template by setting either `addonPath`\n // or `appPath`.\n layout?: {\n // This is a path relative to the addon root, assuming V2 format.\n addonPath?: string;\n // This is the path relative to the app root, assuming V2 format.\n appPath?: string;\n };\n\n // An unresolvable component is usually a build error (when your app has the\n // staticComponent Option enabled). But you can tell Embroider to ignore it by\n // setting this.\n safeToIgnore?: boolean;\n}\n\nexport interface ModuleRules {\n // We will resolve these components into the corresponding JS and HBS files\n // and generate imports such that this module depends on them.\n dependsOnComponents?: ComponentSnippet[];\n\n // This adds new imports to our module, as if they were really there. Helpful\n // for working around addons that depend on things but don't say so.\n dependsOnModules?: string[];\n}\n\n// The bare \"string\" short form implies that `becomes` is the same as `name`.\nexport type ArgumentMapping =\n | string\n | {\n // the name of the argument you accept\n name: string;\n // the name its consumed as in your template\n becomes: string;\n };\n\n// A component snippet is a string containing valid HBS that is a single\n// component invocation. We use it to refer to components in a way that doesn't\n// require any new syntax or rules, and that's necessarily supported by whatever\n// build-time template resolver is in use.\n//\n// Examples of valid ComponentSnippets:\n//\n// \"{{my-component}}\"\n// \"{{my-component/foo}}\"\n// \"<MyComponent />\"\n// \"{{component 'my-component'}}\"\n//\ntype ComponentSnippet = string;\n\nexport interface PreprocessedComponentRule {\n yieldsSafeComponents: Required<ComponentRules>['yieldsSafeComponents'];\n yieldsArguments: Required<ComponentRules>['yieldsArguments'];\n dependsOnComponents: ComponentSnippet[];\n argumentsAreComponents: string[];\n safeInteriorPaths: string[];\n}\n\n// take a component rule from the authoring format to a format more optimized\n// for consumption in the resolver\nexport function preprocessComponentRule(componentRules: ComponentRules): PreprocessedComponentRule {\n let argumentsAreComponents = [];\n let safeInteriorPaths = [];\n let dependsOnComponents = [];\n if (componentRules.acceptsComponentArguments) {\n for (let entry of componentRules.acceptsComponentArguments) {\n let name, interior;\n if (typeof entry === 'string') {\n name = interior = entry;\n } else {\n name = entry.name;\n interior = entry.becomes;\n }\n if (name.startsWith('@')) {\n name = name.slice(1);\n }\n argumentsAreComponents.push(name);\n safeInteriorPaths.push(interior);\n }\n }\n if (componentRules.invokes) {\n for (let [path, snippets] of Object.entries(componentRules.invokes)) {\n safeInteriorPaths.push(path);\n for (let snippet of snippets) {\n dependsOnComponents.push(snippet);\n }\n }\n }\n return {\n argumentsAreComponents,\n safeInteriorPaths,\n dependsOnComponents,\n yieldsSafeComponents: componentRules.yieldsSafeComponents || [],\n yieldsArguments: componentRules.yieldsArguments || [],\n };\n}\n\nexport function activePackageRules(packageRules: PackageRules[], activePackages: Package[]): ActivePackageRules[] {\n // rule order implies precedence. The first rule that matches a given package\n // applies to that package, and no other rule does.\n let rootsPerRule = new Map();\n for (let pkg of activePackages) {\n for (let rule of packageRules) {\n if (rule.package === pkg.name && (!rule.semverRange || satisfies(pkg.version, rule.semverRange))) {\n let roots = getOrCreate(rootsPerRule, rule, () => []);\n roots.push(pkg.root);\n break;\n }\n }\n }\n let output = [];\n for (let [rule, roots] of rootsPerRule) {\n output.push(Object.assign({ roots }, rule));\n }\n return output;\n}\n\nexport function expandModuleRules(absPath: string, moduleRules: ModuleRules, resolver: CompatResolver) {\n let output: { absPath: string; target: string; runtimeName: string }[] = [];\n if (moduleRules.dependsOnModules) {\n for (let path of moduleRules.dependsOnModules) {\n let found = resolver.resolveImport(path, absPath);\n if (!found) {\n throw new Error(`can't locate ${path} referred to in module rules:${JSON.stringify(moduleRules, null, 2)}`);\n }\n output.push({\n absPath,\n target: explicitRelative(dirname(absPath), found.absPath),\n runtimeName: found.runtimeName,\n });\n }\n }\n if (moduleRules.dependsOnComponents) {\n for (let snippet of moduleRules.dependsOnComponents) {\n let found = resolver.resolveComponentSnippet(snippet, moduleRules);\n for (let { absPath: target, runtimeName } of found.modules) {\n output.push({ absPath, target: explicitRelative(dirname(absPath), target), runtimeName });\n }\n }\n }\n return output;\n}\n"]}
1
+ {"version":3,"file":"dependency-rules.js","sourceRoot":"","sources":["dependency-rules.ts"],"names":[],"mappings":"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","sourcesContent":["import { Package, explicitRelative, getOrCreate } from '@embroider/core';\nimport { satisfies } from 'semver';\nimport CompatResolver from './resolver';\nimport { dirname } from 'path';\n\nexport interface PackageRules {\n // This whole set of rules will only apply when the given addon package\n // matching the given semver range is present and active.\n package: string;\n semverRange?: string;\n\n components?: {\n // I would prefer to write the key type here as `ComponentSnippet` to aid\n // documentation, but Typescript won't allow it. See ComponentSnippet below.\n [key: string]: ComponentRules;\n };\n\n addonModules?: {\n // `filename` is relative to your package root, and it assumes v2 package\n // format. Like \"templates/components/foo.hbs\".\n [filename: string]: ModuleRules;\n };\n\n appModules?: {\n // `filename` is relative to the app's root, and it assumes v2 package\n // format. Like \"templates/components/foo.hbs\".\n [filename: string]: ModuleRules;\n };\n\n addonTemplates?: {\n // `filename` is relative to your package root, and it assumes v2 package\n // format. Like \"templates/foo.hbs\".\n [filename: string]: TemplateRules;\n };\n\n appTemplates?: {\n // `filename` is relative to the app's root, and it assumes v2 package\n // format. Like \"templates/foo.hbs\".\n [filename: string]: TemplateRules;\n };\n}\n\nexport interface ActivePackageRules extends PackageRules {\n // the location(s) of active packages that match this rule.\n roots: string[];\n}\n\nexport interface TemplateRules {\n // Tells embroider which list of components may be needed for a given path.\n // For example, if your template says `{{component this.panel}}` and you know\n // that `this.panel` can be either \"light-panel\" or \"dark-panel\", you would\n // say: `invokes: { \"this.panel\": [\"<LightPanel/>\", \"<DarkPanel/>\"] }`\n invokes?: {\n [path: string]: ComponentSnippet[];\n };\n}\n\nexport interface ComponentRules extends TemplateRules {\n // This declares that our component yields other components that are safe to\n // invoke with the {{component}} helper.\n //\n // The array corresponds to your yielded positional arguments. Any value that\n // is true is considered a safe component. Any value can be a hash in which\n // individual keys that are true are considered safe components.\n //\n // Examples:\n //\n // If you do: {{yield (component \"x\") }}\n // Then say: yieldsSafeComponents: [true]\n //\n // If you do: {{yield (hash x=(component \"x\") y=(component \"y\")) }}\n // Then say: yieldsSafeComponents: [{x: true, y: true}]\n //\n yieldsSafeComponents?: (boolean | { [name: string]: boolean })[];\n\n // This declares that our component yields some of its arguments unchanged.\n //\n // The array corresponds to your yielded positional arguments. Each value can\n // be:\n // false, meaning this yielded value is not one of our arguments\n // a string, meaning this yielded value is our argument with that name\n // or a POJO, whose individual properties are string naming which arguments\n // from whence they came.\n //\n // Examples:\n //\n // If you do: {{yield @foo}}\n // Then say: yieldsArguments: ['foo']\n //\n // If you do: {{yield (hash x=@foo) }}\n // Then say: yieldsArguments: [{ x: 'foo' }]\n yieldsArguments?: (string | { [name: string]: string })[];\n\n // This declares that our component accepts arguments that will be invoked\n // with the {{component}} helper. This silences warnings in the places where\n // we consume them, while introducing warnings in the places where people are\n // passing them to us (if they are doing so in a way that is too dynamic to\n // analyze).\n //\n // If you use this, you may also need to set `layout`, see below.\n acceptsComponentArguments?: ArgumentMapping[];\n\n // If you want to use `acceptsComponentArguments` on a component that\n // customies its own `layout` (which is most addon-provided components), you\n // need to tell us here how to find its template by setting either `addonPath`\n // or `appPath`.\n layout?: {\n // This is a path relative to the addon root, assuming V2 format.\n addonPath?: string;\n // This is the path relative to the app root, assuming V2 format.\n appPath?: string;\n };\n\n // An unresolvable component is usually a build error (when your app has the\n // staticComponent Option enabled). But you can tell Embroider to ignore it by\n // setting this.\n safeToIgnore?: boolean;\n}\n\nexport interface ModuleRules {\n // We will resolve these components into the corresponding JS and HBS files\n // and generate imports such that this module depends on them.\n dependsOnComponents?: ComponentSnippet[];\n\n // This adds new imports to our module, as if they were really there. Helpful\n // for working around addons that depend on things but don't say so.\n dependsOnModules?: string[];\n}\n\n// The bare \"string\" short form implies that `becomes` is the same as `name`.\nexport type ArgumentMapping =\n | string\n | {\n // the name of the argument you accept\n name: string;\n // the name its consumed as in your template\n becomes: string;\n };\n\n// A component snippet is a string containing valid HBS that is a single\n// component invocation. We use it to refer to components in a way that doesn't\n// require any new syntax or rules, and that's necessarily supported by whatever\n// build-time template resolver is in use.\n//\n// Examples of valid ComponentSnippets:\n//\n// \"{{my-component}}\"\n// \"{{my-component/foo}}\"\n// \"<MyComponent />\"\n// \"{{component 'my-component'}}\"\n//\ntype ComponentSnippet = string;\n\nexport interface PreprocessedComponentRule {\n yieldsSafeComponents: Required<ComponentRules>['yieldsSafeComponents'];\n yieldsArguments: Required<ComponentRules>['yieldsArguments'];\n dependsOnComponents: ComponentSnippet[];\n argumentsAreComponents: string[];\n safeInteriorPaths: string[];\n}\n\n// take a component rule from the authoring format to a format more optimized\n// for consumption in the resolver\nexport function preprocessComponentRule(componentRules: ComponentRules): PreprocessedComponentRule {\n let argumentsAreComponents = [];\n let safeInteriorPaths = [];\n let dependsOnComponents = [];\n if (componentRules.acceptsComponentArguments) {\n for (let entry of componentRules.acceptsComponentArguments) {\n let name, interior;\n if (typeof entry === 'string') {\n name = interior = entry;\n } else {\n name = entry.name;\n interior = entry.becomes;\n }\n if (name.startsWith('@')) {\n name = name.slice(1);\n }\n argumentsAreComponents.push(name);\n safeInteriorPaths.push(interior);\n }\n }\n if (componentRules.invokes) {\n for (let [path, snippets] of Object.entries(componentRules.invokes)) {\n safeInteriorPaths.push(path);\n for (let snippet of snippets) {\n dependsOnComponents.push(snippet);\n }\n }\n }\n return {\n argumentsAreComponents,\n safeInteriorPaths,\n dependsOnComponents,\n yieldsSafeComponents: componentRules.yieldsSafeComponents || [],\n yieldsArguments: componentRules.yieldsArguments || [],\n };\n}\n\nexport function activePackageRules(packageRules: PackageRules[], activePackages: Package[]): ActivePackageRules[] {\n // rule order implies precedence. The first rule that matches a given package\n // applies to that package, and no other rule does.\n let rootsPerRule = new Map();\n for (let pkg of activePackages) {\n for (let rule of packageRules) {\n if (rule.package === pkg.name && (!rule.semverRange || satisfies(pkg.version, rule.semverRange))) {\n let roots = getOrCreate(rootsPerRule, rule, () => []);\n roots.push(pkg.root);\n break;\n }\n }\n }\n let output = [];\n for (let [rule, roots] of rootsPerRule) {\n output.push(Object.assign({ roots }, rule));\n }\n return output;\n}\n\nexport function expandModuleRules(absPath: string, moduleRules: ModuleRules, resolver: CompatResolver) {\n let output: { absPath: string; target: string; runtimeName: string }[] = [];\n if (moduleRules.dependsOnModules) {\n for (let path of moduleRules.dependsOnModules) {\n let found = resolver.resolveImport(path, absPath);\n if (!found) {\n throw new Error(`can't locate ${path} referred to in module rules:${JSON.stringify(moduleRules, null, 2)}`);\n }\n output.push({\n absPath,\n target: explicitRelative(dirname(absPath), found.absPath),\n runtimeName: found.runtimeName,\n });\n }\n }\n if (moduleRules.dependsOnComponents) {\n for (let snippet of moduleRules.dependsOnComponents) {\n let found = resolver.resolveComponentSnippet(snippet, moduleRules);\n if (found.jsModule) {\n let { absPath: target, runtimeName } = found.jsModule;\n output.push({ absPath, target: explicitRelative(dirname(absPath), target), runtimeName });\n }\n if (found.hbsModule) {\n let { absPath: target, runtimeName } = found.hbsModule;\n output.push({ absPath, target: explicitRelative(dirname(absPath), target), runtimeName });\n }\n }\n }\n return output;\n}\n"]}
@@ -1,10 +1,8 @@
1
1
  import type { Node } from 'broccoli-node-api';
2
2
  import Filter from 'broccoli-persistent-filter';
3
- import type { TemplateCompiler } from '@embroider/core';
4
3
  export default class TemplateCompileTree extends Filter {
5
- private templateCompiler;
6
- constructor(inputTree: Node, templateCompiler: TemplateCompiler);
4
+ constructor(inputTree: Node);
5
+ getDestFilePath(relativePath: string, entry: Parameters<Filter['getDestFilePath']>[1]): string | null;
7
6
  processString(source: string, relativePath: string): string;
8
- cacheKeyProcessString(source: string, relativePath: string): string;
9
7
  baseDir(): string;
10
8
  }
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const broccoli_persistent_filter_1 = __importDefault(require("broccoli-persistent-filter"));
7
+ const core_1 = require("@embroider/core");
8
+ const path_1 = require("path");
9
+ class TemplateCompileTree extends broccoli_persistent_filter_1.default {
10
+ constructor(inputTree) {
11
+ super(inputTree, {
12
+ name: `embroider-template-compile-stage1`,
13
+ persist: true,
14
+ extensions: ['hbs', 'handlebars'],
15
+ });
16
+ }
17
+ getDestFilePath(relativePath, entry) {
18
+ if (this.isDirectory(relativePath, entry)) {
19
+ return null;
20
+ }
21
+ for (let ext of ['hbs', 'handlebars']) {
22
+ if (relativePath.slice(-ext.length - 1) === '.' + ext) {
23
+ // we deliberately don't chop off the .hbs before appending .js, because if
24
+ // the user has both .js` and .hbs` side-by-side we don't want our new file
25
+ // to collide with theirs.
26
+ return relativePath + '.js';
27
+ }
28
+ }
29
+ return null;
30
+ }
31
+ processString(source, relativePath) {
32
+ return (0, core_1.hbsToJS)(source, { filename: relativePath });
33
+ }
34
+ baseDir() {
35
+ return (0, path_1.join)(__dirname, '..');
36
+ }
37
+ }
38
+ exports.default = TemplateCompileTree;
39
+ //# sourceMappingURL=hbs-to-js-broccoli-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hbs-to-js-broccoli-plugin.js","sourceRoot":"","sources":["hbs-to-js-broccoli-plugin.ts"],"names":[],"mappings":";;;;;AACA,4FAAgD;AAChD,0CAA0C;AAC1C,+BAA4B;AAE5B,MAAqB,mBAAoB,SAAQ,oCAAM;IACrD,YAAY,SAAe;QACzB,KAAK,CAAC,SAAS,EAAE;YACf,IAAI,EAAE,mCAAmC;YACzC,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC;SAClC,CAAC,CAAC;IACL,CAAC;IAED,eAAe,CAAC,YAAoB,EAAE,KAA+C;QACnF,IAAI,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,KAAK,CAAC,EAAE;YACzC,OAAO,IAAI,CAAC;SACb;QACD,KAAK,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC,EAAE;YACrC,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG,GAAG,GAAG,EAAE;gBACrD,2EAA2E;gBAC3E,2EAA2E;gBAC3E,0BAA0B;gBAC1B,OAAO,YAAY,GAAG,KAAK,CAAC;aAC7B;SACF;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,aAAa,CAAC,MAAc,EAAE,YAAoB;QAChD,OAAO,IAAA,cAAO,EAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;IACrD,CAAC;IACD,OAAO;QACL,OAAO,IAAA,WAAI,EAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC;CACF;AA9BD,sCA8BC","sourcesContent":["import type { Node } from 'broccoli-node-api';\nimport Filter from 'broccoli-persistent-filter';\nimport { hbsToJS } from '@embroider/core';\nimport { join } from 'path';\n\nexport default class TemplateCompileTree extends Filter {\n constructor(inputTree: Node) {\n super(inputTree, {\n name: `embroider-template-compile-stage1`,\n persist: true,\n extensions: ['hbs', 'handlebars'],\n });\n }\n\n getDestFilePath(relativePath: string, entry: Parameters<Filter['getDestFilePath']>[1]) {\n if (this.isDirectory(relativePath, entry)) {\n return null;\n }\n for (let ext of ['hbs', 'handlebars']) {\n if (relativePath.slice(-ext.length - 1) === '.' + ext) {\n // we deliberately don't chop off the .hbs before appending .js, because if\n // the user has both .js` and .hbs` side-by-side we don't want our new file\n // to collide with theirs.\n return relativePath + '.js';\n }\n }\n return null;\n }\n\n processString(source: string, relativePath: string) {\n return hbsToJS(source, { filename: relativePath });\n }\n baseDir() {\n return join(__dirname, '..');\n }\n}\n"]}
@@ -5,14 +5,18 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
5
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
6
  return c > 3 && r && Object.defineProperty(target, key, r), r;
7
7
  };
8
+ var __importDefault = (this && this.__importDefault) || function (mod) {
9
+ return (mod && mod.__esModule) ? mod : { "default": mod };
10
+ };
8
11
  Object.defineProperty(exports, "__esModule", { value: true });
9
12
  exports.MovedPackageCache = exports.MovablePackageCache = void 0;
10
13
  const path_1 = require("path");
11
14
  const fs_extra_1 = require("fs-extra");
12
15
  const typescript_memoize_1 = require("typescript-memoize");
13
16
  const core_1 = require("@embroider/core");
17
+ const os_1 = __importDefault(require("os"));
14
18
  function assertNoTildeExpansion(source, target) {
15
- if (target.includes('~')) {
19
+ if (target.includes('~') && os_1.default.platform() !== 'win32') {
16
20
  throw new Error(`The symbolic link: ${source}'s target: ${target} contained a bash expansion '~' which is not supported.`);
17
21
  }
18
22
  }
@@ -1 +1 @@
1
- {"version":3,"file":"moved-package-cache.js","sourceRoot":"","sources":["moved-package-cache.ts"],"names":[],"mappings":"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","sourcesContent":["import { join, sep, isAbsolute } from 'path';\nimport { ensureSymlinkSync, readdirSync, realpathSync, lstatSync } from 'fs-extra';\nimport { Memoize } from 'typescript-memoize';\nimport { PackageCache, Package, getOrCreate } from '@embroider/core';\nimport { MacrosConfig } from '@embroider/macros/src/node';\n\nfunction assertNoTildeExpansion(source: string, target: string) {\n if (target.includes('~')) {\n throw new Error(\n `The symbolic link: ${source}'s target: ${target} contained a bash expansion '~' which is not supported.`\n );\n }\n}\nexport class MovablePackageCache extends PackageCache {\n constructor(private macrosConfig: MacrosConfig, appRoot: string) {\n super(appRoot);\n }\n\n moveAddons(destDir: string): MovedPackageCache {\n // start with the plain old app package\n let origApp = this.get(this.appRoot);\n\n // discover the set of all packages that will need to be moved into the\n // workspace\n let movedSet = new MovedSet(origApp);\n\n return new MovedPackageCache(this.rootCache, this.resolutionCache, destDir, movedSet, origApp, this.macrosConfig);\n }\n}\n\nexport class MovedPackageCache extends PackageCache {\n readonly app!: Package;\n private commonSegmentCount: number;\n readonly moved: Map<Package, Package> = new Map();\n readonly unmovedAddons: Set<Package>;\n\n constructor(\n rootCache: PackageCache['rootCache'],\n resolutionCache: PackageCache['resolutionCache'],\n private destDir: string,\n movedSet: MovedSet,\n private origApp: Package,\n private macrosConfig: MacrosConfig\n ) {\n // this is the initial appRoot, which we can't know until just below here\n super('not-the-real-root');\n\n // that gives us our common segment count, which enables localPath mapping\n this.commonSegmentCount = movedSet.commonSegmentCount;\n\n // so we can now determine where the app will go inside the workspace. THIS\n // is where we fix 'not-the-real-root' from above.\n this.appRoot = this.localPath(origApp.root);\n\n this.macrosConfig.packageMoved(origApp.root, this.appRoot);\n\n for (let originalPkg of movedSet.packages) {\n // Update our rootCache so we don't need to rediscover moved packages\n let movedPkg;\n if (originalPkg === origApp) {\n // this wraps the original app package with one that will use moved\n // dependencies. The app itself hasn't moved yet, which is why a proxy\n // is needed at this level.\n movedPkg = packageProxy(origApp, (pkg: Package) => this.moved.get(pkg) || pkg);\n this.app = movedPkg;\n rootCache.set(movedPkg.root, movedPkg);\n } else {\n movedPkg = this.movedPackage(originalPkg);\n this.moved.set(originalPkg, movedPkg);\n this.macrosConfig.packageMoved(originalPkg.root, movedPkg.root);\n }\n\n // Update our resolutionCache so we still know as much about the moved\n // packages as we did before we moved them, without redoing package\n // resolution.\n let resolutions = new Map();\n for (let dep of originalPkg.dependencies) {\n if (movedSet.packages.has(dep)) {\n resolutions.set(dep.name, this.movedPackage(dep));\n } else {\n resolutions.set(dep.name, dep);\n }\n }\n resolutionCache.set(movedPkg, resolutions);\n }\n this.rootCache = rootCache;\n this.resolutionCache = resolutionCache;\n this.unmovedAddons = movedSet.unmovedAddons;\n }\n\n private movedPackage(originalPkg: Package): Package {\n let newRoot = this.localPath(originalPkg.root);\n return getOrCreate(this.rootCache, newRoot, () => new (originalPkg.constructor as any)(newRoot, this, false));\n }\n\n private localPath(filename: string) {\n return join(this.destDir, ...pathSegments(filename).slice(this.commonSegmentCount));\n }\n\n // hunt for symlinks that may be needed to do node_modules resolution from the\n // given path.\n async updatePreexistingResolvableSymlinks(): Promise<void> {\n let roots = this.originalRoots();\n [...this.candidateDirs()].map(path => {\n let links = symlinksInNodeModules(path);\n for (let { source, target } of links) {\n let pkg = roots.get(target);\n if (pkg) {\n // we found a symlink that points at a package that was copied.\n // Replicate it in the new structure pointing at the new package.\n ensureSymlinkSync(pkg.root, this.localPath(source));\n }\n }\n });\n }\n\n // places that might have symlinks we need to mimic\n private candidateDirs(): Set<string> {\n let candidates = new Set() as Set<string>;\n let originalPackages = [this.origApp, ...this.moved.keys()];\n for (let pkg of originalPackages) {\n let segments = pathSegments(pkg.root);\n\n let candidate = join(pkg.root, 'node_modules');\n candidates.add(candidate);\n\n for (let i = segments.length - 1; i >= this.commonSegmentCount; i--) {\n if (segments[i - 1] !== 'node_modules') {\n let candidate = '/' + join(...segments.slice(0, i), 'node_modules');\n if (candidates.has(candidate)) {\n break;\n }\n candidates.add(candidate);\n }\n }\n }\n return candidates;\n }\n\n private originalRoots(): Map<string, Package> {\n let originalRoots = new Map();\n for (let [originalPackage, movedPackage] of this.moved.entries()) {\n originalRoots.set(originalPackage.root, movedPackage);\n }\n return originalRoots;\n }\n}\n\nfunction maybeReaddirSync(path: string) {\n try {\n return readdirSync(path);\n } catch (err) {\n if (err.code !== 'ENOTDIR' && err.code !== 'ENOENT') {\n throw err;\n }\n return [];\n }\n}\n\nfunction isSymlink(path: string): boolean {\n try {\n let stat = lstatSync(path);\n return stat.isSymbolicLink();\n } catch (err) {\n if (err.code !== 'ENOTDIR' && err.code !== 'ENOENT') {\n throw err;\n }\n\n return false;\n }\n}\n\nfunction symlinksInNodeModules(path: string): { source: string; target: string }[] {\n let results: { source: string; target: string }[] = [];\n\n // handles the full `node_modules` being symlinked (this is uncommon, but sometimes\n // be useful for test harnesses to avoid multiple `npm install` invocations)\n let parentIsSymlink = isSymlink(path);\n\n let names = maybeReaddirSync(path);\n\n names.map(name => {\n let source = join(path, name);\n let stats = lstatSync(source);\n if (parentIsSymlink || stats.isSymbolicLink()) {\n let target = realpathSync(source);\n assertNoTildeExpansion(source, target);\n\n results.push({ source, target });\n } else if (stats.isDirectory() && name.startsWith('@')) {\n // handle symlinked scope names (e.g. symlinking `@myorghere` to a shared location)\n let isSourceSymlink = isSymlink(source);\n let innerNames = maybeReaddirSync(source);\n\n innerNames.map(innerName => {\n let innerSource = join(source, innerName);\n let innerStats = lstatSync(innerSource);\n if (parentIsSymlink || isSourceSymlink || innerStats.isSymbolicLink()) {\n let target = realpathSync(innerSource);\n assertNoTildeExpansion(innerSource, target);\n\n results.push({ source: innerSource, target });\n }\n });\n }\n });\n\n return results;\n}\n\nfunction pathSegments(filename: string) {\n let segments = filename.split(sep);\n if (isAbsolute(filename)) {\n segments.shift();\n }\n return segments;\n}\n\nclass MovedSet {\n private mustMove: Map<Package, boolean> = new Map();\n unmovedAddons: Set<Package> = new Set();\n\n constructor(private app: Package) {\n this.check(app);\n }\n\n private check(pkg: Package): boolean {\n if (this.mustMove.has(pkg)) {\n return this.mustMove.get(pkg)!;\n }\n\n // non-ember packages don't need to move\n if (pkg !== this.app && !pkg.isEmberPackage()) {\n this.mustMove.set(pkg, false);\n return false;\n }\n\n let mustMove =\n // The app always moves (because we need a place to mash all the\n // addon-provided \"app-js\" trees),\n pkg === this.app ||\n // For the same reason, engines need to move (we need a place to mash all\n // their child addon's provided app-js trees into)\n pkg.isEngine() ||\n // any other ember package that isn't native v2 must move because we've\n // got to rewrite them\n !pkg.isV2Ember();\n\n // this is a partial answer. After we check our children, our own `mustMove`\n // may change from false to true. But it's OK that our children see false in\n // that case, because they don't need to move on our behalf.\n //\n // We need to already be in the `this.mustMove` cache at this moment in\n // order to avoid infinite recursion if any of our children end up depending\n // back on us.\n this.mustMove.set(pkg, mustMove);\n\n for (let dep of pkg.dependencies) {\n // or if any of your deps need to move\n mustMove = this.check(dep) || mustMove;\n }\n this.mustMove.set(pkg, mustMove);\n\n if (!mustMove) {\n this.unmovedAddons.add(pkg);\n }\n\n return mustMove;\n }\n\n @Memoize()\n get packages(): Set<Package> {\n let result = new Set() as Set<Package>;\n for (let [pkg, mustMove] of this.mustMove) {\n if (mustMove) {\n result.add(pkg);\n }\n }\n return result;\n }\n\n // the npm structure we're shadowing could have a dependency nearly anywhere\n // on disk. We want to maintain their relations to each other. So we must find\n // the point in the filesystem that contains all of them, which could even be\n // \"/\" (for example, if you npm-linked a dependency that lives in /tmp).\n //\n // The commonSegmentCount is how many leading path segments are shared by all\n // our packages.\n @Memoize()\n get commonSegmentCount(): number {\n return [...this.packages].reduce((longestPrefix, pkg) => {\n let candidate = pathSegments(pkg.root);\n let shorter, longer;\n if (longestPrefix.length > candidate.length) {\n shorter = candidate;\n longer = longestPrefix;\n } else {\n shorter = longestPrefix;\n longer = candidate;\n }\n let i = 0;\n for (; i < shorter.length; i++) {\n if (shorter[i] !== longer[i]) {\n break;\n }\n }\n return shorter.slice(0, i);\n }, pathSegments(this.app.root)).length;\n }\n}\n\nfunction packageProxy(pkg: Package, getMovedPackage: (pkg: Package) => Package) {\n let p: Package = new Proxy(pkg, {\n get(pkg: Package, prop: string | number | symbol) {\n if (prop === 'dependencies') {\n return pkg.dependencies.map(getMovedPackage);\n }\n if (prop === 'nonResolvableDeps') {\n if (!pkg.nonResolvableDeps) {\n return pkg.nonResolvableDeps;\n }\n return new Map([...pkg.nonResolvableDeps.values()].map(dep => [dep.name, getMovedPackage(dep)]));\n }\n if (prop === 'findDescendants') {\n return pkg.findDescendants.bind(p);\n }\n return (pkg as any)[prop];\n },\n });\n return p;\n}\n"]}
1
+ {"version":3,"file":"moved-package-cache.js","sourceRoot":"","sources":["moved-package-cache.ts"],"names":[],"mappings":"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","sourcesContent":["import { join, sep, isAbsolute } from 'path';\nimport { ensureSymlinkSync, readdirSync, realpathSync, lstatSync } from 'fs-extra';\nimport { Memoize } from 'typescript-memoize';\nimport { PackageCache, Package, getOrCreate } from '@embroider/core';\nimport { MacrosConfig } from '@embroider/macros/src/node';\nimport os from 'os';\n\nfunction assertNoTildeExpansion(source: string, target: string) {\n if (target.includes('~') && os.platform() !== 'win32') {\n throw new Error(\n `The symbolic link: ${source}'s target: ${target} contained a bash expansion '~' which is not supported.`\n );\n }\n}\nexport class MovablePackageCache extends PackageCache {\n constructor(private macrosConfig: MacrosConfig, appRoot: string) {\n super(appRoot);\n }\n\n moveAddons(destDir: string): MovedPackageCache {\n // start with the plain old app package\n let origApp = this.get(this.appRoot);\n\n // discover the set of all packages that will need to be moved into the\n // workspace\n let movedSet = new MovedSet(origApp);\n\n return new MovedPackageCache(this.rootCache, this.resolutionCache, destDir, movedSet, origApp, this.macrosConfig);\n }\n}\n\nexport class MovedPackageCache extends PackageCache {\n readonly app!: Package;\n private commonSegmentCount: number;\n readonly moved: Map<Package, Package> = new Map();\n readonly unmovedAddons: Set<Package>;\n\n constructor(\n rootCache: PackageCache['rootCache'],\n resolutionCache: PackageCache['resolutionCache'],\n private destDir: string,\n movedSet: MovedSet,\n private origApp: Package,\n private macrosConfig: MacrosConfig\n ) {\n // this is the initial appRoot, which we can't know until just below here\n super('not-the-real-root');\n\n // that gives us our common segment count, which enables localPath mapping\n this.commonSegmentCount = movedSet.commonSegmentCount;\n\n // so we can now determine where the app will go inside the workspace. THIS\n // is where we fix 'not-the-real-root' from above.\n this.appRoot = this.localPath(origApp.root);\n\n this.macrosConfig.packageMoved(origApp.root, this.appRoot);\n\n for (let originalPkg of movedSet.packages) {\n // Update our rootCache so we don't need to rediscover moved packages\n let movedPkg;\n if (originalPkg === origApp) {\n // this wraps the original app package with one that will use moved\n // dependencies. The app itself hasn't moved yet, which is why a proxy\n // is needed at this level.\n movedPkg = packageProxy(origApp, (pkg: Package) => this.moved.get(pkg) || pkg);\n this.app = movedPkg;\n rootCache.set(movedPkg.root, movedPkg);\n } else {\n movedPkg = this.movedPackage(originalPkg);\n this.moved.set(originalPkg, movedPkg);\n this.macrosConfig.packageMoved(originalPkg.root, movedPkg.root);\n }\n\n // Update our resolutionCache so we still know as much about the moved\n // packages as we did before we moved them, without redoing package\n // resolution.\n let resolutions = new Map();\n for (let dep of originalPkg.dependencies) {\n if (movedSet.packages.has(dep)) {\n resolutions.set(dep.name, this.movedPackage(dep));\n } else {\n resolutions.set(dep.name, dep);\n }\n }\n resolutionCache.set(movedPkg, resolutions);\n }\n this.rootCache = rootCache;\n this.resolutionCache = resolutionCache;\n this.unmovedAddons = movedSet.unmovedAddons;\n }\n\n private movedPackage(originalPkg: Package): Package {\n let newRoot = this.localPath(originalPkg.root);\n return getOrCreate(this.rootCache, newRoot, () => new (originalPkg.constructor as any)(newRoot, this, false));\n }\n\n private localPath(filename: string) {\n return join(this.destDir, ...pathSegments(filename).slice(this.commonSegmentCount));\n }\n\n // hunt for symlinks that may be needed to do node_modules resolution from the\n // given path.\n async updatePreexistingResolvableSymlinks(): Promise<void> {\n let roots = this.originalRoots();\n [...this.candidateDirs()].map(path => {\n let links = symlinksInNodeModules(path);\n for (let { source, target } of links) {\n let pkg = roots.get(target);\n if (pkg) {\n // we found a symlink that points at a package that was copied.\n // Replicate it in the new structure pointing at the new package.\n ensureSymlinkSync(pkg.root, this.localPath(source));\n }\n }\n });\n }\n\n // places that might have symlinks we need to mimic\n private candidateDirs(): Set<string> {\n let candidates = new Set() as Set<string>;\n let originalPackages = [this.origApp, ...this.moved.keys()];\n for (let pkg of originalPackages) {\n let segments = pathSegments(pkg.root);\n\n let candidate = join(pkg.root, 'node_modules');\n candidates.add(candidate);\n\n for (let i = segments.length - 1; i >= this.commonSegmentCount; i--) {\n if (segments[i - 1] !== 'node_modules') {\n let candidate = '/' + join(...segments.slice(0, i), 'node_modules');\n if (candidates.has(candidate)) {\n break;\n }\n candidates.add(candidate);\n }\n }\n }\n return candidates;\n }\n\n private originalRoots(): Map<string, Package> {\n let originalRoots = new Map();\n for (let [originalPackage, movedPackage] of this.moved.entries()) {\n originalRoots.set(originalPackage.root, movedPackage);\n }\n return originalRoots;\n }\n}\n\nfunction maybeReaddirSync(path: string) {\n try {\n return readdirSync(path);\n } catch (err) {\n if (err.code !== 'ENOTDIR' && err.code !== 'ENOENT') {\n throw err;\n }\n return [];\n }\n}\n\nfunction isSymlink(path: string): boolean {\n try {\n let stat = lstatSync(path);\n return stat.isSymbolicLink();\n } catch (err) {\n if (err.code !== 'ENOTDIR' && err.code !== 'ENOENT') {\n throw err;\n }\n\n return false;\n }\n}\n\nfunction symlinksInNodeModules(path: string): { source: string; target: string }[] {\n let results: { source: string; target: string }[] = [];\n\n // handles the full `node_modules` being symlinked (this is uncommon, but sometimes\n // be useful for test harnesses to avoid multiple `npm install` invocations)\n let parentIsSymlink = isSymlink(path);\n\n let names = maybeReaddirSync(path);\n\n names.map(name => {\n let source = join(path, name);\n let stats = lstatSync(source);\n if (parentIsSymlink || stats.isSymbolicLink()) {\n let target = realpathSync(source);\n assertNoTildeExpansion(source, target);\n\n results.push({ source, target });\n } else if (stats.isDirectory() && name.startsWith('@')) {\n // handle symlinked scope names (e.g. symlinking `@myorghere` to a shared location)\n let isSourceSymlink = isSymlink(source);\n let innerNames = maybeReaddirSync(source);\n\n innerNames.map(innerName => {\n let innerSource = join(source, innerName);\n let innerStats = lstatSync(innerSource);\n if (parentIsSymlink || isSourceSymlink || innerStats.isSymbolicLink()) {\n let target = realpathSync(innerSource);\n assertNoTildeExpansion(innerSource, target);\n\n results.push({ source: innerSource, target });\n }\n });\n }\n });\n\n return results;\n}\n\nfunction pathSegments(filename: string) {\n let segments = filename.split(sep);\n if (isAbsolute(filename)) {\n segments.shift();\n }\n return segments;\n}\n\nclass MovedSet {\n private mustMove: Map<Package, boolean> = new Map();\n unmovedAddons: Set<Package> = new Set();\n\n constructor(private app: Package) {\n this.check(app);\n }\n\n private check(pkg: Package): boolean {\n if (this.mustMove.has(pkg)) {\n return this.mustMove.get(pkg)!;\n }\n\n // non-ember packages don't need to move\n if (pkg !== this.app && !pkg.isEmberPackage()) {\n this.mustMove.set(pkg, false);\n return false;\n }\n\n let mustMove =\n // The app always moves (because we need a place to mash all the\n // addon-provided \"app-js\" trees),\n pkg === this.app ||\n // For the same reason, engines need to move (we need a place to mash all\n // their child addon's provided app-js trees into)\n pkg.isEngine() ||\n // any other ember package that isn't native v2 must move because we've\n // got to rewrite them\n !pkg.isV2Ember();\n\n // this is a partial answer. After we check our children, our own `mustMove`\n // may change from false to true. But it's OK that our children see false in\n // that case, because they don't need to move on our behalf.\n //\n // We need to already be in the `this.mustMove` cache at this moment in\n // order to avoid infinite recursion if any of our children end up depending\n // back on us.\n this.mustMove.set(pkg, mustMove);\n\n for (let dep of pkg.dependencies) {\n // or if any of your deps need to move\n mustMove = this.check(dep) || mustMove;\n }\n this.mustMove.set(pkg, mustMove);\n\n if (!mustMove) {\n this.unmovedAddons.add(pkg);\n }\n\n return mustMove;\n }\n\n @Memoize()\n get packages(): Set<Package> {\n let result = new Set() as Set<Package>;\n for (let [pkg, mustMove] of this.mustMove) {\n if (mustMove) {\n result.add(pkg);\n }\n }\n return result;\n }\n\n // the npm structure we're shadowing could have a dependency nearly anywhere\n // on disk. We want to maintain their relations to each other. So we must find\n // the point in the filesystem that contains all of them, which could even be\n // \"/\" (for example, if you npm-linked a dependency that lives in /tmp).\n //\n // The commonSegmentCount is how many leading path segments are shared by all\n // our packages.\n @Memoize()\n get commonSegmentCount(): number {\n return [...this.packages].reduce((longestPrefix, pkg) => {\n let candidate = pathSegments(pkg.root);\n let shorter, longer;\n if (longestPrefix.length > candidate.length) {\n shorter = candidate;\n longer = longestPrefix;\n } else {\n shorter = longestPrefix;\n longer = candidate;\n }\n let i = 0;\n for (; i < shorter.length; i++) {\n if (shorter[i] !== longer[i]) {\n break;\n }\n }\n return shorter.slice(0, i);\n }, pathSegments(this.app.root)).length;\n }\n}\n\nfunction packageProxy(pkg: Package, getMovedPackage: (pkg: Package) => Package) {\n let p: Package = new Proxy(pkg, {\n get(pkg: Package, prop: string | number | symbol) {\n if (prop === 'dependencies') {\n return pkg.dependencies.map(getMovedPackage);\n }\n if (prop === 'nonResolvableDeps') {\n if (!pkg.nonResolvableDeps) {\n return pkg.nonResolvableDeps;\n }\n return new Map([...pkg.nonResolvableDeps.values()].map(dep => [dep.name, getMovedPackage(dep)]));\n }\n if (prop === 'findDescendants') {\n return pkg.findDescendants.bind(p);\n }\n return (pkg as any)[prop];\n },\n });\n return p;\n}\n"]}
@@ -1,29 +1,13 @@
1
1
  import { default as Resolver } from './resolver';
2
- import type { ASTv1 } from '@glimmer/syntax';
3
- export declare function makeResolverTransform(resolver: Resolver): {
4
- ({ filename, contents }: {
5
- filename: string;
6
- contents: string;
7
- }): {
8
- name: string;
9
- visitor: {
10
- Program: {
11
- enter(node: ASTv1.Program): void;
12
- exit(): void;
13
- };
14
- BlockStatement(node: ASTv1.BlockStatement): void;
15
- SubExpression(node: ASTv1.SubExpression): void;
16
- MustacheStatement(node: ASTv1.MustacheStatement): void;
17
- ElementModifierStatement(node: ASTv1.ElementModifierStatement): void;
18
- ElementNode: {
19
- enter(node: ASTv1.ElementNode): void;
20
- exit(): void;
21
- };
22
- };
23
- };
24
- parallelBabel: {
25
- requireFile: string;
26
- buildUsing: string;
27
- params: typeof Resolver;
28
- };
2
+ import type { ASTPluginBuilder, ASTPluginEnvironment } from '@glimmer/syntax';
3
+ import type { WithJSUtils } from 'babel-plugin-ember-template-compilation';
4
+ declare type Env = WithJSUtils<ASTPluginEnvironment> & {
5
+ filename: string;
6
+ contents: string;
29
7
  };
8
+ export interface Options {
9
+ resolver: Resolver;
10
+ patchHelpersBug: boolean;
11
+ }
12
+ export default function makeResolverTransform({ resolver, patchHelpersBug }: Options): ASTPluginBuilder<Env>;
13
+ export {};