@embroider/compat 3.3.2-unstable.d68fbec → 3.4.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 (49) hide show
  1. package/LICENSE +21 -0
  2. package/package.json +12 -12
  3. package/src/audit/babel-visitor.js +2 -2
  4. package/src/audit/babel-visitor.js.map +1 -1
  5. package/src/audit/build.js.map +1 -1
  6. package/src/audit-cli.js.map +1 -1
  7. package/src/audit.js.map +1 -1
  8. package/src/babel-plugin-adjust-imports.js.map +1 -1
  9. package/src/build-compat-addon.js.map +1 -1
  10. package/src/compat-adapters/@ember/test-waiters.js.map +1 -1
  11. package/src/compat-adapters/ember-asset-loader.js.map +1 -1
  12. package/src/compat-adapters/ember-cli-babel.js.map +1 -1
  13. package/src/compat-adapters/ember-cli-fastboot.js.map +1 -1
  14. package/src/compat-adapters/ember-cli-mirage.js.map +1 -1
  15. package/src/compat-adapters/ember-composable-helpers.js.map +1 -1
  16. package/src/compat-adapters/ember-data.js.map +1 -1
  17. package/src/compat-adapters/ember-engines.js.map +1 -1
  18. package/src/compat-adapters/ember-macro-helpers.js.map +1 -1
  19. package/src/compat-adapters/ember-scroll-modifiers.js.map +1 -1
  20. package/src/compat-adapters/ember-source.js.map +1 -1
  21. package/src/compat-adapters/ember-svg-jar.js.map +1 -1
  22. package/src/compat-addons.js.map +1 -1
  23. package/src/compat-app-builder.js +2 -2
  24. package/src/compat-app-builder.js.map +1 -1
  25. package/src/compat-app.js.map +1 -1
  26. package/src/compat-utils.js.map +1 -1
  27. package/src/dasherize-component-name.js.map +1 -1
  28. package/src/default-pipeline.js.map +1 -1
  29. package/src/dependency-rules.js.map +1 -1
  30. package/src/detect-babel-plugins.js.map +1 -1
  31. package/src/detect-compact-reexports.js.map +1 -1
  32. package/src/dummy-package.js.map +1 -1
  33. package/src/empty-package-tree.js.map +1 -1
  34. package/src/get-real-addon.js.map +1 -1
  35. package/src/hbs-to-js-broccoli-plugin.js.map +1 -1
  36. package/src/merges.js.map +1 -1
  37. package/src/prepare-htmlbars-ast-plugins.js.map +1 -1
  38. package/src/rename-require-plugin.js.map +1 -1
  39. package/src/resolver-transform.js.map +1 -1
  40. package/src/rewrite-addon-tree.js.map +1 -1
  41. package/src/smoosh-package-json.js.map +1 -1
  42. package/src/snitch.js.map +1 -1
  43. package/src/standalone-addon-build.js.map +1 -1
  44. package/src/sync-dir.js.map +1 -1
  45. package/src/synthesize-template-only-components.js.map +1 -1
  46. package/src/v1-addon.js.map +1 -1
  47. package/src/v1-appboot.js.map +1 -1
  48. package/src/v1-config.js.map +1 -1
  49. package/src/v1-instance-cache.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"resolver-transform.js","sourceRoot":"","sources":["resolver-transform.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ASTv1, ASTPlugin, ASTPluginBuilder, ASTPluginEnvironment, WalkerPath } from '@glimmer/syntax';\nimport type {\n PreprocessedComponentRule,\n ActivePackageRules,\n ComponentRules,\n PackageRules,\n ModuleRules,\n} from './dependency-rules';\nimport { preprocessComponentRule, appTreeRulesDir } from './dependency-rules';\nimport { Memoize } from 'typescript-memoize';\nimport type { WithJSUtils } from 'babel-plugin-ember-template-compilation';\nimport assertNever from 'assert-never';\nimport { join, sep } from 'path';\nimport { readJSONSync } from 'fs-extra';\nimport { dasherize, snippetToDasherizedName } from './dasherize-component-name';\nimport type { ResolverOptions as CoreResolverOptions } from '@embroider/core';\nimport { Resolver, locateEmbroiderWorkingDir } from '@embroider/core';\nimport type CompatOptions from './options';\nimport type { AuditMessage, Loc } from './audit';\nimport { camelCase, mergeWith } from 'lodash';\n\ntype Env = WithJSUtils<ASTPluginEnvironment> & {\n filename: string;\n contents: string;\n strictMode?: boolean;\n locals?: string[];\n};\n\n// this is a subset of the full Options. We care about serializability, and we\n// only needs parts that are easily serializable, which is why we don't keep the\n// whole thing.\ntype UserConfig = Pick<\n Required<CompatOptions>,\n 'staticHelpers' | 'staticModifiers' | 'staticComponents' | 'allowUnsafeDynamicComponents'\n>;\n\nexport interface CompatResolverOptions extends CoreResolverOptions {\n activePackageRules: ActivePackageRules[];\n options: UserConfig;\n}\n\nexport interface Options {\n appRoot: string;\n}\n\nexport const builtInKeywords = [\n '-get-dynamic-var',\n '-in-element',\n '-with-dynamic-vars',\n 'action',\n 'array',\n 'component',\n 'concat',\n 'debugger',\n 'each-in',\n 'each',\n 'fn',\n 'get',\n 'has-block-params',\n 'has-block',\n 'hasBlock',\n 'hasBlockParams',\n 'hash',\n 'helper',\n 'if',\n 'in-element',\n 'input',\n 'let',\n 'link-to',\n 'loc',\n 'log',\n 'modifier',\n 'mount',\n 'mut',\n 'on',\n 'outlet',\n 'partial',\n 'query-params',\n 'readonly',\n 'textarea',\n 'unbound',\n 'unique-id',\n 'unless',\n 'with',\n 'yield',\n];\n\ninterface ComponentResolution {\n type: 'component';\n specifier: string;\n yieldsComponents: Required<ComponentRules>['yieldsSafeComponents'];\n yieldsArguments: Required<ComponentRules>['yieldsArguments'];\n argumentsAreComponents: string[];\n nameHint: string;\n}\n\ntype HelperResolution = {\n type: 'helper';\n nameHint: string;\n specifier: string;\n};\n\ntype ModifierResolution = {\n type: 'modifier';\n specifier: string;\n nameHint: string;\n};\n\ntype ResolutionResult = ComponentResolution | HelperResolution | ModifierResolution;\n\ninterface ResolutionFail {\n type: 'error';\n message: string;\n detail: string;\n loc: Loc;\n}\n\ntype Resolution = ResolutionResult | ResolutionFail;\n\ntype ComponentLocator =\n | {\n type: 'literal';\n path: string;\n }\n | {\n type: 'path';\n path: string;\n }\n | {\n type: 'other';\n };\n\nclass TemplateResolver implements ASTPlugin {\n readonly name = 'embroider-build-time-resolver';\n\n private auditHandler: undefined | ((msg: AuditMessage) => void);\n private scopeStack = new ScopeStack();\n\n private moduleResolver: Resolver;\n\n constructor(private env: Env, private config: CompatResolverOptions) {\n this.moduleResolver = new Resolver(config);\n if ((globalThis as any).embroider_audit) {\n this.auditHandler = (globalThis as any).embroider_audit;\n }\n }\n\n private emit<Target extends WalkerPath<ASTv1.Node>>(\n parentPath: Target,\n resolution: Resolution | null,\n setter: (target: Target['node'], newIdentifier: ASTv1.PathExpression) => void\n ) {\n switch (resolution?.type) {\n case 'error':\n this.reportError(resolution);\n return;\n case 'component':\n case 'modifier':\n case 'helper': {\n let name = this.env.meta.jsutils.bindImport(resolution.specifier, 'default', parentPath, {\n nameHint: resolution.nameHint,\n });\n setter(parentPath.node, this.env.syntax.builders.path(name));\n return;\n }\n case undefined:\n return;\n default:\n assertNever(resolution);\n }\n }\n\n private reportError(dep: ResolutionFail) {\n if (!this.auditHandler && !this.config.options.allowUnsafeDynamicComponents) {\n let e: any = new Error(`${dep.message}: ${dep.detail} in ${this.humanReadableFile(this.env.filename)}`);\n e.isTemplateResolverError = true;\n e.loc = dep.loc;\n e.moduleName = this.env.filename;\n throw e;\n }\n if (this.auditHandler) {\n this.auditHandler({\n message: dep.message,\n filename: this.env.filename,\n detail: dep.detail,\n loc: dep.loc,\n source: this.env.contents,\n });\n }\n }\n\n private humanReadableFile(file: string) {\n let { appRoot } = this.config;\n if (!appRoot.endsWith(sep)) {\n appRoot += sep;\n }\n if (file.startsWith(appRoot)) {\n return file.slice(appRoot.length);\n }\n return file;\n }\n\n private handleComponentHelper(\n param: ASTv1.Node,\n impliedBecause?: { componentName: string; argumentName: string }\n ): ComponentResolution | ResolutionFail | null {\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 return this.handleComponentHelper(param.path, impliedBecause);\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 null;\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 null;\n }\n if (param.path.type === 'PathExpression' && param.path.original === 'ensure-safe-component') {\n // safe because we trust ensure-safe-component\n return null;\n }\n locator = { type: 'other' };\n break;\n default:\n locator = { type: 'other' };\n }\n\n if (locator.type === 'path' && this.scopeStack.safeComponentInScope(locator.path)) {\n return null;\n }\n\n return this.targetComponentHelper(locator, param.loc, impliedBecause);\n }\n\n private handleDynamicComponentArguments(\n componentName: string,\n argumentsAreComponents: string[],\n attributes: WalkerPath<ASTv1.AttrNode | ASTv1.HashPair>[]\n ) {\n for (let name of argumentsAreComponents) {\n let attr = attributes.find(attr => {\n if (attr.node.type === 'AttrNode') {\n return attr.node.name === '@' + name;\n } else {\n return attr.node.key === name;\n }\n });\n if (attr) {\n let resolution = this.handleComponentHelper(attr.node.value, {\n componentName,\n argumentName: name,\n });\n this.emit(attr, resolution, (node, newId) => {\n if (node.type === 'AttrNode') {\n node.value = this.env.syntax.builders.mustache(newId);\n } else {\n node.value = newId;\n }\n });\n }\n }\n }\n\n private get staticComponentsEnabled(): boolean {\n return this.config.options.staticComponents || Boolean(this.auditHandler);\n }\n\n private get staticHelpersEnabled(): boolean {\n return this.config.options.staticHelpers || Boolean(this.auditHandler);\n }\n\n private get staticModifiersEnabled(): boolean {\n return this.config.options.staticModifiers || Boolean(this.auditHandler);\n }\n\n private isIgnoredComponent(dasherizedName: string) {\n return this.rules.components.get(dasherizedName)?.safeToIgnore;\n }\n\n @Memoize()\n private get rules() {\n // rules that are keyed by the filename they're talking about\n let files: Map<string, PreprocessedComponentRule> = new Map();\n\n // rules that are keyed by our dasherized interpretation of the component's name\n let components: Map<string, PreprocessedComponentRule> = new Map();\n\n // we're not responsible for filtering out rules for inactive packages here,\n // that is done before getting to us. So we should assume these are all in\n // force.\n for (let rule of this.config.activePackageRules) {\n if (rule.components) {\n for (let [snippet, rules] of Object.entries(rule.components)) {\n let processedRules = preprocessComponentRule(rules);\n let dasherizedName = this.standardDasherize(snippet, rule);\n components.set(dasherizedName, processedRules);\n if (rules.layout) {\n for (let root of rule.roots) {\n if (rules.layout.addonPath) {\n files.set(join(root, rules.layout.addonPath), processedRules);\n }\n if (rules.layout.appPath) {\n files.set(join(root, rules.layout.appPath), processedRules);\n }\n }\n }\n }\n }\n if (rule.appTemplates) {\n for (let [path, templateRules] of Object.entries(rule.appTemplates)) {\n let processedRules = preprocessComponentRule(templateRules);\n for (let root of rule.roots) {\n files.set(join(appTreeRulesDir(root, this.moduleResolver), path), processedRules);\n }\n }\n }\n if (rule.addonTemplates) {\n for (let [path, templateRules] of Object.entries(rule.addonTemplates)) {\n let processedRules = preprocessComponentRule(templateRules);\n for (let root of rule.roots) {\n files.set(join(root, path), processedRules);\n }\n }\n }\n }\n return { files, components };\n }\n\n private findRules(absPath: string): PreprocessedComponentRule | undefined {\n let fileRules = this.rules.files.get(absPath);\n let componentRules: PreprocessedComponentRule | undefined;\n\n let componentName = this.moduleResolver.reverseComponentLookup(absPath);\n if (componentName) {\n componentRules = this.rules.components.get(componentName);\n }\n\n if (fileRules && componentRules) {\n return mergeWith(fileRules, componentRules, appendArrays);\n }\n\n return fileRules ?? componentRules;\n }\n\n private standardDasherize(snippet: string, rule: PackageRules | ModuleRules): string {\n let name = snippetToDasherizedName(snippet);\n if (name == null) {\n throw new Error(`unable to parse component snippet \"${snippet}\" from rule ${JSON.stringify(rule, null, 2)}`);\n }\n return name;\n }\n\n private targetComponent(name: string): ComponentResolution | null {\n if (!this.staticComponentsEnabled) {\n return null;\n }\n\n if (builtInKeywords.includes(name)) {\n return null;\n }\n if (this.isIgnoredComponent(name)) {\n return null;\n }\n\n let componentRules = this.rules.components.get(name);\n return {\n type: 'component',\n specifier: `#embroider_compat/components/${name}`,\n yieldsComponents: componentRules ? componentRules.yieldsSafeComponents : [],\n yieldsArguments: componentRules ? componentRules.yieldsArguments : [],\n argumentsAreComponents: componentRules ? componentRules.argumentsAreComponents : [],\n nameHint: this.nameHint(name),\n };\n }\n\n private targetComponentHelper(\n component: ComponentLocator,\n loc: Loc,\n impliedBecause?: { componentName: string; argumentName: string }\n ): ComponentResolution | ResolutionFail | null {\n if (!this.staticComponentsEnabled) {\n return null;\n }\n\n let message;\n if (impliedBecause) {\n message = `argument \"${impliedBecause.argumentName}\" to component \"${impliedBecause.componentName}\" is treated as a component, but the value you're passing is dynamic`;\n } else {\n message = `Unsafe dynamic component`;\n }\n\n if (component.type === 'other') {\n return {\n type: 'error',\n message,\n detail: `cannot statically analyze this expression`,\n loc,\n };\n }\n if (component.type === 'path') {\n let ownComponentRules = this.findRules(this.env.filename);\n if (ownComponentRules && ownComponentRules.safeInteriorPaths.includes(component.path)) {\n return null;\n }\n return {\n type: 'error',\n message,\n detail: component.path,\n loc,\n };\n }\n\n return this.targetComponent(component.path);\n }\n\n private targetHelper(path: string): HelperResolution | null {\n if (!this.staticHelpersEnabled) {\n return null;\n }\n\n // people are not allowed to override the built-in helpers with their own\n // globally-named helpers. It throws an error. So it's fine for us to\n // prioritize the builtIns here without bothering to resolve a user helper\n // of the same name.\n if (builtInKeywords.includes(path)) {\n return null;\n }\n\n return {\n type: 'helper',\n specifier: `#embroider_compat/helpers/${path}`,\n nameHint: this.nameHint(path),\n };\n }\n\n private targetHelperOrComponent(\n path: string,\n loc: Loc,\n hasArgs: boolean\n ): ComponentResolution | HelperResolution | null {\n /*\n\n In earlier embroider versions we would do a bunch of module resolution right\n here inside the ast transform to try to resolve the ambiguity of this case\n and if we didn't find anything, leave the template unchanged. But that leads\n to both a lot of extra build-time expense (since we are attempting\n resolution for lots of things that may in fact be just some data and not a\n component invocation at all, and also since we are pre-resolving modules\n that will get resolved a second time by the final stage packager).\n\n Now, we're going to be less forgiving, because it streamlines the build for\n everyone who's not still using these *extremely* old patterns.\n\n The problematic case is:\n\n 1. In a non-strict template (because this whole resolver-transform.ts is a\n no-op on strict handlebars).\n\n 2. Have a mustache statement like: `{{something}}`, where `something` is:\n\n a. Not a variable in scope (for example, there's no preceeding line \n like `<Parent as |something|>`)\n b. Does not start with `@` because that must be an argument from outside this template.\n c. Does not contain a dot, like `some.thing` (because that case is classically \n never a global component resolution that we would need to handle)\n d. Does not start with `this` (this rule is mostly redundant with the previous rule, \n but even a standalone `this` is never a component invocation).\n e. Does not have any arguments. If there are argument like `{{something a=b}}`, \n there is still ambiguity between helper vs component, but there is no longer \n the possibility that this was just rendering some data.\n f. Does not take a block, like `{{#something}}{{/something}}` (because that is \n always a component, no ambiguity.)\n\n We can't tell if this problematic case is really:\n\n 1. A helper invocation with no arguments that is being directly rendered.\n Out-of-the-box, ember already generates [a lint\n error](https://github.com/ember-template-lint/ember-template-lint/blob/master/docs/rule/no-curly-component-invocation.md)\n for this, although it tells you to whitelist your helper when IMO it\n should tell you to use an unambiguous syntax like `{{ (something) }}`\n instead.\n\n 2. A component invocation, which you could have written `<Something />`\n instead. Angle-bracket invocation has been available and easy-to-adopt\n for a very long time. \n\n 3. Property-this-fallback for `{{this.something}}`. Property-this-fallback\n is eliminated at Ember 4.0, so people have been heavily pushed to get\n it out of their addons.\n */\n\n // first, bail out on all the stuff we can obviously ignore\n if (\n (!this.staticHelpersEnabled && !this.staticComponentsEnabled) ||\n builtInKeywords.includes(path) ||\n this.isIgnoredComponent(path)\n ) {\n return null;\n }\n\n let ownComponentRules = this.findRules(this.env.filename);\n if (ownComponentRules?.disambiguate[path]) {\n switch (ownComponentRules.disambiguate[path]) {\n case 'component':\n return this.targetComponent(path);\n case 'helper':\n return this.targetHelper(path);\n case 'data':\n return null;\n }\n }\n\n if (!hasArgs && !path.includes('/') && !path.includes('@')) {\n // this is the case that could also be property-this-fallback. We're going\n // to force people to disambiguate, because letting a potential component\n // or helper invocation lurk inside every bit of data you render is not\n // ok.\n this.reportError({\n type: 'error',\n message: 'unsupported ambiguous syntax',\n detail: `\"{{${path}}}\" is ambiguous and could mean \"{{this.${path}}}\" or component \"<${capitalize(\n camelCase(path)\n )} />\" or helper \"{{ (${path}) }}\". Change it to one of those unambigous forms, or use a \"disambiguate\" packageRule to work around the problem if its in third-party code you cannot easily fix.`,\n loc,\n });\n return null;\n }\n\n // Above we already bailed out if both of these were disabled, so we know at\n // least one is turned on. If both aren't turned on, we're stuck, because we\n // can't even tell if this *is* a component vs a helper.\n if (!this.staticHelpersEnabled || !this.staticComponentsEnabled) {\n this.reportError({\n type: 'error',\n message: 'unsupported ambiguity between helper and component',\n detail: `this use of \"{{${path}}}\" could be helper \"{{ (${path}) }}\" or component \"<${capitalize(\n camelCase(path)\n )} />\", and your settings for staticHelpers and staticComponents do not agree. Either switch to one of the unambiguous forms, or make staticHelpers and staticComponents agree, or use a \"disambiguate\" packageRule to work around the problem if its in third-party code you cannot easily fix.`,\n loc,\n });\n return null;\n }\n\n let componentRules = this.rules.components.get(path);\n return {\n type: 'component',\n specifier: `#embroider_compat/ambiguous/${path}`,\n yieldsComponents: componentRules ? componentRules.yieldsSafeComponents : [],\n yieldsArguments: componentRules ? componentRules.yieldsArguments : [],\n argumentsAreComponents: componentRules ? componentRules.argumentsAreComponents : [],\n nameHint: this.nameHint(path),\n };\n }\n\n private targetElementModifier(path: string): ModifierResolution | null {\n if (!this.staticModifiersEnabled) {\n return null;\n }\n if (builtInKeywords.includes(path)) {\n return null;\n }\n\n return {\n type: 'modifier',\n specifier: `#embroider_compat/modifiers/${path}`,\n nameHint: this.nameHint(path),\n };\n }\n\n targetDynamicModifier(modifier: ComponentLocator, loc: Loc): ModifierResolution | ResolutionFail | null {\n if (!this.staticModifiersEnabled) {\n return null;\n }\n\n if (modifier.type === 'literal') {\n return this.targetElementModifier(modifier.path);\n } else {\n return {\n type: 'error',\n message: 'Unsafe dynamic modifier',\n detail: `cannot statically analyze this expression`,\n loc,\n };\n }\n }\n\n private targetDynamicHelper(helper: ComponentLocator): HelperResolution | null {\n if (!this.staticHelpersEnabled) {\n return null;\n }\n\n if (helper.type === 'literal') {\n return this.targetHelper(helper.path);\n }\n\n // we don't have to manage any errors in this case because ember itself\n // considers it an error to pass anything but a string literal to the\n // `helper` helper.\n return null;\n }\n\n private nameHint(path: string) {\n let parts = path.split('@');\n\n // the extra underscore here guarantees that we will never collide with an\n // HTML element.\n return parts[parts.length - 1] + '_';\n }\n\n private handleDynamicModifier(param: ASTv1.Expression): ModifierResolution | ResolutionFail | null {\n if (param.type === 'StringLiteral') {\n return this.targetDynamicModifier({ type: 'literal', path: param.value }, param.loc);\n }\n // we don't have to manage any errors in this case because ember itself\n // considers it an error to pass anything but a string literal to the\n // modifier helper.\n return null;\n }\n\n private handleDynamicHelper(param: ASTv1.Expression): HelperResolution | ResolutionFail | null {\n // We only need to handle StringLiterals since Ember already throws an error if unsupported values\n // are passed to the helper keyword.\n // If a helper reference is passed in we don't need to do anything since it's either the result of a previous\n // helper keyword invocation, or a helper reference that was imported somewhere.\n if (param.type === 'StringLiteral') {\n return this.targetDynamicHelper({ type: 'literal', path: param.value });\n }\n return null;\n }\n\n visitor: ASTPlugin['visitor'] = {\n Template: {\n enter: () => {\n if (this.env.locals) {\n this.scopeStack.pushMustacheBlock(this.env.locals);\n }\n },\n exit: () => {\n if (this.env.locals) {\n this.scopeStack.pop();\n }\n },\n },\n Block: {\n enter: node => {\n this.scopeStack.pushMustacheBlock(node.blockParams);\n },\n exit: () => {\n this.scopeStack.pop();\n },\n },\n BlockStatement: (node, path) => {\n if (node.path.type !== 'PathExpression') {\n return;\n }\n let rootName = node.path.parts[0];\n if (this.scopeStack.inScope(rootName, path)) {\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 let resolution = this.handleComponentHelper(node.params[0]);\n this.emit(path, resolution, (node, newIdentifier) => {\n node.params[0] = newIdentifier;\n });\n return;\n }\n let resolution = this.targetComponent(node.path.original);\n this.emit(path, resolution, (node, newId) => {\n node.path = newId;\n });\n if (resolution?.type === 'component') {\n this.scopeStack.enteringComponentBlock(resolution, ({ argumentsAreComponents }) => {\n this.handleDynamicComponentArguments(\n rootName,\n argumentsAreComponents,\n extendPath(extendPath(path, 'hash'), 'pairs')\n );\n });\n }\n },\n SubExpression: (node, path) => {\n if (node.path.type !== 'PathExpression') {\n return;\n }\n if (node.path.this === true) {\n return;\n }\n if (this.scopeStack.inScope(node.path.parts[0], path)) {\n return;\n }\n if (node.path.original === 'component' && node.params.length > 0) {\n let resolution = this.handleComponentHelper(node.params[0]);\n this.emit(path, resolution, (node, newId) => {\n node.params[0] = newId;\n });\n return;\n }\n if (node.path.original === 'helper' && node.params.length > 0) {\n let resolution = this.handleDynamicHelper(node.params[0]);\n this.emit(path, resolution, (node, newId) => {\n node.params[0] = newId;\n });\n return;\n }\n if (node.path.original === 'modifier' && node.params.length > 0) {\n let resolution = this.handleDynamicModifier(node.params[0]);\n this.emit(path, resolution, (node, newId) => {\n node.params[0] = newId;\n });\n return;\n }\n if (node.path.tail.length === 0 && node.path.head.type === 'VarHead') {\n let resolution = this.targetHelper(node.path.original);\n this.emit(path, resolution, (node, newId) => {\n node.path = newId;\n });\n }\n },\n MustacheStatement: {\n enter: (node, path) => {\n if (node.path.type !== 'PathExpression') {\n return;\n }\n let rootName = node.path.parts[0];\n if (this.scopeStack.inScope(rootName, path)) {\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.startsWith('@')) {\n // similarly, global resolution of helpers and components never\n // happens with argument paths (it could still be an invocation, but\n // it would be a lexically-scoped invocation, not one we need to\n // adjust)\n return;\n }\n if (node.path.original === 'component' && node.params.length > 0) {\n let resolution = this.handleComponentHelper(node.params[0]);\n this.emit(path, resolution, (node, newId) => {\n node.params[0] = newId;\n });\n return;\n }\n if (node.path.original === 'helper' && node.params.length > 0) {\n let resolution = this.handleDynamicHelper(node.params[0]);\n this.emit(path, resolution, (node, newIdentifier) => {\n node.params[0] = newIdentifier;\n });\n return;\n }\n if (path.parent?.node.type === 'AttrNode') {\n // this mustache is the value of an attribute. Components aren't\n // allowed here, so we're not ambiguous, so resolve a helper.\n let resolution = this.targetHelper(node.path.original);\n this.emit(path, resolution, (node, newIdentifier) => {\n node.path = newIdentifier;\n });\n return;\n }\n let hasArgs = node.params.length > 0 || node.hash.pairs.length > 0;\n let resolution = this.targetHelperOrComponent(node.path.original, node.path.loc, hasArgs);\n this.emit(path, resolution, (node, newIdentifier) => {\n node.path = newIdentifier;\n });\n if (resolution?.type === 'component') {\n this.handleDynamicComponentArguments(\n node.path.original,\n resolution.argumentsAreComponents,\n extendPath(extendPath(path, 'hash'), 'pairs')\n );\n }\n },\n },\n ElementModifierStatement: (node, path) => {\n if (node.path.type !== 'PathExpression') {\n return;\n }\n if (this.scopeStack.inScope(node.path.parts[0], path)) {\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 let resolution = this.targetElementModifier(node.path.original);\n this.emit(path, resolution, (node, newId) => {\n node.path = newId;\n });\n },\n ElementNode: {\n enter: (node, path) => {\n let rootName = node.tag.split('.')[0];\n if (!this.scopeStack.inScope(rootName, path)) {\n let resolution: ComponentResolution | null = null;\n\n // if it starts with lower case, it can't be a component we need to\n // globally resolve\n if (node.tag[0] !== node.tag[0].toLowerCase()) {\n resolution = this.targetComponent(dasherize(node.tag));\n }\n\n this.emit(path, resolution, (node, newId) => {\n node.tag = newId.original;\n });\n if (resolution?.type === 'component') {\n this.scopeStack.enteringComponentBlock(resolution, ({ argumentsAreComponents }) => {\n this.handleDynamicComponentArguments(node.tag, argumentsAreComponents, extendPath(path, 'attributes'));\n });\n }\n }\n this.scopeStack.pushElementBlock(node.blockParams, node);\n },\n exit: () => {\n this.scopeStack.pop();\n },\n },\n };\n}\n\n// This is the AST transform that resolves components, helpers and modifiers at build time\nexport default function makeResolverTransform({ appRoot }: Options) {\n let config: CompatResolverOptions = readJSONSync(join(locateEmbroiderWorkingDir(appRoot), 'resolver.json'));\n const resolverTransform: ASTPluginBuilder<Env> = env => {\n if (env.strictMode) {\n return {\n name: 'embroider-build-time-resolver-strict-noop',\n visitor: {},\n };\n }\n return new TemplateResolver(env, config);\n };\n (resolverTransform as any).parallelBabel = {\n requireFile: __filename,\n buildUsing: 'makeResolverTransform',\n params: { appRoot: appRoot },\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 =\n | { type: 'mustache'; blockParams: string[] }\n | { type: 'element'; blockParams: string[]; childrenOf: ASTv1.ElementNode }\n | ComponentBlockMarker;\n\nclass ScopeStack {\n private stack: ScopeEntry[] = [];\n\n // mustache blocks like:\n //\n // {{#stuff as |some block vars|}}\n //\n // are relatively simple for us because there's a dedicated `Block` AST node\n // that exactly covers the range in which the variables are in scope.\n pushMustacheBlock(blockParams: string[]) {\n this.stack.unshift({ type: 'mustache', blockParams });\n }\n\n // element blocks like:\n //\n // <Stuff as |some block vars|>\n //\n // are *not* so simple for us because there's no single AST node that exactly\n // covers the range in which the variables are in scope. For example, the\n // *attributes* of the element do not see the variables, but the children of\n // the element do.\n pushElementBlock(blockParams: string[], childrenOf: ASTv1.ElementNode) {\n this.stack.unshift({ type: 'element', blockParams, childrenOf });\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, fromPath: WalkerPath<ASTv1.Node>) {\n for (let scope of this.stack) {\n if (scope.type === 'mustache' && scope.blockParams.includes(name)) {\n return true;\n }\n if (\n scope.type === 'element' &&\n scope.blockParams.includes(name) &&\n withinElementBlock(fromPath, scope.childrenOf)\n ) {\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 === 'mustache' || here.type === 'element') && 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 extendPath<N extends ASTv1.Node, K extends keyof N>(\n path: WalkerPath<N>,\n key: K\n): N[K] extends ASTv1.Node ? WalkerPath<N[K]> : N[K] extends ASTv1.Node[] ? WalkerPath<N[K][0]>[] : never {\n const _WalkerPath = path.constructor as {\n new <Child extends ASTv1.Node>(\n node: Child,\n parent?: WalkerPath<ASTv1.Node> | null,\n parentKey?: string | null\n ): WalkerPath<Child>;\n };\n let child = path.node[key];\n if (Array.isArray(child)) {\n return child.map(c => new _WalkerPath(c, path, key as string)) as any;\n } else {\n return new _WalkerPath(child as any, path, key as string) as any;\n }\n}\n\nfunction capitalize(word: string): string {\n return word[0].toUpperCase() + word.slice(1);\n}\n\n// ElementNodes have both children and attributes and both of those are\n// \"children\" in the abstract syntax tree sense, but here we want to distinguish\n// between them.\nfunction withinElementBlock(childPath: WalkerPath<ASTv1.Node>, ancestorNode: ASTv1.ElementNode): Boolean {\n let cursor: WalkerPath<ASTv1.Node> | null = childPath;\n while (cursor && cursor.node !== ancestorNode) {\n if (ancestorNode.children.includes(cursor.node as ASTv1.Statement)) {\n return true;\n }\n cursor = cursor.parent;\n }\n return false;\n}\nfunction appendArrays(objValue: any, srcValue: any) {\n if (Array.isArray(objValue)) {\n return objValue.concat(srcValue);\n }\n}\n"]}
1
+ {"version":3,"file":"resolver-transform.js","sourceRoot":"","sources":["resolver-transform.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ASTv1, ASTPlugin, ASTPluginBuilder, ASTPluginEnvironment, WalkerPath } from '@glimmer/syntax';\nimport type {\n PreprocessedComponentRule,\n ActivePackageRules,\n ComponentRules,\n PackageRules,\n ModuleRules,\n} from './dependency-rules';\nimport { preprocessComponentRule, appTreeRulesDir } from './dependency-rules';\nimport { Memoize } from 'typescript-memoize';\nimport type { WithJSUtils } from 'babel-plugin-ember-template-compilation';\nimport assertNever from 'assert-never';\nimport { join, sep } from 'path';\nimport { readJSONSync } from 'fs-extra';\nimport { dasherize, snippetToDasherizedName } from './dasherize-component-name';\nimport type { ResolverOptions as CoreResolverOptions } from '@embroider/core';\nimport { Resolver, locateEmbroiderWorkingDir } from '@embroider/core';\nimport type CompatOptions from './options';\nimport type { AuditMessage, Loc } from './audit';\nimport { camelCase, mergeWith } from 'lodash';\n\ntype Env = WithJSUtils<ASTPluginEnvironment> & {\n filename: string;\n contents: string;\n strictMode?: boolean;\n locals?: string[];\n};\n\n// this is a subset of the full Options. We care about serializability, and we\n// only needs parts that are easily serializable, which is why we don't keep the\n// whole thing.\ntype UserConfig = Pick<\n Required<CompatOptions>,\n 'staticHelpers' | 'staticModifiers' | 'staticComponents' | 'allowUnsafeDynamicComponents'\n>;\n\nexport interface CompatResolverOptions extends CoreResolverOptions {\n activePackageRules: ActivePackageRules[];\n options: UserConfig;\n}\n\nexport interface Options {\n appRoot: string;\n}\n\nexport const builtInKeywords = [\n '-get-dynamic-var',\n '-in-element',\n '-with-dynamic-vars',\n 'action',\n 'array',\n 'component',\n 'concat',\n 'debugger',\n 'each-in',\n 'each',\n 'fn',\n 'get',\n 'has-block-params',\n 'has-block',\n 'hasBlock',\n 'hasBlockParams',\n 'hash',\n 'helper',\n 'if',\n 'in-element',\n 'input',\n 'let',\n 'link-to',\n 'loc',\n 'log',\n 'modifier',\n 'mount',\n 'mut',\n 'on',\n 'outlet',\n 'partial',\n 'query-params',\n 'readonly',\n 'textarea',\n 'unbound',\n 'unique-id',\n 'unless',\n 'with',\n 'yield',\n];\n\ninterface ComponentResolution {\n type: 'component';\n specifier: string;\n yieldsComponents: Required<ComponentRules>['yieldsSafeComponents'];\n yieldsArguments: Required<ComponentRules>['yieldsArguments'];\n argumentsAreComponents: string[];\n nameHint: string;\n}\n\ntype HelperResolution = {\n type: 'helper';\n nameHint: string;\n specifier: string;\n};\n\ntype ModifierResolution = {\n type: 'modifier';\n specifier: string;\n nameHint: string;\n};\n\ntype ResolutionResult = ComponentResolution | HelperResolution | ModifierResolution;\n\ninterface ResolutionFail {\n type: 'error';\n message: string;\n detail: string;\n loc: Loc;\n}\n\ntype Resolution = ResolutionResult | ResolutionFail;\n\ntype ComponentLocator =\n | {\n type: 'literal';\n path: string;\n }\n | {\n type: 'path';\n path: string;\n }\n | {\n type: 'other';\n };\n\nclass TemplateResolver implements ASTPlugin {\n readonly name = 'embroider-build-time-resolver';\n\n private auditHandler: undefined | ((msg: AuditMessage) => void);\n private scopeStack = new ScopeStack();\n\n private moduleResolver: Resolver;\n\n constructor(private env: Env, private config: CompatResolverOptions) {\n this.moduleResolver = new Resolver(config);\n if ((globalThis as any).embroider_audit) {\n this.auditHandler = (globalThis as any).embroider_audit;\n }\n }\n\n private emit<Target extends WalkerPath<ASTv1.Node>>(\n parentPath: Target,\n resolution: Resolution | null,\n setter: (target: Target['node'], newIdentifier: ASTv1.PathExpression) => void\n ) {\n switch (resolution?.type) {\n case 'error':\n this.reportError(resolution);\n return;\n case 'component':\n case 'modifier':\n case 'helper': {\n let name = this.env.meta.jsutils.bindImport(resolution.specifier, 'default', parentPath, {\n nameHint: resolution.nameHint,\n });\n setter(parentPath.node, this.env.syntax.builders.path(name));\n return;\n }\n case undefined:\n return;\n default:\n assertNever(resolution);\n }\n }\n\n private reportError(dep: ResolutionFail) {\n if (!this.auditHandler && !this.config.options.allowUnsafeDynamicComponents) {\n let e: any = new Error(`${dep.message}: ${dep.detail} in ${this.humanReadableFile(this.env.filename)}`);\n e.isTemplateResolverError = true;\n e.loc = dep.loc;\n e.moduleName = this.env.filename;\n throw e;\n }\n if (this.auditHandler) {\n this.auditHandler({\n message: dep.message,\n filename: this.env.filename,\n detail: dep.detail,\n loc: dep.loc,\n source: this.env.contents,\n });\n }\n }\n\n private humanReadableFile(file: string) {\n let { appRoot } = this.config;\n if (!appRoot.endsWith(sep)) {\n appRoot += sep;\n }\n if (file.startsWith(appRoot)) {\n return file.slice(appRoot.length);\n }\n return file;\n }\n\n private handleComponentHelper(\n param: ASTv1.Node,\n impliedBecause?: { componentName: string; argumentName: string }\n ): ComponentResolution | ResolutionFail | null {\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 return this.handleComponentHelper(param.path, impliedBecause);\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 null;\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 null;\n }\n if (param.path.type === 'PathExpression' && param.path.original === 'ensure-safe-component') {\n // safe because we trust ensure-safe-component\n return null;\n }\n locator = { type: 'other' };\n break;\n default:\n locator = { type: 'other' };\n }\n\n if (locator.type === 'path' && this.scopeStack.safeComponentInScope(locator.path)) {\n return null;\n }\n\n return this.targetComponentHelper(locator, param.loc, impliedBecause);\n }\n\n private handleDynamicComponentArguments(\n componentName: string,\n argumentsAreComponents: string[],\n attributes: WalkerPath<ASTv1.AttrNode | ASTv1.HashPair>[]\n ) {\n for (let name of argumentsAreComponents) {\n let attr = attributes.find(attr => {\n if (attr.node.type === 'AttrNode') {\n return attr.node.name === '@' + name;\n } else {\n return attr.node.key === name;\n }\n });\n if (attr) {\n let resolution = this.handleComponentHelper(attr.node.value, {\n componentName,\n argumentName: name,\n });\n this.emit(attr, resolution, (node, newId) => {\n if (node.type === 'AttrNode') {\n node.value = this.env.syntax.builders.mustache(newId);\n } else {\n node.value = newId;\n }\n });\n }\n }\n }\n\n private get staticComponentsEnabled(): boolean {\n return this.config.options.staticComponents || Boolean(this.auditHandler);\n }\n\n private get staticHelpersEnabled(): boolean {\n return this.config.options.staticHelpers || Boolean(this.auditHandler);\n }\n\n private get staticModifiersEnabled(): boolean {\n return this.config.options.staticModifiers || Boolean(this.auditHandler);\n }\n\n private isIgnoredComponent(dasherizedName: string) {\n return this.rules.components.get(dasherizedName)?.safeToIgnore;\n }\n\n @Memoize()\n private get rules() {\n // rules that are keyed by the filename they're talking about\n let files: Map<string, PreprocessedComponentRule> = new Map();\n\n // rules that are keyed by our dasherized interpretation of the component's name\n let components: Map<string, PreprocessedComponentRule> = new Map();\n\n // we're not responsible for filtering out rules for inactive packages here,\n // that is done before getting to us. So we should assume these are all in\n // force.\n for (let rule of this.config.activePackageRules) {\n if (rule.components) {\n for (let [snippet, rules] of Object.entries(rule.components)) {\n let processedRules = preprocessComponentRule(rules);\n let dasherizedName = this.standardDasherize(snippet, rule);\n components.set(dasherizedName, processedRules);\n if (rules.layout) {\n for (let root of rule.roots) {\n if (rules.layout.addonPath) {\n files.set(join(root, rules.layout.addonPath), processedRules);\n }\n if (rules.layout.appPath) {\n files.set(join(root, rules.layout.appPath), processedRules);\n }\n }\n }\n }\n }\n if (rule.appTemplates) {\n for (let [path, templateRules] of Object.entries(rule.appTemplates)) {\n let processedRules = preprocessComponentRule(templateRules);\n for (let root of rule.roots) {\n files.set(join(appTreeRulesDir(root, this.moduleResolver), path), processedRules);\n }\n }\n }\n if (rule.addonTemplates) {\n for (let [path, templateRules] of Object.entries(rule.addonTemplates)) {\n let processedRules = preprocessComponentRule(templateRules);\n for (let root of rule.roots) {\n files.set(join(root, path), processedRules);\n }\n }\n }\n }\n return { files, components };\n }\n\n private findRules(absPath: string): PreprocessedComponentRule | undefined {\n let fileRules = this.rules.files.get(absPath);\n let componentRules: PreprocessedComponentRule | undefined;\n\n let componentName = this.moduleResolver.reverseComponentLookup(absPath);\n if (componentName) {\n componentRules = this.rules.components.get(componentName);\n }\n\n if (fileRules && componentRules) {\n return mergeWith(fileRules, componentRules, appendArrays);\n }\n\n return fileRules ?? componentRules;\n }\n\n private standardDasherize(snippet: string, rule: PackageRules | ModuleRules): string {\n let name = snippetToDasherizedName(snippet);\n if (name == null) {\n throw new Error(`unable to parse component snippet \"${snippet}\" from rule ${JSON.stringify(rule, null, 2)}`);\n }\n return name;\n }\n\n private targetComponent(name: string): ComponentResolution | null {\n if (!this.staticComponentsEnabled) {\n return null;\n }\n\n if (builtInKeywords.includes(name)) {\n return null;\n }\n if (this.isIgnoredComponent(name)) {\n return null;\n }\n\n let componentRules = this.rules.components.get(name);\n return {\n type: 'component',\n specifier: `#embroider_compat/components/${name}`,\n yieldsComponents: componentRules ? componentRules.yieldsSafeComponents : [],\n yieldsArguments: componentRules ? componentRules.yieldsArguments : [],\n argumentsAreComponents: componentRules ? componentRules.argumentsAreComponents : [],\n nameHint: this.nameHint(name),\n };\n }\n\n private targetComponentHelper(\n component: ComponentLocator,\n loc: Loc,\n impliedBecause?: { componentName: string; argumentName: string }\n ): ComponentResolution | ResolutionFail | null {\n if (!this.staticComponentsEnabled) {\n return null;\n }\n\n let message;\n if (impliedBecause) {\n message = `argument \"${impliedBecause.argumentName}\" to component \"${impliedBecause.componentName}\" is treated as a component, but the value you're passing is dynamic`;\n } else {\n message = `Unsafe dynamic component`;\n }\n\n if (component.type === 'other') {\n return {\n type: 'error',\n message,\n detail: `cannot statically analyze this expression`,\n loc,\n };\n }\n if (component.type === 'path') {\n let ownComponentRules = this.findRules(this.env.filename);\n if (ownComponentRules && ownComponentRules.safeInteriorPaths.includes(component.path)) {\n return null;\n }\n return {\n type: 'error',\n message,\n detail: component.path,\n loc,\n };\n }\n\n return this.targetComponent(component.path);\n }\n\n private targetHelper(path: string): HelperResolution | null {\n if (!this.staticHelpersEnabled) {\n return null;\n }\n\n // people are not allowed to override the built-in helpers with their own\n // globally-named helpers. It throws an error. So it's fine for us to\n // prioritize the builtIns here without bothering to resolve a user helper\n // of the same name.\n if (builtInKeywords.includes(path)) {\n return null;\n }\n\n return {\n type: 'helper',\n specifier: `#embroider_compat/helpers/${path}`,\n nameHint: this.nameHint(path),\n };\n }\n\n private targetHelperOrComponent(\n path: string,\n loc: Loc,\n hasArgs: boolean\n ): ComponentResolution | HelperResolution | null {\n /*\n\n In earlier embroider versions we would do a bunch of module resolution right\n here inside the ast transform to try to resolve the ambiguity of this case\n and if we didn't find anything, leave the template unchanged. But that leads\n to both a lot of extra build-time expense (since we are attempting\n resolution for lots of things that may in fact be just some data and not a\n component invocation at all, and also since we are pre-resolving modules\n that will get resolved a second time by the final stage packager).\n\n Now, we're going to be less forgiving, because it streamlines the build for\n everyone who's not still using these *extremely* old patterns.\n\n The problematic case is:\n\n 1. In a non-strict template (because this whole resolver-transform.ts is a\n no-op on strict handlebars).\n\n 2. Have a mustache statement like: `{{something}}`, where `something` is:\n\n a. Not a variable in scope (for example, there's no preceeding line \n like `<Parent as |something|>`)\n b. Does not start with `@` because that must be an argument from outside this template.\n c. Does not contain a dot, like `some.thing` (because that case is classically \n never a global component resolution that we would need to handle)\n d. Does not start with `this` (this rule is mostly redundant with the previous rule, \n but even a standalone `this` is never a component invocation).\n e. Does not have any arguments. If there are argument like `{{something a=b}}`, \n there is still ambiguity between helper vs component, but there is no longer \n the possibility that this was just rendering some data.\n f. Does not take a block, like `{{#something}}{{/something}}` (because that is \n always a component, no ambiguity.)\n\n We can't tell if this problematic case is really:\n\n 1. A helper invocation with no arguments that is being directly rendered.\n Out-of-the-box, ember already generates [a lint\n error](https://github.com/ember-template-lint/ember-template-lint/blob/master/docs/rule/no-curly-component-invocation.md)\n for this, although it tells you to whitelist your helper when IMO it\n should tell you to use an unambiguous syntax like `{{ (something) }}`\n instead.\n\n 2. A component invocation, which you could have written `<Something />`\n instead. Angle-bracket invocation has been available and easy-to-adopt\n for a very long time. \n\n 3. Property-this-fallback for `{{this.something}}`. Property-this-fallback\n is eliminated at Ember 4.0, so people have been heavily pushed to get\n it out of their addons.\n */\n\n // first, bail out on all the stuff we can obviously ignore\n if (\n (!this.staticHelpersEnabled && !this.staticComponentsEnabled) ||\n builtInKeywords.includes(path) ||\n this.isIgnoredComponent(path)\n ) {\n return null;\n }\n\n let ownComponentRules = this.findRules(this.env.filename);\n if (ownComponentRules?.disambiguate[path]) {\n switch (ownComponentRules.disambiguate[path]) {\n case 'component':\n return this.targetComponent(path);\n case 'helper':\n return this.targetHelper(path);\n case 'data':\n return null;\n }\n }\n\n if (!hasArgs && !path.includes('/') && !path.includes('@')) {\n // this is the case that could also be property-this-fallback. We're going\n // to force people to disambiguate, because letting a potential component\n // or helper invocation lurk inside every bit of data you render is not\n // ok.\n this.reportError({\n type: 'error',\n message: 'unsupported ambiguous syntax',\n detail: `\"{{${path}}}\" is ambiguous and could mean \"{{this.${path}}}\" or component \"<${capitalize(\n camelCase(path)\n )} />\" or helper \"{{ (${path}) }}\". Change it to one of those unambigous forms, or use a \"disambiguate\" packageRule to work around the problem if its in third-party code you cannot easily fix.`,\n loc,\n });\n return null;\n }\n\n // Above we already bailed out if both of these were disabled, so we know at\n // least one is turned on. If both aren't turned on, we're stuck, because we\n // can't even tell if this *is* a component vs a helper.\n if (!this.staticHelpersEnabled || !this.staticComponentsEnabled) {\n this.reportError({\n type: 'error',\n message: 'unsupported ambiguity between helper and component',\n detail: `this use of \"{{${path}}}\" could be helper \"{{ (${path}) }}\" or component \"<${capitalize(\n camelCase(path)\n )} />\", and your settings for staticHelpers and staticComponents do not agree. Either switch to one of the unambiguous forms, or make staticHelpers and staticComponents agree, or use a \"disambiguate\" packageRule to work around the problem if its in third-party code you cannot easily fix.`,\n loc,\n });\n return null;\n }\n\n let componentRules = this.rules.components.get(path);\n return {\n type: 'component',\n specifier: `#embroider_compat/ambiguous/${path}`,\n yieldsComponents: componentRules ? componentRules.yieldsSafeComponents : [],\n yieldsArguments: componentRules ? componentRules.yieldsArguments : [],\n argumentsAreComponents: componentRules ? componentRules.argumentsAreComponents : [],\n nameHint: this.nameHint(path),\n };\n }\n\n private targetElementModifier(path: string): ModifierResolution | null {\n if (!this.staticModifiersEnabled) {\n return null;\n }\n if (builtInKeywords.includes(path)) {\n return null;\n }\n\n return {\n type: 'modifier',\n specifier: `#embroider_compat/modifiers/${path}`,\n nameHint: this.nameHint(path),\n };\n }\n\n targetDynamicModifier(modifier: ComponentLocator, loc: Loc): ModifierResolution | ResolutionFail | null {\n if (!this.staticModifiersEnabled) {\n return null;\n }\n\n if (modifier.type === 'literal') {\n return this.targetElementModifier(modifier.path);\n } else {\n return {\n type: 'error',\n message: 'Unsafe dynamic modifier',\n detail: `cannot statically analyze this expression`,\n loc,\n };\n }\n }\n\n private targetDynamicHelper(helper: ComponentLocator): HelperResolution | null {\n if (!this.staticHelpersEnabled) {\n return null;\n }\n\n if (helper.type === 'literal') {\n return this.targetHelper(helper.path);\n }\n\n // we don't have to manage any errors in this case because ember itself\n // considers it an error to pass anything but a string literal to the\n // `helper` helper.\n return null;\n }\n\n private nameHint(path: string) {\n let parts = path.split('@');\n\n // the extra underscore here guarantees that we will never collide with an\n // HTML element.\n return parts[parts.length - 1] + '_';\n }\n\n private handleDynamicModifier(param: ASTv1.Expression): ModifierResolution | ResolutionFail | null {\n if (param.type === 'StringLiteral') {\n return this.targetDynamicModifier({ type: 'literal', path: param.value }, param.loc);\n }\n // we don't have to manage any errors in this case because ember itself\n // considers it an error to pass anything but a string literal to the\n // modifier helper.\n return null;\n }\n\n private handleDynamicHelper(param: ASTv1.Expression): HelperResolution | ResolutionFail | null {\n // We only need to handle StringLiterals since Ember already throws an error if unsupported values\n // are passed to the helper keyword.\n // If a helper reference is passed in we don't need to do anything since it's either the result of a previous\n // helper keyword invocation, or a helper reference that was imported somewhere.\n if (param.type === 'StringLiteral') {\n return this.targetDynamicHelper({ type: 'literal', path: param.value });\n }\n return null;\n }\n\n visitor: ASTPlugin['visitor'] = {\n Template: {\n enter: () => {\n if (this.env.locals) {\n this.scopeStack.pushMustacheBlock(this.env.locals);\n }\n },\n exit: () => {\n if (this.env.locals) {\n this.scopeStack.pop();\n }\n },\n },\n Block: {\n enter: node => {\n this.scopeStack.pushMustacheBlock(node.blockParams);\n },\n exit: () => {\n this.scopeStack.pop();\n },\n },\n BlockStatement: (node, path) => {\n if (node.path.type !== 'PathExpression') {\n return;\n }\n let rootName = node.path.parts[0];\n if (this.scopeStack.inScope(rootName, path)) {\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 let resolution = this.handleComponentHelper(node.params[0]);\n this.emit(path, resolution, (node, newIdentifier) => {\n node.params[0] = newIdentifier;\n });\n return;\n }\n let resolution = this.targetComponent(node.path.original);\n this.emit(path, resolution, (node, newId) => {\n node.path = newId;\n });\n if (resolution?.type === 'component') {\n this.scopeStack.enteringComponentBlock(resolution, ({ argumentsAreComponents }) => {\n this.handleDynamicComponentArguments(\n rootName,\n argumentsAreComponents,\n extendPath(extendPath(path, 'hash'), 'pairs')\n );\n });\n }\n },\n SubExpression: (node, path) => {\n if (node.path.type !== 'PathExpression') {\n return;\n }\n if (node.path.this === true) {\n return;\n }\n if (this.scopeStack.inScope(node.path.parts[0], path)) {\n return;\n }\n if (node.path.original === 'component' && node.params.length > 0) {\n let resolution = this.handleComponentHelper(node.params[0]);\n this.emit(path, resolution, (node, newId) => {\n node.params[0] = newId;\n });\n return;\n }\n if (node.path.original === 'helper' && node.params.length > 0) {\n let resolution = this.handleDynamicHelper(node.params[0]);\n this.emit(path, resolution, (node, newId) => {\n node.params[0] = newId;\n });\n return;\n }\n if (node.path.original === 'modifier' && node.params.length > 0) {\n let resolution = this.handleDynamicModifier(node.params[0]);\n this.emit(path, resolution, (node, newId) => {\n node.params[0] = newId;\n });\n return;\n }\n if (node.path.tail.length === 0 && node.path.head.type === 'VarHead') {\n let resolution = this.targetHelper(node.path.original);\n this.emit(path, resolution, (node, newId) => {\n node.path = newId;\n });\n }\n },\n MustacheStatement: {\n enter: (node, path) => {\n if (node.path.type !== 'PathExpression') {\n return;\n }\n let rootName = node.path.parts[0];\n if (this.scopeStack.inScope(rootName, path)) {\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.startsWith('@')) {\n // similarly, global resolution of helpers and components never\n // happens with argument paths (it could still be an invocation, but\n // it would be a lexically-scoped invocation, not one we need to\n // adjust)\n return;\n }\n if (node.path.original === 'component' && node.params.length > 0) {\n let resolution = this.handleComponentHelper(node.params[0]);\n this.emit(path, resolution, (node, newId) => {\n node.params[0] = newId;\n });\n return;\n }\n if (node.path.original === 'helper' && node.params.length > 0) {\n let resolution = this.handleDynamicHelper(node.params[0]);\n this.emit(path, resolution, (node, newIdentifier) => {\n node.params[0] = newIdentifier;\n });\n return;\n }\n if (path.parent?.node.type === 'AttrNode') {\n // this mustache is the value of an attribute. Components aren't\n // allowed here, so we're not ambiguous, so resolve a helper.\n let resolution = this.targetHelper(node.path.original);\n this.emit(path, resolution, (node, newIdentifier) => {\n node.path = newIdentifier;\n });\n return;\n }\n let hasArgs = node.params.length > 0 || node.hash.pairs.length > 0;\n let resolution = this.targetHelperOrComponent(node.path.original, node.path.loc, hasArgs);\n this.emit(path, resolution, (node, newIdentifier) => {\n node.path = newIdentifier;\n });\n if (resolution?.type === 'component') {\n this.handleDynamicComponentArguments(\n node.path.original,\n resolution.argumentsAreComponents,\n extendPath(extendPath(path, 'hash'), 'pairs')\n );\n }\n },\n },\n ElementModifierStatement: (node, path) => {\n if (node.path.type !== 'PathExpression') {\n return;\n }\n if (this.scopeStack.inScope(node.path.parts[0], path)) {\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 let resolution = this.targetElementModifier(node.path.original);\n this.emit(path, resolution, (node, newId) => {\n node.path = newId;\n });\n },\n ElementNode: {\n enter: (node, path) => {\n let rootName = node.tag.split('.')[0];\n if (!this.scopeStack.inScope(rootName, path)) {\n let resolution: ComponentResolution | null = null;\n\n // if it starts with lower case, it can't be a component we need to\n // globally resolve\n if (node.tag[0] !== node.tag[0].toLowerCase()) {\n resolution = this.targetComponent(dasherize(node.tag));\n }\n\n this.emit(path, resolution, (node, newId) => {\n node.tag = newId.original;\n });\n if (resolution?.type === 'component') {\n this.scopeStack.enteringComponentBlock(resolution, ({ argumentsAreComponents }) => {\n this.handleDynamicComponentArguments(node.tag, argumentsAreComponents, extendPath(path, 'attributes'));\n });\n }\n }\n this.scopeStack.pushElementBlock(node.blockParams, node);\n },\n exit: () => {\n this.scopeStack.pop();\n },\n },\n };\n}\n\n// This is the AST transform that resolves components, helpers and modifiers at build time\nexport default function makeResolverTransform({ appRoot }: Options) {\n let config: CompatResolverOptions = readJSONSync(join(locateEmbroiderWorkingDir(appRoot), 'resolver.json'));\n const resolverTransform: ASTPluginBuilder<Env> = env => {\n if (env.strictMode) {\n return {\n name: 'embroider-build-time-resolver-strict-noop',\n visitor: {},\n };\n }\n return new TemplateResolver(env, config);\n };\n (resolverTransform as any).parallelBabel = {\n requireFile: __filename,\n buildUsing: 'makeResolverTransform',\n params: { appRoot: appRoot },\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 =\n | { type: 'mustache'; blockParams: string[] }\n | { type: 'element'; blockParams: string[]; childrenOf: ASTv1.ElementNode }\n | ComponentBlockMarker;\n\nclass ScopeStack {\n private stack: ScopeEntry[] = [];\n\n // mustache blocks like:\n //\n // {{#stuff as |some block vars|}}\n //\n // are relatively simple for us because there's a dedicated `Block` AST node\n // that exactly covers the range in which the variables are in scope.\n pushMustacheBlock(blockParams: string[]) {\n this.stack.unshift({ type: 'mustache', blockParams });\n }\n\n // element blocks like:\n //\n // <Stuff as |some block vars|>\n //\n // are *not* so simple for us because there's no single AST node that exactly\n // covers the range in which the variables are in scope. For example, the\n // *attributes* of the element do not see the variables, but the children of\n // the element do.\n pushElementBlock(blockParams: string[], childrenOf: ASTv1.ElementNode) {\n this.stack.unshift({ type: 'element', blockParams, childrenOf });\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, fromPath: WalkerPath<ASTv1.Node>) {\n for (let scope of this.stack) {\n if (scope.type === 'mustache' && scope.blockParams.includes(name)) {\n return true;\n }\n if (\n scope.type === 'element' &&\n scope.blockParams.includes(name) &&\n withinElementBlock(fromPath, scope.childrenOf)\n ) {\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 === 'mustache' || here.type === 'element') && 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 extendPath<N extends ASTv1.Node, K extends keyof N>(\n path: WalkerPath<N>,\n key: K\n): N[K] extends ASTv1.Node ? WalkerPath<N[K]> : N[K] extends ASTv1.Node[] ? WalkerPath<N[K][0]>[] : never {\n const _WalkerPath = path.constructor as {\n new <Child extends ASTv1.Node>(\n node: Child,\n parent?: WalkerPath<ASTv1.Node> | null,\n parentKey?: string | null\n ): WalkerPath<Child>;\n };\n let child = path.node[key];\n if (Array.isArray(child)) {\n return child.map(c => new _WalkerPath(c, path, key as string)) as any;\n } else {\n return new _WalkerPath(child as any, path, key as string) as any;\n }\n}\n\nfunction capitalize(word: string): string {\n return word[0].toUpperCase() + word.slice(1);\n}\n\n// ElementNodes have both children and attributes and both of those are\n// \"children\" in the abstract syntax tree sense, but here we want to distinguish\n// between them.\nfunction withinElementBlock(childPath: WalkerPath<ASTv1.Node>, ancestorNode: ASTv1.ElementNode): Boolean {\n let cursor: WalkerPath<ASTv1.Node> | null = childPath;\n while (cursor && cursor.node !== ancestorNode) {\n if (ancestorNode.children.includes(cursor.node as ASTv1.Statement)) {\n return true;\n }\n cursor = cursor.parent;\n }\n return false;\n}\nfunction appendArrays(objValue: any, srcValue: any) {\n if (Array.isArray(objValue)) {\n return objValue.concat(srcValue);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"rewrite-addon-tree.js","sourceRoot":"","sources":["rewrite-addon-tree.ts"],"names":[],"mappings":";;;;;AAAA,sEAA0C;AAC1C,gFAA8C;AAC9C,sDAA8B;AAG9B,gEAAsC;AACtC,uCAA2D;AAC3D,+BAAsC;AAqCtC,SAAwB,gBAAgB,CACtC,IAAU,EACV,IAAY,EACZ,UAAkB;IAElB,IAAI,OAAO,GAA+B,EAAE,CAAC;IAE7C,IAAI,GAAG,IAAI,qBAAS,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE;QACtC,KAAK,IAAI,IAAI,IAAI,IAAA,sBAAW,EAAC,UAAU,CAAC,EAAE;YACxC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;gBACzB,SAAS;aACV;YACD,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YACxC,IAAI,CAAC,IAAA,mBAAQ,EAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE;gBAChC,SAAS;aACV;YACD,IAAA,mBAAQ,EAAC,QAAQ,EAAE,IAAA,WAAI,EAAC,UAAU,EAAE,IAAA,eAAQ,EAAC,IAAI,EAAE,KAAK,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;SACzE;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,SAAS,GAAG,IAAI,gBAAM,CACxB,IAAI,EACJ;QACE,YAAY,EAAE,IAAI,MAAM,CAAC,IAAI,UAAU,GAAG,CAAC;QAC3C,aAAa,EAAE,CAAC,QAAkB,EAAE,EAAE;YACpC,KAAK,IAAI,OAAO,IAAI,QAAQ,EAAE;gBAC5B,OAAO,CAAC,OAAO,CAAC,GAAG,GAAG,IAAI,IAAI,OAAO,EAAE,CAAC;aACzC;QACH,CAAC;KACF,EACD;QACE,MAAM,EAAE,UAAU;QAClB,UAAU,EAAE,IAAI;KACjB,CACF,CAAC;IACF,IAAI,QAAQ,GAAG,IAAA,yBAAW,EAAC,IAAI,EAAE;QAC/B,OAAO,EAAE,CAAC,GAAG,UAAU,KAAK,CAAC;KAC9B,CAAC,CAAC;IACH,OAAO;QACL,IAAI,EAAE,IAAA,8BAAU,EAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACvC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC;KAChD,CAAC;AACJ,CAAC;AA1CD,mCA0CC","sourcesContent":["import buildFunnel from 'broccoli-funnel';\nimport mergeTrees from 'broccoli-merge-trees';\nimport Snitch from './snitch';\nimport type { Node } from 'broccoli-node-api';\nimport type { AddonMeta } from '@embroider/core';\nimport AddToTree from './add-to-tree';\nimport { moveSync, readdirSync, statSync } from 'fs-extra';\nimport { join, basename } from 'path';\n\n/*\n The traditional addon and addon-test-support trees allows you to emit modules\n under any package you feel like. Which we are NOT COOL WITH.\n\n This transform re-captures anything you try to put into other people's\n packages, puts them back into your own, and tracks what renaming is required\n by your consumers so they can still find those things.\n\n Example:\n\n ember-qunit emits an addon-test-support tree like:\n\n ā”œā”€ā”€ ember-qunit\n │   ā”œā”€ā”€ adapter.js\n │   ā”œā”€ā”€ index.js\n │   └── ...\n └── qunit\n └── index.js\n\n The part that is under \"ember-qunit\" gets handled normally, in that we can\n merge it directly into our own v2 package root so people can import the\n modules from their tests.\n\n But the shim under \"qunit\" gets moved *into* the ember-qunit package, and\n consumers of ember-qunit will get renaming from:\n\n import { test } from 'qunit';\n\n to\n\n import { test } from 'ember-qunit/qunit';\n*/\n\ntype GetMeta = () => Partial<AddonMeta>;\n\nexport default function rewriteAddonTree(\n tree: Node,\n name: string,\n moduleName: string\n): { tree: Node; getMeta: GetMeta } {\n let renamed: { [name: string]: string } = {};\n\n tree = new AddToTree(tree, outputPath => {\n for (let file of readdirSync(outputPath)) {\n if (!file.endsWith('.js')) {\n continue;\n }\n const filePath = join(outputPath, file);\n if (!statSync(filePath).isFile()) {\n continue;\n }\n moveSync(filePath, join(outputPath, basename(file, '.js'), 'index.js'));\n }\n });\n\n let goodParts = new Snitch(\n tree,\n {\n allowedPaths: new RegExp(`^${moduleName}/`),\n foundBadPaths: (badPaths: string[]) => {\n for (let badPath of badPaths) {\n renamed[badPath] = `${name}/${badPath}`;\n }\n },\n },\n {\n srcDir: moduleName,\n allowEmpty: true,\n }\n );\n let badParts = buildFunnel(tree, {\n exclude: [`${moduleName}/**`],\n });\n return {\n tree: mergeTrees([goodParts, badParts]),\n getMeta: () => ({ 'renamed-modules': renamed }),\n };\n}\n"]}
1
+ {"version":3,"file":"rewrite-addon-tree.js","sourceRoot":"","sources":["rewrite-addon-tree.ts"],"names":[],"mappings":";;;;;AAAA,sEAA0C;AAC1C,gFAA8C;AAC9C,sDAA8B;AAG9B,gEAAsC;AACtC,uCAA2D;AAC3D,+BAAsC;AAqCtC,SAAwB,gBAAgB,CACtC,IAAU,EACV,IAAY,EACZ,UAAkB;IAElB,IAAI,OAAO,GAA+B,EAAE,CAAC;IAE7C,IAAI,GAAG,IAAI,qBAAS,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE;QACtC,KAAK,IAAI,IAAI,IAAI,IAAA,sBAAW,EAAC,UAAU,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1B,SAAS;YACX,CAAC;YACD,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YACxC,IAAI,CAAC,IAAA,mBAAQ,EAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;gBACjC,SAAS;YACX,CAAC;YACD,IAAA,mBAAQ,EAAC,QAAQ,EAAE,IAAA,WAAI,EAAC,UAAU,EAAE,IAAA,eAAQ,EAAC,IAAI,EAAE,KAAK,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,SAAS,GAAG,IAAI,gBAAM,CACxB,IAAI,EACJ;QACE,YAAY,EAAE,IAAI,MAAM,CAAC,IAAI,UAAU,GAAG,CAAC;QAC3C,aAAa,EAAE,CAAC,QAAkB,EAAE,EAAE;YACpC,KAAK,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC7B,OAAO,CAAC,OAAO,CAAC,GAAG,GAAG,IAAI,IAAI,OAAO,EAAE,CAAC;YAC1C,CAAC;QACH,CAAC;KACF,EACD;QACE,MAAM,EAAE,UAAU;QAClB,UAAU,EAAE,IAAI;KACjB,CACF,CAAC;IACF,IAAI,QAAQ,GAAG,IAAA,yBAAW,EAAC,IAAI,EAAE;QAC/B,OAAO,EAAE,CAAC,GAAG,UAAU,KAAK,CAAC;KAC9B,CAAC,CAAC;IACH,OAAO;QACL,IAAI,EAAE,IAAA,8BAAU,EAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACvC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC;KAChD,CAAC;AACJ,CAAC;AA1CD,mCA0CC","sourcesContent":["import buildFunnel from 'broccoli-funnel';\nimport mergeTrees from 'broccoli-merge-trees';\nimport Snitch from './snitch';\nimport type { Node } from 'broccoli-node-api';\nimport type { AddonMeta } from '@embroider/core';\nimport AddToTree from './add-to-tree';\nimport { moveSync, readdirSync, statSync } from 'fs-extra';\nimport { join, basename } from 'path';\n\n/*\n The traditional addon and addon-test-support trees allows you to emit modules\n under any package you feel like. Which we are NOT COOL WITH.\n\n This transform re-captures anything you try to put into other people's\n packages, puts them back into your own, and tracks what renaming is required\n by your consumers so they can still find those things.\n\n Example:\n\n ember-qunit emits an addon-test-support tree like:\n\n ā”œā”€ā”€ ember-qunit\n │   ā”œā”€ā”€ adapter.js\n │   ā”œā”€ā”€ index.js\n │   └── ...\n └── qunit\n └── index.js\n\n The part that is under \"ember-qunit\" gets handled normally, in that we can\n merge it directly into our own v2 package root so people can import the\n modules from their tests.\n\n But the shim under \"qunit\" gets moved *into* the ember-qunit package, and\n consumers of ember-qunit will get renaming from:\n\n import { test } from 'qunit';\n\n to\n\n import { test } from 'ember-qunit/qunit';\n*/\n\ntype GetMeta = () => Partial<AddonMeta>;\n\nexport default function rewriteAddonTree(\n tree: Node,\n name: string,\n moduleName: string\n): { tree: Node; getMeta: GetMeta } {\n let renamed: { [name: string]: string } = {};\n\n tree = new AddToTree(tree, outputPath => {\n for (let file of readdirSync(outputPath)) {\n if (!file.endsWith('.js')) {\n continue;\n }\n const filePath = join(outputPath, file);\n if (!statSync(filePath).isFile()) {\n continue;\n }\n moveSync(filePath, join(outputPath, basename(file, '.js'), 'index.js'));\n }\n });\n\n let goodParts = new Snitch(\n tree,\n {\n allowedPaths: new RegExp(`^${moduleName}/`),\n foundBadPaths: (badPaths: string[]) => {\n for (let badPath of badPaths) {\n renamed[badPath] = `${name}/${badPath}`;\n }\n },\n },\n {\n srcDir: moduleName,\n allowEmpty: true,\n }\n );\n let badParts = buildFunnel(tree, {\n exclude: [`${moduleName}/**`],\n });\n return {\n tree: mergeTrees([goodParts, badParts]),\n getMeta: () => ({ 'renamed-modules': renamed }),\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"smoosh-package-json.js","sourceRoot":"","sources":["smoosh-package-json.ts"],"names":[],"mappings":";;;;;AAAA,sEAAqC;AAErC,2BAA6D;AAC7D,+BAA4B;AAC5B,qCAAyC;AAEzC,MAAqB,iBAAkB,SAAQ,yBAAM;IACnD,YAAY,UAAkB,EAAE,OAAgC,EAAE;QAChE,KAAK,CAAC,UAAU,EAAE;YAChB,UAAU,EAAE,sCAAsC,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,UAAU,EAAE;YACpE,gBAAgB,EAAE,IAAI;YACtB,UAAU,EAAE,KAAK;SAClB,CAAC,CAAC;IACL,CAAC;IAED,KAAK;QACH,IAAI,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YACjC,IAAI,OAAO,GAAG,IAAA,WAAI,EAAC,CAAC,EAAE,cAAc,CAAC,CAAC;YACtC,IAAI,IAAA,eAAU,EAAC,OAAO,CAAC,EAAE;gBACvB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;aAClD;QACH,CAAC,CAAC,CAAC;QACH,IAAI,GAAG,GAAG,IAAA,sBAAa,EAAC,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;QACrC,IAAA,kBAAa,EAAC,IAAA,WAAI,EAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC7F,CAAC;CACF;AAnBD,oCAmBC","sourcesContent":["import Plugin from 'broccoli-plugin';\nimport type { Node } from 'broccoli-node-api';\nimport { readFileSync, writeFileSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { mergeWithUniq } from './merges';\n\nexport default class SmooshPackageJSON extends Plugin {\n constructor(inputTrees: Node[], opts: { annotation?: string } = {}) {\n super(inputTrees, {\n annotation: `embroider:core:smoosh-package-json:${opts?.annotation}`,\n persistentOutput: true,\n needsCache: false,\n });\n }\n\n build() {\n let pkgs = this.inputPaths.map(p => {\n let pkgPath = join(p, 'package.json');\n if (existsSync(pkgPath)) {\n return JSON.parse(readFileSync(pkgPath, 'utf8'));\n }\n });\n let pkg = mergeWithUniq({}, ...pkgs);\n writeFileSync(join(this.outputPath, 'package.json'), JSON.stringify(pkg, null, 2), 'utf8');\n }\n}\n"]}
1
+ {"version":3,"file":"smoosh-package-json.js","sourceRoot":"","sources":["smoosh-package-json.ts"],"names":[],"mappings":";;;;;AAAA,sEAAqC;AAErC,2BAA6D;AAC7D,+BAA4B;AAC5B,qCAAyC;AAEzC,MAAqB,iBAAkB,SAAQ,yBAAM;IACnD,YAAY,UAAkB,EAAE,OAAgC,EAAE;QAChE,KAAK,CAAC,UAAU,EAAE;YAChB,UAAU,EAAE,sCAAsC,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,UAAU,EAAE;YACpE,gBAAgB,EAAE,IAAI;YACtB,UAAU,EAAE,KAAK;SAClB,CAAC,CAAC;IACL,CAAC;IAED,KAAK;QACH,IAAI,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YACjC,IAAI,OAAO,GAAG,IAAA,WAAI,EAAC,CAAC,EAAE,cAAc,CAAC,CAAC;YACtC,IAAI,IAAA,eAAU,EAAC,OAAO,CAAC,EAAE,CAAC;gBACxB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;YACnD,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAI,GAAG,GAAG,IAAA,sBAAa,EAAC,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;QACrC,IAAA,kBAAa,EAAC,IAAA,WAAI,EAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC7F,CAAC;CACF;AAnBD,oCAmBC","sourcesContent":["import Plugin from 'broccoli-plugin';\nimport type { Node } from 'broccoli-node-api';\nimport { readFileSync, writeFileSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { mergeWithUniq } from './merges';\n\nexport default class SmooshPackageJSON extends Plugin {\n constructor(inputTrees: Node[], opts: { annotation?: string } = {}) {\n super(inputTrees, {\n annotation: `embroider:core:smoosh-package-json:${opts?.annotation}`,\n persistentOutput: true,\n needsCache: false,\n });\n }\n\n build() {\n let pkgs = this.inputPaths.map(p => {\n let pkgPath = join(p, 'package.json');\n if (existsSync(pkgPath)) {\n return JSON.parse(readFileSync(pkgPath, 'utf8'));\n }\n });\n let pkg = mergeWithUniq({}, ...pkgs);\n writeFileSync(join(this.outputPath, 'package.json'), JSON.stringify(pkg, null, 2), 'utf8');\n }\n}\n"]}
package/src/snitch.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"snitch.js","sourceRoot":"","sources":["snitch.ts"],"names":[],"mappings":";;;;;AACA,qDAAyC;AACzC,0DAAiC;AAGjC;;;;;;EAME;AAEF,MAAqB,MAAO,SAAQ,wBAAM;IAKxC,YACE,SAAe,EACf,aAAgE,EAChE,aAA4B;QAE5B,KAAK,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QAP1B,cAAS,GAAG,IAAI,CAAC;QAQvB,IAAI,CAAC,YAAY,GAAG,aAAa,CAAC,YAAY,CAAC;QAC/C,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC,aAAa,CAAC;IACnD,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,QAAQ,GAAa,EAAE,CAAC;YAC5B,IAAA,mBAAQ,EAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;gBAClE,IAAI,QAAQ,KAAK,UAAU,EAAE;oBAC3B,OAAO;iBACR;gBACD,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;oBACrC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;iBACzB;YACH,CAAC,CAAC,CAAC;YACH,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;gBACvB,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;aAC9B;YACD,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;SACxB;QACD,OAAO,KAAK,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF;AAjCD,yBAiCC","sourcesContent":["import type { Options as FunnelOptions } from 'broccoli-funnel';\nimport { Funnel } from 'broccoli-funnel';\nimport walkSync from 'walk-sync';\nimport type { Node } from 'broccoli-node-api';\n\n/*\n This is used to monitor when addons are emitting badly-behaved broccoli\n trees that don't follow directory-naming conventions.\n\n We only check on the first build, on the assumption that it's rare to change\n after that.\n*/\n\nexport default class Snitch extends Funnel {\n private allowedPaths: RegExp;\n private foundBadPaths: Function;\n private mustCheck = true;\n\n constructor(\n inputTree: Node,\n snitchOptions: { allowedPaths: RegExp; foundBadPaths: Function },\n funnelOptions: FunnelOptions\n ) {\n super(inputTree, funnelOptions);\n this.allowedPaths = snitchOptions.allowedPaths;\n this.foundBadPaths = snitchOptions.foundBadPaths;\n }\n\n build() {\n if (this.mustCheck) {\n let badPaths: string[] = [];\n walkSync(this.inputPaths[0], { directories: false }).map(filename => {\n if (filename === '.gitkeep') {\n return;\n }\n if (!this.allowedPaths.test(filename)) {\n badPaths.push(filename);\n }\n });\n if (badPaths.length > 0) {\n this.foundBadPaths(badPaths);\n }\n this.mustCheck = false;\n }\n return super.build();\n }\n}\n"]}
1
+ {"version":3,"file":"snitch.js","sourceRoot":"","sources":["snitch.ts"],"names":[],"mappings":";;;;;AACA,qDAAyC;AACzC,0DAAiC;AAGjC;;;;;;EAME;AAEF,MAAqB,MAAO,SAAQ,wBAAM;IAKxC,YACE,SAAe,EACf,aAAgE,EAChE,aAA4B;QAE5B,KAAK,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QAP1B,cAAS,GAAG,IAAI,CAAC;QAQvB,IAAI,CAAC,YAAY,GAAG,aAAa,CAAC,YAAY,CAAC;QAC/C,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC,aAAa,CAAC;IACnD,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,IAAI,QAAQ,GAAa,EAAE,CAAC;YAC5B,IAAA,mBAAQ,EAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;gBAClE,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;oBAC5B,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACtC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC,CAAC,CAAC;YACH,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YAC/B,CAAC;YACD,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACzB,CAAC;QACD,OAAO,KAAK,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF;AAjCD,yBAiCC","sourcesContent":["import type { Options as FunnelOptions } from 'broccoli-funnel';\nimport { Funnel } from 'broccoli-funnel';\nimport walkSync from 'walk-sync';\nimport type { Node } from 'broccoli-node-api';\n\n/*\n This is used to monitor when addons are emitting badly-behaved broccoli\n trees that don't follow directory-naming conventions.\n\n We only check on the first build, on the assumption that it's rare to change\n after that.\n*/\n\nexport default class Snitch extends Funnel {\n private allowedPaths: RegExp;\n private foundBadPaths: Function;\n private mustCheck = true;\n\n constructor(\n inputTree: Node,\n snitchOptions: { allowedPaths: RegExp; foundBadPaths: Function },\n funnelOptions: FunnelOptions\n ) {\n super(inputTree, funnelOptions);\n this.allowedPaths = snitchOptions.allowedPaths;\n this.foundBadPaths = snitchOptions.foundBadPaths;\n }\n\n build() {\n if (this.mustCheck) {\n let badPaths: string[] = [];\n walkSync(this.inputPaths[0], { directories: false }).map(filename => {\n if (filename === '.gitkeep') {\n return;\n }\n if (!this.allowedPaths.test(filename)) {\n badPaths.push(filename);\n }\n });\n if (badPaths.length > 0) {\n this.foundBadPaths(badPaths);\n }\n this.mustCheck = false;\n }\n return super.build();\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"standalone-addon-build.js","sourceRoot":"","sources":["standalone-addon-build.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Package, RewrittenPackageIndex } from '@embroider/core';\nimport { PackageCache, summarizePeerDepViolations, validatePeerDependencies } from '@embroider/core';\nimport V1InstanceCache from './v1-instance-cache';\nimport buildCompatAddon from './build-compat-addon';\nimport { Funnel } from 'broccoli-funnel';\nimport crypto from 'crypto';\nimport broccoliMergeTrees from 'broccoli-merge-trees';\nimport writeFile from 'broccoli-file-creator';\nimport type { Node } from 'broccoli-node-api';\nimport type CompatApp from './compat-app';\nimport { join } from 'path';\n\nexport function convertLegacyAddons(compatApp: CompatApp) {\n let packageCache = PackageCache.shared('embroider', compatApp.root);\n let instanceCache = new V1InstanceCache(compatApp, packageCache);\n\n let appPackage = compatApp.appPackage();\n\n let violations = validatePeerDependencies(appPackage).filter(({ dep }) => dep.isEmberPackage() && !dep.isV2Ember());\n if (violations.length > 0) {\n if (process.env.I_HAVE_BAD_PEER_DEPS_AND_WANT_A_BROKEN_BUILD) {\n console.warn(\n `You have set process.env.I_HAVE_BAD_PEER_DEPS_AND_WANT_A_BROKEN_BUILD, so we're ignoring your broken peer deps. Please don't bother reporting any Embroider bugs until you unset it.\\n${summarizePeerDepViolations(\n violations\n )}`\n );\n } else {\n throw new Error(\n `Some V1 ember addons are resolving as incorrect peer dependencies. This makes it impossible for us to safely convert them to v2 format.\n\n šŸ‘‡ šŸ‘‡ šŸ‘‡\nšŸ‘‰ See https://github.com/embroider-build/embroider/blob/main/docs/peer-dependency-resolution-issues.md for an explanation of the problem and suggestions for fixing it.\n šŸ‘† šŸ‘† šŸ‘†\n\n${summarizePeerDepViolations(violations)}\n\n šŸ‘‡ šŸ‘‡ šŸ‘‡\nšŸ‘‰ See https://github.com/embroider-build/embroider/blob/main/docs/peer-dependency-resolution-issues.md for an explanation of the problem and suggestions for fixing it.\n šŸ‘† šŸ‘† šŸ‘†`\n );\n }\n }\n\n let v1Addons = findV1Addons(appPackage);\n let index = buildAddonIndex(compatApp, appPackage, v1Addons);\n\n let interiorTrees: Node[] = [];\n let exteriorTrees = [...v1Addons].map(pkg => {\n let interior = buildCompatAddon(pkg, instanceCache);\n interiorTrees.push(interior);\n return new Funnel(interior, { destDir: index.packages[pkg.root] });\n });\n\n let fakeTargets = Object.values(index.packages).map(dir => {\n let segments = dir.split('/');\n while (segments[segments.length - 1] && segments[segments.length - 1] !== 'node_modules') {\n segments.pop();\n }\n segments.push('moved-package-target.js');\n return writeFile(join(...segments), '');\n });\n\n return broccoliMergeTrees([\n ...exteriorTrees,\n new Funnel(compatApp.synthesizeStylesPackage(interiorTrees), {\n destDir: '@embroider/synthesized-styles',\n }),\n new Funnel(compatApp.synthesizeVendorPackage(interiorTrees), {\n destDir: '@embroider/synthesized-vendor',\n }),\n writeFile('index.json', JSON.stringify(index, null, 2)),\n ...fakeTargets,\n ]);\n}\n\nfunction buildAddonIndex(compatApp: CompatApp, appPackage: Package, packages: Set<Package>): RewrittenPackageIndex {\n let content: RewrittenPackageIndex = {\n packages: {},\n extraResolutions: {},\n };\n for (let oldPkg of packages) {\n let newRoot = `${oldPkg.name}.${hashed(oldPkg.root)}/node_modules/${oldPkg.name}`;\n content.packages[oldPkg.root] = newRoot;\n let nonResolvableDeps = oldPkg.nonResolvableDeps;\n if (nonResolvableDeps) {\n content.extraResolutions[newRoot] = [...nonResolvableDeps.values()].map(v => v.root);\n }\n }\n\n // adding an entry for the app itself to have a place in the\n // rewritten-packages, even though this stage hasn't actually put it there\n // yet. This directory lives outside our rewritten-pacakges directory because\n // it's produced by a separate build stage, and it's easier to have them\n // writing into separate directories.\n content.packages[compatApp.root] = join('..', 'rewritten-app');\n\n let nonResolvableDeps = appPackage.nonResolvableDeps;\n if (nonResolvableDeps) {\n let extraRoots = [...nonResolvableDeps.values()].map(v => v.root);\n\n // the app gets extraResolutions support just like every addon does\n content.extraResolutions[join('..', 'rewritten-app')] = extraRoots;\n\n // but it also gets extraResolutions registered against its *original*\n // location, because the app is unique because stage2 needs a Package\n // representing the *unmoved* app but seeing *moved* deps.\n content.extraResolutions[appPackage.root] = extraRoots;\n }\n\n return content;\n}\n\nfunction findV1Addons(pkg: Package, seen: Set<Package> = new Set(), output: Set<Package> = new Set()): Set<Package> {\n for (let dep of pkg.dependencies) {\n if (seen.has(dep)) {\n continue;\n }\n seen.add(dep);\n if (dep.isEmberPackage()) {\n if (!dep.isV2Addon()) {\n output.add(dep);\n }\n findV1Addons(dep, seen, output);\n }\n }\n return output;\n}\n\nfunction hashed(path: string): string {\n let h = crypto.createHash('sha1');\n return h.update(path).digest('hex').slice(0, 8);\n}\n"]}
1
+ {"version":3,"file":"standalone-addon-build.js","sourceRoot":"","sources":["standalone-addon-build.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Package, RewrittenPackageIndex } from '@embroider/core';\nimport { PackageCache, summarizePeerDepViolations, validatePeerDependencies } from '@embroider/core';\nimport V1InstanceCache from './v1-instance-cache';\nimport buildCompatAddon from './build-compat-addon';\nimport { Funnel } from 'broccoli-funnel';\nimport crypto from 'crypto';\nimport broccoliMergeTrees from 'broccoli-merge-trees';\nimport writeFile from 'broccoli-file-creator';\nimport type { Node } from 'broccoli-node-api';\nimport type CompatApp from './compat-app';\nimport { join } from 'path';\n\nexport function convertLegacyAddons(compatApp: CompatApp) {\n let packageCache = PackageCache.shared('embroider', compatApp.root);\n let instanceCache = new V1InstanceCache(compatApp, packageCache);\n\n let appPackage = compatApp.appPackage();\n\n let violations = validatePeerDependencies(appPackage).filter(({ dep }) => dep.isEmberPackage() && !dep.isV2Ember());\n if (violations.length > 0) {\n if (process.env.I_HAVE_BAD_PEER_DEPS_AND_WANT_A_BROKEN_BUILD) {\n console.warn(\n `You have set process.env.I_HAVE_BAD_PEER_DEPS_AND_WANT_A_BROKEN_BUILD, so we're ignoring your broken peer deps. Please don't bother reporting any Embroider bugs until you unset it.\\n${summarizePeerDepViolations(\n violations\n )}`\n );\n } else {\n throw new Error(\n `Some V1 ember addons are resolving as incorrect peer dependencies. This makes it impossible for us to safely convert them to v2 format.\n\n šŸ‘‡ šŸ‘‡ šŸ‘‡\nšŸ‘‰ See https://github.com/embroider-build/embroider/blob/main/docs/peer-dependency-resolution-issues.md for an explanation of the problem and suggestions for fixing it.\n šŸ‘† šŸ‘† šŸ‘†\n\n${summarizePeerDepViolations(violations)}\n\n šŸ‘‡ šŸ‘‡ šŸ‘‡\nšŸ‘‰ See https://github.com/embroider-build/embroider/blob/main/docs/peer-dependency-resolution-issues.md for an explanation of the problem and suggestions for fixing it.\n šŸ‘† šŸ‘† šŸ‘†`\n );\n }\n }\n\n let v1Addons = findV1Addons(appPackage);\n let index = buildAddonIndex(compatApp, appPackage, v1Addons);\n\n let interiorTrees: Node[] = [];\n let exteriorTrees = [...v1Addons].map(pkg => {\n let interior = buildCompatAddon(pkg, instanceCache);\n interiorTrees.push(interior);\n return new Funnel(interior, { destDir: index.packages[pkg.root] });\n });\n\n let fakeTargets = Object.values(index.packages).map(dir => {\n let segments = dir.split('/');\n while (segments[segments.length - 1] && segments[segments.length - 1] !== 'node_modules') {\n segments.pop();\n }\n segments.push('moved-package-target.js');\n return writeFile(join(...segments), '');\n });\n\n return broccoliMergeTrees([\n ...exteriorTrees,\n new Funnel(compatApp.synthesizeStylesPackage(interiorTrees), {\n destDir: '@embroider/synthesized-styles',\n }),\n new Funnel(compatApp.synthesizeVendorPackage(interiorTrees), {\n destDir: '@embroider/synthesized-vendor',\n }),\n writeFile('index.json', JSON.stringify(index, null, 2)),\n ...fakeTargets,\n ]);\n}\n\nfunction buildAddonIndex(compatApp: CompatApp, appPackage: Package, packages: Set<Package>): RewrittenPackageIndex {\n let content: RewrittenPackageIndex = {\n packages: {},\n extraResolutions: {},\n };\n for (let oldPkg of packages) {\n let newRoot = `${oldPkg.name}.${hashed(oldPkg.root)}/node_modules/${oldPkg.name}`;\n content.packages[oldPkg.root] = newRoot;\n let nonResolvableDeps = oldPkg.nonResolvableDeps;\n if (nonResolvableDeps) {\n content.extraResolutions[newRoot] = [...nonResolvableDeps.values()].map(v => v.root);\n }\n }\n\n // adding an entry for the app itself to have a place in the\n // rewritten-packages, even though this stage hasn't actually put it there\n // yet. This directory lives outside our rewritten-pacakges directory because\n // it's produced by a separate build stage, and it's easier to have them\n // writing into separate directories.\n content.packages[compatApp.root] = join('..', 'rewritten-app');\n\n let nonResolvableDeps = appPackage.nonResolvableDeps;\n if (nonResolvableDeps) {\n let extraRoots = [...nonResolvableDeps.values()].map(v => v.root);\n\n // the app gets extraResolutions support just like every addon does\n content.extraResolutions[join('..', 'rewritten-app')] = extraRoots;\n\n // but it also gets extraResolutions registered against its *original*\n // location, because the app is unique because stage2 needs a Package\n // representing the *unmoved* app but seeing *moved* deps.\n content.extraResolutions[appPackage.root] = extraRoots;\n }\n\n return content;\n}\n\nfunction findV1Addons(pkg: Package, seen: Set<Package> = new Set(), output: Set<Package> = new Set()): Set<Package> {\n for (let dep of pkg.dependencies) {\n if (seen.has(dep)) {\n continue;\n }\n seen.add(dep);\n if (dep.isEmberPackage()) {\n if (!dep.isV2Addon()) {\n output.add(dep);\n }\n findV1Addons(dep, seen, output);\n }\n }\n return output;\n}\n\nfunction hashed(path: string): string {\n let h = crypto.createHash('sha1');\n return h.update(path).digest('hex').slice(0, 8);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"sync-dir.js","sourceRoot":"","sources":["sync-dir.ts"],"names":[],"mappings":";;;;;;AAAA,gEAAuC;AACvC,gEAAkC;AAClC,0DAAiC;AACjC,+BAA+B;AAC/B,uCAAmF;AAEnF,yEAAyE;AACzE,gFAAgF;AAChF,kDAAkD;AAClD,MAAa,OAAO;IAIlB,YAAoB,GAAW,EAAU,IAAwB;QAA7C,QAAG,GAAH,GAAG,CAAQ;QAAU,SAAI,GAAJ,IAAI,CAAoB;QAHzD,SAAI,GAAW,IAAI,sBAAM,EAAE,CAAC;QAC3B,UAAK,GAAgB,IAAI,GAAG,EAAE,CAAC;IAE4B,CAAC;IAErE,MAAM;QACJ,IAAI,IAAI,GAAG,IAAI,sBAAM,CAAC;YACpB,OAAO,EAAE,mBAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;SACpC,CAAC,CAAC;QACH,KAAK,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE;YACpE,IAAI,UAA8B,CAAC;YACnC,IAAI,IAAI,CAAC,IAAI,EAAE;gBACb,UAAU,GAAG,IAAA,cAAO,EAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;aAC/C;YACD,QAAQ,SAAS,EAAE;gBACjB,KAAK,QAAQ;oBACX,IAAI,UAAU,EAAE;wBACd,IAAA,qBAAU,EAAC,UAAU,CAAC,CAAC;qBACxB;oBACD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;oBAChC,MAAM;gBACR,KAAK,OAAO;oBACV,IAAI,UAAU,EAAE;wBACd,IAAA,oBAAS,EAAC,UAAU,CAAC,CAAC;qBACvB;oBACD,MAAM;gBACR,KAAK,OAAO;oBACV,IAAI,UAAU,EAAE;wBACd,IAAA,qBAAU,EAAC,UAAU,CAAC,CAAC;qBACxB;oBACD,MAAM;gBACR,KAAK,QAAQ;oBACX,IAAI,UAAU,EAAE;wBACd,IAAA,qBAAU,EAAC,UAAU,CAAC,CAAC;wBACvB,IAAA,mBAAQ,EAAC,IAAA,cAAO,EAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,UAAU,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;qBAC9E;oBACD,MAAM;gBACR,KAAK,QAAQ;oBACX,IAAI,UAAU,EAAE;wBACd,IAAA,mBAAQ,EAAC,IAAA,cAAO,EAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,UAAU,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;qBAC9E;oBACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;oBAC7B,MAAM;gBACR;oBACE,IAAA,sBAAW,EAAC,SAAS,CAAC,CAAC;aAC1B;YACD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;SAClB;IACH,CAAC;CACF;AAlDD,0BAkDC","sourcesContent":["import assertNever from 'assert-never';\nimport FSTree from 'fs-tree-diff';\nimport walkSync from 'walk-sync';\nimport { resolve } from 'path';\nimport { copySync, mkdirpSync, removeSync, rmdirSync, unlinkSync } from 'fs-extra';\n\n// mirrors the changes in the src dir to the dest dir, while tracking the\n// current set of files present. If dest is undefined, it only tracks the set of\n// files without mirroring the changes to anywhere\nexport class SyncDir {\n private prev: FSTree = new FSTree();\n readonly files: Set<string> = new Set();\n\n constructor(private src: string, private dest: string | undefined) {}\n\n update(): void {\n let next = new FSTree({\n entries: walkSync.entries(this.src),\n });\n for (let [operation, relativePath] of this.prev.calculatePatch(next)) {\n let outputPath: string | undefined;\n if (this.dest) {\n outputPath = resolve(this.dest, relativePath);\n }\n switch (operation) {\n case 'unlink':\n if (outputPath) {\n unlinkSync(outputPath);\n }\n this.files.delete(relativePath);\n break;\n case 'rmdir':\n if (outputPath) {\n rmdirSync(outputPath);\n }\n break;\n case 'mkdir':\n if (outputPath) {\n mkdirpSync(outputPath);\n }\n break;\n case 'change':\n if (outputPath) {\n removeSync(outputPath);\n copySync(resolve(this.src, relativePath), outputPath, { dereference: true });\n }\n break;\n case 'create':\n if (outputPath) {\n copySync(resolve(this.src, relativePath), outputPath, { dereference: true });\n }\n this.files.add(relativePath);\n break;\n default:\n assertNever(operation);\n }\n this.prev = next;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"sync-dir.js","sourceRoot":"","sources":["sync-dir.ts"],"names":[],"mappings":";;;;;;AAAA,gEAAuC;AACvC,gEAAkC;AAClC,0DAAiC;AACjC,+BAA+B;AAC/B,uCAAmF;AAEnF,yEAAyE;AACzE,gFAAgF;AAChF,kDAAkD;AAClD,MAAa,OAAO;IAIlB,YAAoB,GAAW,EAAU,IAAwB;QAA7C,QAAG,GAAH,GAAG,CAAQ;QAAU,SAAI,GAAJ,IAAI,CAAoB;QAHzD,SAAI,GAAW,IAAI,sBAAM,EAAE,CAAC;QAC3B,UAAK,GAAgB,IAAI,GAAG,EAAE,CAAC;IAE4B,CAAC;IAErE,MAAM;QACJ,IAAI,IAAI,GAAG,IAAI,sBAAM,CAAC;YACpB,OAAO,EAAE,mBAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;SACpC,CAAC,CAAC;QACH,KAAK,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;YACrE,IAAI,UAA8B,CAAC;YACnC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,UAAU,GAAG,IAAA,cAAO,EAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;YAChD,CAAC;YACD,QAAQ,SAAS,EAAE,CAAC;gBAClB,KAAK,QAAQ;oBACX,IAAI,UAAU,EAAE,CAAC;wBACf,IAAA,qBAAU,EAAC,UAAU,CAAC,CAAC;oBACzB,CAAC;oBACD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;oBAChC,MAAM;gBACR,KAAK,OAAO;oBACV,IAAI,UAAU,EAAE,CAAC;wBACf,IAAA,oBAAS,EAAC,UAAU,CAAC,CAAC;oBACxB,CAAC;oBACD,MAAM;gBACR,KAAK,OAAO;oBACV,IAAI,UAAU,EAAE,CAAC;wBACf,IAAA,qBAAU,EAAC,UAAU,CAAC,CAAC;oBACzB,CAAC;oBACD,MAAM;gBACR,KAAK,QAAQ;oBACX,IAAI,UAAU,EAAE,CAAC;wBACf,IAAA,qBAAU,EAAC,UAAU,CAAC,CAAC;wBACvB,IAAA,mBAAQ,EAAC,IAAA,cAAO,EAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,UAAU,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC/E,CAAC;oBACD,MAAM;gBACR,KAAK,QAAQ;oBACX,IAAI,UAAU,EAAE,CAAC;wBACf,IAAA,mBAAQ,EAAC,IAAA,cAAO,EAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,UAAU,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC/E,CAAC;oBACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;oBAC7B,MAAM;gBACR;oBACE,IAAA,sBAAW,EAAC,SAAS,CAAC,CAAC;YAC3B,CAAC;YACD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACnB,CAAC;IACH,CAAC;CACF;AAlDD,0BAkDC","sourcesContent":["import assertNever from 'assert-never';\nimport FSTree from 'fs-tree-diff';\nimport walkSync from 'walk-sync';\nimport { resolve } from 'path';\nimport { copySync, mkdirpSync, removeSync, rmdirSync, unlinkSync } from 'fs-extra';\n\n// mirrors the changes in the src dir to the dest dir, while tracking the\n// current set of files present. If dest is undefined, it only tracks the set of\n// files without mirroring the changes to anywhere\nexport class SyncDir {\n private prev: FSTree = new FSTree();\n readonly files: Set<string> = new Set();\n\n constructor(private src: string, private dest: string | undefined) {}\n\n update(): void {\n let next = new FSTree({\n entries: walkSync.entries(this.src),\n });\n for (let [operation, relativePath] of this.prev.calculatePatch(next)) {\n let outputPath: string | undefined;\n if (this.dest) {\n outputPath = resolve(this.dest, relativePath);\n }\n switch (operation) {\n case 'unlink':\n if (outputPath) {\n unlinkSync(outputPath);\n }\n this.files.delete(relativePath);\n break;\n case 'rmdir':\n if (outputPath) {\n rmdirSync(outputPath);\n }\n break;\n case 'mkdir':\n if (outputPath) {\n mkdirpSync(outputPath);\n }\n break;\n case 'change':\n if (outputPath) {\n removeSync(outputPath);\n copySync(resolve(this.src, relativePath), outputPath, { dereference: true });\n }\n break;\n case 'create':\n if (outputPath) {\n copySync(resolve(this.src, relativePath), outputPath, { dereference: true });\n }\n this.files.add(relativePath);\n break;\n default:\n assertNever(operation);\n }\n this.prev = next;\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"synthesize-template-only-components.js","sourceRoot":"","sources":["synthesize-template-only-components.ts"],"names":[],"mappings":";;;;;AAAA,sEAAqC;AAErC,+BAA+C;AAC/C,0DAAiD;AACjD,uCAAoF;AAEpF,MAAM,MAAM,GAAG;wCACyB,CAAC;AAEzC,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAWpD,SAAS,cAAc,CAAC,KAA0B;IAChD,OAAO,4CAA4C,IAAA,eAAQ,EAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC;AACpG,CAAC;AAED,MAAqB,gCAAiC,SAAQ,yBAAM;IAKlE,YAAY,IAAU,EAAE,MAAgE;QACtF,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE;YACZ,UAAU,EAAE,uCAAuC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;YAClF,gBAAgB,EAAE,IAAI;YACtB,UAAU,EAAE,KAAK;SAClB,CAAC,CAAC;QATG,YAAO,GAAG,IAAI,GAAG,EAA0B,CAAC;QAUlD,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QACxC,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5C,KAAK,IAAI,GAAG,IAAI,IAAI,CAAC,YAAY,EAAE;YACjC,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,WAAI,EAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACxD,KAAK,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE;gBACjC,IAAI,QAAQ,GAAG,IAAA,WAAI,EAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;gBAChD,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAC1B,IAAI,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,QAAQ,EAAE;oBACtC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;iBACzC;qBAAM,IAAI,KAAK,CAAC,QAAQ,EAAE;oBACzB,IAAI,CAAC,wBAAwB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;iBAChD;qBAAM;oBACL,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;iBACvB;aACF;SACF;QACD,KAAK,IAAI,QAAQ,IAAI,QAAQ,EAAE;YAC7B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;SACvB;IACH,CAAC;IAEO,wBAAwB,CAAC,QAAgB,EAAE,KAAmB;QACpE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE3C,IAAI,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,MAAK,yBAAyB,EAAE;YAC/C,uEAAuE;YACvE,uEAAuE;YACvE,+CAA+C;YAC/C,IAAI,IAAA,eAAQ,EAAC,QAAQ,CAAC,KAAK,UAAU,EAAE;gBACrC,MAAM,UAAU,GAAG,QAAQ,GAAG,KAAK,CAAC;gBACpC,IAAA,yBAAc,EAAC,UAAU,EAAE,cAAc,CAAC,KAAK,CAAC,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC;gBACnE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,yBAAyB,EAAE,UAAU,EAAE,CAAC,CAAC;gBAE5E,IAAI,OAAO,IAAI,OAAO,CAAC,UAAU,KAAK,UAAU,EAAE;oBAChD,IAAA,qBAAU,EAAC,OAAO,CAAC,UAAU,CAAC,CAAC;iBAChC;aACF;SACF;IACH,CAAC;IAEO,iBAAiB,CAAC,QAAgB,EAAE,KAAgB;QAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC;QAErC,IAAI,CAAC,CAAC,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,MAAK,iBAAiB,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE;YACrE,MAAM,WAAW,GAAG,IAAA,uBAAY,EAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;YAClF,MAAM,UAAU,GAAG,QAAQ,GAAG,IAAA,cAAO,EAAC,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;YACrE,2EAA2E;YAC3E,IAAA,yBAAc,EAAC,UAAU,EAAE,cAAc,CAAC,KAAK,CAAC,GAAG,WAAW,EAAE,MAAM,CAAC,CAAC;YACxE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;YAE3E,IAAI,OAAO,IAAI,OAAO,CAAC,UAAU,KAAK,UAAU,EAAE;gBAChD,IAAA,qBAAU,EAAC,OAAO,CAAC,UAAU,CAAC,CAAC;aAChC;SACF;IACH,CAAC;IAEO,MAAM,CAAC,QAAgB;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE3C,IAAI,OAAO,EAAE;YACX,IAAA,qBAAU,EAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;SAC/B;IACH,CAAC;IAEO,KAAK,CAAC,GAAW;;QACvB,MAAM,OAAO,GAAG,IAAI,GAAG,EAA0B,CAAC;QAElD,IAAI,IAAA,yBAAc,EAAC,GAAG,CAAC,EAAE;YACvB,KAAK,IAAI,KAAK,IAAI,mBAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE;gBAC/D,MAAM,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;gBAChG,IAAI,iBAAiB,EAAE;oBACrB,MAAM,GAAG,GAAG,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;oBACvE,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,MAAA,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,0CAAE,UAAU,EAAE,CAAC,CAAC;oBAChF,SAAS;iBACV;gBAED,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC/E,IAAI,WAAW,EAAE;oBACf,MAAM,GAAG,GAAG,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;oBACjE,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,MAAA,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,0CAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;oBAC9E,SAAS;iBACV;aACF;SACF;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAxGD,mDAwGC","sourcesContent":["import Plugin from 'broccoli-plugin';\nimport type { Node } from 'broccoli-node-api';\nimport { join, basename, extname } from 'path';\nimport walkSync, { type Entry } from 'walk-sync';\nimport { removeSync, outputFileSync, pathExistsSync, readFileSync } from 'fs-extra';\n\nconst source = `import templateOnlyComponent from '@ember/component/template-only';\nexport default templateOnlyComponent();`;\n\nconst jsExtensions = ['.js', '.ts', '.mjs', '.mts'];\n\ntype Emitted =\n | { type: 'template-only-component'; outputPath: string }\n | { type: 'template-import'; outputPath: string; mtime: number };\n\ntype TemplateOnly = { template: Entry; javascript: undefined };\ntype JavaScriptOnly = { template: undefined; javascript: Entry };\ntype Colocated = { template: Entry; javascript: Entry };\ntype ComponentFiles = TemplateOnly | JavaScriptOnly | Colocated;\n\nfunction importTemplate(files: { template: Entry }): string {\n return `/* import __COLOCATED_TEMPLATE__ from './${basename(files.template.relativePath)}'; */\\n`;\n}\n\nexport default class SynthesizeTemplateOnlyComponents extends Plugin {\n private emitted = new Map() as Map<string, Emitted>;\n private allowedPaths: string[];\n private templateExtensions: string[];\n\n constructor(tree: Node, params: { allowedPaths: string[]; templateExtensions: string[] }) {\n super([tree], {\n annotation: `synthesize-template-only-components:${params.allowedPaths.join(':')}`,\n persistentOutput: true,\n needsCache: false,\n });\n this.allowedPaths = params.allowedPaths;\n this.templateExtensions = params.templateExtensions;\n }\n\n async build() {\n let unneeded = new Set(this.emitted.keys());\n for (let dir of this.allowedPaths) {\n let entries = this.crawl(join(this.inputPaths[0], dir));\n for (let [name, files] of entries) {\n let fullName = join(this.outputPath, dir, name);\n unneeded.delete(fullName);\n if (files.javascript && files.template) {\n this.addTemplateImport(fullName, files);\n } else if (files.template) {\n this.addTemplateOnlyComponent(fullName, files);\n } else {\n this.remove(fullName);\n }\n }\n }\n for (let fullName of unneeded) {\n this.remove(fullName);\n }\n }\n\n private addTemplateOnlyComponent(filename: string, files: TemplateOnly) {\n const emitted = this.emitted.get(filename);\n\n if (emitted?.type !== 'template-only-component') {\n // special case: ember-cli doesn't allow template-only components named\n // \"template.hbs\" because there are too many people doing a \"pods-like\"\n // layout that happens to match that pattern.🤮\n if (basename(filename) !== 'template') {\n const outputPath = filename + '.js';\n outputFileSync(outputPath, importTemplate(files) + source, 'utf8');\n this.emitted.set(filename, { type: 'template-only-component', outputPath });\n\n if (emitted && emitted.outputPath !== outputPath) {\n removeSync(emitted.outputPath);\n }\n }\n }\n }\n\n private addTemplateImport(filename: string, files: Colocated) {\n const emitted = this.emitted.get(filename);\n const mtime = files.javascript.mtime;\n\n if (!(emitted?.type === 'template-import' && emitted.mtime === mtime)) {\n const inputSource = readFileSync(files.javascript.fullPath, { encoding: 'utf8' });\n const outputPath = filename + extname(files.javascript.relativePath);\n // If we are ok with appending instead, copy + append maybe more efficient?\n outputFileSync(outputPath, importTemplate(files) + inputSource, 'utf8');\n this.emitted.set(filename, { type: 'template-import', outputPath, mtime });\n\n if (emitted && emitted.outputPath !== outputPath) {\n removeSync(emitted.outputPath);\n }\n }\n }\n\n private remove(filename: string) {\n const emitted = this.emitted.get(filename);\n\n if (emitted) {\n removeSync(emitted.outputPath);\n this.emitted.delete(filename);\n }\n }\n\n private crawl(dir: string): Map<string, ComponentFiles> {\n const entries = new Map<string, ComponentFiles>();\n\n if (pathExistsSync(dir)) {\n for (let entry of walkSync.entries(dir, { directories: false })) {\n const templateExtension = this.templateExtensions.find(ext => entry.relativePath.endsWith(ext));\n if (templateExtension) {\n const key = entry.relativePath.slice(0, -1 * templateExtension.length);\n entries.set(key, { template: entry, javascript: entries.get(key)?.javascript });\n continue;\n }\n\n const jsExtension = jsExtensions.find(ext => entry.relativePath.endsWith(ext));\n if (jsExtension) {\n const key = entry.relativePath.slice(0, -1 * jsExtension.length);\n entries.set(key, { template: entries.get(key)?.template, javascript: entry });\n continue;\n }\n }\n }\n\n return entries;\n }\n}\n"]}
1
+ {"version":3,"file":"synthesize-template-only-components.js","sourceRoot":"","sources":["synthesize-template-only-components.ts"],"names":[],"mappings":"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","sourcesContent":["import Plugin from 'broccoli-plugin';\nimport type { Node } from 'broccoli-node-api';\nimport { join, basename, extname } from 'path';\nimport walkSync, { type Entry } from 'walk-sync';\nimport { removeSync, outputFileSync, pathExistsSync, readFileSync } from 'fs-extra';\n\nconst source = `import templateOnlyComponent from '@ember/component/template-only';\nexport default templateOnlyComponent();`;\n\nconst jsExtensions = ['.js', '.ts', '.mjs', '.mts'];\n\ntype Emitted =\n | { type: 'template-only-component'; outputPath: string }\n | { type: 'template-import'; outputPath: string; mtime: number };\n\ntype TemplateOnly = { template: Entry; javascript: undefined };\ntype JavaScriptOnly = { template: undefined; javascript: Entry };\ntype Colocated = { template: Entry; javascript: Entry };\ntype ComponentFiles = TemplateOnly | JavaScriptOnly | Colocated;\n\nfunction importTemplate(files: { template: Entry }): string {\n return `/* import __COLOCATED_TEMPLATE__ from './${basename(files.template.relativePath)}'; */\\n`;\n}\n\nexport default class SynthesizeTemplateOnlyComponents extends Plugin {\n private emitted = new Map() as Map<string, Emitted>;\n private allowedPaths: string[];\n private templateExtensions: string[];\n\n constructor(tree: Node, params: { allowedPaths: string[]; templateExtensions: string[] }) {\n super([tree], {\n annotation: `synthesize-template-only-components:${params.allowedPaths.join(':')}`,\n persistentOutput: true,\n needsCache: false,\n });\n this.allowedPaths = params.allowedPaths;\n this.templateExtensions = params.templateExtensions;\n }\n\n async build() {\n let unneeded = new Set(this.emitted.keys());\n for (let dir of this.allowedPaths) {\n let entries = this.crawl(join(this.inputPaths[0], dir));\n for (let [name, files] of entries) {\n let fullName = join(this.outputPath, dir, name);\n unneeded.delete(fullName);\n if (files.javascript && files.template) {\n this.addTemplateImport(fullName, files);\n } else if (files.template) {\n this.addTemplateOnlyComponent(fullName, files);\n } else {\n this.remove(fullName);\n }\n }\n }\n for (let fullName of unneeded) {\n this.remove(fullName);\n }\n }\n\n private addTemplateOnlyComponent(filename: string, files: TemplateOnly) {\n const emitted = this.emitted.get(filename);\n\n if (emitted?.type !== 'template-only-component') {\n // special case: ember-cli doesn't allow template-only components named\n // \"template.hbs\" because there are too many people doing a \"pods-like\"\n // layout that happens to match that pattern.🤮\n if (basename(filename) !== 'template') {\n const outputPath = filename + '.js';\n outputFileSync(outputPath, importTemplate(files) + source, 'utf8');\n this.emitted.set(filename, { type: 'template-only-component', outputPath });\n\n if (emitted && emitted.outputPath !== outputPath) {\n removeSync(emitted.outputPath);\n }\n }\n }\n }\n\n private addTemplateImport(filename: string, files: Colocated) {\n const emitted = this.emitted.get(filename);\n const mtime = files.javascript.mtime;\n\n if (!(emitted?.type === 'template-import' && emitted.mtime === mtime)) {\n const inputSource = readFileSync(files.javascript.fullPath, { encoding: 'utf8' });\n const outputPath = filename + extname(files.javascript.relativePath);\n // If we are ok with appending instead, copy + append maybe more efficient?\n outputFileSync(outputPath, importTemplate(files) + inputSource, 'utf8');\n this.emitted.set(filename, { type: 'template-import', outputPath, mtime });\n\n if (emitted && emitted.outputPath !== outputPath) {\n removeSync(emitted.outputPath);\n }\n }\n }\n\n private remove(filename: string) {\n const emitted = this.emitted.get(filename);\n\n if (emitted) {\n removeSync(emitted.outputPath);\n this.emitted.delete(filename);\n }\n }\n\n private crawl(dir: string): Map<string, ComponentFiles> {\n const entries = new Map<string, ComponentFiles>();\n\n if (pathExistsSync(dir)) {\n for (let entry of walkSync.entries(dir, { directories: false })) {\n const templateExtension = this.templateExtensions.find(ext => entry.relativePath.endsWith(ext));\n if (templateExtension) {\n const key = entry.relativePath.slice(0, -1 * templateExtension.length);\n entries.set(key, { template: entry, javascript: entries.get(key)?.javascript });\n continue;\n }\n\n const jsExtension = jsExtensions.find(ext => entry.relativePath.endsWith(ext));\n if (jsExtension) {\n const key = entry.relativePath.slice(0, -1 * jsExtension.length);\n entries.set(key, { template: entries.get(key)?.template, javascript: entry });\n continue;\n }\n }\n }\n\n return entries;\n }\n}\n"]}