@embroider/compat 3.5.6-unstable.26f34c4 → 3.5.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/package.json +6 -6
  2. package/src/audit/babel-visitor.js +1 -7
  3. package/src/audit/babel-visitor.js.map +1 -1
  4. package/src/audit.d.ts +53 -6
  5. package/src/audit.js +276 -92
  6. package/src/audit.js.map +1 -1
  7. package/src/babel-plugin-adjust-imports.js +1 -1
  8. package/src/babel-plugin-adjust-imports.js.map +1 -1
  9. package/src/compat-adapters/@ember-data/debug.d.ts +6 -0
  10. package/src/compat-adapters/@ember-data/debug.js +22 -0
  11. package/src/compat-adapters/@ember-data/debug.js.map +1 -0
  12. package/src/compat-adapters/@ember-data/store.d.ts +5 -1
  13. package/src/compat-adapters/@ember-data/store.js +15 -3
  14. package/src/compat-adapters/@ember-data/store.js.map +1 -1
  15. package/src/compat-addons.js +1 -1
  16. package/src/compat-addons.js.map +1 -1
  17. package/src/compat-app-builder.d.ts +31 -9
  18. package/src/compat-app-builder.js +856 -101
  19. package/src/compat-app-builder.js.map +1 -1
  20. package/src/compat-app.d.ts +10 -2
  21. package/src/compat-app.js +73 -52
  22. package/src/compat-app.js.map +1 -1
  23. package/src/default-pipeline.d.ts +2 -2
  24. package/src/default-pipeline.js +0 -21
  25. package/src/default-pipeline.js.map +1 -1
  26. package/src/empty-package-tree.js +6 -0
  27. package/src/empty-package-tree.js.map +1 -1
  28. package/src/index.d.ts +1 -1
  29. package/src/index.js +1 -2
  30. package/src/index.js.map +1 -1
  31. package/src/options.d.ts +0 -2
  32. package/src/options.js +0 -2
  33. package/src/options.js.map +1 -1
  34. package/src/resolver-transform.js +0 -3
  35. package/src/resolver-transform.js.map +1 -1
  36. package/src/standalone-addon-build.js +4 -4
  37. package/src/standalone-addon-build.js.map +1 -1
  38. package/src/v1-appboot.d.ts +14 -0
  39. package/src/v1-appboot.js +47 -0
  40. package/src/v1-appboot.js.map +1 -0
  41. package/src/v1-config.d.ts +8 -0
  42. package/src/v1-config.js +51 -1
  43. package/src/v1-config.js.map +1 -1
  44. package/src/compat-adapters/ember-fetch.d.ts +0 -5
  45. package/src/compat-adapters/ember-fetch.js +0 -19
  46. package/src/compat-adapters/ember-fetch.js.map +0 -1
  47. package/src/content-for-config.d.ts +0 -11
  48. package/src/content-for-config.js +0 -66
  49. package/src/content-for-config.js.map +0 -1
  50. package/src/http-audit.d.ts +0 -13
  51. package/src/http-audit.js +0 -45
  52. package/src/http-audit.js.map +0 -1
  53. package/src/module-visitor.d.ts +0 -52
  54. package/src/module-visitor.js +0 -285
  55. package/src/module-visitor.js.map +0 -1
package/src/v1-config.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.V1Config = void 0;
6
+ exports.WriteV1Config = exports.V1Config = void 0;
7
7
  const broccoli_plugin_1 = __importDefault(require("broccoli-plugin"));
8
8
  const path_1 = require("path");
9
9
  const fs_extra_1 = require("fs-extra");
@@ -23,4 +23,54 @@ class V1Config extends broccoli_plugin_1.default {
23
23
  }
24
24
  }
25
25
  exports.V1Config = V1Config;
26
+ class WriteV1Config extends broccoli_plugin_1.default {
27
+ constructor(inputTree, storeConfigInMeta, testInputTree) {
28
+ super([inputTree, testInputTree].filter(Boolean), {
29
+ persistentOutput: true,
30
+ needsCache: false,
31
+ });
32
+ this.inputTree = inputTree;
33
+ this.storeConfigInMeta = storeConfigInMeta;
34
+ this.testInputTree = testInputTree;
35
+ }
36
+ build() {
37
+ let filename = (0, path_1.join)(this.outputPath, 'config/environment.js');
38
+ let contents;
39
+ if (this.storeConfigInMeta) {
40
+ contents = metaLoader();
41
+ }
42
+ else {
43
+ if (this.testInputTree) {
44
+ contents = `
45
+ import { isTesting } from '@embroider/macros';
46
+ let env;
47
+ if (isTesting()) {
48
+ env = ${JSON.stringify(this.testInputTree.readConfig())};
49
+ } else {
50
+ env = ${JSON.stringify(this.inputTree.readConfig())};
51
+ }
52
+ export default env;
53
+ `;
54
+ }
55
+ else {
56
+ contents = `export default ${JSON.stringify(this.inputTree.readConfig())};`;
57
+ }
58
+ }
59
+ if (!this.lastContents || this.lastContents !== contents) {
60
+ (0, fs_extra_1.outputFileSync)(filename, contents);
61
+ }
62
+ this.lastContents = contents;
63
+ }
64
+ }
65
+ exports.WriteV1Config = WriteV1Config;
66
+ function metaLoader() {
67
+ // Supporting config content as JS Module.
68
+ // Wrapping the content with immediate invoked function as
69
+ // replaced content for config-module was meant to support AMD module.
70
+ return `
71
+ export default (function() {
72
+ {{content-for 'config-module'}}
73
+ })().default;
74
+ `;
75
+ }
26
76
  //# sourceMappingURL=v1-config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"v1-config.js","sourceRoot":"","sources":["v1-config.ts"],"names":[],"mappings":";;;;;;AAAA,sEAAqC;AAErC,+BAA4B;AAC5B,uCAAwC;AAUxC,MAAa,QAAS,SAAQ,yBAAM;IAElC,YAAY,UAAgB,EAAU,GAAW;QAC/C,KAAK,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;QADY,QAAG,GAAH,GAAG,CAAQ;IAEjD,CAAC;IACD,KAAK;QACH,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,uBAAY,EAAC,IAAA,WAAI,EAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IACnH,CAAC;IACD,UAAU;QACR,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;CACF;AAdD,4BAcC","sourcesContent":["import Plugin from 'broccoli-plugin';\nimport type { Node } from 'broccoli-node-api';\nimport { join } from 'path';\nimport { readFileSync } from 'fs-extra';\n\nexport interface ConfigContents {\n modulePrefix: string;\n podModulePrefix?: string;\n EmberENV: unknown;\n APP: unknown;\n rootURL: string;\n}\n\nexport class V1Config extends Plugin {\n private lastConfig: ConfigContents | undefined;\n constructor(configTree: Node, private env: string) {\n super([configTree], {});\n }\n build() {\n this.lastConfig = JSON.parse(readFileSync(join(this.inputPaths[0], 'environments', `${this.env}.json`), 'utf8'));\n }\n readConfig() {\n if (!this.lastConfig) {\n throw new Error(`V1Config not available until after the build`);\n }\n return this.lastConfig;\n }\n}\n"]}
1
+ {"version":3,"file":"v1-config.js","sourceRoot":"","sources":["v1-config.ts"],"names":[],"mappings":";;;;;;AAAA,sEAAqC;AAErC,+BAA4B;AAC5B,uCAAwD;AAUxD,MAAa,QAAS,SAAQ,yBAAM;IAElC,YAAY,UAAgB,EAAU,GAAW;QAC/C,KAAK,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;QADY,QAAG,GAAH,GAAG,CAAQ;IAEjD,CAAC;IACD,KAAK;QACH,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,uBAAY,EAAC,IAAA,WAAI,EAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IACnH,CAAC;IACD,UAAU;QACR,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;CACF;AAdD,4BAcC;AAED,MAAa,aAAc,SAAQ,yBAAM;IAEvC,YAAoB,SAAmB,EAAU,iBAA0B,EAAU,aAAwB;QAC3G,KAAK,CAAC,CAAC,SAAS,EAAE,aAAyB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;YAC5D,gBAAgB,EAAE,IAAI;YACtB,UAAU,EAAE,KAAK;SAClB,CAAC,CAAC;QAJe,cAAS,GAAT,SAAS,CAAU;QAAU,sBAAiB,GAAjB,iBAAiB,CAAS;QAAU,kBAAa,GAAb,aAAa,CAAW;IAK7G,CAAC;IACD,KAAK;QACH,IAAI,QAAQ,GAAG,IAAA,WAAI,EAAC,IAAI,CAAC,UAAU,EAAE,uBAAuB,CAAC,CAAC;QAC9D,IAAI,QAAQ,CAAC;QACb,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,QAAQ,GAAG,UAAU,EAAE,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACvB,QAAQ,GAAG;;;;kBAID,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC;;kBAE/C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;;;SAGpD,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,QAAQ,GAAG,kBAAkB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC;YAC9E,CAAC;QACH,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;YACzD,IAAA,yBAAc,EAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACrC,CAAC;QACD,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC;IAC/B,CAAC;CACF;AAlCD,sCAkCC;AAED,SAAS,UAAU;IACjB,0CAA0C;IAC1C,0DAA0D;IAC1D,sEAAsE;IACtE,OAAO;;;;GAIN,CAAC;AACJ,CAAC","sourcesContent":["import Plugin from 'broccoli-plugin';\nimport type { Node } from 'broccoli-node-api';\nimport { join } from 'path';\nimport { readFileSync, outputFileSync } from 'fs-extra';\n\nexport interface ConfigContents {\n modulePrefix: string;\n podModulePrefix?: string;\n EmberENV: unknown;\n APP: unknown;\n rootURL: string;\n}\n\nexport class V1Config extends Plugin {\n private lastConfig: ConfigContents | undefined;\n constructor(configTree: Node, private env: string) {\n super([configTree], {});\n }\n build() {\n this.lastConfig = JSON.parse(readFileSync(join(this.inputPaths[0], 'environments', `${this.env}.json`), 'utf8'));\n }\n readConfig() {\n if (!this.lastConfig) {\n throw new Error(`V1Config not available until after the build`);\n }\n return this.lastConfig;\n }\n}\n\nexport class WriteV1Config extends Plugin {\n private lastContents: string | undefined;\n constructor(private inputTree: V1Config, private storeConfigInMeta: boolean, private testInputTree?: V1Config) {\n super([inputTree, testInputTree as V1Config].filter(Boolean), {\n persistentOutput: true,\n needsCache: false,\n });\n }\n build() {\n let filename = join(this.outputPath, 'config/environment.js');\n let contents;\n if (this.storeConfigInMeta) {\n contents = metaLoader();\n } else {\n if (this.testInputTree) {\n contents = `\n import { isTesting } from '@embroider/macros';\n let env;\n if (isTesting()) {\n env = ${JSON.stringify(this.testInputTree.readConfig())};\n } else {\n env = ${JSON.stringify(this.inputTree.readConfig())};\n }\n export default env;\n `;\n } else {\n contents = `export default ${JSON.stringify(this.inputTree.readConfig())};`;\n }\n }\n if (!this.lastContents || this.lastContents !== contents) {\n outputFileSync(filename, contents);\n }\n this.lastContents = contents;\n }\n}\n\nfunction metaLoader() {\n // Supporting config content as JS Module.\n // Wrapping the content with immediate invoked function as\n // replaced content for config-module was meant to support AMD module.\n return `\n export default (function() {\n {{content-for 'config-module'}}\n })().default;\n `;\n}\n"]}
@@ -1,5 +0,0 @@
1
- import V1Addon from '../v1-addon';
2
- import type { AddonMeta } from '@embroider/core';
3
- export default class extends V1Addon {
4
- get packageMeta(): Partial<AddonMeta>;
5
- }
@@ -1,19 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const v1_addon_1 = __importDefault(require("../v1-addon"));
7
- class default_1 extends v1_addon_1.default {
8
- get packageMeta() {
9
- let meta = super.packageMeta;
10
- // this file is not accessible from the outside of ember-fetch and is not being used inside ember-fetch so it's dead code
11
- // but it is importing `@ember/polyfills` which casues ember-source@5 to crash because it has been removed
12
- if (meta['implicit-modules']) {
13
- meta['implicit-modules'] = meta['implicit-modules'].filter(mod => mod !== './utils/mung-options-for-fetch');
14
- }
15
- return meta;
16
- }
17
- }
18
- exports.default = default_1;
19
- //# sourceMappingURL=ember-fetch.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ember-fetch.js","sourceRoot":"","sources":["ember-fetch.ts"],"names":[],"mappings":";;;;;AAAA,2DAAkC;AAGlC,eAAqB,SAAQ,kBAAO;IAClC,IAAI,WAAW;QACb,IAAI,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC;QAE7B,yHAAyH;QACzH,0GAA0G;QAC1G,IAAI,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,kBAAkB,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,gCAAgC,CAAC,CAAC;QAC9G,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAZD,4BAYC","sourcesContent":["import V1Addon from '../v1-addon';\nimport type { AddonMeta } from '@embroider/core';\n\nexport default class extends V1Addon {\n get packageMeta(): Partial<AddonMeta> {\n let meta = super.packageMeta;\n\n // this file is not accessible from the outside of ember-fetch and is not being used inside ember-fetch so it's dead code\n // but it is importing `@ember/polyfills` which casues ember-source@5 to crash because it has been removed\n if (meta['implicit-modules']) {\n meta['implicit-modules'] = meta['implicit-modules'].filter(mod => mod !== './utils/mung-options-for-fetch');\n }\n\n return meta;\n }\n}\n"]}
@@ -1,11 +0,0 @@
1
- import Plugin from 'broccoli-plugin';
2
- import type { Node } from 'broccoli-node-api';
3
- export default class ContentForConfig extends Plugin {
4
- private options;
5
- private contentFor;
6
- private defaultContentForTypes;
7
- constructor(configTree: Node, options: any);
8
- readContents(): any;
9
- build(): void;
10
- getAppConfig(): any;
11
- }
@@ -1,66 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const broccoli_plugin_1 = __importDefault(require("broccoli-plugin"));
7
- const fs_extra_1 = require("fs-extra");
8
- const path_1 = require("path");
9
- class ContentForConfig extends broccoli_plugin_1.default {
10
- constructor(configTree, options) {
11
- super([configTree], {
12
- annotation: 'embroider:content-for-config',
13
- persistentOutput: true,
14
- needsCache: false,
15
- });
16
- this.options = options;
17
- this.defaultContentForTypes = [
18
- 'head',
19
- 'test-head',
20
- 'head-footer',
21
- 'test-head-footer',
22
- 'body',
23
- 'test-body',
24
- 'body-footer',
25
- 'test-body-footer',
26
- 'config-module',
27
- 'app-boot',
28
- ];
29
- }
30
- readContents() {
31
- if (!this.contentFor) {
32
- throw new Error(`ContentForConfig not available until after the build`);
33
- }
34
- return this.contentFor;
35
- }
36
- build() {
37
- var _a;
38
- if (!this.contentFor)
39
- this.contentFor = {};
40
- const availableContentForTypes = (_a = this.options.availableContentForTypes) !== null && _a !== void 0 ? _a : [];
41
- const extendedContentTypes = new Set([...this.defaultContentForTypes, ...availableContentForTypes]);
42
- let appConfig = this.getAppConfig();
43
- appConfig.forEach((configPath) => {
44
- extendedContentTypes.forEach(contentType => {
45
- const matchExp = this.options.pattern.match;
46
- if (!this.contentFor[configPath.file])
47
- this.contentFor[configPath.file] = {};
48
- if (!this.contentFor[configPath.file][contentType]) {
49
- let contents = this.options.pattern.replacement.call(null, configPath.json, matchExp, contentType);
50
- this.contentFor[configPath.file][contentType] = contents;
51
- }
52
- });
53
- });
54
- }
55
- getAppConfig() {
56
- return this.options.configPaths.map((configPath) => {
57
- let config = (0, fs_extra_1.readFileSync)((0, path_1.join)(this.inputPaths[0], configPath.path), { encoding: 'utf8' });
58
- return {
59
- file: configPath.file,
60
- json: JSON.parse(config),
61
- };
62
- });
63
- }
64
- }
65
- exports.default = ContentForConfig;
66
- //# sourceMappingURL=content-for-config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"content-for-config.js","sourceRoot":"","sources":["content-for-config.ts"],"names":[],"mappings":";;;;;AAAA,sEAAqC;AAErC,uCAAwC;AACxC,+BAA4B;AAE5B,MAAqB,gBAAiB,SAAQ,yBAAM;IAmBlD,YAAY,UAAgB,EAAU,OAAY;QAChD,KAAK,CAAC,CAAC,UAAU,CAAC,EAAE;YAClB,UAAU,EAAE,8BAA8B;YAC1C,gBAAgB,EAAE,IAAI;YACtB,UAAU,EAAE,KAAK;SAClB,CAAC,CAAC;QALiC,YAAO,GAAP,OAAO,CAAK;QAb1C,2BAAsB,GAAG;YAC/B,MAAM;YACN,WAAW;YACX,aAAa;YACb,kBAAkB;YAClB,MAAM;YACN,WAAW;YACX,aAAa;YACb,kBAAkB;YAClB,eAAe;YACf,UAAU;SACX,CAAC;IAQF,CAAC;IAED,YAAY;QACV,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,KAAK;;QACH,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QAC3C,MAAM,wBAAwB,GAAG,MAAA,IAAI,CAAC,OAAO,CAAC,wBAAwB,mCAAI,EAAE,CAAC;QAC7E,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,sBAAsB,EAAE,GAAG,wBAAwB,CAAC,CAAC,CAAC;QAEpG,IAAI,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACpC,SAAS,CAAC,OAAO,CAAC,CAAC,UAAuC,EAAE,EAAE;YAC5D,oBAAoB,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;gBACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;gBAC5C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC;oBAAE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC7E,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC;oBACnD,IAAI,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;oBACnG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,GAAG,QAAQ,CAAC;gBAC3D,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,UAA0C,EAAE,EAAE;YACjF,IAAI,MAAM,GAAG,IAAA,uBAAY,EAAC,IAAA,WAAI,EAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;YAC3F,OAAO;gBACL,IAAI,EAAE,UAAU,CAAC,IAAI;gBACrB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;aACzB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AA7DD,mCA6DC","sourcesContent":["import Plugin from 'broccoli-plugin';\nimport type { Node } from 'broccoli-node-api';\nimport { readFileSync } from 'fs-extra';\nimport { join } from 'path';\n\nexport default class ContentForConfig extends Plugin {\n // The object keys are the content types and each value is the HTML\n // code that should replace the corresponding {{content-for}}\n // Example: { body: '<p>This snippet replaces content-for \\\"body\\\" in the app index.html</p>' }\n private contentFor: any;\n\n private defaultContentForTypes = [\n 'head',\n 'test-head',\n 'head-footer',\n 'test-head-footer',\n 'body',\n 'test-body',\n 'body-footer',\n 'test-body-footer',\n 'config-module',\n 'app-boot',\n ];\n\n constructor(configTree: Node, private options: any) {\n super([configTree], {\n annotation: 'embroider:content-for-config',\n persistentOutput: true,\n needsCache: false,\n });\n }\n\n readContents() {\n if (!this.contentFor) {\n throw new Error(`ContentForConfig not available until after the build`);\n }\n return this.contentFor;\n }\n\n build() {\n if (!this.contentFor) this.contentFor = {};\n const availableContentForTypes = this.options.availableContentForTypes ?? [];\n const extendedContentTypes = new Set([...this.defaultContentForTypes, ...availableContentForTypes]);\n\n let appConfig = this.getAppConfig();\n appConfig.forEach((configPath: { file: string; json: any }) => {\n extendedContentTypes.forEach(contentType => {\n const matchExp = this.options.pattern.match;\n if (!this.contentFor[configPath.file]) this.contentFor[configPath.file] = {};\n if (!this.contentFor[configPath.file][contentType]) {\n let contents = this.options.pattern.replacement.call(null, configPath.json, matchExp, contentType);\n this.contentFor[configPath.file][contentType] = contents;\n }\n });\n });\n }\n\n getAppConfig() {\n return this.options.configPaths.map((configPath: { file: string; path: string }) => {\n let config = readFileSync(join(this.inputPaths[0], configPath.path), { encoding: 'utf8' });\n return {\n file: configPath.file,\n json: JSON.parse(config),\n };\n });\n }\n}\n"]}
@@ -1,13 +0,0 @@
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
- }>;
package/src/http-audit.js DELETED
@@ -1,45 +0,0 @@
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 load(id) {
12
- var _a;
13
- let response = await ((_a = options.fetch) !== null && _a !== void 0 ? _a : globalThis.fetch)(id);
14
- let content = await response.text();
15
- let type;
16
- if (response.status !== 200) {
17
- throw new Error(`oops status code ${response.status} - ${response.statusText} for ${id}: ${content}`);
18
- }
19
- switch (response.headers.get('content-type')) {
20
- case 'text/javascript':
21
- type = 'javascript';
22
- break;
23
- case 'text/html':
24
- type = 'html';
25
- break;
26
- default:
27
- throw new Error(`oops content type ${response.headers.get('content-type')} for ${id}`);
28
- }
29
- return { content, type };
30
- }
31
- let modules = await (0, module_visitor_1.visitModules)({
32
- base: options.appURL,
33
- entrypoints: options.startingFrom.map(s => new URL(s, options.appURL).href),
34
- babelConfig: { ast: true },
35
- frames: new babel_visitor_1.CodeFrameStorage(),
36
- findings,
37
- resolveId,
38
- load,
39
- });
40
- return {
41
- modules,
42
- findings,
43
- };
44
- }
45
- //# sourceMappingURL=http-audit.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"http-audit.js","sourceRoot":"","sources":["http-audit.ts"],"names":[],"mappings":";;AAUA,8BA2CC;AApDD,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,IAAI,CAAC,EAAU;;QAC5B,IAAI,QAAQ,GAAG,MAAM,CAAC,MAAA,OAAO,CAAC,KAAK,mCAAI,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAC7D,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 load(id: string): Promise<{ content: string | Buffer; type: ContentType }> {\n let response = await (options.fetch ?? globalThis.fetch)(id);\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"]}
@@ -1,52 +0,0 @@
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 {};
@@ -1,285 +0,0 @@
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
@@ -1 +0,0 @@
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"]}