@inlang/paraglide-js 2.27.0 → 2.29.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.
Files changed (180) hide show
  1. package/README.md +9 -0
  2. package/dist/bundler-plugins/per-locale-build/index.js +14 -7
  3. package/dist/bundler-plugins/per-locale-build/index.js.map +1 -1
  4. package/dist/bundler-plugins/per-locale-build/vite-environments.test.js +235 -2
  5. package/dist/bundler-plugins/per-locale-build/vite-environments.test.js.map +1 -1
  6. package/dist/bundler-plugins/unplugin.d.ts +4 -1
  7. package/dist/bundler-plugins/unplugin.js +134 -22
  8. package/dist/bundler-plugins/unplugin.js.map +1 -1
  9. package/dist/bundler-plugins/unplugin.test.js +490 -1
  10. package/dist/bundler-plugins/unplugin.test.js.map +1 -1
  11. package/dist/bundler-plugins/vite-error-response.test.d.ts +1 -0
  12. package/dist/bundler-plugins/vite-error-response.test.js +171 -0
  13. package/dist/bundler-plugins/vite-error-response.test.js.map +1 -0
  14. package/dist/bundler-plugins/vite.d.ts +8 -0
  15. package/dist/bundler-plugins/vite.js +14 -4
  16. package/dist/bundler-plugins/vite.js.map +1 -1
  17. package/dist/bundler-plugins/vite.test.js +1 -1
  18. package/dist/bundler-plugins/vite.test.js.map +1 -1
  19. package/dist/cli/commands/compile/command.js +13 -0
  20. package/dist/cli/commands/compile/command.js.map +1 -1
  21. package/dist/cli/commands/compile/command.test.js +87 -3
  22. package/dist/cli/commands/compile/command.test.js.map +1 -1
  23. package/dist/cli/commands/init/command.d.ts +5 -0
  24. package/dist/cli/commands/init/command.js +213 -59
  25. package/dist/cli/commands/init/command.js.map +1 -1
  26. package/dist/cli/commands/init/command.test.d.ts +1 -0
  27. package/dist/cli/commands/init/command.test.js +123 -0
  28. package/dist/cli/commands/init/command.test.js.map +1 -0
  29. package/dist/cli/init-options.d.ts +11 -0
  30. package/dist/cli/init-options.js +2 -0
  31. package/dist/cli/init-options.js.map +1 -0
  32. package/dist/cli/steps/add-inlang-check.js +2 -2
  33. package/dist/cli/steps/add-inlang-check.js.map +1 -1
  34. package/dist/cli/steps/add-message-lint.d.ts +34 -0
  35. package/dist/cli/steps/add-message-lint.js +105 -0
  36. package/dist/cli/steps/add-message-lint.js.map +1 -0
  37. package/dist/cli/steps/add-message-lint.test.d.ts +1 -0
  38. package/dist/cli/steps/add-message-lint.test.js +74 -0
  39. package/dist/cli/steps/add-message-lint.test.js.map +1 -0
  40. package/dist/cli/steps/add-vite-plugin.d.ts +18 -0
  41. package/dist/cli/steps/add-vite-plugin.js +34 -6
  42. package/dist/cli/steps/add-vite-plugin.js.map +1 -1
  43. package/dist/cli/steps/add-vite-plugin.test.js +25 -9
  44. package/dist/cli/steps/add-vite-plugin.test.js.map +1 -1
  45. package/dist/cli/steps/check-for-uncomitted-changes.d.ts +3 -0
  46. package/dist/cli/steps/check-for-uncomitted-changes.js +15 -3
  47. package/dist/cli/steps/check-for-uncomitted-changes.js.map +1 -1
  48. package/dist/cli/steps/detect-bundler.d.ts +1 -0
  49. package/dist/cli/steps/detect-bundler.js +7 -1
  50. package/dist/cli/steps/detect-bundler.js.map +1 -1
  51. package/dist/cli/steps/initialize-inlang-project.d.ts +4 -3
  52. package/dist/cli/steps/initialize-inlang-project.js +60 -157
  53. package/dist/cli/steps/initialize-inlang-project.js.map +1 -1
  54. package/dist/cli/steps/maybe-add-machine-translation.d.ts +4 -0
  55. package/dist/cli/steps/maybe-add-machine-translation.js +11 -6
  56. package/dist/cli/steps/maybe-add-machine-translation.js.map +1 -1
  57. package/dist/cli/steps/maybe-add-sherlock.d.ts +2 -0
  58. package/dist/cli/steps/maybe-add-sherlock.js +12 -6
  59. package/dist/cli/steps/maybe-add-sherlock.js.map +1 -1
  60. package/dist/cli/steps/maybe-add-sherlock.test.d.ts +1 -0
  61. package/dist/cli/steps/maybe-add-sherlock.test.js +44 -0
  62. package/dist/cli/steps/maybe-add-sherlock.test.js.map +1 -0
  63. package/dist/cli/steps/prompt-for-outdir.d.ts +2 -0
  64. package/dist/cli/steps/prompt-for-outdir.js +4 -0
  65. package/dist/cli/steps/prompt-for-outdir.js.map +1 -1
  66. package/dist/cli/steps/update-package-json.js +8 -13
  67. package/dist/cli/steps/update-package-json.js.map +1 -1
  68. package/dist/cli/steps/update-ts-config.d.ts +6 -0
  69. package/dist/cli/steps/update-ts-config.js +27 -4
  70. package/dist/cli/steps/update-ts-config.js.map +1 -1
  71. package/dist/cli/utils.d.ts +2 -0
  72. package/dist/cli/utils.js +6 -0
  73. package/dist/cli/utils.js.map +1 -1
  74. package/dist/cli/utils.test.d.ts +1 -0
  75. package/dist/cli/utils.test.js +16 -0
  76. package/dist/cli/utils.test.js.map +1 -0
  77. package/dist/compiler/compile-annotation.js +6 -1
  78. package/dist/compiler/compile-annotation.js.map +1 -1
  79. package/dist/compiler/compile-bundle.d.ts +4 -0
  80. package/dist/compiler/compile-bundle.js +67 -2
  81. package/dist/compiler/compile-bundle.js.map +1 -1
  82. package/dist/compiler/compile-bundle.test.js +214 -1
  83. package/dist/compiler/compile-bundle.test.js.map +1 -1
  84. package/dist/compiler/compile-lifecycle.test.d.ts +1 -0
  85. package/dist/compiler/compile-lifecycle.test.js +69 -0
  86. package/dist/compiler/compile-lifecycle.test.js.map +1 -0
  87. package/dist/compiler/compile-local-variable.test.js +14 -14
  88. package/dist/compiler/compile-local-variable.test.js.map +1 -1
  89. package/dist/compiler/compile-message.exact-number.test.js +1 -1
  90. package/dist/compiler/compile-message.exact-number.test.js.map +1 -1
  91. package/dist/compiler/compile-message.locals.test.js +1 -1
  92. package/dist/compiler/compile-message.locals.test.js.map +1 -1
  93. package/dist/compiler/compile-message.test.js +2 -2
  94. package/dist/compiler/compile-message.test.js.map +1 -1
  95. package/dist/compiler/compile-pattern.test.js +5 -5
  96. package/dist/compiler/compile-pattern.test.js.map +1 -1
  97. package/dist/compiler/compile-project.js +1 -0
  98. package/dist/compiler/compile-project.js.map +1 -1
  99. package/dist/compiler/compile-project.test.js +94 -1
  100. package/dist/compiler/compile-project.test.js.map +1 -1
  101. package/dist/compiler/compile.js +36 -17
  102. package/dist/compiler/compile.js.map +1 -1
  103. package/dist/compiler/compile.test.js +70 -0
  104. package/dist/compiler/compile.test.js.map +1 -1
  105. package/dist/compiler/compiler-options.d.ts +41 -0
  106. package/dist/compiler/compiler-options.js.map +1 -1
  107. package/dist/compiler/output-structure/message-modules.js +1 -1
  108. package/dist/compiler/output-structure/message-modules.js.map +1 -1
  109. package/dist/compiler/registry.js +71 -13
  110. package/dist/compiler/registry.js.map +1 -1
  111. package/dist/compiler/registry.test.d.ts +1 -0
  112. package/dist/compiler/registry.test.js +291 -0
  113. package/dist/compiler/registry.test.js.map +1 -0
  114. package/dist/compiler/runtime/create-runtime.d.ts +2 -0
  115. package/dist/compiler/runtime/create-runtime.js +9 -0
  116. package/dist/compiler/runtime/create-runtime.js.map +1 -1
  117. package/dist/compiler/runtime/extract-locale-from-cookie.js +8 -1
  118. package/dist/compiler/runtime/extract-locale-from-cookie.js.map +1 -1
  119. package/dist/compiler/runtime/extract-locale-from-cookie.test.js +26 -0
  120. package/dist/compiler/runtime/extract-locale-from-cookie.test.js.map +1 -1
  121. package/dist/compiler/runtime/extract-locale-from-header.js +47 -5
  122. package/dist/compiler/runtime/extract-locale-from-header.js.map +1 -1
  123. package/dist/compiler/runtime/extract-locale-from-header.test.js +58 -0
  124. package/dist/compiler/runtime/extract-locale-from-header.test.js.map +1 -1
  125. package/dist/compiler/runtime/get-locale.js +7 -1
  126. package/dist/compiler/runtime/get-locale.js.map +1 -1
  127. package/dist/compiler/runtime/get-locale.test.js +95 -0
  128. package/dist/compiler/runtime/get-locale.test.js.map +1 -1
  129. package/dist/compiler/runtime/localize-href.d.ts +8 -0
  130. package/dist/compiler/runtime/localize-href.js +60 -0
  131. package/dist/compiler/runtime/localize-href.js.map +1 -1
  132. package/dist/compiler/runtime/localize-href.test.js +227 -1
  133. package/dist/compiler/runtime/localize-href.test.js.map +1 -1
  134. package/dist/compiler/runtime/localize-url.d.ts +8 -4
  135. package/dist/compiler/runtime/localize-url.js +12 -8
  136. package/dist/compiler/runtime/localize-url.js.map +1 -1
  137. package/dist/compiler/runtime/localize-url.test.js +45 -0
  138. package/dist/compiler/runtime/localize-url.test.js.map +1 -1
  139. package/dist/compiler/runtime/set-locale.js +24 -6
  140. package/dist/compiler/runtime/set-locale.js.map +1 -1
  141. package/dist/compiler/runtime/set-locale.test.js +182 -0
  142. package/dist/compiler/runtime/set-locale.test.js.map +1 -1
  143. package/dist/compiler/runtime/type.d.ts +2 -0
  144. package/dist/compiler/runtime/type.js.map +1 -1
  145. package/dist/compiler/runtime/type.test.js +75 -0
  146. package/dist/compiler/runtime/type.test.js.map +1 -1
  147. package/dist/compiler/runtime/variables.d.ts +2 -0
  148. package/dist/compiler/runtime/variables.js +7 -0
  149. package/dist/compiler/runtime/variables.js.map +1 -1
  150. package/dist/compiler/server/middleware.d.ts +8 -2
  151. package/dist/compiler/server/middleware.js +175 -7
  152. package/dist/compiler/server/middleware.js.map +1 -1
  153. package/dist/compiler/server/middleware.test.js +750 -3
  154. package/dist/compiler/server/middleware.test.js.map +1 -1
  155. package/dist/eslint/index.d.ts +4 -0
  156. package/dist/eslint/index.js +8 -0
  157. package/dist/eslint/index.js.map +1 -0
  158. package/dist/eslint/no-dynamic-message-access.d.ts +3 -0
  159. package/dist/eslint/no-dynamic-message-access.js +150 -0
  160. package/dist/eslint/no-dynamic-message-access.js.map +1 -0
  161. package/dist/eslint/no-dynamic-message-access.test.d.ts +1 -0
  162. package/dist/eslint/no-dynamic-message-access.test.js +126 -0
  163. package/dist/eslint/no-dynamic-message-access.test.js.map +1 -0
  164. package/dist/eslint/oxlint.test.d.ts +1 -0
  165. package/dist/eslint/oxlint.test.js +64 -0
  166. package/dist/eslint/oxlint.test.js.map +1 -0
  167. package/dist/services/config/config-schema.d.ts +2 -0
  168. package/dist/services/config/config-schema.js +2 -0
  169. package/dist/services/config/config-schema.js.map +1 -1
  170. package/dist/services/config/load-paraglide-config.test.js +12 -0
  171. package/dist/services/config/load-paraglide-config.test.js.map +1 -1
  172. package/dist/services/env-variables/index.js +1 -1
  173. package/dist/services/env-variables/index.js.map +1 -1
  174. package/dist/services/file-handling/write-output.bench.js +51 -11
  175. package/dist/services/file-handling/write-output.bench.js.map +1 -1
  176. package/dist/services/file-handling/write-output.js +60 -20
  177. package/dist/services/file-handling/write-output.js.map +1 -1
  178. package/dist/services/file-handling/write-output.test.js +175 -0
  179. package/dist/services/file-handling/write-output.test.js.map +1 -1
  180. 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":"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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\tconfig(config) {\n\t\t\t\tif (config.root !== undefined) discoveryRoot = config.root;\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\toutputStructure: compilerOptions.outputStructure ?? \"locale-modules\",\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\toutputStructure: options.outputStructure ?? config?.outputStructure,\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\tif (\n\t\texplicit.outputStructure !== undefined &&\n\t\texplicit.outputStructure !== \"locale-modules\"\n\t) {\n\t\tthrow new Error(\n\t\t\t'experimentalPerLocaleBuild requires outputStructure: \"locale-modules\".'\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
+ {"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 { expect, test } from "vitest";
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":"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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,9 @@ 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 UnpluginIntegrationOptions = Pick<CompilerOptions, "outputStructure"> & {
36
+ devErrorResponse?: boolean;
37
+ };
38
+ type UnpluginFactoryWithOptions = (userArgs: ParaglidePluginOptions, meta?: Parameters<UnpluginFactory<ParaglidePluginOptions>>[1], defaults?: UnpluginIntegrationOptions) => ReturnType<UnpluginFactory<ParaglidePluginOptions>>;
36
39
  export declare const unpluginFactory: UnpluginFactoryWithOptions;
37
40
  export {};