@embroider/compat 3.8.0 → 3.8.1-unstable.f779011
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/babel.js +1 -0
- package/package.json +15 -17
- package/src/audit/babel-visitor.js +7 -1
- package/src/audit/babel-visitor.js.map +1 -1
- package/src/audit/build.js.map +1 -1
- package/src/audit/options.d.ts +2 -1
- package/src/audit/options.js.map +1 -1
- package/src/audit.d.ts +7 -57
- package/src/audit.js +101 -301
- package/src/audit.js.map +1 -1
- package/src/babel-plugin-adjust-imports.js +19 -18
- package/src/babel-plugin-adjust-imports.js.map +1 -1
- package/src/babel.d.ts +17 -0
- package/src/babel.js +146 -0
- package/src/babel.js.map +1 -0
- package/src/compat-adapters/@ember-data/store.d.ts +1 -5
- package/src/compat-adapters/@ember-data/store.js +3 -15
- package/src/compat-adapters/@ember-data/store.js.map +1 -1
- package/src/compat-adapters/active-model-adapter.d.ts +1 -1
- package/src/compat-adapters/ember-asset-loader.d.ts +1 -1
- package/src/compat-adapters/ember-cli-addon-docs.d.ts +1 -1
- package/src/compat-adapters/ember-cli-fastboot.js +0 -1
- package/src/compat-adapters/ember-cli-fastboot.js.map +1 -1
- package/src/compat-adapters/ember-cli-mirage.js +0 -1
- package/src/compat-adapters/ember-cli-mirage.js.map +1 -1
- package/src/compat-adapters/ember-decorators.d.ts +1 -1
- package/src/compat-adapters/ember-fetch.d.ts +5 -0
- package/src/compat-adapters/{ember-macro-helpers.js → ember-fetch.js} +5 -4
- package/src/compat-adapters/ember-fetch.js.map +1 -0
- package/src/compat-adapters/ember-percy.d.ts +1 -1
- package/src/compat-adapters/ember-resolver.d.ts +4 -0
- package/src/compat-adapters/ember-resolver.js +21 -0
- package/src/compat-adapters/ember-resolver.js.map +1 -0
- package/src/compat-adapters/ember-scroll-modifiers.d.ts +1 -1
- package/src/compat-adapters/ember-source.d.ts +3 -6
- package/src/compat-adapters/ember-source.js +26 -41
- package/src/compat-adapters/ember-source.js.map +1 -1
- package/src/compat-adapters/ember-test-selectors.d.ts +1 -1
- package/src/compat-addons.js +1 -1
- package/src/compat-addons.js.map +1 -1
- package/src/compat-app-builder.d.ts +9 -64
- package/src/compat-app-builder.js +110 -1272
- package/src/compat-app-builder.js.map +1 -1
- package/src/compat-app.d.ts +4 -22
- package/src/compat-app.js +77 -218
- package/src/compat-app.js.map +1 -1
- package/src/content-for-config.d.ts +11 -0
- package/src/content-for-config.js +66 -0
- package/src/content-for-config.js.map +1 -0
- package/src/default-pipeline.d.ts +3 -5
- package/src/default-pipeline.js +11 -49
- package/src/default-pipeline.js.map +1 -1
- package/src/dependency-rules.d.ts +1 -0
- package/src/dependency-rules.js +19 -11
- package/src/dependency-rules.js.map +1 -1
- package/src/detect-babel-plugins.d.ts +1 -0
- package/src/detect-babel-plugins.js +14 -0
- package/src/detect-babel-plugins.js.map +1 -1
- package/src/http-audit.d.ts +13 -0
- package/src/http-audit.js +60 -0
- package/src/http-audit.js.map +1 -0
- package/src/index.d.ts +2 -2
- package/src/index.js +2 -4
- package/src/index.js.map +1 -1
- package/src/module-visitor.d.ts +52 -0
- package/src/module-visitor.js +285 -0
- package/src/module-visitor.js.map +1 -0
- package/src/options.d.ts +3 -3
- package/src/options.js +3 -2
- package/src/options.js.map +1 -1
- package/src/resolver-transform.js +56 -15
- package/src/resolver-transform.js.map +1 -1
- package/src/standalone-addon-build.js +6 -15
- package/src/standalone-addon-build.js.map +1 -1
- package/src/v1-config.d.ts +0 -8
- package/src/v1-config.js +1 -51
- package/src/v1-config.js.map +1 -1
- package/src/audit-cli.d.ts +0 -2
- package/src/audit-cli.js +0 -150
- package/src/audit-cli.js.map +0 -1
- package/src/compat-adapters/@ember-data/debug.d.ts +0 -6
- package/src/compat-adapters/@ember-data/debug.js +0 -22
- package/src/compat-adapters/@ember-data/debug.js.map +0 -1
- package/src/compat-adapters/ember-macro-helpers.d.ts +0 -4
- package/src/compat-adapters/ember-macro-helpers.js.map +0 -1
- package/src/rename-require-plugin.d.ts +0 -1
- package/src/rename-require-plugin.js +0 -15
- package/src/rename-require-plugin.js.map +0 -1
- package/src/sync-dir.d.ts +0 -8
- package/src/sync-dir.js +0 -68
- package/src/sync-dir.js.map +0 -1
- package/src/template-tag-codemod.d.ts +0 -13
- package/src/template-tag-codemod.js +0 -302
- package/src/template-tag-codemod.js.map +0 -1
- package/src/v1-appboot.d.ts +0 -14
- package/src/v1-appboot.js +0 -47
- package/src/v1-appboot.js.map +0 -1
|
@@ -4,6 +4,7 @@ exports.isEmberAutoImportDynamic = isEmberAutoImportDynamic;
|
|
|
4
4
|
exports.isCompactReexports = isCompactReexports;
|
|
5
5
|
exports.isColocationPlugin = isColocationPlugin;
|
|
6
6
|
exports.isInlinePrecompilePlugin = isInlinePrecompilePlugin;
|
|
7
|
+
exports.isHtmlbarColocation = isHtmlbarColocation;
|
|
7
8
|
const path_1 = require("path");
|
|
8
9
|
function isEmberAutoImportDynamic(item) {
|
|
9
10
|
let pluginPath;
|
|
@@ -62,6 +63,19 @@ function isInlinePrecompilePlugin(item) {
|
|
|
62
63
|
}
|
|
63
64
|
return false;
|
|
64
65
|
}
|
|
66
|
+
function isHtmlbarColocation(item) {
|
|
67
|
+
let pluginPath;
|
|
68
|
+
if (typeof item === 'string') {
|
|
69
|
+
pluginPath = item;
|
|
70
|
+
}
|
|
71
|
+
else if (Array.isArray(item) && item.length > 0 && typeof item[0] === 'string') {
|
|
72
|
+
pluginPath = item[0];
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
return pluginPath.includes((0, path_1.join)(path_1.sep, 'ember-cli-htmlbars', path_1.sep, 'lib', path_1.sep, 'colocated-babel-plugin'));
|
|
78
|
+
}
|
|
65
79
|
function matchesSourceFile(filename) {
|
|
66
80
|
return Boolean(htmlbarPathMatches.find(match => filename.endsWith(match)));
|
|
67
81
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect-babel-plugins.js","sourceRoot":"","sources":["detect-babel-plugins.ts"],"names":[],"mappings":";;AAGA,4DAWC;AAED,gDAWC;AAED,gDAWC;AAGD,4DAgBC;
|
|
1
|
+
{"version":3,"file":"detect-babel-plugins.js","sourceRoot":"","sources":["detect-babel-plugins.ts"],"names":[],"mappings":"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","sourcesContent":["import type { 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\nexport function isHtmlbarColocation(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-cli-htmlbars', sep, 'lib', sep, 'colocated-babel-plugin'));\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 ['babel-plugin-ember-template-compilation', 'src', 'node-main.js'].join(sep),\n];\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Finding } from './audit';
|
|
2
|
+
import { type Module } from './module-visitor';
|
|
3
|
+
export interface HTTPAuditOptions {
|
|
4
|
+
appURL: string;
|
|
5
|
+
startingFrom: string[];
|
|
6
|
+
fetch?: typeof fetch;
|
|
7
|
+
}
|
|
8
|
+
export declare function httpAudit(options: HTTPAuditOptions): Promise<{
|
|
9
|
+
modules: {
|
|
10
|
+
[file: string]: Module;
|
|
11
|
+
};
|
|
12
|
+
findings: Finding[];
|
|
13
|
+
}>;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.httpAudit = httpAudit;
|
|
4
|
+
const babel_visitor_1 = require("./audit/babel-visitor");
|
|
5
|
+
const module_visitor_1 = require("./module-visitor");
|
|
6
|
+
async function httpAudit(options) {
|
|
7
|
+
let findings = [];
|
|
8
|
+
async function resolveId(specifier, fromFile) {
|
|
9
|
+
return new URL(specifier, fromFile).href;
|
|
10
|
+
}
|
|
11
|
+
async function fetchWithRetry(id, options) {
|
|
12
|
+
var _a;
|
|
13
|
+
let remainingTries = 5;
|
|
14
|
+
let backoffMS = 666;
|
|
15
|
+
for (;;) {
|
|
16
|
+
try {
|
|
17
|
+
return await ((_a = options.fetch) !== null && _a !== void 0 ? _a : globalThis.fetch)(id);
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
if (remainingTries-- > 0) {
|
|
21
|
+
backoffMS *= 1.5;
|
|
22
|
+
await new Promise(r => setTimeout(r, backoffMS));
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async function load(id) {
|
|
28
|
+
let response = await fetchWithRetry(id, options);
|
|
29
|
+
let content = await response.text();
|
|
30
|
+
let type;
|
|
31
|
+
if (response.status !== 200) {
|
|
32
|
+
throw new Error(`oops status code ${response.status} - ${response.statusText} for ${id}: ${content}`);
|
|
33
|
+
}
|
|
34
|
+
switch (response.headers.get('content-type')) {
|
|
35
|
+
case 'text/javascript':
|
|
36
|
+
type = 'javascript';
|
|
37
|
+
break;
|
|
38
|
+
case 'text/html':
|
|
39
|
+
type = 'html';
|
|
40
|
+
break;
|
|
41
|
+
default:
|
|
42
|
+
throw new Error(`oops content type ${response.headers.get('content-type')} for ${id}`);
|
|
43
|
+
}
|
|
44
|
+
return { content, type };
|
|
45
|
+
}
|
|
46
|
+
let modules = await (0, module_visitor_1.visitModules)({
|
|
47
|
+
base: options.appURL,
|
|
48
|
+
entrypoints: options.startingFrom.map(s => new URL(s, options.appURL).href),
|
|
49
|
+
babelConfig: { ast: true },
|
|
50
|
+
frames: new babel_visitor_1.CodeFrameStorage(),
|
|
51
|
+
findings,
|
|
52
|
+
resolveId,
|
|
53
|
+
load,
|
|
54
|
+
});
|
|
55
|
+
return {
|
|
56
|
+
modules,
|
|
57
|
+
findings,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=http-audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-audit.js","sourceRoot":"","sources":["http-audit.ts"],"names":[],"mappings":";;AAUA,8BA2DC;AApED,yDAAyD;AACzD,qDAA+E;AAQxE,KAAK,UAAU,SAAS,CAC7B,OAAyB;IAEzB,IAAI,QAAQ,GAAc,EAAE,CAAC;IAE7B,KAAK,UAAU,SAAS,CAAC,SAAiB,EAAE,QAAgB;QAC1D,OAAO,IAAI,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC;IAC3C,CAAC;IAED,KAAK,UAAU,cAAc,CAAC,EAAU,EAAE,OAAyB;;QACjE,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,IAAI,SAAS,GAAG,GAAG,CAAC;QAEpB,SAAS,CAAC;YACR,IAAI,CAAC;gBACH,OAAO,MAAM,CAAC,MAAA,OAAO,CAAC,KAAK,mCAAI,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YACvD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,cAAc,EAAE,GAAG,CAAC,EAAE,CAAC;oBACzB,SAAS,IAAI,GAAG,CAAC;oBACjB,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;gBACnD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,UAAU,IAAI,CAAC,EAAU;QAC5B,IAAI,QAAQ,GAAG,MAAM,cAAc,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACjD,IAAI,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACpC,IAAI,IAAiB,CAAC;QACtB,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,oBAAoB,QAAQ,CAAC,MAAM,MAAM,QAAQ,CAAC,UAAU,QAAQ,EAAE,KAAK,OAAO,EAAE,CAAC,CAAC;QACxG,CAAC;QACD,QAAQ,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;YAC7C,KAAK,iBAAiB;gBACpB,IAAI,GAAG,YAAY,CAAC;gBACpB,MAAM;YACR,KAAK,WAAW;gBACd,IAAI,GAAG,MAAM,CAAC;gBACd,MAAM;YACR;gBACE,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC3F,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,IAAI,OAAO,GAAG,MAAM,IAAA,6BAAY,EAAC;QAC/B,IAAI,EAAE,OAAO,CAAC,MAAM;QACpB,WAAW,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;QAC3E,WAAW,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE;QAC1B,MAAM,EAAE,IAAI,gCAAgB,EAAE;QAC9B,QAAQ;QACR,SAAS;QACT,IAAI;KACL,CAAC,CAAC;IAEH,OAAO;QACL,OAAO;QACP,QAAQ;KACT,CAAC;AACJ,CAAC","sourcesContent":["import type { Finding } from './audit';\nimport { CodeFrameStorage } from './audit/babel-visitor';\nimport { type Module, visitModules, type ContentType } from './module-visitor';\n\nexport interface HTTPAuditOptions {\n appURL: string;\n startingFrom: string[];\n fetch?: typeof fetch;\n}\n\nexport async function httpAudit(\n options: HTTPAuditOptions\n): Promise<{ modules: { [file: string]: Module }; findings: Finding[] }> {\n let findings: Finding[] = [];\n\n async function resolveId(specifier: string, fromFile: string): Promise<string | undefined> {\n return new URL(specifier, fromFile).href;\n }\n\n async function fetchWithRetry(id: string, options: HTTPAuditOptions) {\n let remainingTries = 5;\n let backoffMS = 666;\n\n for (;;) {\n try {\n return await (options.fetch ?? globalThis.fetch)(id);\n } catch (err) {\n if (remainingTries-- > 0) {\n backoffMS *= 1.5;\n await new Promise(r => setTimeout(r, backoffMS));\n }\n }\n }\n }\n\n async function load(id: string): Promise<{ content: string | Buffer; type: ContentType }> {\n let response = await fetchWithRetry(id, options);\n let content = await response.text();\n let type: ContentType;\n if (response.status !== 200) {\n throw new Error(`oops status code ${response.status} - ${response.statusText} for ${id}: ${content}`);\n }\n switch (response.headers.get('content-type')) {\n case 'text/javascript':\n type = 'javascript';\n break;\n case 'text/html':\n type = 'html';\n break;\n default:\n throw new Error(`oops content type ${response.headers.get('content-type')} for ${id}`);\n }\n return { content, type };\n }\n\n let modules = await visitModules({\n base: options.appURL,\n entrypoints: options.startingFrom.map(s => new URL(s, options.appURL).href),\n babelConfig: { ast: true },\n frames: new CodeFrameStorage(),\n findings,\n resolveId,\n load,\n });\n\n return {\n modules,\n findings,\n };\n}\n"]}
|
package/src/index.d.ts
CHANGED
|
@@ -2,6 +2,6 @@ export { default as App } from './compat-app';
|
|
|
2
2
|
export { default as Addons } from './compat-addons';
|
|
3
3
|
export { default as Options, recommendedOptions } from './options';
|
|
4
4
|
export { default as V1Addon } from './v1-addon';
|
|
5
|
-
export {
|
|
6
|
-
export { default as templateTagCodemod } from './template-tag-codemod';
|
|
5
|
+
export { prebuild, PipelineOptions } from './default-pipeline';
|
|
7
6
|
export { PackageRules, ModuleRules } from './dependency-rules';
|
|
7
|
+
export type { Options as ResolverTransformOptions } from './resolver-transform';
|
package/src/index.js
CHANGED
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
6
|
+
exports.prebuild = exports.V1Addon = exports.recommendedOptions = exports.Addons = exports.App = void 0;
|
|
7
7
|
var compat_app_1 = require("./compat-app");
|
|
8
8
|
Object.defineProperty(exports, "App", { enumerable: true, get: function () { return __importDefault(compat_app_1).default; } });
|
|
9
9
|
var compat_addons_1 = require("./compat-addons");
|
|
@@ -13,7 +13,5 @@ Object.defineProperty(exports, "recommendedOptions", { enumerable: true, get: fu
|
|
|
13
13
|
var v1_addon_1 = require("./v1-addon");
|
|
14
14
|
Object.defineProperty(exports, "V1Addon", { enumerable: true, get: function () { return __importDefault(v1_addon_1).default; } });
|
|
15
15
|
var default_pipeline_1 = require("./default-pipeline");
|
|
16
|
-
Object.defineProperty(exports, "
|
|
17
|
-
var template_tag_codemod_1 = require("./template-tag-codemod");
|
|
18
|
-
Object.defineProperty(exports, "templateTagCodemod", { enumerable: true, get: function () { return __importDefault(template_tag_codemod_1).default; } });
|
|
16
|
+
Object.defineProperty(exports, "prebuild", { enumerable: true, get: function () { return default_pipeline_1.prebuild; } });
|
|
19
17
|
//# sourceMappingURL=index.js.map
|
package/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;;;;AAAA,2CAA8C;AAArC,kHAAA,OAAO,OAAO;AACvB,iDAAoD;AAA3C,wHAAA,OAAO,OAAU;AAC1B,qCAAmE;AAAtC,6GAAA,kBAAkB,OAAA;AAC/C,uCAAgD;AAAvC,oHAAA,OAAO,OAAW;AAC3B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;;;;AAAA,2CAA8C;AAArC,kHAAA,OAAO,OAAO;AACvB,iDAAoD;AAA3C,wHAAA,OAAO,OAAU;AAC1B,qCAAmE;AAAtC,6GAAA,kBAAkB,OAAA;AAC/C,uCAAgD;AAAvC,oHAAA,OAAO,OAAW;AAC3B,uDAA+D;AAAtD,4GAAA,QAAQ,OAAA","sourcesContent":["export { default as App } from './compat-app';\nexport { default as Addons } from './compat-addons';\nexport { default as Options, recommendedOptions } from './options';\nexport { default as V1Addon } from './v1-addon';\nexport { prebuild, PipelineOptions } from './default-pipeline';\nexport { PackageRules, ModuleRules } from './dependency-rules';\nexport type { Options as ResolverTransformOptions } from './resolver-transform';\n"]}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { type CodeFrameStorage, type NamespaceMarker } from './audit/babel-visitor';
|
|
2
|
+
import type { Finding } from './audit';
|
|
3
|
+
import type { TransformOptions } from '@babel/core';
|
|
4
|
+
export type Module = CompleteModule | ParsedModule | UnparseableModule;
|
|
5
|
+
export interface UnparseableModule {
|
|
6
|
+
type: 'unparseable';
|
|
7
|
+
appRelativePath: string;
|
|
8
|
+
consumedFrom: (string | RootMarker)[];
|
|
9
|
+
}
|
|
10
|
+
export interface ParsedModule extends Omit<UnparseableModule, 'type'> {
|
|
11
|
+
type: 'parsed';
|
|
12
|
+
imports: Import[];
|
|
13
|
+
resolutions: {
|
|
14
|
+
[source: string]: string | null;
|
|
15
|
+
};
|
|
16
|
+
content: string;
|
|
17
|
+
isCJS: boolean;
|
|
18
|
+
isAMD: boolean;
|
|
19
|
+
}
|
|
20
|
+
export interface CompleteModule extends Omit<ParsedModule, 'type'> {
|
|
21
|
+
type: 'complete';
|
|
22
|
+
exports: string[];
|
|
23
|
+
}
|
|
24
|
+
export interface Import {
|
|
25
|
+
source: string;
|
|
26
|
+
specifiers: {
|
|
27
|
+
name: string | NamespaceMarker;
|
|
28
|
+
local: string | null;
|
|
29
|
+
codeFrameIndex: number | undefined;
|
|
30
|
+
}[];
|
|
31
|
+
codeFrameIndex: number | undefined;
|
|
32
|
+
}
|
|
33
|
+
interface VisitorParams {
|
|
34
|
+
base: string;
|
|
35
|
+
resolveId: (specifier: string, fromFile: string) => Promise<string | undefined>;
|
|
36
|
+
load: (id: string) => Promise<{
|
|
37
|
+
content: string | Buffer;
|
|
38
|
+
type: ContentType;
|
|
39
|
+
} | undefined>;
|
|
40
|
+
entrypoints: string[];
|
|
41
|
+
debug?: boolean;
|
|
42
|
+
findings: Finding[];
|
|
43
|
+
frames: CodeFrameStorage;
|
|
44
|
+
babelConfig: TransformOptions;
|
|
45
|
+
}
|
|
46
|
+
export declare function visitModules(params: VisitorParams): Promise<Record<string, Module>>;
|
|
47
|
+
export type ContentType = 'javascript' | 'html';
|
|
48
|
+
export interface RootMarker {
|
|
49
|
+
isRoot: true;
|
|
50
|
+
}
|
|
51
|
+
export declare function isRootMarker(value: string | RootMarker | undefined): value is RootMarker;
|
|
52
|
+
export {};
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.visitModules = visitModules;
|
|
7
|
+
exports.isRootMarker = isRootMarker;
|
|
8
|
+
const core_1 = require("@embroider/core");
|
|
9
|
+
const babel_visitor_1 = require("./audit/babel-visitor");
|
|
10
|
+
const fromPairs_1 = __importDefault(require("lodash/fromPairs"));
|
|
11
|
+
const assert_never_1 = __importDefault(require("assert-never"));
|
|
12
|
+
const jsdom_1 = require("jsdom");
|
|
13
|
+
function isResolved(module) {
|
|
14
|
+
return Boolean((module === null || module === void 0 ? void 0 : module.parsed) && module.resolved);
|
|
15
|
+
}
|
|
16
|
+
function isLinked(module) {
|
|
17
|
+
return Boolean((module === null || module === void 0 ? void 0 : module.parsed) && module.resolved && module.linked);
|
|
18
|
+
}
|
|
19
|
+
async function visitModules(params) {
|
|
20
|
+
let visitor = new ModuleVisitor(params);
|
|
21
|
+
return await visitor.run();
|
|
22
|
+
}
|
|
23
|
+
class ModuleVisitor {
|
|
24
|
+
constructor(params) {
|
|
25
|
+
this.params = params;
|
|
26
|
+
this.modules = new Map();
|
|
27
|
+
this.moduleQueue = new Set();
|
|
28
|
+
this.base = params.base;
|
|
29
|
+
this.debugEnabled = Boolean(params.debug);
|
|
30
|
+
this.resolveId = params.resolveId;
|
|
31
|
+
this.load = params.load;
|
|
32
|
+
this.entrypoints = params.entrypoints;
|
|
33
|
+
}
|
|
34
|
+
async run() {
|
|
35
|
+
for (let entry of this.entrypoints) {
|
|
36
|
+
this.scheduleVisit(entry, { isRoot: true });
|
|
37
|
+
}
|
|
38
|
+
await this.drainQueue();
|
|
39
|
+
this.linkModules();
|
|
40
|
+
return this.buildResults();
|
|
41
|
+
}
|
|
42
|
+
async drainQueue() {
|
|
43
|
+
while (this.moduleQueue.size > 0) {
|
|
44
|
+
let id = this.moduleQueue.values().next().value;
|
|
45
|
+
this.moduleQueue.delete(id);
|
|
46
|
+
this.debug('visit', id);
|
|
47
|
+
let loaded = await this.load(id);
|
|
48
|
+
if (Array.isArray(loaded)) {
|
|
49
|
+
for (let finding of loaded) {
|
|
50
|
+
this.params.findings.push(finding);
|
|
51
|
+
}
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
// if the load hook returned undefined we need to just skip it
|
|
55
|
+
if (loaded === undefined) {
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
let { content, type } = loaded;
|
|
59
|
+
let visitor = this.visitorFor(type);
|
|
60
|
+
// cast is safe because the only way to get into the queue is to go
|
|
61
|
+
// through scheduleVisit, and scheduleVisit creates the entry in
|
|
62
|
+
// this.modules.
|
|
63
|
+
let module = this.modules.get(id);
|
|
64
|
+
let visitResult = await visitor.call(this, id, content);
|
|
65
|
+
if (Array.isArray(visitResult)) {
|
|
66
|
+
// the visitor was unable to figure out the ParseFields and returned
|
|
67
|
+
// some number of Findings to us to explain why.
|
|
68
|
+
for (let finding of visitResult) {
|
|
69
|
+
this.params.findings.push(finding);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
module.parsed = visitResult;
|
|
74
|
+
module.resolved = await this.resolveDeps(visitResult.dependencies, id);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
linkModules() {
|
|
79
|
+
for (let module of this.modules.values()) {
|
|
80
|
+
if (isResolved(module)) {
|
|
81
|
+
this.linkModule(module);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
linkModule(module) {
|
|
86
|
+
let exports = new Set();
|
|
87
|
+
for (let exp of module.parsed.exports) {
|
|
88
|
+
if (typeof exp === 'string') {
|
|
89
|
+
exports.add(exp);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
let moduleName = module.resolved.get(exp.all);
|
|
93
|
+
if (!isResolutionFailure(moduleName)) {
|
|
94
|
+
let target = this.modules.get(moduleName);
|
|
95
|
+
if (!isLinked(target) && isResolved(target)) {
|
|
96
|
+
this.linkModule(target);
|
|
97
|
+
}
|
|
98
|
+
if (isLinked(target)) {
|
|
99
|
+
for (let innerExp of target.linked.exports) {
|
|
100
|
+
exports.add(innerExp);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
// our module doesn't successfully enter linked state because it
|
|
105
|
+
// depends on stuff that also couldn't
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
module.linked = {
|
|
112
|
+
exports,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
async resolveDeps(deps, fromFile) {
|
|
116
|
+
let resolved = new Map();
|
|
117
|
+
for (let dep of deps) {
|
|
118
|
+
if (['@embroider/macros'].includes(dep)) {
|
|
119
|
+
// the audit process deliberately removes the @embroider/macros babel
|
|
120
|
+
// plugins, so the imports are still present and should be left alone.
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
let resolution = await this.resolveId(dep, fromFile);
|
|
124
|
+
if (resolution) {
|
|
125
|
+
resolved.set(dep, resolution);
|
|
126
|
+
this.scheduleVisit(resolution, fromFile);
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
resolved.set(dep, { isResolutionFailure: true });
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return resolved;
|
|
135
|
+
}
|
|
136
|
+
scheduleVisit(id, parent) {
|
|
137
|
+
let record = this.modules.get(id);
|
|
138
|
+
if (!record) {
|
|
139
|
+
this.debug(`discovered`, id);
|
|
140
|
+
record = {
|
|
141
|
+
consumedFrom: [parent],
|
|
142
|
+
};
|
|
143
|
+
this.modules.set(id, record);
|
|
144
|
+
this.moduleQueue.add(id);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
record.consumedFrom.push(parent);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
visitorFor(type) {
|
|
151
|
+
switch (type) {
|
|
152
|
+
case 'html':
|
|
153
|
+
return this.visitHTML;
|
|
154
|
+
case 'javascript':
|
|
155
|
+
return this.visitJS;
|
|
156
|
+
default:
|
|
157
|
+
throw (0, assert_never_1.default)(type);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
async visitHTML(_filename, content) {
|
|
161
|
+
let dom = new jsdom_1.JSDOM(content);
|
|
162
|
+
let scripts = dom.window.document.querySelectorAll('script[type="module"]');
|
|
163
|
+
let dependencies = [];
|
|
164
|
+
for (let script of scripts) {
|
|
165
|
+
let src = script.src;
|
|
166
|
+
if (!src) {
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
if (new URL(src, 'http://example.com:4321').origin !== 'http://example.com:4321') {
|
|
170
|
+
// src was absolute, we don't handle it
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
dependencies.push(src);
|
|
174
|
+
}
|
|
175
|
+
return {
|
|
176
|
+
imports: [],
|
|
177
|
+
exports: new Set(),
|
|
178
|
+
isCJS: false,
|
|
179
|
+
isAMD: false,
|
|
180
|
+
dependencies,
|
|
181
|
+
transpiledContent: content,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
async visitJS(filename, content) {
|
|
185
|
+
let rawSource = content.toString('utf8');
|
|
186
|
+
try {
|
|
187
|
+
let result = (0, babel_visitor_1.auditJS)(rawSource, filename, this.params.babelConfig, this.params.frames);
|
|
188
|
+
for (let problem of result.problems) {
|
|
189
|
+
this.params.findings.push({
|
|
190
|
+
filename,
|
|
191
|
+
message: problem.message,
|
|
192
|
+
detail: problem.detail,
|
|
193
|
+
codeFrame: this.params.frames.render(problem.codeFrameIndex),
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
return {
|
|
197
|
+
exports: result.exports,
|
|
198
|
+
imports: result.imports,
|
|
199
|
+
isCJS: result.isCJS,
|
|
200
|
+
isAMD: result.isAMD,
|
|
201
|
+
dependencies: result.imports.map(i => i.source),
|
|
202
|
+
transpiledContent: result.transpiledContent,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
catch (err) {
|
|
206
|
+
if (['BABEL_PARSE_ERROR', 'BABEL_TRANSFORM_ERROR'].includes(err.code)) {
|
|
207
|
+
return [
|
|
208
|
+
{
|
|
209
|
+
filename,
|
|
210
|
+
message: `failed to parse`,
|
|
211
|
+
detail: err.toString().replace(filename, (0, core_1.explicitRelative)(this.base, filename)),
|
|
212
|
+
},
|
|
213
|
+
];
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
throw err;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
debug(message, ...args) {
|
|
221
|
+
if (this.debugEnabled) {
|
|
222
|
+
console.log(message, ...args);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
toPublicModule(filename, module) {
|
|
226
|
+
let result = {
|
|
227
|
+
type: 'unparseable',
|
|
228
|
+
appRelativePath: (0, core_1.explicitRelative)(this.base, filename),
|
|
229
|
+
consumedFrom: module.consumedFrom.map(entry => {
|
|
230
|
+
if (isRootMarker(entry)) {
|
|
231
|
+
return entry;
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
return (0, core_1.explicitRelative)(this.base, entry);
|
|
235
|
+
}
|
|
236
|
+
}),
|
|
237
|
+
};
|
|
238
|
+
if (!module.parsed || !module.resolved) {
|
|
239
|
+
return result;
|
|
240
|
+
}
|
|
241
|
+
let parsedResult = {
|
|
242
|
+
...result,
|
|
243
|
+
type: 'parsed',
|
|
244
|
+
resolutions: (0, fromPairs_1.default)([...module.resolved].map(([source, target]) => [
|
|
245
|
+
source,
|
|
246
|
+
isResolutionFailure(target) ? null : (0, core_1.explicitRelative)(this.base, target),
|
|
247
|
+
])),
|
|
248
|
+
imports: module.parsed.imports.map(i => ({
|
|
249
|
+
source: i.source,
|
|
250
|
+
specifiers: i.specifiers.map(s => ({
|
|
251
|
+
name: s.name,
|
|
252
|
+
local: s.local,
|
|
253
|
+
codeFrameIndex: s.codeFrameIndex,
|
|
254
|
+
})),
|
|
255
|
+
codeFrameIndex: i.codeFrameIndex,
|
|
256
|
+
})),
|
|
257
|
+
content: module.parsed.transpiledContent.toString(),
|
|
258
|
+
isAMD: Boolean(module.parsed.isAMD),
|
|
259
|
+
isCJS: Boolean(module.parsed.isCJS),
|
|
260
|
+
};
|
|
261
|
+
if (!module.linked) {
|
|
262
|
+
return parsedResult;
|
|
263
|
+
}
|
|
264
|
+
return {
|
|
265
|
+
...parsedResult,
|
|
266
|
+
type: 'complete',
|
|
267
|
+
exports: [...module.linked.exports],
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
buildResults() {
|
|
271
|
+
let publicModules = {};
|
|
272
|
+
for (let [filename, module] of this.modules) {
|
|
273
|
+
let publicModule = this.toPublicModule(filename, module);
|
|
274
|
+
publicModules[(0, core_1.explicitRelative)(this.base, filename)] = publicModule;
|
|
275
|
+
}
|
|
276
|
+
return publicModules;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
function isRootMarker(value) {
|
|
280
|
+
return Boolean(value && typeof value !== 'string' && value.isRoot);
|
|
281
|
+
}
|
|
282
|
+
function isResolutionFailure(result) {
|
|
283
|
+
return typeof result === 'object' && 'isResolutionFailure' in result;
|
|
284
|
+
}
|
|
285
|
+
//# sourceMappingURL=module-visitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module-visitor.js","sourceRoot":"","sources":["module-visitor.ts"],"names":[],"mappings":"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","sourcesContent":["import { explicitRelative } from '@embroider/core';\nimport {\n type CodeFrameStorage,\n auditJS,\n type ExportAll,\n type InternalImport,\n type NamespaceMarker,\n} from './audit/babel-visitor';\nimport fromPairs from 'lodash/fromPairs';\nimport assertNever from 'assert-never';\nimport { JSDOM } from 'jsdom';\n\nimport type { Finding } from './audit';\nimport type { TransformOptions } from '@babel/core';\n\nexport type Module = CompleteModule | ParsedModule | UnparseableModule;\n\nexport interface UnparseableModule {\n type: 'unparseable';\n appRelativePath: string;\n consumedFrom: (string | RootMarker)[];\n}\n\nexport interface ParsedModule extends Omit<UnparseableModule, 'type'> {\n type: 'parsed';\n imports: Import[];\n resolutions: { [source: string]: string | null };\n content: string;\n isCJS: boolean;\n isAMD: boolean;\n}\n\nexport interface CompleteModule extends Omit<ParsedModule, 'type'> {\n type: 'complete';\n exports: string[];\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 transpiledContent: string | Buffer;\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 codeFrameIndex: number | undefined;\n }[];\n codeFrameIndex: number | undefined;\n}\n\ninterface VisitorParams {\n base: string;\n resolveId: (specifier: string, fromFile: string) => Promise<string | undefined>;\n load: (id: string) => Promise<{ content: string | Buffer; type: ContentType } | undefined>;\n entrypoints: string[];\n debug?: boolean;\n\n findings: Finding[];\n frames: CodeFrameStorage;\n babelConfig: TransformOptions;\n}\n\nexport async function visitModules(params: VisitorParams): Promise<Record<string, Module>> {\n let visitor = new ModuleVisitor(params);\n return await visitor.run();\n}\n\nexport type ContentType = 'javascript' | 'html';\n\nclass ModuleVisitor {\n private modules: Map<string, InternalModule> = new Map();\n\n private moduleQueue = new Set<string>();\n private base: string;\n private debugEnabled: boolean;\n private resolveId: (specifier: string, fromFile: string) => Promise<string | undefined>;\n private load: (id: string) => Promise<{ content: string | Buffer; type: ContentType } | undefined>;\n private entrypoints: string[];\n\n constructor(private params: VisitorParams) {\n this.base = params.base;\n this.debugEnabled = Boolean(params.debug);\n this.resolveId = params.resolveId;\n this.load = params.load;\n this.entrypoints = params.entrypoints;\n }\n\n async run(): Promise<Record<string, Module>> {\n for (let entry of this.entrypoints) {\n this.scheduleVisit(entry, { isRoot: true });\n }\n await this.drainQueue();\n this.linkModules();\n return this.buildResults();\n }\n\n private async drainQueue() {\n while (this.moduleQueue.size > 0) {\n let id = this.moduleQueue.values().next().value as string;\n this.moduleQueue.delete(id);\n this.debug('visit', id);\n let loaded = await this.load(id);\n if (Array.isArray(loaded)) {\n for (let finding of loaded) {\n this.params.findings.push(finding);\n }\n continue;\n }\n // if the load hook returned undefined we need to just skip it\n if (loaded === undefined) {\n continue;\n }\n let { content, type } = loaded;\n\n let visitor = this.visitorFor(type);\n\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(id)!;\n let visitResult = await visitor.call(this, id, 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.params.findings.push(finding);\n }\n } else {\n module.parsed = visitResult;\n module.resolved = await this.resolveDeps(visitResult.dependencies, id);\n }\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 async resolveDeps(deps: string[], fromFile: string): Promise<InternalModule['resolved']> {\n let resolved = new Map() as NonNullable<InternalModule['resolved']>;\n for (let dep of deps) {\n if (['@embroider/macros'].includes(dep)) {\n // the audit process deliberately removes the @embroider/macros babel\n // plugins, so the imports are still present and should be left alone.\n continue;\n }\n\n let resolution = await this.resolveId(dep, fromFile);\n if (resolution) {\n resolved.set(dep, resolution);\n this.scheduleVisit(resolution, fromFile);\n continue;\n } else {\n resolved.set(dep, { isResolutionFailure: true as true });\n continue;\n }\n }\n return resolved;\n }\n\n private scheduleVisit(id: string, parent: string | RootMarker) {\n let record = this.modules.get(id);\n if (!record) {\n this.debug(`discovered`, id);\n record = {\n consumedFrom: [parent],\n };\n this.modules.set(id, record);\n this.moduleQueue.add(id);\n } else {\n record.consumedFrom.push(parent);\n }\n }\n\n private visitorFor(\n type: ContentType\n ): (\n this: ModuleVisitor,\n filename: string,\n content: Buffer | string\n ) => Promise<NonNullable<InternalModule['parsed'] | Finding[]>> {\n switch (type) {\n case 'html':\n return this.visitHTML;\n case 'javascript':\n return this.visitJS;\n default:\n throw assertNever(type);\n }\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 dependencies.push(src);\n }\n\n return {\n imports: [],\n exports: new Set(),\n isCJS: false,\n isAMD: false,\n dependencies,\n transpiledContent: content,\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.params.babelConfig, this.params.frames);\n\n for (let problem of result.problems) {\n this.params.findings.push({\n filename,\n message: problem.message,\n detail: problem.detail,\n codeFrame: this.params.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 transpiledContent: result.transpiledContent,\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.base, filename)),\n },\n ];\n } else {\n throw err;\n }\n }\n }\n\n private debug(message: string, ...args: any[]) {\n if (this.debugEnabled) {\n console.log(message, ...args);\n }\n }\n\n private toPublicModule(filename: string, module: InternalModule): Module {\n let result: UnparseableModule = {\n type: 'unparseable',\n appRelativePath: explicitRelative(this.base, filename),\n consumedFrom: module.consumedFrom.map(entry => {\n if (isRootMarker(entry)) {\n return entry;\n } else {\n return explicitRelative(this.base, entry);\n }\n }),\n };\n\n if (!module.parsed || !module.resolved) {\n return result;\n }\n\n let parsedResult: ParsedModule = {\n ...result,\n type: 'parsed',\n resolutions: fromPairs(\n [...module.resolved].map(([source, target]) => [\n source,\n isResolutionFailure(target) ? null : explicitRelative(this.base, target),\n ])\n ),\n imports: module.parsed.imports.map(i => ({\n source: i.source,\n specifiers: i.specifiers.map(s => ({\n name: s.name,\n local: s.local,\n codeFrameIndex: s.codeFrameIndex,\n })),\n codeFrameIndex: i.codeFrameIndex,\n })),\n content: module.parsed.transpiledContent.toString(),\n isAMD: Boolean(module.parsed.isAMD),\n isCJS: Boolean(module.parsed.isCJS),\n };\n\n if (!module.linked) {\n return parsedResult;\n }\n\n return {\n ...parsedResult,\n type: 'complete',\n exports: [...module.linked.exports],\n };\n }\n\n private buildResults() {\n let publicModules: Record<string, Module> = {};\n for (let [filename, module] of this.modules) {\n let publicModule = this.toPublicModule(filename, module);\n publicModules[explicitRelative(this.base, filename)] = publicModule;\n }\n return publicModules;\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\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"]}
|
package/src/options.d.ts
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import type { V1AddonConstructor } from './v1-addon';
|
|
2
|
-
import type { Node } from 'broccoli-node-api';
|
|
3
2
|
import type { Options as CoreOptions } from '@embroider/core';
|
|
4
3
|
import type { PackageRules } from './dependency-rules';
|
|
5
4
|
export default interface Options extends CoreOptions {
|
|
6
5
|
staticAddonTrees?: boolean;
|
|
7
6
|
staticAddonTestSupportTrees?: boolean;
|
|
8
|
-
staticEmberSource?: boolean;
|
|
9
7
|
compatAdapters?: Map<string, V1AddonConstructor | null>;
|
|
10
|
-
extraPublicTrees?: Node[];
|
|
11
8
|
packageRules?: PackageRules[];
|
|
12
9
|
allowUnsafeDynamicComponents?: boolean;
|
|
10
|
+
availableContentForTypes?: string[];
|
|
11
|
+
useAddonAppBoot?: boolean;
|
|
12
|
+
useAddonConfigModule?: boolean;
|
|
13
13
|
}
|
|
14
14
|
export type CompatOptionsType = Required<Omit<Options, 'staticHelpers' | 'staticModifiers' | 'staticComponents' | 'staticInvokables'>> & Pick<Options, 'staticHelpers' | 'staticModifiers' | 'staticComponents' | 'staticInvokables'>;
|
|
15
15
|
export declare function optionsWithDefaults(options?: Options): CompatOptionsType;
|
package/src/options.js
CHANGED
|
@@ -6,12 +6,14 @@ const core_1 = require("@embroider/core");
|
|
|
6
6
|
const defaults = Object.assign((0, core_1.optionsWithDefaults)(), {
|
|
7
7
|
staticAddonTrees: false,
|
|
8
8
|
staticAddonTestSupportTrees: false,
|
|
9
|
-
staticEmberSource: false,
|
|
10
9
|
compatAdapters: new Map(),
|
|
11
10
|
extraPublicTrees: [],
|
|
12
11
|
workspaceDir: null,
|
|
13
12
|
packageRules: [],
|
|
14
13
|
allowUnsafeDynamicComponents: false,
|
|
14
|
+
availableContentForTypes: [],
|
|
15
|
+
useAddonAppBoot: true,
|
|
16
|
+
useAddonConfigModule: true,
|
|
15
17
|
});
|
|
16
18
|
function optionsWithDefaults(options) {
|
|
17
19
|
return Object.assign({}, defaults, options);
|
|
@@ -25,7 +27,6 @@ exports.recommendedOptions = Object.freeze({
|
|
|
25
27
|
optimized: Object.freeze({
|
|
26
28
|
staticAddonTrees: true,
|
|
27
29
|
staticAddonTestSupportTrees: true,
|
|
28
|
-
staticEmberSource: true,
|
|
29
30
|
allowUnsafeDynamicComponents: false,
|
|
30
31
|
staticInvokables: true,
|
|
31
32
|
}),
|