@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.
- package/LICENSE +21 -0
- package/README.md +67 -0
- package/bin/run.js +4 -0
- package/dist/bundler-plugins/esbuild.d.ts +1 -0
- package/dist/bundler-plugins/esbuild.d.ts.map +1 -0
- package/dist/bundler-plugins/esbuild.js +4 -0
- package/dist/bundler-plugins/esbuild.js.map +1 -0
- package/dist/bundler-plugins/index.d.ts +6 -0
- package/dist/bundler-plugins/index.d.ts.map +1 -0
- package/dist/bundler-plugins/index.js +7 -0
- package/dist/bundler-plugins/index.js.map +1 -0
- package/dist/bundler-plugins/lazy-modules/scan-message-keys.d.ts +19 -0
- package/dist/bundler-plugins/lazy-modules/scan-message-keys.d.ts.map +1 -0
- package/dist/bundler-plugins/lazy-modules/scan-message-keys.js +85 -0
- package/dist/bundler-plugins/lazy-modules/scan-message-keys.js.map +1 -0
- package/dist/bundler-plugins/lazy-modules/scan-message-keys.test.d.ts +2 -0
- package/dist/bundler-plugins/lazy-modules/scan-message-keys.test.d.ts.map +1 -0
- package/dist/bundler-plugins/lazy-modules/scan-message-keys.test.js +53 -0
- package/dist/bundler-plugins/lazy-modules/scan-message-keys.test.js.map +1 -0
- package/dist/bundler-plugins/lazy-modules/ssr.d.ts +31 -0
- package/dist/bundler-plugins/lazy-modules/ssr.d.ts.map +1 -0
- package/dist/bundler-plugins/lazy-modules/ssr.js +42 -0
- package/dist/bundler-plugins/lazy-modules/ssr.js.map +1 -0
- package/dist/bundler-plugins/lazy-modules/ssr.test.d.ts +2 -0
- package/dist/bundler-plugins/lazy-modules/ssr.test.d.ts.map +1 -0
- package/dist/bundler-plugins/lazy-modules/ssr.test.js +48 -0
- package/dist/bundler-plugins/lazy-modules/ssr.test.js.map +1 -0
- package/dist/bundler-plugins/lazy-modules/virtual-ids.d.ts +7 -0
- package/dist/bundler-plugins/lazy-modules/virtual-ids.d.ts.map +1 -0
- package/dist/bundler-plugins/lazy-modules/virtual-ids.js +30 -0
- package/dist/bundler-plugins/lazy-modules/virtual-ids.js.map +1 -0
- package/dist/bundler-plugins/lazy-modules/virtual.d.ts +86 -0
- package/dist/bundler-plugins/lazy-modules/virtual.d.ts.map +1 -0
- package/dist/bundler-plugins/lazy-modules/virtual.js +2 -0
- package/dist/bundler-plugins/lazy-modules/virtual.js.map +1 -0
- package/dist/bundler-plugins/lazy-modules/vite-plugin.d.ts +18 -0
- package/dist/bundler-plugins/lazy-modules/vite-plugin.d.ts.map +1 -0
- package/dist/bundler-plugins/lazy-modules/vite-plugin.js +328 -0
- package/dist/bundler-plugins/lazy-modules/vite-plugin.js.map +1 -0
- package/dist/bundler-plugins/lazy-modules/vite-plugin.test.d.ts +2 -0
- package/dist/bundler-plugins/lazy-modules/vite-plugin.test.d.ts.map +1 -0
- package/dist/bundler-plugins/lazy-modules/vite-plugin.test.js +45 -0
- package/dist/bundler-plugins/lazy-modules/vite-plugin.test.js.map +1 -0
- package/dist/bundler-plugins/per-locale-build/constants.d.ts +2 -0
- package/dist/bundler-plugins/per-locale-build/constants.d.ts.map +1 -0
- package/dist/bundler-plugins/per-locale-build/constants.js +3 -0
- package/dist/bundler-plugins/per-locale-build/constants.js.map +1 -0
- package/dist/bundler-plugins/per-locale-build/index.d.ts +6 -0
- package/dist/bundler-plugins/per-locale-build/index.d.ts.map +1 -0
- package/dist/bundler-plugins/per-locale-build/index.js +43 -0
- package/dist/bundler-plugins/per-locale-build/index.js.map +1 -0
- package/dist/bundler-plugins/per-locale-build/locale-id.d.ts +8 -0
- package/dist/bundler-plugins/per-locale-build/locale-id.d.ts.map +1 -0
- package/dist/bundler-plugins/per-locale-build/locale-id.js +13 -0
- package/dist/bundler-plugins/per-locale-build/locale-id.js.map +1 -0
- package/dist/bundler-plugins/per-locale-build/types.d.ts +4 -0
- package/dist/bundler-plugins/per-locale-build/types.d.ts.map +1 -0
- package/dist/bundler-plugins/per-locale-build/types.js +2 -0
- package/dist/bundler-plugins/per-locale-build/types.js.map +1 -0
- package/dist/bundler-plugins/per-locale-build/vite-environments.d.ts +51 -0
- package/dist/bundler-plugins/per-locale-build/vite-environments.d.ts.map +1 -0
- package/dist/bundler-plugins/per-locale-build/vite-environments.js +250 -0
- package/dist/bundler-plugins/per-locale-build/vite-environments.js.map +1 -0
- package/dist/bundler-plugins/per-locale-build/vite-environments.test.d.ts +1 -0
- package/dist/bundler-plugins/per-locale-build/vite-environments.test.d.ts.map +1 -0
- package/dist/bundler-plugins/per-locale-build/vite-environments.test.js +250 -0
- package/dist/bundler-plugins/per-locale-build/vite-environments.test.js.map +1 -0
- package/dist/bundler-plugins/plugin-core.d.ts +74 -0
- package/dist/bundler-plugins/plugin-core.d.ts.map +1 -0
- package/dist/bundler-plugins/plugin-core.js +292 -0
- package/dist/bundler-plugins/plugin-core.js.map +1 -0
- package/dist/bundler-plugins/rolldown.d.ts +10 -0
- package/dist/bundler-plugins/rolldown.d.ts.map +1 -0
- package/dist/bundler-plugins/rolldown.js +36 -0
- package/dist/bundler-plugins/rolldown.js.map +1 -0
- package/dist/bundler-plugins/rolldown.test.d.ts +1 -0
- package/dist/bundler-plugins/rolldown.test.d.ts.map +1 -0
- package/dist/bundler-plugins/rolldown.test.js +72 -0
- package/dist/bundler-plugins/rolldown.test.js.map +1 -0
- package/dist/bundler-plugins/rollup.d.ts +1 -0
- package/dist/bundler-plugins/rollup.d.ts.map +1 -0
- package/dist/bundler-plugins/rollup.js +4 -0
- package/dist/bundler-plugins/rollup.js.map +1 -0
- package/dist/bundler-plugins/rspack.d.ts +1 -0
- package/dist/bundler-plugins/rspack.d.ts.map +1 -0
- package/dist/bundler-plugins/rspack.js +4 -0
- package/dist/bundler-plugins/rspack.js.map +1 -0
- package/dist/bundler-plugins/unplugin.d.ts +3 -0
- package/dist/bundler-plugins/unplugin.d.ts.map +1 -0
- package/dist/bundler-plugins/unplugin.js +62 -0
- package/dist/bundler-plugins/unplugin.js.map +1 -0
- package/dist/bundler-plugins/unplugin.test.d.ts +1 -0
- package/dist/bundler-plugins/unplugin.test.d.ts.map +1 -0
- package/dist/bundler-plugins/unplugin.test.js +256 -0
- package/dist/bundler-plugins/unplugin.test.js.map +1 -0
- package/dist/bundler-plugins/virtual-modules.test.d.ts +1 -0
- package/dist/bundler-plugins/virtual-modules.test.d.ts.map +1 -0
- package/dist/bundler-plugins/virtual-modules.test.js +77 -0
- package/dist/bundler-plugins/virtual-modules.test.js.map +1 -0
- package/dist/bundler-plugins/vite.d.ts +17 -0
- package/dist/bundler-plugins/vite.d.ts.map +1 -0
- package/dist/bundler-plugins/vite.js +15 -0
- package/dist/bundler-plugins/vite.js.map +1 -0
- package/dist/bundler-plugins/vite.test.d.ts +1 -0
- package/dist/bundler-plugins/vite.test.d.ts.map +1 -0
- package/dist/bundler-plugins/vite.test.js +61 -0
- package/dist/bundler-plugins/vite.test.js.map +1 -0
- package/dist/bundler-plugins/webpack.d.ts +1 -0
- package/dist/bundler-plugins/webpack.d.ts.map +1 -0
- package/dist/bundler-plugins/webpack.js +4 -0
- package/dist/bundler-plugins/webpack.js.map +1 -0
- package/dist/cli/commands/compile/command.d.ts +2 -0
- package/dist/cli/commands/compile/command.d.ts.map +1 -0
- package/dist/cli/commands/compile/command.js +225 -0
- package/dist/cli/commands/compile/command.js.map +1 -0
- package/dist/cli/commands/compile/command.test.d.ts +1 -0
- package/dist/cli/commands/compile/command.test.d.ts.map +1 -0
- package/dist/cli/commands/compile/command.test.js +69 -0
- package/dist/cli/commands/compile/command.test.js.map +1 -0
- package/dist/cli/commands/init/command.d.ts +2 -0
- package/dist/cli/commands/init/command.d.ts.map +1 -0
- package/dist/cli/commands/init/command.js +90 -0
- package/dist/cli/commands/init/command.js.map +1 -0
- package/dist/cli/defaults.d.ts +11 -0
- package/dist/cli/defaults.d.ts.map +1 -0
- package/dist/cli/defaults.js +13 -0
- package/dist/cli/defaults.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +11 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/steps/add-vite-plugin.d.ts +31 -0
- package/dist/cli/steps/add-vite-plugin.d.ts.map +1 -0
- package/dist/cli/steps/add-vite-plugin.js +65 -0
- package/dist/cli/steps/add-vite-plugin.js.map +1 -0
- package/dist/cli/steps/add-vite-plugin.test.d.ts +1 -0
- package/dist/cli/steps/add-vite-plugin.test.d.ts.map +1 -0
- package/dist/cli/steps/add-vite-plugin.test.js +74 -0
- package/dist/cli/steps/add-vite-plugin.test.js.map +1 -0
- package/dist/cli/steps/check-for-uncomitted-changes.d.ts +5 -0
- package/dist/cli/steps/check-for-uncomitted-changes.d.ts.map +1 -0
- package/dist/cli/steps/check-for-uncomitted-changes.js +37 -0
- package/dist/cli/steps/check-for-uncomitted-changes.js.map +1 -0
- package/dist/cli/steps/detect-bundler.d.ts +10 -0
- package/dist/cli/steps/detect-bundler.d.ts.map +1 -0
- package/dist/cli/steps/detect-bundler.js +22 -0
- package/dist/cli/steps/detect-bundler.js.map +1 -0
- package/dist/cli/steps/detect-bundler.test.d.ts +1 -0
- package/dist/cli/steps/detect-bundler.test.d.ts.map +1 -0
- package/dist/cli/steps/detect-bundler.test.js +29 -0
- package/dist/cli/steps/detect-bundler.test.js.map +1 -0
- package/dist/cli/steps/initialize-messages.d.ts +11 -0
- package/dist/cli/steps/initialize-messages.d.ts.map +1 -0
- package/dist/cli/steps/initialize-messages.js +31 -0
- package/dist/cli/steps/initialize-messages.js.map +1 -0
- package/dist/cli/steps/prompt-for-outdir.d.ts +8 -0
- package/dist/cli/steps/prompt-for-outdir.d.ts.map +1 -0
- package/dist/cli/steps/prompt-for-outdir.js +19 -0
- package/dist/cli/steps/prompt-for-outdir.js.map +1 -0
- package/dist/cli/steps/update-package-json.d.ts +11 -0
- package/dist/cli/steps/update-package-json.d.ts.map +1 -0
- package/dist/cli/steps/update-package-json.js +34 -0
- package/dist/cli/steps/update-package-json.js.map +1 -0
- package/dist/cli/steps/update-ts-config.d.ts +26 -0
- package/dist/cli/steps/update-ts-config.d.ts.map +1 -0
- package/dist/cli/steps/update-ts-config.js +270 -0
- package/dist/cli/steps/update-ts-config.js.map +1 -0
- package/dist/cli/steps/update-ts-config.test.d.ts +1 -0
- package/dist/cli/steps/update-ts-config.test.d.ts.map +1 -0
- package/dist/cli/steps/update-ts-config.test.js +60 -0
- package/dist/cli/steps/update-ts-config.test.js.map +1 -0
- package/dist/cli/utils.d.ts +36 -0
- package/dist/cli/utils.d.ts.map +1 -0
- package/dist/cli/utils.js +20 -0
- package/dist/cli/utils.js.map +1 -0
- package/dist/compiler/assert-url-pattern-available.d.ts +7 -0
- package/dist/compiler/assert-url-pattern-available.d.ts.map +1 -0
- package/dist/compiler/assert-url-pattern-available.js +17 -0
- package/dist/compiler/assert-url-pattern-available.js.map +1 -0
- package/dist/compiler/compile-annotation.d.ts +12 -0
- package/dist/compiler/compile-annotation.d.ts.map +1 -0
- package/dist/compiler/compile-annotation.js +136 -0
- package/dist/compiler/compile-annotation.js.map +1 -0
- package/dist/compiler/compile-bundle.d.ts +28 -0
- package/dist/compiler/compile-bundle.d.ts.map +1 -0
- package/dist/compiler/compile-bundle.js +431 -0
- package/dist/compiler/compile-bundle.js.map +1 -0
- package/dist/compiler/compile-bundle.test.d.ts +1 -0
- package/dist/compiler/compile-bundle.test.d.ts.map +1 -0
- package/dist/compiler/compile-bundle.test.js +399 -0
- package/dist/compiler/compile-bundle.test.js.map +1 -0
- package/dist/compiler/compile-local-variable.d.ts +16 -0
- package/dist/compiler/compile-local-variable.d.ts.map +1 -0
- package/dist/compiler/compile-local-variable.js +28 -0
- package/dist/compiler/compile-local-variable.js.map +1 -0
- package/dist/compiler/compile-local-variable.test.d.ts +1 -0
- package/dist/compiler/compile-local-variable.test.d.ts.map +1 -0
- package/dist/compiler/compile-local-variable.test.js +359 -0
- package/dist/compiler/compile-local-variable.test.js.map +1 -0
- package/dist/compiler/compile-message.d.ts +8 -0
- package/dist/compiler/compile-message.d.ts.map +1 -0
- package/dist/compiler/compile-message.js +174 -0
- package/dist/compiler/compile-message.js.map +1 -0
- package/dist/compiler/compile-message.test.d.ts +1 -0
- package/dist/compiler/compile-message.test.d.ts.map +1 -0
- package/dist/compiler/compile-message.test.js +1060 -0
- package/dist/compiler/compile-message.test.js.map +1 -0
- package/dist/compiler/compile-pattern.d.ts +29 -0
- package/dist/compiler/compile-pattern.d.ts.map +1 -0
- package/dist/compiler/compile-pattern.js +143 -0
- package/dist/compiler/compile-pattern.js.map +1 -0
- package/dist/compiler/compile-pattern.test.d.ts +1 -0
- package/dist/compiler/compile-pattern.test.d.ts.map +1 -0
- package/dist/compiler/compile-pattern.test.js +255 -0
- package/dist/compiler/compile-pattern.test.js.map +1 -0
- package/dist/compiler/compile-project.d.ts +21 -0
- package/dist/compiler/compile-project.d.ts.map +1 -0
- package/dist/compiler/compile-project.js +147 -0
- package/dist/compiler/compile-project.js.map +1 -0
- package/dist/compiler/compile-project.test.d.ts +1 -0
- package/dist/compiler/compile-project.test.d.ts.map +1 -0
- package/dist/compiler/compile-project.test.js +1709 -0
- package/dist/compiler/compile-project.test.js.map +1 -0
- package/dist/compiler/compile.bench.d.ts +1 -0
- package/dist/compiler/compile.bench.d.ts.map +1 -0
- package/dist/compiler/compile.bench.js +89 -0
- package/dist/compiler/compile.bench.js.map +1 -0
- package/dist/compiler/compile.d.ts +24 -0
- package/dist/compiler/compile.d.ts.map +1 -0
- package/dist/compiler/compile.js +106 -0
- package/dist/compiler/compile.js.map +1 -0
- package/dist/compiler/compile.test.d.ts +1 -0
- package/dist/compiler/compile.test.d.ts.map +1 -0
- package/dist/compiler/compile.test.js +66 -0
- package/dist/compiler/compile.test.js.map +1 -0
- package/dist/compiler/compiler-options.d.ts +466 -0
- package/dist/compiler/compiler-options.d.ts.map +1 -0
- package/dist/compiler/compiler-options.js +22 -0
- package/dist/compiler/compiler-options.js.map +1 -0
- package/dist/compiler/create-paraglide.d.ts +21 -0
- package/dist/compiler/create-paraglide.d.ts.map +1 -0
- package/dist/compiler/create-paraglide.js +69 -0
- package/dist/compiler/create-paraglide.js.map +1 -0
- package/dist/compiler/create-paraglide.test.d.ts +1 -0
- package/dist/compiler/create-paraglide.test.d.ts.map +1 -0
- package/dist/compiler/create-paraglide.test.js +55 -0
- package/dist/compiler/create-paraglide.test.js.map +1 -0
- package/dist/compiler/create-readme.d.ts +9 -0
- package/dist/compiler/create-readme.d.ts.map +1 -0
- package/dist/compiler/create-readme.js +127 -0
- package/dist/compiler/create-readme.js.map +1 -0
- package/dist/compiler/emit-files.d.ts +15 -0
- package/dist/compiler/emit-files.d.ts.map +1 -0
- package/dist/compiler/emit-files.js +58 -0
- package/dist/compiler/emit-files.js.map +1 -0
- package/dist/compiler/emit-files.test.d.ts +1 -0
- package/dist/compiler/emit-files.test.d.ts.map +1 -0
- package/dist/compiler/emit-files.test.js +43 -0
- package/dist/compiler/emit-files.test.js.map +1 -0
- package/dist/compiler/emit-ts-declarations.d.ts +11 -0
- package/dist/compiler/emit-ts-declarations.d.ts.map +1 -0
- package/dist/compiler/emit-ts-declarations.interop.test.d.ts +1 -0
- package/dist/compiler/emit-ts-declarations.interop.test.d.ts.map +1 -0
- package/dist/compiler/emit-ts-declarations.interop.test.js +33 -0
- package/dist/compiler/emit-ts-declarations.interop.test.js.map +1 -0
- package/dist/compiler/emit-ts-declarations.js +353 -0
- package/dist/compiler/emit-ts-declarations.js.map +1 -0
- package/dist/compiler/emit-ts-declarations.test.d.ts +1 -0
- package/dist/compiler/emit-ts-declarations.test.d.ts.map +1 -0
- package/dist/compiler/emit-ts-declarations.test.js +161 -0
- package/dist/compiler/emit-ts-declarations.test.js.map +1 -0
- package/dist/compiler/index.d.ts +13 -0
- package/dist/compiler/index.d.ts.map +1 -0
- package/dist/compiler/index.js +11 -0
- package/dist/compiler/index.js.map +1 -0
- package/dist/compiler/jsdoc-types.d.ts +21 -0
- package/dist/compiler/jsdoc-types.d.ts.map +1 -0
- package/dist/compiler/jsdoc-types.js +59 -0
- package/dist/compiler/jsdoc-types.js.map +1 -0
- package/dist/compiler/jsdoc-types.test.d.ts +1 -0
- package/dist/compiler/jsdoc-types.test.d.ts.map +1 -0
- package/dist/compiler/jsdoc-types.test.js +100 -0
- package/dist/compiler/jsdoc-types.test.js.map +1 -0
- package/dist/compiler/lazy-modules/compile-cache.d.ts +37 -0
- package/dist/compiler/lazy-modules/compile-cache.d.ts.map +1 -0
- package/dist/compiler/lazy-modules/compile-cache.js +34 -0
- package/dist/compiler/lazy-modules/compile-cache.js.map +1 -0
- package/dist/compiler/lazy-modules/compile-project.lazy.test.d.ts +2 -0
- package/dist/compiler/lazy-modules/compile-project.lazy.test.d.ts.map +1 -0
- package/dist/compiler/lazy-modules/compile-project.lazy.test.js +65 -0
- package/dist/compiler/lazy-modules/compile-project.lazy.test.js.map +1 -0
- package/dist/compiler/lazy-modules/create-loader.d.ts +18 -0
- package/dist/compiler/lazy-modules/create-loader.d.ts.map +1 -0
- package/dist/compiler/lazy-modules/create-loader.js +182 -0
- package/dist/compiler/lazy-modules/create-loader.js.map +1 -0
- package/dist/compiler/lazy-modules/create-loader.test.d.ts +2 -0
- package/dist/compiler/lazy-modules/create-loader.test.d.ts.map +1 -0
- package/dist/compiler/lazy-modules/create-loader.test.js +82 -0
- package/dist/compiler/lazy-modules/create-loader.test.js.map +1 -0
- package/dist/compiler/lazy-modules/manifest.d.ts +32 -0
- package/dist/compiler/lazy-modules/manifest.d.ts.map +1 -0
- package/dist/compiler/lazy-modules/manifest.js +11 -0
- package/dist/compiler/lazy-modules/manifest.js.map +1 -0
- package/dist/compiler/match-literals.d.ts +2 -0
- package/dist/compiler/match-literals.d.ts.map +1 -0
- package/dist/compiler/match-literals.js +42 -0
- package/dist/compiler/match-literals.js.map +1 -0
- package/dist/compiler/output-structure/lazy-modules.d.ts +27 -0
- package/dist/compiler/output-structure/lazy-modules.d.ts.map +1 -0
- package/dist/compiler/output-structure/lazy-modules.js +157 -0
- package/dist/compiler/output-structure/lazy-modules.js.map +1 -0
- package/dist/compiler/output-structure/lazy-modules.test.d.ts +2 -0
- package/dist/compiler/output-structure/lazy-modules.test.d.ts.map +1 -0
- package/dist/compiler/output-structure/lazy-modules.test.js +128 -0
- package/dist/compiler/output-structure/lazy-modules.test.js.map +1 -0
- package/dist/compiler/output-structure/locale-modules.d.ts +4 -0
- package/dist/compiler/output-structure/locale-modules.d.ts.map +1 -0
- package/dist/compiler/output-structure/locale-modules.js +81 -0
- package/dist/compiler/output-structure/locale-modules.js.map +1 -0
- package/dist/compiler/output-structure/locale-modules.test.d.ts +1 -0
- package/dist/compiler/output-structure/locale-modules.test.d.ts.map +1 -0
- package/dist/compiler/output-structure/locale-modules.test.js +163 -0
- package/dist/compiler/output-structure/locale-modules.test.js.map +1 -0
- package/dist/compiler/output-structure/message-modules.d.ts +4 -0
- package/dist/compiler/output-structure/message-modules.d.ts.map +1 -0
- package/dist/compiler/output-structure/message-modules.js +100 -0
- package/dist/compiler/output-structure/message-modules.js.map +1 -0
- package/dist/compiler/output-structure/message-modules.test.d.ts +1 -0
- package/dist/compiler/output-structure/message-modules.test.d.ts.map +1 -0
- package/dist/compiler/output-structure/message-modules.test.js +148 -0
- package/dist/compiler/output-structure/message-modules.test.js.map +1 -0
- package/dist/compiler/per-locale-build.d.ts +2 -0
- package/dist/compiler/per-locale-build.d.ts.map +1 -0
- package/dist/compiler/per-locale-build.js +3 -0
- package/dist/compiler/per-locale-build.js.map +1 -0
- package/dist/compiler/registry.d.ts +13 -0
- package/dist/compiler/registry.d.ts.map +1 -0
- package/dist/compiler/registry.js +60 -0
- package/dist/compiler/registry.js.map +1 -0
- package/dist/compiler/resolve-tsc-js-path.d.ts +9 -0
- package/dist/compiler/resolve-tsc-js-path.d.ts.map +1 -0
- package/dist/compiler/resolve-tsc-js-path.js +23 -0
- package/dist/compiler/resolve-tsc-js-path.js.map +1 -0
- package/dist/compiler/runtime/check-locale.d.ts +31 -0
- package/dist/compiler/runtime/check-locale.d.ts.map +1 -0
- package/dist/compiler/runtime/check-locale.js +51 -0
- package/dist/compiler/runtime/check-locale.js.map +1 -0
- package/dist/compiler/runtime/check-locale.test.d.ts +1 -0
- package/dist/compiler/runtime/check-locale.test.d.ts.map +1 -0
- package/dist/compiler/runtime/check-locale.test.js +84 -0
- package/dist/compiler/runtime/check-locale.test.js.map +1 -0
- package/dist/compiler/runtime/create-runtime.d.ts +35 -0
- package/dist/compiler/runtime/create-runtime.d.ts.map +1 -0
- package/dist/compiler/runtime/create-runtime.js +196 -0
- package/dist/compiler/runtime/create-runtime.js.map +1 -0
- package/dist/compiler/runtime/extract-locale-from-cookie.d.ts +13 -0
- package/dist/compiler/runtime/extract-locale-from-cookie.d.ts.map +1 -0
- package/dist/compiler/runtime/extract-locale-from-cookie.js +43 -0
- package/dist/compiler/runtime/extract-locale-from-cookie.js.map +1 -0
- package/dist/compiler/runtime/extract-locale-from-cookie.test.d.ts +1 -0
- package/dist/compiler/runtime/extract-locale-from-cookie.test.d.ts.map +1 -0
- package/dist/compiler/runtime/extract-locale-from-cookie.test.js +149 -0
- package/dist/compiler/runtime/extract-locale-from-cookie.test.js.map +1 -0
- package/dist/compiler/runtime/extract-locale-from-header.d.ts +13 -0
- package/dist/compiler/runtime/extract-locale-from-header.d.ts.map +1 -0
- package/dist/compiler/runtime/extract-locale-from-header.js +45 -0
- package/dist/compiler/runtime/extract-locale-from-header.js.map +1 -0
- package/dist/compiler/runtime/extract-locale-from-header.test.d.ts +1 -0
- package/dist/compiler/runtime/extract-locale-from-header.test.d.ts.map +1 -0
- package/dist/compiler/runtime/extract-locale-from-header.test.js +55 -0
- package/dist/compiler/runtime/extract-locale-from-header.test.js.map +1 -0
- package/dist/compiler/runtime/extract-locale-from-navigator.d.ts +12 -0
- package/dist/compiler/runtime/extract-locale-from-navigator.d.ts.map +1 -0
- package/dist/compiler/runtime/extract-locale-from-navigator.js +33 -0
- package/dist/compiler/runtime/extract-locale-from-navigator.js.map +1 -0
- package/dist/compiler/runtime/extract-locale-from-navigator.test.d.ts +1 -0
- package/dist/compiler/runtime/extract-locale-from-navigator.test.d.ts.map +1 -0
- package/dist/compiler/runtime/extract-locale-from-navigator.test.js +45 -0
- package/dist/compiler/runtime/extract-locale-from-navigator.test.js.map +1 -0
- package/dist/compiler/runtime/extract-locale-from-request-async.d.ts +34 -0
- package/dist/compiler/runtime/extract-locale-from-request-async.d.ts.map +1 -0
- package/dist/compiler/runtime/extract-locale-from-request-async.js +70 -0
- package/dist/compiler/runtime/extract-locale-from-request-async.js.map +1 -0
- package/dist/compiler/runtime/extract-locale-from-request-async.test.d.ts +1 -0
- package/dist/compiler/runtime/extract-locale-from-request-async.test.d.ts.map +1 -0
- package/dist/compiler/runtime/extract-locale-from-request-async.test.js +119 -0
- package/dist/compiler/runtime/extract-locale-from-request-async.test.js.map +1 -0
- package/dist/compiler/runtime/extract-locale-from-request.d.ts +41 -0
- package/dist/compiler/runtime/extract-locale-from-request.d.ts.map +1 -0
- package/dist/compiler/runtime/extract-locale-from-request.js +96 -0
- package/dist/compiler/runtime/extract-locale-from-request.js.map +1 -0
- package/dist/compiler/runtime/extract-locale-from-request.test.d.ts +1 -0
- package/dist/compiler/runtime/extract-locale-from-request.test.d.ts.map +1 -0
- package/dist/compiler/runtime/extract-locale-from-request.test.js +351 -0
- package/dist/compiler/runtime/extract-locale-from-request.test.js.map +1 -0
- package/dist/compiler/runtime/extract-locale-from-url.d.ts +11 -0
- package/dist/compiler/runtime/extract-locale-from-url.d.ts.map +1 -0
- package/dist/compiler/runtime/extract-locale-from-url.js +68 -0
- package/dist/compiler/runtime/extract-locale-from-url.js.map +1 -0
- package/dist/compiler/runtime/extract-locale-from-url.test.d.ts +1 -0
- package/dist/compiler/runtime/extract-locale-from-url.test.d.ts.map +1 -0
- package/dist/compiler/runtime/extract-locale-from-url.test.js +127 -0
- package/dist/compiler/runtime/extract-locale-from-url.test.js.map +1 -0
- package/dist/compiler/runtime/generate-static-localized-urls.d.ts +44 -0
- package/dist/compiler/runtime/generate-static-localized-urls.d.ts.map +1 -0
- package/dist/compiler/runtime/generate-static-localized-urls.js +133 -0
- package/dist/compiler/runtime/generate-static-localized-urls.js.map +1 -0
- package/dist/compiler/runtime/generate-static-localized-urls.test.d.ts +1 -0
- package/dist/compiler/runtime/generate-static-localized-urls.test.d.ts.map +1 -0
- package/dist/compiler/runtime/generate-static-localized-urls.test.js +159 -0
- package/dist/compiler/runtime/generate-static-localized-urls.test.js.map +1 -0
- package/dist/compiler/runtime/get-locale.d.ts +42 -0
- package/dist/compiler/runtime/get-locale.d.ts.map +1 -0
- package/dist/compiler/runtime/get-locale.js +158 -0
- package/dist/compiler/runtime/get-locale.js.map +1 -0
- package/dist/compiler/runtime/get-locale.test.d.ts +1 -0
- package/dist/compiler/runtime/get-locale.test.d.ts.map +1 -0
- package/dist/compiler/runtime/get-locale.test.js +295 -0
- package/dist/compiler/runtime/get-locale.test.js.map +1 -0
- package/dist/compiler/runtime/get-text-direction.d.ts +15 -0
- package/dist/compiler/runtime/get-text-direction.d.ts.map +1 -0
- package/dist/compiler/runtime/get-text-direction.js +46 -0
- package/dist/compiler/runtime/get-text-direction.js.map +1 -0
- package/dist/compiler/runtime/get-text-direction.test.d.ts +1 -0
- package/dist/compiler/runtime/get-text-direction.test.d.ts.map +1 -0
- package/dist/compiler/runtime/get-text-direction.test.js +40 -0
- package/dist/compiler/runtime/get-text-direction.test.js.map +1 -0
- package/dist/compiler/runtime/get-url-origin.d.ts +19 -0
- package/dist/compiler/runtime/get-url-origin.d.ts.map +1 -0
- package/dist/compiler/runtime/get-url-origin.js +31 -0
- package/dist/compiler/runtime/get-url-origin.js.map +1 -0
- package/dist/compiler/runtime/get-url-origin.test.d.ts +1 -0
- package/dist/compiler/runtime/get-url-origin.test.d.ts.map +1 -0
- package/dist/compiler/runtime/get-url-origin.test.js +18 -0
- package/dist/compiler/runtime/get-url-origin.test.js.map +1 -0
- package/dist/compiler/runtime/host-routing.d.ts +28 -0
- package/dist/compiler/runtime/host-routing.d.ts.map +1 -0
- package/dist/compiler/runtime/host-routing.js +79 -0
- package/dist/compiler/runtime/host-routing.js.map +1 -0
- package/dist/compiler/runtime/host-routing.test.d.ts +1 -0
- package/dist/compiler/runtime/host-routing.test.d.ts.map +1 -0
- package/dist/compiler/runtime/host-routing.test.js +128 -0
- package/dist/compiler/runtime/host-routing.test.js.map +1 -0
- package/dist/compiler/runtime/localize-href.d.ts +84 -0
- package/dist/compiler/runtime/localize-href.d.ts.map +1 -0
- package/dist/compiler/runtime/localize-href.js +115 -0
- package/dist/compiler/runtime/localize-href.js.map +1 -0
- package/dist/compiler/runtime/localize-href.test.d.ts +1 -0
- package/dist/compiler/runtime/localize-href.test.d.ts.map +1 -0
- package/dist/compiler/runtime/localize-href.test.js +139 -0
- package/dist/compiler/runtime/localize-href.test.js.map +1 -0
- package/dist/compiler/runtime/localize-url.d.ts +95 -0
- package/dist/compiler/runtime/localize-url.d.ts.map +1 -0
- package/dist/compiler/runtime/localize-url.js +327 -0
- package/dist/compiler/runtime/localize-url.js.map +1 -0
- package/dist/compiler/runtime/localize-url.test.d.ts +1 -0
- package/dist/compiler/runtime/localize-url.test.d.ts.map +1 -0
- package/dist/compiler/runtime/localize-url.test.js +533 -0
- package/dist/compiler/runtime/localize-url.test.js.map +1 -0
- package/dist/compiler/runtime/route-strategy.d.ts +32 -0
- package/dist/compiler/runtime/route-strategy.d.ts.map +1 -0
- package/dist/compiler/runtime/route-strategy.js +72 -0
- package/dist/compiler/runtime/route-strategy.js.map +1 -0
- package/dist/compiler/runtime/set-locale.d.ts +46 -0
- package/dist/compiler/runtime/set-locale.d.ts.map +1 -0
- package/dist/compiler/runtime/set-locale.js +172 -0
- package/dist/compiler/runtime/set-locale.js.map +1 -0
- package/dist/compiler/runtime/set-locale.test.d.ts +1 -0
- package/dist/compiler/runtime/set-locale.test.d.ts.map +1 -0
- package/dist/compiler/runtime/set-locale.test.js +555 -0
- package/dist/compiler/runtime/set-locale.test.js.map +1 -0
- package/dist/compiler/runtime/should-redirect.d.ts +100 -0
- package/dist/compiler/runtime/should-redirect.d.ts.map +1 -0
- package/dist/compiler/runtime/should-redirect.js +155 -0
- package/dist/compiler/runtime/should-redirect.js.map +1 -0
- package/dist/compiler/runtime/should-redirect.test.d.ts +1 -0
- package/dist/compiler/runtime/should-redirect.test.d.ts.map +1 -0
- package/dist/compiler/runtime/should-redirect.test.js +270 -0
- package/dist/compiler/runtime/should-redirect.test.js.map +1 -0
- package/dist/compiler/runtime/strategy.d.ts +63 -0
- package/dist/compiler/runtime/strategy.d.ts.map +1 -0
- package/dist/compiler/runtime/strategy.js +65 -0
- package/dist/compiler/runtime/strategy.js.map +1 -0
- package/dist/compiler/runtime/strategy.test.d.ts +1 -0
- package/dist/compiler/runtime/strategy.test.d.ts.map +1 -0
- package/dist/compiler/runtime/strategy.test.js +90 -0
- package/dist/compiler/runtime/strategy.test.js.map +1 -0
- package/dist/compiler/runtime/track-message-call.d.ts +5 -0
- package/dist/compiler/runtime/track-message-call.d.ts.map +1 -0
- package/dist/compiler/runtime/track-message-call.js +14 -0
- package/dist/compiler/runtime/track-message-call.js.map +1 -0
- package/dist/compiler/runtime/track-message-call.test.d.ts +1 -0
- package/dist/compiler/runtime/track-message-call.test.d.ts.map +1 -0
- package/dist/compiler/runtime/track-message-call.test.js +22 -0
- package/dist/compiler/runtime/track-message-call.test.js.map +1 -0
- package/dist/compiler/runtime/type-definitions.d.ts +197 -0
- package/dist/compiler/runtime/type-definitions.d.ts.map +1 -0
- package/dist/compiler/runtime/type-definitions.js +150 -0
- package/dist/compiler/runtime/type-definitions.js.map +1 -0
- package/dist/compiler/runtime/type.d.ts +47 -0
- package/dist/compiler/runtime/type.d.ts.map +1 -0
- package/dist/compiler/runtime/type.js +2 -0
- package/dist/compiler/runtime/type.js.map +1 -0
- package/dist/compiler/runtime/type.test.d.ts +1 -0
- package/dist/compiler/runtime/type.test.d.ts.map +1 -0
- package/dist/compiler/runtime/type.test.js +153 -0
- package/dist/compiler/runtime/type.test.js.map +1 -0
- package/dist/compiler/runtime/url-pattern.d.ts +12 -0
- package/dist/compiler/runtime/url-pattern.d.ts.map +1 -0
- package/dist/compiler/runtime/url-pattern.js +35 -0
- package/dist/compiler/runtime/url-pattern.js.map +1 -0
- package/dist/compiler/runtime/variables.d.ts +128 -0
- package/dist/compiler/runtime/variables.d.ts.map +1 -0
- package/dist/compiler/runtime/variables.js +111 -0
- package/dist/compiler/runtime/variables.js.map +1 -0
- package/dist/compiler/safe-module-id.d.ts +7 -0
- package/dist/compiler/safe-module-id.d.ts.map +1 -0
- package/dist/compiler/safe-module-id.js +78 -0
- package/dist/compiler/safe-module-id.js.map +1 -0
- package/dist/compiler/safe-module-id.test.d.ts +1 -0
- package/dist/compiler/safe-module-id.test.d.ts.map +1 -0
- package/dist/compiler/safe-module-id.test.js +36 -0
- package/dist/compiler/safe-module-id.test.js.map +1 -0
- package/dist/compiler/seed-previous-compilation.d.ts +7 -0
- package/dist/compiler/seed-previous-compilation.d.ts.map +1 -0
- package/dist/compiler/seed-previous-compilation.js +9 -0
- package/dist/compiler/seed-previous-compilation.js.map +1 -0
- package/dist/compiler/server/create-server-file.d.ts +12 -0
- package/dist/compiler/server/create-server-file.d.ts.map +1 -0
- package/dist/compiler/server/create-server-file.js +91 -0
- package/dist/compiler/server/create-server-file.js.map +1 -0
- package/dist/compiler/server/create-server-file.test.d.ts +1 -0
- package/dist/compiler/server/create-server-file.test.d.ts.map +1 -0
- package/dist/compiler/server/create-server-file.test.js +48 -0
- package/dist/compiler/server/create-server-file.test.js.map +1 -0
- package/dist/compiler/server/middleware.d.ts +98 -0
- package/dist/compiler/server/middleware.d.ts.map +1 -0
- package/dist/compiler/server/middleware.js +278 -0
- package/dist/compiler/server/middleware.js.map +1 -0
- package/dist/compiler/server/middleware.test.d.ts +1 -0
- package/dist/compiler/server/middleware.test.d.ts.map +1 -0
- package/dist/compiler/server/middleware.test.js +1001 -0
- package/dist/compiler/server/middleware.test.js.map +1 -0
- package/dist/compiler/server/type.d.ts +6 -0
- package/dist/compiler/server/type.d.ts.map +1 -0
- package/dist/compiler/server/type.js +2 -0
- package/dist/compiler/server/type.js.map +1 -0
- package/dist/compiler/test-helpers.d.ts +30 -0
- package/dist/compiler/test-helpers.d.ts.map +1 -0
- package/dist/compiler/test-helpers.js +50 -0
- package/dist/compiler/test-helpers.js.map +1 -0
- package/dist/compiler/types.d.ts +7 -0
- package/dist/compiler/types.d.ts.map +1 -0
- package/dist/compiler/types.js +2 -0
- package/dist/compiler/types.js.map +1 -0
- package/dist/compiler/variable-access.d.ts +3 -0
- package/dist/compiler/variable-access.d.ts.map +1 -0
- package/dist/compiler/variable-access.js +15 -0
- package/dist/compiler/variable-access.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/messages/ast.d.ts +102 -0
- package/dist/messages/ast.d.ts.map +1 -0
- package/dist/messages/ast.js +8 -0
- package/dist/messages/ast.js.map +1 -0
- package/dist/messages/create-bundle-nested.d.ts +16 -0
- package/dist/messages/create-bundle-nested.d.ts.map +1 -0
- package/dist/messages/create-bundle-nested.js +22 -0
- package/dist/messages/create-bundle-nested.js.map +1 -0
- package/dist/messages/index.d.ts +5 -0
- package/dist/messages/index.d.ts.map +1 -0
- package/dist/messages/index.js +5 -0
- package/dist/messages/index.js.map +1 -0
- package/dist/messages/load-messages.d.ts +19 -0
- package/dist/messages/load-messages.d.ts.map +1 -0
- package/dist/messages/load-messages.js +49 -0
- package/dist/messages/load-messages.js.map +1 -0
- package/dist/messages/message-format/flatten.d.ts +9 -0
- package/dist/messages/message-format/flatten.d.ts.map +1 -0
- package/dist/messages/message-format/flatten.js +32 -0
- package/dist/messages/message-format/flatten.js.map +1 -0
- package/dist/messages/message-format/import-files.d.ts +32 -0
- package/dist/messages/message-format/import-files.d.ts.map +1 -0
- package/dist/messages/message-format/import-files.js +53 -0
- package/dist/messages/message-format/import-files.js.map +1 -0
- package/dist/messages/message-format/import-files.test.d.ts +1 -0
- package/dist/messages/message-format/import-files.test.d.ts.map +1 -0
- package/dist/messages/message-format/import-files.test.js +145 -0
- package/dist/messages/message-format/import-files.test.js.map +1 -0
- package/dist/messages/message-format/index.d.ts +6 -0
- package/dist/messages/message-format/index.d.ts.map +1 -0
- package/dist/messages/message-format/index.js +7 -0
- package/dist/messages/message-format/index.js.map +1 -0
- package/dist/messages/message-format/parse-bundle.d.ts +31 -0
- package/dist/messages/message-format/parse-bundle.d.ts.map +1 -0
- package/dist/messages/message-format/parse-bundle.js +169 -0
- package/dist/messages/message-format/parse-bundle.js.map +1 -0
- package/dist/messages/message-format/parse-declaration.d.ts +2 -0
- package/dist/messages/message-format/parse-declaration.d.ts.map +1 -0
- package/dist/messages/message-format/parse-declaration.js +56 -0
- package/dist/messages/message-format/parse-declaration.js.map +1 -0
- package/dist/messages/message-format/parse-markup.d.ts +4 -0
- package/dist/messages/message-format/parse-markup.d.ts.map +1 -0
- package/dist/messages/message-format/parse-markup.js +167 -0
- package/dist/messages/message-format/parse-markup.js.map +1 -0
- package/dist/messages/message-format/parse-matches.d.ts +5 -0
- package/dist/messages/message-format/parse-matches.d.ts.map +1 -0
- package/dist/messages/message-format/parse-matches.js +31 -0
- package/dist/messages/message-format/parse-matches.js.map +1 -0
- package/dist/messages/message-format/parse-pattern.d.ts +5 -0
- package/dist/messages/message-format/parse-pattern.d.ts.map +1 -0
- package/dist/messages/message-format/parse-pattern.js +120 -0
- package/dist/messages/message-format/parse-pattern.js.map +1 -0
- package/dist/messages/message-format/unique.d.ts +2 -0
- package/dist/messages/message-format/unique.d.ts.map +1 -0
- package/dist/messages/message-format/unique.js +5 -0
- package/dist/messages/message-format/unique.js.map +1 -0
- package/dist/messages/nest-bundles.d.ts +19 -0
- package/dist/messages/nest-bundles.d.ts.map +1 -0
- package/dist/messages/nest-bundles.js +49 -0
- package/dist/messages/nest-bundles.js.map +1 -0
- package/dist/services/account/index.d.ts +14 -0
- package/dist/services/account/index.d.ts.map +1 -0
- package/dist/services/account/index.js +43 -0
- package/dist/services/account/index.js.map +1 -0
- package/dist/services/account/types.d.ts +4 -0
- package/dist/services/account/types.d.ts.map +1 -0
- package/dist/services/account/types.js +2 -0
- package/dist/services/account/types.js.map +1 -0
- package/dist/services/codegen/escape.d.ts +9 -0
- package/dist/services/codegen/escape.d.ts.map +1 -0
- package/dist/services/codegen/escape.js +19 -0
- package/dist/services/codegen/escape.js.map +1 -0
- package/dist/services/codegen/quotes.d.ts +4 -0
- package/dist/services/codegen/quotes.d.ts.map +1 -0
- package/dist/services/codegen/quotes.js +5 -0
- package/dist/services/codegen/quotes.js.map +1 -0
- package/dist/services/env-variables/create-index-file.d.ts +9 -0
- package/dist/services/env-variables/create-index-file.d.ts.map +1 -0
- package/dist/services/env-variables/create-index-file.js +28 -0
- package/dist/services/env-variables/create-index-file.js.map +1 -0
- package/dist/services/env-variables/index.d.ts +3 -0
- package/dist/services/env-variables/index.d.ts.map +1 -0
- package/dist/services/env-variables/index.js +4 -0
- package/dist/services/env-variables/index.js.map +1 -0
- package/dist/services/environment/package.d.ts +9 -0
- package/dist/services/environment/package.d.ts.map +1 -0
- package/dist/services/environment/package.js +31 -0
- package/dist/services/environment/package.js.map +1 -0
- package/dist/services/environment/package.test.d.ts +1 -0
- package/dist/services/environment/package.test.d.ts.map +1 -0
- package/dist/services/environment/package.test.js +21 -0
- package/dist/services/environment/package.test.js.map +1 -0
- package/dist/services/error-handling.d.ts +12 -0
- package/dist/services/error-handling.d.ts.map +1 -0
- package/dist/services/error-handling.js +27 -0
- package/dist/services/error-handling.js.map +1 -0
- package/dist/services/error-handling.test.d.ts +1 -0
- package/dist/services/error-handling.test.d.ts.map +1 -0
- package/dist/services/error-handling.test.js +10 -0
- package/dist/services/error-handling.test.js.map +1 -0
- package/dist/services/file-handling/content-hash.d.ts +9 -0
- package/dist/services/file-handling/content-hash.js +19 -0
- package/dist/services/file-handling/content-hash.js.map +1 -0
- package/dist/services/file-handling/exists.d.ts +7 -0
- package/dist/services/file-handling/exists.d.ts.map +1 -0
- package/dist/services/file-handling/exists.js +24 -0
- package/dist/services/file-handling/exists.js.map +1 -0
- package/dist/services/file-handling/exists.test.d.ts +1 -0
- package/dist/services/file-handling/exists.test.d.ts.map +1 -0
- package/dist/services/file-handling/exists.test.js +27 -0
- package/dist/services/file-handling/exists.test.js.map +1 -0
- package/dist/services/file-handling/types.d.ts +4 -0
- package/dist/services/file-handling/types.d.ts.map +1 -0
- package/dist/services/file-handling/types.js +2 -0
- package/dist/services/file-handling/types.js.map +1 -0
- package/dist/services/file-handling/write-output.d.ts +21 -0
- package/dist/services/file-handling/write-output.d.ts.map +1 -0
- package/dist/services/file-handling/write-output.js +157 -0
- package/dist/services/file-handling/write-output.js.map +1 -0
- package/dist/services/file-handling/write-output.test.d.ts +1 -0
- package/dist/services/file-handling/write-output.test.d.ts.map +1 -0
- package/dist/services/file-handling/write-output.test.js +217 -0
- package/dist/services/file-handling/write-output.test.js.map +1 -0
- package/dist/services/file-watching/tracked-fs.d.ts +25 -0
- package/dist/services/file-watching/tracked-fs.d.ts.map +1 -0
- package/dist/services/file-watching/tracked-fs.js +94 -0
- package/dist/services/file-watching/tracked-fs.js.map +1 -0
- package/dist/services/file-watching/tracked-fs.test.d.ts +1 -0
- package/dist/services/file-watching/tracked-fs.test.d.ts.map +1 -0
- package/dist/services/file-watching/tracked-fs.test.js +87 -0
- package/dist/services/file-watching/tracked-fs.test.js.map +1 -0
- package/dist/services/logger/index.d.ts +17 -0
- package/dist/services/logger/index.d.ts.map +1 -0
- package/dist/services/logger/index.js +58 -0
- package/dist/services/logger/index.js.map +1 -0
- package/dist/services/lookup.d.ts +14 -0
- package/dist/services/lookup.d.ts.map +1 -0
- package/dist/services/lookup.js +24 -0
- package/dist/services/lookup.js.map +1 -0
- package/dist/urlpattern-polyfill/index.d.ts +2 -0
- package/dist/urlpattern-polyfill/index.d.ts.map +1 -0
- package/dist/urlpattern-polyfill/index.js +2 -0
- package/dist/urlpattern-polyfill/index.js.map +1 -0
- package/dist/utilities/detect-json-formatting.d.ts +10 -0
- package/dist/utilities/detect-json-formatting.d.ts.map +1 -0
- package/dist/utilities/detect-json-formatting.js +80 -0
- package/dist/utilities/detect-json-formatting.js.map +1 -0
- package/dist/utilities/node-normalize-path.d.ts +1 -0
- package/dist/utilities/node-normalize-path.d.ts.map +1 -0
- package/dist/utilities/node-normalize-path.js +10 -0
- package/dist/utilities/node-normalize-path.js.map +1 -0
- 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
|