adnbn 0.7.1 → 0.9.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/dist/cli/builders/locale/LocaleStructureValidator.js +7 -0
- package/dist/cli/builders/locale/LocaleStructureValidator.js.map +1 -1
- package/dist/cli/bundler/plugins/GenerateJsonPlugin.js +3 -7
- package/dist/cli/bundler/plugins/GenerateJsonPlugin.js.map +1 -1
- package/dist/cli/entrypoint/file/injectors/core.js +9 -1
- package/dist/cli/entrypoint/file/injectors/core.js.map +1 -1
- package/dist/cli/entrypoint/finder/AbstractAssetFinder.js +22 -11
- package/dist/cli/entrypoint/finder/AbstractAssetFinder.js.map +1 -1
- package/dist/cli/entrypoint/finder/AbstractEntrypointFinder.js +7 -0
- package/dist/cli/entrypoint/finder/AbstractEntrypointFinder.js.map +1 -1
- package/dist/cli/entrypoint/finder/AbstractFinder.d.ts +0 -2
- package/dist/cli/entrypoint/finder/AbstractFinder.js +5 -25
- package/dist/cli/entrypoint/finder/AbstractFinder.js.map +1 -1
- package/dist/cli/entrypoint/finder/AbstractViewFinder.js +3 -4
- package/dist/cli/entrypoint/finder/AbstractViewFinder.js.map +1 -1
- package/dist/cli/entrypoint/finder/AssetPluginFinder.js +14 -1
- package/dist/cli/entrypoint/finder/AssetPluginFinder.js.map +1 -1
- package/dist/cli/entrypoint/finder/LocaleFinder.d.ts +2 -0
- package/dist/cli/entrypoint/finder/LocaleFinder.js +27 -0
- package/dist/cli/entrypoint/finder/LocaleFinder.js.map +1 -1
- package/dist/cli/entrypoint/finder/PluginFinder.js +12 -3
- package/dist/cli/entrypoint/finder/PluginFinder.js.map +1 -1
- package/dist/cli/entrypoint/finder/ViewCspFinder.d.ts +2 -0
- package/dist/cli/entrypoint/finder/ViewCspFinder.js +13 -6
- package/dist/cli/entrypoint/finder/ViewCspFinder.js.map +1 -1
- package/dist/cli/entrypoint/finder/utils/filePrecedence.d.ts +35 -0
- package/dist/cli/entrypoint/finder/utils/filePrecedence.js +64 -0
- package/dist/cli/entrypoint/finder/utils/filePrecedence.js.map +1 -0
- package/dist/cli/entrypoint/parser/ContentParser.d.ts +2 -2
- package/dist/cli/entrypoint/parser/ContentParser.js.map +1 -1
- package/dist/cli/entrypoint/parser/RelayParser.js +2 -1
- package/dist/cli/entrypoint/parser/RelayParser.js.map +1 -1
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/plugins/content/ContentDriver.d.ts +21 -8
- package/dist/cli/plugins/content/ContentDriver.js +24 -2
- package/dist/cli/plugins/content/ContentDriver.js.map +1 -1
- package/dist/cli/plugins/content/ContentManager.d.ts +8 -3
- package/dist/cli/plugins/content/ContentManager.js +41 -6
- package/dist/cli/plugins/content/ContentManager.js.map +1 -1
- package/dist/cli/plugins/content/Relay.d.ts +6 -8
- package/dist/cli/plugins/content/Relay.js +2 -14
- package/dist/cli/plugins/content/Relay.js.map +1 -1
- package/dist/cli/plugins/content/RelayDeclaration.d.ts +0 -1
- package/dist/cli/plugins/content/RelayDeclaration.js +0 -3
- package/dist/cli/plugins/content/RelayDeclaration.js.map +1 -1
- package/dist/cli/plugins/content/RelayDriver.d.ts +10 -0
- package/dist/cli/plugins/content/RelayDriver.js +39 -0
- package/dist/cli/plugins/content/RelayDriver.js.map +1 -0
- package/dist/cli/plugins/content/index.js +1 -10
- package/dist/cli/plugins/content/index.js.map +1 -1
- package/dist/cli/plugins/content/types.d.ts +3 -0
- package/dist/cli/plugins/locale/Locale.js +5 -1
- package/dist/cli/plugins/locale/Locale.js.map +1 -1
- package/dist/cli/plugins/locale/declaration/LocaleDeclaration.js +2 -3
- package/dist/cli/plugins/locale/declaration/LocaleDeclaration.js.map +1 -1
- package/dist/cli/plugins/locale/declaration/locale.d.ts +3 -124
- package/dist/cli/virtual/index.js +2 -2
- package/dist/cli/virtual/virtual.d.ts +52 -147
- package/dist/entry/relay/index.d.ts +2 -1
- package/dist/entry/relay/index.js.map +1 -1
- package/dist/locale/adapters/react/LocaleProvider.js +2 -0
- package/dist/locale/adapters/react/LocaleProvider.js.map +1 -1
- package/dist/locale/adapters/react/context.d.ts +1 -0
- package/dist/locale/adapters/react/context.js +3 -2
- package/dist/locale/adapters/react/context.js.map +1 -1
- package/dist/locale/helpers.js.map +1 -1
- package/dist/locale/providers/AbstractLocale.d.ts +2 -0
- package/dist/locale/providers/AbstractLocale.js +5 -0
- package/dist/locale/providers/AbstractLocale.js.map +1 -1
- package/dist/locale/providers/NativeLocale.d.ts +3 -2
- package/dist/locale/providers/NativeLocale.js +1 -1
- package/dist/locale/providers/NativeLocale.js.map +1 -1
- package/dist/main/relay.d.ts +7 -6
- package/dist/main/relay.js +12 -5
- package/dist/main/relay.js.map +1 -1
- package/dist/message/error.d.ts +6 -0
- package/dist/message/error.js +21 -0
- package/dist/message/error.js.map +1 -1
- package/dist/message/index.d.ts +2 -1
- package/dist/message/index.js +2 -0
- package/dist/message/index.js.map +1 -1
- package/dist/message/providers/Message.d.ts +3 -0
- package/dist/message/providers/Message.js +36 -6
- package/dist/message/providers/Message.js.map +1 -1
- package/dist/offscreen/providers/ProxyOffscreen.d.ts +2 -2
- package/dist/offscreen/providers/ProxyOffscreen.js.map +1 -1
- package/dist/relay/RelayPermission.d.ts +6 -3
- package/dist/relay/RelayPermission.js +28 -12
- package/dist/relay/RelayPermission.js.map +1 -1
- package/dist/relay/adapters/RelayAdapter.d.ts +8 -0
- package/dist/relay/adapters/RelayAdapter.js +16 -0
- package/dist/relay/adapters/RelayAdapter.js.map +1 -0
- package/dist/relay/adapters/RelayMessagingAdapter.d.ts +11 -0
- package/dist/relay/adapters/RelayMessagingAdapter.js +91 -0
- package/dist/relay/adapters/RelayMessagingAdapter.js.map +1 -0
- package/dist/relay/adapters/RelayScriptingAdapter.d.ts +15 -0
- package/dist/relay/adapters/RelayScriptingAdapter.js +170 -0
- package/dist/relay/adapters/RelayScriptingAdapter.js.map +1 -0
- package/dist/relay/discovery/RelayDiscovery.d.ts +10 -0
- package/dist/relay/discovery/RelayDiscovery.js +62 -0
- package/dist/relay/discovery/RelayDiscovery.js.map +1 -0
- package/dist/relay/index.d.ts +1 -4
- package/dist/relay/index.js +1 -3
- package/dist/relay/index.js.map +1 -1
- package/dist/relay/providers/ProxyRelay.d.ts +20 -17
- package/dist/relay/providers/ProxyRelay.js +79 -52
- package/dist/relay/providers/ProxyRelay.js.map +1 -1
- package/dist/relay/providers/RegisterRelay.js +1 -2
- package/dist/relay/providers/RegisterRelay.js.map +1 -1
- package/dist/relay/result.d.ts +12 -0
- package/dist/relay/result.js +88 -0
- package/dist/relay/result.js.map +1 -0
- package/dist/sandbox/index.d.ts +2 -2
- package/dist/sandbox/index.js.map +1 -1
- package/dist/sandbox/providers/ProxySandbox.d.ts +2 -2
- package/dist/sandbox/providers/ProxySandbox.js.map +1 -1
- package/dist/service/providers/ProxyService.d.ts +2 -2
- package/dist/service/providers/ProxyService.js.map +1 -1
- package/dist/transport/ProxyTransport.d.ts +2 -2
- package/dist/transport/ProxyTransport.js.map +1 -1
- package/dist/transport/index.d.ts +3 -2
- package/dist/types/config.d.ts +8 -0
- package/dist/types/helpers.d.ts +0 -4
- package/dist/types/locale.d.ts +3 -0
- package/dist/types/locale.js +58 -0
- package/dist/types/locale.js.map +1 -1
- package/dist/types/relay.d.ts +130 -3
- package/dist/types/relay.js +16 -0
- package/dist/types/relay.js.map +1 -1
- package/dist/types/rpc.d.ts +4 -0
- package/dist/types/rpc.js +1 -0
- package/dist/types/rpc.js.map +1 -0
- package/dist/types/transport.d.ts +3 -2
- package/package.json +5 -4
|
@@ -23,6 +23,13 @@ class LocaleStructureValidator_default {
|
|
|
23
23
|
continue;
|
|
24
24
|
}
|
|
25
25
|
const structure = builder.structure();
|
|
26
|
+
for (const [key, expected] of Object.entries(defaultStructure)) {
|
|
27
|
+
if (expected.plural && !Object.hasOwn(structure, key)) {
|
|
28
|
+
throw new Error(
|
|
29
|
+
`Locale "${language}" is missing plural key "${key}" required by default locale "${this.defaultLanguage}"`
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
26
33
|
for (const [key, locale] of Object.entries(structure)) {
|
|
27
34
|
const expected = defaultStructure[key];
|
|
28
35
|
if (!expected) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/cli/builders/locale/LocaleStructureValidator.ts"],"sourcesContent":["import _ from \"lodash\";\n\nimport {Language, LocaleBuilder, LocaleBuilders, LocaleContractValidator} from \"@typing/locale\";\n\nexport default class implements LocaleContractValidator {\n constructor(protected readonly defaultLanguage: Language) {}\n\n public isValid(builders: LocaleBuilders): boolean {\n try {\n this.validate(builders);\n\n return true;\n } catch {\n return false;\n }\n }\n\n public validate(builders: LocaleBuilders): this {\n const defaultBuilder = this.getDefaultBuilder(builders);\n\n if (!defaultBuilder) {\n return this;\n }\n\n const defaultStructure = defaultBuilder.structure();\n\n for (const [language, builder] of builders.entries()) {\n if (language === this.defaultLanguage) {\n continue;\n }\n\n const structure = builder.structure();\n\n for (const [key, locale] of Object.entries(structure)) {\n const expected = defaultStructure[key];\n\n if (!expected) {\n console.warn(\n `Locale \"${language}\" contains unknown key \"${key}\" not found in default locale \"${this.defaultLanguage}\"`\n );\n continue;\n }\n\n if (expected.plural !== locale.plural) {\n throw new Error(\n `Locale \"${language}\" key \"${key}\" must be ${expected.plural ? \"plural\" : \"non-plural\"} like default locale \"${this.defaultLanguage}\"`\n );\n }\n\n if (!_.isEqual(expected.substitutions, locale.substitutions)) {\n throw new Error(\n `Locale \"${language}\" key \"${key}\" substitutions [${locale.substitutions.join(\", \")}] must match default locale \"${this.defaultLanguage}\" substitutions [${expected.substitutions.join(\", \")}]`\n );\n }\n }\n }\n\n return this;\n }\n\n public getDefaultBuilder(builders: LocaleBuilders): LocaleBuilder | undefined {\n if (builders.size === 0) {\n return undefined;\n }\n\n const builder = builders.get(this.defaultLanguage);\n\n if (!builder) {\n throw new Error(\n `Default locale \"${this.defaultLanguage}\" not found in available translations. Available languages: ${[...builders.keys()].join(\", \")}`\n );\n }\n\n return builder;\n }\n}\n"],"mappings":"AAAA,OAAO,OAAO;AAId,MAAO,iCAAiD;AAAA,EACpD,YAA+B,iBAA2B;AAA3B;AAAA,EAA4B;AAAA,EAA5B;AAAA,EAExB,QAAQ,UAAmC;AAC9C,QAAI;AACA,WAAK,SAAS,QAAQ;AAEtB,aAAO;AAAA,IACX,QAAQ;AACJ,aAAO;AAAA,IACX;AAAA,EACJ;AAAA,EAEO,SAAS,UAAgC;AAC5C,UAAM,iBAAiB,KAAK,kBAAkB,QAAQ;AAEtD,QAAI,CAAC,gBAAgB;AACjB,aAAO;AAAA,IACX;AAEA,UAAM,mBAAmB,eAAe,UAAU;AAElD,eAAW,CAAC,UAAU,OAAO,KAAK,SAAS,QAAQ,GAAG;AAClD,UAAI,aAAa,KAAK,iBAAiB;AACnC;AAAA,MACJ;AAEA,YAAM,YAAY,QAAQ,UAAU;AAEpC,iBAAW,CAAC,KAAK,MAAM,KAAK,OAAO,QAAQ,SAAS,GAAG;AACnD,cAAM,WAAW,iBAAiB,GAAG;AAErC,YAAI,CAAC,UAAU;AACX,kBAAQ;AAAA,YACJ,WAAW,QAAQ,2BAA2B,GAAG,kCAAkC,KAAK,eAAe;AAAA,UAC3G;AACA;AAAA,QACJ;AAEA,YAAI,SAAS,WAAW,OAAO,QAAQ;AACnC,gBAAM,IAAI;AAAA,YACN,WAAW,QAAQ,UAAU,GAAG,aAAa,SAAS,SAAS,WAAW,YAAY,yBAAyB,KAAK,eAAe;AAAA,UACvI;AAAA,QACJ;AAEA,YAAI,CAAC,EAAE,QAAQ,SAAS,eAAe,OAAO,aAAa,GAAG;AAC1D,gBAAM,IAAI;AAAA,YACN,WAAW,QAAQ,UAAU,GAAG,oBAAoB,OAAO,cAAc,KAAK,IAAI,CAAC,gCAAgC,KAAK,eAAe,oBAAoB,SAAS,cAAc,KAAK,IAAI,CAAC;AAAA,UAChM;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA,EAEO,kBAAkB,UAAqD;AAC1E,QAAI,SAAS,SAAS,GAAG;AACrB,aAAO;AAAA,IACX;AAEA,UAAM,UAAU,SAAS,IAAI,KAAK,eAAe;AAEjD,QAAI,CAAC,SAAS;AACV,YAAM,IAAI;AAAA,QACN,mBAAmB,KAAK,eAAe,+DAA+D,CAAC,GAAG,SAAS,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,MACzI;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AACJ;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/cli/builders/locale/LocaleStructureValidator.ts"],"sourcesContent":["import _ from \"lodash\";\n\nimport {Language, LocaleBuilder, LocaleBuilders, LocaleContractValidator} from \"@typing/locale\";\n\nexport default class implements LocaleContractValidator {\n constructor(protected readonly defaultLanguage: Language) {}\n\n public isValid(builders: LocaleBuilders): boolean {\n try {\n this.validate(builders);\n\n return true;\n } catch {\n return false;\n }\n }\n\n public validate(builders: LocaleBuilders): this {\n const defaultBuilder = this.getDefaultBuilder(builders);\n\n if (!defaultBuilder) {\n return this;\n }\n\n const defaultStructure = defaultBuilder.structure();\n\n for (const [language, builder] of builders.entries()) {\n if (language === this.defaultLanguage) {\n continue;\n }\n\n const structure = builder.structure();\n\n for (const [key, expected] of Object.entries(defaultStructure)) {\n if (expected.plural && !Object.hasOwn(structure, key)) {\n throw new Error(\n `Locale \"${language}\" is missing plural key \"${key}\" required by default locale \"${this.defaultLanguage}\"`\n );\n }\n }\n\n for (const [key, locale] of Object.entries(structure)) {\n const expected = defaultStructure[key];\n\n if (!expected) {\n console.warn(\n `Locale \"${language}\" contains unknown key \"${key}\" not found in default locale \"${this.defaultLanguage}\"`\n );\n continue;\n }\n\n if (expected.plural !== locale.plural) {\n throw new Error(\n `Locale \"${language}\" key \"${key}\" must be ${expected.plural ? \"plural\" : \"non-plural\"} like default locale \"${this.defaultLanguage}\"`\n );\n }\n\n if (!_.isEqual(expected.substitutions, locale.substitutions)) {\n throw new Error(\n `Locale \"${language}\" key \"${key}\" substitutions [${locale.substitutions.join(\", \")}] must match default locale \"${this.defaultLanguage}\" substitutions [${expected.substitutions.join(\", \")}]`\n );\n }\n }\n }\n\n return this;\n }\n\n public getDefaultBuilder(builders: LocaleBuilders): LocaleBuilder | undefined {\n if (builders.size === 0) {\n return undefined;\n }\n\n const builder = builders.get(this.defaultLanguage);\n\n if (!builder) {\n throw new Error(\n `Default locale \"${this.defaultLanguage}\" not found in available translations. Available languages: ${[...builders.keys()].join(\", \")}`\n );\n }\n\n return builder;\n }\n}\n"],"mappings":"AAAA,OAAO,OAAO;AAId,MAAO,iCAAiD;AAAA,EACpD,YAA+B,iBAA2B;AAA3B;AAAA,EAA4B;AAAA,EAA5B;AAAA,EAExB,QAAQ,UAAmC;AAC9C,QAAI;AACA,WAAK,SAAS,QAAQ;AAEtB,aAAO;AAAA,IACX,QAAQ;AACJ,aAAO;AAAA,IACX;AAAA,EACJ;AAAA,EAEO,SAAS,UAAgC;AAC5C,UAAM,iBAAiB,KAAK,kBAAkB,QAAQ;AAEtD,QAAI,CAAC,gBAAgB;AACjB,aAAO;AAAA,IACX;AAEA,UAAM,mBAAmB,eAAe,UAAU;AAElD,eAAW,CAAC,UAAU,OAAO,KAAK,SAAS,QAAQ,GAAG;AAClD,UAAI,aAAa,KAAK,iBAAiB;AACnC;AAAA,MACJ;AAEA,YAAM,YAAY,QAAQ,UAAU;AAEpC,iBAAW,CAAC,KAAK,QAAQ,KAAK,OAAO,QAAQ,gBAAgB,GAAG;AAC5D,YAAI,SAAS,UAAU,CAAC,OAAO,OAAO,WAAW,GAAG,GAAG;AACnD,gBAAM,IAAI;AAAA,YACN,WAAW,QAAQ,4BAA4B,GAAG,iCAAiC,KAAK,eAAe;AAAA,UAC3G;AAAA,QACJ;AAAA,MACJ;AAEA,iBAAW,CAAC,KAAK,MAAM,KAAK,OAAO,QAAQ,SAAS,GAAG;AACnD,cAAM,WAAW,iBAAiB,GAAG;AAErC,YAAI,CAAC,UAAU;AACX,kBAAQ;AAAA,YACJ,WAAW,QAAQ,2BAA2B,GAAG,kCAAkC,KAAK,eAAe;AAAA,UAC3G;AACA;AAAA,QACJ;AAEA,YAAI,SAAS,WAAW,OAAO,QAAQ;AACnC,gBAAM,IAAI;AAAA,YACN,WAAW,QAAQ,UAAU,GAAG,aAAa,SAAS,SAAS,WAAW,YAAY,yBAAyB,KAAK,eAAe;AAAA,UACvI;AAAA,QACJ;AAEA,YAAI,CAAC,EAAE,QAAQ,SAAS,eAAe,OAAO,aAAa,GAAG;AAC1D,gBAAM,IAAI;AAAA,YACN,WAAW,QAAQ,UAAU,GAAG,oBAAoB,OAAO,cAAc,KAAK,IAAI,CAAC,gCAAgC,KAAK,eAAe,oBAAoB,SAAS,cAAc,KAAK,IAAI,CAAC;AAAA,UAChM;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA,EAEO,kBAAkB,UAAqD;AAC1E,QAAI,SAAS,SAAS,GAAG;AACrB,aAAO;AAAA,IACX;AAEA,UAAM,UAAU,SAAS,IAAI,KAAK,eAAe;AAEjD,QAAI,CAAC,SAAS;AACV,YAAM,IAAI;AAAA,QACN,mBAAmB,KAAK,eAAe,+DAA+D,CAAC,GAAG,SAAS,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,MACzI;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AACJ;","names":[]}
|
|
@@ -8,13 +8,9 @@ class GenerateJsonPlugin {
|
|
|
8
8
|
update;
|
|
9
9
|
apply(compiler) {
|
|
10
10
|
compiler.hooks.watchRun.tapPromise(this.pluginName, async () => {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
this.data = await update();
|
|
15
|
-
}
|
|
16
|
-
} catch (e) {
|
|
17
|
-
console.error("GenerateJsonPlugin: Error updating data", e);
|
|
11
|
+
const update = this.update;
|
|
12
|
+
if (update) {
|
|
13
|
+
this.data = await update();
|
|
18
14
|
}
|
|
19
15
|
});
|
|
20
16
|
compiler.hooks.compilation.tap(this.pluginName, (compilation) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/cli/bundler/plugins/GenerateJsonPlugin.ts"],"sourcesContent":["import {Compilation, Compiler, sources} from \"@rspack/core\";\n\ntype JsonValue = string | number | boolean | null | JsonObject | JsonArray;\n\ninterface JsonObject {\n [key: string]: JsonValue;\n}\n\ntype JsonArray = JsonValue[];\n\nexport type GenerateJsonPluginData = Record<string, JsonValue>;\n\nexport type GenerateJsonPluginUpdate = () => Promise<GenerateJsonPluginData>;\n\nexport default class GenerateJsonPlugin {\n private readonly pluginName: string = \"GenerateJsonPlugin\";\n\n private update?: GenerateJsonPluginUpdate;\n\n constructor(protected data: GenerateJsonPluginData) {}\n\n public apply(compiler: Compiler): void {\n compiler.hooks.watchRun.tapPromise(this.pluginName, async () => {\n
|
|
1
|
+
{"version":3,"sources":["../../../../src/cli/bundler/plugins/GenerateJsonPlugin.ts"],"sourcesContent":["import {Compilation, Compiler, sources} from \"@rspack/core\";\n\ntype JsonValue = string | number | boolean | null | JsonObject | JsonArray;\n\ninterface JsonObject {\n [key: string]: JsonValue;\n}\n\ntype JsonArray = JsonValue[];\n\nexport type GenerateJsonPluginData = Record<string, JsonValue>;\n\nexport type GenerateJsonPluginUpdate = () => Promise<GenerateJsonPluginData>;\n\nexport default class GenerateJsonPlugin {\n private readonly pluginName: string = \"GenerateJsonPlugin\";\n\n private update?: GenerateJsonPluginUpdate;\n\n constructor(protected data: GenerateJsonPluginData) {}\n\n public apply(compiler: Compiler): void {\n compiler.hooks.watchRun.tapPromise(this.pluginName, async () => {\n const update = this.update;\n\n if (update) {\n // Let the compiler fail this rebuild rather than emit stale JSON.\n this.data = await update();\n }\n });\n\n compiler.hooks.compilation.tap(this.pluginName, (compilation: Compilation) => {\n compilation.hooks.processAssets.tap(\n {\n name: this.pluginName,\n stage: Compilation.PROCESS_ASSETS_STAGE_ADDITIONAL,\n },\n () => this.generateFiles(compilation)\n );\n });\n }\n\n public watch(update: GenerateJsonPluginUpdate): this {\n this.update = update;\n\n return this;\n }\n\n protected generateFiles(compilation: Compilation): void {\n Object.entries(this.data).forEach(([filename, jsonData]) => {\n const json = JSON.stringify(jsonData, null, 2);\n\n compilation.emitAsset(filename, new sources.RawSource(json));\n });\n }\n}\n"],"mappings":"AAAA,SAAQ,aAAuB,eAAc;AAc7C,MAAO,mBAAiC;AAAA,EAKpC,YAAsB,MAA8B;AAA9B;AAAA,EAA+B;AAAA,EAA/B;AAAA,EAJL,aAAqB;AAAA,EAE9B;AAAA,EAID,MAAM,UAA0B;AACnC,aAAS,MAAM,SAAS,WAAW,KAAK,YAAY,YAAY;AAC5D,YAAM,SAAS,KAAK;AAEpB,UAAI,QAAQ;AAER,aAAK,OAAO,MAAM,OAAO;AAAA,MAC7B;AAAA,IACJ,CAAC;AAED,aAAS,MAAM,YAAY,IAAI,KAAK,YAAY,CAAC,gBAA6B;AAC1E,kBAAY,MAAM,cAAc;AAAA,QAC5B;AAAA,UACI,MAAM,KAAK;AAAA,UACX,OAAO,YAAY;AAAA,QACvB;AAAA,QACA,MAAM,KAAK,cAAc,WAAW;AAAA,MACxC;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EAEO,MAAM,QAAwC;AACjD,SAAK,SAAS;AAEd,WAAO;AAAA,EACX;AAAA,EAEU,cAAc,aAAgC;AACpD,WAAO,QAAQ,KAAK,IAAI,EAAE,QAAQ,CAAC,CAAC,UAAU,QAAQ,MAAM;AACxD,YAAM,OAAO,KAAK,UAAU,UAAU,MAAM,CAAC;AAE7C,kBAAY,UAAU,UAAU,IAAI,QAAQ,UAAU,IAAI,CAAC;AAAA,IAC/D,CAAC;AAAA,EACL;AACJ;","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Command, Mode, PackageName } from "./../../../../types/app.js";
|
|
2
2
|
import { Browser } from "./../../../../types/browser.js";
|
|
3
|
-
import { RelayMethod } from "./../../../../types/relay.js";
|
|
3
|
+
import { RelayAllFrames, RelayMethod } from "./../../../../types/relay.js";
|
|
4
4
|
import { ContentScriptAppend, ContentScriptDeclarative, ContentScriptMarker } from "./../../../../types/content.js";
|
|
5
5
|
import { OffscreenReason } from "./../../../../types/offscreen.js";
|
|
6
6
|
import { SandboxAllow, SandboxSource } from "./../../../../types/sandbox.js";
|
|
@@ -71,6 +71,14 @@ var core_default = () => {
|
|
|
71
71
|
value
|
|
72
72
|
});
|
|
73
73
|
});
|
|
74
|
+
Object.entries(RelayAllFrames).forEach(([key, value]) => {
|
|
75
|
+
resolvers.push({
|
|
76
|
+
from: PackageName,
|
|
77
|
+
target: "RelayAllFrames",
|
|
78
|
+
name: key,
|
|
79
|
+
value
|
|
80
|
+
});
|
|
81
|
+
});
|
|
74
82
|
Object.entries(OffscreenReason).forEach(([key, value]) => {
|
|
75
83
|
resolvers.push({
|
|
76
84
|
from: PackageName,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/cli/entrypoint/file/injectors/core.ts"],"sourcesContent":["import {Command, Mode, PackageName} from \"@typing/app\";\nimport {Browser} from \"@typing/browser\";\nimport {RelayMethod} from \"@typing/relay\";\nimport {ContentScriptAppend, ContentScriptDeclarative, ContentScriptMarker} from \"@typing/content\";\nimport {OffscreenReason} from \"@typing/offscreen\";\nimport {SandboxAllow, SandboxSource} from \"@typing/sandbox\";\nimport {CspSource} from \"@typing/csp\";\n\nimport {Injector} from \"../types\";\n\nexport default (): Injector[] => {\n const resolvers: Injector[] = [];\n\n Object.entries(Browser).forEach(([key, value]) => {\n resolvers.push({\n from: PackageName,\n target: \"Browser\",\n name: key,\n value,\n });\n });\n\n Object.entries(Mode).forEach(([key, value]) => {\n resolvers.push({\n from: PackageName,\n target: \"Mode\",\n name: key,\n value,\n });\n });\n\n Object.entries(Command).forEach(([key, value]) => {\n resolvers.push({\n from: PackageName,\n target: \"Command\",\n name: key,\n value,\n });\n });\n\n Object.entries(ContentScriptDeclarative).forEach(([key, value]) => {\n resolvers.push({\n from: PackageName,\n target: \"ContentScriptDeclarative\",\n name: key,\n value,\n });\n });\n\n Object.entries(ContentScriptAppend).forEach(([key, value]) => {\n resolvers.push({\n from: PackageName,\n target: \"ContentScriptAppend\",\n name: key,\n value,\n });\n });\n\n Object.entries(ContentScriptMarker).forEach(([key, value]) => {\n resolvers.push({\n from: PackageName,\n target: \"ContentScriptMarker\",\n name: key,\n value,\n });\n });\n\n Object.entries(CspSource).forEach(([key, value]) => {\n resolvers.push({\n from: PackageName,\n target: \"CspSource\",\n name: key,\n value,\n });\n });\n\n Object.entries(RelayMethod).forEach(([key, value]) => {\n resolvers.push({\n from: PackageName,\n target: \"RelayMethod\",\n name: key,\n value,\n });\n });\n\n Object.entries(OffscreenReason).forEach(([key, value]) => {\n resolvers.push({\n from: PackageName,\n target: \"OffscreenReason\",\n name: key,\n value,\n });\n });\n\n Object.entries(SandboxAllow).forEach(([key, value]) => {\n resolvers.push({\n from: PackageName,\n target: \"SandboxAllow\",\n name: key,\n value,\n });\n });\n\n Object.entries(SandboxSource).forEach(([key, value]) => {\n resolvers.push({\n from: PackageName,\n target: \"SandboxSource\",\n name: key,\n value,\n });\n });\n\n return resolvers;\n};\n"],"mappings":"AAAA,SAAQ,SAAS,MAAM,mBAAkB;AACzC,SAAQ,eAAc;AACtB,SAAQ,mBAAkB;
|
|
1
|
+
{"version":3,"sources":["../../../../../src/cli/entrypoint/file/injectors/core.ts"],"sourcesContent":["import {Command, Mode, PackageName} from \"@typing/app\";\nimport {Browser} from \"@typing/browser\";\nimport {RelayAllFrames, RelayMethod} from \"@typing/relay\";\nimport {ContentScriptAppend, ContentScriptDeclarative, ContentScriptMarker} from \"@typing/content\";\nimport {OffscreenReason} from \"@typing/offscreen\";\nimport {SandboxAllow, SandboxSource} from \"@typing/sandbox\";\nimport {CspSource} from \"@typing/csp\";\n\nimport {Injector} from \"../types\";\n\nexport default (): Injector[] => {\n const resolvers: Injector[] = [];\n\n Object.entries(Browser).forEach(([key, value]) => {\n resolvers.push({\n from: PackageName,\n target: \"Browser\",\n name: key,\n value,\n });\n });\n\n Object.entries(Mode).forEach(([key, value]) => {\n resolvers.push({\n from: PackageName,\n target: \"Mode\",\n name: key,\n value,\n });\n });\n\n Object.entries(Command).forEach(([key, value]) => {\n resolvers.push({\n from: PackageName,\n target: \"Command\",\n name: key,\n value,\n });\n });\n\n Object.entries(ContentScriptDeclarative).forEach(([key, value]) => {\n resolvers.push({\n from: PackageName,\n target: \"ContentScriptDeclarative\",\n name: key,\n value,\n });\n });\n\n Object.entries(ContentScriptAppend).forEach(([key, value]) => {\n resolvers.push({\n from: PackageName,\n target: \"ContentScriptAppend\",\n name: key,\n value,\n });\n });\n\n Object.entries(ContentScriptMarker).forEach(([key, value]) => {\n resolvers.push({\n from: PackageName,\n target: \"ContentScriptMarker\",\n name: key,\n value,\n });\n });\n\n Object.entries(CspSource).forEach(([key, value]) => {\n resolvers.push({\n from: PackageName,\n target: \"CspSource\",\n name: key,\n value,\n });\n });\n\n Object.entries(RelayMethod).forEach(([key, value]) => {\n resolvers.push({\n from: PackageName,\n target: \"RelayMethod\",\n name: key,\n value,\n });\n });\n\n Object.entries(RelayAllFrames).forEach(([key, value]) => {\n resolvers.push({\n from: PackageName,\n target: \"RelayAllFrames\",\n name: key,\n value,\n });\n });\n\n Object.entries(OffscreenReason).forEach(([key, value]) => {\n resolvers.push({\n from: PackageName,\n target: \"OffscreenReason\",\n name: key,\n value,\n });\n });\n\n Object.entries(SandboxAllow).forEach(([key, value]) => {\n resolvers.push({\n from: PackageName,\n target: \"SandboxAllow\",\n name: key,\n value,\n });\n });\n\n Object.entries(SandboxSource).forEach(([key, value]) => {\n resolvers.push({\n from: PackageName,\n target: \"SandboxSource\",\n name: key,\n value,\n });\n });\n\n return resolvers;\n};\n"],"mappings":"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","names":[]}
|
|
@@ -2,6 +2,7 @@ import path from "path";
|
|
|
2
2
|
import fs from "fs";
|
|
3
3
|
import { getAppPath, getAppSourcePath, getResolvePath, getSharedPath, getSourcePath } from "./../../../cli/resolvers/path.js";
|
|
4
4
|
import AbstractFinder from "./AbstractFinder.js";
|
|
5
|
+
import { FileLayer, getWorkspaceFileLayers, setFilePrecedence } from "./utils/filePrecedence.js";
|
|
5
6
|
class AbstractAssetFinder_default extends AbstractFinder {
|
|
6
7
|
getDirectory() {
|
|
7
8
|
return ".";
|
|
@@ -20,21 +21,31 @@ class AbstractAssetFinder_default extends AbstractFinder {
|
|
|
20
21
|
return this.isValidName(name) && this.isValidExtension(ext);
|
|
21
22
|
}
|
|
22
23
|
async getFiles() {
|
|
23
|
-
const files = /* @__PURE__ */ new
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
24
|
+
const files = /* @__PURE__ */ new Map();
|
|
25
|
+
const collect = async (directory, layer) => {
|
|
26
|
+
const assetFiles = await this.findFiles(getResolvePath(directory));
|
|
27
|
+
for (const file of assetFiles) {
|
|
28
|
+
const canonicalPath = fs.realpathSync.native(file.file);
|
|
29
|
+
if (!files.has(canonicalPath)) {
|
|
30
|
+
files.set(canonicalPath, setFilePrecedence(file, { layer }));
|
|
29
31
|
}
|
|
30
32
|
}
|
|
31
33
|
};
|
|
32
34
|
const dir = this.getDirectory();
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
35
|
+
const directories = {
|
|
36
|
+
[FileLayer.Source]: getSourcePath(this.config, dir),
|
|
37
|
+
[FileLayer.Shared]: getSharedPath(this.config, dir),
|
|
38
|
+
[FileLayer.App]: getAppPath(this.config, dir),
|
|
39
|
+
[FileLayer.AppSource]: getAppSourcePath(this.config, dir)
|
|
40
|
+
};
|
|
41
|
+
const merge = this.canMerge();
|
|
42
|
+
for (const layer of getWorkspaceFileLayers()) {
|
|
43
|
+
await collect(directories[layer], layer);
|
|
44
|
+
if (!merge && files.size > 0) {
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return new Set(files.values());
|
|
38
49
|
}
|
|
39
50
|
async findFiles(directory) {
|
|
40
51
|
const files = /* @__PURE__ */ new Set();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/cli/entrypoint/finder/AbstractAssetFinder.ts"],"sourcesContent":["import path from \"path\";\nimport fs from \"fs\";\n\nimport {getAppPath, getAppSourcePath, getResolvePath, getSharedPath, getSourcePath} from \"@cli/resolvers/path\";\n\nimport AbstractFinder from \"./AbstractFinder\";\n\nimport {EntrypointFile} from \"@typing/entrypoint\";\n\nexport default abstract class extends AbstractFinder {\n public abstract getNames(): ReadonlySet<string>;\n\n public abstract isValidExtension(extension: string): boolean;\n\n public getDirectory(): string {\n return \".\";\n }\n\n public isValidName(name: string): boolean {\n return name.length > 0 && this.getNames().has(name);\n }\n\n public canMerge(): boolean {\n return false;\n }\n\n public isValidFilename(filename: string): boolean {\n let {name, ext} = path.parse(filename);\n\n if (ext.startsWith(\".\")) {\n ext = ext.slice(1);\n }\n\n return this.isValidName(name) && this.isValidExtension(ext);\n }\n\n protected async getFiles(): Promise<Set<EntrypointFile>> {\n const files = new
|
|
1
|
+
{"version":3,"sources":["../../../../src/cli/entrypoint/finder/AbstractAssetFinder.ts"],"sourcesContent":["import path from \"path\";\nimport fs from \"fs\";\n\nimport {getAppPath, getAppSourcePath, getResolvePath, getSharedPath, getSourcePath} from \"@cli/resolvers/path\";\n\nimport AbstractFinder from \"./AbstractFinder\";\nimport {FileLayer, getWorkspaceFileLayers, setFilePrecedence, type WorkspaceFileLayer} from \"./utils/filePrecedence\";\n\nimport {EntrypointFile} from \"@typing/entrypoint\";\n\nexport default abstract class extends AbstractFinder {\n public abstract getNames(): ReadonlySet<string>;\n\n public abstract isValidExtension(extension: string): boolean;\n\n public getDirectory(): string {\n return \".\";\n }\n\n public isValidName(name: string): boolean {\n return name.length > 0 && this.getNames().has(name);\n }\n\n public canMerge(): boolean {\n return false;\n }\n\n public isValidFilename(filename: string): boolean {\n let {name, ext} = path.parse(filename);\n\n if (ext.startsWith(\".\")) {\n ext = ext.slice(1);\n }\n\n return this.isValidName(name) && this.isValidExtension(ext);\n }\n\n protected async getFiles(): Promise<Set<EntrypointFile>> {\n const files = new Map<string, EntrypointFile>();\n\n const collect = async (directory: string, layer: FileLayer): Promise<void> => {\n const assetFiles = await this.findFiles(getResolvePath(directory));\n\n for (const file of assetFiles) {\n const canonicalPath = fs.realpathSync.native(file.file);\n\n if (!files.has(canonicalPath)) {\n files.set(canonicalPath, setFilePrecedence(file, {layer}));\n }\n }\n };\n\n const dir = this.getDirectory();\n\n const directories: Record<WorkspaceFileLayer, string> = {\n [FileLayer.Source]: getSourcePath(this.config, dir),\n [FileLayer.Shared]: getSharedPath(this.config, dir),\n [FileLayer.App]: getAppPath(this.config, dir),\n [FileLayer.AppSource]: getAppSourcePath(this.config, dir),\n };\n\n const merge = this.canMerge();\n\n for (const layer of getWorkspaceFileLayers()) {\n await collect(directories[layer], layer);\n\n if (!merge && files.size > 0) {\n break;\n }\n }\n\n return new Set(files.values());\n }\n\n protected async findFiles(directory: string): Promise<Set<EntrypointFile>> {\n const files = new Set<EntrypointFile>();\n\n try {\n const entries = fs.readdirSync(directory);\n\n for (const entry of entries) {\n const fullPath = path.join(directory, entry);\n const stats = fs.statSync(fullPath);\n\n if (stats.isFile() && this.isValidFilename(fullPath)) {\n files.add(this.file(fullPath));\n }\n }\n } catch {}\n\n return files;\n }\n}\n"],"mappings":"AAAA,OAAO,UAAU;AACjB,OAAO,QAAQ;AAEf,SAAQ,YAAY,kBAAkB,gBAAgB,eAAe,qBAAoB;AAEzF,OAAO,oBAAoB;AAC3B,SAAQ,WAAW,wBAAwB,yBAAiD;AAI5F,MAAO,oCAA+B,eAAe;AAAA,EAK1C,eAAuB;AAC1B,WAAO;AAAA,EACX;AAAA,EAEO,YAAY,MAAuB;AACtC,WAAO,KAAK,SAAS,KAAK,KAAK,SAAS,EAAE,IAAI,IAAI;AAAA,EACtD;AAAA,EAEO,WAAoB;AACvB,WAAO;AAAA,EACX;AAAA,EAEO,gBAAgB,UAA2B;AAC9C,QAAI,EAAC,MAAM,IAAG,IAAI,KAAK,MAAM,QAAQ;AAErC,QAAI,IAAI,WAAW,GAAG,GAAG;AACrB,YAAM,IAAI,MAAM,CAAC;AAAA,IACrB;AAEA,WAAO,KAAK,YAAY,IAAI,KAAK,KAAK,iBAAiB,GAAG;AAAA,EAC9D;AAAA,EAEA,MAAgB,WAAyC;AACrD,UAAM,QAAQ,oBAAI,IAA4B;AAE9C,UAAM,UAAU,OAAO,WAAmB,UAAoC;AAC1E,YAAM,aAAa,MAAM,KAAK,UAAU,eAAe,SAAS,CAAC;AAEjE,iBAAW,QAAQ,YAAY;AAC3B,cAAM,gBAAgB,GAAG,aAAa,OAAO,KAAK,IAAI;AAEtD,YAAI,CAAC,MAAM,IAAI,aAAa,GAAG;AAC3B,gBAAM,IAAI,eAAe,kBAAkB,MAAM,EAAC,MAAK,CAAC,CAAC;AAAA,QAC7D;AAAA,MACJ;AAAA,IACJ;AAEA,UAAM,MAAM,KAAK,aAAa;AAE9B,UAAM,cAAkD;AAAA,MACpD,CAAC,UAAU,MAAM,GAAG,cAAc,KAAK,QAAQ,GAAG;AAAA,MAClD,CAAC,UAAU,MAAM,GAAG,cAAc,KAAK,QAAQ,GAAG;AAAA,MAClD,CAAC,UAAU,GAAG,GAAG,WAAW,KAAK,QAAQ,GAAG;AAAA,MAC5C,CAAC,UAAU,SAAS,GAAG,iBAAiB,KAAK,QAAQ,GAAG;AAAA,IAC5D;AAEA,UAAM,QAAQ,KAAK,SAAS;AAE5B,eAAW,SAAS,uBAAuB,GAAG;AAC1C,YAAM,QAAQ,YAAY,KAAK,GAAG,KAAK;AAEvC,UAAI,CAAC,SAAS,MAAM,OAAO,GAAG;AAC1B;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO,IAAI,IAAI,MAAM,OAAO,CAAC;AAAA,EACjC;AAAA,EAEA,MAAgB,UAAU,WAAiD;AACvE,UAAM,QAAQ,oBAAI,IAAoB;AAEtC,QAAI;AACA,YAAM,UAAU,GAAG,YAAY,SAAS;AAExC,iBAAW,SAAS,SAAS;AACzB,cAAM,WAAW,KAAK,KAAK,WAAW,KAAK;AAC3C,cAAM,QAAQ,GAAG,SAAS,QAAQ;AAElC,YAAI,MAAM,OAAO,KAAK,KAAK,gBAAgB,QAAQ,GAAG;AAClD,gBAAM,IAAI,KAAK,KAAK,QAAQ,CAAC;AAAA,QACjC;AAAA,MACJ;AAAA,IACJ,QAAQ;AAAA,IAAC;AAET,WAAO;AAAA,EACX;AACJ;","names":[]}
|
|
@@ -2,6 +2,7 @@ import fs from "fs";
|
|
|
2
2
|
import path from "path";
|
|
3
3
|
import pluralize from "pluralize";
|
|
4
4
|
import AbstractOptionsFinder from "./AbstractOptionsFinder.js";
|
|
5
|
+
import { FileLayer, setFilePrecedence } from "./utils/filePrecedence.js";
|
|
5
6
|
import { getAppSourcePath, getSharedPath } from "./../../../cli/resolvers/path.js";
|
|
6
7
|
import { EntrypointFileExtensions } from "./../../../types/entrypoint.js";
|
|
7
8
|
class AbstractEntrypointFinder_default extends AbstractOptionsFinder {
|
|
@@ -19,6 +20,9 @@ class AbstractEntrypointFinder_default extends AbstractOptionsFinder {
|
|
|
19
20
|
const entrypoint = this.type();
|
|
20
21
|
let files = /* @__PURE__ */ new Set();
|
|
21
22
|
const appFiles = this.findFiles(getAppSourcePath(this.config));
|
|
23
|
+
for (const file of appFiles) {
|
|
24
|
+
setFilePrecedence(file, { layer: FileLayer.AppSource });
|
|
25
|
+
}
|
|
22
26
|
if (appFiles.size > 0) {
|
|
23
27
|
files = appFiles;
|
|
24
28
|
if (this.config.debug) {
|
|
@@ -27,6 +31,9 @@ class AbstractEntrypointFinder_default extends AbstractOptionsFinder {
|
|
|
27
31
|
}
|
|
28
32
|
if (appFiles.size > 0 && this.canMerge() || appFiles.size === 0) {
|
|
29
33
|
const sharedFiles = this.findFiles(getSharedPath(this.config));
|
|
34
|
+
for (const file of sharedFiles) {
|
|
35
|
+
setFilePrecedence(file, { layer: FileLayer.Shared });
|
|
36
|
+
}
|
|
30
37
|
if (sharedFiles.size > 0) {
|
|
31
38
|
files = /* @__PURE__ */ new Set([...files, ...sharedFiles]);
|
|
32
39
|
if (this.config.debug) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/cli/entrypoint/finder/AbstractEntrypointFinder.ts"],"sourcesContent":["import fs, {Dirent} from \"fs\";\nimport path from \"path\";\nimport pluralize from \"pluralize\";\n\nimport AbstractOptionsFinder from \"./AbstractOptionsFinder\";\n\nimport {getAppSourcePath, getSharedPath} from \"@cli/resolvers/path\";\n\nimport {EntrypointFile, EntrypointFileExtensions, EntrypointOptions} from \"@typing/entrypoint\";\nimport {ReadonlyConfig} from \"@typing/config\";\n\nexport default abstract class<O extends EntrypointOptions> extends AbstractOptionsFinder<O> {\n protected fileExtensionsPattern: string;\n\n protected possibleIndexFiles: Set<string>;\n\n protected constructor(config: ReadonlyConfig) {\n super(config);\n\n this.fileExtensionsPattern = [...EntrypointFileExtensions].map(ext => ext.replace(\".\", \"\\\\.\")).join(\"|\");\n\n this.possibleIndexFiles = new Set([...EntrypointFileExtensions].map(ext => `index.${ext}`));\n }\n\n public canMerge(): boolean {\n return false;\n }\n\n protected async getFiles(): Promise<Set<EntrypointFile>> {\n const entrypoint = this.type();\n\n let files = new Set<EntrypointFile>();\n\n const appFiles = this.findFiles(getAppSourcePath(this.config));\n\n if (appFiles.size > 0) {\n files = appFiles;\n\n if (this.config.debug) {\n console.info(`App \"${entrypoint}\" files added:`, appFiles);\n }\n }\n\n if ((appFiles.size > 0 && this.canMerge()) || appFiles.size === 0) {\n const sharedFiles = this.findFiles(getSharedPath(this.config));\n\n if (sharedFiles.size > 0) {\n files = new Set([...files, ...sharedFiles]);\n\n if (this.config.debug) {\n console.info(`Shared \"${entrypoint}\" files added:`, sharedFiles);\n }\n }\n }\n\n return files;\n }\n\n protected findFiles(directory: string): Set<EntrypointFile> {\n const entrypoint = this.type();\n const entrypointPluralize = pluralize(entrypoint);\n\n const rootFiles: EntrypointFile[] = [];\n const groupedFiles: EntrypointFile[] = [];\n\n const collect = (dir: string, files: EntrypointFile[], collectGrouped: boolean): void => {\n let entries: Dirent[];\n\n try {\n entries = fs.readdirSync(dir, {withFileTypes: true});\n } catch (e) {\n if (this.config.debug) {\n console.log(`Failed to read ${entrypoint} entrypoint directory: \"${dir}\". Skipping.`);\n }\n\n return;\n }\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n if (this.isValidDirname(entry.name)) {\n for (const indexFile of this.possibleIndexFiles) {\n const indexPath = path.join(fullPath, indexFile);\n\n try {\n const stat = fs.statSync(indexPath);\n\n if (stat.isFile()) {\n files.push(this.file(indexPath));\n }\n } catch (e) {\n if (this.config.debug) {\n console.log(\n `Error reading ${entrypoint} entrypoint index file: \"${indexPath}\". Skipping.`\n );\n }\n }\n }\n } else if (collectGrouped && entry.name === entrypointPluralize) {\n collect(fullPath, groupedFiles, false);\n }\n } else if (entry.isFile() && this.isValidFilename(entry.name)) {\n files.push(this.file(fullPath));\n }\n }\n };\n\n collect(directory, rootFiles, true);\n\n if (groupedFiles.length > 0) {\n return new Set(groupedFiles);\n }\n\n if (rootFiles.length > 0) {\n return new Set(rootFiles);\n }\n\n try {\n directory = path.join(directory, entrypoint);\n\n const stat = fs.statSync(directory);\n\n if (stat.isDirectory()) {\n collect(directory, rootFiles, false);\n }\n } catch (e) {\n if (this.config.debug) {\n console.log(\"Error reading entrypoint directory:\", directory);\n }\n }\n\n return new Set(rootFiles);\n }\n\n protected isValidFilename(filename: string): boolean {\n const name = this.type().replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n const pattern = new RegExp(`^(?:.*\\\\.)?${name}\\\\.(${this.fileExtensionsPattern})$`);\n\n return pattern.test(filename);\n }\n\n protected isValidDirname(dirname: string): boolean {\n const entrypoint = this.type();\n\n return dirname === entrypoint || dirname.endsWith(`.${entrypoint}`);\n }\n}\n"],"mappings":"AAAA,OAAO,QAAkB;AACzB,OAAO,UAAU;AACjB,OAAO,eAAe;AAEtB,OAAO,2BAA2B;
|
|
1
|
+
{"version":3,"sources":["../../../../src/cli/entrypoint/finder/AbstractEntrypointFinder.ts"],"sourcesContent":["import fs, {Dirent} from \"fs\";\nimport path from \"path\";\nimport pluralize from \"pluralize\";\n\nimport AbstractOptionsFinder from \"./AbstractOptionsFinder\";\nimport {FileLayer, setFilePrecedence} from \"./utils/filePrecedence\";\n\nimport {getAppSourcePath, getSharedPath} from \"@cli/resolvers/path\";\n\nimport {EntrypointFile, EntrypointFileExtensions, EntrypointOptions} from \"@typing/entrypoint\";\nimport {ReadonlyConfig} from \"@typing/config\";\n\nexport default abstract class<O extends EntrypointOptions> extends AbstractOptionsFinder<O> {\n protected fileExtensionsPattern: string;\n\n protected possibleIndexFiles: Set<string>;\n\n protected constructor(config: ReadonlyConfig) {\n super(config);\n\n this.fileExtensionsPattern = [...EntrypointFileExtensions].map(ext => ext.replace(\".\", \"\\\\.\")).join(\"|\");\n\n this.possibleIndexFiles = new Set([...EntrypointFileExtensions].map(ext => `index.${ext}`));\n }\n\n public canMerge(): boolean {\n return false;\n }\n\n protected async getFiles(): Promise<Set<EntrypointFile>> {\n const entrypoint = this.type();\n\n let files = new Set<EntrypointFile>();\n\n const appFiles = this.findFiles(getAppSourcePath(this.config));\n\n for (const file of appFiles) {\n setFilePrecedence(file, {layer: FileLayer.AppSource});\n }\n\n if (appFiles.size > 0) {\n files = appFiles;\n\n if (this.config.debug) {\n console.info(`App \"${entrypoint}\" files added:`, appFiles);\n }\n }\n\n if ((appFiles.size > 0 && this.canMerge()) || appFiles.size === 0) {\n const sharedFiles = this.findFiles(getSharedPath(this.config));\n\n for (const file of sharedFiles) {\n setFilePrecedence(file, {layer: FileLayer.Shared});\n }\n\n if (sharedFiles.size > 0) {\n files = new Set([...files, ...sharedFiles]);\n\n if (this.config.debug) {\n console.info(`Shared \"${entrypoint}\" files added:`, sharedFiles);\n }\n }\n }\n\n return files;\n }\n\n protected findFiles(directory: string): Set<EntrypointFile> {\n const entrypoint = this.type();\n const entrypointPluralize = pluralize(entrypoint);\n\n const rootFiles: EntrypointFile[] = [];\n const groupedFiles: EntrypointFile[] = [];\n\n const collect = (dir: string, files: EntrypointFile[], collectGrouped: boolean): void => {\n let entries: Dirent[];\n\n try {\n entries = fs.readdirSync(dir, {withFileTypes: true});\n } catch (e) {\n if (this.config.debug) {\n console.log(`Failed to read ${entrypoint} entrypoint directory: \"${dir}\". Skipping.`);\n }\n\n return;\n }\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n if (this.isValidDirname(entry.name)) {\n for (const indexFile of this.possibleIndexFiles) {\n const indexPath = path.join(fullPath, indexFile);\n\n try {\n const stat = fs.statSync(indexPath);\n\n if (stat.isFile()) {\n files.push(this.file(indexPath));\n }\n } catch (e) {\n if (this.config.debug) {\n console.log(\n `Error reading ${entrypoint} entrypoint index file: \"${indexPath}\". Skipping.`\n );\n }\n }\n }\n } else if (collectGrouped && entry.name === entrypointPluralize) {\n collect(fullPath, groupedFiles, false);\n }\n } else if (entry.isFile() && this.isValidFilename(entry.name)) {\n files.push(this.file(fullPath));\n }\n }\n };\n\n collect(directory, rootFiles, true);\n\n if (groupedFiles.length > 0) {\n return new Set(groupedFiles);\n }\n\n if (rootFiles.length > 0) {\n return new Set(rootFiles);\n }\n\n try {\n directory = path.join(directory, entrypoint);\n\n const stat = fs.statSync(directory);\n\n if (stat.isDirectory()) {\n collect(directory, rootFiles, false);\n }\n } catch (e) {\n if (this.config.debug) {\n console.log(\"Error reading entrypoint directory:\", directory);\n }\n }\n\n return new Set(rootFiles);\n }\n\n protected isValidFilename(filename: string): boolean {\n const name = this.type().replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n const pattern = new RegExp(`^(?:.*\\\\.)?${name}\\\\.(${this.fileExtensionsPattern})$`);\n\n return pattern.test(filename);\n }\n\n protected isValidDirname(dirname: string): boolean {\n const entrypoint = this.type();\n\n return dirname === entrypoint || dirname.endsWith(`.${entrypoint}`);\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -4,7 +4,6 @@ export default abstract class implements EntrypointFinder {
|
|
|
4
4
|
protected readonly config: ReadonlyConfig;
|
|
5
5
|
protected _files?: Set<EntrypointFile>;
|
|
6
6
|
private readonly require;
|
|
7
|
-
protected readonly priorityDirectories: string[];
|
|
8
7
|
protected abstract getFiles(): Promise<Set<EntrypointFile>>;
|
|
9
8
|
protected constructor(config: ReadonlyConfig);
|
|
10
9
|
clear(): this;
|
|
@@ -15,6 +14,5 @@ export default abstract class implements EntrypointFinder {
|
|
|
15
14
|
protected file(filename: string): EntrypointFile;
|
|
16
15
|
protected resolve(name: string, filename: string): EntrypointFile;
|
|
17
16
|
protected resolveSafely(name: string, filename: string): EntrypointFile | undefined;
|
|
18
|
-
protected priority(file: EntrypointFile): number;
|
|
19
17
|
protected sortKey(file: EntrypointFile): string;
|
|
20
18
|
}
|
|
@@ -1,34 +1,19 @@
|
|
|
1
|
-
import _ from "lodash";
|
|
2
1
|
import path from "path";
|
|
3
2
|
import fs from "fs";
|
|
4
3
|
import { createRequire } from "module";
|
|
5
4
|
import { fileURLToPath } from "url";
|
|
5
|
+
import { compareFilePrecedence } from "./utils/filePrecedence.js";
|
|
6
6
|
import { toPosixPath } from "./../../../cli/utils/path.js";
|
|
7
7
|
import { isFile } from "./../../../cli/utils/fs.js";
|
|
8
|
-
import {
|
|
9
|
-
getAppPath,
|
|
10
|
-
getAppSourcePath,
|
|
11
|
-
getResolvePath,
|
|
12
|
-
getSharedPath,
|
|
13
|
-
getSourcePath,
|
|
14
|
-
resolveRootPath
|
|
15
|
-
} from "./../../../cli/resolvers/path.js";
|
|
8
|
+
import { getResolvePath, getSourcePath, resolveRootPath } from "./../../../cli/resolvers/path.js";
|
|
16
9
|
import { resolveAssetsPath, resolveEntrypointPath } from "./../../../cli/entrypoint/utils/index.js";
|
|
17
10
|
class AbstractFinder_default {
|
|
18
11
|
constructor(config) {
|
|
19
12
|
this.config = config;
|
|
20
|
-
this.priorityDirectories = [
|
|
21
|
-
"node_modules",
|
|
22
|
-
getSourcePath(config),
|
|
23
|
-
getSharedPath(config),
|
|
24
|
-
getAppPath(config),
|
|
25
|
-
getAppSourcePath(config)
|
|
26
|
-
];
|
|
27
13
|
}
|
|
28
14
|
config;
|
|
29
15
|
_files;
|
|
30
16
|
require = createRequire(import.meta.url);
|
|
31
|
-
priorityDirectories;
|
|
32
17
|
clear() {
|
|
33
18
|
this._files = void 0;
|
|
34
19
|
return this;
|
|
@@ -38,10 +23,9 @@ class AbstractFinder_default {
|
|
|
38
23
|
return this._files;
|
|
39
24
|
}
|
|
40
25
|
const files = Array.from(await this.getFiles()).sort((a, b) => {
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
return priorityA - priorityB;
|
|
26
|
+
const precedence = compareFilePrecedence(a, b);
|
|
27
|
+
if (precedence !== 0) {
|
|
28
|
+
return precedence;
|
|
45
29
|
}
|
|
46
30
|
return this.sortKey(a).localeCompare(this.sortKey(b));
|
|
47
31
|
});
|
|
@@ -100,10 +84,6 @@ class AbstractFinder_default {
|
|
|
100
84
|
return void 0;
|
|
101
85
|
}
|
|
102
86
|
}
|
|
103
|
-
priority(file) {
|
|
104
|
-
const priority = _.findIndex(this.priorityDirectories, (dir) => file.file.includes(dir));
|
|
105
|
-
return priority >= 0 ? priority : this.priorityDirectories.length;
|
|
106
|
-
}
|
|
107
87
|
sortKey(file) {
|
|
108
88
|
return toPosixPath(file.import || file.file);
|
|
109
89
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/cli/entrypoint/finder/AbstractFinder.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"sources":["../../../../src/cli/entrypoint/finder/AbstractFinder.ts"],"sourcesContent":["import path from \"path\";\nimport fs from \"fs\";\nimport {createRequire} from \"module\";\nimport {fileURLToPath} from \"url\";\n\nimport {compareFilePrecedence} from \"./utils/filePrecedence\";\n\nimport {toPosixPath} from \"@cli/utils/path\";\nimport {isFile} from \"@cli/utils/fs\";\nimport {getResolvePath, getSourcePath, resolveRootPath} from \"@cli/resolvers/path\";\nimport {resolveAssetsPath, resolveEntrypointPath} from \"@cli/entrypoint/utils\";\n\nimport {ReadonlyConfig} from \"@typing/config\";\nimport {EntrypointFile, EntrypointFinder} from \"@typing/entrypoint\";\n\nexport default abstract class implements EntrypointFinder {\n protected _files?: Set<EntrypointFile>;\n\n private readonly require = createRequire(import.meta.url);\n\n protected abstract getFiles(): Promise<Set<EntrypointFile>>;\n\n protected constructor(protected readonly config: ReadonlyConfig) {}\n\n public clear(): this {\n this._files = undefined;\n\n return this;\n }\n\n public async files(): Promise<Set<EntrypointFile>> {\n if (this._files) {\n return this._files;\n }\n\n const files = Array.from(await this.getFiles()).sort((a, b) => {\n const precedence = compareFilePrecedence(a, b);\n\n if (precedence !== 0) {\n return precedence;\n }\n\n return this.sortKey(a).localeCompare(this.sortKey(b));\n });\n\n return (this._files = new Set(files));\n }\n\n public async empty(): Promise<boolean> {\n return (await this.files()).size === 0;\n }\n\n public async exists(): Promise<boolean> {\n return !(await this.empty());\n }\n\n public holds(file: EntrypointFile): boolean {\n return this._files?.has(file) || false;\n }\n\n protected file(filename: string): EntrypointFile {\n return {file: filename, import: toPosixPath(filename)};\n }\n\n protected resolve(name: string, filename: string): EntrypointFile {\n let base: string = name.startsWith(\"file://\") ? fileURLToPath(name) : name;\n\n if (path.isAbsolute(base)) {\n if (isFile(base)) {\n base = path.dirname(base);\n }\n\n const absBase = path.join(base, filename);\n\n let resolved: string | undefined = isFile(absBase)\n ? absBase\n : (resolveEntrypointPath(absBase) ?? resolveAssetsPath(absBase));\n\n if (!resolved) {\n throw new Error(`Cannot resolve entrypoint file \"${filename}\" from \"${name}\"`);\n }\n\n resolved = fs.realpathSync.native(resolved);\n\n const srcDir = getResolvePath(getSourcePath(this.config));\n\n return {\n file: resolved,\n /**\n * Global alias \"@/\":\n * baked into the framework by the TypeScript plugin\n * (src/cli/plugins/typescript) and points to the sources directory (srcDir).\n * Here we build a relative path from srcDir so that the import looks like \"@/relative/path\".\n * @type {string}\n */\n import: \"@/\" + toPosixPath(path.relative(srcDir, resolved)),\n };\n }\n\n const spec: string = path.posix.join(name, filename);\n\n const file = this.require.resolve(spec, {paths: [resolveRootPath(this.config)]});\n\n return {\n file,\n import: spec,\n external: name,\n };\n }\n\n protected resolveSafely(name: string, filename: string): EntrypointFile | undefined {\n try {\n return this.resolve(name, filename);\n } catch {\n return undefined;\n }\n }\n\n protected sortKey(file: EntrypointFile): string {\n return toPosixPath(file.import || file.file);\n }\n}\n"],"mappings":"AAAA,OAAO,UAAU;AACjB,OAAO,QAAQ;AACf,SAAQ,qBAAoB;AAC5B,SAAQ,qBAAoB;AAE5B,SAAQ,6BAA4B;AAEpC,SAAQ,mBAAkB;AAC1B,SAAQ,cAAa;AACrB,SAAQ,gBAAgB,eAAe,uBAAsB;AAC7D,SAAQ,mBAAmB,6BAA4B;AAKvD,MAAO,uBAAmD;AAAA,EAO5C,YAA+B,QAAwB;AAAxB;AAAA,EAAyB;AAAA,EAAzB;AAAA,EAN/B;AAAA,EAEO,UAAU,cAAc,YAAY,GAAG;AAAA,EAMjD,QAAc;AACjB,SAAK,SAAS;AAEd,WAAO;AAAA,EACX;AAAA,EAEA,MAAa,QAAsC;AAC/C,QAAI,KAAK,QAAQ;AACb,aAAO,KAAK;AAAA,IAChB;AAEA,UAAM,QAAQ,MAAM,KAAK,MAAM,KAAK,SAAS,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM;AAC3D,YAAM,aAAa,sBAAsB,GAAG,CAAC;AAE7C,UAAI,eAAe,GAAG;AAClB,eAAO;AAAA,MACX;AAEA,aAAO,KAAK,QAAQ,CAAC,EAAE,cAAc,KAAK,QAAQ,CAAC,CAAC;AAAA,IACxD,CAAC;AAED,WAAQ,KAAK,SAAS,IAAI,IAAI,KAAK;AAAA,EACvC;AAAA,EAEA,MAAa,QAA0B;AACnC,YAAQ,MAAM,KAAK,MAAM,GAAG,SAAS;AAAA,EACzC;AAAA,EAEA,MAAa,SAA2B;AACpC,WAAO,CAAE,MAAM,KAAK,MAAM;AAAA,EAC9B;AAAA,EAEO,MAAM,MAA+B;AAxDhD;AAyDQ,aAAO,UAAK,WAAL,mBAAa,IAAI,UAAS;AAAA,EACrC;AAAA,EAEU,KAAK,UAAkC;AAC7C,WAAO,EAAC,MAAM,UAAU,QAAQ,YAAY,QAAQ,EAAC;AAAA,EACzD;AAAA,EAEU,QAAQ,MAAc,UAAkC;AAC9D,QAAI,OAAe,KAAK,WAAW,SAAS,IAAI,cAAc,IAAI,IAAI;AAEtE,QAAI,KAAK,WAAW,IAAI,GAAG;AACvB,UAAI,OAAO,IAAI,GAAG;AACd,eAAO,KAAK,QAAQ,IAAI;AAAA,MAC5B;AAEA,YAAM,UAAU,KAAK,KAAK,MAAM,QAAQ;AAExC,UAAI,WAA+B,OAAO,OAAO,IAC3C,UACC,sBAAsB,OAAO,KAAK,kBAAkB,OAAO;AAElE,UAAI,CAAC,UAAU;AACX,cAAM,IAAI,MAAM,mCAAmC,QAAQ,WAAW,IAAI,GAAG;AAAA,MACjF;AAEA,iBAAW,GAAG,aAAa,OAAO,QAAQ;AAE1C,YAAM,SAAS,eAAe,cAAc,KAAK,MAAM,CAAC;AAExD,aAAO;AAAA,QACH,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAQN,QAAQ,OAAO,YAAY,KAAK,SAAS,QAAQ,QAAQ,CAAC;AAAA,MAC9D;AAAA,IACJ;AAEA,UAAM,OAAe,KAAK,MAAM,KAAK,MAAM,QAAQ;AAEnD,UAAM,OAAO,KAAK,QAAQ,QAAQ,MAAM,EAAC,OAAO,CAAC,gBAAgB,KAAK,MAAM,CAAC,EAAC,CAAC;AAE/E,WAAO;AAAA,MACH;AAAA,MACA,QAAQ;AAAA,MACR,UAAU;AAAA,IACd;AAAA,EACJ;AAAA,EAEU,cAAc,MAAc,UAA8C;AAChF,QAAI;AACA,aAAO,KAAK,QAAQ,MAAM,QAAQ;AAAA,IACtC,QAAQ;AACJ,aAAO;AAAA,IACX;AAAA,EACJ;AAAA,EAEU,QAAQ,MAA8B;AAC5C,WAAO,YAAY,KAAK,UAAU,KAAK,IAAI;AAAA,EAC/C;AACJ;","names":[]}
|
|
@@ -23,16 +23,15 @@ class AbstractViewFinder_default extends AbstractPluginFinder {
|
|
|
23
23
|
}
|
|
24
24
|
async getViews() {
|
|
25
25
|
const views = /* @__PURE__ */ new Map();
|
|
26
|
-
|
|
26
|
+
const entries = [...await this.plugin().options()];
|
|
27
|
+
const candidates = this.allowMultiple() ? entries : entries.slice(-1);
|
|
28
|
+
for (const [file, options] of candidates) {
|
|
27
29
|
views.set(this.createViewName(file, options), {
|
|
28
30
|
alias: this.createViewAlias(file, options),
|
|
29
31
|
filename: this.createViewFilename(file, options),
|
|
30
32
|
file,
|
|
31
33
|
options
|
|
32
34
|
});
|
|
33
|
-
if (!this.allowMultiple()) {
|
|
34
|
-
break;
|
|
35
|
-
}
|
|
36
35
|
}
|
|
37
36
|
return views;
|
|
38
37
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/cli/entrypoint/finder/AbstractViewFinder.ts"],"sourcesContent":["import path from \"path\";\n\nimport {InlineNameGenerator, NameGenerator} from \"../name\";\n\nimport AbstractPluginFinder from \"./AbstractPluginFinder\";\n\nimport {ReadonlyConfig} from \"@typing/config\";\nimport {ViewEntrypointOptions} from \"@typing/view\";\nimport {EntrypointFile, EntrypointNameGenerator} from \"@typing/entrypoint\";\n\nexport interface ViewItem<O extends ViewEntrypointOptions> {\n filename: string;\n alias: string;\n file: EntrypointFile;\n options: O;\n}\n\nexport type ViewItems<O extends ViewEntrypointOptions> = Map<string, ViewItem<O>>;\n\nexport type ViewAliasToFilename = Map<string, string>;\n\nexport type ViewFileToFilename = Map<EntrypointFile, string>;\n\nexport default abstract class<O extends ViewEntrypointOptions> extends AbstractPluginFinder<O> {\n protected _views?: ViewItems<O>;\n\n protected readonly names: EntrypointNameGenerator;\n protected readonly aliases: EntrypointNameGenerator;\n protected readonly filenames: EntrypointNameGenerator;\n\n protected constructor(config: ReadonlyConfig) {\n super(config);\n\n this.names = this.createNameGenerator();\n this.aliases = this.createAliasGenerator();\n this.filenames = this.createFilenameGenerator();\n }\n\n protected createNameGenerator(): EntrypointNameGenerator {\n return new NameGenerator(this.type());\n }\n\n protected createAliasGenerator(): EntrypointNameGenerator {\n return new InlineNameGenerator(this.type());\n }\n\n protected createFilenameGenerator(): EntrypointNameGenerator {\n return new NameGenerator(this.type());\n }\n\n protected async getViews(): Promise<ViewItems<O>> {\n const views: ViewItems<O> = new Map();\n\n for (const [file, options] of
|
|
1
|
+
{"version":3,"sources":["../../../../src/cli/entrypoint/finder/AbstractViewFinder.ts"],"sourcesContent":["import path from \"path\";\n\nimport {InlineNameGenerator, NameGenerator} from \"../name\";\n\nimport AbstractPluginFinder from \"./AbstractPluginFinder\";\n\nimport {ReadonlyConfig} from \"@typing/config\";\nimport {ViewEntrypointOptions} from \"@typing/view\";\nimport {EntrypointFile, EntrypointNameGenerator} from \"@typing/entrypoint\";\n\nexport interface ViewItem<O extends ViewEntrypointOptions> {\n filename: string;\n alias: string;\n file: EntrypointFile;\n options: O;\n}\n\nexport type ViewItems<O extends ViewEntrypointOptions> = Map<string, ViewItem<O>>;\n\nexport type ViewAliasToFilename = Map<string, string>;\n\nexport type ViewFileToFilename = Map<EntrypointFile, string>;\n\nexport default abstract class<O extends ViewEntrypointOptions> extends AbstractPluginFinder<O> {\n protected _views?: ViewItems<O>;\n\n protected readonly names: EntrypointNameGenerator;\n protected readonly aliases: EntrypointNameGenerator;\n protected readonly filenames: EntrypointNameGenerator;\n\n protected constructor(config: ReadonlyConfig) {\n super(config);\n\n this.names = this.createNameGenerator();\n this.aliases = this.createAliasGenerator();\n this.filenames = this.createFilenameGenerator();\n }\n\n protected createNameGenerator(): EntrypointNameGenerator {\n return new NameGenerator(this.type());\n }\n\n protected createAliasGenerator(): EntrypointNameGenerator {\n return new InlineNameGenerator(this.type());\n }\n\n protected createFilenameGenerator(): EntrypointNameGenerator {\n return new NameGenerator(this.type());\n }\n\n protected async getViews(): Promise<ViewItems<O>> {\n const views: ViewItems<O> = new Map();\n const entries = [...(await this.plugin().options())];\n const candidates = this.allowMultiple() ? entries : entries.slice(-1);\n\n for (const [file, options] of candidates) {\n views.set(this.createViewName(file, options), {\n alias: this.createViewAlias(file, options),\n filename: this.createViewFilename(file, options),\n file,\n options,\n });\n }\n\n return views;\n }\n\n protected createViewFilename(file: EntrypointFile, options: O): string {\n const {as} = options;\n\n const filename = as ? this.filenames.name(as) : this.filenames.file(file);\n\n return path.posix.join(this.config.htmlDir, filename + \".html\");\n }\n\n protected createViewAlias(file: EntrypointFile, options: O): string {\n const {as} = options;\n\n let alias = as ? this.aliases.name(as) : this.aliases.file(file);\n\n if (file.external) {\n alias = file.import;\n }\n\n return alias;\n }\n\n protected createViewName(file: EntrypointFile, options: O): string {\n const {as} = options;\n\n return as ? this.names.name(as) : this.names.file(file);\n }\n\n public async views(): Promise<ViewItems<O>> {\n return (this._views ??= await this.getViews());\n }\n\n public allowMultiple(): boolean {\n return true;\n }\n\n public async getAliasToFilename(): Promise<ViewAliasToFilename> {\n return Array.from(await this.views()).reduce((aliases, [_, item]) => {\n return {\n ...aliases,\n [item.alias]: item.filename,\n };\n }, new Map() as ViewAliasToFilename);\n }\n\n public async getAlias(): Promise<Set<string>> {\n const aliases = new Set<string>();\n\n const views = await this.views();\n\n for (const item of views.values()) {\n aliases.add(item.alias);\n }\n\n return aliases;\n }\n\n public async getFilenames(): Promise<ViewFileToFilename> {\n const views = await this.views();\n\n const filenames: ViewFileToFilename = new Map();\n\n for (const {file, filename} of views.values()) {\n filenames.set(file, filename);\n }\n\n return filenames;\n }\n\n public clear(): this {\n this._views = undefined;\n\n this.names.reset();\n this.aliases.reset();\n this.filenames.reset();\n\n return super.clear();\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -3,6 +3,7 @@ import path from "path";
|
|
|
3
3
|
import pluralize from "pluralize";
|
|
4
4
|
import { processPluginHandler } from "./../../../cli/resolvers/plugin.js";
|
|
5
5
|
import AbstractFinder from "./AbstractFinder.js";
|
|
6
|
+
import { FileLayer, FileSpecificity, setFilePrecedence, setFileSpecificity } from "./utils/filePrecedence.js";
|
|
6
7
|
class AssetPluginFinder_default extends AbstractFinder {
|
|
7
8
|
constructor(config, key, finder) {
|
|
8
9
|
super(config);
|
|
@@ -18,7 +19,8 @@ class AssetPluginFinder_default extends AbstractFinder {
|
|
|
18
19
|
})
|
|
19
20
|
);
|
|
20
21
|
const files = /* @__PURE__ */ new Set();
|
|
21
|
-
for
|
|
22
|
+
for (let pluginIndex = 0; pluginIndex < pluginResult.length; pluginIndex++) {
|
|
23
|
+
let { name, result } = pluginResult[pluginIndex];
|
|
22
24
|
if (_.isBoolean(result)) {
|
|
23
25
|
result = pluralize(this.key);
|
|
24
26
|
}
|
|
@@ -26,6 +28,7 @@ class AssetPluginFinder_default extends AbstractFinder {
|
|
|
26
28
|
result = await this.findFiles(name, result);
|
|
27
29
|
}
|
|
28
30
|
if (_.isArray(result) || _.isSet(result)) {
|
|
31
|
+
let sequence = 0;
|
|
29
32
|
for (const item of result) {
|
|
30
33
|
if (_.isEmpty(item)) {
|
|
31
34
|
continue;
|
|
@@ -45,7 +48,17 @@ class AssetPluginFinder_default extends AbstractFinder {
|
|
|
45
48
|
}
|
|
46
49
|
const { name: filename } = path.parse(file.file);
|
|
47
50
|
if (filename.endsWith(`.${this.config.browser}`) || !filename.includes(".")) {
|
|
51
|
+
setFilePrecedence(file, {
|
|
52
|
+
layer: FileLayer.Plugin,
|
|
53
|
+
order: pluginIndex,
|
|
54
|
+
sequence
|
|
55
|
+
});
|
|
56
|
+
setFileSpecificity(
|
|
57
|
+
file,
|
|
58
|
+
filename.endsWith(`.${this.config.browser}`) ? FileSpecificity.Browser : FileSpecificity.Generic
|
|
59
|
+
);
|
|
48
60
|
files.add(file);
|
|
61
|
+
sequence++;
|
|
49
62
|
}
|
|
50
63
|
}
|
|
51
64
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/cli/entrypoint/finder/AssetPluginFinder.ts"],"sourcesContent":["import _ from \"lodash\";\nimport path from \"path\";\nimport pluralize from \"pluralize\";\n\nimport {processPluginHandler} from \"@cli/resolvers/plugin\";\n\nimport AbstractFinder from \"./AbstractFinder\";\nimport AbstractAssetFinder from \"./AbstractAssetFinder\";\n\nimport {EntrypointFile} from \"@typing/entrypoint\";\nimport {ReadonlyConfig} from \"@typing/config\";\nimport {PluginAssetKeys} from \"@typing/plugin\";\n\nexport default class extends AbstractFinder {\n constructor(\n config: ReadonlyConfig,\n protected readonly key: PluginAssetKeys,\n protected readonly finder: AbstractAssetFinder\n ) {\n super(config);\n }\n\n protected async getFiles(): Promise<Set<EntrypointFile>> {\n const pluginResult = await Array.fromAsync(\n processPluginHandler(this.config.plugins, this.key, {\n config: this.config,\n })\n );\n\n const files = new Set<EntrypointFile>();\n\n for
|
|
1
|
+
{"version":3,"sources":["../../../../src/cli/entrypoint/finder/AssetPluginFinder.ts"],"sourcesContent":["import _ from \"lodash\";\nimport path from \"path\";\nimport pluralize from \"pluralize\";\n\nimport {processPluginHandler} from \"@cli/resolvers/plugin\";\n\nimport AbstractFinder from \"./AbstractFinder\";\nimport AbstractAssetFinder from \"./AbstractAssetFinder\";\nimport {FileLayer, FileSpecificity, setFilePrecedence, setFileSpecificity} from \"./utils/filePrecedence\";\n\nimport {EntrypointFile} from \"@typing/entrypoint\";\nimport {ReadonlyConfig} from \"@typing/config\";\nimport {PluginAssetKeys} from \"@typing/plugin\";\n\nexport default class extends AbstractFinder {\n constructor(\n config: ReadonlyConfig,\n protected readonly key: PluginAssetKeys,\n protected readonly finder: AbstractAssetFinder\n ) {\n super(config);\n }\n\n protected async getFiles(): Promise<Set<EntrypointFile>> {\n const pluginResult = await Array.fromAsync(\n processPluginHandler(this.config.plugins, this.key, {\n config: this.config,\n })\n );\n\n // Plugin files preserve registration identity, order and sequence.\n // Canonical-path deduplication is intentionally limited to overlapping\n // workspace paths in AbstractAssetFinder.\n const files = new Set<EntrypointFile>();\n\n for (let pluginIndex = 0; pluginIndex < pluginResult.length; pluginIndex++) {\n let {name, result} = pluginResult[pluginIndex];\n\n if (_.isBoolean(result)) {\n result = pluralize(this.key);\n }\n\n if (_.isString(result)) {\n result = await this.findFiles(name, result);\n }\n\n if (_.isArray(result) || _.isSet(result)) {\n let sequence = 0;\n\n for (const item of result) {\n if (_.isEmpty(item)) {\n continue;\n }\n\n let file: EntrypointFile;\n\n if (_.isString(item) && this.finder.isValidFilename(item)) {\n file = this.file(item);\n } else if (_.isPlainObject(item)) {\n const {file: filename} = item as EntrypointFile;\n\n if (filename && this.finder.isValidFilename(filename)) {\n file = item as EntrypointFile;\n } else {\n continue;\n }\n } else {\n continue;\n }\n\n const {name: filename} = path.parse(file.file);\n\n if (filename.endsWith(`.${this.config.browser}`) || !filename.includes(\".\")) {\n setFilePrecedence(file, {\n layer: FileLayer.Plugin,\n order: pluginIndex,\n sequence,\n });\n setFileSpecificity(\n file,\n filename.endsWith(`.${this.config.browser}`)\n ? FileSpecificity.Browser\n : FileSpecificity.Generic\n );\n files.add(file);\n sequence++;\n }\n }\n }\n }\n\n return files;\n }\n\n protected async findFiles(name: string, directory: string): Promise<Set<EntrypointFile>> {\n const files = new Set<EntrypointFile>();\n const resolve = (file: string) => this.resolveSafely(name, path.posix.join(directory, file));\n\n for (const name of this.finder.getNames()) {\n for (const file of [resolve(name), resolve(`${name}.${this.config.browser}`)]) {\n if (file) {\n files.add(file);\n }\n }\n }\n\n return files;\n }\n}\n"],"mappings":"AAAA,OAAO,OAAO;AACd,OAAO,UAAU;AACjB,OAAO,eAAe;AAEtB,SAAQ,4BAA2B;AAEnC,OAAO,oBAAoB;AAE3B,SAAQ,WAAW,iBAAiB,mBAAmB,0BAAyB;AAMhF,MAAO,kCAAsB,eAAe;AAAA,EACxC,YACI,QACmB,KACA,QACrB;AACE,UAAM,MAAM;AAHO;AACA;AAAA,EAGvB;AAAA,EAJuB;AAAA,EACA;AAAA,EAKvB,MAAgB,WAAyC;AACrD,UAAM,eAAe,MAAM,MAAM;AAAA,MAC7B,qBAAqB,KAAK,OAAO,SAAS,KAAK,KAAK;AAAA,QAChD,QAAQ,KAAK;AAAA,MACjB,CAAC;AAAA,IACL;AAKA,UAAM,QAAQ,oBAAI,IAAoB;AAEtC,aAAS,cAAc,GAAG,cAAc,aAAa,QAAQ,eAAe;AACxE,UAAI,EAAC,MAAM,OAAM,IAAI,aAAa,WAAW;AAE7C,UAAI,EAAE,UAAU,MAAM,GAAG;AACrB,iBAAS,UAAU,KAAK,GAAG;AAAA,MAC/B;AAEA,UAAI,EAAE,SAAS,MAAM,GAAG;AACpB,iBAAS,MAAM,KAAK,UAAU,MAAM,MAAM;AAAA,MAC9C;AAEA,UAAI,EAAE,QAAQ,MAAM,KAAK,EAAE,MAAM,MAAM,GAAG;AACtC,YAAI,WAAW;AAEf,mBAAW,QAAQ,QAAQ;AACvB,cAAI,EAAE,QAAQ,IAAI,GAAG;AACjB;AAAA,UACJ;AAEA,cAAI;AAEJ,cAAI,EAAE,SAAS,IAAI,KAAK,KAAK,OAAO,gBAAgB,IAAI,GAAG;AACvD,mBAAO,KAAK,KAAK,IAAI;AAAA,UACzB,WAAW,EAAE,cAAc,IAAI,GAAG;AAC9B,kBAAM,EAAC,MAAMA,UAAQ,IAAI;AAEzB,gBAAIA,aAAY,KAAK,OAAO,gBAAgBA,SAAQ,GAAG;AACnD,qBAAO;AAAA,YACX,OAAO;AACH;AAAA,YACJ;AAAA,UACJ,OAAO;AACH;AAAA,UACJ;AAEA,gBAAM,EAAC,MAAM,SAAQ,IAAI,KAAK,MAAM,KAAK,IAAI;AAE7C,cAAI,SAAS,SAAS,IAAI,KAAK,OAAO,OAAO,EAAE,KAAK,CAAC,SAAS,SAAS,GAAG,GAAG;AACzE,8BAAkB,MAAM;AAAA,cACpB,OAAO,UAAU;AAAA,cACjB,OAAO;AAAA,cACP;AAAA,YACJ,CAAC;AACD;AAAA,cACI;AAAA,cACA,SAAS,SAAS,IAAI,KAAK,OAAO,OAAO,EAAE,IACrC,gBAAgB,UAChB,gBAAgB;AAAA,YAC1B;AACA,kBAAM,IAAI,IAAI;AACd;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA,EAEA,MAAgB,UAAU,MAAc,WAAiD;AACrF,UAAM,QAAQ,oBAAI,IAAoB;AACtC,UAAM,UAAU,CAAC,SAAiB,KAAK,cAAc,MAAM,KAAK,MAAM,KAAK,WAAW,IAAI,CAAC;AAE3F,eAAWC,SAAQ,KAAK,OAAO,SAAS,GAAG;AACvC,iBAAW,QAAQ,CAAC,QAAQA,KAAI,GAAG,QAAQ,GAAGA,KAAI,IAAI,KAAK,OAAO,OAAO,EAAE,CAAC,GAAG;AAC3E,YAAI,MAAM;AACN,gBAAM,IAAI,IAAI;AAAA,QAClB;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AACJ;","names":["filename","name"]}
|
|
@@ -2,6 +2,7 @@ import AbstractAssetFinder from "./AbstractAssetFinder.js";
|
|
|
2
2
|
import AssetPluginFinder from "./AssetPluginFinder.js";
|
|
3
3
|
import { LocaleStructureValidator } from "../../builders/locale/index.js";
|
|
4
4
|
import { ReadonlyConfig } from "../../../types/config.js";
|
|
5
|
+
import { EntrypointFile } from "../../../types/entrypoint.js";
|
|
5
6
|
import { Language, LocaleBuilders, LocaleKeys, LocaleStructure } from "../../../types/locale.js";
|
|
6
7
|
export type { LocaleBuilders } from "../../../types/locale.js";
|
|
7
8
|
export default class extends AbstractAssetFinder {
|
|
@@ -18,6 +19,7 @@ export default class extends AbstractAssetFinder {
|
|
|
18
19
|
protected getPlugin(): AssetPluginFinder;
|
|
19
20
|
plugin(): AssetPluginFinder;
|
|
20
21
|
protected getBuilders(): Promise<LocaleBuilders>;
|
|
22
|
+
protected assertUniqueFiles(lang: Language, files: EntrypointFile[]): void;
|
|
21
23
|
protected getValidator(): LocaleStructureValidator;
|
|
22
24
|
protected getLanguageFromFilename(filename: string): Language;
|
|
23
25
|
builders(): Promise<LocaleBuilders>;
|
|
@@ -4,12 +4,24 @@ import fs from "fs";
|
|
|
4
4
|
import yaml from "js-yaml";
|
|
5
5
|
import AbstractAssetFinder from "./AbstractAssetFinder.js";
|
|
6
6
|
import AssetPluginFinder from "./AssetPluginFinder.js";
|
|
7
|
+
import { FileLayer, FileSpecificity, getFilePrecedence } from "./utils/filePrecedence.js";
|
|
7
8
|
import localeFactory, { LocaleStructureValidator } from "./../../../cli/builders/locale/index.js";
|
|
8
9
|
import { isFileExtension } from "./../../../cli/utils/path.js";
|
|
9
10
|
import {
|
|
10
11
|
LanguageCodes,
|
|
11
12
|
LocaleFileExtensions
|
|
12
13
|
} from "./../../../types/locale.js";
|
|
14
|
+
const layerNames = {
|
|
15
|
+
[FileLayer.Plugin]: "plugin",
|
|
16
|
+
[FileLayer.Source]: "source",
|
|
17
|
+
[FileLayer.Shared]: "shared",
|
|
18
|
+
[FileLayer.App]: "app",
|
|
19
|
+
[FileLayer.AppSource]: "app source"
|
|
20
|
+
};
|
|
21
|
+
const specificityNames = {
|
|
22
|
+
[FileSpecificity.Generic]: "generic",
|
|
23
|
+
[FileSpecificity.Browser]: "browser-specific"
|
|
24
|
+
};
|
|
13
25
|
class LocaleFinder_default extends AbstractAssetFinder {
|
|
14
26
|
_plugin;
|
|
15
27
|
_builders;
|
|
@@ -44,6 +56,7 @@ class LocaleFinder_default extends AbstractAssetFinder {
|
|
|
44
56
|
}
|
|
45
57
|
async getBuilders() {
|
|
46
58
|
return _.chain(Array.from(await this.plugin().files())).groupBy((file) => this.getLanguageFromFilename(file.file)).reduce((map, files, lang) => {
|
|
59
|
+
this.assertUniqueFiles(lang, files);
|
|
47
60
|
const locale = localeFactory(lang, this.config);
|
|
48
61
|
for (const { file } of files) {
|
|
49
62
|
const content = fs.readFileSync(file, "utf8");
|
|
@@ -57,6 +70,20 @@ class LocaleFinder_default extends AbstractAssetFinder {
|
|
|
57
70
|
return map;
|
|
58
71
|
}, /* @__PURE__ */ new Map()).value();
|
|
59
72
|
}
|
|
73
|
+
assertUniqueFiles(lang, files) {
|
|
74
|
+
const sources = /* @__PURE__ */ new Map();
|
|
75
|
+
for (const file of files) {
|
|
76
|
+
const { layer, order, specificity } = getFilePrecedence(file);
|
|
77
|
+
const source = [layer, order, specificity].join(":");
|
|
78
|
+
const duplicate = sources.get(source);
|
|
79
|
+
if (duplicate) {
|
|
80
|
+
throw new Error(
|
|
81
|
+
`Locale "${lang}" has multiple ${specificityNames[specificity]} files in the ${layerNames[layer]} layer: "${duplicate.file}" and "${file.file}"`
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
sources.set(source, file);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
60
87
|
getValidator() {
|
|
61
88
|
return this._validator ?? (this._validator = new LocaleStructureValidator(this.config.lang));
|
|
62
89
|
}
|