@inlang/paraglide-js 2.27.0 → 2.28.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/README.md +9 -0
- package/dist/bundler-plugins/per-locale-build/index.js +14 -7
- package/dist/bundler-plugins/per-locale-build/index.js.map +1 -1
- package/dist/bundler-plugins/per-locale-build/vite-environments.test.js +235 -2
- package/dist/bundler-plugins/per-locale-build/vite-environments.test.js.map +1 -1
- package/dist/bundler-plugins/unplugin.d.ts +1 -1
- package/dist/bundler-plugins/unplugin.js +79 -10
- package/dist/bundler-plugins/unplugin.js.map +1 -1
- package/dist/bundler-plugins/unplugin.test.js +334 -1
- package/dist/bundler-plugins/unplugin.test.js.map +1 -1
- package/dist/bundler-plugins/vite.js +2 -1
- package/dist/bundler-plugins/vite.js.map +1 -1
- package/dist/bundler-plugins/vite.test.js +1 -1
- package/dist/bundler-plugins/vite.test.js.map +1 -1
- package/dist/cli/commands/compile/command.js +13 -0
- package/dist/cli/commands/compile/command.js.map +1 -1
- package/dist/cli/commands/compile/command.test.js +87 -3
- package/dist/cli/commands/compile/command.test.js.map +1 -1
- package/dist/cli/commands/init/command.d.ts +5 -0
- package/dist/cli/commands/init/command.js +213 -59
- package/dist/cli/commands/init/command.js.map +1 -1
- package/dist/cli/commands/init/command.test.d.ts +1 -0
- package/dist/cli/commands/init/command.test.js +123 -0
- package/dist/cli/commands/init/command.test.js.map +1 -0
- package/dist/cli/init-options.d.ts +11 -0
- package/dist/cli/init-options.js +2 -0
- package/dist/cli/init-options.js.map +1 -0
- package/dist/cli/steps/add-inlang-check.js +2 -2
- package/dist/cli/steps/add-inlang-check.js.map +1 -1
- package/dist/cli/steps/add-message-lint.d.ts +34 -0
- package/dist/cli/steps/add-message-lint.js +105 -0
- package/dist/cli/steps/add-message-lint.js.map +1 -0
- package/dist/cli/steps/add-message-lint.test.d.ts +1 -0
- package/dist/cli/steps/add-message-lint.test.js +74 -0
- package/dist/cli/steps/add-message-lint.test.js.map +1 -0
- package/dist/cli/steps/add-vite-plugin.d.ts +18 -0
- package/dist/cli/steps/add-vite-plugin.js +34 -6
- package/dist/cli/steps/add-vite-plugin.js.map +1 -1
- package/dist/cli/steps/add-vite-plugin.test.js +25 -9
- package/dist/cli/steps/add-vite-plugin.test.js.map +1 -1
- package/dist/cli/steps/check-for-uncomitted-changes.d.ts +3 -0
- package/dist/cli/steps/check-for-uncomitted-changes.js +15 -3
- package/dist/cli/steps/check-for-uncomitted-changes.js.map +1 -1
- package/dist/cli/steps/detect-bundler.d.ts +1 -0
- package/dist/cli/steps/detect-bundler.js +7 -1
- package/dist/cli/steps/detect-bundler.js.map +1 -1
- package/dist/cli/steps/initialize-inlang-project.d.ts +4 -3
- package/dist/cli/steps/initialize-inlang-project.js +60 -157
- package/dist/cli/steps/initialize-inlang-project.js.map +1 -1
- package/dist/cli/steps/maybe-add-machine-translation.d.ts +4 -0
- package/dist/cli/steps/maybe-add-machine-translation.js +11 -6
- package/dist/cli/steps/maybe-add-machine-translation.js.map +1 -1
- package/dist/cli/steps/maybe-add-sherlock.d.ts +2 -0
- package/dist/cli/steps/maybe-add-sherlock.js +12 -6
- package/dist/cli/steps/maybe-add-sherlock.js.map +1 -1
- package/dist/cli/steps/maybe-add-sherlock.test.d.ts +1 -0
- package/dist/cli/steps/maybe-add-sherlock.test.js +44 -0
- package/dist/cli/steps/maybe-add-sherlock.test.js.map +1 -0
- package/dist/cli/steps/prompt-for-outdir.d.ts +2 -0
- package/dist/cli/steps/prompt-for-outdir.js +4 -0
- package/dist/cli/steps/prompt-for-outdir.js.map +1 -1
- package/dist/cli/steps/update-package-json.js +8 -13
- package/dist/cli/steps/update-package-json.js.map +1 -1
- package/dist/cli/steps/update-ts-config.d.ts +6 -0
- package/dist/cli/steps/update-ts-config.js +27 -4
- package/dist/cli/steps/update-ts-config.js.map +1 -1
- package/dist/cli/utils.d.ts +2 -0
- package/dist/cli/utils.js +6 -0
- package/dist/cli/utils.js.map +1 -1
- package/dist/cli/utils.test.d.ts +1 -0
- package/dist/cli/utils.test.js +16 -0
- package/dist/cli/utils.test.js.map +1 -0
- package/dist/compiler/compile-annotation.js +6 -1
- package/dist/compiler/compile-annotation.js.map +1 -1
- package/dist/compiler/compile-bundle.d.ts +4 -0
- package/dist/compiler/compile-bundle.js +67 -2
- package/dist/compiler/compile-bundle.js.map +1 -1
- package/dist/compiler/compile-bundle.test.js +214 -1
- package/dist/compiler/compile-bundle.test.js.map +1 -1
- package/dist/compiler/compile-lifecycle.test.d.ts +1 -0
- package/dist/compiler/compile-lifecycle.test.js +69 -0
- package/dist/compiler/compile-lifecycle.test.js.map +1 -0
- package/dist/compiler/compile-local-variable.test.js +14 -14
- package/dist/compiler/compile-local-variable.test.js.map +1 -1
- package/dist/compiler/compile-message.exact-number.test.js +1 -1
- package/dist/compiler/compile-message.exact-number.test.js.map +1 -1
- package/dist/compiler/compile-message.locals.test.js +1 -1
- package/dist/compiler/compile-message.locals.test.js.map +1 -1
- package/dist/compiler/compile-message.test.js +2 -2
- package/dist/compiler/compile-message.test.js.map +1 -1
- package/dist/compiler/compile-pattern.test.js +5 -5
- package/dist/compiler/compile-pattern.test.js.map +1 -1
- package/dist/compiler/compile-project.js +1 -0
- package/dist/compiler/compile-project.js.map +1 -1
- package/dist/compiler/compile-project.test.js +94 -1
- package/dist/compiler/compile-project.test.js.map +1 -1
- package/dist/compiler/compile.js +36 -17
- package/dist/compiler/compile.js.map +1 -1
- package/dist/compiler/compile.test.js +70 -0
- package/dist/compiler/compile.test.js.map +1 -1
- package/dist/compiler/compiler-options.d.ts +41 -0
- package/dist/compiler/compiler-options.js.map +1 -1
- package/dist/compiler/output-structure/message-modules.js +1 -1
- package/dist/compiler/output-structure/message-modules.js.map +1 -1
- package/dist/compiler/registry.js +71 -13
- package/dist/compiler/registry.js.map +1 -1
- package/dist/compiler/registry.test.d.ts +1 -0
- package/dist/compiler/registry.test.js +291 -0
- package/dist/compiler/registry.test.js.map +1 -0
- package/dist/compiler/runtime/create-runtime.d.ts +2 -0
- package/dist/compiler/runtime/create-runtime.js +9 -0
- package/dist/compiler/runtime/create-runtime.js.map +1 -1
- package/dist/compiler/runtime/extract-locale-from-cookie.js +8 -1
- package/dist/compiler/runtime/extract-locale-from-cookie.js.map +1 -1
- package/dist/compiler/runtime/extract-locale-from-cookie.test.js +26 -0
- package/dist/compiler/runtime/extract-locale-from-cookie.test.js.map +1 -1
- package/dist/compiler/runtime/extract-locale-from-header.js +47 -5
- package/dist/compiler/runtime/extract-locale-from-header.js.map +1 -1
- package/dist/compiler/runtime/extract-locale-from-header.test.js +58 -0
- package/dist/compiler/runtime/extract-locale-from-header.test.js.map +1 -1
- package/dist/compiler/runtime/get-locale.js +7 -1
- package/dist/compiler/runtime/get-locale.js.map +1 -1
- package/dist/compiler/runtime/get-locale.test.js +95 -0
- package/dist/compiler/runtime/get-locale.test.js.map +1 -1
- package/dist/compiler/runtime/localize-href.d.ts +8 -0
- package/dist/compiler/runtime/localize-href.js +60 -0
- package/dist/compiler/runtime/localize-href.js.map +1 -1
- package/dist/compiler/runtime/localize-href.test.js +227 -1
- package/dist/compiler/runtime/localize-href.test.js.map +1 -1
- package/dist/compiler/runtime/set-locale.js +24 -6
- package/dist/compiler/runtime/set-locale.js.map +1 -1
- package/dist/compiler/runtime/set-locale.test.js +182 -0
- package/dist/compiler/runtime/set-locale.test.js.map +1 -1
- package/dist/compiler/runtime/type.d.ts +2 -0
- package/dist/compiler/runtime/type.js.map +1 -1
- package/dist/compiler/runtime/type.test.js +34 -0
- package/dist/compiler/runtime/type.test.js.map +1 -1
- package/dist/compiler/runtime/variables.d.ts +2 -0
- package/dist/compiler/runtime/variables.js +7 -0
- package/dist/compiler/runtime/variables.js.map +1 -1
- package/dist/compiler/server/middleware.d.ts +8 -2
- package/dist/compiler/server/middleware.js +175 -7
- package/dist/compiler/server/middleware.js.map +1 -1
- package/dist/compiler/server/middleware.test.js +750 -3
- package/dist/compiler/server/middleware.test.js.map +1 -1
- package/dist/eslint/index.d.ts +4 -0
- package/dist/eslint/index.js +8 -0
- package/dist/eslint/index.js.map +1 -0
- package/dist/eslint/no-dynamic-message-access.d.ts +3 -0
- package/dist/eslint/no-dynamic-message-access.js +150 -0
- package/dist/eslint/no-dynamic-message-access.js.map +1 -0
- package/dist/eslint/no-dynamic-message-access.test.d.ts +1 -0
- package/dist/eslint/no-dynamic-message-access.test.js +126 -0
- package/dist/eslint/no-dynamic-message-access.test.js.map +1 -0
- package/dist/eslint/oxlint.test.d.ts +1 -0
- package/dist/eslint/oxlint.test.js +64 -0
- package/dist/eslint/oxlint.test.js.map +1 -0
- package/dist/services/config/config-schema.d.ts +2 -0
- package/dist/services/config/config-schema.js +2 -0
- package/dist/services/config/config-schema.js.map +1 -1
- package/dist/services/config/load-paraglide-config.test.js +12 -0
- package/dist/services/config/load-paraglide-config.test.js.map +1 -1
- package/dist/services/env-variables/index.js +1 -1
- package/dist/services/env-variables/index.js.map +1 -1
- package/dist/services/file-handling/write-output.bench.js +51 -11
- package/dist/services/file-handling/write-output.bench.js.map +1 -1
- package/dist/services/file-handling/write-output.js +60 -20
- package/dist/services/file-handling/write-output.js.map +1 -1
- package/dist/services/file-handling/write-output.test.js +175 -0
- package/dist/services/file-handling/write-output.test.js.map +1 -1
- package/package.json +14 -4
package/README.md
CHANGED
|
@@ -203,6 +203,15 @@ Route code stays TanStack-native: TanStack Router owns route trees, loaders, ser
|
|
|
203
203
|
npx @inlang/paraglide-js init
|
|
204
204
|
```
|
|
205
205
|
|
|
206
|
+
Coding agents and CI can run init without a terminal UI:
|
|
207
|
+
|
|
208
|
+
```sh
|
|
209
|
+
npx @inlang/paraglide-js init --yes --outdir ./src/paraglide --lint eslint
|
|
210
|
+
# Or choose --lint oxlint; omit --lint to skip lint setup.
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
`--non-interactive` is an alias for `--yes`. Existing inlang projects are reused, and optional editor recommendations and machine translation are skipped unless explicitly enabled. Dirty git trees require `--allow-dirty`. Use `--no-compile` to stage setup before installing dependencies; then run your build. Run `init --help` for the other options. See [optional lint setup](https://paraglidejs.com/basics#eslint-and-oxlint).
|
|
214
|
+
|
|
206
215
|
Stable and production-ready — `@inlang/paraglide-js` is on v2 (MIT-licensed), with framework adapters like `@inlang/paraglide-js-react` at v1.
|
|
207
216
|
|
|
208
217
|
The CLI sets up everything:
|
|
@@ -20,9 +20,22 @@ export function createPerLocaleBuildPlugins(args) {
|
|
|
20
20
|
// an explicitly configured root here so it is available in time;
|
|
21
21
|
// `configResolved` still overwrites it with Vite's final value
|
|
22
22
|
// (covering roots supplied via CLI flags).
|
|
23
|
-
config(config) {
|
|
23
|
+
async config(config, environment) {
|
|
24
24
|
if (config.root !== undefined)
|
|
25
25
|
discoveryRoot = config.root;
|
|
26
|
+
if (environment.command === "serve") {
|
|
27
|
+
let loaded;
|
|
28
|
+
try {
|
|
29
|
+
loaded = await loadParaglideConfig({
|
|
30
|
+
projectDir: resolve(discoveryRoot ?? process.cwd(), args.compilerOptions.project),
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// The compiler plugin owns diagnostics and recovery in dev.
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
validateExplicitCompilerOptions(args.compilerOptions, loaded?.config);
|
|
38
|
+
}
|
|
26
39
|
},
|
|
27
40
|
configResolved(config) {
|
|
28
41
|
discoveryRoot = config.root;
|
|
@@ -37,7 +50,6 @@ export function createPerLocaleBuildPlugins(args) {
|
|
|
37
50
|
function createPerLocaleCompilerOptions(compilerOptions) {
|
|
38
51
|
return {
|
|
39
52
|
...compilerOptions,
|
|
40
|
-
outputStructure: compilerOptions.outputStructure ?? "locale-modules",
|
|
41
53
|
experimentalStaticLocale: perLocaleBuildStaticLocaleExpression,
|
|
42
54
|
// Only forward additionalFiles when explicitly supplied — an empty
|
|
43
55
|
// object would override files provided by paraglide.config.*.
|
|
@@ -55,7 +67,6 @@ function validateExplicitCompilerOptions(options, config) {
|
|
|
55
67
|
experimentalStaticLocale: options.experimentalStaticLocale ?? config?.experimentalStaticLocale,
|
|
56
68
|
experimentalMiddlewareLocaleSplitting: options.experimentalMiddlewareLocaleSplitting ??
|
|
57
69
|
config?.experimentalMiddlewareLocaleSplitting,
|
|
58
|
-
outputStructure: options.outputStructure ?? config?.outputStructure,
|
|
59
70
|
};
|
|
60
71
|
if (explicit.experimentalStaticLocale !== undefined) {
|
|
61
72
|
throw new Error("experimentalPerLocaleBuild cannot be combined with experimentalStaticLocale because it controls the compiler's static locale expression.");
|
|
@@ -63,10 +74,6 @@ function validateExplicitCompilerOptions(options, config) {
|
|
|
63
74
|
if (explicit.experimentalMiddlewareLocaleSplitting) {
|
|
64
75
|
throw new Error("experimentalPerLocaleBuild cannot be combined with experimentalMiddlewareLocaleSplitting.");
|
|
65
76
|
}
|
|
66
|
-
if (explicit.outputStructure !== undefined &&
|
|
67
|
-
explicit.outputStructure !== "locale-modules") {
|
|
68
|
-
throw new Error('experimentalPerLocaleBuild requires outputStructure: "locale-modules".');
|
|
69
|
-
}
|
|
70
77
|
}
|
|
71
78
|
async function loadSettings(options, discoveryRoot) {
|
|
72
79
|
const root = discoveryRoot ?? process.cwd();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/bundler-plugins/per-locale-build/index.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAEvD,OAAO,EAAE,oCAAoC,EAAE,MAAM,oCAAoC,CAAC;AAE1F,OAAO,EAAE,iCAAiC,EAAE,MAAM,wBAAwB,CAAC;AAC3E,OAAO,EACN,mBAAmB,EACnB,sBAAsB,GAEtB,MAAM,gCAAgC,CAAC;AAGxC,MAAM,UAAU,2BAA2B,CAAC,IAG3C;IACA,+DAA+D;IAC/D,gDAAgD;IAChD,+BAA+B,CAAC,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;IACjE,MAAM,eAAe,GAAG,8BAA8B,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC7E,uEAAuE;IACvE,IAAI,aAAiC,CAAC;IACtC,OAAO;QACN;YACC,IAAI,EAAE,iCAAiC;YACvC,OAAO,EAAE,KAAK;YACd,4DAA4D;YAC5D,iEAAiE;YACjE,iEAAiE;YACjE,+DAA+D;YAC/D,2CAA2C;YAC3C,MAAM,CAAC,MAAM;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/bundler-plugins/per-locale-build/index.ts"],"names":[],"mappings":"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","sourcesContent":["import nodeFs from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { loadProjectFromDirectory } from \"@inlang/sdk\";\nimport type { Plugin } from \"vite\";\nimport { perLocaleBuildStaticLocaleExpression } from \"../../compiler/per-locale-build.js\";\nimport type { PerLocaleBuildSettings } from \"./types.js\";\nimport { createViteLocaleEnvironmentPlugin } from \"./vite-environments.js\";\nimport {\n\tloadParaglideConfig,\n\tresolveCompilerOptions,\n\ttype ParaglideConfig,\n} from \"../../services/config/index.js\";\nimport type { ParaglidePluginOptions } from \"../unplugin.js\";\n\nexport function createPerLocaleBuildPlugins(args: {\n\tcompilerOptions: ParaglidePluginOptions;\n\tcreateCompilerPlugin: (options: ParaglidePluginOptions) => Plugin;\n}): Plugin[] {\n\t// Config file values are not known yet — they are validated in\n\t// loadSettings once the config has been loaded.\n\tvalidateExplicitCompilerOptions(args.compilerOptions, undefined);\n\tconst compilerOptions = createPerLocaleCompilerOptions(args.compilerOptions);\n\t// Project root as reported by vite. Config file discovery starts here.\n\tlet discoveryRoot: string | undefined;\n\treturn [\n\t\t{\n\t\t\tname: \"paraglide-config-discovery-root\",\n\t\t\tenforce: \"pre\",\n\t\t\t// The locale-environment plugin loads settings from its own\n\t\t\t// `config` hook, which runs BEFORE any `configResolved`. Capture\n\t\t\t// an explicitly configured root here so it is available in time;\n\t\t\t// `configResolved` still overwrites it with Vite's final value\n\t\t\t// (covering roots supplied via CLI flags).\n\t\t\tasync config(config, environment) {\n\t\t\t\tif (config.root !== undefined) discoveryRoot = config.root;\n\t\t\t\tif (environment.command === \"serve\") {\n\t\t\t\t\tlet loaded;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tloaded = await loadParaglideConfig({\n\t\t\t\t\t\t\tprojectDir: resolve(\n\t\t\t\t\t\t\t\tdiscoveryRoot ?? process.cwd(),\n\t\t\t\t\t\t\t\targs.compilerOptions.project\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// The compiler plugin owns diagnostics and recovery in dev.\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tvalidateExplicitCompilerOptions(args.compilerOptions, loaded?.config);\n\t\t\t\t}\n\t\t\t},\n\t\t\tconfigResolved(config) {\n\t\t\t\tdiscoveryRoot = config.root;\n\t\t\t},\n\t\t},\n\t\targs.createCompilerPlugin(compilerOptions),\n\t\tcreateViteLocaleEnvironmentPlugin({\n\t\t\tsettings: () => loadSettings(args.compilerOptions, discoveryRoot),\n\t\t}),\n\t];\n}\n\nfunction createPerLocaleCompilerOptions(\n\tcompilerOptions: ParaglidePluginOptions\n): ParaglidePluginOptions {\n\treturn {\n\t\t...compilerOptions,\n\t\texperimentalStaticLocale: perLocaleBuildStaticLocaleExpression,\n\t\t// Only forward additionalFiles when explicitly supplied — an empty\n\t\t// object would override files provided by paraglide.config.*.\n\t\t...(compilerOptions.additionalFiles !== undefined\n\t\t\t? { additionalFiles: { ...compilerOptions.additionalFiles } }\n\t\t\t: {}),\n\t};\n}\n\n// Values that come from the paraglide config file are only known after\n// loading it, so conflicts are checked against both sources here. Only\n// explicitly set values conflict; unset ones fall back to the per-locale\n// defaults.\nfunction validateExplicitCompilerOptions(\n\toptions: ParaglidePluginOptions,\n\tconfig: ParaglideConfig | undefined\n): void {\n\tconst explicit = {\n\t\texperimentalStaticLocale:\n\t\t\toptions.experimentalStaticLocale ?? config?.experimentalStaticLocale,\n\t\texperimentalMiddlewareLocaleSplitting:\n\t\t\toptions.experimentalMiddlewareLocaleSplitting ??\n\t\t\tconfig?.experimentalMiddlewareLocaleSplitting,\n\t};\n\tif (explicit.experimentalStaticLocale !== undefined) {\n\t\tthrow new Error(\n\t\t\t\"experimentalPerLocaleBuild cannot be combined with experimentalStaticLocale because it controls the compiler's static locale expression.\"\n\t\t);\n\t}\n\tif (explicit.experimentalMiddlewareLocaleSplitting) {\n\t\tthrow new Error(\n\t\t\t\"experimentalPerLocaleBuild cannot be combined with experimentalMiddlewareLocaleSplitting.\"\n\t\t);\n\t}\n}\n\nasync function loadSettings(\n\toptions: ParaglidePluginOptions,\n\tdiscoveryRoot?: string | undefined\n): Promise<PerLocaleBuildSettings> {\n\tconst root = discoveryRoot ?? process.cwd();\n\tconst loaded = await loadParaglideConfig({\n\t\tprojectDir: resolve(root, options.project),\n\t});\n\tvalidateExplicitCompilerOptions(options, loaded?.config);\n\tconst { project } = resolveCompilerOptions({\n\t\tconfig: loaded?.config,\n\t\toverrides: options,\n\t\troot,\n\t});\n\tconst loadedProject = await loadProjectFromDirectory({\n\t\tpath: project,\n\t\tfs: options.fs ?? nodeFs,\n\t});\n\ttry {\n\t\tconst settings = await loadedProject.settings.get();\n\t\treturn {\n\t\t\tbaseLocale: settings.baseLocale,\n\t\t\tlocales: [...settings.locales],\n\t\t};\n\t} finally {\n\t\tawait loadedProject.close();\n\t}\n}\n"]}
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import nodeFs from "node:fs/promises";
|
|
2
|
+
import nodeSyncFs from "node:fs";
|
|
2
3
|
import nodeOs from "node:os";
|
|
3
4
|
import nodePath from "node:path";
|
|
4
5
|
import { insertBundleNested, loadProjectInMemory, newProject, } from "@inlang/sdk";
|
|
5
|
-
import { createBuilder } from "vite";
|
|
6
|
-
import {
|
|
6
|
+
import { createBuilder, createServer } from "vite";
|
|
7
|
+
import { execFileSync } from "node:child_process";
|
|
8
|
+
import { pathToFileURL } from "node:url";
|
|
9
|
+
import { createRequire } from "node:module";
|
|
10
|
+
import { expect, test, vi } from "vitest";
|
|
7
11
|
import { compileProject } from "../../compiler/compile-project.js";
|
|
8
12
|
import { perLocaleBuildStaticLocaleExpression } from "../../compiler/per-locale-build.js";
|
|
9
13
|
import { createViteLocaleBuildPlan, createViteLocaleEnvironmentPlugin, VITE_LOCALE_BUILD_MANIFEST, } from "./vite-environments.js";
|
|
@@ -226,6 +230,235 @@ test("keeps compiled Paraglide translations out of other locale source maps", as
|
|
|
226
230
|
await nodeFs.rm(temporaryRoot, { recursive: true, force: true });
|
|
227
231
|
}
|
|
228
232
|
});
|
|
233
|
+
test.each(["plugin override", "project config"])("message modules from %s specialize direct imports and keep lazy page messages out of initial chunks", async (source) => {
|
|
234
|
+
vi.resetModules();
|
|
235
|
+
const { paraglideVitePlugin } = await import("../vite.js");
|
|
236
|
+
const temporaryRoot = await nodeFs.mkdtemp(nodePath.join(nodeOs.tmpdir(), "paraglide-vite-message-modules-"));
|
|
237
|
+
const root = await nodeFs.realpath(temporaryRoot);
|
|
238
|
+
try {
|
|
239
|
+
const projectRoot = nodePath.join(root, "project.inlang");
|
|
240
|
+
await nodeFs.mkdir(projectRoot, { recursive: true });
|
|
241
|
+
await nodeFs.mkdir(nodePath.join(root, "messages"));
|
|
242
|
+
await nodeFs.writeFile(nodePath.join(projectRoot, "paraglide.config.js"), `export default { outputStructure: "${source === "project config" ? "message-modules" : "locale-modules"}" };`);
|
|
243
|
+
await nodeFs.copyFile(createRequire(import.meta.url).resolve("@inlang/plugin-message-format"), nodePath.join(root, "plugin.js"));
|
|
244
|
+
await nodeFs.writeFile(nodePath.join(projectRoot, "settings.json"), JSON.stringify({
|
|
245
|
+
baseLocale: "en",
|
|
246
|
+
locales: ["en", "de"],
|
|
247
|
+
modules: ["./plugin.js"],
|
|
248
|
+
"plugin.inlang.messageFormat": {
|
|
249
|
+
pathPattern: "./messages/{locale}.json",
|
|
250
|
+
},
|
|
251
|
+
}));
|
|
252
|
+
for (const locale of ["en", "de"]) {
|
|
253
|
+
await nodeFs.writeFile(nodePath.join(root, "messages", `${locale}.json`), JSON.stringify(Object.fromEntries(["greeting", "lazy_message", "unused_message"].map((id) => [
|
|
254
|
+
id,
|
|
255
|
+
`${locale.toUpperCase()}_${id.toUpperCase()}`,
|
|
256
|
+
]))));
|
|
257
|
+
}
|
|
258
|
+
await nodeFs.mkdir(nodePath.join(root, "src"), { recursive: true });
|
|
259
|
+
await Promise.all([
|
|
260
|
+
nodeFs.writeFile(nodePath.join(root, "index.html"), '<script type="module" src="./src/main.js"></script>'),
|
|
261
|
+
nodeFs.writeFile(nodePath.join(root, "src/main.js"), 'import { greeting } from "./paraglide/messages/greeting.js"; globalThis.translation = greeting(); globalThis.loadPage = () => import("./lazy-page.js");'),
|
|
262
|
+
nodeFs.writeFile(nodePath.join(root, "src/lazy-page.js"), 'import { lazy_message } from "./paraglide/messages/lazy_message.js"; globalThis.lazyTranslation = lazy_message();'),
|
|
263
|
+
]);
|
|
264
|
+
const server = await createServer({
|
|
265
|
+
configFile: false,
|
|
266
|
+
root,
|
|
267
|
+
logLevel: "silent",
|
|
268
|
+
server: { port: 0, host: "127.0.0.1" },
|
|
269
|
+
plugins: [
|
|
270
|
+
paraglideVitePlugin({
|
|
271
|
+
project: "./project.inlang",
|
|
272
|
+
outdir: "./src/paraglide-dev",
|
|
273
|
+
fs: { ...nodeSyncFs },
|
|
274
|
+
experimentalPerLocaleBuild: true,
|
|
275
|
+
...(source === "plugin override"
|
|
276
|
+
? { outputStructure: "message-modules" }
|
|
277
|
+
: {}),
|
|
278
|
+
}),
|
|
279
|
+
],
|
|
280
|
+
});
|
|
281
|
+
try {
|
|
282
|
+
await server.listen();
|
|
283
|
+
await server.environments.client.pluginContainer.buildStart();
|
|
284
|
+
const transformed = await server.transformRequest("/src/paraglide-dev/messages/greeting.js");
|
|
285
|
+
expect(transformed?.code).toContain("EN_GREETING");
|
|
286
|
+
}
|
|
287
|
+
finally {
|
|
288
|
+
await server.close();
|
|
289
|
+
}
|
|
290
|
+
const builder = await createBuilder({
|
|
291
|
+
configFile: false,
|
|
292
|
+
root,
|
|
293
|
+
base: "./",
|
|
294
|
+
logLevel: "silent",
|
|
295
|
+
build: { minify: false, modulePreload: false, sourcemap: true },
|
|
296
|
+
plugins: [
|
|
297
|
+
paraglideVitePlugin({
|
|
298
|
+
project: "./project.inlang",
|
|
299
|
+
outdir: "./src/paraglide",
|
|
300
|
+
fs: { ...nodeSyncFs },
|
|
301
|
+
experimentalPerLocaleBuild: true,
|
|
302
|
+
...(source === "plugin override"
|
|
303
|
+
? { outputStructure: "message-modules" }
|
|
304
|
+
: {}),
|
|
305
|
+
}),
|
|
306
|
+
],
|
|
307
|
+
});
|
|
308
|
+
await builder.buildApp();
|
|
309
|
+
const outputRoot = nodePath.join(root, "dist");
|
|
310
|
+
const manifest = JSON.parse(await nodeFs.readFile(nodePath.join(outputRoot, VITE_LOCALE_BUILD_MANIFEST), "utf8"));
|
|
311
|
+
for (const locale of ["en", "de"]) {
|
|
312
|
+
const variant = manifest.locales[locale];
|
|
313
|
+
const graph = await readJavaScriptGraph(outputRoot, variant);
|
|
314
|
+
const prefix = locale.toUpperCase();
|
|
315
|
+
expect(graph).toContain(`${prefix}_GREETING`);
|
|
316
|
+
expect(graph).toContain(`${prefix}_LAZY_MESSAGE`);
|
|
317
|
+
expect(graph).not.toContain(`${locale === "en" ? "DE" : "EN"}_GREETING`);
|
|
318
|
+
expect(graph).not.toContain(`${locale === "en" ? "DE" : "EN"}_LAZY_MESSAGE`);
|
|
319
|
+
const initialNames = new Set();
|
|
320
|
+
const visit = (name) => {
|
|
321
|
+
if (initialNames.has(name))
|
|
322
|
+
return;
|
|
323
|
+
initialNames.add(name);
|
|
324
|
+
for (const imported of variant.files.find((file) => file.fileName === name)?.imports ?? [])
|
|
325
|
+
visit(imported);
|
|
326
|
+
};
|
|
327
|
+
for (const entry of variant.files.filter((file) => file.entry))
|
|
328
|
+
visit(entry.fileName);
|
|
329
|
+
const initial = (await Promise.all([...initialNames].map((name) => nodeFs.readFile(nodePath.join(outputRoot, variant.directory, name), "utf8")))).join("\n");
|
|
330
|
+
expect(initial).not.toContain(`${prefix}_LAZY_MESSAGE`);
|
|
331
|
+
expect(initial).not.toContain("UNUSED_MESSAGE");
|
|
332
|
+
expect(variant.files.some((file) => (file.dynamicImports?.length ?? 0) > 0)).toBe(true);
|
|
333
|
+
// Execute the actual emitted initial graph. The lazy loader remains uncalled.
|
|
334
|
+
await nodeFs.writeFile(nodePath.join(root, "package.json"), '{"type":"module"}');
|
|
335
|
+
const entry = variant.files.find((file) => file.entry);
|
|
336
|
+
const entryUrl = pathToFileURL(nodePath.join(outputRoot, variant.directory, entry.fileName)).href;
|
|
337
|
+
const translation = execFileSync(process.execPath, [
|
|
338
|
+
"--input-type=module",
|
|
339
|
+
"-e",
|
|
340
|
+
`await import(${JSON.stringify(entryUrl)}); process.stdout.write(globalThis.translation);`,
|
|
341
|
+
], { encoding: "utf8" });
|
|
342
|
+
expect(translation).toBe(`${prefix}_GREETING`);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
finally {
|
|
346
|
+
await nodeFs.rm(temporaryRoot, { recursive: true, force: true });
|
|
347
|
+
}
|
|
348
|
+
});
|
|
349
|
+
test.each([undefined, "message-modules", "locale-modules"])("per-locale dev watches layout changes with plugin override %s", async (override) => {
|
|
350
|
+
vi.resetModules();
|
|
351
|
+
const { paraglideVitePlugin } = await import("../vite.js");
|
|
352
|
+
const root = await nodeFs.mkdtemp(nodePath.join(nodeOs.tmpdir(), "paraglide-vite-layout-watch-"));
|
|
353
|
+
try {
|
|
354
|
+
const projectRoot = nodePath.join(root, "project.inlang");
|
|
355
|
+
const configPath = nodePath.join(projectRoot, "paraglide.config.js");
|
|
356
|
+
await nodeFs.mkdir(projectRoot);
|
|
357
|
+
await nodeFs.mkdir(nodePath.join(root, "messages"));
|
|
358
|
+
await nodeFs.copyFile(createRequire(import.meta.url).resolve("@inlang/plugin-message-format"), nodePath.join(root, "plugin.js"));
|
|
359
|
+
await nodeFs.writeFile(nodePath.join(projectRoot, "settings.json"), JSON.stringify({
|
|
360
|
+
baseLocale: "en",
|
|
361
|
+
locales: ["en", "de"],
|
|
362
|
+
modules: ["./plugin.js"],
|
|
363
|
+
"plugin.inlang.messageFormat": {
|
|
364
|
+
pathPattern: "./messages/{locale}.json",
|
|
365
|
+
},
|
|
366
|
+
}));
|
|
367
|
+
for (const locale of ["en", "de"]) {
|
|
368
|
+
await nodeFs.writeFile(nodePath.join(root, "messages", `${locale}.json`), JSON.stringify({ greeting: `${locale.toUpperCase()}_GREETING` }));
|
|
369
|
+
}
|
|
370
|
+
await nodeFs.writeFile(configPath, 'export default { outputStructure: "message-modules" };');
|
|
371
|
+
const server = await createServer({
|
|
372
|
+
configFile: false,
|
|
373
|
+
root,
|
|
374
|
+
logLevel: "silent",
|
|
375
|
+
server: { port: 0, host: "127.0.0.1", watch: null },
|
|
376
|
+
plugins: [
|
|
377
|
+
paraglideVitePlugin({
|
|
378
|
+
project: "./project.inlang",
|
|
379
|
+
outdir: "./src/paraglide",
|
|
380
|
+
fs: { ...nodeSyncFs },
|
|
381
|
+
experimentalPerLocaleBuild: true,
|
|
382
|
+
...(override === undefined ? {} : { outputStructure: override }),
|
|
383
|
+
}),
|
|
384
|
+
],
|
|
385
|
+
});
|
|
386
|
+
try {
|
|
387
|
+
await server.listen();
|
|
388
|
+
await server.environments.client.pluginContainer.buildStart();
|
|
389
|
+
const assertLayout = async (configured) => {
|
|
390
|
+
const expected = override ?? configured ?? "locale-modules";
|
|
391
|
+
const code = await nodeFs.readFile(nodePath.join(root, expected === "message-modules"
|
|
392
|
+
? "src/paraglide/messages/greeting.js"
|
|
393
|
+
: "src/paraglide/messages/_index.js"), "utf8");
|
|
394
|
+
if (expected === "message-modules") {
|
|
395
|
+
expect(code).toContain("EN_GREETING");
|
|
396
|
+
expect(code).toContain("DE_GREETING");
|
|
397
|
+
}
|
|
398
|
+
else {
|
|
399
|
+
expect(code).not.toContain("EN_GREETING");
|
|
400
|
+
expect(code).toContain("./en.js");
|
|
401
|
+
}
|
|
402
|
+
};
|
|
403
|
+
await assertLayout("message-modules");
|
|
404
|
+
for (const layout of [
|
|
405
|
+
"locale-modules",
|
|
406
|
+
undefined,
|
|
407
|
+
"message-modules",
|
|
408
|
+
]) {
|
|
409
|
+
await nodeFs.writeFile(configPath, `export default ${JSON.stringify(layout ? { outputStructure: layout } : {})};`);
|
|
410
|
+
await server.environments.client.pluginContainer.watchChange(configPath, { event: "update" });
|
|
411
|
+
await assertLayout(layout);
|
|
412
|
+
}
|
|
413
|
+
await nodeFs.rm(configPath);
|
|
414
|
+
await server.environments.client.pluginContainer.watchChange(configPath, { event: "delete" });
|
|
415
|
+
await assertLayout(undefined);
|
|
416
|
+
await nodeFs.writeFile(configPath, 'export default { outputStructure: "message-modules" };');
|
|
417
|
+
await server.environments.client.pluginContainer.watchChange(configPath, { event: "create" });
|
|
418
|
+
await assertLayout("message-modules");
|
|
419
|
+
}
|
|
420
|
+
finally {
|
|
421
|
+
await server.close();
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
finally {
|
|
425
|
+
await nodeFs.rm(root, { recursive: true, force: true });
|
|
426
|
+
}
|
|
427
|
+
});
|
|
428
|
+
test("invalid project config keeps the per-locale dev server available", async () => {
|
|
429
|
+
vi.resetModules();
|
|
430
|
+
const { paraglideVitePlugin } = await import("../vite.js");
|
|
431
|
+
const root = await nodeFs.mkdtemp(nodePath.join(nodeOs.tmpdir(), "paraglide-vite-invalid-config-"));
|
|
432
|
+
try {
|
|
433
|
+
const projectRoot = nodePath.join(root, "project.inlang");
|
|
434
|
+
await nodeFs.mkdir(projectRoot);
|
|
435
|
+
await nodeFs.writeFile(nodePath.join(projectRoot, "paraglide.config.js"), "export default {");
|
|
436
|
+
const server = await createServer({
|
|
437
|
+
configFile: false,
|
|
438
|
+
root,
|
|
439
|
+
logLevel: "silent",
|
|
440
|
+
server: { port: 0, host: "127.0.0.1" },
|
|
441
|
+
plugins: [
|
|
442
|
+
paraglideVitePlugin({
|
|
443
|
+
project: "./project.inlang",
|
|
444
|
+
outdir: "./src/paraglide",
|
|
445
|
+
experimentalPerLocaleBuild: true,
|
|
446
|
+
fs: { ...nodeSyncFs },
|
|
447
|
+
}),
|
|
448
|
+
],
|
|
449
|
+
});
|
|
450
|
+
try {
|
|
451
|
+
await server.listen();
|
|
452
|
+
expect(server.httpServer?.listening).toBe(true);
|
|
453
|
+
}
|
|
454
|
+
finally {
|
|
455
|
+
await server.close();
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
finally {
|
|
459
|
+
await nodeFs.rm(root, { recursive: true, force: true });
|
|
460
|
+
}
|
|
461
|
+
});
|
|
229
462
|
function createMessage(locale, value) {
|
|
230
463
|
return {
|
|
231
464
|
id: `greeting-${locale}`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vite-environments.test.js","sourceRoot":"","sources":["../../../src/bundler-plugins/per-locale-build/vite-environments.test.ts"],"names":[],"mappings":"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","sourcesContent":["import nodeFs from \"node:fs/promises\";\nimport nodeOs from \"node:os\";\nimport nodePath from \"node:path\";\nimport {\n\tinsertBundleNested,\n\tloadProjectInMemory,\n\tnewProject,\n\ttype BundleNested,\n} from \"@inlang/sdk\";\nimport { createBuilder } from \"vite\";\nimport { expect, test } from \"vitest\";\nimport { compileProject } from \"../../compiler/compile-project.js\";\nimport { perLocaleBuildStaticLocaleExpression } from \"../../compiler/per-locale-build.js\";\nimport {\n\tcreateViteLocaleBuildPlan,\n\tcreateViteLocaleEnvironmentPlugin,\n\ttype ViteLocaleBuildManifest,\n\tVITE_LOCALE_BUILD_MANIFEST,\n} from \"./vite-environments.js\";\n\ntest(\"creates deterministic locale environment names and output directories\", () => {\n\texpect(\n\t\tcreateViteLocaleBuildPlan({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"zh-Hant\"],\n\t\t\t},\n\t\t\toutputDirectory: \"build\",\n\t\t})\n\t).toEqual({\n\t\toutputDirectory: \"build\",\n\t\tvariants: [\n\t\t\t{\n\t\t\t\tlocale: \"en\",\n\t\t\t\tenvironmentName: \"paraglide_client_en_656e\",\n\t\t\t\tdirectory: \"__paraglide/en-656e\",\n\t\t\t\toutputDirectory: \"build/__paraglide/en-656e\",\n\t\t\t\tdefine: {\n\t\t\t\t\t\"globalThis.__PARAGLIDE_STATIC_LOCALE__\": '\"en\"',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tlocale: \"zh-Hant\",\n\t\t\t\tenvironmentName: \"paraglide_client_zh_Hant_7a682d48616e74\",\n\t\t\t\tdirectory: \"__paraglide/zh-Hant-7a682d48616e74\",\n\t\t\t\toutputDirectory: \"build/__paraglide/zh-Hant-7a682d48616e74\",\n\t\t\t\tdefine: {\n\t\t\t\t\t\"globalThis.__PARAGLIDE_STATIC_LOCALE__\": '\"zh-Hant\"',\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t});\n\texpect(() =>\n\t\tcreateViteLocaleBuildPlan({\n\t\t\tsettings: { baseLocale: \"en\", locales: [\"en\"] },\n\t\t\toutputDirectory: \"../outside\",\n\t\t})\n\t).toThrow(\"must be a project-relative directory\");\n});\n\ntest(\"builds closed, source-mapped Rolldown graphs without post-processing\", async () => {\n\tconst temporaryRoot = await nodeFs.mkdtemp(\n\t\tnodePath.join(nodeOs.tmpdir(), \"paraglide-vite-environments-\")\n\t);\n\tconst root = await nodeFs.realpath(temporaryRoot);\n\ttry {\n\t\tawait nodeFs.mkdir(nodePath.join(root, \"src/messages\"), {\n\t\t\trecursive: true,\n\t\t});\n\t\tawait Promise.all([\n\t\t\tnodeFs.writeFile(\n\t\t\t\tnodePath.join(root, \"index.html\"),\n\t\t\t\t'<main id=\"app\"></main><script type=\"module\" src=\"./src/main.js\"></script>\\n'\n\t\t\t),\n\t\t\tnodeFs.writeFile(\n\t\t\t\tnodePath.join(root, \"src/main.js\"),\n\t\t\t\t[\n\t\t\t\t\t'import \"./style.css\";',\n\t\t\t\t\t'import \"external-dependency\";',\n\t\t\t\t\t'import { message, loadLazy } from \"./messages/_index.js\";',\n\t\t\t\t\t'document.querySelector(\"#app\").textContent = message;',\n\t\t\t\t\t\"loadLazy().then((module) => module.mount());\",\n\t\t\t\t\t\"\",\n\t\t\t\t].join(\"\\n\")\n\t\t\t),\n\t\t\tnodeFs.writeFile(\n\t\t\t\tnodePath.join(root, \"src/messages/_index.js\"),\n\t\t\t\t[\n\t\t\t\t\t\" const locale = globalThis.__PARAGLIDE_STATIC_LOCALE__;\",\n\t\t\t\t\t'import * as en from \"./en.js\";',\n\t\t\t\t\t'import * as de from \"./de.js\";',\n\t\t\t\t\t\"export const message = locale === 'en' ? en.message : de.message;\",\n\t\t\t\t\t\"export const loadLazy = locale === 'en'\",\n\t\t\t\t\t' ? () => import(\"./en-lazy.js\")',\n\t\t\t\t\t' : () => import(\"./de-lazy.js\");',\n\t\t\t\t\t\"\",\n\t\t\t\t].join(\"\\n\")\n\t\t\t),\n\t\t\tnodeFs.writeFile(\n\t\t\t\tnodePath.join(root, \"src/messages/en.js\"),\n\t\t\t\t'export const message = \"EN_ONLY_MESSAGE\";\\n'\n\t\t\t),\n\t\t\tnodeFs.writeFile(\n\t\t\t\tnodePath.join(root, \"src/messages/de.js\"),\n\t\t\t\t'export const message = \"DE_ONLY_MESSAGE\";\\n'\n\t\t\t),\n\t\t\tnodeFs.writeFile(\n\t\t\t\tnodePath.join(root, \"src/messages/en-lazy.js\"),\n\t\t\t\t'export function mount() { document.body.dataset.lazy = \"EN_ONLY_LAZY\"; }\\n'\n\t\t\t),\n\t\t\tnodeFs.writeFile(\n\t\t\t\tnodePath.join(root, \"src/messages/de-lazy.js\"),\n\t\t\t\t'export function mount() { document.body.dataset.lazy = \"DE_ONLY_LAZY\"; }\\n'\n\t\t\t),\n\t\t\tnodeFs.writeFile(\n\t\t\t\tnodePath.join(root, \"src/style.css\"),\n\t\t\t\t\"#app { color: rebeccapurple; }\\n\"\n\t\t\t),\n\t\t]);\n\t\tawait nodeFs.mkdir(\n\t\t\tnodePath.join(root, \"build/__paraglide/removed-locale\"),\n\t\t\t{ recursive: true }\n\t\t);\n\t\tawait Promise.all([\n\t\t\tnodeFs.writeFile(\n\t\t\t\tnodePath.join(root, \"build/__paraglide/removed-locale/stale.js\"),\n\t\t\t\t\"stale\"\n\t\t\t),\n\t\t\tnodeFs.writeFile(\n\t\t\t\tnodePath.join(root, \"build\", VITE_LOCALE_BUILD_MANIFEST),\n\t\t\t\t'{\"stale\":true}\\n'\n\t\t\t),\n\t\t]);\n\n\t\tlet renderBuiltUrlCalls = 0;\n\t\tconst builder = await createBuilder({\n\t\t\tconfigFile: false,\n\t\t\troot,\n\t\t\tbase: \"./\",\n\t\t\tlogLevel: \"silent\",\n\t\t\texperimental: {\n\t\t\t\trenderBuiltUrl() {\n\t\t\t\t\trenderBuiltUrlCalls += 1;\n\t\t\t\t\treturn { relative: true };\n\t\t\t\t},\n\t\t\t},\n\t\t\tbuild: {\n\t\t\t\toutDir: \"build\",\n\t\t\t\tminify: false,\n\t\t\t\tsourcemap: true,\n\t\t\t\trolldownOptions: {\n\t\t\t\t\texternal: [\"external-dependency\"],\n\t\t\t\t\toutput: {\n\t\t\t\t\t\tentryFileNames: \"custom/[name]-[hash].js\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tplugins: [\n\t\t\t\tcreateViteLocaleEnvironmentPlugin({\n\t\t\t\t\tsettings: async () => ({\n\t\t\t\t\t\tbaseLocale: \"en\",\n\t\t\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t\t\t}),\n\t\t\t\t}),\n\t\t\t],\n\t\t});\n\t\tawait builder.buildApp();\n\n\t\tconst outputRoot = nodePath.join(root, \"build\");\n\t\tconst manifest = JSON.parse(\n\t\t\tawait nodeFs.readFile(\n\t\t\t\tnodePath.join(outputRoot, VITE_LOCALE_BUILD_MANIFEST),\n\t\t\t\t\"utf8\"\n\t\t\t)\n\t\t) as ViteLocaleBuildManifest;\n\t\texpect(manifest.backend).toBe(\"vite-rolldown-environments\");\n\t\texpect(Object.keys(manifest.locales)).toEqual([\"en\", \"de\"]);\n\t\texpect(renderBuiltUrlCalls).toBeGreaterThan(0);\n\t\tawait expect(\n\t\t\tnodeFs.access(\n\t\t\t\tnodePath.join(outputRoot, \"__paraglide/removed-locale/stale.js\")\n\t\t\t)\n\t\t).rejects.toThrow();\n\n\t\tfor (const locale of [\"en\", \"de\"] as const) {\n\t\t\tconst localeManifest = manifest.locales[locale]!;\n\t\t\texpect(localeManifest.directory).toMatch(\n\t\t\t\tnew RegExp(`^__paraglide/${locale}-`)\n\t\t\t);\n\t\t\texpect(localeManifest.files.some((file) => file.entry)).toBe(true);\n\t\t\texpect(\n\t\t\t\tlocaleManifest.files.some(\n\t\t\t\t\t(file) => file.entry && file.fileName.startsWith(\"custom/\")\n\t\t\t\t)\n\t\t\t).toBe(true);\n\t\t\texpect(\n\t\t\t\tlocaleManifest.files.some((file) =>\n\t\t\t\t\tfile.externalImports?.includes(\"external-dependency\")\n\t\t\t\t)\n\t\t\t).toBe(true);\n\t\t\texpect(\n\t\t\t\tlocaleManifest.files.some((file) => file.fileName.endsWith(\".map\"))\n\t\t\t).toBe(true);\n\n\t\t\tconst names = new Set(localeManifest.files.map((file) => file.fileName));\n\t\t\tfor (const file of localeManifest.files) {\n\t\t\t\tfor (const imported of [\n\t\t\t\t\t...(file.imports ?? []),\n\t\t\t\t\t...(file.dynamicImports ?? []),\n\t\t\t\t]) {\n\t\t\t\t\texpect(names.has(imported)).toBe(true);\n\t\t\t\t}\n\t\t\t\tconst bytes = (\n\t\t\t\t\tawait nodeFs.readFile(\n\t\t\t\t\t\tnodePath.join(outputRoot, localeManifest.directory, file.fileName)\n\t\t\t\t\t)\n\t\t\t\t).byteLength;\n\t\t\t\texpect(bytes).toBe(file.bytes);\n\t\t\t}\n\t\t}\n\n\t\tconst enJavaScript = await readJavaScriptGraph(\n\t\t\toutputRoot,\n\t\t\tmanifest.locales.en!\n\t\t);\n\t\tconst deJavaScript = await readJavaScriptGraph(\n\t\t\toutputRoot,\n\t\t\tmanifest.locales.de!\n\t\t);\n\t\texpect(enJavaScript).toContain(\"EN_ONLY_MESSAGE\");\n\t\texpect(enJavaScript).toContain(\"EN_ONLY_LAZY\");\n\t\texpect(enJavaScript).not.toContain(\"DE_ONLY_MESSAGE\");\n\t\texpect(enJavaScript).not.toContain(\"DE_ONLY_LAZY\");\n\t\texpect(deJavaScript).toContain(\"DE_ONLY_MESSAGE\");\n\t\texpect(deJavaScript).toContain(\"DE_ONLY_LAZY\");\n\t\texpect(deJavaScript).not.toContain(\"EN_ONLY_MESSAGE\");\n\t\texpect(deJavaScript).not.toContain(\"EN_ONLY_LAZY\");\n\n\t\tconst enSourceMaps = await readSourceMaps(outputRoot, manifest.locales.en!);\n\t\tconst deSourceMaps = await readSourceMaps(outputRoot, manifest.locales.de!);\n\t\texpect(enSourceMaps).not.toContain(\"DE_ONLY_MESSAGE\");\n\t\texpect(enSourceMaps).not.toContain(\"DE_ONLY_LAZY\");\n\t\texpect(deSourceMaps).not.toContain(\"EN_ONLY_MESSAGE\");\n\t\texpect(deSourceMaps).not.toContain(\"EN_ONLY_LAZY\");\n\t} finally {\n\t\tawait nodeFs.rm(temporaryRoot, { recursive: true, force: true });\n\t}\n});\n\ntest(\"keeps compiled Paraglide translations out of other locale source maps\", async () => {\n\tconst temporaryRoot = await nodeFs.mkdtemp(\n\t\tnodePath.join(nodeOs.tmpdir(), \"paraglide-vite-compiled-\")\n\t);\n\tconst root = await nodeFs.realpath(temporaryRoot);\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject({\n\t\t\tsettings: { baseLocale: \"en\", locales: [\"en\", \"de\"] },\n\t\t}),\n\t});\n\ttry {\n\t\tawait insertBundleNested(project.db, {\n\t\t\tid: \"greeting\",\n\t\t\tdeclarations: [],\n\t\t\tmessages: [\n\t\t\t\tcreateMessage(\"en\", \"EN_COMPILED_TRANSLATION\"),\n\t\t\t\tcreateMessage(\"de\", \"DE_COMPILED_TRANSLATION\"),\n\t\t\t],\n\t\t} satisfies BundleNested);\n\t\tconst generated = await compileProject({\n\t\t\tproject,\n\t\t\tcompilerOptions: {\n\t\t\t\toutputStructure: \"locale-modules\",\n\t\t\t\texperimentalStaticLocale: perLocaleBuildStaticLocaleExpression,\n\t\t\t\temitGitIgnore: false,\n\t\t\t\temitPrettierIgnore: false,\n\t\t\t\temitReadme: false,\n\t\t\t},\n\t\t});\n\t\tconst generatedRoot = nodePath.join(root, \"src/paraglide\");\n\t\tfor (const [fileName, source] of Object.entries(generated)) {\n\t\t\tconst path = nodePath.join(generatedRoot, fileName);\n\t\t\tawait nodeFs.mkdir(nodePath.dirname(path), { recursive: true });\n\t\t\tawait nodeFs.writeFile(path, source);\n\t\t}\n\t\tawait Promise.all([\n\t\t\tnodeFs.writeFile(\n\t\t\t\tnodePath.join(root, \"index.html\"),\n\t\t\t\t'<script type=\"module\" src=\"./src/main.js\"></script>\\n'\n\t\t\t),\n\t\t\tnodeFs.writeFile(\n\t\t\t\tnodePath.join(root, \"src/main.js\"),\n\t\t\t\t'import { greeting } from \"./paraglide/messages.js\";\\ndocument.body.textContent = greeting();\\n'\n\t\t\t),\n\t\t]);\n\n\t\tconst builder = await createBuilder({\n\t\t\tconfigFile: false,\n\t\t\troot,\n\t\t\tbase: \"./\",\n\t\t\tlogLevel: \"silent\",\n\t\t\tbuild: { minify: false, sourcemap: true },\n\t\t\tplugins: [\n\t\t\t\tcreateViteLocaleEnvironmentPlugin({\n\t\t\t\t\tsettings: async () => ({\n\t\t\t\t\t\tbaseLocale: \"en\",\n\t\t\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t\t\t}),\n\t\t\t\t}),\n\t\t\t],\n\t\t});\n\t\tawait builder.buildApp();\n\n\t\tconst outputRoot = nodePath.join(root, \"dist\");\n\t\tconst manifest = JSON.parse(\n\t\t\tawait nodeFs.readFile(\n\t\t\t\tnodePath.join(outputRoot, VITE_LOCALE_BUILD_MANIFEST),\n\t\t\t\t\"utf8\"\n\t\t\t)\n\t\t) as ViteLocaleBuildManifest;\n\t\tconst enGraph = await readGraphText(outputRoot, manifest.locales.en!);\n\t\tconst deGraph = await readGraphText(outputRoot, manifest.locales.de!);\n\t\texpect(enGraph).toContain(\"EN_COMPILED_TRANSLATION\");\n\t\texpect(enGraph).not.toContain(\"DE_COMPILED_TRANSLATION\");\n\t\texpect(deGraph).toContain(\"DE_COMPILED_TRANSLATION\");\n\t\texpect(deGraph).not.toContain(\"EN_COMPILED_TRANSLATION\");\n\t} finally {\n\t\tawait project.close();\n\t\tawait nodeFs.rm(temporaryRoot, { recursive: true, force: true });\n\t}\n});\n\nfunction createMessage(locale: \"en\" | \"de\", value: string) {\n\treturn {\n\t\tid: `greeting-${locale}`,\n\t\tbundle_id: \"greeting\",\n\t\tlocale,\n\t\tselectors: [],\n\t\tvariants: [\n\t\t\t{\n\t\t\t\tid: `greeting-${locale}-variant`,\n\t\t\t\tmessage_id: `greeting-${locale}`,\n\t\t\t\tmatches: [],\n\t\t\t\tpattern: [{ type: \"text\" as const, value }],\n\t\t\t},\n\t\t],\n\t};\n}\n\nasync function readJavaScriptGraph(\n\toutputRoot: string,\n\tlocale: ViteLocaleBuildManifest[\"locales\"][string]\n): Promise<string> {\n\tconst chunks = locale.files.filter(\n\t\t(file) => file.type === \"chunk\" && file.fileName.endsWith(\".js\")\n\t);\n\treturn (\n\t\tawait Promise.all(\n\t\t\tchunks.map((chunk) =>\n\t\t\t\tnodeFs.readFile(\n\t\t\t\t\tnodePath.join(outputRoot, locale.directory, chunk.fileName),\n\t\t\t\t\t\"utf8\"\n\t\t\t\t)\n\t\t\t)\n\t\t)\n\t).join(\"\\n\");\n}\n\nasync function readSourceMaps(\n\toutputRoot: string,\n\tlocale: ViteLocaleBuildManifest[\"locales\"][string]\n): Promise<string> {\n\treturn (\n\t\tawait Promise.all(\n\t\t\tlocale.files\n\t\t\t\t.filter((file) => file.fileName.endsWith(\".map\"))\n\t\t\t\t.map((file) =>\n\t\t\t\t\tnodeFs.readFile(\n\t\t\t\t\t\tnodePath.join(outputRoot, locale.directory, file.fileName),\n\t\t\t\t\t\t\"utf8\"\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t)\n\t).join(\"\\n\");\n}\n\nasync function readGraphText(\n\toutputRoot: string,\n\tlocale: ViteLocaleBuildManifest[\"locales\"][string]\n): Promise<string> {\n\treturn (\n\t\tawait Promise.all(\n\t\t\tlocale.files\n\t\t\t\t.filter(\n\t\t\t\t\t(file) =>\n\t\t\t\t\t\t(file.type === \"chunk\" && file.fileName.endsWith(\".js\")) ||\n\t\t\t\t\t\tfile.fileName.endsWith(\".map\")\n\t\t\t\t)\n\t\t\t\t.map((file) =>\n\t\t\t\t\tnodeFs.readFile(\n\t\t\t\t\t\tnodePath.join(outputRoot, locale.directory, file.fileName),\n\t\t\t\t\t\t\"utf8\"\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t)\n\t).join(\"\\n\");\n}\n"]}
|
|
1
|
+
{"version":3,"file":"vite-environments.test.js","sourceRoot":"","sources":["../../../src/bundler-plugins/per-locale-build/vite-environments.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,kBAAkB,CAAC;AACtC,OAAO,UAAU,MAAM,SAAS,CAAC;AACjC,OAAO,MAAM,MAAM,SAAS,CAAC;AAC7B,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,EACN,kBAAkB,EAClB,mBAAmB,EACnB,UAAU,GAEV,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,oCAAoC,EAAE,MAAM,oCAAoC,CAAC;AAC1F,OAAO,EACN,yBAAyB,EACzB,iCAAiC,EAEjC,0BAA0B,GAC1B,MAAM,wBAAwB,CAAC;AAEhC,IAAI,CAAC,uEAAuE,EAAE,GAAG,EAAE;IAClF,MAAM,CACL,yBAAyB,CAAC;QACzB,QAAQ,EAAE;YACT,UAAU,EAAE,IAAI;YAChB,OAAO,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC;SAC1B;QACD,eAAe,EAAE,OAAO;KACxB,CAAC,CACF,CAAC,OAAO,CAAC;QACT,eAAe,EAAE,OAAO;QACxB,QAAQ,EAAE;YACT;gBACC,MAAM,EAAE,IAAI;gBACZ,eAAe,EAAE,0BAA0B;gBAC3C,SAAS,EAAE,qBAAqB;gBAChC,eAAe,EAAE,2BAA2B;gBAC5C,MAAM,EAAE;oBACP,wCAAwC,EAAE,MAAM;iBAChD;aACD;YACD;gBACC,MAAM,EAAE,SAAS;gBACjB,eAAe,EAAE,yCAAyC;gBAC1D,SAAS,EAAE,oCAAoC;gBAC/C,eAAe,EAAE,0CAA0C;gBAC3D,MAAM,EAAE;oBACP,wCAAwC,EAAE,WAAW;iBACrD;aACD;SACD;KACD,CAAC,CAAC;IACH,MAAM,CAAC,GAAG,EAAE,CACX,yBAAyB,CAAC;QACzB,QAAQ,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE;QAC/C,eAAe,EAAE,YAAY;KAC7B,CAAC,CACF,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;IACvF,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,OAAO,CACzC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,8BAA8B,CAAC,CAC9D,CAAC;IACF,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAClD,IAAI,CAAC;QACJ,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE;YACvD,SAAS,EAAE,IAAI;SACf,CAAC,CAAC;QACH,MAAM,OAAO,CAAC,GAAG,CAAC;YACjB,MAAM,CAAC,SAAS,CACf,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,EACjC,6EAA6E,CAC7E;YACD,MAAM,CAAC,SAAS,CACf,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,EAClC;gBACC,uBAAuB;gBACvB,+BAA+B;gBAC/B,2DAA2D;gBAC3D,uDAAuD;gBACvD,8CAA8C;gBAC9C,EAAE;aACF,CAAC,IAAI,CAAC,IAAI,CAAC,CACZ;YACD,MAAM,CAAC,SAAS,CACf,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,wBAAwB,CAAC,EAC7C;gBACC,0DAA0D;gBAC1D,gCAAgC;gBAChC,gCAAgC;gBAChC,mEAAmE;gBACnE,yCAAyC;gBACzC,kCAAkC;gBAClC,mCAAmC;gBACnC,EAAE;aACF,CAAC,IAAI,CAAC,IAAI,CAAC,CACZ;YACD,MAAM,CAAC,SAAS,CACf,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,oBAAoB,CAAC,EACzC,6CAA6C,CAC7C;YACD,MAAM,CAAC,SAAS,CACf,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,oBAAoB,CAAC,EACzC,6CAA6C,CAC7C;YACD,MAAM,CAAC,SAAS,CACf,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,yBAAyB,CAAC,EAC9C,4EAA4E,CAC5E;YACD,MAAM,CAAC,SAAS,CACf,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,yBAAyB,CAAC,EAC9C,4EAA4E,CAC5E;YACD,MAAM,CAAC,SAAS,CACf,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,EACpC,kCAAkC,CAClC;SACD,CAAC,CAAC;QACH,MAAM,MAAM,CAAC,KAAK,CACjB,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,kCAAkC,CAAC,EACvD,EAAE,SAAS,EAAE,IAAI,EAAE,CACnB,CAAC;QACF,MAAM,OAAO,CAAC,GAAG,CAAC;YACjB,MAAM,CAAC,SAAS,CACf,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,2CAA2C,CAAC,EAChE,OAAO,CACP;YACD,MAAM,CAAC,SAAS,CACf,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,0BAA0B,CAAC,EACxD,kBAAkB,CAClB;SACD,CAAC,CAAC;QAEH,IAAI,mBAAmB,GAAG,CAAC,CAAC;QAC5B,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC;YACnC,UAAU,EAAE,KAAK;YACjB,IAAI;YACJ,IAAI,EAAE,IAAI;YACV,QAAQ,EAAE,QAAQ;YAClB,YAAY,EAAE;gBACb,cAAc;oBACb,mBAAmB,IAAI,CAAC,CAAC;oBACzB,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;gBAC3B,CAAC;aACD;YACD,KAAK,EAAE;gBACN,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE,KAAK;gBACb,SAAS,EAAE,IAAI;gBACf,eAAe,EAAE;oBAChB,QAAQ,EAAE,CAAC,qBAAqB,CAAC;oBACjC,MAAM,EAAE;wBACP,cAAc,EAAE,yBAAyB;qBACzC;iBACD;aACD;YACD,OAAO,EAAE;gBACR,iCAAiC,CAAC;oBACjC,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;wBACtB,UAAU,EAAE,IAAI;wBAChB,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;qBACrB,CAAC;iBACF,CAAC;aACF;SACD,CAAC,CAAC;QACH,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;QAEzB,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAC1B,MAAM,MAAM,CAAC,QAAQ,CACpB,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,0BAA0B,CAAC,EACrD,MAAM,CACN,CAC0B,CAAC;QAC7B,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC5D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAC5D,MAAM,CAAC,mBAAmB,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC/C,MAAM,MAAM,CACX,MAAM,CAAC,MAAM,CACZ,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,qCAAqC,CAAC,CAChE,CACD,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAEpB,KAAK,MAAM,MAAM,IAAI,CAAC,IAAI,EAAE,IAAI,CAAU,EAAE,CAAC;YAC5C,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAE,CAAC;YACjD,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,OAAO,CACvC,IAAI,MAAM,CAAC,gBAAgB,MAAM,GAAG,CAAC,CACrC,CAAC;YACF,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnE,MAAM,CACL,cAAc,CAAC,KAAK,CAAC,IAAI,CACxB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,CAC3D,CACD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACb,MAAM,CACL,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAClC,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,qBAAqB,CAAC,CACrD,CACD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACb,MAAM,CACL,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CACnE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEb,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YACzE,KAAK,MAAM,IAAI,IAAI,cAAc,CAAC,KAAK,EAAE,CAAC;gBACzC,KAAK,MAAM,QAAQ,IAAI;oBACtB,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;oBACvB,GAAG,CAAC,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC;iBAC9B,EAAE,CAAC;oBACH,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACxC,CAAC;gBACD,MAAM,KAAK,GAAG,CACb,MAAM,MAAM,CAAC,QAAQ,CACpB,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,CAClE,CACD,CAAC,UAAU,CAAC;gBACb,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;QACF,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,mBAAmB,CAC7C,UAAU,EACV,QAAQ,CAAC,OAAO,CAAC,EAAG,CACpB,CAAC;QACF,MAAM,YAAY,GAAG,MAAM,mBAAmB,CAC7C,UAAU,EACV,QAAQ,CAAC,OAAO,CAAC,EAAG,CACpB,CAAC;QACF,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAClD,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAC/C,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QACtD,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACnD,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAClD,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAC/C,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QACtD,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAEnD,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAG,CAAC,CAAC;QAC5E,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAG,CAAC,CAAC;QAC5E,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QACtD,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACnD,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QACtD,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IACpD,CAAC;YAAS,CAAC;QACV,MAAM,MAAM,CAAC,EAAE,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;IACxF,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,OAAO,CACzC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,0BAA0B,CAAC,CAC1D,CAAC;IACF,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC;QACzC,IAAI,EAAE,MAAM,UAAU,CAAC;YACtB,QAAQ,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE;SACrD,CAAC;KACF,CAAC,CAAC;IACH,IAAI,CAAC;QACJ,MAAM,kBAAkB,CAAC,OAAO,CAAC,EAAE,EAAE;YACpC,EAAE,EAAE,UAAU;YACd,YAAY,EAAE,EAAE;YAChB,QAAQ,EAAE;gBACT,aAAa,CAAC,IAAI,EAAE,yBAAyB,CAAC;gBAC9C,aAAa,CAAC,IAAI,EAAE,yBAAyB,CAAC;aAC9C;SACsB,CAAC,CAAC;QAC1B,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC;YACtC,OAAO;YACP,eAAe,EAAE;gBAChB,eAAe,EAAE,gBAAgB;gBACjC,wBAAwB,EAAE,oCAAoC;gBAC9D,aAAa,EAAE,KAAK;gBACpB,kBAAkB,EAAE,KAAK;gBACzB,UAAU,EAAE,KAAK;aACjB;SACD,CAAC,CAAC;QACH,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;QAC3D,KAAK,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAC5D,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;YACpD,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAChE,MAAM,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACtC,CAAC;QACD,MAAM,OAAO,CAAC,GAAG,CAAC;YACjB,MAAM,CAAC,SAAS,CACf,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,EACjC,uDAAuD,CACvD;YACD,MAAM,CAAC,SAAS,CACf,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,EAClC,gGAAgG,CAChG;SACD,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC;YACnC,UAAU,EAAE,KAAK;YACjB,IAAI;YACJ,IAAI,EAAE,IAAI;YACV,QAAQ,EAAE,QAAQ;YAClB,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE;YACzC,OAAO,EAAE;gBACR,iCAAiC,CAAC;oBACjC,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;wBACtB,UAAU,EAAE,IAAI;wBAChB,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;qBACrB,CAAC;iBACF,CAAC;aACF;SACD,CAAC,CAAC;QACH,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;QAEzB,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAC1B,MAAM,MAAM,CAAC,QAAQ,CACpB,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,0BAA0B,CAAC,EACrD,MAAM,CACN,CAC0B,CAAC;QAC7B,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAG,CAAC,CAAC;QACtE,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAG,CAAC,CAAC;QACtE,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;QACrD,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;QACzD,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;QACrD,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;IAC1D,CAAC;YAAS,CAAC;QACV,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACtB,MAAM,MAAM,CAAC,EAAE,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,IAAI,CAAC,CAAC,iBAAiB,EAAE,gBAAgB,CAAU,CAAC,CACxD,qGAAqG,EACrG,KAAK,EAAE,MAAM,EAAE,EAAE;IAChB,EAAE,CAAC,YAAY,EAAE,CAAC;IAClB,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;IAC3D,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,OAAO,CACzC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,iCAAiC,CAAC,CACjE,CAAC;IACF,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAClD,IAAI,CAAC;QACJ,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;QAC1D,MAAM,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;QACpD,MAAM,MAAM,CAAC,SAAS,CACrB,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,qBAAqB,CAAC,EACjD,sCAAsC,MAAM,KAAK,gBAAgB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,gBAAgB,MAAM,CAC9G,CAAC;QACF,MAAM,MAAM,CAAC,QAAQ,CACpB,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,+BAA+B,CAAC,EACvE,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAChC,CAAC;QACF,MAAM,MAAM,CAAC,SAAS,CACrB,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,EAC3C,IAAI,CAAC,SAAS,CAAC;YACd,UAAU,EAAE,IAAI;YAChB,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;YACrB,OAAO,EAAE,CAAC,aAAa,CAAC;YACxB,6BAA6B,EAAE;gBAC9B,WAAW,EAAE,0BAA0B;aACvC;SACD,CAAC,CACF,CAAC;QACF,KAAK,MAAM,MAAM,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YACnC,MAAM,MAAM,CAAC,SAAS,CACrB,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,MAAM,OAAO,CAAC,EACjD,IAAI,CAAC,SAAS,CACb,MAAM,CAAC,WAAW,CACjB,CAAC,UAAU,EAAE,cAAc,EAAE,gBAAgB,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC;gBAC1D,EAAE;gBACF,GAAG,MAAM,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE;aAC7C,CAAC,CACF,CACD,CACD,CAAC;QACH,CAAC;QAED,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpE,MAAM,OAAO,CAAC,GAAG,CAAC;YACjB,MAAM,CAAC,SAAS,CACf,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,EACjC,qDAAqD,CACrD;YACD,MAAM,CAAC,SAAS,CACf,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,EAClC,yJAAyJ,CACzJ;YACD,MAAM,CAAC,SAAS,CACf,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,kBAAkB,CAAC,EACvC,mHAAmH,CACnH;SACD,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;YACjC,UAAU,EAAE,KAAK;YACjB,IAAI;YACJ,QAAQ,EAAE,QAAQ;YAClB,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE;YACtC,OAAO,EAAE;gBACR,mBAAmB,CAAC;oBACnB,OAAO,EAAE,kBAAkB;oBAC3B,MAAM,EAAE,qBAAqB;oBAC7B,EAAE,EAAE,EAAE,GAAG,UAAU,EAAE;oBACrB,0BAA0B,EAAE,IAAI;oBAChC,GAAG,CAAC,MAAM,KAAK,iBAAiB;wBAC/B,CAAC,CAAC,EAAE,eAAe,EAAE,iBAA0B,EAAE;wBACjD,CAAC,CAAC,EAAE,CAAC;iBACN,CAAC;aACF;SACD,CAAC,CAAC;QACH,IAAI,CAAC;YACJ,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;YACtB,MAAM,MAAM,CAAC,YAAY,CAAC,MAAO,CAAC,eAAe,CAAC,UAAU,EAAE,CAAC;YAC/D,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAChD,yCAAyC,CACzC,CAAC;YACF,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACpD,CAAC;gBAAS,CAAC;YACV,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACtB,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC;YACnC,UAAU,EAAE,KAAK;YACjB,IAAI;YACJ,IAAI,EAAE,IAAI;YACV,QAAQ,EAAE,QAAQ;YAClB,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE;YAC/D,OAAO,EAAE;gBACR,mBAAmB,CAAC;oBACnB,OAAO,EAAE,kBAAkB;oBAC3B,MAAM,EAAE,iBAAiB;oBACzB,EAAE,EAAE,EAAE,GAAG,UAAU,EAAE;oBACrB,0BAA0B,EAAE,IAAI;oBAChC,GAAG,CAAC,MAAM,KAAK,iBAAiB;wBAC/B,CAAC,CAAC,EAAE,eAAe,EAAE,iBAA0B,EAAE;wBACjD,CAAC,CAAC,EAAE,CAAC;iBACN,CAAC;aACF;SACD,CAAC,CAAC;QACH,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAC1B,MAAM,MAAM,CAAC,QAAQ,CACpB,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,0BAA0B,CAAC,EACrD,MAAM,CACN,CAC0B,CAAC;QAC7B,KAAK,MAAM,MAAM,IAAI,CAAC,IAAI,EAAE,IAAI,CAAU,EAAE,CAAC;YAC5C,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAE,CAAC;YAC1C,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAC7D,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;YACpC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,GAAG,MAAM,WAAW,CAAC,CAAC;YAC9C,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,GAAG,MAAM,eAAe,CAAC,CAAC;YAClD,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,CAC1B,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,WAAW,CAC3C,CAAC;YACF,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,CAC1B,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,eAAe,CAC/C,CAAC;YACF,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;YACvC,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAE;gBAC9B,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;oBAAE,OAAO;gBACnC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACvB,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CACxC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,IAAI,CAChC,EAAE,OAAO,IAAI,EAAE;oBACf,KAAK,CAAC,QAAQ,CAAC,CAAC;YAClB,CAAC,CAAC;YACF,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;gBAC7D,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACvB,MAAM,OAAO,GAAG,CACf,MAAM,OAAO,CAAC,GAAG,CAChB,CAAC,GAAG,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAC9B,MAAM,CAAC,QAAQ,CACd,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,EAClD,MAAM,CACN,CACD,CACD,CACD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACb,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,MAAM,eAAe,CAAC,CAAC;YACxD,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;YAChD,MAAM,CACL,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CACpE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACb,8EAA8E;YAC9E,MAAM,MAAM,CAAC,SAAS,CACrB,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,EACnC,mBAAmB,CACnB,CAAC;YACF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAE,CAAC;YACxD,MAAM,QAAQ,GAAG,aAAa,CAC7B,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,CAC5D,CAAC,IAAI,CAAC;YACP,MAAM,WAAW,GAAG,YAAY,CAC/B,OAAO,CAAC,QAAQ,EAChB;gBACC,qBAAqB;gBACrB,IAAI;gBACJ,gBAAgB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,kDAAkD;aAC1F,EACD,EAAE,QAAQ,EAAE,MAAM,EAAE,CACpB,CAAC;YACF,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,WAAW,CAAC,CAAC;QAChD,CAAC;IACF,CAAC;YAAS,CAAC;QACV,MAAM,MAAM,CAAC,EAAE,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,CAAC;AACF,CAAC,CACD,CAAC;AAEF,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,iBAAiB,EAAE,gBAAgB,CAAU,CAAC,CACnE,+DAA+D,EAC/D,KAAK,EAAE,QAAQ,EAAE,EAAE;IAClB,EAAE,CAAC,YAAY,EAAE,CAAC;IAClB,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAChC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,8BAA8B,CAAC,CAC9D,CAAC;IACF,IAAI,CAAC;QACJ,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;QAC1D,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;QACrE,MAAM,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAChC,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;QACpD,MAAM,MAAM,CAAC,QAAQ,CACpB,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,+BAA+B,CAAC,EACvE,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAChC,CAAC;QACF,MAAM,MAAM,CAAC,SAAS,CACrB,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,EAC3C,IAAI,CAAC,SAAS,CAAC;YACd,UAAU,EAAE,IAAI;YAChB,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;YACrB,OAAO,EAAE,CAAC,aAAa,CAAC;YACxB,6BAA6B,EAAE;gBAC9B,WAAW,EAAE,0BAA0B;aACvC;SACD,CAAC,CACF,CAAC;QACF,KAAK,MAAM,MAAM,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YACnC,MAAM,MAAM,CAAC,SAAS,CACrB,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,MAAM,OAAO,CAAC,EACjD,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,WAAW,EAAE,WAAW,EAAE,CAAC,CAChE,CAAC;QACH,CAAC;QACD,MAAM,MAAM,CAAC,SAAS,CACrB,UAAU,EACV,wDAAwD,CACxD,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;YACjC,UAAU,EAAE,KAAK;YACjB,IAAI;YACJ,QAAQ,EAAE,QAAQ;YAClB,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE;YACnD,OAAO,EAAE;gBACR,mBAAmB,CAAC;oBACnB,OAAO,EAAE,kBAAkB;oBAC3B,MAAM,EAAE,iBAAiB;oBACzB,EAAE,EAAE,EAAE,GAAG,UAAU,EAAE;oBACrB,0BAA0B,EAAE,IAAI;oBAChC,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC;iBAChE,CAAC;aACF;SACD,CAAC,CAAC;QACH,IAAI,CAAC;YACJ,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;YACtB,MAAM,MAAM,CAAC,YAAY,CAAC,MAAO,CAAC,eAAe,CAAC,UAAU,EAAE,CAAC;YAC/D,MAAM,YAAY,GAAG,KAAK,EACzB,UAA4D,EAC3D,EAAE;gBACH,MAAM,QAAQ,GAAG,QAAQ,IAAI,UAAU,IAAI,gBAAgB,CAAC;gBAC5D,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,QAAQ,CACjC,QAAQ,CAAC,IAAI,CACZ,IAAI,EACJ,QAAQ,KAAK,iBAAiB;oBAC7B,CAAC,CAAC,oCAAoC;oBACtC,CAAC,CAAC,kCAAkC,CACrC,EACD,MAAM,CACN,CAAC;gBACF,IAAI,QAAQ,KAAK,iBAAiB,EAAE,CAAC;oBACpC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;oBACtC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;gBACvC,CAAC;qBAAM,CAAC;oBACP,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;oBAC1C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;gBACnC,CAAC;YACF,CAAC,CAAC;YACF,MAAM,YAAY,CAAC,iBAAiB,CAAC,CAAC;YACtC,KAAK,MAAM,MAAM,IAAI;gBACpB,gBAAgB;gBAChB,SAAS;gBACT,iBAAiB;aACR,EAAE,CAAC;gBACZ,MAAM,MAAM,CAAC,SAAS,CACrB,UAAU,EACV,kBAAkB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAC9E,CAAC;gBACF,MAAM,MAAM,CAAC,YAAY,CAAC,MAAO,CAAC,eAAe,CAAC,WAAW,CAC5D,UAAU,EACV,EAAE,KAAK,EAAE,QAAQ,EAAE,CACnB,CAAC;gBACF,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;YAC5B,CAAC;YACD,MAAM,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;YAC5B,MAAM,MAAM,CAAC,YAAY,CAAC,MAAO,CAAC,eAAe,CAAC,WAAW,CAC5D,UAAU,EACV,EAAE,KAAK,EAAE,QAAQ,EAAE,CACnB,CAAC;YACF,MAAM,YAAY,CAAC,SAAS,CAAC,CAAC;YAC9B,MAAM,MAAM,CAAC,SAAS,CACrB,UAAU,EACV,wDAAwD,CACxD,CAAC;YACF,MAAM,MAAM,CAAC,YAAY,CAAC,MAAO,CAAC,eAAe,CAAC,WAAW,CAC5D,UAAU,EACV,EAAE,KAAK,EAAE,QAAQ,EAAE,CACnB,CAAC;YACF,MAAM,YAAY,CAAC,iBAAiB,CAAC,CAAC;QACvC,CAAC;gBAAS,CAAC;YACV,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACtB,CAAC;IACF,CAAC;YAAS,CAAC;QACV,MAAM,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;AACF,CAAC,CACD,CAAC;AAEF,IAAI,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;IACnF,EAAE,CAAC,YAAY,EAAE,CAAC;IAClB,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAChC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,gCAAgC,CAAC,CAChE,CAAC;IACF,IAAI,CAAC;QACJ,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;QAC1D,MAAM,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAChC,MAAM,MAAM,CAAC,SAAS,CACrB,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,qBAAqB,CAAC,EACjD,kBAAkB,CAClB,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;YACjC,UAAU,EAAE,KAAK;YACjB,IAAI;YACJ,QAAQ,EAAE,QAAQ;YAClB,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE;YACtC,OAAO,EAAE;gBACR,mBAAmB,CAAC;oBACnB,OAAO,EAAE,kBAAkB;oBAC3B,MAAM,EAAE,iBAAiB;oBACzB,0BAA0B,EAAE,IAAI;oBAChC,EAAE,EAAE,EAAE,GAAG,UAAU,EAAE;iBACrB,CAAC;aACF;SACD,CAAC,CAAC;QACH,IAAI,CAAC;YACJ,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;YACtB,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjD,CAAC;gBAAS,CAAC;YACV,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACtB,CAAC;IACF,CAAC;YAAS,CAAC;QACV,MAAM,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,SAAS,aAAa,CAAC,MAAmB,EAAE,KAAa;IACxD,OAAO;QACN,EAAE,EAAE,YAAY,MAAM,EAAE;QACxB,SAAS,EAAE,UAAU;QACrB,MAAM;QACN,SAAS,EAAE,EAAE;QACb,QAAQ,EAAE;YACT;gBACC,EAAE,EAAE,YAAY,MAAM,UAAU;gBAChC,UAAU,EAAE,YAAY,MAAM,EAAE;gBAChC,OAAO,EAAE,EAAE;gBACX,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,KAAK,EAAE,CAAC;aAC3C;SACD;KACD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,mBAAmB,CACjC,UAAkB,EAClB,MAAkD;IAElD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CACjC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAChE,CAAC;IACF,OAAO,CACN,MAAM,OAAO,CAAC,GAAG,CAChB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACpB,MAAM,CAAC,QAAQ,CACd,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,EAC3D,MAAM,CACN,CACD,CACD,CACD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACd,CAAC;AAED,KAAK,UAAU,cAAc,CAC5B,UAAkB,EAClB,MAAkD;IAElD,OAAO,CACN,MAAM,OAAO,CAAC,GAAG,CAChB,MAAM,CAAC,KAAK;SACV,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;SAChD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACb,MAAM,CAAC,QAAQ,CACd,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,EAC1D,MAAM,CACN,CACD,CACF,CACD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACd,CAAC;AAED,KAAK,UAAU,aAAa,CAC3B,UAAkB,EAClB,MAAkD;IAElD,OAAO,CACN,MAAM,OAAO,CAAC,GAAG,CAChB,MAAM,CAAC,KAAK;SACV,MAAM,CACN,CAAC,IAAI,EAAE,EAAE,CACR,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACxD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAC/B;SACA,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACb,MAAM,CAAC,QAAQ,CACd,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,EAC1D,MAAM,CACN,CACD,CACF,CACD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACd,CAAC","sourcesContent":["import nodeFs from \"node:fs/promises\";\nimport nodeSyncFs from \"node:fs\";\nimport nodeOs from \"node:os\";\nimport nodePath from \"node:path\";\nimport {\n\tinsertBundleNested,\n\tloadProjectInMemory,\n\tnewProject,\n\ttype BundleNested,\n} from \"@inlang/sdk\";\nimport { createBuilder, createServer } from \"vite\";\nimport { execFileSync } from \"node:child_process\";\nimport { pathToFileURL } from \"node:url\";\nimport { createRequire } from \"node:module\";\nimport { expect, test, vi } from \"vitest\";\nimport { compileProject } from \"../../compiler/compile-project.js\";\nimport { perLocaleBuildStaticLocaleExpression } from \"../../compiler/per-locale-build.js\";\nimport {\n\tcreateViteLocaleBuildPlan,\n\tcreateViteLocaleEnvironmentPlugin,\n\ttype ViteLocaleBuildManifest,\n\tVITE_LOCALE_BUILD_MANIFEST,\n} from \"./vite-environments.js\";\n\ntest(\"creates deterministic locale environment names and output directories\", () => {\n\texpect(\n\t\tcreateViteLocaleBuildPlan({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"zh-Hant\"],\n\t\t\t},\n\t\t\toutputDirectory: \"build\",\n\t\t})\n\t).toEqual({\n\t\toutputDirectory: \"build\",\n\t\tvariants: [\n\t\t\t{\n\t\t\t\tlocale: \"en\",\n\t\t\t\tenvironmentName: \"paraglide_client_en_656e\",\n\t\t\t\tdirectory: \"__paraglide/en-656e\",\n\t\t\t\toutputDirectory: \"build/__paraglide/en-656e\",\n\t\t\t\tdefine: {\n\t\t\t\t\t\"globalThis.__PARAGLIDE_STATIC_LOCALE__\": '\"en\"',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tlocale: \"zh-Hant\",\n\t\t\t\tenvironmentName: \"paraglide_client_zh_Hant_7a682d48616e74\",\n\t\t\t\tdirectory: \"__paraglide/zh-Hant-7a682d48616e74\",\n\t\t\t\toutputDirectory: \"build/__paraglide/zh-Hant-7a682d48616e74\",\n\t\t\t\tdefine: {\n\t\t\t\t\t\"globalThis.__PARAGLIDE_STATIC_LOCALE__\": '\"zh-Hant\"',\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t});\n\texpect(() =>\n\t\tcreateViteLocaleBuildPlan({\n\t\t\tsettings: { baseLocale: \"en\", locales: [\"en\"] },\n\t\t\toutputDirectory: \"../outside\",\n\t\t})\n\t).toThrow(\"must be a project-relative directory\");\n});\n\ntest(\"builds closed, source-mapped Rolldown graphs without post-processing\", async () => {\n\tconst temporaryRoot = await nodeFs.mkdtemp(\n\t\tnodePath.join(nodeOs.tmpdir(), \"paraglide-vite-environments-\")\n\t);\n\tconst root = await nodeFs.realpath(temporaryRoot);\n\ttry {\n\t\tawait nodeFs.mkdir(nodePath.join(root, \"src/messages\"), {\n\t\t\trecursive: true,\n\t\t});\n\t\tawait Promise.all([\n\t\t\tnodeFs.writeFile(\n\t\t\t\tnodePath.join(root, \"index.html\"),\n\t\t\t\t'<main id=\"app\"></main><script type=\"module\" src=\"./src/main.js\"></script>\\n'\n\t\t\t),\n\t\t\tnodeFs.writeFile(\n\t\t\t\tnodePath.join(root, \"src/main.js\"),\n\t\t\t\t[\n\t\t\t\t\t'import \"./style.css\";',\n\t\t\t\t\t'import \"external-dependency\";',\n\t\t\t\t\t'import { message, loadLazy } from \"./messages/_index.js\";',\n\t\t\t\t\t'document.querySelector(\"#app\").textContent = message;',\n\t\t\t\t\t\"loadLazy().then((module) => module.mount());\",\n\t\t\t\t\t\"\",\n\t\t\t\t].join(\"\\n\")\n\t\t\t),\n\t\t\tnodeFs.writeFile(\n\t\t\t\tnodePath.join(root, \"src/messages/_index.js\"),\n\t\t\t\t[\n\t\t\t\t\t\" const locale = globalThis.__PARAGLIDE_STATIC_LOCALE__;\",\n\t\t\t\t\t'import * as en from \"./en.js\";',\n\t\t\t\t\t'import * as de from \"./de.js\";',\n\t\t\t\t\t\"export const message = locale === 'en' ? en.message : de.message;\",\n\t\t\t\t\t\"export const loadLazy = locale === 'en'\",\n\t\t\t\t\t' ? () => import(\"./en-lazy.js\")',\n\t\t\t\t\t' : () => import(\"./de-lazy.js\");',\n\t\t\t\t\t\"\",\n\t\t\t\t].join(\"\\n\")\n\t\t\t),\n\t\t\tnodeFs.writeFile(\n\t\t\t\tnodePath.join(root, \"src/messages/en.js\"),\n\t\t\t\t'export const message = \"EN_ONLY_MESSAGE\";\\n'\n\t\t\t),\n\t\t\tnodeFs.writeFile(\n\t\t\t\tnodePath.join(root, \"src/messages/de.js\"),\n\t\t\t\t'export const message = \"DE_ONLY_MESSAGE\";\\n'\n\t\t\t),\n\t\t\tnodeFs.writeFile(\n\t\t\t\tnodePath.join(root, \"src/messages/en-lazy.js\"),\n\t\t\t\t'export function mount() { document.body.dataset.lazy = \"EN_ONLY_LAZY\"; }\\n'\n\t\t\t),\n\t\t\tnodeFs.writeFile(\n\t\t\t\tnodePath.join(root, \"src/messages/de-lazy.js\"),\n\t\t\t\t'export function mount() { document.body.dataset.lazy = \"DE_ONLY_LAZY\"; }\\n'\n\t\t\t),\n\t\t\tnodeFs.writeFile(\n\t\t\t\tnodePath.join(root, \"src/style.css\"),\n\t\t\t\t\"#app { color: rebeccapurple; }\\n\"\n\t\t\t),\n\t\t]);\n\t\tawait nodeFs.mkdir(\n\t\t\tnodePath.join(root, \"build/__paraglide/removed-locale\"),\n\t\t\t{ recursive: true }\n\t\t);\n\t\tawait Promise.all([\n\t\t\tnodeFs.writeFile(\n\t\t\t\tnodePath.join(root, \"build/__paraglide/removed-locale/stale.js\"),\n\t\t\t\t\"stale\"\n\t\t\t),\n\t\t\tnodeFs.writeFile(\n\t\t\t\tnodePath.join(root, \"build\", VITE_LOCALE_BUILD_MANIFEST),\n\t\t\t\t'{\"stale\":true}\\n'\n\t\t\t),\n\t\t]);\n\n\t\tlet renderBuiltUrlCalls = 0;\n\t\tconst builder = await createBuilder({\n\t\t\tconfigFile: false,\n\t\t\troot,\n\t\t\tbase: \"./\",\n\t\t\tlogLevel: \"silent\",\n\t\t\texperimental: {\n\t\t\t\trenderBuiltUrl() {\n\t\t\t\t\trenderBuiltUrlCalls += 1;\n\t\t\t\t\treturn { relative: true };\n\t\t\t\t},\n\t\t\t},\n\t\t\tbuild: {\n\t\t\t\toutDir: \"build\",\n\t\t\t\tminify: false,\n\t\t\t\tsourcemap: true,\n\t\t\t\trolldownOptions: {\n\t\t\t\t\texternal: [\"external-dependency\"],\n\t\t\t\t\toutput: {\n\t\t\t\t\t\tentryFileNames: \"custom/[name]-[hash].js\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tplugins: [\n\t\t\t\tcreateViteLocaleEnvironmentPlugin({\n\t\t\t\t\tsettings: async () => ({\n\t\t\t\t\t\tbaseLocale: \"en\",\n\t\t\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t\t\t}),\n\t\t\t\t}),\n\t\t\t],\n\t\t});\n\t\tawait builder.buildApp();\n\n\t\tconst outputRoot = nodePath.join(root, \"build\");\n\t\tconst manifest = JSON.parse(\n\t\t\tawait nodeFs.readFile(\n\t\t\t\tnodePath.join(outputRoot, VITE_LOCALE_BUILD_MANIFEST),\n\t\t\t\t\"utf8\"\n\t\t\t)\n\t\t) as ViteLocaleBuildManifest;\n\t\texpect(manifest.backend).toBe(\"vite-rolldown-environments\");\n\t\texpect(Object.keys(manifest.locales)).toEqual([\"en\", \"de\"]);\n\t\texpect(renderBuiltUrlCalls).toBeGreaterThan(0);\n\t\tawait expect(\n\t\t\tnodeFs.access(\n\t\t\t\tnodePath.join(outputRoot, \"__paraglide/removed-locale/stale.js\")\n\t\t\t)\n\t\t).rejects.toThrow();\n\n\t\tfor (const locale of [\"en\", \"de\"] as const) {\n\t\t\tconst localeManifest = manifest.locales[locale]!;\n\t\t\texpect(localeManifest.directory).toMatch(\n\t\t\t\tnew RegExp(`^__paraglide/${locale}-`)\n\t\t\t);\n\t\t\texpect(localeManifest.files.some((file) => file.entry)).toBe(true);\n\t\t\texpect(\n\t\t\t\tlocaleManifest.files.some(\n\t\t\t\t\t(file) => file.entry && file.fileName.startsWith(\"custom/\")\n\t\t\t\t)\n\t\t\t).toBe(true);\n\t\t\texpect(\n\t\t\t\tlocaleManifest.files.some((file) =>\n\t\t\t\t\tfile.externalImports?.includes(\"external-dependency\")\n\t\t\t\t)\n\t\t\t).toBe(true);\n\t\t\texpect(\n\t\t\t\tlocaleManifest.files.some((file) => file.fileName.endsWith(\".map\"))\n\t\t\t).toBe(true);\n\n\t\t\tconst names = new Set(localeManifest.files.map((file) => file.fileName));\n\t\t\tfor (const file of localeManifest.files) {\n\t\t\t\tfor (const imported of [\n\t\t\t\t\t...(file.imports ?? []),\n\t\t\t\t\t...(file.dynamicImports ?? []),\n\t\t\t\t]) {\n\t\t\t\t\texpect(names.has(imported)).toBe(true);\n\t\t\t\t}\n\t\t\t\tconst bytes = (\n\t\t\t\t\tawait nodeFs.readFile(\n\t\t\t\t\t\tnodePath.join(outputRoot, localeManifest.directory, file.fileName)\n\t\t\t\t\t)\n\t\t\t\t).byteLength;\n\t\t\t\texpect(bytes).toBe(file.bytes);\n\t\t\t}\n\t\t}\n\n\t\tconst enJavaScript = await readJavaScriptGraph(\n\t\t\toutputRoot,\n\t\t\tmanifest.locales.en!\n\t\t);\n\t\tconst deJavaScript = await readJavaScriptGraph(\n\t\t\toutputRoot,\n\t\t\tmanifest.locales.de!\n\t\t);\n\t\texpect(enJavaScript).toContain(\"EN_ONLY_MESSAGE\");\n\t\texpect(enJavaScript).toContain(\"EN_ONLY_LAZY\");\n\t\texpect(enJavaScript).not.toContain(\"DE_ONLY_MESSAGE\");\n\t\texpect(enJavaScript).not.toContain(\"DE_ONLY_LAZY\");\n\t\texpect(deJavaScript).toContain(\"DE_ONLY_MESSAGE\");\n\t\texpect(deJavaScript).toContain(\"DE_ONLY_LAZY\");\n\t\texpect(deJavaScript).not.toContain(\"EN_ONLY_MESSAGE\");\n\t\texpect(deJavaScript).not.toContain(\"EN_ONLY_LAZY\");\n\n\t\tconst enSourceMaps = await readSourceMaps(outputRoot, manifest.locales.en!);\n\t\tconst deSourceMaps = await readSourceMaps(outputRoot, manifest.locales.de!);\n\t\texpect(enSourceMaps).not.toContain(\"DE_ONLY_MESSAGE\");\n\t\texpect(enSourceMaps).not.toContain(\"DE_ONLY_LAZY\");\n\t\texpect(deSourceMaps).not.toContain(\"EN_ONLY_MESSAGE\");\n\t\texpect(deSourceMaps).not.toContain(\"EN_ONLY_LAZY\");\n\t} finally {\n\t\tawait nodeFs.rm(temporaryRoot, { recursive: true, force: true });\n\t}\n});\n\ntest(\"keeps compiled Paraglide translations out of other locale source maps\", async () => {\n\tconst temporaryRoot = await nodeFs.mkdtemp(\n\t\tnodePath.join(nodeOs.tmpdir(), \"paraglide-vite-compiled-\")\n\t);\n\tconst root = await nodeFs.realpath(temporaryRoot);\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject({\n\t\t\tsettings: { baseLocale: \"en\", locales: [\"en\", \"de\"] },\n\t\t}),\n\t});\n\ttry {\n\t\tawait insertBundleNested(project.db, {\n\t\t\tid: \"greeting\",\n\t\t\tdeclarations: [],\n\t\t\tmessages: [\n\t\t\t\tcreateMessage(\"en\", \"EN_COMPILED_TRANSLATION\"),\n\t\t\t\tcreateMessage(\"de\", \"DE_COMPILED_TRANSLATION\"),\n\t\t\t],\n\t\t} satisfies BundleNested);\n\t\tconst generated = await compileProject({\n\t\t\tproject,\n\t\t\tcompilerOptions: {\n\t\t\t\toutputStructure: \"locale-modules\",\n\t\t\t\texperimentalStaticLocale: perLocaleBuildStaticLocaleExpression,\n\t\t\t\temitGitIgnore: false,\n\t\t\t\temitPrettierIgnore: false,\n\t\t\t\temitReadme: false,\n\t\t\t},\n\t\t});\n\t\tconst generatedRoot = nodePath.join(root, \"src/paraglide\");\n\t\tfor (const [fileName, source] of Object.entries(generated)) {\n\t\t\tconst path = nodePath.join(generatedRoot, fileName);\n\t\t\tawait nodeFs.mkdir(nodePath.dirname(path), { recursive: true });\n\t\t\tawait nodeFs.writeFile(path, source);\n\t\t}\n\t\tawait Promise.all([\n\t\t\tnodeFs.writeFile(\n\t\t\t\tnodePath.join(root, \"index.html\"),\n\t\t\t\t'<script type=\"module\" src=\"./src/main.js\"></script>\\n'\n\t\t\t),\n\t\t\tnodeFs.writeFile(\n\t\t\t\tnodePath.join(root, \"src/main.js\"),\n\t\t\t\t'import { greeting } from \"./paraglide/messages.js\";\\ndocument.body.textContent = greeting();\\n'\n\t\t\t),\n\t\t]);\n\n\t\tconst builder = await createBuilder({\n\t\t\tconfigFile: false,\n\t\t\troot,\n\t\t\tbase: \"./\",\n\t\t\tlogLevel: \"silent\",\n\t\t\tbuild: { minify: false, sourcemap: true },\n\t\t\tplugins: [\n\t\t\t\tcreateViteLocaleEnvironmentPlugin({\n\t\t\t\t\tsettings: async () => ({\n\t\t\t\t\t\tbaseLocale: \"en\",\n\t\t\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t\t\t}),\n\t\t\t\t}),\n\t\t\t],\n\t\t});\n\t\tawait builder.buildApp();\n\n\t\tconst outputRoot = nodePath.join(root, \"dist\");\n\t\tconst manifest = JSON.parse(\n\t\t\tawait nodeFs.readFile(\n\t\t\t\tnodePath.join(outputRoot, VITE_LOCALE_BUILD_MANIFEST),\n\t\t\t\t\"utf8\"\n\t\t\t)\n\t\t) as ViteLocaleBuildManifest;\n\t\tconst enGraph = await readGraphText(outputRoot, manifest.locales.en!);\n\t\tconst deGraph = await readGraphText(outputRoot, manifest.locales.de!);\n\t\texpect(enGraph).toContain(\"EN_COMPILED_TRANSLATION\");\n\t\texpect(enGraph).not.toContain(\"DE_COMPILED_TRANSLATION\");\n\t\texpect(deGraph).toContain(\"DE_COMPILED_TRANSLATION\");\n\t\texpect(deGraph).not.toContain(\"EN_COMPILED_TRANSLATION\");\n\t} finally {\n\t\tawait project.close();\n\t\tawait nodeFs.rm(temporaryRoot, { recursive: true, force: true });\n\t}\n});\n\ntest.each([\"plugin override\", \"project config\"] as const)(\n\t\"message modules from %s specialize direct imports and keep lazy page messages out of initial chunks\",\n\tasync (source) => {\n\t\tvi.resetModules();\n\t\tconst { paraglideVitePlugin } = await import(\"../vite.js\");\n\t\tconst temporaryRoot = await nodeFs.mkdtemp(\n\t\t\tnodePath.join(nodeOs.tmpdir(), \"paraglide-vite-message-modules-\")\n\t\t);\n\t\tconst root = await nodeFs.realpath(temporaryRoot);\n\t\ttry {\n\t\t\tconst projectRoot = nodePath.join(root, \"project.inlang\");\n\t\t\tawait nodeFs.mkdir(projectRoot, { recursive: true });\n\t\t\tawait nodeFs.mkdir(nodePath.join(root, \"messages\"));\n\t\t\tawait nodeFs.writeFile(\n\t\t\t\tnodePath.join(projectRoot, \"paraglide.config.js\"),\n\t\t\t\t`export default { outputStructure: \"${source === \"project config\" ? \"message-modules\" : \"locale-modules\"}\" };`\n\t\t\t);\n\t\t\tawait nodeFs.copyFile(\n\t\t\t\tcreateRequire(import.meta.url).resolve(\"@inlang/plugin-message-format\"),\n\t\t\t\tnodePath.join(root, \"plugin.js\")\n\t\t\t);\n\t\t\tawait nodeFs.writeFile(\n\t\t\t\tnodePath.join(projectRoot, \"settings.json\"),\n\t\t\t\tJSON.stringify({\n\t\t\t\t\tbaseLocale: \"en\",\n\t\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t\t\tmodules: [\"./plugin.js\"],\n\t\t\t\t\t\"plugin.inlang.messageFormat\": {\n\t\t\t\t\t\tpathPattern: \"./messages/{locale}.json\",\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t);\n\t\t\tfor (const locale of [\"en\", \"de\"]) {\n\t\t\t\tawait nodeFs.writeFile(\n\t\t\t\t\tnodePath.join(root, \"messages\", `${locale}.json`),\n\t\t\t\t\tJSON.stringify(\n\t\t\t\t\t\tObject.fromEntries(\n\t\t\t\t\t\t\t[\"greeting\", \"lazy_message\", \"unused_message\"].map((id) => [\n\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t`${locale.toUpperCase()}_${id.toUpperCase()}`,\n\t\t\t\t\t\t\t])\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tawait nodeFs.mkdir(nodePath.join(root, \"src\"), { recursive: true });\n\t\t\tawait Promise.all([\n\t\t\t\tnodeFs.writeFile(\n\t\t\t\t\tnodePath.join(root, \"index.html\"),\n\t\t\t\t\t'<script type=\"module\" src=\"./src/main.js\"></script>'\n\t\t\t\t),\n\t\t\t\tnodeFs.writeFile(\n\t\t\t\t\tnodePath.join(root, \"src/main.js\"),\n\t\t\t\t\t'import { greeting } from \"./paraglide/messages/greeting.js\"; globalThis.translation = greeting(); globalThis.loadPage = () => import(\"./lazy-page.js\");'\n\t\t\t\t),\n\t\t\t\tnodeFs.writeFile(\n\t\t\t\t\tnodePath.join(root, \"src/lazy-page.js\"),\n\t\t\t\t\t'import { lazy_message } from \"./paraglide/messages/lazy_message.js\"; globalThis.lazyTranslation = lazy_message();'\n\t\t\t\t),\n\t\t\t]);\n\t\t\tconst server = await createServer({\n\t\t\t\tconfigFile: false,\n\t\t\t\troot,\n\t\t\t\tlogLevel: \"silent\",\n\t\t\t\tserver: { port: 0, host: \"127.0.0.1\" },\n\t\t\t\tplugins: [\n\t\t\t\t\tparaglideVitePlugin({\n\t\t\t\t\t\tproject: \"./project.inlang\",\n\t\t\t\t\t\toutdir: \"./src/paraglide-dev\",\n\t\t\t\t\t\tfs: { ...nodeSyncFs },\n\t\t\t\t\t\texperimentalPerLocaleBuild: true,\n\t\t\t\t\t\t...(source === \"plugin override\"\n\t\t\t\t\t\t\t? { outputStructure: \"message-modules\" as const }\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t}),\n\t\t\t\t],\n\t\t\t});\n\t\t\ttry {\n\t\t\t\tawait server.listen();\n\t\t\t\tawait server.environments.client!.pluginContainer.buildStart();\n\t\t\t\tconst transformed = await server.transformRequest(\n\t\t\t\t\t\"/src/paraglide-dev/messages/greeting.js\"\n\t\t\t\t);\n\t\t\t\texpect(transformed?.code).toContain(\"EN_GREETING\");\n\t\t\t} finally {\n\t\t\t\tawait server.close();\n\t\t\t}\n\n\t\t\tconst builder = await createBuilder({\n\t\t\t\tconfigFile: false,\n\t\t\t\troot,\n\t\t\t\tbase: \"./\",\n\t\t\t\tlogLevel: \"silent\",\n\t\t\t\tbuild: { minify: false, modulePreload: false, sourcemap: true },\n\t\t\t\tplugins: [\n\t\t\t\t\tparaglideVitePlugin({\n\t\t\t\t\t\tproject: \"./project.inlang\",\n\t\t\t\t\t\toutdir: \"./src/paraglide\",\n\t\t\t\t\t\tfs: { ...nodeSyncFs },\n\t\t\t\t\t\texperimentalPerLocaleBuild: true,\n\t\t\t\t\t\t...(source === \"plugin override\"\n\t\t\t\t\t\t\t? { outputStructure: \"message-modules\" as const }\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t}),\n\t\t\t\t],\n\t\t\t});\n\t\t\tawait builder.buildApp();\n\t\t\tconst outputRoot = nodePath.join(root, \"dist\");\n\t\t\tconst manifest = JSON.parse(\n\t\t\t\tawait nodeFs.readFile(\n\t\t\t\t\tnodePath.join(outputRoot, VITE_LOCALE_BUILD_MANIFEST),\n\t\t\t\t\t\"utf8\"\n\t\t\t\t)\n\t\t\t) as ViteLocaleBuildManifest;\n\t\t\tfor (const locale of [\"en\", \"de\"] as const) {\n\t\t\t\tconst variant = manifest.locales[locale]!;\n\t\t\t\tconst graph = await readJavaScriptGraph(outputRoot, variant);\n\t\t\t\tconst prefix = locale.toUpperCase();\n\t\t\t\texpect(graph).toContain(`${prefix}_GREETING`);\n\t\t\t\texpect(graph).toContain(`${prefix}_LAZY_MESSAGE`);\n\t\t\t\texpect(graph).not.toContain(\n\t\t\t\t\t`${locale === \"en\" ? \"DE\" : \"EN\"}_GREETING`\n\t\t\t\t);\n\t\t\t\texpect(graph).not.toContain(\n\t\t\t\t\t`${locale === \"en\" ? \"DE\" : \"EN\"}_LAZY_MESSAGE`\n\t\t\t\t);\n\t\t\t\tconst initialNames = new Set<string>();\n\t\t\t\tconst visit = (name: string) => {\n\t\t\t\t\tif (initialNames.has(name)) return;\n\t\t\t\t\tinitialNames.add(name);\n\t\t\t\t\tfor (const imported of variant.files.find(\n\t\t\t\t\t\t(file) => file.fileName === name\n\t\t\t\t\t)?.imports ?? [])\n\t\t\t\t\t\tvisit(imported);\n\t\t\t\t};\n\t\t\t\tfor (const entry of variant.files.filter((file) => file.entry))\n\t\t\t\t\tvisit(entry.fileName);\n\t\t\t\tconst initial = (\n\t\t\t\t\tawait Promise.all(\n\t\t\t\t\t\t[...initialNames].map((name) =>\n\t\t\t\t\t\t\tnodeFs.readFile(\n\t\t\t\t\t\t\t\tnodePath.join(outputRoot, variant.directory, name),\n\t\t\t\t\t\t\t\t\"utf8\"\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t).join(\"\\n\");\n\t\t\t\texpect(initial).not.toContain(`${prefix}_LAZY_MESSAGE`);\n\t\t\t\texpect(initial).not.toContain(\"UNUSED_MESSAGE\");\n\t\t\t\texpect(\n\t\t\t\t\tvariant.files.some((file) => (file.dynamicImports?.length ?? 0) > 0)\n\t\t\t\t).toBe(true);\n\t\t\t\t// Execute the actual emitted initial graph. The lazy loader remains uncalled.\n\t\t\t\tawait nodeFs.writeFile(\n\t\t\t\t\tnodePath.join(root, \"package.json\"),\n\t\t\t\t\t'{\"type\":\"module\"}'\n\t\t\t\t);\n\t\t\t\tconst entry = variant.files.find((file) => file.entry)!;\n\t\t\t\tconst entryUrl = pathToFileURL(\n\t\t\t\t\tnodePath.join(outputRoot, variant.directory, entry.fileName)\n\t\t\t\t).href;\n\t\t\t\tconst translation = execFileSync(\n\t\t\t\t\tprocess.execPath,\n\t\t\t\t\t[\n\t\t\t\t\t\t\"--input-type=module\",\n\t\t\t\t\t\t\"-e\",\n\t\t\t\t\t\t`await import(${JSON.stringify(entryUrl)}); process.stdout.write(globalThis.translation);`,\n\t\t\t\t\t],\n\t\t\t\t\t{ encoding: \"utf8\" }\n\t\t\t\t);\n\t\t\t\texpect(translation).toBe(`${prefix}_GREETING`);\n\t\t\t}\n\t\t} finally {\n\t\t\tawait nodeFs.rm(temporaryRoot, { recursive: true, force: true });\n\t\t}\n\t}\n);\n\ntest.each([undefined, \"message-modules\", \"locale-modules\"] as const)(\n\t\"per-locale dev watches layout changes with plugin override %s\",\n\tasync (override) => {\n\t\tvi.resetModules();\n\t\tconst { paraglideVitePlugin } = await import(\"../vite.js\");\n\t\tconst root = await nodeFs.mkdtemp(\n\t\t\tnodePath.join(nodeOs.tmpdir(), \"paraglide-vite-layout-watch-\")\n\t\t);\n\t\ttry {\n\t\t\tconst projectRoot = nodePath.join(root, \"project.inlang\");\n\t\t\tconst configPath = nodePath.join(projectRoot, \"paraglide.config.js\");\n\t\t\tawait nodeFs.mkdir(projectRoot);\n\t\t\tawait nodeFs.mkdir(nodePath.join(root, \"messages\"));\n\t\t\tawait nodeFs.copyFile(\n\t\t\t\tcreateRequire(import.meta.url).resolve(\"@inlang/plugin-message-format\"),\n\t\t\t\tnodePath.join(root, \"plugin.js\")\n\t\t\t);\n\t\t\tawait nodeFs.writeFile(\n\t\t\t\tnodePath.join(projectRoot, \"settings.json\"),\n\t\t\t\tJSON.stringify({\n\t\t\t\t\tbaseLocale: \"en\",\n\t\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t\t\tmodules: [\"./plugin.js\"],\n\t\t\t\t\t\"plugin.inlang.messageFormat\": {\n\t\t\t\t\t\tpathPattern: \"./messages/{locale}.json\",\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t);\n\t\t\tfor (const locale of [\"en\", \"de\"]) {\n\t\t\t\tawait nodeFs.writeFile(\n\t\t\t\t\tnodePath.join(root, \"messages\", `${locale}.json`),\n\t\t\t\t\tJSON.stringify({ greeting: `${locale.toUpperCase()}_GREETING` })\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait nodeFs.writeFile(\n\t\t\t\tconfigPath,\n\t\t\t\t'export default { outputStructure: \"message-modules\" };'\n\t\t\t);\n\t\t\tconst server = await createServer({\n\t\t\t\tconfigFile: false,\n\t\t\t\troot,\n\t\t\t\tlogLevel: \"silent\",\n\t\t\t\tserver: { port: 0, host: \"127.0.0.1\", watch: null },\n\t\t\t\tplugins: [\n\t\t\t\t\tparaglideVitePlugin({\n\t\t\t\t\t\tproject: \"./project.inlang\",\n\t\t\t\t\t\toutdir: \"./src/paraglide\",\n\t\t\t\t\t\tfs: { ...nodeSyncFs },\n\t\t\t\t\t\texperimentalPerLocaleBuild: true,\n\t\t\t\t\t\t...(override === undefined ? {} : { outputStructure: override }),\n\t\t\t\t\t}),\n\t\t\t\t],\n\t\t\t});\n\t\t\ttry {\n\t\t\t\tawait server.listen();\n\t\t\t\tawait server.environments.client!.pluginContainer.buildStart();\n\t\t\t\tconst assertLayout = async (\n\t\t\t\t\tconfigured: \"message-modules\" | \"locale-modules\" | undefined\n\t\t\t\t) => {\n\t\t\t\t\tconst expected = override ?? configured ?? \"locale-modules\";\n\t\t\t\t\tconst code = await nodeFs.readFile(\n\t\t\t\t\t\tnodePath.join(\n\t\t\t\t\t\t\troot,\n\t\t\t\t\t\t\texpected === \"message-modules\"\n\t\t\t\t\t\t\t\t? \"src/paraglide/messages/greeting.js\"\n\t\t\t\t\t\t\t\t: \"src/paraglide/messages/_index.js\"\n\t\t\t\t\t\t),\n\t\t\t\t\t\t\"utf8\"\n\t\t\t\t\t);\n\t\t\t\t\tif (expected === \"message-modules\") {\n\t\t\t\t\t\texpect(code).toContain(\"EN_GREETING\");\n\t\t\t\t\t\texpect(code).toContain(\"DE_GREETING\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\texpect(code).not.toContain(\"EN_GREETING\");\n\t\t\t\t\t\texpect(code).toContain(\"./en.js\");\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tawait assertLayout(\"message-modules\");\n\t\t\t\tfor (const layout of [\n\t\t\t\t\t\"locale-modules\",\n\t\t\t\t\tundefined,\n\t\t\t\t\t\"message-modules\",\n\t\t\t\t] as const) {\n\t\t\t\t\tawait nodeFs.writeFile(\n\t\t\t\t\t\tconfigPath,\n\t\t\t\t\t\t`export default ${JSON.stringify(layout ? { outputStructure: layout } : {})};`\n\t\t\t\t\t);\n\t\t\t\t\tawait server.environments.client!.pluginContainer.watchChange(\n\t\t\t\t\t\tconfigPath,\n\t\t\t\t\t\t{ event: \"update\" }\n\t\t\t\t\t);\n\t\t\t\t\tawait assertLayout(layout);\n\t\t\t\t}\n\t\t\t\tawait nodeFs.rm(configPath);\n\t\t\t\tawait server.environments.client!.pluginContainer.watchChange(\n\t\t\t\t\tconfigPath,\n\t\t\t\t\t{ event: \"delete\" }\n\t\t\t\t);\n\t\t\t\tawait assertLayout(undefined);\n\t\t\t\tawait nodeFs.writeFile(\n\t\t\t\t\tconfigPath,\n\t\t\t\t\t'export default { outputStructure: \"message-modules\" };'\n\t\t\t\t);\n\t\t\t\tawait server.environments.client!.pluginContainer.watchChange(\n\t\t\t\t\tconfigPath,\n\t\t\t\t\t{ event: \"create\" }\n\t\t\t\t);\n\t\t\t\tawait assertLayout(\"message-modules\");\n\t\t\t} finally {\n\t\t\t\tawait server.close();\n\t\t\t}\n\t\t} finally {\n\t\t\tawait nodeFs.rm(root, { recursive: true, force: true });\n\t\t}\n\t}\n);\n\ntest(\"invalid project config keeps the per-locale dev server available\", async () => {\n\tvi.resetModules();\n\tconst { paraglideVitePlugin } = await import(\"../vite.js\");\n\tconst root = await nodeFs.mkdtemp(\n\t\tnodePath.join(nodeOs.tmpdir(), \"paraglide-vite-invalid-config-\")\n\t);\n\ttry {\n\t\tconst projectRoot = nodePath.join(root, \"project.inlang\");\n\t\tawait nodeFs.mkdir(projectRoot);\n\t\tawait nodeFs.writeFile(\n\t\t\tnodePath.join(projectRoot, \"paraglide.config.js\"),\n\t\t\t\"export default {\"\n\t\t);\n\t\tconst server = await createServer({\n\t\t\tconfigFile: false,\n\t\t\troot,\n\t\t\tlogLevel: \"silent\",\n\t\t\tserver: { port: 0, host: \"127.0.0.1\" },\n\t\t\tplugins: [\n\t\t\t\tparaglideVitePlugin({\n\t\t\t\t\tproject: \"./project.inlang\",\n\t\t\t\t\toutdir: \"./src/paraglide\",\n\t\t\t\t\texperimentalPerLocaleBuild: true,\n\t\t\t\t\tfs: { ...nodeSyncFs },\n\t\t\t\t}),\n\t\t\t],\n\t\t});\n\t\ttry {\n\t\t\tawait server.listen();\n\t\t\texpect(server.httpServer?.listening).toBe(true);\n\t\t} finally {\n\t\t\tawait server.close();\n\t\t}\n\t} finally {\n\t\tawait nodeFs.rm(root, { recursive: true, force: true });\n\t}\n});\n\nfunction createMessage(locale: \"en\" | \"de\", value: string) {\n\treturn {\n\t\tid: `greeting-${locale}`,\n\t\tbundle_id: \"greeting\",\n\t\tlocale,\n\t\tselectors: [],\n\t\tvariants: [\n\t\t\t{\n\t\t\t\tid: `greeting-${locale}-variant`,\n\t\t\t\tmessage_id: `greeting-${locale}`,\n\t\t\t\tmatches: [],\n\t\t\t\tpattern: [{ type: \"text\" as const, value }],\n\t\t\t},\n\t\t],\n\t};\n}\n\nasync function readJavaScriptGraph(\n\toutputRoot: string,\n\tlocale: ViteLocaleBuildManifest[\"locales\"][string]\n): Promise<string> {\n\tconst chunks = locale.files.filter(\n\t\t(file) => file.type === \"chunk\" && file.fileName.endsWith(\".js\")\n\t);\n\treturn (\n\t\tawait Promise.all(\n\t\t\tchunks.map((chunk) =>\n\t\t\t\tnodeFs.readFile(\n\t\t\t\t\tnodePath.join(outputRoot, locale.directory, chunk.fileName),\n\t\t\t\t\t\"utf8\"\n\t\t\t\t)\n\t\t\t)\n\t\t)\n\t).join(\"\\n\");\n}\n\nasync function readSourceMaps(\n\toutputRoot: string,\n\tlocale: ViteLocaleBuildManifest[\"locales\"][string]\n): Promise<string> {\n\treturn (\n\t\tawait Promise.all(\n\t\t\tlocale.files\n\t\t\t\t.filter((file) => file.fileName.endsWith(\".map\"))\n\t\t\t\t.map((file) =>\n\t\t\t\t\tnodeFs.readFile(\n\t\t\t\t\t\tnodePath.join(outputRoot, locale.directory, file.fileName),\n\t\t\t\t\t\t\"utf8\"\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t)\n\t).join(\"\\n\");\n}\n\nasync function readGraphText(\n\toutputRoot: string,\n\tlocale: ViteLocaleBuildManifest[\"locales\"][string]\n): Promise<string> {\n\treturn (\n\t\tawait Promise.all(\n\t\t\tlocale.files\n\t\t\t\t.filter(\n\t\t\t\t\t(file) =>\n\t\t\t\t\t\t(file.type === \"chunk\" && file.fileName.endsWith(\".js\")) ||\n\t\t\t\t\t\tfile.fileName.endsWith(\".map\")\n\t\t\t\t)\n\t\t\t\t.map((file) =>\n\t\t\t\t\tnodeFs.readFile(\n\t\t\t\t\t\tnodePath.join(outputRoot, locale.directory, file.fileName),\n\t\t\t\t\t\t\"utf8\"\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t)\n\t).join(\"\\n\");\n}\n"]}
|
|
@@ -32,6 +32,6 @@ export type ParaglidePluginOptions = Omit<Partial<CompilerOptions>, "project"> &
|
|
|
32
32
|
*/
|
|
33
33
|
project: string;
|
|
34
34
|
};
|
|
35
|
-
type UnpluginFactoryWithOptions = (userArgs: ParaglidePluginOptions) => ReturnType<UnpluginFactory<ParaglidePluginOptions>>;
|
|
35
|
+
type UnpluginFactoryWithOptions = (userArgs: ParaglidePluginOptions, meta?: Parameters<UnpluginFactory<ParaglidePluginOptions>>[1], defaults?: Pick<CompilerOptions, "outputStructure">) => ReturnType<UnpluginFactory<ParaglidePluginOptions>>;
|
|
36
36
|
export declare const unpluginFactory: UnpluginFactoryWithOptions;
|
|
37
37
|
export {};
|