@inlang/paraglide-js 2.26.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 +11 -1
- 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 +237 -4
- 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 +216 -44
- 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/defaults.js +2 -2
- package/dist/cli/defaults.js.map +1 -1
- 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.d.ts +19 -0
- package/dist/cli/steps/add-inlang-check.js +60 -0
- package/dist/cli/steps/add-inlang-check.js.map +1 -0
- package/dist/cli/steps/add-inlang-check.test.d.ts +1 -0
- package/dist/cli/steps/add-inlang-check.test.js +88 -0
- package/dist/cli/steps/add-inlang-check.test.js.map +1 -0
- 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/agents-md-suggestion.d.ts +11 -0
- package/dist/cli/steps/agents-md-suggestion.js +19 -0
- package/dist/cli/steps/agents-md-suggestion.js.map +1 -0
- package/dist/cli/steps/agents-md-suggestion.test.d.ts +1 -0
- package/dist/cli/steps/agents-md-suggestion.test.js +36 -0
- package/dist/cli/steps/agents-md-suggestion.test.js.map +1 -0
- 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 +14 -8
- 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 +13 -7
- 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 +11 -0
- package/dist/cli/utils.js +21 -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.d.ts +48 -1
- package/dist/compiler/compile-annotation.js +243 -10
- package/dist/compiler/compile-annotation.js.map +1 -1
- package/dist/compiler/compile-bundle.d.ts +7 -2
- package/dist/compiler/compile-bundle.js +97 -3
- package/dist/compiler/compile-bundle.js.map +1 -1
- package/dist/compiler/compile-bundle.test.js +232 -19
- 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.d.ts +3 -0
- package/dist/compiler/compile-local-variable.js +5 -2
- package/dist/compiler/compile-local-variable.js.map +1 -1
- package/dist/compiler/compile-local-variable.test.js +55 -15
- package/dist/compiler/compile-local-variable.test.js.map +1 -1
- package/dist/compiler/compile-message.d.ts +29 -1
- package/dist/compiler/compile-message.exact-number.test.d.ts +1 -0
- package/dist/compiler/compile-message.exact-number.test.js +786 -0
- package/dist/compiler/compile-message.exact-number.test.js.map +1 -0
- package/dist/compiler/compile-message.js +162 -66
- package/dist/compiler/compile-message.js.map +1 -1
- package/dist/compiler/compile-message.locals.test.d.ts +1 -0
- package/dist/compiler/compile-message.locals.test.js +498 -0
- package/dist/compiler/compile-message.locals.test.js.map +1 -0
- package/dist/compiler/compile-message.test.js +113 -22
- package/dist/compiler/compile-message.test.js.map +1 -1
- package/dist/compiler/compile-pattern.d.ts +5 -0
- package/dist/compiler/compile-pattern.js +6 -18
- package/dist/compiler/compile-pattern.js.map +1 -1
- package/dist/compiler/compile-pattern.test.js +169 -5
- package/dist/compiler/compile-pattern.test.js.map +1 -1
- package/dist/compiler/compile-project.js +5 -1
- package/dist/compiler/compile-project.js.map +1 -1
- package/dist/compiler/compile-project.test.js +1260 -185
- 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 +71 -1
- 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/create-readme.d.ts +4 -1
- package/dist/compiler/create-readme.js +33 -125
- package/dist/compiler/create-readme.js.map +1 -1
- package/dist/compiler/emit-ts-declarations.interop.test.js +2 -2
- package/dist/compiler/emit-ts-declarations.interop.test.js.map +1 -1
- package/dist/compiler/emit-ts-declarations.test.js +4 -4
- package/dist/compiler/emit-ts-declarations.test.js.map +1 -1
- package/dist/compiler/index.d.ts +1 -1
- package/dist/compiler/index.js +1 -1
- package/dist/compiler/index.js.map +1 -1
- package/dist/compiler/input-alias.d.ts +21 -0
- package/dist/compiler/input-alias.js +42 -0
- package/dist/compiler/input-alias.js.map +1 -0
- package/dist/compiler/input-alias.test.d.ts +1 -0
- package/dist/compiler/input-alias.test.js +58 -0
- package/dist/compiler/input-alias.test.js.map +1 -0
- package/dist/compiler/message-locals.d.ts +46 -0
- package/dist/compiler/message-locals.js +129 -0
- package/dist/compiler/message-locals.js.map +1 -0
- package/dist/compiler/output-structure/locale-modules.js +7 -1
- package/dist/compiler/output-structure/locale-modules.js.map +1 -1
- package/dist/compiler/output-structure/locale-modules.test.js +35 -0
- package/dist/compiler/output-structure/locale-modules.test.js.map +1 -1
- package/dist/compiler/output-structure/message-modules.js +6 -4
- package/dist/compiler/output-structure/message-modules.js.map +1 -1
- package/dist/compiler/output-structure/message-modules.test.js +35 -0
- package/dist/compiler/output-structure/message-modules.test.js.map +1 -1
- package/dist/compiler/registry.d.ts +12 -0
- package/dist/compiler/registry.js +158 -31
- 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/create-server-file.js +24 -0
- package/dist/compiler/server/create-server-file.js.map +1 -1
- package/dist/compiler/server/create-server-file.test.js +8 -2
- package/dist/compiler/server/create-server-file.test.js.map +1 -1
- package/dist/compiler/server/middleware.d.ts +8 -2
- package/dist/compiler/server/middleware.js +204 -11
- 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 +15 -5
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:
|
|
@@ -283,6 +292,7 @@ Paraglide supports locale-aware formatting via declaration formatters:
|
|
|
283
292
|
- `plural` (`Intl.PluralRules`) for plural and ordinal categories
|
|
284
293
|
- `number` (`Intl.NumberFormat`) for numbers, currency, compact notation, and more
|
|
285
294
|
- `datetime` (`Intl.DateTimeFormat`) for dates/times with locale-aware output
|
|
295
|
+
- `date`, `time` and `icu:pound` for ICU MessageFormat 1 `{d, date}`, `{d, time}` and `#`, see [Formatting](https://paraglidejs.com/formatting#icu-messageformat-1-styles)
|
|
286
296
|
- `relativetime` (`Intl.RelativeTimeFormat`) for values like "yesterday", "in 2 days", or "3 hr. ago"
|
|
287
297
|
|
|
288
298
|
Gender and custom selects are supported via the variants system.
|
|
@@ -374,7 +384,7 @@ Paraglide compiles messages from [inlang](https://github.com/opral/inlang), the
|
|
|
374
384
|
| Tool | Description |
|
|
375
385
|
| ----------------------------------------------------------------------- | ------------------------------------------------ |
|
|
376
386
|
| [Sherlock](https://inlang.com/m/r7kp499g/app-inlang-ideExtension) | VS Code extension for inline translation editing |
|
|
377
|
-
| [CLI](https://inlang.com/m/2qj2w8pu/app-inlang-cli) | Machine translate
|
|
387
|
+
| [CLI](https://inlang.com/m/2qj2w8pu/app-inlang-cli) | Machine translate and check translations in CI |
|
|
378
388
|
| [Fink](https://inlang.com/m/tdozzpar/app-inlang-finkLocalizationEditor) | Translation editor for non-developers |
|
|
379
389
|
| [Parrot](https://inlang.com/m/gkrpgoir/app-parrot-figmaPlugin) | Manage translations in Figma |
|
|
380
390
|
|
|
@@ -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,16 +230,245 @@ 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}`,
|
|
232
|
-
|
|
465
|
+
bundle_id: "greeting",
|
|
233
466
|
locale,
|
|
234
467
|
selectors: [],
|
|
235
468
|
variants: [
|
|
236
469
|
{
|
|
237
470
|
id: `greeting-${locale}-variant`,
|
|
238
|
-
|
|
471
|
+
message_id: `greeting-${locale}`,
|
|
239
472
|
matches: [],
|
|
240
473
|
pattern: [{ type: "text", value }],
|
|
241
474
|
},
|
|
@@ -1 +1 @@
|
|
|
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,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,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACtC,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,SAAS,aAAa,CAAC,MAAmB,EAAE,KAAa;IACxD,OAAO;QACN,EAAE,EAAE,YAAY,MAAM,EAAE;QACxB,QAAQ,EAAE,UAAU;QACpB,MAAM;QACN,SAAS,EAAE,EAAE;QACb,QAAQ,EAAE;YACT;gBACC,EAAE,EAAE,YAAY,MAAM,UAAU;gBAChC,SAAS,EAAE,YAAY,MAAM,EAAE;gBAC/B,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 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\tbundleId: \"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\tmessageId: `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":"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","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 {};
|