@embroider/compat 1.3.0 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +4 -4
- package/src/audit-cli.js +0 -0
- package/src/audit.d.ts +1 -3
- package/src/audit.js +26 -49
- package/src/audit.js.map +1 -1
- package/src/detect-babel-plugins.d.ts +1 -0
- package/src/detect-babel-plugins.js +36 -1
- package/src/detect-babel-plugins.js.map +1 -1
- package/src/options.js +0 -1
- package/src/options.js.map +1 -1
- package/src/resolver-transform.d.ts +2 -1
- package/src/resolver-transform.js +17 -11
- package/src/resolver-transform.js.map +1 -1
- package/src/resolver.d.ts +11 -4
- package/src/resolver.js +57 -25
- package/src/resolver.js.map +1 -1
- package/src/template-compiler-broccoli-plugin.d.ts +1 -2
- package/src/template-compiler-broccoli-plugin.js +4 -13
- package/src/template-compiler-broccoli-plugin.js.map +1 -1
- package/src/v1-addon.js +2 -2
- package/src/v1-addon.js.map +1 -1
- package/src/v1-app.js +1 -2
- package/src/v1-app.js.map +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@embroider/compat",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Backward compatibility layer for the Embroider build system.",
|
|
6
6
|
"repository": {
|
|
@@ -29,8 +29,8 @@
|
|
|
29
29
|
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
|
|
30
30
|
"@babel/preset-env": "^7.14.5",
|
|
31
31
|
"@babel/traverse": "^7.14.5",
|
|
32
|
-
"@embroider/macros": "1.
|
|
33
|
-
"@embroider/shared-internals": "1.
|
|
32
|
+
"@embroider/macros": "1.6.0",
|
|
33
|
+
"@embroider/shared-internals": "1.6.0",
|
|
34
34
|
"@types/babel__code-frame": "^7.0.2",
|
|
35
35
|
"@types/yargs": "^17.0.3",
|
|
36
36
|
"assert-never": "^1.1.0",
|
|
@@ -84,7 +84,7 @@
|
|
|
84
84
|
"typescript": "*"
|
|
85
85
|
},
|
|
86
86
|
"peerDependencies": {
|
|
87
|
-
"@embroider/core": "1.
|
|
87
|
+
"@embroider/core": "1.6.0"
|
|
88
88
|
},
|
|
89
89
|
"engines": {
|
|
90
90
|
"node": "12.* || 14.* || >= 16"
|
package/src/audit-cli.js
CHANGED
|
File without changes
|
package/src/audit.d.ts
CHANGED
|
@@ -62,13 +62,11 @@ export declare class Audit {
|
|
|
62
62
|
private get pkg();
|
|
63
63
|
private get meta();
|
|
64
64
|
private get babelConfig();
|
|
65
|
-
private get templateSetup();
|
|
66
|
-
private get templateCompiler();
|
|
67
|
-
private get templateResolver();
|
|
68
65
|
private debug;
|
|
69
66
|
private visitorFor;
|
|
70
67
|
private drainQueue;
|
|
71
68
|
run(): Promise<AuditResults>;
|
|
69
|
+
private handleResolverError;
|
|
72
70
|
private linkModules;
|
|
73
71
|
private linkModule;
|
|
74
72
|
private inspectModules;
|
package/src/audit.js
CHANGED
|
@@ -141,7 +141,7 @@ class Audit {
|
|
|
141
141
|
let dir = await this.findStage2Output(options);
|
|
142
142
|
let audit = new this(dir, options);
|
|
143
143
|
if (options['reuse-build']) {
|
|
144
|
-
if (!audit.meta.babel.isParallelSafe
|
|
144
|
+
if (!audit.meta.babel.isParallelSafe) {
|
|
145
145
|
throw new build_1.BuildError(`You can't use the ${chalk_1.default.red('--reuse-build')} option because some of your babel or HBS plugins are non-serializable`);
|
|
146
146
|
}
|
|
147
147
|
}
|
|
@@ -172,20 +172,6 @@ class Audit {
|
|
|
172
172
|
config.ast = true;
|
|
173
173
|
return config;
|
|
174
174
|
}
|
|
175
|
-
get templateSetup() {
|
|
176
|
-
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
177
|
-
let templateCompiler = require((0, path_1.join)(this.appDir, this.meta['template-compiler'].filename));
|
|
178
|
-
let resolver = templateCompiler.params.resolver;
|
|
179
|
-
resolver.enableAuditMode();
|
|
180
|
-
let compile = (0, core_1.applyVariantToTemplateCompiler)({ name: 'default', runtime: 'all', optimizeForProduction: false }, templateCompiler.compile);
|
|
181
|
-
return { compile, resolver };
|
|
182
|
-
}
|
|
183
|
-
get templateCompiler() {
|
|
184
|
-
return this.templateSetup.compile;
|
|
185
|
-
}
|
|
186
|
-
get templateResolver() {
|
|
187
|
-
return this.templateSetup.resolver;
|
|
188
|
-
}
|
|
189
175
|
debug(message, ...args) {
|
|
190
176
|
if (this.options.debug) {
|
|
191
177
|
console.log(message, ...args);
|
|
@@ -241,16 +227,30 @@ class Audit {
|
|
|
241
227
|
}
|
|
242
228
|
}
|
|
243
229
|
async run() {
|
|
244
|
-
this.
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
230
|
+
globalThis.embroider_audit = this.handleResolverError.bind(this);
|
|
231
|
+
try {
|
|
232
|
+
this.debug(`meta`, this.meta);
|
|
233
|
+
for (let asset of this.meta.assets) {
|
|
234
|
+
if (asset.endsWith('.html')) {
|
|
235
|
+
this.scheduleVisit((0, path_1.resolve)(this.appDir, asset), { isRoot: true });
|
|
236
|
+
}
|
|
248
237
|
}
|
|
238
|
+
await this.drainQueue();
|
|
239
|
+
this.linkModules();
|
|
240
|
+
this.inspectModules();
|
|
241
|
+
return AuditResults.create(this.appDir, this.findings, this.modules);
|
|
249
242
|
}
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
243
|
+
finally {
|
|
244
|
+
delete globalThis.embroider_audit;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
handleResolverError(msg) {
|
|
248
|
+
this.pushFinding({
|
|
249
|
+
message: msg.message,
|
|
250
|
+
filename: msg.filename,
|
|
251
|
+
detail: msg.detail,
|
|
252
|
+
codeFrame: this.frames.render(this.frames.forSource(msg.source)(msg)),
|
|
253
|
+
});
|
|
254
254
|
}
|
|
255
255
|
linkModules() {
|
|
256
256
|
for (let module of this.modules.values()) {
|
|
@@ -387,7 +387,7 @@ class Audit {
|
|
|
387
387
|
};
|
|
388
388
|
}
|
|
389
389
|
catch (err) {
|
|
390
|
-
if (err.code
|
|
390
|
+
if (['BABEL_PARSE_ERROR', 'BABEL_TRANSFORM_ERROR'].includes(err.code)) {
|
|
391
391
|
return [
|
|
392
392
|
{
|
|
393
393
|
filename,
|
|
@@ -403,27 +403,7 @@ class Audit {
|
|
|
403
403
|
}
|
|
404
404
|
async visitHBS(filename, content) {
|
|
405
405
|
let rawSource = content.toString('utf8');
|
|
406
|
-
let js;
|
|
407
|
-
try {
|
|
408
|
-
js = this.templateCompiler(filename, rawSource);
|
|
409
|
-
}
|
|
410
|
-
catch (err) {
|
|
411
|
-
return [
|
|
412
|
-
{
|
|
413
|
-
filename,
|
|
414
|
-
message: `failed to compile template`,
|
|
415
|
-
detail: err.toString().replace(filename, (0, core_1.explicitRelative)(this.appDir, filename)),
|
|
416
|
-
},
|
|
417
|
-
];
|
|
418
|
-
}
|
|
419
|
-
for (let err of this.templateResolver.errorsIn(filename)) {
|
|
420
|
-
this.pushFinding({
|
|
421
|
-
filename,
|
|
422
|
-
message: err.message,
|
|
423
|
-
detail: err.detail,
|
|
424
|
-
codeFrame: this.frames.render(this.frames.forSource(rawSource)(err)),
|
|
425
|
-
});
|
|
426
|
-
}
|
|
406
|
+
let js = (0, core_1.hbsToJS)(rawSource);
|
|
427
407
|
return this.visitJS(filename, js);
|
|
428
408
|
}
|
|
429
409
|
async visitJSON(filename, content) {
|
|
@@ -444,7 +424,7 @@ class Audit {
|
|
|
444
424
|
return this.visitJS(filename, js);
|
|
445
425
|
}
|
|
446
426
|
async resolve(specifier, fromPath) {
|
|
447
|
-
if (
|
|
427
|
+
if (['@embroider/macros', '@ember/template-factory'].includes(specifier)) {
|
|
448
428
|
return;
|
|
449
429
|
}
|
|
450
430
|
try {
|
|
@@ -486,9 +466,6 @@ __decorate([
|
|
|
486
466
|
__decorate([
|
|
487
467
|
(0, typescript_memoize_1.Memoize)()
|
|
488
468
|
], Audit.prototype, "babelConfig", null);
|
|
489
|
-
__decorate([
|
|
490
|
-
(0, typescript_memoize_1.Memoize)()
|
|
491
|
-
], Audit.prototype, "templateSetup", null);
|
|
492
469
|
exports.Audit = Audit;
|
|
493
470
|
function isMacrosPlugin(p) {
|
|
494
471
|
return Array.isArray(p) && p[1] && p[1].embroiderMacrosConfigMarker;
|
package/src/audit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.js","sourceRoot":"","sources":["audit.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync, readJSONSync } from 'fs-extra';\nimport { dirname, join, resolve as resolvePath } from 'path';\nimport resolveModule from 'resolve';\nimport { applyVariantToTemplateCompiler, AppMeta, explicitRelative } from '@embroider/core';\nimport { Memoize } from 'typescript-memoize';\nimport chalk from 'chalk';\nimport jsdom from 'jsdom';\nimport groupBy from 'lodash/groupBy';\nimport fromPairs from 'lodash/fromPairs';\nimport {\n auditJS,\n CodeFrameStorage,\n ExportAll,\n InternalImport,\n isNamespaceMarker,\n NamespaceMarker,\n} from './audit/babel-visitor';\nimport { AuditBuildOptions, AuditOptions } from './audit/options';\nimport { buildApp, BuildError, isBuildError } from './audit/build';\nimport CompatResolver from './resolver';\n\nconst { JSDOM } = jsdom;\n\nexport { AuditOptions, AuditBuildOptions, BuildError, isBuildError };\n\nexport interface Finding {\n message: string;\n filename: string;\n detail: string;\n codeFrame?: string;\n}\n\nexport interface Module {\n consumedFrom: (string | RootMarker)[];\n imports: Import[];\n exports: string[];\n resolutions: { [source: string]: string | null };\n}\n\ninterface ResolutionFailure {\n isResolutionFailure: true;\n}\n\nfunction isResolutionFailure(result: string | ResolutionFailure | undefined): result is ResolutionFailure {\n return typeof result === 'object' && 'isResolutionFailure' in result;\n}\n\ninterface InternalModule {\n consumedFrom: (string | RootMarker)[];\n\n parsed?: {\n imports: InternalImport[];\n exports: Set<string | ExportAll>;\n isCJS: boolean;\n isAMD: boolean;\n dependencies: string[];\n };\n\n resolved?: Map<string, string | ResolutionFailure>;\n\n linked?: {\n exports: Set<string>;\n };\n}\n\ntype ParsedInternalModule = Omit<InternalModule, 'parsed'> & {\n parsed: NonNullable<InternalModule['parsed']>;\n};\n\ntype ResolvedInternalModule = Omit<ParsedInternalModule, 'resolved'> & {\n resolved: NonNullable<ParsedInternalModule['resolved']>;\n};\n\nfunction isResolved(module: InternalModule | undefined): module is ResolvedInternalModule {\n return Boolean(module?.parsed && module.resolved);\n}\n\ntype LinkedInternalModule = Omit<ResolvedInternalModule, 'linked'> & {\n linked: NonNullable<ResolvedInternalModule['linked']>;\n};\n\nfunction isLinked(module: InternalModule | undefined): module is LinkedInternalModule {\n return Boolean(module?.parsed && module.resolved && module.linked);\n}\n\nexport interface Import {\n source: string;\n specifiers: {\n name: string | NamespaceMarker;\n local: string | null; // can be null when re-exporting, because in that case we import `name` from `source` but don't create any local binding for it\n }[];\n}\n\nexport class AuditResults {\n modules: { [file: string]: Module } = {};\n findings: Finding[] = [];\n\n static create(baseDir: string, findings: Finding[], modules: Map<string, InternalModule>) {\n let results = new this();\n for (let [filename, module] of modules) {\n let publicModule: Module = {\n consumedFrom: module.consumedFrom.map(entry => {\n if (isRootMarker(entry)) {\n return entry;\n } else {\n return explicitRelative(baseDir, entry);\n }\n }),\n resolutions: module.resolved\n ? fromPairs(\n [...module.resolved].map(([source, target]) => [\n source,\n isResolutionFailure(target) ? null : explicitRelative(baseDir, target),\n ])\n )\n : {},\n imports: module.parsed?.imports\n ? module.parsed.imports.map(i => ({\n source: i.source,\n specifiers: i.specifiers.map(s => ({\n name: s.name,\n local: s.local,\n })),\n }))\n : [],\n exports: module.linked?.exports ? [...module.linked.exports] : [],\n };\n results.modules[explicitRelative(baseDir, filename)] = publicModule;\n }\n for (let finding of findings) {\n let relFinding = Object.assign({}, finding, { filename: explicitRelative(baseDir, finding.filename) });\n results.findings.push(relFinding);\n }\n return results;\n }\n\n humanReadable(): string {\n let output = [] as string[];\n let findingsByFile = groupBy(this.findings, f => f.filename);\n output.push(`=== Audit Results ===`);\n for (let [filename, findings] of Object.entries(findingsByFile)) {\n output.push(`${chalk.yellow(filename)}`);\n for (let finding of findings) {\n output.push(indent(chalk.red(finding.message) + ': ' + finding.detail, 1));\n if (finding.codeFrame) {\n output.push(indent(finding.codeFrame, 2));\n }\n }\n output.push(indent(chalk.blueBright(`file was included because:`), 1));\n let pointer: string | RootMarker = filename;\n while (!isRootMarker(pointer)) {\n // the zero here means we only display the first path we found. I think\n // that's a fine tradeoff to keep the output smaller.\n let nextPointer: string | RootMarker | undefined = this.modules[pointer]?.consumedFrom[0];\n if (!nextPointer) {\n output.push(\n indent(\n chalk.red(`couldn't figure out why this was included. Please file a bug against @embroider/compat.`),\n 2\n )\n );\n break;\n }\n if (isRootMarker(nextPointer)) {\n output.push(indent('packageJSON.ember-addon.assets', 2));\n } else {\n output.push(indent(nextPointer, 2));\n }\n pointer = nextPointer;\n }\n }\n let summaryColor;\n if (this.perfect) {\n summaryColor = chalk.green;\n } else {\n summaryColor = chalk.yellow;\n }\n output.push(summaryColor(`${this.findings.length} issues found`));\n output.push(`=== End Audit Results ===`);\n output.push(''); // always end with a newline because `yarn run` can overwrite our last line otherwise\n return output.join('\\n');\n }\n\n get perfect() {\n return this.findings.length === 0;\n }\n}\n\nexport class Audit {\n private modules: Map<string, InternalModule> = new Map();\n private moduleQueue = new Set<string>();\n private findings = [] as Finding[];\n\n private frames = new CodeFrameStorage();\n\n static async run(options: AuditBuildOptions): Promise<AuditResults> {\n if (!options['reuse-build']) {\n await buildApp(options);\n }\n let dir = await this.findStage2Output(options);\n\n let audit = new this(dir, options);\n if (options['reuse-build']) {\n if (!audit.meta.babel.isParallelSafe || !audit.meta['template-compiler'].isParallelSafe) {\n throw new BuildError(\n `You can't use the ${chalk.red(\n '--reuse-build'\n )} option because some of your babel or HBS plugins are non-serializable`\n );\n }\n }\n return audit.run();\n }\n\n private static async findStage2Output(options: AuditBuildOptions): Promise<string> {\n try {\n return readFileSync(join(options.app, 'dist/.stage2-output'), 'utf8');\n } catch (err) {\n if (err.code === 'ENOENT') {\n throw new BuildError(\n `${chalk.yellow(\n 'Your build'\n )} did not produce expected Embroider stage2 output.\\nMake sure you actually have Embroider configured.`\n );\n }\n throw err;\n }\n }\n\n constructor(private appDir: string, private options: AuditOptions = {}) {}\n\n @Memoize()\n private get pkg() {\n return readJSONSync(join(this.appDir, 'package.json'));\n }\n\n private get meta() {\n return this.pkg['ember-addon'] as AppMeta;\n }\n\n @Memoize()\n private get babelConfig() {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n let config = require(join(this.appDir, this.meta.babel.filename));\n config = Object.assign({}, config);\n config.plugins = config.plugins.filter((p: any) => !isMacrosPlugin(p));\n config.ast = true;\n return config;\n }\n\n @Memoize()\n private get templateSetup(): { compile: (filename: string, content: string) => string; resolver: CompatResolver } {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n let templateCompiler = require(join(this.appDir, this.meta['template-compiler'].filename));\n let resolver = templateCompiler.params.resolver as CompatResolver;\n\n resolver.enableAuditMode();\n\n let compile = applyVariantToTemplateCompiler(\n { name: 'default', runtime: 'all', optimizeForProduction: false },\n templateCompiler.compile\n );\n return { compile, resolver };\n }\n\n private get templateCompiler(): (filename: string, content: string) => string {\n return this.templateSetup.compile;\n }\n\n private get templateResolver(): CompatResolver {\n return this.templateSetup.resolver;\n }\n\n private debug(message: string, ...args: any[]) {\n if (this.options.debug) {\n console.log(message, ...args);\n }\n }\n\n private visitorFor(\n filename: string\n ): (\n this: Audit,\n filename: string,\n content: Buffer | string\n ) => Promise<NonNullable<InternalModule['parsed']> | Finding[]> {\n if (filename.endsWith('.html')) {\n return this.visitHTML;\n } else if (filename.endsWith('.hbs')) {\n return this.visitHBS;\n } else if (filename.endsWith('.json')) {\n return this.visitJSON;\n } else {\n return this.visitJS;\n }\n }\n\n private async drainQueue() {\n while (this.moduleQueue.size > 0) {\n let filename = this.moduleQueue.values().next().value as string;\n this.moduleQueue.delete(filename);\n this.debug('visit', filename);\n let visitor = this.visitorFor(filename);\n let content = readFileSync(filename);\n // cast is safe because the only way to get into the queue is to go\n // through scheduleVisit, and scheduleVisit creates the entry in\n // this.modules.\n let module: InternalModule = this.modules.get(filename)!;\n let visitResult = await visitor.call(this, filename, content);\n if (Array.isArray(visitResult)) {\n // the visitor was unable to figure out the ParseFields and returned\n // some number of Findings to us to explain why.\n for (let finding of visitResult) {\n this.pushFinding(finding);\n }\n } else {\n module.parsed = visitResult;\n let resolved = new Map() as NonNullable<InternalModule['resolved']>;\n for (let dep of visitResult.dependencies) {\n let depFilename = await this.resolve(dep, filename);\n if (depFilename) {\n resolved.set(dep, depFilename);\n if (!isResolutionFailure(depFilename)) {\n this.scheduleVisit(depFilename, filename);\n }\n }\n }\n module.resolved = resolved;\n }\n }\n }\n\n async run(): Promise<AuditResults> {\n this.debug(`meta`, this.meta);\n for (let asset of this.meta.assets) {\n if (asset.endsWith('.html')) {\n this.scheduleVisit(resolvePath(this.appDir, asset), { isRoot: true });\n }\n }\n await this.drainQueue();\n this.linkModules();\n this.inspectModules();\n return AuditResults.create(this.appDir, this.findings, this.modules);\n }\n\n private linkModules() {\n for (let module of this.modules.values()) {\n if (isResolved(module)) {\n this.linkModule(module);\n }\n }\n }\n\n private linkModule(module: ResolvedInternalModule) {\n let exports = new Set<string>();\n for (let exp of module.parsed.exports) {\n if (typeof exp === 'string') {\n exports.add(exp);\n } else {\n let moduleName = module.resolved.get(exp.all)!;\n if (!isResolutionFailure(moduleName)) {\n let target = this.modules.get(moduleName)!;\n if (!isLinked(target) && isResolved(target)) {\n this.linkModule(target);\n }\n if (isLinked(target)) {\n for (let innerExp of target.linked.exports) {\n exports.add(innerExp);\n }\n } else {\n // our module doesn't successfully enter linked state because it\n // depends on stuff that also couldn't\n return;\n }\n }\n }\n }\n module.linked = {\n exports,\n };\n }\n\n private inspectModules() {\n for (let [filename, module] of this.modules) {\n if (isLinked(module)) {\n this.inspectImports(filename, module);\n }\n }\n }\n\n private inspectImports(filename: string, module: LinkedInternalModule) {\n for (let imp of module.parsed.imports) {\n let resolved = module.resolved.get(imp.source);\n if (isResolutionFailure(resolved)) {\n this.findings.push({\n filename,\n message: 'unable to resolve dependency',\n detail: imp.source,\n codeFrame: this.frames.render(imp.codeFrameIndex),\n });\n } else if (resolved) {\n let target = this.modules.get(resolved)!;\n for (let specifier of imp.specifiers) {\n if (isLinked(target) && !this.moduleProvidesName(target, specifier.name)) {\n if (specifier.name === 'default') {\n let backtick = '`';\n this.findings.push({\n filename,\n message: 'importing a non-existent default export',\n detail: `\"${imp.source}\" has no default export. Did you mean ${backtick}import * as ${specifier.local} from \"${imp.source}\"${backtick}?`,\n codeFrame: this.frames.render(specifier.codeFrameIndex),\n });\n } else {\n this.findings.push({\n filename,\n message: 'importing a non-existent named export',\n detail: `\"${imp.source}\" has no export named \"${specifier.name}\".`,\n codeFrame: this.frames.render(specifier.codeFrameIndex),\n });\n }\n }\n }\n }\n }\n }\n\n private moduleProvidesName(target: LinkedInternalModule, name: string | NamespaceMarker) {\n // any module can provide a namespace.\n // CJS and AMD are too dynamic to be sure exactly what names are available,\n // so they always get a pass\n return isNamespaceMarker(name) || target.parsed.isCJS || target.parsed.isAMD || target.linked.exports.has(name);\n }\n\n private async visitHTML(filename: string, content: Buffer | string): Promise<ParsedInternalModule['parsed']> {\n let dom = new JSDOM(content);\n let scripts = dom.window.document.querySelectorAll('script[type=\"module\"]') as NodeListOf<HTMLScriptElement>;\n let dependencies = [] as string[];\n for (let script of scripts) {\n let src = script.src;\n if (!src) {\n continue;\n }\n if (new URL(src, 'http://example.com:4321').origin !== 'http://example.com:4321') {\n // src was absolute, we don't handle it\n continue;\n }\n if (src.startsWith(this.meta['root-url'])) {\n // root-relative URLs are actually relative to the appDir\n src = explicitRelative(dirname(filename), resolvePath(this.appDir, src.replace(this.meta['root-url'], '')));\n }\n dependencies.push(src);\n }\n\n return {\n imports: [],\n exports: new Set(),\n isCJS: false,\n isAMD: false,\n dependencies,\n };\n }\n\n private async visitJS(\n filename: string,\n content: Buffer | string\n ): Promise<ParsedInternalModule['parsed'] | Finding[]> {\n let rawSource = content.toString('utf8');\n try {\n let result = auditJS(rawSource, filename, this.babelConfig, this.frames);\n\n for (let problem of result.problems) {\n this.pushFinding({\n filename,\n message: problem.message,\n detail: problem.detail,\n codeFrame: this.frames.render(problem.codeFrameIndex),\n });\n }\n return {\n exports: result.exports,\n imports: result.imports,\n isCJS: result.isCJS,\n isAMD: result.isAMD,\n dependencies: result.imports.map(i => i.source),\n };\n } catch (err) {\n if (err.code === 'BABEL_PARSE_ERROR') {\n return [\n {\n filename,\n message: `failed to parse`,\n detail: err.toString().replace(filename, explicitRelative(this.appDir, filename)),\n },\n ];\n } else {\n throw err;\n }\n }\n }\n\n private async visitHBS(\n filename: string,\n content: Buffer | string\n ): Promise<ParsedInternalModule['parsed'] | Finding[]> {\n let rawSource = content.toString('utf8');\n let js;\n try {\n js = this.templateCompiler(filename, rawSource);\n } catch (err) {\n return [\n {\n filename,\n message: `failed to compile template`,\n detail: err.toString().replace(filename, explicitRelative(this.appDir, filename)),\n },\n ];\n }\n for (let err of this.templateResolver.errorsIn(filename)) {\n this.pushFinding({\n filename,\n message: err.message,\n detail: err.detail,\n codeFrame: this.frames.render(this.frames.forSource(rawSource)(err)),\n });\n }\n return this.visitJS(filename, js);\n }\n\n private async visitJSON(\n filename: string,\n content: Buffer | string\n ): Promise<ParsedInternalModule['parsed'] | Finding[]> {\n let js;\n try {\n let structure = JSON.parse(content.toString('utf8'));\n js = `export default ${JSON.stringify(structure)}`;\n } catch (err) {\n return [\n {\n filename,\n message: `failed to parse JSON`,\n detail: err.toString().replace(filename, explicitRelative(this.appDir, filename)),\n },\n ];\n }\n return this.visitJS(filename, js);\n }\n\n private async resolve(specifier: string, fromPath: string): Promise<string | ResolutionFailure | undefined> {\n if (specifier === '@embroider/macros') {\n return;\n }\n try {\n return resolveModule.sync(specifier, {\n basedir: dirname(fromPath),\n extensions: this.meta['resolvable-extensions'],\n });\n } catch (err) {\n if (err.code === 'MODULE_NOT_FOUND') {\n return { isResolutionFailure: true };\n } else {\n throw err;\n }\n }\n }\n\n private pushFinding(finding: Finding) {\n this.findings.push(finding);\n }\n\n private scheduleVisit(filename: string, parent: string | RootMarker) {\n let record = this.modules.get(filename);\n if (!record) {\n this.debug(`discovered`, filename);\n record = {\n consumedFrom: [parent],\n };\n this.modules.set(filename, record);\n this.moduleQueue.add(filename);\n } else {\n record.consumedFrom.push(parent);\n }\n }\n}\n\nfunction isMacrosPlugin(p: any) {\n return Array.isArray(p) && p[1] && p[1].embroiderMacrosConfigMarker;\n}\n\nfunction indent(str: string, level: number) {\n const spacesPerLevel = 2;\n let spaces = '';\n for (let i = 0; i < level * spacesPerLevel; i++) {\n spaces += ' ';\n }\n\n return str\n .split('\\n')\n .map(line => spaces + line)\n .join('\\n');\n}\n\nexport interface RootMarker {\n isRoot: true;\n}\n\nexport function isRootMarker(value: string | RootMarker | undefined): value is RootMarker {\n return Boolean(value && typeof value !== 'string' && value.isRoot);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["audit.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync, readJSONSync } from 'fs-extra';\nimport { dirname, join, resolve as resolvePath } from 'path';\nimport resolveModule from 'resolve';\nimport { AppMeta, explicitRelative, hbsToJS } from '@embroider/core';\nimport { Memoize } from 'typescript-memoize';\nimport chalk from 'chalk';\nimport jsdom from 'jsdom';\nimport groupBy from 'lodash/groupBy';\nimport fromPairs from 'lodash/fromPairs';\nimport {\n auditJS,\n CodeFrameStorage,\n ExportAll,\n InternalImport,\n isNamespaceMarker,\n NamespaceMarker,\n} from './audit/babel-visitor';\nimport { AuditBuildOptions, AuditOptions } from './audit/options';\nimport { buildApp, BuildError, isBuildError } from './audit/build';\nimport { AuditMessage } from './resolver';\n\nconst { JSDOM } = jsdom;\n\nexport { AuditOptions, AuditBuildOptions, BuildError, isBuildError };\n\nexport interface Finding {\n message: string;\n filename: string;\n detail: string;\n codeFrame?: string;\n}\n\nexport interface Module {\n consumedFrom: (string | RootMarker)[];\n imports: Import[];\n exports: string[];\n resolutions: { [source: string]: string | null };\n}\n\ninterface ResolutionFailure {\n isResolutionFailure: true;\n}\n\nfunction isResolutionFailure(result: string | ResolutionFailure | undefined): result is ResolutionFailure {\n return typeof result === 'object' && 'isResolutionFailure' in result;\n}\n\ninterface InternalModule {\n consumedFrom: (string | RootMarker)[];\n\n parsed?: {\n imports: InternalImport[];\n exports: Set<string | ExportAll>;\n isCJS: boolean;\n isAMD: boolean;\n dependencies: string[];\n };\n\n resolved?: Map<string, string | ResolutionFailure>;\n\n linked?: {\n exports: Set<string>;\n };\n}\n\ntype ParsedInternalModule = Omit<InternalModule, 'parsed'> & {\n parsed: NonNullable<InternalModule['parsed']>;\n};\n\ntype ResolvedInternalModule = Omit<ParsedInternalModule, 'resolved'> & {\n resolved: NonNullable<ParsedInternalModule['resolved']>;\n};\n\nfunction isResolved(module: InternalModule | undefined): module is ResolvedInternalModule {\n return Boolean(module?.parsed && module.resolved);\n}\n\ntype LinkedInternalModule = Omit<ResolvedInternalModule, 'linked'> & {\n linked: NonNullable<ResolvedInternalModule['linked']>;\n};\n\nfunction isLinked(module: InternalModule | undefined): module is LinkedInternalModule {\n return Boolean(module?.parsed && module.resolved && module.linked);\n}\n\nexport interface Import {\n source: string;\n specifiers: {\n name: string | NamespaceMarker;\n local: string | null; // can be null when re-exporting, because in that case we import `name` from `source` but don't create any local binding for it\n }[];\n}\n\nexport class AuditResults {\n modules: { [file: string]: Module } = {};\n findings: Finding[] = [];\n\n static create(baseDir: string, findings: Finding[], modules: Map<string, InternalModule>) {\n let results = new this();\n for (let [filename, module] of modules) {\n let publicModule: Module = {\n consumedFrom: module.consumedFrom.map(entry => {\n if (isRootMarker(entry)) {\n return entry;\n } else {\n return explicitRelative(baseDir, entry);\n }\n }),\n resolutions: module.resolved\n ? fromPairs(\n [...module.resolved].map(([source, target]) => [\n source,\n isResolutionFailure(target) ? null : explicitRelative(baseDir, target),\n ])\n )\n : {},\n imports: module.parsed?.imports\n ? module.parsed.imports.map(i => ({\n source: i.source,\n specifiers: i.specifiers.map(s => ({\n name: s.name,\n local: s.local,\n })),\n }))\n : [],\n exports: module.linked?.exports ? [...module.linked.exports] : [],\n };\n results.modules[explicitRelative(baseDir, filename)] = publicModule;\n }\n for (let finding of findings) {\n let relFinding = Object.assign({}, finding, { filename: explicitRelative(baseDir, finding.filename) });\n results.findings.push(relFinding);\n }\n return results;\n }\n\n humanReadable(): string {\n let output = [] as string[];\n let findingsByFile = groupBy(this.findings, f => f.filename);\n output.push(`=== Audit Results ===`);\n for (let [filename, findings] of Object.entries(findingsByFile)) {\n output.push(`${chalk.yellow(filename)}`);\n for (let finding of findings) {\n output.push(indent(chalk.red(finding.message) + ': ' + finding.detail, 1));\n if (finding.codeFrame) {\n output.push(indent(finding.codeFrame, 2));\n }\n }\n output.push(indent(chalk.blueBright(`file was included because:`), 1));\n let pointer: string | RootMarker = filename;\n while (!isRootMarker(pointer)) {\n // the zero here means we only display the first path we found. I think\n // that's a fine tradeoff to keep the output smaller.\n let nextPointer: string | RootMarker | undefined = this.modules[pointer]?.consumedFrom[0];\n if (!nextPointer) {\n output.push(\n indent(\n chalk.red(`couldn't figure out why this was included. Please file a bug against @embroider/compat.`),\n 2\n )\n );\n break;\n }\n if (isRootMarker(nextPointer)) {\n output.push(indent('packageJSON.ember-addon.assets', 2));\n } else {\n output.push(indent(nextPointer, 2));\n }\n pointer = nextPointer;\n }\n }\n let summaryColor;\n if (this.perfect) {\n summaryColor = chalk.green;\n } else {\n summaryColor = chalk.yellow;\n }\n output.push(summaryColor(`${this.findings.length} issues found`));\n output.push(`=== End Audit Results ===`);\n output.push(''); // always end with a newline because `yarn run` can overwrite our last line otherwise\n return output.join('\\n');\n }\n\n get perfect() {\n return this.findings.length === 0;\n }\n}\n\nexport class Audit {\n private modules: Map<string, InternalModule> = new Map();\n private moduleQueue = new Set<string>();\n private findings = [] as Finding[];\n\n private frames = new CodeFrameStorage();\n\n static async run(options: AuditBuildOptions): Promise<AuditResults> {\n if (!options['reuse-build']) {\n await buildApp(options);\n }\n let dir = await this.findStage2Output(options);\n\n let audit = new this(dir, options);\n if (options['reuse-build']) {\n if (!audit.meta.babel.isParallelSafe) {\n throw new BuildError(\n `You can't use the ${chalk.red(\n '--reuse-build'\n )} option because some of your babel or HBS plugins are non-serializable`\n );\n }\n }\n return audit.run();\n }\n\n private static async findStage2Output(options: AuditBuildOptions): Promise<string> {\n try {\n return readFileSync(join(options.app, 'dist/.stage2-output'), 'utf8');\n } catch (err) {\n if (err.code === 'ENOENT') {\n throw new BuildError(\n `${chalk.yellow(\n 'Your build'\n )} did not produce expected Embroider stage2 output.\\nMake sure you actually have Embroider configured.`\n );\n }\n throw err;\n }\n }\n\n constructor(private appDir: string, private options: AuditOptions = {}) {}\n\n @Memoize()\n private get pkg() {\n return readJSONSync(join(this.appDir, 'package.json'));\n }\n\n private get meta() {\n return this.pkg['ember-addon'] as AppMeta;\n }\n\n @Memoize()\n private get babelConfig() {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n let config = require(join(this.appDir, this.meta.babel.filename));\n config = Object.assign({}, config);\n config.plugins = config.plugins.filter((p: any) => !isMacrosPlugin(p));\n\n config.ast = true;\n return config;\n }\n\n private debug(message: string, ...args: any[]) {\n if (this.options.debug) {\n console.log(message, ...args);\n }\n }\n\n private visitorFor(\n filename: string\n ): (\n this: Audit,\n filename: string,\n content: Buffer | string\n ) => Promise<NonNullable<InternalModule['parsed']> | Finding[]> {\n if (filename.endsWith('.html')) {\n return this.visitHTML;\n } else if (filename.endsWith('.hbs')) {\n return this.visitHBS;\n } else if (filename.endsWith('.json')) {\n return this.visitJSON;\n } else {\n return this.visitJS;\n }\n }\n\n private async drainQueue() {\n while (this.moduleQueue.size > 0) {\n let filename = this.moduleQueue.values().next().value as string;\n this.moduleQueue.delete(filename);\n this.debug('visit', filename);\n let visitor = this.visitorFor(filename);\n let content = readFileSync(filename);\n // cast is safe because the only way to get into the queue is to go\n // through scheduleVisit, and scheduleVisit creates the entry in\n // this.modules.\n let module: InternalModule = this.modules.get(filename)!;\n let visitResult = await visitor.call(this, filename, content);\n if (Array.isArray(visitResult)) {\n // the visitor was unable to figure out the ParseFields and returned\n // some number of Findings to us to explain why.\n for (let finding of visitResult) {\n this.pushFinding(finding);\n }\n } else {\n module.parsed = visitResult;\n let resolved = new Map() as NonNullable<InternalModule['resolved']>;\n for (let dep of visitResult.dependencies) {\n let depFilename = await this.resolve(dep, filename);\n if (depFilename) {\n resolved.set(dep, depFilename);\n if (!isResolutionFailure(depFilename)) {\n this.scheduleVisit(depFilename, filename);\n }\n }\n }\n module.resolved = resolved;\n }\n }\n }\n\n async run(): Promise<AuditResults> {\n (globalThis as any).embroider_audit = this.handleResolverError.bind(this);\n\n try {\n this.debug(`meta`, this.meta);\n for (let asset of this.meta.assets) {\n if (asset.endsWith('.html')) {\n this.scheduleVisit(resolvePath(this.appDir, asset), { isRoot: true });\n }\n }\n await this.drainQueue();\n this.linkModules();\n this.inspectModules();\n return AuditResults.create(this.appDir, this.findings, this.modules);\n } finally {\n delete (globalThis as any).embroider_audit;\n }\n }\n\n private handleResolverError(msg: AuditMessage) {\n this.pushFinding({\n message: msg.message,\n filename: msg.filename,\n detail: msg.detail,\n codeFrame: this.frames.render(this.frames.forSource(msg.source)(msg)),\n });\n }\n\n private linkModules() {\n for (let module of this.modules.values()) {\n if (isResolved(module)) {\n this.linkModule(module);\n }\n }\n }\n\n private linkModule(module: ResolvedInternalModule) {\n let exports = new Set<string>();\n for (let exp of module.parsed.exports) {\n if (typeof exp === 'string') {\n exports.add(exp);\n } else {\n let moduleName = module.resolved.get(exp.all)!;\n if (!isResolutionFailure(moduleName)) {\n let target = this.modules.get(moduleName)!;\n if (!isLinked(target) && isResolved(target)) {\n this.linkModule(target);\n }\n if (isLinked(target)) {\n for (let innerExp of target.linked.exports) {\n exports.add(innerExp);\n }\n } else {\n // our module doesn't successfully enter linked state because it\n // depends on stuff that also couldn't\n return;\n }\n }\n }\n }\n module.linked = {\n exports,\n };\n }\n\n private inspectModules() {\n for (let [filename, module] of this.modules) {\n if (isLinked(module)) {\n this.inspectImports(filename, module);\n }\n }\n }\n\n private inspectImports(filename: string, module: LinkedInternalModule) {\n for (let imp of module.parsed.imports) {\n let resolved = module.resolved.get(imp.source);\n if (isResolutionFailure(resolved)) {\n this.findings.push({\n filename,\n message: 'unable to resolve dependency',\n detail: imp.source,\n codeFrame: this.frames.render(imp.codeFrameIndex),\n });\n } else if (resolved) {\n let target = this.modules.get(resolved)!;\n for (let specifier of imp.specifiers) {\n if (isLinked(target) && !this.moduleProvidesName(target, specifier.name)) {\n if (specifier.name === 'default') {\n let backtick = '`';\n this.findings.push({\n filename,\n message: 'importing a non-existent default export',\n detail: `\"${imp.source}\" has no default export. Did you mean ${backtick}import * as ${specifier.local} from \"${imp.source}\"${backtick}?`,\n codeFrame: this.frames.render(specifier.codeFrameIndex),\n });\n } else {\n this.findings.push({\n filename,\n message: 'importing a non-existent named export',\n detail: `\"${imp.source}\" has no export named \"${specifier.name}\".`,\n codeFrame: this.frames.render(specifier.codeFrameIndex),\n });\n }\n }\n }\n }\n }\n }\n\n private moduleProvidesName(target: LinkedInternalModule, name: string | NamespaceMarker) {\n // any module can provide a namespace.\n // CJS and AMD are too dynamic to be sure exactly what names are available,\n // so they always get a pass\n return isNamespaceMarker(name) || target.parsed.isCJS || target.parsed.isAMD || target.linked.exports.has(name);\n }\n\n private async visitHTML(filename: string, content: Buffer | string): Promise<ParsedInternalModule['parsed']> {\n let dom = new JSDOM(content);\n let scripts = dom.window.document.querySelectorAll('script[type=\"module\"]') as NodeListOf<HTMLScriptElement>;\n let dependencies = [] as string[];\n for (let script of scripts) {\n let src = script.src;\n if (!src) {\n continue;\n }\n if (new URL(src, 'http://example.com:4321').origin !== 'http://example.com:4321') {\n // src was absolute, we don't handle it\n continue;\n }\n if (src.startsWith(this.meta['root-url'])) {\n // root-relative URLs are actually relative to the appDir\n src = explicitRelative(dirname(filename), resolvePath(this.appDir, src.replace(this.meta['root-url'], '')));\n }\n dependencies.push(src);\n }\n\n return {\n imports: [],\n exports: new Set(),\n isCJS: false,\n isAMD: false,\n dependencies,\n };\n }\n\n private async visitJS(\n filename: string,\n content: Buffer | string\n ): Promise<ParsedInternalModule['parsed'] | Finding[]> {\n let rawSource = content.toString('utf8');\n try {\n let result = auditJS(rawSource, filename, this.babelConfig, this.frames);\n\n for (let problem of result.problems) {\n this.pushFinding({\n filename,\n message: problem.message,\n detail: problem.detail,\n codeFrame: this.frames.render(problem.codeFrameIndex),\n });\n }\n return {\n exports: result.exports,\n imports: result.imports,\n isCJS: result.isCJS,\n isAMD: result.isAMD,\n dependencies: result.imports.map(i => i.source),\n };\n } catch (err) {\n if (['BABEL_PARSE_ERROR', 'BABEL_TRANSFORM_ERROR'].includes(err.code)) {\n return [\n {\n filename,\n message: `failed to parse`,\n detail: err.toString().replace(filename, explicitRelative(this.appDir, filename)),\n },\n ];\n } else {\n throw err;\n }\n }\n }\n\n private async visitHBS(\n filename: string,\n content: Buffer | string\n ): Promise<ParsedInternalModule['parsed'] | Finding[]> {\n let rawSource = content.toString('utf8');\n let js = hbsToJS(rawSource);\n return this.visitJS(filename, js);\n }\n\n private async visitJSON(\n filename: string,\n content: Buffer | string\n ): Promise<ParsedInternalModule['parsed'] | Finding[]> {\n let js;\n try {\n let structure = JSON.parse(content.toString('utf8'));\n js = `export default ${JSON.stringify(structure)}`;\n } catch (err) {\n return [\n {\n filename,\n message: `failed to parse JSON`,\n detail: err.toString().replace(filename, explicitRelative(this.appDir, filename)),\n },\n ];\n }\n return this.visitJS(filename, js);\n }\n\n private async resolve(specifier: string, fromPath: string): Promise<string | ResolutionFailure | undefined> {\n if (['@embroider/macros', '@ember/template-factory'].includes(specifier)) {\n return;\n }\n try {\n return resolveModule.sync(specifier, {\n basedir: dirname(fromPath),\n extensions: this.meta['resolvable-extensions'],\n });\n } catch (err) {\n if (err.code === 'MODULE_NOT_FOUND') {\n return { isResolutionFailure: true };\n } else {\n throw err;\n }\n }\n }\n\n private pushFinding(finding: Finding) {\n this.findings.push(finding);\n }\n\n private scheduleVisit(filename: string, parent: string | RootMarker) {\n let record = this.modules.get(filename);\n if (!record) {\n this.debug(`discovered`, filename);\n record = {\n consumedFrom: [parent],\n };\n this.modules.set(filename, record);\n this.moduleQueue.add(filename);\n } else {\n record.consumedFrom.push(parent);\n }\n }\n}\n\nfunction isMacrosPlugin(p: any) {\n return Array.isArray(p) && p[1] && p[1].embroiderMacrosConfigMarker;\n}\n\nfunction indent(str: string, level: number) {\n const spacesPerLevel = 2;\n let spaces = '';\n for (let i = 0; i < level * spacesPerLevel; i++) {\n spaces += ' ';\n }\n\n return str\n .split('\\n')\n .map(line => spaces + line)\n .join('\\n');\n}\n\nexport interface RootMarker {\n isRoot: true;\n}\n\nexport function isRootMarker(value: string | RootMarker | undefined): value is RootMarker {\n return Boolean(value && typeof value !== 'string' && value.isRoot);\n}\n"]}
|
|
@@ -2,3 +2,4 @@ import { PluginItem } from '@babel/core';
|
|
|
2
2
|
export declare function isEmberAutoImportDynamic(item: PluginItem): boolean;
|
|
3
3
|
export declare function isCompactReexports(item: PluginItem): boolean;
|
|
4
4
|
export declare function isColocationPlugin(item: PluginItem): boolean;
|
|
5
|
+
export declare function isInlinePrecompilePlugin(item: PluginItem): boolean;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.isColocationPlugin = exports.isCompactReexports = exports.isEmberAutoImportDynamic = void 0;
|
|
3
|
+
exports.isInlinePrecompilePlugin = exports.isColocationPlugin = exports.isCompactReexports = exports.isEmberAutoImportDynamic = void 0;
|
|
4
4
|
const path_1 = require("path");
|
|
5
5
|
function isEmberAutoImportDynamic(item) {
|
|
6
6
|
let pluginPath;
|
|
@@ -44,4 +44,39 @@ function isColocationPlugin(item) {
|
|
|
44
44
|
return pluginPath.includes((0, path_1.join)('ember-cli-htmlbars', 'lib', 'colocated-babel-plugin', path_1.sep));
|
|
45
45
|
}
|
|
46
46
|
exports.isColocationPlugin = isColocationPlugin;
|
|
47
|
+
// tests for the classic ember-cli-htmlbars-inline-precompile babel plugin
|
|
48
|
+
function isInlinePrecompilePlugin(item) {
|
|
49
|
+
if (typeof item === 'string') {
|
|
50
|
+
return matchesSourceFile(item);
|
|
51
|
+
}
|
|
52
|
+
if (hasProperties(item) && item._parallelBabel) {
|
|
53
|
+
return matchesSourceFile(item._parallelBabel.requireFile);
|
|
54
|
+
}
|
|
55
|
+
if (Array.isArray(item) && item.length > 0) {
|
|
56
|
+
if (typeof item[0] === 'string') {
|
|
57
|
+
return matchesSourceFile(item[0]);
|
|
58
|
+
}
|
|
59
|
+
if (hasProperties(item[0]) && item[0]._parallelBabel) {
|
|
60
|
+
return matchesSourceFile(item[0]._parallelBabel.requireFile);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
exports.isInlinePrecompilePlugin = isInlinePrecompilePlugin;
|
|
66
|
+
function matchesSourceFile(filename) {
|
|
67
|
+
return Boolean(htmlbarPathMatches.find(match => filename.endsWith(match)));
|
|
68
|
+
}
|
|
69
|
+
function hasProperties(item) {
|
|
70
|
+
return item && (typeof item === 'object' || typeof item === 'function');
|
|
71
|
+
}
|
|
72
|
+
const htmlbarPathMatches = [
|
|
73
|
+
['htmlbars-inline-precompile', 'index.js'].join(path_1.sep),
|
|
74
|
+
['htmlbars-inline-precompile', 'lib', 'require-from-worker.js'].join(path_1.sep),
|
|
75
|
+
['htmlbars-inline-precompile', 'index'].join(path_1.sep),
|
|
76
|
+
['htmlbars-inline-precompile', 'lib', 'require-from-worker'].join(path_1.sep),
|
|
77
|
+
['ember-cli-htmlbars', 'index.js'].join(path_1.sep),
|
|
78
|
+
['ember-cli-htmlbars', 'lib', 'require-from-worker.js'].join(path_1.sep),
|
|
79
|
+
['ember-cli-htmlbars', 'index'].join(path_1.sep),
|
|
80
|
+
['ember-cli-htmlbars', 'lib', 'require-from-worker'].join(path_1.sep),
|
|
81
|
+
];
|
|
47
82
|
//# sourceMappingURL=detect-babel-plugins.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect-babel-plugins.js","sourceRoot":"","sources":["detect-babel-plugins.ts"],"names":[],"mappings":";;;AACA,+BAAiC;AAEjC,SAAgB,wBAAwB,CAAC,IAAgB;IACvD,IAAI,UAAkB,CAAC;IACvB,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QAC5B,UAAU,GAAG,IAAI,CAAC;KACnB;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;QAChF,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;KACtB;SAAM;QACL,OAAO,KAAK,CAAC;KACd;IAED,OAAO,UAAU,CAAC,QAAQ,CAAC,IAAA,WAAI,EAAC,UAAG,EAAE,mBAAmB,EAAE,UAAG,CAAC,CAAC,CAAC;AAClE,CAAC;AAXD,4DAWC;AAED,SAAgB,kBAAkB,CAAC,IAAgB;IACjD,IAAI,UAAkB,CAAC;IACvB,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QAC5B,UAAU,GAAG,IAAI,CAAC;KACnB;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;QAChF,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;KACtB;SAAM;QACL,OAAO,KAAK,CAAC;KACd;IAED,OAAO,UAAU,CAAC,QAAQ,CAAC,IAAA,WAAI,EAAC,gCAAgC,EAAE,UAAG,CAAC,CAAC,CAAC;AAC1E,CAAC;AAXD,gDAWC;AAED,SAAgB,kBAAkB,CAAC,IAAgB;IACjD,IAAI,UAAkB,CAAC;IACvB,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QAC5B,UAAU,GAAG,IAAI,CAAC;KACnB;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;QAChF,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;KACtB;SAAM;QACL,OAAO,KAAK,CAAC;KACd;IAED,OAAO,UAAU,CAAC,QAAQ,CAAC,IAAA,WAAI,EAAC,oBAAoB,EAAE,KAAK,EAAE,wBAAwB,EAAE,UAAG,CAAC,CAAC,CAAC;AAC/F,CAAC;AAXD,gDAWC","sourcesContent":["import { PluginItem } from '@babel/core';\nimport { join, sep } from 'path';\n\nexport function isEmberAutoImportDynamic(item: PluginItem): boolean {\n let pluginPath: string;\n if (typeof item === 'string') {\n pluginPath = item;\n } else if (Array.isArray(item) && item.length > 0 && typeof item[0] === 'string') {\n pluginPath = item[0];\n } else {\n return false;\n }\n\n return pluginPath.includes(join(sep, 'ember-auto-import', sep));\n}\n\nexport function isCompactReexports(item: PluginItem): boolean {\n let pluginPath: string;\n if (typeof item === 'string') {\n pluginPath = item;\n } else if (Array.isArray(item) && item.length > 0 && typeof item[0] === 'string') {\n pluginPath = item[0];\n } else {\n return false;\n }\n\n return pluginPath.includes(join('babel-plugin-compact-reexports', sep));\n}\n\nexport function isColocationPlugin(item: PluginItem): boolean {\n let pluginPath: string;\n if (typeof item === 'string') {\n pluginPath = item;\n } else if (Array.isArray(item) && item.length > 0 && typeof item[0] === 'string') {\n pluginPath = item[0];\n } else {\n return false;\n }\n\n return pluginPath.includes(join('ember-cli-htmlbars', 'lib', 'colocated-babel-plugin', sep));\n}\n"]}
|
|
1
|
+
{"version":3,"file":"detect-babel-plugins.js","sourceRoot":"","sources":["detect-babel-plugins.ts"],"names":[],"mappings":"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","sourcesContent":["import { PluginItem } from '@babel/core';\nimport { join, sep } from 'path';\n\nexport function isEmberAutoImportDynamic(item: PluginItem): boolean {\n let pluginPath: string;\n if (typeof item === 'string') {\n pluginPath = item;\n } else if (Array.isArray(item) && item.length > 0 && typeof item[0] === 'string') {\n pluginPath = item[0];\n } else {\n return false;\n }\n\n return pluginPath.includes(join(sep, 'ember-auto-import', sep));\n}\n\nexport function isCompactReexports(item: PluginItem): boolean {\n let pluginPath: string;\n if (typeof item === 'string') {\n pluginPath = item;\n } else if (Array.isArray(item) && item.length > 0 && typeof item[0] === 'string') {\n pluginPath = item[0];\n } else {\n return false;\n }\n\n return pluginPath.includes(join('babel-plugin-compact-reexports', sep));\n}\n\nexport function isColocationPlugin(item: PluginItem): boolean {\n let pluginPath: string;\n if (typeof item === 'string') {\n pluginPath = item;\n } else if (Array.isArray(item) && item.length > 0 && typeof item[0] === 'string') {\n pluginPath = item[0];\n } else {\n return false;\n }\n\n return pluginPath.includes(join('ember-cli-htmlbars', 'lib', 'colocated-babel-plugin', sep));\n}\n\n// tests for the classic ember-cli-htmlbars-inline-precompile babel plugin\nexport function isInlinePrecompilePlugin(item: PluginItem) {\n if (typeof item === 'string') {\n return matchesSourceFile(item);\n }\n if (hasProperties(item) && (item as any)._parallelBabel) {\n return matchesSourceFile((item as any)._parallelBabel.requireFile);\n }\n if (Array.isArray(item) && item.length > 0) {\n if (typeof item[0] === 'string') {\n return matchesSourceFile(item[0]);\n }\n if (hasProperties(item[0]) && (item[0] as any)._parallelBabel) {\n return matchesSourceFile((item[0] as any)._parallelBabel.requireFile);\n }\n }\n return false;\n}\n\nfunction matchesSourceFile(filename: string) {\n return Boolean(htmlbarPathMatches.find(match => filename.endsWith(match)));\n}\n\nfunction hasProperties(item: any) {\n return item && (typeof item === 'object' || typeof item === 'function');\n}\n\nconst htmlbarPathMatches = [\n ['htmlbars-inline-precompile', 'index.js'].join(sep),\n ['htmlbars-inline-precompile', 'lib', 'require-from-worker.js'].join(sep),\n ['htmlbars-inline-precompile', 'index'].join(sep),\n ['htmlbars-inline-precompile', 'lib', 'require-from-worker'].join(sep),\n ['ember-cli-htmlbars', 'index.js'].join(sep),\n ['ember-cli-htmlbars', 'lib', 'require-from-worker.js'].join(sep),\n ['ember-cli-htmlbars', 'index'].join(sep),\n ['ember-cli-htmlbars', 'lib', 'require-from-worker'].join(sep),\n];\n"]}
|
package/src/options.js
CHANGED
package/src/options.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.js","sourceRoot":"","sources":["options.ts"],"names":[],"mappings":";;;AAEA,0CAAkG;AA0FlG,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,IAAA,0BAAgB,GAAE,EAAE;IACjD,gBAAgB,EAAE,KAAK;IACvB,2BAA2B,EAAE,KAAK;IAClC,cAAc,EAAE,IAAI,GAAG,EAAE;IACzB,gBAAgB,EAAE,EAAE;IACpB,YAAY,EAAE,IAAI;IAClB,
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["options.ts"],"names":[],"mappings":";;;AAEA,0CAAkG;AA0FlG,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,IAAA,0BAAgB,GAAE,EAAE;IACjD,gBAAgB,EAAE,KAAK;IACvB,2BAA2B,EAAE,KAAK;IAClC,cAAc,EAAE,IAAI,GAAG,EAAE;IACzB,gBAAgB,EAAE,EAAE;IACpB,YAAY,EAAE,IAAI;IAClB,YAAY,EAAE,EAAE;IAChB,4BAA4B,EAAE,KAAK;CACpC,CAAC,CAAC;AAEH,SAAgB,mBAAmB,CAAC,OAAiB;IACnD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC;AAFD,kDAEC;AAED,+EAA+E;AAC/E,6EAA6E;AAC7E,+EAA+E;AAC/E,cAAc;AACD,QAAA,kBAAkB,GAAgC,MAAM,CAAC,MAAM,CAAC;IAC3E,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC;QACvB,gBAAgB,EAAE,IAAI;QACtB,2BAA2B,EAAE,IAAI;QACjC,aAAa,EAAE,IAAI;QACnB,eAAe,EAAE,IAAI;QACrB,gBAAgB,EAAE,IAAI;QACtB,4BAA4B,EAAE,KAAK;KACpC,CAAC;CACH,CAAC,CAAC","sourcesContent":["import { V1AddonConstructor } from './v1-addon';\nimport { Node } from 'broccoli-node-api';\nimport { Options as CoreOptions, optionsWithDefaults as coreWithDefaults } from '@embroider/core';\nimport { PackageRules } from './dependency-rules';\n\n// These options control how hard we will try to achieve compatibility with v1\n// addons. The defaults are conservative and try to maximize compatibility, at\n// the cost of slower or bigger builds. As you eliminate sources of legacy\n// behavior you can benefit from the more aggressive modes.\nexport default interface Options extends CoreOptions {\n // Controls whether your addon's \"addon\" trees should be resolved statically\n // at build time.\n //\n // false (the default): implies maximum backward compatibility at the cost\n // of bigger builds. In this mode, we force every file into the Ember app,\n // which is the legacy behavior.\n //\n // true: produces smaller builds. The addon files must be imported from\n // somewhere we can statically see during the build. In this mode, your app\n // will only include files that are actually imported from somewhere.\n //\n // Commentary: most v1 addons already work well with this set to true, because\n // they tend to either offer Javascript that users are supposed to directly\n // `import` or components / helpers / services that get directly imported and\n // re-exported by code in App Javascript. The exceptions are addons that do\n // runtime shenanigans with `require` or scoped runtime resolutions.\n //\n // To workaround an addon that is preventing you from enabling this flag, you\n // can use addonDependencyRules.\n staticAddonTrees?: boolean;\n\n // Controls whether your addon's \"addonTestSupport\" trees should be resolved\n // statically at build time.\n //\n // false (the default): implies maximum backward compatibility at the cost\n // of bigger builds. All test support files will be forced into your Ember\n // app, which is the legacy behavior.\n //\n // true: produces smaller builds. Only files that are explicitly imported\n // will end up in your app.\n //\n // Commentary: this is analogous to staticAddonTrees and the same guidelines\n // apply.\n staticAddonTestSupportTrees?: boolean;\n\n // Allows you to override how specific addons will build. Like:\n //\n // import V1Addon from '@embroider/compat'; let compatAdapters = new Map();\n // compatAdapters.set('some-addon', class extends V1Addon {// do stuff here:\n // see examples in ./compat-adapters\n // });\n //\n // This should be understood as a temporary way to keep yourself from getting\n // stuck, not an alternative to actually fixing upstream. For the most part,\n // the real solution will be converting the addon in question to natively\n // publish as v2.\n //\n // We ship with some default compatAdapters to fix otherwise incompatible\n // behaviors in popular addons. You can override the default adapters by\n // setting your own value here (including null to completely disable it).\n compatAdapters?: Map<string, V1AddonConstructor | null>;\n\n // temporary directory where we will work when we're rewriting your addons\n // and/or app to v2-compatible formats.\n workspaceDir?: string | null;\n\n // optional list of additional broccoli trees that should be incorporated into\n // the final build. This exists because the classic `app.toTree()` method\n // accepts an optional tree argument that has the same purpose.\n extraPublicTrees?: Node[];\n\n // Allows you to tell Embroider about otherwise dynamic dependencies within\n // your app and addons that it can't figure out on its own. These are combined\n // with the default rules that ship with Embroider. Your own rules take\n // precedence over the built-ins. Order matters, first matching rule will\n // apply to any given addon.\n //\n // See the addon-dependency-rules directory in the @embroider/compat package\n // for the built-in rules.\n //\n // These ONLY APPLY to v1-formatted addons. An addon that ships as native v2\n // is expected to do the right thing on its own.\n //\n // Follow to the definition of PackageRules for more info.\n packageRules?: PackageRules[];\n\n // This turns build errors into runtime errors. It is not a good idea to keep\n // it on in production. But it can be helpful when testing how much of your\n // app is able to work with staticComponents enabled.\n allowUnsafeDynamicComponents?: boolean;\n}\n\nconst defaults = Object.assign(coreWithDefaults(), {\n staticAddonTrees: false,\n staticAddonTestSupportTrees: false,\n compatAdapters: new Map(),\n extraPublicTrees: [],\n workspaceDir: null,\n packageRules: [],\n allowUnsafeDynamicComponents: false,\n});\n\nexport function optionsWithDefaults(options?: Options): Required<Options> {\n return Object.assign({}, defaults, options);\n}\n\n// These are recommended configurations for addons to test themselves under. By\n// keeping them here, it's easier to do ecosystem-wide compatibility testing.\n// See the `@embroider/test-setup` package which can help consume these to test\n// them in CI.\nexport const recommendedOptions: { [name: string]: Options } = Object.freeze({\n safe: Object.freeze({}),\n optimized: Object.freeze({\n staticAddonTrees: true,\n staticAddonTestSupportTrees: true,\n staticHelpers: true,\n staticModifiers: true,\n staticComponents: true,\n allowUnsafeDynamicComponents: false,\n }),\n});\n"]}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { default as Resolver } from './resolver';
|
|
2
2
|
import type { ASTv1 } from '@glimmer/syntax';
|
|
3
3
|
export declare function makeResolverTransform(resolver: Resolver): {
|
|
4
|
-
({ filename }: {
|
|
4
|
+
({ filename, contents }: {
|
|
5
5
|
filename: string;
|
|
6
|
+
contents: string;
|
|
6
7
|
}): {
|
|
7
8
|
name: string;
|
|
8
9
|
visitor: {
|
|
@@ -8,8 +8,8 @@ const resolver_1 = __importDefault(require("./resolver"));
|
|
|
8
8
|
// This is the AST transform that resolves components, helpers and modifiers at build time
|
|
9
9
|
// and puts them into `dependencies`.
|
|
10
10
|
function makeResolverTransform(resolver) {
|
|
11
|
-
function resolverTransform({ filename }) {
|
|
12
|
-
resolver.enter(filename);
|
|
11
|
+
function resolverTransform({ filename, contents }) {
|
|
12
|
+
resolver.enter(filename, contents);
|
|
13
13
|
let scopeStack = new ScopeStack();
|
|
14
14
|
return {
|
|
15
15
|
name: 'embroider-build-time-resolver',
|
|
@@ -79,6 +79,10 @@ function makeResolverTransform(resolver) {
|
|
|
79
79
|
handleDynamicHelper(node.params[0], resolver, filename);
|
|
80
80
|
return;
|
|
81
81
|
}
|
|
82
|
+
if (node.path.original === 'modifier' && node.params.length > 0) {
|
|
83
|
+
handleDynamicModifier(node.params[0], resolver, filename);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
82
86
|
resolver.resolveSubExpression(node.path.original, filename, node.path.loc);
|
|
83
87
|
},
|
|
84
88
|
MustacheStatement(node) {
|
|
@@ -309,15 +313,17 @@ function handleComponentHelper(param, resolver, moduleName, scopeStack, impliedB
|
|
|
309
313
|
resolver.resolveComponentHelper(locator, moduleName, param.loc, impliedBecause);
|
|
310
314
|
}
|
|
311
315
|
function handleDynamicHelper(param, resolver, moduleName) {
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
316
|
+
// We only need to handle StringLiterals since Ember already throws an error if unsupported values
|
|
317
|
+
// are passed to the helper keyword.
|
|
318
|
+
// If a helper reference is passed in we don't need to do anything since it's either the result of a previous
|
|
319
|
+
// helper keyword invocation, or a helper reference that was imported somewhere.
|
|
320
|
+
if (param.type === 'StringLiteral') {
|
|
321
|
+
resolver.resolveDynamicHelper({ type: 'literal', path: param.value }, moduleName, param.loc);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
function handleDynamicModifier(param, resolver, moduleName) {
|
|
325
|
+
if (param.type === 'StringLiteral') {
|
|
326
|
+
resolver.resolveDynamicModifier({ type: 'literal', path: param.value }, moduleName, param.loc);
|
|
321
327
|
}
|
|
322
328
|
}
|
|
323
329
|
//# sourceMappingURL=resolver-transform.js.map
|