@sebbro/paraglide-lite 0.1.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 (715) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +67 -0
  3. package/bin/run.js +4 -0
  4. package/dist/bundler-plugins/esbuild.d.ts +1 -0
  5. package/dist/bundler-plugins/esbuild.d.ts.map +1 -0
  6. package/dist/bundler-plugins/esbuild.js +4 -0
  7. package/dist/bundler-plugins/esbuild.js.map +1 -0
  8. package/dist/bundler-plugins/index.d.ts +6 -0
  9. package/dist/bundler-plugins/index.d.ts.map +1 -0
  10. package/dist/bundler-plugins/index.js +7 -0
  11. package/dist/bundler-plugins/index.js.map +1 -0
  12. package/dist/bundler-plugins/lazy-modules/scan-message-keys.d.ts +19 -0
  13. package/dist/bundler-plugins/lazy-modules/scan-message-keys.d.ts.map +1 -0
  14. package/dist/bundler-plugins/lazy-modules/scan-message-keys.js +85 -0
  15. package/dist/bundler-plugins/lazy-modules/scan-message-keys.js.map +1 -0
  16. package/dist/bundler-plugins/lazy-modules/scan-message-keys.test.d.ts +2 -0
  17. package/dist/bundler-plugins/lazy-modules/scan-message-keys.test.d.ts.map +1 -0
  18. package/dist/bundler-plugins/lazy-modules/scan-message-keys.test.js +53 -0
  19. package/dist/bundler-plugins/lazy-modules/scan-message-keys.test.js.map +1 -0
  20. package/dist/bundler-plugins/lazy-modules/ssr.d.ts +31 -0
  21. package/dist/bundler-plugins/lazy-modules/ssr.d.ts.map +1 -0
  22. package/dist/bundler-plugins/lazy-modules/ssr.js +42 -0
  23. package/dist/bundler-plugins/lazy-modules/ssr.js.map +1 -0
  24. package/dist/bundler-plugins/lazy-modules/ssr.test.d.ts +2 -0
  25. package/dist/bundler-plugins/lazy-modules/ssr.test.d.ts.map +1 -0
  26. package/dist/bundler-plugins/lazy-modules/ssr.test.js +48 -0
  27. package/dist/bundler-plugins/lazy-modules/ssr.test.js.map +1 -0
  28. package/dist/bundler-plugins/lazy-modules/virtual-ids.d.ts +7 -0
  29. package/dist/bundler-plugins/lazy-modules/virtual-ids.d.ts.map +1 -0
  30. package/dist/bundler-plugins/lazy-modules/virtual-ids.js +30 -0
  31. package/dist/bundler-plugins/lazy-modules/virtual-ids.js.map +1 -0
  32. package/dist/bundler-plugins/lazy-modules/virtual.d.ts +86 -0
  33. package/dist/bundler-plugins/lazy-modules/virtual.d.ts.map +1 -0
  34. package/dist/bundler-plugins/lazy-modules/virtual.js +2 -0
  35. package/dist/bundler-plugins/lazy-modules/virtual.js.map +1 -0
  36. package/dist/bundler-plugins/lazy-modules/vite-plugin.d.ts +18 -0
  37. package/dist/bundler-plugins/lazy-modules/vite-plugin.d.ts.map +1 -0
  38. package/dist/bundler-plugins/lazy-modules/vite-plugin.js +328 -0
  39. package/dist/bundler-plugins/lazy-modules/vite-plugin.js.map +1 -0
  40. package/dist/bundler-plugins/lazy-modules/vite-plugin.test.d.ts +2 -0
  41. package/dist/bundler-plugins/lazy-modules/vite-plugin.test.d.ts.map +1 -0
  42. package/dist/bundler-plugins/lazy-modules/vite-plugin.test.js +45 -0
  43. package/dist/bundler-plugins/lazy-modules/vite-plugin.test.js.map +1 -0
  44. package/dist/bundler-plugins/per-locale-build/constants.d.ts +2 -0
  45. package/dist/bundler-plugins/per-locale-build/constants.d.ts.map +1 -0
  46. package/dist/bundler-plugins/per-locale-build/constants.js +3 -0
  47. package/dist/bundler-plugins/per-locale-build/constants.js.map +1 -0
  48. package/dist/bundler-plugins/per-locale-build/index.d.ts +6 -0
  49. package/dist/bundler-plugins/per-locale-build/index.d.ts.map +1 -0
  50. package/dist/bundler-plugins/per-locale-build/index.js +43 -0
  51. package/dist/bundler-plugins/per-locale-build/index.js.map +1 -0
  52. package/dist/bundler-plugins/per-locale-build/locale-id.d.ts +8 -0
  53. package/dist/bundler-plugins/per-locale-build/locale-id.d.ts.map +1 -0
  54. package/dist/bundler-plugins/per-locale-build/locale-id.js +13 -0
  55. package/dist/bundler-plugins/per-locale-build/locale-id.js.map +1 -0
  56. package/dist/bundler-plugins/per-locale-build/types.d.ts +4 -0
  57. package/dist/bundler-plugins/per-locale-build/types.d.ts.map +1 -0
  58. package/dist/bundler-plugins/per-locale-build/types.js +2 -0
  59. package/dist/bundler-plugins/per-locale-build/types.js.map +1 -0
  60. package/dist/bundler-plugins/per-locale-build/vite-environments.d.ts +51 -0
  61. package/dist/bundler-plugins/per-locale-build/vite-environments.d.ts.map +1 -0
  62. package/dist/bundler-plugins/per-locale-build/vite-environments.js +250 -0
  63. package/dist/bundler-plugins/per-locale-build/vite-environments.js.map +1 -0
  64. package/dist/bundler-plugins/per-locale-build/vite-environments.test.d.ts +1 -0
  65. package/dist/bundler-plugins/per-locale-build/vite-environments.test.d.ts.map +1 -0
  66. package/dist/bundler-plugins/per-locale-build/vite-environments.test.js +250 -0
  67. package/dist/bundler-plugins/per-locale-build/vite-environments.test.js.map +1 -0
  68. package/dist/bundler-plugins/plugin-core.d.ts +74 -0
  69. package/dist/bundler-plugins/plugin-core.d.ts.map +1 -0
  70. package/dist/bundler-plugins/plugin-core.js +292 -0
  71. package/dist/bundler-plugins/plugin-core.js.map +1 -0
  72. package/dist/bundler-plugins/rolldown.d.ts +10 -0
  73. package/dist/bundler-plugins/rolldown.d.ts.map +1 -0
  74. package/dist/bundler-plugins/rolldown.js +36 -0
  75. package/dist/bundler-plugins/rolldown.js.map +1 -0
  76. package/dist/bundler-plugins/rolldown.test.d.ts +1 -0
  77. package/dist/bundler-plugins/rolldown.test.d.ts.map +1 -0
  78. package/dist/bundler-plugins/rolldown.test.js +72 -0
  79. package/dist/bundler-plugins/rolldown.test.js.map +1 -0
  80. package/dist/bundler-plugins/rollup.d.ts +1 -0
  81. package/dist/bundler-plugins/rollup.d.ts.map +1 -0
  82. package/dist/bundler-plugins/rollup.js +4 -0
  83. package/dist/bundler-plugins/rollup.js.map +1 -0
  84. package/dist/bundler-plugins/rspack.d.ts +1 -0
  85. package/dist/bundler-plugins/rspack.d.ts.map +1 -0
  86. package/dist/bundler-plugins/rspack.js +4 -0
  87. package/dist/bundler-plugins/rspack.js.map +1 -0
  88. package/dist/bundler-plugins/unplugin.d.ts +3 -0
  89. package/dist/bundler-plugins/unplugin.d.ts.map +1 -0
  90. package/dist/bundler-plugins/unplugin.js +62 -0
  91. package/dist/bundler-plugins/unplugin.js.map +1 -0
  92. package/dist/bundler-plugins/unplugin.test.d.ts +1 -0
  93. package/dist/bundler-plugins/unplugin.test.d.ts.map +1 -0
  94. package/dist/bundler-plugins/unplugin.test.js +256 -0
  95. package/dist/bundler-plugins/unplugin.test.js.map +1 -0
  96. package/dist/bundler-plugins/virtual-modules.test.d.ts +1 -0
  97. package/dist/bundler-plugins/virtual-modules.test.d.ts.map +1 -0
  98. package/dist/bundler-plugins/virtual-modules.test.js +77 -0
  99. package/dist/bundler-plugins/virtual-modules.test.js.map +1 -0
  100. package/dist/bundler-plugins/vite.d.ts +17 -0
  101. package/dist/bundler-plugins/vite.d.ts.map +1 -0
  102. package/dist/bundler-plugins/vite.js +15 -0
  103. package/dist/bundler-plugins/vite.js.map +1 -0
  104. package/dist/bundler-plugins/vite.test.d.ts +1 -0
  105. package/dist/bundler-plugins/vite.test.d.ts.map +1 -0
  106. package/dist/bundler-plugins/vite.test.js +61 -0
  107. package/dist/bundler-plugins/vite.test.js.map +1 -0
  108. package/dist/bundler-plugins/webpack.d.ts +1 -0
  109. package/dist/bundler-plugins/webpack.d.ts.map +1 -0
  110. package/dist/bundler-plugins/webpack.js +4 -0
  111. package/dist/bundler-plugins/webpack.js.map +1 -0
  112. package/dist/cli/commands/compile/command.d.ts +2 -0
  113. package/dist/cli/commands/compile/command.d.ts.map +1 -0
  114. package/dist/cli/commands/compile/command.js +225 -0
  115. package/dist/cli/commands/compile/command.js.map +1 -0
  116. package/dist/cli/commands/compile/command.test.d.ts +1 -0
  117. package/dist/cli/commands/compile/command.test.d.ts.map +1 -0
  118. package/dist/cli/commands/compile/command.test.js +69 -0
  119. package/dist/cli/commands/compile/command.test.js.map +1 -0
  120. package/dist/cli/commands/init/command.d.ts +2 -0
  121. package/dist/cli/commands/init/command.d.ts.map +1 -0
  122. package/dist/cli/commands/init/command.js +90 -0
  123. package/dist/cli/commands/init/command.js.map +1 -0
  124. package/dist/cli/defaults.d.ts +11 -0
  125. package/dist/cli/defaults.d.ts.map +1 -0
  126. package/dist/cli/defaults.js +13 -0
  127. package/dist/cli/defaults.js.map +1 -0
  128. package/dist/cli/index.d.ts +2 -0
  129. package/dist/cli/index.d.ts.map +1 -0
  130. package/dist/cli/index.js +11 -0
  131. package/dist/cli/index.js.map +1 -0
  132. package/dist/cli/steps/add-vite-plugin.d.ts +31 -0
  133. package/dist/cli/steps/add-vite-plugin.d.ts.map +1 -0
  134. package/dist/cli/steps/add-vite-plugin.js +65 -0
  135. package/dist/cli/steps/add-vite-plugin.js.map +1 -0
  136. package/dist/cli/steps/add-vite-plugin.test.d.ts +1 -0
  137. package/dist/cli/steps/add-vite-plugin.test.d.ts.map +1 -0
  138. package/dist/cli/steps/add-vite-plugin.test.js +74 -0
  139. package/dist/cli/steps/add-vite-plugin.test.js.map +1 -0
  140. package/dist/cli/steps/check-for-uncomitted-changes.d.ts +5 -0
  141. package/dist/cli/steps/check-for-uncomitted-changes.d.ts.map +1 -0
  142. package/dist/cli/steps/check-for-uncomitted-changes.js +37 -0
  143. package/dist/cli/steps/check-for-uncomitted-changes.js.map +1 -0
  144. package/dist/cli/steps/detect-bundler.d.ts +10 -0
  145. package/dist/cli/steps/detect-bundler.d.ts.map +1 -0
  146. package/dist/cli/steps/detect-bundler.js +22 -0
  147. package/dist/cli/steps/detect-bundler.js.map +1 -0
  148. package/dist/cli/steps/detect-bundler.test.d.ts +1 -0
  149. package/dist/cli/steps/detect-bundler.test.d.ts.map +1 -0
  150. package/dist/cli/steps/detect-bundler.test.js +29 -0
  151. package/dist/cli/steps/detect-bundler.test.js.map +1 -0
  152. package/dist/cli/steps/initialize-messages.d.ts +11 -0
  153. package/dist/cli/steps/initialize-messages.d.ts.map +1 -0
  154. package/dist/cli/steps/initialize-messages.js +31 -0
  155. package/dist/cli/steps/initialize-messages.js.map +1 -0
  156. package/dist/cli/steps/prompt-for-outdir.d.ts +8 -0
  157. package/dist/cli/steps/prompt-for-outdir.d.ts.map +1 -0
  158. package/dist/cli/steps/prompt-for-outdir.js +19 -0
  159. package/dist/cli/steps/prompt-for-outdir.js.map +1 -0
  160. package/dist/cli/steps/update-package-json.d.ts +11 -0
  161. package/dist/cli/steps/update-package-json.d.ts.map +1 -0
  162. package/dist/cli/steps/update-package-json.js +34 -0
  163. package/dist/cli/steps/update-package-json.js.map +1 -0
  164. package/dist/cli/steps/update-ts-config.d.ts +26 -0
  165. package/dist/cli/steps/update-ts-config.d.ts.map +1 -0
  166. package/dist/cli/steps/update-ts-config.js +270 -0
  167. package/dist/cli/steps/update-ts-config.js.map +1 -0
  168. package/dist/cli/steps/update-ts-config.test.d.ts +1 -0
  169. package/dist/cli/steps/update-ts-config.test.d.ts.map +1 -0
  170. package/dist/cli/steps/update-ts-config.test.js +60 -0
  171. package/dist/cli/steps/update-ts-config.test.js.map +1 -0
  172. package/dist/cli/utils.d.ts +36 -0
  173. package/dist/cli/utils.d.ts.map +1 -0
  174. package/dist/cli/utils.js +20 -0
  175. package/dist/cli/utils.js.map +1 -0
  176. package/dist/compiler/assert-url-pattern-available.d.ts +7 -0
  177. package/dist/compiler/assert-url-pattern-available.d.ts.map +1 -0
  178. package/dist/compiler/assert-url-pattern-available.js +17 -0
  179. package/dist/compiler/assert-url-pattern-available.js.map +1 -0
  180. package/dist/compiler/compile-annotation.d.ts +12 -0
  181. package/dist/compiler/compile-annotation.d.ts.map +1 -0
  182. package/dist/compiler/compile-annotation.js +136 -0
  183. package/dist/compiler/compile-annotation.js.map +1 -0
  184. package/dist/compiler/compile-bundle.d.ts +28 -0
  185. package/dist/compiler/compile-bundle.d.ts.map +1 -0
  186. package/dist/compiler/compile-bundle.js +431 -0
  187. package/dist/compiler/compile-bundle.js.map +1 -0
  188. package/dist/compiler/compile-bundle.test.d.ts +1 -0
  189. package/dist/compiler/compile-bundle.test.d.ts.map +1 -0
  190. package/dist/compiler/compile-bundle.test.js +399 -0
  191. package/dist/compiler/compile-bundle.test.js.map +1 -0
  192. package/dist/compiler/compile-local-variable.d.ts +16 -0
  193. package/dist/compiler/compile-local-variable.d.ts.map +1 -0
  194. package/dist/compiler/compile-local-variable.js +28 -0
  195. package/dist/compiler/compile-local-variable.js.map +1 -0
  196. package/dist/compiler/compile-local-variable.test.d.ts +1 -0
  197. package/dist/compiler/compile-local-variable.test.d.ts.map +1 -0
  198. package/dist/compiler/compile-local-variable.test.js +359 -0
  199. package/dist/compiler/compile-local-variable.test.js.map +1 -0
  200. package/dist/compiler/compile-message.d.ts +8 -0
  201. package/dist/compiler/compile-message.d.ts.map +1 -0
  202. package/dist/compiler/compile-message.js +174 -0
  203. package/dist/compiler/compile-message.js.map +1 -0
  204. package/dist/compiler/compile-message.test.d.ts +1 -0
  205. package/dist/compiler/compile-message.test.d.ts.map +1 -0
  206. package/dist/compiler/compile-message.test.js +1060 -0
  207. package/dist/compiler/compile-message.test.js.map +1 -0
  208. package/dist/compiler/compile-pattern.d.ts +29 -0
  209. package/dist/compiler/compile-pattern.d.ts.map +1 -0
  210. package/dist/compiler/compile-pattern.js +143 -0
  211. package/dist/compiler/compile-pattern.js.map +1 -0
  212. package/dist/compiler/compile-pattern.test.d.ts +1 -0
  213. package/dist/compiler/compile-pattern.test.d.ts.map +1 -0
  214. package/dist/compiler/compile-pattern.test.js +255 -0
  215. package/dist/compiler/compile-pattern.test.js.map +1 -0
  216. package/dist/compiler/compile-project.d.ts +21 -0
  217. package/dist/compiler/compile-project.d.ts.map +1 -0
  218. package/dist/compiler/compile-project.js +147 -0
  219. package/dist/compiler/compile-project.js.map +1 -0
  220. package/dist/compiler/compile-project.test.d.ts +1 -0
  221. package/dist/compiler/compile-project.test.d.ts.map +1 -0
  222. package/dist/compiler/compile-project.test.js +1709 -0
  223. package/dist/compiler/compile-project.test.js.map +1 -0
  224. package/dist/compiler/compile.bench.d.ts +1 -0
  225. package/dist/compiler/compile.bench.d.ts.map +1 -0
  226. package/dist/compiler/compile.bench.js +89 -0
  227. package/dist/compiler/compile.bench.js.map +1 -0
  228. package/dist/compiler/compile.d.ts +24 -0
  229. package/dist/compiler/compile.d.ts.map +1 -0
  230. package/dist/compiler/compile.js +106 -0
  231. package/dist/compiler/compile.js.map +1 -0
  232. package/dist/compiler/compile.test.d.ts +1 -0
  233. package/dist/compiler/compile.test.d.ts.map +1 -0
  234. package/dist/compiler/compile.test.js +66 -0
  235. package/dist/compiler/compile.test.js.map +1 -0
  236. package/dist/compiler/compiler-options.d.ts +466 -0
  237. package/dist/compiler/compiler-options.d.ts.map +1 -0
  238. package/dist/compiler/compiler-options.js +22 -0
  239. package/dist/compiler/compiler-options.js.map +1 -0
  240. package/dist/compiler/create-paraglide.d.ts +21 -0
  241. package/dist/compiler/create-paraglide.d.ts.map +1 -0
  242. package/dist/compiler/create-paraglide.js +69 -0
  243. package/dist/compiler/create-paraglide.js.map +1 -0
  244. package/dist/compiler/create-paraglide.test.d.ts +1 -0
  245. package/dist/compiler/create-paraglide.test.d.ts.map +1 -0
  246. package/dist/compiler/create-paraglide.test.js +55 -0
  247. package/dist/compiler/create-paraglide.test.js.map +1 -0
  248. package/dist/compiler/create-readme.d.ts +9 -0
  249. package/dist/compiler/create-readme.d.ts.map +1 -0
  250. package/dist/compiler/create-readme.js +127 -0
  251. package/dist/compiler/create-readme.js.map +1 -0
  252. package/dist/compiler/emit-files.d.ts +15 -0
  253. package/dist/compiler/emit-files.d.ts.map +1 -0
  254. package/dist/compiler/emit-files.js +58 -0
  255. package/dist/compiler/emit-files.js.map +1 -0
  256. package/dist/compiler/emit-files.test.d.ts +1 -0
  257. package/dist/compiler/emit-files.test.d.ts.map +1 -0
  258. package/dist/compiler/emit-files.test.js +43 -0
  259. package/dist/compiler/emit-files.test.js.map +1 -0
  260. package/dist/compiler/emit-ts-declarations.d.ts +11 -0
  261. package/dist/compiler/emit-ts-declarations.d.ts.map +1 -0
  262. package/dist/compiler/emit-ts-declarations.interop.test.d.ts +1 -0
  263. package/dist/compiler/emit-ts-declarations.interop.test.d.ts.map +1 -0
  264. package/dist/compiler/emit-ts-declarations.interop.test.js +33 -0
  265. package/dist/compiler/emit-ts-declarations.interop.test.js.map +1 -0
  266. package/dist/compiler/emit-ts-declarations.js +353 -0
  267. package/dist/compiler/emit-ts-declarations.js.map +1 -0
  268. package/dist/compiler/emit-ts-declarations.test.d.ts +1 -0
  269. package/dist/compiler/emit-ts-declarations.test.d.ts.map +1 -0
  270. package/dist/compiler/emit-ts-declarations.test.js +161 -0
  271. package/dist/compiler/emit-ts-declarations.test.js.map +1 -0
  272. package/dist/compiler/index.d.ts +13 -0
  273. package/dist/compiler/index.d.ts.map +1 -0
  274. package/dist/compiler/index.js +11 -0
  275. package/dist/compiler/index.js.map +1 -0
  276. package/dist/compiler/jsdoc-types.d.ts +21 -0
  277. package/dist/compiler/jsdoc-types.d.ts.map +1 -0
  278. package/dist/compiler/jsdoc-types.js +59 -0
  279. package/dist/compiler/jsdoc-types.js.map +1 -0
  280. package/dist/compiler/jsdoc-types.test.d.ts +1 -0
  281. package/dist/compiler/jsdoc-types.test.d.ts.map +1 -0
  282. package/dist/compiler/jsdoc-types.test.js +100 -0
  283. package/dist/compiler/jsdoc-types.test.js.map +1 -0
  284. package/dist/compiler/lazy-modules/compile-cache.d.ts +37 -0
  285. package/dist/compiler/lazy-modules/compile-cache.d.ts.map +1 -0
  286. package/dist/compiler/lazy-modules/compile-cache.js +34 -0
  287. package/dist/compiler/lazy-modules/compile-cache.js.map +1 -0
  288. package/dist/compiler/lazy-modules/compile-project.lazy.test.d.ts +2 -0
  289. package/dist/compiler/lazy-modules/compile-project.lazy.test.d.ts.map +1 -0
  290. package/dist/compiler/lazy-modules/compile-project.lazy.test.js +65 -0
  291. package/dist/compiler/lazy-modules/compile-project.lazy.test.js.map +1 -0
  292. package/dist/compiler/lazy-modules/create-loader.d.ts +18 -0
  293. package/dist/compiler/lazy-modules/create-loader.d.ts.map +1 -0
  294. package/dist/compiler/lazy-modules/create-loader.js +182 -0
  295. package/dist/compiler/lazy-modules/create-loader.js.map +1 -0
  296. package/dist/compiler/lazy-modules/create-loader.test.d.ts +2 -0
  297. package/dist/compiler/lazy-modules/create-loader.test.d.ts.map +1 -0
  298. package/dist/compiler/lazy-modules/create-loader.test.js +82 -0
  299. package/dist/compiler/lazy-modules/create-loader.test.js.map +1 -0
  300. package/dist/compiler/lazy-modules/manifest.d.ts +32 -0
  301. package/dist/compiler/lazy-modules/manifest.d.ts.map +1 -0
  302. package/dist/compiler/lazy-modules/manifest.js +11 -0
  303. package/dist/compiler/lazy-modules/manifest.js.map +1 -0
  304. package/dist/compiler/match-literals.d.ts +2 -0
  305. package/dist/compiler/match-literals.d.ts.map +1 -0
  306. package/dist/compiler/match-literals.js +42 -0
  307. package/dist/compiler/match-literals.js.map +1 -0
  308. package/dist/compiler/output-structure/lazy-modules.d.ts +27 -0
  309. package/dist/compiler/output-structure/lazy-modules.d.ts.map +1 -0
  310. package/dist/compiler/output-structure/lazy-modules.js +157 -0
  311. package/dist/compiler/output-structure/lazy-modules.js.map +1 -0
  312. package/dist/compiler/output-structure/lazy-modules.test.d.ts +2 -0
  313. package/dist/compiler/output-structure/lazy-modules.test.d.ts.map +1 -0
  314. package/dist/compiler/output-structure/lazy-modules.test.js +128 -0
  315. package/dist/compiler/output-structure/lazy-modules.test.js.map +1 -0
  316. package/dist/compiler/output-structure/locale-modules.d.ts +4 -0
  317. package/dist/compiler/output-structure/locale-modules.d.ts.map +1 -0
  318. package/dist/compiler/output-structure/locale-modules.js +81 -0
  319. package/dist/compiler/output-structure/locale-modules.js.map +1 -0
  320. package/dist/compiler/output-structure/locale-modules.test.d.ts +1 -0
  321. package/dist/compiler/output-structure/locale-modules.test.d.ts.map +1 -0
  322. package/dist/compiler/output-structure/locale-modules.test.js +163 -0
  323. package/dist/compiler/output-structure/locale-modules.test.js.map +1 -0
  324. package/dist/compiler/output-structure/message-modules.d.ts +4 -0
  325. package/dist/compiler/output-structure/message-modules.d.ts.map +1 -0
  326. package/dist/compiler/output-structure/message-modules.js +100 -0
  327. package/dist/compiler/output-structure/message-modules.js.map +1 -0
  328. package/dist/compiler/output-structure/message-modules.test.d.ts +1 -0
  329. package/dist/compiler/output-structure/message-modules.test.d.ts.map +1 -0
  330. package/dist/compiler/output-structure/message-modules.test.js +148 -0
  331. package/dist/compiler/output-structure/message-modules.test.js.map +1 -0
  332. package/dist/compiler/per-locale-build.d.ts +2 -0
  333. package/dist/compiler/per-locale-build.d.ts.map +1 -0
  334. package/dist/compiler/per-locale-build.js +3 -0
  335. package/dist/compiler/per-locale-build.js.map +1 -0
  336. package/dist/compiler/registry.d.ts +13 -0
  337. package/dist/compiler/registry.d.ts.map +1 -0
  338. package/dist/compiler/registry.js +60 -0
  339. package/dist/compiler/registry.js.map +1 -0
  340. package/dist/compiler/resolve-tsc-js-path.d.ts +9 -0
  341. package/dist/compiler/resolve-tsc-js-path.d.ts.map +1 -0
  342. package/dist/compiler/resolve-tsc-js-path.js +23 -0
  343. package/dist/compiler/resolve-tsc-js-path.js.map +1 -0
  344. package/dist/compiler/runtime/check-locale.d.ts +31 -0
  345. package/dist/compiler/runtime/check-locale.d.ts.map +1 -0
  346. package/dist/compiler/runtime/check-locale.js +51 -0
  347. package/dist/compiler/runtime/check-locale.js.map +1 -0
  348. package/dist/compiler/runtime/check-locale.test.d.ts +1 -0
  349. package/dist/compiler/runtime/check-locale.test.d.ts.map +1 -0
  350. package/dist/compiler/runtime/check-locale.test.js +84 -0
  351. package/dist/compiler/runtime/check-locale.test.js.map +1 -0
  352. package/dist/compiler/runtime/create-runtime.d.ts +35 -0
  353. package/dist/compiler/runtime/create-runtime.d.ts.map +1 -0
  354. package/dist/compiler/runtime/create-runtime.js +196 -0
  355. package/dist/compiler/runtime/create-runtime.js.map +1 -0
  356. package/dist/compiler/runtime/extract-locale-from-cookie.d.ts +13 -0
  357. package/dist/compiler/runtime/extract-locale-from-cookie.d.ts.map +1 -0
  358. package/dist/compiler/runtime/extract-locale-from-cookie.js +43 -0
  359. package/dist/compiler/runtime/extract-locale-from-cookie.js.map +1 -0
  360. package/dist/compiler/runtime/extract-locale-from-cookie.test.d.ts +1 -0
  361. package/dist/compiler/runtime/extract-locale-from-cookie.test.d.ts.map +1 -0
  362. package/dist/compiler/runtime/extract-locale-from-cookie.test.js +149 -0
  363. package/dist/compiler/runtime/extract-locale-from-cookie.test.js.map +1 -0
  364. package/dist/compiler/runtime/extract-locale-from-header.d.ts +13 -0
  365. package/dist/compiler/runtime/extract-locale-from-header.d.ts.map +1 -0
  366. package/dist/compiler/runtime/extract-locale-from-header.js +45 -0
  367. package/dist/compiler/runtime/extract-locale-from-header.js.map +1 -0
  368. package/dist/compiler/runtime/extract-locale-from-header.test.d.ts +1 -0
  369. package/dist/compiler/runtime/extract-locale-from-header.test.d.ts.map +1 -0
  370. package/dist/compiler/runtime/extract-locale-from-header.test.js +55 -0
  371. package/dist/compiler/runtime/extract-locale-from-header.test.js.map +1 -0
  372. package/dist/compiler/runtime/extract-locale-from-navigator.d.ts +12 -0
  373. package/dist/compiler/runtime/extract-locale-from-navigator.d.ts.map +1 -0
  374. package/dist/compiler/runtime/extract-locale-from-navigator.js +33 -0
  375. package/dist/compiler/runtime/extract-locale-from-navigator.js.map +1 -0
  376. package/dist/compiler/runtime/extract-locale-from-navigator.test.d.ts +1 -0
  377. package/dist/compiler/runtime/extract-locale-from-navigator.test.d.ts.map +1 -0
  378. package/dist/compiler/runtime/extract-locale-from-navigator.test.js +45 -0
  379. package/dist/compiler/runtime/extract-locale-from-navigator.test.js.map +1 -0
  380. package/dist/compiler/runtime/extract-locale-from-request-async.d.ts +34 -0
  381. package/dist/compiler/runtime/extract-locale-from-request-async.d.ts.map +1 -0
  382. package/dist/compiler/runtime/extract-locale-from-request-async.js +70 -0
  383. package/dist/compiler/runtime/extract-locale-from-request-async.js.map +1 -0
  384. package/dist/compiler/runtime/extract-locale-from-request-async.test.d.ts +1 -0
  385. package/dist/compiler/runtime/extract-locale-from-request-async.test.d.ts.map +1 -0
  386. package/dist/compiler/runtime/extract-locale-from-request-async.test.js +119 -0
  387. package/dist/compiler/runtime/extract-locale-from-request-async.test.js.map +1 -0
  388. package/dist/compiler/runtime/extract-locale-from-request.d.ts +41 -0
  389. package/dist/compiler/runtime/extract-locale-from-request.d.ts.map +1 -0
  390. package/dist/compiler/runtime/extract-locale-from-request.js +96 -0
  391. package/dist/compiler/runtime/extract-locale-from-request.js.map +1 -0
  392. package/dist/compiler/runtime/extract-locale-from-request.test.d.ts +1 -0
  393. package/dist/compiler/runtime/extract-locale-from-request.test.d.ts.map +1 -0
  394. package/dist/compiler/runtime/extract-locale-from-request.test.js +351 -0
  395. package/dist/compiler/runtime/extract-locale-from-request.test.js.map +1 -0
  396. package/dist/compiler/runtime/extract-locale-from-url.d.ts +11 -0
  397. package/dist/compiler/runtime/extract-locale-from-url.d.ts.map +1 -0
  398. package/dist/compiler/runtime/extract-locale-from-url.js +68 -0
  399. package/dist/compiler/runtime/extract-locale-from-url.js.map +1 -0
  400. package/dist/compiler/runtime/extract-locale-from-url.test.d.ts +1 -0
  401. package/dist/compiler/runtime/extract-locale-from-url.test.d.ts.map +1 -0
  402. package/dist/compiler/runtime/extract-locale-from-url.test.js +127 -0
  403. package/dist/compiler/runtime/extract-locale-from-url.test.js.map +1 -0
  404. package/dist/compiler/runtime/generate-static-localized-urls.d.ts +44 -0
  405. package/dist/compiler/runtime/generate-static-localized-urls.d.ts.map +1 -0
  406. package/dist/compiler/runtime/generate-static-localized-urls.js +133 -0
  407. package/dist/compiler/runtime/generate-static-localized-urls.js.map +1 -0
  408. package/dist/compiler/runtime/generate-static-localized-urls.test.d.ts +1 -0
  409. package/dist/compiler/runtime/generate-static-localized-urls.test.d.ts.map +1 -0
  410. package/dist/compiler/runtime/generate-static-localized-urls.test.js +159 -0
  411. package/dist/compiler/runtime/generate-static-localized-urls.test.js.map +1 -0
  412. package/dist/compiler/runtime/get-locale.d.ts +42 -0
  413. package/dist/compiler/runtime/get-locale.d.ts.map +1 -0
  414. package/dist/compiler/runtime/get-locale.js +158 -0
  415. package/dist/compiler/runtime/get-locale.js.map +1 -0
  416. package/dist/compiler/runtime/get-locale.test.d.ts +1 -0
  417. package/dist/compiler/runtime/get-locale.test.d.ts.map +1 -0
  418. package/dist/compiler/runtime/get-locale.test.js +295 -0
  419. package/dist/compiler/runtime/get-locale.test.js.map +1 -0
  420. package/dist/compiler/runtime/get-text-direction.d.ts +15 -0
  421. package/dist/compiler/runtime/get-text-direction.d.ts.map +1 -0
  422. package/dist/compiler/runtime/get-text-direction.js +46 -0
  423. package/dist/compiler/runtime/get-text-direction.js.map +1 -0
  424. package/dist/compiler/runtime/get-text-direction.test.d.ts +1 -0
  425. package/dist/compiler/runtime/get-text-direction.test.d.ts.map +1 -0
  426. package/dist/compiler/runtime/get-text-direction.test.js +40 -0
  427. package/dist/compiler/runtime/get-text-direction.test.js.map +1 -0
  428. package/dist/compiler/runtime/get-url-origin.d.ts +19 -0
  429. package/dist/compiler/runtime/get-url-origin.d.ts.map +1 -0
  430. package/dist/compiler/runtime/get-url-origin.js +31 -0
  431. package/dist/compiler/runtime/get-url-origin.js.map +1 -0
  432. package/dist/compiler/runtime/get-url-origin.test.d.ts +1 -0
  433. package/dist/compiler/runtime/get-url-origin.test.d.ts.map +1 -0
  434. package/dist/compiler/runtime/get-url-origin.test.js +18 -0
  435. package/dist/compiler/runtime/get-url-origin.test.js.map +1 -0
  436. package/dist/compiler/runtime/host-routing.d.ts +28 -0
  437. package/dist/compiler/runtime/host-routing.d.ts.map +1 -0
  438. package/dist/compiler/runtime/host-routing.js +79 -0
  439. package/dist/compiler/runtime/host-routing.js.map +1 -0
  440. package/dist/compiler/runtime/host-routing.test.d.ts +1 -0
  441. package/dist/compiler/runtime/host-routing.test.d.ts.map +1 -0
  442. package/dist/compiler/runtime/host-routing.test.js +128 -0
  443. package/dist/compiler/runtime/host-routing.test.js.map +1 -0
  444. package/dist/compiler/runtime/localize-href.d.ts +84 -0
  445. package/dist/compiler/runtime/localize-href.d.ts.map +1 -0
  446. package/dist/compiler/runtime/localize-href.js +115 -0
  447. package/dist/compiler/runtime/localize-href.js.map +1 -0
  448. package/dist/compiler/runtime/localize-href.test.d.ts +1 -0
  449. package/dist/compiler/runtime/localize-href.test.d.ts.map +1 -0
  450. package/dist/compiler/runtime/localize-href.test.js +139 -0
  451. package/dist/compiler/runtime/localize-href.test.js.map +1 -0
  452. package/dist/compiler/runtime/localize-url.d.ts +95 -0
  453. package/dist/compiler/runtime/localize-url.d.ts.map +1 -0
  454. package/dist/compiler/runtime/localize-url.js +327 -0
  455. package/dist/compiler/runtime/localize-url.js.map +1 -0
  456. package/dist/compiler/runtime/localize-url.test.d.ts +1 -0
  457. package/dist/compiler/runtime/localize-url.test.d.ts.map +1 -0
  458. package/dist/compiler/runtime/localize-url.test.js +533 -0
  459. package/dist/compiler/runtime/localize-url.test.js.map +1 -0
  460. package/dist/compiler/runtime/route-strategy.d.ts +32 -0
  461. package/dist/compiler/runtime/route-strategy.d.ts.map +1 -0
  462. package/dist/compiler/runtime/route-strategy.js +72 -0
  463. package/dist/compiler/runtime/route-strategy.js.map +1 -0
  464. package/dist/compiler/runtime/set-locale.d.ts +46 -0
  465. package/dist/compiler/runtime/set-locale.d.ts.map +1 -0
  466. package/dist/compiler/runtime/set-locale.js +172 -0
  467. package/dist/compiler/runtime/set-locale.js.map +1 -0
  468. package/dist/compiler/runtime/set-locale.test.d.ts +1 -0
  469. package/dist/compiler/runtime/set-locale.test.d.ts.map +1 -0
  470. package/dist/compiler/runtime/set-locale.test.js +555 -0
  471. package/dist/compiler/runtime/set-locale.test.js.map +1 -0
  472. package/dist/compiler/runtime/should-redirect.d.ts +100 -0
  473. package/dist/compiler/runtime/should-redirect.d.ts.map +1 -0
  474. package/dist/compiler/runtime/should-redirect.js +155 -0
  475. package/dist/compiler/runtime/should-redirect.js.map +1 -0
  476. package/dist/compiler/runtime/should-redirect.test.d.ts +1 -0
  477. package/dist/compiler/runtime/should-redirect.test.d.ts.map +1 -0
  478. package/dist/compiler/runtime/should-redirect.test.js +270 -0
  479. package/dist/compiler/runtime/should-redirect.test.js.map +1 -0
  480. package/dist/compiler/runtime/strategy.d.ts +63 -0
  481. package/dist/compiler/runtime/strategy.d.ts.map +1 -0
  482. package/dist/compiler/runtime/strategy.js +65 -0
  483. package/dist/compiler/runtime/strategy.js.map +1 -0
  484. package/dist/compiler/runtime/strategy.test.d.ts +1 -0
  485. package/dist/compiler/runtime/strategy.test.d.ts.map +1 -0
  486. package/dist/compiler/runtime/strategy.test.js +90 -0
  487. package/dist/compiler/runtime/strategy.test.js.map +1 -0
  488. package/dist/compiler/runtime/track-message-call.d.ts +5 -0
  489. package/dist/compiler/runtime/track-message-call.d.ts.map +1 -0
  490. package/dist/compiler/runtime/track-message-call.js +14 -0
  491. package/dist/compiler/runtime/track-message-call.js.map +1 -0
  492. package/dist/compiler/runtime/track-message-call.test.d.ts +1 -0
  493. package/dist/compiler/runtime/track-message-call.test.d.ts.map +1 -0
  494. package/dist/compiler/runtime/track-message-call.test.js +22 -0
  495. package/dist/compiler/runtime/track-message-call.test.js.map +1 -0
  496. package/dist/compiler/runtime/type-definitions.d.ts +197 -0
  497. package/dist/compiler/runtime/type-definitions.d.ts.map +1 -0
  498. package/dist/compiler/runtime/type-definitions.js +150 -0
  499. package/dist/compiler/runtime/type-definitions.js.map +1 -0
  500. package/dist/compiler/runtime/type.d.ts +47 -0
  501. package/dist/compiler/runtime/type.d.ts.map +1 -0
  502. package/dist/compiler/runtime/type.js +2 -0
  503. package/dist/compiler/runtime/type.js.map +1 -0
  504. package/dist/compiler/runtime/type.test.d.ts +1 -0
  505. package/dist/compiler/runtime/type.test.d.ts.map +1 -0
  506. package/dist/compiler/runtime/type.test.js +153 -0
  507. package/dist/compiler/runtime/type.test.js.map +1 -0
  508. package/dist/compiler/runtime/url-pattern.d.ts +12 -0
  509. package/dist/compiler/runtime/url-pattern.d.ts.map +1 -0
  510. package/dist/compiler/runtime/url-pattern.js +35 -0
  511. package/dist/compiler/runtime/url-pattern.js.map +1 -0
  512. package/dist/compiler/runtime/variables.d.ts +128 -0
  513. package/dist/compiler/runtime/variables.d.ts.map +1 -0
  514. package/dist/compiler/runtime/variables.js +111 -0
  515. package/dist/compiler/runtime/variables.js.map +1 -0
  516. package/dist/compiler/safe-module-id.d.ts +7 -0
  517. package/dist/compiler/safe-module-id.d.ts.map +1 -0
  518. package/dist/compiler/safe-module-id.js +78 -0
  519. package/dist/compiler/safe-module-id.js.map +1 -0
  520. package/dist/compiler/safe-module-id.test.d.ts +1 -0
  521. package/dist/compiler/safe-module-id.test.d.ts.map +1 -0
  522. package/dist/compiler/safe-module-id.test.js +36 -0
  523. package/dist/compiler/safe-module-id.test.js.map +1 -0
  524. package/dist/compiler/seed-previous-compilation.d.ts +7 -0
  525. package/dist/compiler/seed-previous-compilation.d.ts.map +1 -0
  526. package/dist/compiler/seed-previous-compilation.js +9 -0
  527. package/dist/compiler/seed-previous-compilation.js.map +1 -0
  528. package/dist/compiler/server/create-server-file.d.ts +12 -0
  529. package/dist/compiler/server/create-server-file.d.ts.map +1 -0
  530. package/dist/compiler/server/create-server-file.js +91 -0
  531. package/dist/compiler/server/create-server-file.js.map +1 -0
  532. package/dist/compiler/server/create-server-file.test.d.ts +1 -0
  533. package/dist/compiler/server/create-server-file.test.d.ts.map +1 -0
  534. package/dist/compiler/server/create-server-file.test.js +48 -0
  535. package/dist/compiler/server/create-server-file.test.js.map +1 -0
  536. package/dist/compiler/server/middleware.d.ts +98 -0
  537. package/dist/compiler/server/middleware.d.ts.map +1 -0
  538. package/dist/compiler/server/middleware.js +278 -0
  539. package/dist/compiler/server/middleware.js.map +1 -0
  540. package/dist/compiler/server/middleware.test.d.ts +1 -0
  541. package/dist/compiler/server/middleware.test.d.ts.map +1 -0
  542. package/dist/compiler/server/middleware.test.js +1001 -0
  543. package/dist/compiler/server/middleware.test.js.map +1 -0
  544. package/dist/compiler/server/type.d.ts +6 -0
  545. package/dist/compiler/server/type.d.ts.map +1 -0
  546. package/dist/compiler/server/type.js +2 -0
  547. package/dist/compiler/server/type.js.map +1 -0
  548. package/dist/compiler/test-helpers.d.ts +30 -0
  549. package/dist/compiler/test-helpers.d.ts.map +1 -0
  550. package/dist/compiler/test-helpers.js +50 -0
  551. package/dist/compiler/test-helpers.js.map +1 -0
  552. package/dist/compiler/types.d.ts +7 -0
  553. package/dist/compiler/types.d.ts.map +1 -0
  554. package/dist/compiler/types.js +2 -0
  555. package/dist/compiler/types.js.map +1 -0
  556. package/dist/compiler/variable-access.d.ts +3 -0
  557. package/dist/compiler/variable-access.d.ts.map +1 -0
  558. package/dist/compiler/variable-access.js +15 -0
  559. package/dist/compiler/variable-access.js.map +1 -0
  560. package/dist/index.d.ts +2 -0
  561. package/dist/index.d.ts.map +1 -0
  562. package/dist/index.js +3 -0
  563. package/dist/index.js.map +1 -0
  564. package/dist/messages/ast.d.ts +102 -0
  565. package/dist/messages/ast.d.ts.map +1 -0
  566. package/dist/messages/ast.js +8 -0
  567. package/dist/messages/ast.js.map +1 -0
  568. package/dist/messages/create-bundle-nested.d.ts +16 -0
  569. package/dist/messages/create-bundle-nested.d.ts.map +1 -0
  570. package/dist/messages/create-bundle-nested.js +22 -0
  571. package/dist/messages/create-bundle-nested.js.map +1 -0
  572. package/dist/messages/index.d.ts +5 -0
  573. package/dist/messages/index.d.ts.map +1 -0
  574. package/dist/messages/index.js +5 -0
  575. package/dist/messages/index.js.map +1 -0
  576. package/dist/messages/load-messages.d.ts +19 -0
  577. package/dist/messages/load-messages.d.ts.map +1 -0
  578. package/dist/messages/load-messages.js +49 -0
  579. package/dist/messages/load-messages.js.map +1 -0
  580. package/dist/messages/message-format/flatten.d.ts +9 -0
  581. package/dist/messages/message-format/flatten.d.ts.map +1 -0
  582. package/dist/messages/message-format/flatten.js +32 -0
  583. package/dist/messages/message-format/flatten.js.map +1 -0
  584. package/dist/messages/message-format/import-files.d.ts +32 -0
  585. package/dist/messages/message-format/import-files.d.ts.map +1 -0
  586. package/dist/messages/message-format/import-files.js +53 -0
  587. package/dist/messages/message-format/import-files.js.map +1 -0
  588. package/dist/messages/message-format/import-files.test.d.ts +1 -0
  589. package/dist/messages/message-format/import-files.test.d.ts.map +1 -0
  590. package/dist/messages/message-format/import-files.test.js +145 -0
  591. package/dist/messages/message-format/import-files.test.js.map +1 -0
  592. package/dist/messages/message-format/index.d.ts +6 -0
  593. package/dist/messages/message-format/index.d.ts.map +1 -0
  594. package/dist/messages/message-format/index.js +7 -0
  595. package/dist/messages/message-format/index.js.map +1 -0
  596. package/dist/messages/message-format/parse-bundle.d.ts +31 -0
  597. package/dist/messages/message-format/parse-bundle.d.ts.map +1 -0
  598. package/dist/messages/message-format/parse-bundle.js +169 -0
  599. package/dist/messages/message-format/parse-bundle.js.map +1 -0
  600. package/dist/messages/message-format/parse-declaration.d.ts +2 -0
  601. package/dist/messages/message-format/parse-declaration.d.ts.map +1 -0
  602. package/dist/messages/message-format/parse-declaration.js +56 -0
  603. package/dist/messages/message-format/parse-declaration.js.map +1 -0
  604. package/dist/messages/message-format/parse-markup.d.ts +4 -0
  605. package/dist/messages/message-format/parse-markup.d.ts.map +1 -0
  606. package/dist/messages/message-format/parse-markup.js +167 -0
  607. package/dist/messages/message-format/parse-markup.js.map +1 -0
  608. package/dist/messages/message-format/parse-matches.d.ts +5 -0
  609. package/dist/messages/message-format/parse-matches.d.ts.map +1 -0
  610. package/dist/messages/message-format/parse-matches.js +31 -0
  611. package/dist/messages/message-format/parse-matches.js.map +1 -0
  612. package/dist/messages/message-format/parse-pattern.d.ts +5 -0
  613. package/dist/messages/message-format/parse-pattern.d.ts.map +1 -0
  614. package/dist/messages/message-format/parse-pattern.js +120 -0
  615. package/dist/messages/message-format/parse-pattern.js.map +1 -0
  616. package/dist/messages/message-format/unique.d.ts +2 -0
  617. package/dist/messages/message-format/unique.d.ts.map +1 -0
  618. package/dist/messages/message-format/unique.js +5 -0
  619. package/dist/messages/message-format/unique.js.map +1 -0
  620. package/dist/messages/nest-bundles.d.ts +19 -0
  621. package/dist/messages/nest-bundles.d.ts.map +1 -0
  622. package/dist/messages/nest-bundles.js +49 -0
  623. package/dist/messages/nest-bundles.js.map +1 -0
  624. package/dist/services/account/index.d.ts +14 -0
  625. package/dist/services/account/index.d.ts.map +1 -0
  626. package/dist/services/account/index.js +43 -0
  627. package/dist/services/account/index.js.map +1 -0
  628. package/dist/services/account/types.d.ts +4 -0
  629. package/dist/services/account/types.d.ts.map +1 -0
  630. package/dist/services/account/types.js +2 -0
  631. package/dist/services/account/types.js.map +1 -0
  632. package/dist/services/codegen/escape.d.ts +9 -0
  633. package/dist/services/codegen/escape.d.ts.map +1 -0
  634. package/dist/services/codegen/escape.js +19 -0
  635. package/dist/services/codegen/escape.js.map +1 -0
  636. package/dist/services/codegen/quotes.d.ts +4 -0
  637. package/dist/services/codegen/quotes.d.ts.map +1 -0
  638. package/dist/services/codegen/quotes.js +5 -0
  639. package/dist/services/codegen/quotes.js.map +1 -0
  640. package/dist/services/env-variables/create-index-file.d.ts +9 -0
  641. package/dist/services/env-variables/create-index-file.d.ts.map +1 -0
  642. package/dist/services/env-variables/create-index-file.js +28 -0
  643. package/dist/services/env-variables/create-index-file.js.map +1 -0
  644. package/dist/services/env-variables/index.d.ts +3 -0
  645. package/dist/services/env-variables/index.d.ts.map +1 -0
  646. package/dist/services/env-variables/index.js +4 -0
  647. package/dist/services/env-variables/index.js.map +1 -0
  648. package/dist/services/environment/package.d.ts +9 -0
  649. package/dist/services/environment/package.d.ts.map +1 -0
  650. package/dist/services/environment/package.js +31 -0
  651. package/dist/services/environment/package.js.map +1 -0
  652. package/dist/services/environment/package.test.d.ts +1 -0
  653. package/dist/services/environment/package.test.d.ts.map +1 -0
  654. package/dist/services/environment/package.test.js +21 -0
  655. package/dist/services/environment/package.test.js.map +1 -0
  656. package/dist/services/error-handling.d.ts +12 -0
  657. package/dist/services/error-handling.d.ts.map +1 -0
  658. package/dist/services/error-handling.js +27 -0
  659. package/dist/services/error-handling.js.map +1 -0
  660. package/dist/services/error-handling.test.d.ts +1 -0
  661. package/dist/services/error-handling.test.d.ts.map +1 -0
  662. package/dist/services/error-handling.test.js +10 -0
  663. package/dist/services/error-handling.test.js.map +1 -0
  664. package/dist/services/file-handling/content-hash.d.ts +9 -0
  665. package/dist/services/file-handling/content-hash.js +19 -0
  666. package/dist/services/file-handling/content-hash.js.map +1 -0
  667. package/dist/services/file-handling/exists.d.ts +7 -0
  668. package/dist/services/file-handling/exists.d.ts.map +1 -0
  669. package/dist/services/file-handling/exists.js +24 -0
  670. package/dist/services/file-handling/exists.js.map +1 -0
  671. package/dist/services/file-handling/exists.test.d.ts +1 -0
  672. package/dist/services/file-handling/exists.test.d.ts.map +1 -0
  673. package/dist/services/file-handling/exists.test.js +27 -0
  674. package/dist/services/file-handling/exists.test.js.map +1 -0
  675. package/dist/services/file-handling/types.d.ts +4 -0
  676. package/dist/services/file-handling/types.d.ts.map +1 -0
  677. package/dist/services/file-handling/types.js +2 -0
  678. package/dist/services/file-handling/types.js.map +1 -0
  679. package/dist/services/file-handling/write-output.d.ts +21 -0
  680. package/dist/services/file-handling/write-output.d.ts.map +1 -0
  681. package/dist/services/file-handling/write-output.js +157 -0
  682. package/dist/services/file-handling/write-output.js.map +1 -0
  683. package/dist/services/file-handling/write-output.test.d.ts +1 -0
  684. package/dist/services/file-handling/write-output.test.d.ts.map +1 -0
  685. package/dist/services/file-handling/write-output.test.js +217 -0
  686. package/dist/services/file-handling/write-output.test.js.map +1 -0
  687. package/dist/services/file-watching/tracked-fs.d.ts +25 -0
  688. package/dist/services/file-watching/tracked-fs.d.ts.map +1 -0
  689. package/dist/services/file-watching/tracked-fs.js +94 -0
  690. package/dist/services/file-watching/tracked-fs.js.map +1 -0
  691. package/dist/services/file-watching/tracked-fs.test.d.ts +1 -0
  692. package/dist/services/file-watching/tracked-fs.test.d.ts.map +1 -0
  693. package/dist/services/file-watching/tracked-fs.test.js +87 -0
  694. package/dist/services/file-watching/tracked-fs.test.js.map +1 -0
  695. package/dist/services/logger/index.d.ts +17 -0
  696. package/dist/services/logger/index.d.ts.map +1 -0
  697. package/dist/services/logger/index.js +58 -0
  698. package/dist/services/logger/index.js.map +1 -0
  699. package/dist/services/lookup.d.ts +14 -0
  700. package/dist/services/lookup.d.ts.map +1 -0
  701. package/dist/services/lookup.js +24 -0
  702. package/dist/services/lookup.js.map +1 -0
  703. package/dist/urlpattern-polyfill/index.d.ts +2 -0
  704. package/dist/urlpattern-polyfill/index.d.ts.map +1 -0
  705. package/dist/urlpattern-polyfill/index.js +2 -0
  706. package/dist/urlpattern-polyfill/index.js.map +1 -0
  707. package/dist/utilities/detect-json-formatting.d.ts +10 -0
  708. package/dist/utilities/detect-json-formatting.d.ts.map +1 -0
  709. package/dist/utilities/detect-json-formatting.js +80 -0
  710. package/dist/utilities/detect-json-formatting.js.map +1 -0
  711. package/dist/utilities/node-normalize-path.d.ts +1 -0
  712. package/dist/utilities/node-normalize-path.d.ts.map +1 -0
  713. package/dist/utilities/node-normalize-path.js +10 -0
  714. package/dist/utilities/node-normalize-path.js.map +1 -0
  715. package/package.json +87 -0
@@ -0,0 +1,1001 @@
1
+ import { test, expect } from "vitest";
2
+ import { createParaglide } from "../create-paraglide.js";
3
+ test("sets the locale and origin", async () => {
4
+ const runtime = await createParaglide({
5
+ baseLocale: "en",
6
+ locales: ["en", "de", "fr"],
7
+ strategy: ["url", "globalVariable"],
8
+ });
9
+ // setting the global variable to fr to assure that
10
+ runtime.setLocale("fr");
11
+ // simulating multiple requests that could interfere with each other
12
+ await Promise.all([
13
+ runtime.paraglideMiddleware(new Request(new URL("https://example.com/page"), {
14
+ headers: { "Sec-Fetch-Dest": "document" },
15
+ }), () => {
16
+ expect(runtime.getLocale()).toBe("en");
17
+ expect(runtime.getUrlOrigin()).toBe("https://example.com");
18
+ return new Response();
19
+ }),
20
+ runtime.paraglideMiddleware(new Request(new URL("https://peter.com/de/page"), {
21
+ headers: { "Sec-Fetch-Dest": "document" },
22
+ }), () => {
23
+ expect(runtime.getLocale()).toBe("de");
24
+ expect(runtime.getUrlOrigin()).toBe("https://peter.com");
25
+ return new Response();
26
+ }),
27
+ ]);
28
+ // global variable is not impacted by middleware
29
+ expect(runtime.getLocale()).toBe("fr");
30
+ });
31
+ test("delocalizes the url if the url strategy is used and returns the locale", async () => {
32
+ const runtime = await createParaglide({
33
+ baseLocale: "en",
34
+ locales: ["en", "de"],
35
+ strategy: ["url"],
36
+ });
37
+ const request = new Request(new URL("https://example.com/de/page"), {
38
+ headers: { "Sec-Fetch-Dest": "document" },
39
+ });
40
+ const result = await runtime.paraglideMiddleware(request, (args) => {
41
+ expect(args.locale).toBe("de");
42
+ expect(args.request.url).toBe("https://example.com/page");
43
+ return new Response("Hello World");
44
+ });
45
+ expect(await result.text()).toBe("Hello World");
46
+ });
47
+ test("does not delocalize the url if the url strategy is not used", async () => {
48
+ const runtime = await createParaglide({
49
+ baseLocale: "en",
50
+ locales: ["en", "de"],
51
+ strategy: ["globalVariable", "baseLocale"],
52
+ });
53
+ const request = new Request(new URL("https://example.com/de/page"), {
54
+ headers: { "Sec-Fetch-Dest": "document" },
55
+ });
56
+ const result = await runtime.paraglideMiddleware(request, (args) => {
57
+ expect(args.locale).toBe("en");
58
+ expect(args.request.url).toBe("https://example.com/de/page");
59
+ return new Response("Hello World");
60
+ });
61
+ expect(await result.text()).toBe("Hello World");
62
+ });
63
+ test("skips i18n middleware behavior for excluded routeStrategies", async () => {
64
+ const runtime = await createParaglide({
65
+ baseLocale: "en",
66
+ locales: ["en", "fr"],
67
+ strategy: ["cookie", "url", "baseLocale"],
68
+ cookieName: "PARAGLIDE_LOCALE",
69
+ routeStrategies: [{ match: "/api/:path(.*)?", exclude: true }],
70
+ });
71
+ const request = new Request("https://example.com/api/data", {
72
+ headers: {
73
+ cookie: "PARAGLIDE_LOCALE=fr",
74
+ "Sec-Fetch-Dest": "document",
75
+ },
76
+ });
77
+ const response = await runtime.paraglideMiddleware(request, ({ locale, request }) => new Response(`${locale}|${request.url}`));
78
+ expect(response.status).toBe(200);
79
+ expect(await response.text()).toBe("en|https://example.com/api/data");
80
+ });
81
+ test("localized URLs still match routeStrategies after delocalization", async () => {
82
+ const runtime = await createParaglide({
83
+ baseLocale: "en",
84
+ locales: ["en", "fr"],
85
+ strategy: ["url", "cookie", "baseLocale"],
86
+ cookieName: "PARAGLIDE_LOCALE",
87
+ routeStrategies: [
88
+ {
89
+ match: "/dashboard/:path(.*)?",
90
+ strategy: ["cookie", "baseLocale"],
91
+ },
92
+ { match: "/api/:path(.*)?", exclude: true },
93
+ ],
94
+ });
95
+ const dashboard = await runtime.paraglideMiddleware(new Request("https://example.com/fr/dashboard", {
96
+ headers: { cookie: "PARAGLIDE_LOCALE=en" },
97
+ }), ({ locale }) => new Response(locale));
98
+ expect(await dashboard.text()).toBe("en");
99
+ const api = await runtime.paraglideMiddleware(new Request("https://example.com/fr/api/data", {
100
+ headers: { cookie: "PARAGLIDE_LOCALE=fr" },
101
+ }), ({ locale, request }) => new Response(`${locale}|${request.url}`));
102
+ expect(await api.text()).toBe("en|https://example.com/fr/api/data");
103
+ });
104
+ test("excluded routeStrategies keep request-scoped locale context and clone request when possible", async () => {
105
+ const runtime = await createParaglide({
106
+ baseLocale: "en",
107
+ locales: ["en", "fr"],
108
+ strategy: ["globalVariable", "baseLocale"],
109
+ routeStrategies: [{ match: "/api/:path(.*)?", exclude: true }],
110
+ });
111
+ runtime.setLocale("fr");
112
+ const originalRequest = new Request("https://example.com/api/data", {
113
+ headers: { "Sec-Fetch-Dest": "document" },
114
+ });
115
+ const response = await runtime.paraglideMiddleware(originalRequest, ({ locale, request }) => {
116
+ expect(locale).toBe("en");
117
+ expect(runtime.getLocale()).toBe("en");
118
+ expect(runtime.getUrlOrigin()).toBe("https://example.com");
119
+ expect(request).not.toBe(originalRequest);
120
+ expect(request.url).toBe("https://example.com/api/data");
121
+ return new Response("ok");
122
+ });
123
+ expect(await response.text()).toBe("ok");
124
+ expect(runtime.getLocale()).toBe("fr");
125
+ });
126
+ test("excluded routeStrategies fall back to original request when cloning fails", async () => {
127
+ const runtime = await createParaglide({
128
+ baseLocale: "en",
129
+ locales: ["en", "de"],
130
+ strategy: ["globalVariable", "baseLocale"],
131
+ routeStrategies: [{ match: "/api/:path(.*)?", exclude: true }],
132
+ });
133
+ const customRequest = {
134
+ url: "https://example.com/api/data",
135
+ headers: new Headers({ "Sec-Fetch-Dest": "document" }),
136
+ method: "GET",
137
+ };
138
+ const response = await runtime.paraglideMiddleware(customRequest, ({ locale, request }) => {
139
+ expect(locale).toBe("en");
140
+ expect(request).toBe(customRequest);
141
+ return new Response("ok");
142
+ });
143
+ expect(await response.text()).toBe("ok");
144
+ });
145
+ test("excluded routeStrategies preserve original request body readability", async () => {
146
+ const runtime = await createParaglide({
147
+ baseLocale: "en",
148
+ locales: ["en", "de"],
149
+ strategy: ["globalVariable", "baseLocale"],
150
+ routeStrategies: [{ match: "/api/:path(.*)?", exclude: true }],
151
+ });
152
+ const originalRequest = new Request("https://example.com/api/data", {
153
+ method: "POST",
154
+ body: "hello=world",
155
+ headers: {
156
+ "Content-Type": "application/x-www-form-urlencoded",
157
+ "Sec-Fetch-Dest": "document",
158
+ },
159
+ });
160
+ const response = await runtime.paraglideMiddleware(originalRequest, async ({ request }) => {
161
+ expect(await request.text()).toBe("hello=world");
162
+ return new Response("ok");
163
+ });
164
+ expect(await response.text()).toBe("ok");
165
+ expect(await originalRequest.text()).toBe("hello=world");
166
+ });
167
+ test("routeStrategies layering is first-match-wins when exclude comes first", async () => {
168
+ const runtime = await createParaglide({
169
+ baseLocale: "en",
170
+ locales: ["en", "fr"],
171
+ strategy: ["cookie", "url", "baseLocale"],
172
+ cookieName: "PARAGLIDE_LOCALE",
173
+ routeStrategies: [
174
+ { match: "/api/:path(.*)?", exclude: true },
175
+ { match: "/api/:path(.*)?", strategy: ["cookie", "baseLocale"] },
176
+ ],
177
+ });
178
+ const request = new Request("https://example.com/api/data", {
179
+ headers: {
180
+ cookie: "PARAGLIDE_LOCALE=fr",
181
+ "Sec-Fetch-Dest": "document",
182
+ },
183
+ });
184
+ const response = await runtime.paraglideMiddleware(request, ({ locale, request }) => new Response(`${locale}|${request.url}`));
185
+ expect(response.status).toBe(200);
186
+ expect(await response.text()).toBe("en|https://example.com/api/data");
187
+ });
188
+ test("routeStrategies layering is first-match-wins when strategy comes first", async () => {
189
+ const runtime = await createParaglide({
190
+ baseLocale: "en",
191
+ locales: ["en", "fr"],
192
+ strategy: ["cookie", "url", "baseLocale"],
193
+ cookieName: "PARAGLIDE_LOCALE",
194
+ routeStrategies: [
195
+ { match: "/api/:path(.*)?", strategy: ["cookie", "baseLocale"] },
196
+ { match: "/api/:path(.*)?", exclude: true },
197
+ ],
198
+ });
199
+ const request = new Request("https://example.com/api/data", {
200
+ headers: {
201
+ cookie: "PARAGLIDE_LOCALE=fr",
202
+ "Sec-Fetch-Dest": "document",
203
+ },
204
+ });
205
+ const response = await runtime.paraglideMiddleware(request, ({ locale, request }) => new Response(`${locale}|${request.url}`));
206
+ expect(response.status).toBe(200);
207
+ expect(await response.text()).toBe("fr|https://example.com/api/data");
208
+ });
209
+ test("redirects to localized URL when non-URL strategy determines locale", async () => {
210
+ const runtime = await createParaglide({
211
+ baseLocale: "en",
212
+ locales: ["en", "fr"],
213
+ strategy: ["cookie", "url"],
214
+ cookieName: "PARAGLIDE_LOCALE",
215
+ urlPatterns: [
216
+ {
217
+ pattern: "https://example.com/:path(.*)?",
218
+ localized: [
219
+ ["en", "https://example.com/en/:path(.*)?"],
220
+ ["fr", "https://example.com/fr/:path(.*)?"],
221
+ ],
222
+ },
223
+ ],
224
+ });
225
+ // Request to URL in en with cookie specifying French
226
+ const request = new Request("https://example.com/en/some-path", {
227
+ headers: {
228
+ cookie: `PARAGLIDE_LOCALE=fr`,
229
+ "Sec-Fetch-Dest": "document",
230
+ },
231
+ });
232
+ const response = await runtime.paraglideMiddleware(request, () => {
233
+ // This shouldn't be called since we should redirect
234
+ throw new Error("Should not reach here");
235
+ });
236
+ expect(response instanceof Response).toBe(true);
237
+ // needs to be 307 status code https://github.com/opral/inlang-paraglide-js/issues/416
238
+ expect(response.status).toBe(307); // Redirect status code
239
+ expect(response.headers.get("Location")).toBe("https://example.com/fr/some-path");
240
+ });
241
+ test("call onRedirect callback when redirecting to new url", async () => {
242
+ const runtime = await createParaglide({
243
+ baseLocale: "en",
244
+ locales: ["en", "fr"],
245
+ strategy: ["cookie", "url"],
246
+ cookieName: "PARAGLIDE_LOCALE",
247
+ urlPatterns: [
248
+ {
249
+ pattern: "https://example.com/:path(.*)?",
250
+ localized: [
251
+ ["en", "https://example.com/en/:path(.*)?"],
252
+ ["fr", "https://example.com/fr/:path(.*)?"],
253
+ ],
254
+ },
255
+ ],
256
+ });
257
+ // Request to URL in en with cookie specifying French
258
+ const request = new Request("https://example.com/en/some-path", {
259
+ headers: {
260
+ cookie: `PARAGLIDE_LOCALE=fr`,
261
+ "Sec-Fetch-Dest": "document",
262
+ },
263
+ });
264
+ let response;
265
+ await runtime.paraglideMiddleware(request, () => {
266
+ // This shouldn't be called since we should redirect
267
+ throw new Error("Should not reach here");
268
+ }, {
269
+ onRedirect: (res) => {
270
+ response = res;
271
+ },
272
+ });
273
+ expect(response instanceof Response).toBe(true);
274
+ // needs to be 307 status code https://github.com/opral/inlang-paraglide-js/issues/416
275
+ expect(response.status).toBe(307); // Redirect status code
276
+ expect(response.headers.get("Location")).toBe("https://example.com/fr/some-path");
277
+ });
278
+ test("uses the provided public url for redirects behind a proxy", async () => {
279
+ const runtime = await createParaglide({
280
+ baseLocale: "en",
281
+ locales: ["en", "fr"],
282
+ strategy: ["cookie", "url"],
283
+ cookieName: "PARAGLIDE_LOCALE",
284
+ urlPatterns: [
285
+ {
286
+ pattern: "https://example.com/:path(.*)?",
287
+ localized: [
288
+ ["en", "https://example.com/en/:path(.*)?"],
289
+ ["fr", "https://example.com/fr/:path(.*)?"],
290
+ ],
291
+ },
292
+ ],
293
+ });
294
+ const request = new Request("http://internal.example.com/en/some-path", {
295
+ headers: {
296
+ cookie: `PARAGLIDE_LOCALE=fr`,
297
+ "Sec-Fetch-Dest": "document",
298
+ },
299
+ });
300
+ const response = await runtime.paraglideMiddleware(request, () => {
301
+ throw new Error("Should not reach here");
302
+ }, {
303
+ effectiveRequestUrl: "https://example.com/en/some-path",
304
+ });
305
+ expect(response.status).toBe(307);
306
+ expect(response.headers.get("Location")).toBe("https://example.com/fr/some-path");
307
+ });
308
+ test("uses the provided public url for callback request and origin", async () => {
309
+ const runtime = await createParaglide({
310
+ baseLocale: "en",
311
+ locales: ["en", "fr"],
312
+ strategy: ["url", "baseLocale"],
313
+ urlPatterns: [
314
+ {
315
+ pattern: "https://example.com/:path(.*)?",
316
+ localized: [
317
+ ["en", "https://example.com/en/:path(.*)?"],
318
+ ["fr", "https://example.com/fr/:path(.*)?"],
319
+ ],
320
+ },
321
+ ],
322
+ });
323
+ const request = new Request("http://internal.example.com/fr/some-path", {
324
+ headers: {
325
+ "Sec-Fetch-Dest": "document",
326
+ },
327
+ });
328
+ const response = await runtime.paraglideMiddleware(request, ({ request }) => {
329
+ expect(runtime.getUrlOrigin()).toBe("https://example.com");
330
+ return new Response(request.url);
331
+ }, {
332
+ effectiveRequestUrl: "https://example.com/fr/some-path",
333
+ });
334
+ expect(await response.text()).toBe("https://example.com/some-path");
335
+ });
336
+ test("sets Vary: Accept-Language header when preferredLanguage strategy is used and redirect occurs", async () => {
337
+ const runtime = await createParaglide({
338
+ baseLocale: "en",
339
+ locales: ["en", "fr"],
340
+ strategy: ["preferredLanguage", "url"],
341
+ urlPatterns: [
342
+ {
343
+ pattern: "https://example.com/:path(.*)?",
344
+ localized: [
345
+ ["en", "https://example.com/en/:path(.*)?"],
346
+ ["fr", "https://example.com/fr/:path(.*)?"],
347
+ ],
348
+ },
349
+ ],
350
+ });
351
+ // Request with Accept-Language header preferring French
352
+ const request = new Request("https://example.com/en/some-path", {
353
+ headers: {
354
+ "Accept-Language": "fr,en;q=0.8",
355
+ "Sec-Fetch-Dest": "document",
356
+ },
357
+ });
358
+ const response = await runtime.paraglideMiddleware(request, () => {
359
+ // This shouldn't be called since we should redirect
360
+ throw new Error("Should not reach here");
361
+ });
362
+ expect(response instanceof Response).toBe(true);
363
+ expect(response.status).toBe(307); // Redirect status code
364
+ expect(response.headers.get("Location")).toBe("https://example.com/fr/some-path");
365
+ // Should have Vary header when preferredLanguage strategy is used
366
+ expect(response.headers.get("Vary")).toBe("Accept-Language");
367
+ });
368
+ test("does not set Vary header when preferredLanguage strategy is not used", async () => {
369
+ const runtime = await createParaglide({
370
+ baseLocale: "en",
371
+ locales: ["en", "fr"],
372
+ strategy: ["cookie", "url"],
373
+ cookieName: "PARAGLIDE_LOCALE",
374
+ urlPatterns: [
375
+ {
376
+ pattern: "https://example.com/:path(.*)?",
377
+ localized: [
378
+ ["en", "https://example.com/en/:path(.*)?"],
379
+ ["fr", "https://example.com/fr/:path(.*)?"],
380
+ ],
381
+ },
382
+ ],
383
+ });
384
+ // Request with cookie specifying French
385
+ const request = new Request("https://example.com/en/some-path", {
386
+ headers: {
387
+ cookie: `PARAGLIDE_LOCALE=fr`,
388
+ "Sec-Fetch-Dest": "document",
389
+ },
390
+ });
391
+ const response = await runtime.paraglideMiddleware(request, () => {
392
+ // This shouldn't be called since we should redirect
393
+ throw new Error("Should not reach here");
394
+ });
395
+ expect(response instanceof Response).toBe(true);
396
+ expect(response.status).toBe(307); // Redirect status code
397
+ expect(response.headers.get("Location")).toBe("https://example.com/fr/some-path");
398
+ // Should NOT have Vary header when preferredLanguage strategy is not used
399
+ expect(response.headers.get("Vary")).toBe(null);
400
+ });
401
+ test("does not call onRedirect callback when there is no redirecting", async () => {
402
+ const runtime = await createParaglide({
403
+ baseLocale: "en",
404
+ locales: ["en", "fr"],
405
+ strategy: ["cookie", "url"],
406
+ cookieName: "PARAGLIDE_LOCALE",
407
+ urlPatterns: [
408
+ {
409
+ pattern: "https://example.com/:path(.*)?",
410
+ localized: [
411
+ ["en", "https://example.com/en/:path(.*)?"],
412
+ ["fr", "https://example.com/fr/:path(.*)?"],
413
+ ],
414
+ },
415
+ ],
416
+ });
417
+ // Request to URL in en with cookie specifying French
418
+ const request = new Request("https://example.com/fr/some-path", {
419
+ headers: {
420
+ cookie: `PARAGLIDE_LOCALE=fr`,
421
+ "Sec-Fetch-Dest": "document",
422
+ },
423
+ });
424
+ let response = null;
425
+ await runtime.paraglideMiddleware(request, () => {
426
+ return new Response("Hello World");
427
+ }, {
428
+ onRedirect: (res) => {
429
+ response = res;
430
+ },
431
+ });
432
+ expect(response).toBe(null);
433
+ });
434
+ test("does not redirect if URL already matches determined locale", async () => {
435
+ const runtime = await createParaglide({
436
+ baseLocale: "en",
437
+ locales: ["en", "fr"],
438
+ strategy: ["cookie", "url"],
439
+ cookieName: "PARAGLIDE_LOCALE",
440
+ urlPatterns: [
441
+ {
442
+ pattern: "https://example.com/:path(.*)?",
443
+ localized: [
444
+ ["en", "https://example.com/en/:path(.*)?"],
445
+ ["fr", "https://example.com/fr/:path(.*)?"],
446
+ ],
447
+ },
448
+ ],
449
+ });
450
+ // Request to already localized URL matching cookie locale
451
+ const request = new Request("https://example.com/fr/some-path", {
452
+ headers: {
453
+ "Sec-Fetch-Dest": "document",
454
+ cookie: `PARAGLIDE_LOCALE=fr`,
455
+ },
456
+ });
457
+ let middlewareResolveWasCalled = false;
458
+ await runtime.paraglideMiddleware(request, () => {
459
+ middlewareResolveWasCalled = true;
460
+ return new Response();
461
+ });
462
+ expect(middlewareResolveWasCalled).toBe(true); // Middleware should be called since no redirect needed
463
+ });
464
+ test("works with disableAsyncLocalStorage option", async () => {
465
+ const runtime = await createParaglide({
466
+ baseLocale: "en",
467
+ locales: ["en", "de", "fr"],
468
+ strategy: ["url", "globalVariable"],
469
+ disableAsyncLocalStorage: true,
470
+ });
471
+ // Set a global locale to verify it doesn't interfere with request processing
472
+ runtime.setLocale("fr");
473
+ // Create a request with a "de" locale in the URL
474
+ const request = new Request(new URL("https://example.com/de/page"), {
475
+ headers: { "Sec-Fetch-Dest": "document" },
476
+ });
477
+ // Process the request with AsyncLocalStorage disabled
478
+ const response = await runtime.paraglideMiddleware(request, (args) => {
479
+ // Verify we still get the correct locale
480
+ expect(args.locale).toBe("de");
481
+ expect(runtime.getLocale()).toBe("de");
482
+ // Verify URL is still properly delocalized
483
+ expect(args.request.url).toBe("https://example.com/page");
484
+ expect(runtime.getUrlOrigin()).toBe("https://example.com");
485
+ return new Response("hello");
486
+ });
487
+ // Verify the result contains the correct data
488
+ expect(await response.text()).toBe("hello");
489
+ // Verify that global variable wasn't affected by this request
490
+ expect(runtime.getLocale()).toBe("fr");
491
+ });
492
+ test("works with sequential parallel requests using disableAsyncLocalStorage", async () => {
493
+ const runtime = await createParaglide({
494
+ baseLocale: "en",
495
+ locales: ["en", "de", "fr"],
496
+ strategy: ["url", "globalVariable"],
497
+ });
498
+ // setting the global variable to fr to assure that
499
+ runtime.setLocale("fr");
500
+ // simulating multiple requests that could interference with each other
501
+ await Promise.all([
502
+ runtime.paraglideMiddleware(new Request(new URL("https://example.com/page"), {
503
+ headers: { "Sec-Fetch-Dest": "document" },
504
+ }), () => {
505
+ expect(runtime.getLocale()).toBe("en");
506
+ expect(runtime.getUrlOrigin()).toBe("https://example.com");
507
+ return new Response();
508
+ }),
509
+ runtime.paraglideMiddleware(new Request(new URL("https://peter.com/de/page"), {
510
+ headers: { "Sec-Fetch-Dest": "document" },
511
+ }), () => {
512
+ expect(runtime.getLocale()).toBe("de");
513
+ expect(runtime.getUrlOrigin()).toBe("https://peter.com");
514
+ return new Response();
515
+ }),
516
+ ]);
517
+ // global variable is not impacted by middleware
518
+ expect(runtime.getLocale()).toBe("fr");
519
+ });
520
+ // https://github.com/opral/inlang-paraglide-js/issues/442
521
+ test("falls back to next strategy when cookie contains invalid locale", async () => {
522
+ const runtime = await createParaglide({
523
+ baseLocale: "en",
524
+ locales: ["en", "fr"],
525
+ strategy: ["cookie", "url", "baseLocale"],
526
+ cookieName: "PARAGLIDE_LOCALE",
527
+ urlPatterns: [
528
+ {
529
+ pattern: "https://example.com/:path(.*)?",
530
+ localized: [
531
+ ["en", "https://example.com/en/:path(.*)?"],
532
+ ["fr", "https://example.com/fr/:path(.*)?"],
533
+ ],
534
+ },
535
+ ],
536
+ });
537
+ // Request with an invalid locale in cookie
538
+ const request = new Request("https://example.com/fr/some-path", {
539
+ headers: {
540
+ "Sec-Fetch-Dest": "document",
541
+ cookie: `PARAGLIDE_LOCALE=invalid_locale`,
542
+ },
543
+ });
544
+ let middlewareResolveWasCalled = false;
545
+ await runtime.paraglideMiddleware(request, (args) => {
546
+ middlewareResolveWasCalled = true;
547
+ // Should fall back to URL strategy, which will detect 'fr' from the URL
548
+ expect(args.locale).toBe("fr");
549
+ return new Response();
550
+ });
551
+ expect(middlewareResolveWasCalled).toBe(true);
552
+ // Try with a request that would fall back to baseLocale
553
+ const baseRequest = new Request("https://example.com/some-path", {
554
+ headers: {
555
+ cookie: `PARAGLIDE_LOCALE=invalid_locale`,
556
+ },
557
+ });
558
+ await runtime.paraglideMiddleware(baseRequest, (args) => {
559
+ // Should fall back all the way to baseLocale since URL has no locale
560
+ expect(args.locale).toBe("en");
561
+ return new Response();
562
+ });
563
+ });
564
+ // can likely be removed once the default url pattern polyfill workaround is removed
565
+ // because URLPattern seems to be handling this correctly
566
+ test("prevents redirect loops by normalizing URLs with trailing slashes in different scenarios", async () => {
567
+ // Create two different runtimes to test different strategy configurations
568
+ const runtime = await createParaglide({
569
+ baseLocale: "en",
570
+ locales: ["en", "fr"],
571
+ strategy: ["cookie", "url"],
572
+ cookieName: "PARAGLIDE_LOCALE",
573
+ urlPatterns: [
574
+ {
575
+ pattern: "https://example.com/:path(.*)?",
576
+ localized: [
577
+ ["en", "https://example.com/en/:path(.*)?"],
578
+ ["fr", "https://example.com/fr/:path(.*)?"],
579
+ ],
580
+ },
581
+ ],
582
+ });
583
+ // SCENARIO 1: Basic trailing slash normalization with cookie strategy
584
+ // Case 1A: Request URL has trailing slash, but localized URL might not
585
+ const requestWithTrailingSlash = new Request("https://example.com/fr/page/", {
586
+ headers: {
587
+ "Sec-Fetch-Dest": "document",
588
+ cookie: `PARAGLIDE_LOCALE=fr`,
589
+ },
590
+ });
591
+ let response = await runtime.paraglideMiddleware(requestWithTrailingSlash, () => {
592
+ return new Response("No redirect needed");
593
+ });
594
+ // Middleware should be called (no redirect) because normalized URLs match
595
+ expect(response.status).toBe(200);
596
+ expect(await response.text()).toBe("No redirect needed");
597
+ // Case 1B: Request URL has no trailing slash, but localized URL might
598
+ const requestWithoutTrailingSlash = new Request("https://example.com/fr/page", {
599
+ headers: {
600
+ "Sec-Fetch-Dest": "document",
601
+ cookie: `PARAGLIDE_LOCALE=fr`,
602
+ },
603
+ });
604
+ response = await runtime.paraglideMiddleware(requestWithoutTrailingSlash, () => {
605
+ return new Response("No redirect needed");
606
+ });
607
+ expect(response.status).toBe(200);
608
+ // Case 1C: redirect wanted because cookie is set to fr but url is en
609
+ const requestDifferentPath = new Request("https://example.com/en/different-page", {
610
+ headers: {
611
+ "Sec-Fetch-Dest": "document",
612
+ cookie: `PARAGLIDE_LOCALE=fr`,
613
+ },
614
+ });
615
+ response = await runtime.paraglideMiddleware(requestDifferentPath, () => {
616
+ // This shouldn't be called since we should redirect
617
+ throw new Error("Should not reach here");
618
+ });
619
+ // Should redirect to fr version
620
+ expect(response.status).toBe(307);
621
+ expect(response.headers.get("Location")).toBe("https://example.com/fr/different-page");
622
+ });
623
+ // not implemented because users should disable redirects by
624
+ // making another strategy preceed the url strategy
625
+ //
626
+ // strategy: ["cookie", "url"]
627
+ test.skip("doesn't redirect if disableUrlRedirect is true", async () => {
628
+ const runtime = await createParaglide({
629
+ baseLocale: "en",
630
+ locales: ["en", "fr"],
631
+ cookieName: "PARAGLIDE_LOCALE",
632
+ strategy: ["cookie", "url"],
633
+ urlPatterns: [
634
+ {
635
+ pattern: "https://example.com/:path(.*)?",
636
+ localized: [
637
+ ["en", "https://example.com/en/:path(.*)?"],
638
+ ["fr", "https://example.com/fr/:path(.*)?"],
639
+ ],
640
+ },
641
+ ],
642
+ });
643
+ // Create a request that would normally be redirected
644
+ const request = new Request("https://example.com/en/some-path", {
645
+ headers: {
646
+ cookie: `PARAGLIDE_LOCALE=fr`,
647
+ "Sec-Fetch-Dest": "document",
648
+ },
649
+ });
650
+ // Test with disableUrlRedirect = true
651
+ let middlewareResolveWasCalled = false;
652
+ await runtime.paraglideMiddleware(request, () => {
653
+ middlewareResolveWasCalled = true;
654
+ return new Response("No redirect");
655
+ }
656
+ // { disableUrlRedirect: true }
657
+ );
658
+ // Middleware should be called since redirect is disabled
659
+ expect(middlewareResolveWasCalled).toBe(true);
660
+ });
661
+ test("only redirects if the request.headers.get('Sec-Fetch-Dest') === 'document'", async () => {
662
+ const runtime = await createParaglide({
663
+ baseLocale: "en",
664
+ locales: ["en", "fr"],
665
+ strategy: ["cookie", "url"],
666
+ cookieName: "PARAGLIDE_LOCALE",
667
+ urlPatterns: [
668
+ {
669
+ pattern: "https://example.com/:path(.*)?",
670
+ localized: [
671
+ ["en", "https://example.com/en/:path(.*)?"],
672
+ ["fr", "https://example.com/fr/:path(.*)?"],
673
+ ],
674
+ },
675
+ ],
676
+ });
677
+ // Test with Sec-Fetch-Dest = document (should redirect)
678
+ const documentRequest = new Request("https://example.com/en/some-path", {
679
+ headers: {
680
+ cookie: `PARAGLIDE_LOCALE=fr`,
681
+ "Sec-Fetch-Dest": "document",
682
+ },
683
+ });
684
+ const documentResponse = await runtime.paraglideMiddleware(documentRequest, () => {
685
+ // This shouldn't be called since we should redirect
686
+ throw new Error("Should not reach here");
687
+ });
688
+ // Should redirect to fr version
689
+ expect(documentResponse instanceof Response).toBe(true);
690
+ expect(documentResponse.status).toBe(307);
691
+ expect(documentResponse.headers.get("Location")).toBe("https://example.com/fr/some-path");
692
+ // Test with Sec-Fetch-Dest = empty (should not redirect)
693
+ const apiRequest = new Request("https://example.com/en/some-path", {
694
+ headers: {
695
+ cookie: `PARAGLIDE_LOCALE=fr`,
696
+ // No Sec-Fetch-Dest header or set to something other than "document"
697
+ "Sec-Fetch-Dest": "empty",
698
+ },
699
+ });
700
+ let apiMiddlewareResolveWasCalled = false;
701
+ await runtime.paraglideMiddleware(apiRequest, () => {
702
+ apiMiddlewareResolveWasCalled = true;
703
+ return new Response("API response");
704
+ });
705
+ // Middleware should be called since no redirect for API requests
706
+ expect(apiMiddlewareResolveWasCalled).toBe(true);
707
+ });
708
+ // https://github.com/opral/inlang-paraglide-js/issues/477
709
+ test("does not catch errors thrown by downstream resolve call", async () => {
710
+ const runtime = await createParaglide({
711
+ baseLocale: "en",
712
+ locales: ["en"],
713
+ strategy: ["url"],
714
+ });
715
+ await expect(() => runtime.paraglideMiddleware(new Request(new URL("https://example.com/page"), {
716
+ headers: { "Sec-Fetch-Dest": "document" },
717
+ }), () => {
718
+ throw new Error("Downstream error");
719
+ })).rejects.toThrow();
720
+ });
721
+ test("middleware supports async custom server strategies", async () => {
722
+ const runtime = await createParaglide({
723
+ baseLocale: "en",
724
+ locales: ["en", "fr", "de"],
725
+ strategy: ["custom-database", "baseLocale"],
726
+ });
727
+ // Mock an async custom strategy that simulates a database call
728
+ let databaseCallCount = 0;
729
+ runtime.defineCustomServerStrategy("custom-database", {
730
+ getLocale: async (request) => {
731
+ databaseCallCount++;
732
+ // Simulate async database call delay
733
+ await new Promise((resolve) => setTimeout(resolve, 10));
734
+ // Extract user ID from a custom header (simulating authentication)
735
+ if (!request)
736
+ return undefined;
737
+ const userId = request.headers.get("X-User-ID");
738
+ if (userId === "user123") {
739
+ return "fr";
740
+ }
741
+ if (userId === "user456") {
742
+ return "de";
743
+ }
744
+ return undefined; // No user preference found
745
+ },
746
+ });
747
+ // Test 1: Request with user preference
748
+ const requestWithUserPref = new Request("https://example.com/page", {
749
+ headers: {
750
+ "X-User-ID": "user123",
751
+ "Sec-Fetch-Dest": "document",
752
+ },
753
+ });
754
+ let middlewareResolveWasCalled = false;
755
+ await runtime.paraglideMiddleware(requestWithUserPref, (args) => {
756
+ middlewareResolveWasCalled = true;
757
+ expect(args.locale).toBe("fr"); // Should get locale from async custom strategy
758
+ return new Response("User preference locale");
759
+ });
760
+ expect(middlewareResolveWasCalled).toBe(true);
761
+ expect(databaseCallCount).toBe(1);
762
+ // Test 2: Request with different user preference
763
+ const requestWithOtherUser = new Request("https://example.com/page", {
764
+ headers: {
765
+ "X-User-ID": "user456",
766
+ "Sec-Fetch-Dest": "document",
767
+ },
768
+ });
769
+ await runtime.paraglideMiddleware(requestWithOtherUser, (args) => {
770
+ expect(args.locale).toBe("de"); // Should get different locale
771
+ return new Response("Other user preference");
772
+ });
773
+ expect(databaseCallCount).toBe(2);
774
+ });
775
+ test("middleware falls back to other strategies when async custom strategy returns undefined", async () => {
776
+ const runtime = await createParaglide({
777
+ baseLocale: "en",
778
+ locales: ["en", "fr", "de"],
779
+ strategy: ["custom-database", "cookie", "baseLocale"],
780
+ cookieName: "PARAGLIDE_LOCALE",
781
+ });
782
+ // Mock async custom strategy that returns undefined for unknown users
783
+ runtime.defineCustomServerStrategy("custom-database", {
784
+ getLocale: async (request) => {
785
+ await new Promise((resolve) => setTimeout(resolve, 5));
786
+ if (!request)
787
+ return undefined;
788
+ const userId = request.headers.get("X-User-ID");
789
+ // Only return locale for known users
790
+ if (userId === "known-user") {
791
+ return "fr";
792
+ }
793
+ return undefined; // Unknown user, fallback to other strategies
794
+ },
795
+ });
796
+ // Request from unknown user with cookie fallback
797
+ const request = new Request("https://example.com/page", {
798
+ headers: {
799
+ "X-User-ID": "unknown-user",
800
+ cookie: "PARAGLIDE_LOCALE=de",
801
+ "Sec-Fetch-Dest": "document",
802
+ },
803
+ });
804
+ let middlewareResolveWasCalled = false;
805
+ await runtime.paraglideMiddleware(request, (args) => {
806
+ middlewareResolveWasCalled = true;
807
+ expect(args.locale).toBe("de"); // Should fallback to cookie strategy
808
+ return new Response("Fallback locale");
809
+ });
810
+ expect(middlewareResolveWasCalled).toBe(true);
811
+ });
812
+ test("middleware handles async custom strategy errors gracefully", async () => {
813
+ const runtime = await createParaglide({
814
+ baseLocale: "en",
815
+ locales: ["en", "fr"],
816
+ strategy: ["custom-database", "baseLocale"],
817
+ });
818
+ // Mock async custom strategy that throws an error
819
+ runtime.defineCustomServerStrategy("custom-database", {
820
+ getLocale: async () => {
821
+ await new Promise((resolve) => setTimeout(resolve, 5));
822
+ throw new Error("Database connection failed");
823
+ },
824
+ });
825
+ const request = new Request("https://example.com/page", {
826
+ headers: { "Sec-Fetch-Dest": "document" },
827
+ });
828
+ // The middleware should handle the error and not crash
829
+ await expect(runtime.paraglideMiddleware(request, (args) => {
830
+ // If we reach here, the error was handled and fallback worked
831
+ expect(args.locale).toBe("en"); // Should fallback to baseLocale
832
+ return new Response("Error handled");
833
+ })).rejects.toThrow("Database connection failed");
834
+ });
835
+ // https://github.com/opral/paraglide-js/issues/573
836
+ test("falls back to original request when cloning fails (e.g., TanStack Start custom Request)", async () => {
837
+ const runtime = await createParaglide({
838
+ baseLocale: "en",
839
+ locales: ["en", "de"],
840
+ // Using a strategy that doesn't include "url" to trigger the clone path
841
+ strategy: ["globalVariable", "baseLocale"],
842
+ });
843
+ // Create a custom request-like object that cannot be cloned
844
+ // This simulates TanStack Start's custom Request implementation
845
+ const customRequest = {
846
+ url: "https://example.com/page",
847
+ headers: new Headers({ "Sec-Fetch-Dest": "document" }),
848
+ method: "GET",
849
+ // Missing other required properties that would cause `new Request(request)` to fail
850
+ };
851
+ let middlewareResolveWasCalled = false;
852
+ const response = await runtime.paraglideMiddleware(customRequest, (args) => {
853
+ middlewareResolveWasCalled = true;
854
+ expect(args.locale).toBe("en");
855
+ // The request should be the original custom request since cloning failed
856
+ expect(args.request).toBe(customRequest);
857
+ return new Response("Success");
858
+ });
859
+ expect(middlewareResolveWasCalled).toBe(true);
860
+ expect(await response.text()).toBe("Success");
861
+ });
862
+ // https://github.com/opral/paraglide-js/issues/652
863
+ test("falls back to original request when cloning a rewritten request fails", async () => {
864
+ const runtime = await createParaglide({
865
+ baseLocale: "en",
866
+ locales: ["en", "de"],
867
+ strategy: ["globalVariable", "baseLocale"],
868
+ });
869
+ const customRequest = {
870
+ url: "http://internal.example.com/page",
871
+ headers: new Headers({ "Sec-Fetch-Dest": "document" }),
872
+ method: "GET",
873
+ };
874
+ const NativeRequest = globalThis.Request;
875
+ Object.defineProperty(globalThis, "Request", {
876
+ value: class extends NativeRequest {
877
+ constructor(input, init) {
878
+ if ((typeof input === "string" && input === "https://example.com/page") ||
879
+ (input instanceof URL && input.href === "https://example.com/page")) {
880
+ throw new TypeError("Simulated rewritten request clone failure");
881
+ }
882
+ super(input, init);
883
+ }
884
+ },
885
+ configurable: true,
886
+ writable: true,
887
+ });
888
+ try {
889
+ let middlewareResolveWasCalled = false;
890
+ const response = await runtime.paraglideMiddleware(customRequest, (args) => {
891
+ middlewareResolveWasCalled = true;
892
+ expect(args.locale).toBe("en");
893
+ expect(runtime.getUrlOrigin()).toBe("https://example.com");
894
+ expect(args.request).toBe(customRequest);
895
+ expect(args.request.url).toBe("http://internal.example.com/page");
896
+ return new Response("Success");
897
+ }, {
898
+ effectiveRequestUrl: "https://example.com/page",
899
+ });
900
+ expect(middlewareResolveWasCalled).toBe(true);
901
+ expect(await response.text()).toBe("Success");
902
+ }
903
+ finally {
904
+ Object.defineProperty(globalThis, "Request", {
905
+ value: NativeRequest,
906
+ configurable: true,
907
+ writable: true,
908
+ });
909
+ }
910
+ });
911
+ test("middleware works with multiple async custom strategies", async () => {
912
+ const runtime = await createParaglide({
913
+ baseLocale: "en",
914
+ locales: ["en", "fr", "de", "es"],
915
+ strategy: ["custom-userPref", "custom-region", "baseLocale"],
916
+ });
917
+ let userPrefCallCount = 0;
918
+ let regionCallCount = 0;
919
+ // First strategy: user preference
920
+ runtime.defineCustomServerStrategy("custom-userPref", {
921
+ getLocale: async (request) => {
922
+ userPrefCallCount++;
923
+ await new Promise((resolve) => setTimeout(resolve, 5));
924
+ if (!request)
925
+ return undefined;
926
+ const userId = request.headers.get("X-User-ID");
927
+ return userId === "premium-user" ? "fr" : undefined;
928
+ },
929
+ });
930
+ // Second strategy: region detection
931
+ runtime.defineCustomServerStrategy("custom-region", {
932
+ getLocale: async (request) => {
933
+ regionCallCount++;
934
+ await new Promise((resolve) => setTimeout(resolve, 5));
935
+ if (!request)
936
+ return undefined;
937
+ const region = request.headers.get("X-Region");
938
+ return region === "europe" ? "de" : undefined;
939
+ },
940
+ });
941
+ // Test 1: First strategy succeeds
942
+ const premiumUserRequest = new Request("https://example.com/page", {
943
+ headers: {
944
+ "X-User-ID": "premium-user",
945
+ "X-Region": "europe",
946
+ "Sec-Fetch-Dest": "document",
947
+ },
948
+ });
949
+ await runtime.paraglideMiddleware(premiumUserRequest, (args) => {
950
+ expect(args.locale).toBe("fr"); // Should use first strategy result
951
+ return new Response("Premium user");
952
+ });
953
+ expect(userPrefCallCount).toBe(1);
954
+ // Second strategy should not be called since first one succeeded
955
+ expect(regionCallCount).toBe(0);
956
+ // Test 2: First strategy fails, second succeeds
957
+ const regionalUserRequest = new Request("https://example.com/page", {
958
+ headers: {
959
+ "X-User-ID": "regular-user",
960
+ "X-Region": "europe",
961
+ "Sec-Fetch-Dest": "document",
962
+ },
963
+ });
964
+ await runtime.paraglideMiddleware(regionalUserRequest, (args) => {
965
+ expect(args.locale).toBe("de"); // Should use second strategy result
966
+ return new Response("Regional user");
967
+ });
968
+ expect(userPrefCallCount).toBe(2);
969
+ expect(regionCallCount).toBe(1);
970
+ });
971
+ test("injected script reuses the Content-Security-Policy nonce when present and omits it otherwise", async () => {
972
+ const runtime = await createParaglide({
973
+ baseLocale: "en",
974
+ locales: ["en", "de"],
975
+ strategy: ["globalVariable", "baseLocale"],
976
+ experimentalMiddlewareLocaleSplitting: true,
977
+ });
978
+ const request = new Request(new URL("https://example.com/page"), {
979
+ headers: { "Sec-Fetch-Dest": "document" },
980
+ });
981
+ // With a CSP nonce -> the injected script reuses it.
982
+ const responseWithCsp = await runtime.paraglideMiddleware(request, () => {
983
+ return new Response("<html><head></head><body></body></html>", {
984
+ headers: {
985
+ "Content-Type": "text/html",
986
+ "Content-Security-Policy": "default-src 'self'; script-src 'nonce-abc123' 'strict-dynamic'",
987
+ },
988
+ });
989
+ });
990
+ expect(await responseWithCsp.text()).toContain('<script nonce="abc123">');
991
+ // Without a CSP header -> the script is still injected, without a nonce.
992
+ const responseWithoutCsp = await runtime.paraglideMiddleware(request, () => {
993
+ return new Response("<html><head></head><body></body></html>", {
994
+ headers: { "Content-Type": "text/html" },
995
+ });
996
+ });
997
+ const html = await responseWithoutCsp.text();
998
+ expect(html).toContain("globalThis.__paraglide.ssr");
999
+ expect(html).not.toContain("nonce=");
1000
+ });
1001
+ //# sourceMappingURL=middleware.test.js.map