@inlang/paraglide-js 2.28.0 → 2.29.1
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/dist/bundler-plugins/unplugin.d.ts +4 -1
- package/dist/bundler-plugins/unplugin.js +55 -12
- package/dist/bundler-plugins/unplugin.js.map +1 -1
- package/dist/bundler-plugins/unplugin.test.js +156 -0
- package/dist/bundler-plugins/unplugin.test.js.map +1 -1
- package/dist/bundler-plugins/vite-error-response.test.d.ts +1 -0
- package/dist/bundler-plugins/vite-error-response.test.js +171 -0
- package/dist/bundler-plugins/vite-error-response.test.js.map +1 -0
- package/dist/bundler-plugins/vite.d.ts +8 -0
- package/dist/bundler-plugins/vite.js +14 -5
- package/dist/bundler-plugins/vite.js.map +1 -1
- package/dist/compiler/compile-bundle.js +58 -12
- package/dist/compiler/compile-bundle.js.map +1 -1
- package/dist/compiler/compile-bundle.test.js +208 -26
- package/dist/compiler/compile-bundle.test.js.map +1 -1
- package/dist/compiler/compile-lifecycle.test.js +83 -0
- package/dist/compiler/compile-lifecycle.test.js.map +1 -1
- package/dist/compiler/compile-message.d.ts +9 -0
- package/dist/compiler/compile-message.js +29 -12
- package/dist/compiler/compile-message.js.map +1 -1
- package/dist/compiler/compile-project.test.js +157 -0
- package/dist/compiler/compile-project.test.js.map +1 -1
- package/dist/compiler/compile.js +12 -0
- package/dist/compiler/compile.js.map +1 -1
- package/dist/compiler/runtime/localize-url.d.ts +8 -4
- package/dist/compiler/runtime/localize-url.js +12 -8
- package/dist/compiler/runtime/localize-url.js.map +1 -1
- package/dist/compiler/runtime/localize-url.test.js +45 -0
- package/dist/compiler/runtime/localize-url.test.js.map +1 -1
- package/dist/compiler/runtime/type.test.js +41 -0
- package/dist/compiler/runtime/type.test.js.map +1 -1
- package/dist/services/env-variables/index.js +1 -1
- package/dist/services/env-variables/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"localize-url.test.js","sourceRoot":"","sources":["../../../src/compiler/runtime/localize-url.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { test, expect } from \"vitest\";\nimport { createParaglide } from \"../create-paraglide.js\";\nimport { newProject } from \"@inlang/sdk\";\n\ntest(\"pathname based localization\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t// literal match\n\t\t\t{\n\t\t\t\tpattern: \"/blog/about\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"en\", \"/blog/about\"],\n\t\t\t\t\t[\"de\", \"/de/artikel/ueber-uns\"],\n\t\t\t\t],\n\t\t\t},\n\t\t\t// parameter\n\t\t\t{\n\t\t\t\tpattern: \"/blog/:id\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"en\", \"/blog/:id\"],\n\t\t\t\t\t[\"de\", \"/de/artikel/:id\"],\n\t\t\t\t],\n\t\t\t},\n\t\t\t// wildcard\n\t\t\t{\n\t\t\t\tpattern: \"/:path(.*)\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \"/de/:path(.*)\"],\n\t\t\t\t\t[\"en\", \"/:path(.*)\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\t// wildcard - en to de\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/home\", { locale: \"de\" }).href\n\t).toBe(\"https://example.com/de/home\");\n\n\t// wildcard - de to en\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/de/home\", { locale: \"en\" }).href\n\t).toBe(\"https://example.com/home\");\n\n\t// wildcard - en to en\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about\", { locale: \"en\" }).href\n\t).toBe(\"https://example.com/about\");\n\n\t// wildcard - delocalizing de\n\texpect(runtime.deLocalizeUrl(\"https://example.com/de/about\").href).toBe(\n\t\t\"https://example.com/about\"\n\t);\n\n\t// literal match\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/blog/about\", { locale: \"de\" }).href\n\t).toBe(\"https://example.com/de/artikel/ueber-uns\");\n\n\texpect(\n\t\truntime.deLocalizeUrl(\"https://example.com/de/artikel/ueber-uns\").href\n\t).toBe(\"https://example.com/blog/about\");\n\n\t// parameter matching\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/blog/56\", { locale: \"de\" }).href\n\t).toBe(\"https://example.com/de/artikel/56\");\n\n\texpect(runtime.deLocalizeUrl(\"https://example.com/de/artikel/56\").href).toBe(\n\t\t\"https://example.com/blog/56\"\n\t);\n});\n\n// https://github.com/opral/paraglide-js/issues/473\ntest(\"normalizes trailing slashes before matching translated pathnames\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\", \"baseLocale\"],\n\t\ttrailingSlash: \"never\",\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"/\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \"/de\"],\n\t\t\t\t\t[\"en\", \"/\"],\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: \"/about\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \"/de/ueber\"],\n\t\t\t\t\t[\"en\", \"/about\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\texpect(runtime.trailingSlash).toBe(\"never\");\n\texpect(\"normalizeTrailingSlash\" in runtime).toBe(false);\n\texpect(\"execUrlPattern\" in runtime).toBe(false);\n\texpect(runtime.extractLocaleFromUrl(\"https://example.com/de/\")).toBe(\"de\");\n\texpect(runtime.extractLocaleFromUrl(\"https://example.com/de/ueber/\")).toBe(\n\t\t\"de\"\n\t);\n\texpect(runtime.deLocalizeUrl(\"https://example.com/de/\").href).toBe(\n\t\t\"https://example.com/\"\n\t);\n\texpect(runtime.deLocalizeUrl(\"https://example.com/de/ueber/\").href).toBe(\n\t\t\"https://example.com/about\"\n\t);\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about/\", { locale: \"de\" }).href\n\t).toBe(\"https://example.com/de/ueber\");\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about/?ref=docs#section\", {\n\t\t\tlocale: \"de\",\n\t\t}).href\n\t).toBe(\"https://example.com/de/ueber?ref=docs#section\");\n});\n\ntest(\"adds trailing slashes when configured\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\ttrailingSlash: \"always\",\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\t// Existing patterns do not need to be rewritten for the policy.\n\t\t\t\tpattern: \"/about\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \"/de/ueber\"],\n\t\t\t\t\t[\"en\", \"/about\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about\", { locale: \"de\" }).href\n\t).toBe(\"https://example.com/de/ueber/\");\n\texpect(runtime.deLocalizeUrl(\"https://example.com/de/ueber\").href).toBe(\n\t\t\"https://example.com/about/\"\n\t);\n});\n\ntest(\"does not include a canonical trailing slash in wildcard captures\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\ttrailingSlash: \"always\",\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"/:path(.*)\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \"/de/:path(.*)/details\"],\n\t\t\t\t\t[\"en\", \"/:path(.*)\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/foo\", { locale: \"de\" }).href\n\t).toBe(\"https://example.com/de/foo/details/\");\n\texpect(runtime.deLocalizeUrl(\"https://example.com/de/foo/details\").href).toBe(\n\t\t\"https://example.com/foo/\"\n\t);\n});\n\ntest(\"keeps unmatched custom URLs unchanged\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\ttrailingSlash: \"never\",\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"/about\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"en\", \"/about\"],\n\t\t\t\t\t[\"de\", \"/de/ueber\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\tconst input = new URL(\"https://example.com/assets/\");\n\texpect(runtime.localizeUrl(input, { locale: \"de\" })).toBe(input);\n\texpect(runtime.deLocalizeUrl(input)).toBe(input);\n\texpect(input.href).toBe(\"https://example.com/assets/\");\n});\n\ntest(\"omitting trailingSlash preserves exact custom pattern matching\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"/about\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"en\", \"/about\"],\n\t\t\t\t\t[\"de\", \"/de/ueber\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\tconst input = new URL(\"https://example.com/de/ueber/\");\n\texpect(runtime.trailingSlash).toBeUndefined();\n\texpect(runtime.extractLocaleFromUrl(input)).toBeUndefined();\n\texpect(runtime.deLocalizeUrl(input)).toBe(input);\n});\n\ntest(\"cross domain urls\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t// Development/deployment mapping\n\t\t\t{\n\t\t\t\tpattern: \"https://localhost::port/:path*\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \"https://localhost::port/de/:path*\"],\n\t\t\t\t\t[\"en\", \"https://localhost::port/:path*\"],\n\t\t\t\t],\n\t\t\t},\n\t\t\t// Domain based localization\n\t\t\t{\n\t\t\t\tpattern: \"https://example.com/:path*\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"en\", \"https://example.com/:path*\"],\n\t\t\t\t\t[\"de\", \"https://de.example.com/:path*\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\t// in development use localhost with different mapping\n\texpect(\n\t\truntime.localizeUrl(\"https://localhost:5173/about\", { locale: \"de\" }).href\n\t).toBe(\"https://localhost:5173/de/about\");\n\n\texpect(\n\t\truntime.localizeUrl(\"https://localhost:5173/about\", { locale: \"en\" }).href\n\t).toBe(\"https://localhost:5173/about\");\n\n\texpect(runtime.deLocalizeUrl(\"https://localhost:5173/de/about\").href).toBe(\n\t\t\"https://localhost:5173/about\"\n\t);\n\n\t// DE routing\n\texpect(\n\t\truntime.localizeUrl(\"https://de.example.com/about\", { locale: \"de\" }).href\n\t).toBe(\"https://de.example.com/about\");\n\n\texpect(\n\t\truntime.localizeUrl(\"https://de.example.com/about\", { locale: \"en\" }).href\n\t).toBe(\"https://example.com/about\");\n\n\t// delocalizing\n\texpect(runtime.deLocalizeUrl(\"https://de.example.com/about\").href).toBe(\n\t\t\"https://example.com/about\"\n\t);\n\n\t// EN routing\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about\", { locale: \"de\" }).href\n\t).toBe(\"https://de.example.com/about\");\n\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about\", { locale: \"en\" }).href\n\t).toBe(\"https://example.com/about\");\n\n\t// delocalizing\n\texpect(runtime.deLocalizeUrl(\"https://example.com/about\").href).toBe(\n\t\t\"https://example.com/about\"\n\t);\n});\n\ntest(\"multi tenancy\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\", \"fr\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t// 1) customer1.fr => root path locale is fr, other locales via sub-path e.g. /en/\n\t\t\t{\n\t\t\t\tpattern: \"https://customer1.fr/:path*\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"en\", \"https://customer1.fr/en/:path*\"],\n\t\t\t\t\t[\"fr\", \"https://customer1.fr/:path*\"],\n\t\t\t\t],\n\t\t\t},\n\t\t\t// 2) customer2.com => root path locale is en, other locales via sub-path e.g. /fr/\n\t\t\t{\n\t\t\t\tpattern: \"https://customer2.com/:path*\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"fr\", \"https://customer2.com/fr/:path*\"],\n\t\t\t\t\t[\"en\", \"https://customer2.com/:path*\"],\n\t\t\t\t],\n\t\t\t},\n\t\t\t// 3) Any other domain => path-based for en/fr\n\t\t\t{\n\t\t\t\tpattern: \"https://:domain(.*)/:path*\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"en\", \"https://:domain(.*)/en/:path*\"],\n\t\t\t\t\t[\"fr\", \"https://:domain(.*)/fr/:path*\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\t// customer 1 - localizing french to french\n\texpect(\n\t\truntime.localizeUrl(\"https://customer1.fr/about\", { locale: \"fr\" }).href\n\t).toBe(\"https://customer1.fr/about\");\n\n\t// customer 1 - localizing from french to english\n\texpect(\n\t\truntime.localizeUrl(\"https://customer1.fr/about\", { locale: \"en\" }).href\n\t).toBe(\"https://customer1.fr/en/about\");\n\n\t// customer 1 - de-localizing french\n\texpect(runtime.deLocalizeUrl(\"https://customer1.fr/en/about\").href).toBe(\n\t\t\"https://customer1.fr/about\"\n\t);\n\n\t// customer 2 - english to english\n\texpect(\n\t\truntime.localizeUrl(\"https://customer2.com/about\", { locale: \"en\" }).href\n\t).toBe(\"https://customer2.com/about\");\n\n\t// customer 2 - english to french\n\texpect(\n\t\truntime.localizeUrl(\"https://customer2.com/about\", { locale: \"fr\" }).href\n\t).toBe(\"https://customer2.com/fr/about\");\n\n\t// customer 2 - de-localize french\n\texpect(runtime.deLocalizeUrl(\"https://customer2.com/fr/about\").href).toBe(\n\t\t\"https://customer2.com/about\"\n\t);\n});\n\ntest(\"providing a URL object as input\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"https://:domain(.*)/:path*\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"en\", \"https://:domain(.*)/:path*\"],\n\t\t\t\t\t[\"de\", \"https://de.:domain(.*)/:path*\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\tconst url = new URL(\"https://example.com/about\");\n\n\texpect(runtime.localizeUrl(url, { locale: \"de\" }).href).toBe(\n\t\t\"https://de.example.com/about\"\n\t);\n\n\texpect(runtime.deLocalizeUrl(url).href).toBe(\"https://example.com/about\");\n});\n\ntest(\"localhost with portname\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \":protocol://:domain(.*)::port?/:path(.*)?\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \":protocol://:domain(.*)::port?/de/:path(.*)?\"],\n\t\t\t\t\t[\"en\", \":protocol://:domain(.*)::port?/:path(.*)?\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\t// http\n\texpect(\n\t\truntime.deLocalizeUrl(new URL(\"http://localhost:5173/de/about\")).href\n\t).toBe(\"http://localhost:5173/about\");\n\n\t// https\n\texpect(\n\t\truntime.deLocalizeUrl(new URL(\"https://localhost:5173/de/about\")).href\n\t).toBe(\"https://localhost:5173/about\");\n\n\t// no port\n\texpect(\n\t\truntime.deLocalizeUrl(new URL(\"https://localhost/de/about\")).href\n\t).toBe(\"https://localhost/about\");\n\n\t// pathnames\n\texpect(\n\t\truntime.deLocalizeUrl(new URL(\"http://localhost:5173/about\")).href\n\t).toBe(\"http://localhost:5173/about\");\n\n\texpect(runtime.deLocalizeUrl(new URL(\"http://localhost:5173/\")).href).toBe(\n\t\t\"http://localhost:5173/\"\n\t);\n\n\texpect(runtime.deLocalizeUrl(new URL(\"https://localhost:5173/de\")).href).toBe(\n\t\t\"https://localhost:5173/\"\n\t);\n});\n\ntest(\"it keeps the query parameters\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"https://:domain(.*)/:path(.*)?\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \"https://:domain(.*)/de/:path(.*)?\"],\n\t\t\t\t\t[\"en\", \"https://:domain(.*)/:path(.*)?\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about?foo=bar&baz=qux\", {\n\t\t\tlocale: \"de\",\n\t\t}).href\n\t).toBe(\"https://example.com/de/about?foo=bar&baz=qux\");\n\n\texpect(\n\t\truntime.deLocalizeUrl(\"https://example.com/de/about?foo=bar&baz=qux\").href\n\t).toBe(\"https://example.com/about?foo=bar&baz=qux\");\n});\n\ntest(\"it keeps the url hash\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"https://:domain(.*)/:path(.*)?\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \"https://:domain(.*)/de/:path(.*)?\"],\n\t\t\t\t\t[\"en\", \"https://:domain(.*)/:path(.*)?\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about#test\", { locale: \"de\" }).href\n\t).toBe(\"https://example.com/de/about#test\");\n\n\texpect(runtime.deLocalizeUrl(\"https://example.com/de/about#test\").href).toBe(\n\t\t\"https://example.com/about#test\"\n\t);\n});\n\n// URL Pattern implicitly matches all paths\n//\n// The pattern https://example.com is interpreted as https://example.com.*\n// It effectively matches every path under https://example.com/\n// This means any request, including https://example.com/about, will match.\ntest(\"it keeps the url path\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"https://example.com\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \"https://example.de\"],\n\t\t\t\t\t[\"en\", \"https://example.com\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about\", { locale: \"de\" }).href\n\t).toBe(\"https://example.de/about\");\n\n\texpect(runtime.deLocalizeUrl(\"https://example.de/about\").href).toBe(\n\t\t\"https://example.com/about\"\n\t);\n});\n\ntest(\"uses getLocale when no locale is provided\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"https://:domain(.*)/:path(.*)?\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \"https://:domain(.*)/de/:path(.*)?\"],\n\t\t\t\t\t[\"en\", \"https://:domain(.*)/en/:path(.*)?\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\t// Override getLocale to return German\n\truntime.overwriteGetLocale(() => \"de\");\n\n\texpect(runtime.getLocale()).toBe(\"de\");\n\n\t// Should use \"de\" from getLocale since no locale provided\n\texpect(runtime.localizeUrl(\"https://example.com/about\").href).toBe(\n\t\t\"https://example.com/de/about\"\n\t);\n\n\t// Should still use explicit locale when provided\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about\", { locale: \"en\" }).href\n\t).toBe(\"https://example.com/en/about\");\n});\n\ntest(\"normalizes mixed-case explicit locales for custom url patterns\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"https://:domain(.*)/:path(.*)?\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \"https://:domain(.*)/de/:path(.*)?\"],\n\t\t\t\t\t[\"en\", \"https://:domain(.*)/:path(.*)?\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about\", {\n\t\t\tlocale: \"DE\",\n\t\t}).href\n\t).toBe(\"https://example.com/de/about\");\n\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/de/about\", {\n\t\t\tlocale: \"EN\",\n\t\t}).href\n\t).toBe(\"https://example.com/about\");\n});\n\n// https://github.com/opral/inlang-paraglide-js/issues/381\ntest.each([\n\t// empty url pattern will set TREE_SHAKE_DEFAULT_ULR_PATTERN_USED to true\n\t{},\n\t// real default url pattern to align behaviour\n\t{\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \":protocol://:domain(.*)::port?/:path(.*)?\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \":protocol://:domain(.*)::port?/de/:path(.*)?\"],\n\t\t\t\t\t[\"en\", \":protocol://:domain(.*)::port?/:path(.*)?\"],\n\t\t\t\t] as [string, string][],\n\t\t\t},\n\t\t],\n\t},\n])(\"default url pattern\", async (compilerOptions) => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\t...compilerOptions,\n\t});\n\n\truntime.overwriteGetLocale(() => \"en\");\n\n\texpect(runtime.localizeUrl(\"https://example.com/about\").href).toBe(\n\t\t\"https://example.com/about\"\n\t);\n\n\truntime.overwriteGetLocale(() => \"de\");\n\n\texpect(runtime.localizeUrl(\"https://example.com/\").href).toBe(\n\t\t\"https://example.com/de/\"\n\t);\n\n\texpect(runtime.localizeUrl(\"https://example.com/about\").href).toBe(\n\t\t\"https://example.com/de/about\"\n\t);\n\n\t// Should still use explicit locale when provided\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about\", { locale: \"de\" }).href\n\t).toBe(\"https://example.com/de/about\");\n\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about\", {\n\t\t\tlocale: \"DE\" as any,\n\t\t}).href\n\t).toBe(\"https://example.com/de/about\");\n\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about\", { locale: \"en\" }).href\n\t).toBe(\"https://example.com/about\");\n\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/de/about\", {\n\t\t\tlocale: \"EN\" as any,\n\t\t}).href\n\t).toBe(\"https://example.com/about\");\n\n\texpect(runtime.deLocalizeUrl(\"https://example.com/de/about\").href).toBe(\n\t\t\"https://example.com/about\"\n\t);\n\n\texpect(runtime.deLocalizeUrl(\"https://example.com/about\").href).toBe(\n\t\t\"https://example.com/about\"\n\t);\n\tfor (const path of [\n\t\t\"/about/\",\n\t\t\"/about\",\n\t\t\"/nested/page/\",\n\t\t\"/about/?ref=docs#section\",\n\t\t\"/\",\n\t]) {\n\t\tconst original = new URL(path, \"https://example.com\");\n\t\tconst localized = new URL(original);\n\t\tlocalized.pathname = \"/de\" + original.pathname;\n\t\texpect(runtime.localizeUrl(original, { locale: \"de\" }).href).toBe(\n\t\t\tlocalized.href\n\t\t);\n\t\texpect(runtime.localizeUrl(localized, { locale: \"en\" }).href).toBe(\n\t\t\toriginal.href\n\t\t);\n\t\texpect(runtime.deLocalizeUrl(localized).href).toBe(original.href);\n\t\texpect(runtime.localizeUrl(localized, { locale: \"de\" }).href).toBe(\n\t\t\tlocalized.href\n\t\t);\n\t}\n});\n\ntest(\"auto fills the url base path\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"/:path(.*)?\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \"/de/:path(.*)?\"],\n\t\t\t\t\t[\"en\", \"/:path(.*)?\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about\", { locale: \"en\" }).href\n\t).toBe(\"https://example.com/about\");\n\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about\", { locale: \"de\" }).href\n\t).toBe(\"https://example.com/de/about\");\n\n\texpect(runtime.deLocalizeUrl(\"https://example.com/de/about\").href).toBe(\n\t\t\"https://example.com/about\"\n\t);\n});\n\n// https://github.com/opral/inlang-paraglide-js/issues/454\ntest(\"works with no trailing slash at the end\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"/:path(.*)?\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"en\", \"/en/:path(.*)?\"],\n\t\t\t\t\t[\"de\", \"/de/:path(.*)?\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\texpect(runtime.deLocalizeUrl(\"https://example.com/en/\").href).toBe(\n\t\t\"https://example.com/\"\n\t);\n\n\texpect(runtime.deLocalizeUrl(\"https://example.com/en\").href).toBe(\n\t\t\"https://example.com/\"\n\t);\n});\n\n// https://github.com/opral/inlang-paraglide-js/issues/452#issuecomment-2715761308\ntest(\"falls through if no match is found\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"/about\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \"/ueber\"],\n\t\t\t\t\t[\"en\", \"/about\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/\", { locale: \"en\" }).href\n\t).toBe(\"https://example.com/\");\n\n\texpect(runtime.deLocalizeUrl(\"https://example.com/\").href).toBe(\n\t\t\"https://example.com/\"\n\t);\n});\n\ntest(\"defining no localized pattern leads to a fallthrough\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"/specific-path\",\n\t\t\t\tlocalized: [[\"en\", \"/specific-path\"]],\n\t\t\t},\n\t\t],\n\t});\n\n\t// doesn't localize because no localized pattern is defined\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/specific-path\", { locale: \"de\" })\n\t\t\t.href\n\t).toBe(\"https://example.com/specific-path\");\n\n\t// doesn't delocalize because no localized pattern is defined\n\texpect(\n\t\truntime.deLocalizeUrl(\"https://example.com/de/specific-path\").href\n\t).toBe(\"https://example.com/de/specific-path\");\n});\n\ntest(\"does not cache base-relative patterns containing protocol syntax\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"specific-path{/:value(https://.*)}?\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"en\", \"specific-path{/:value(https://.*)}?\"],\n\t\t\t\t\t[\"de\", \"/de/specific-path\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\t// Warm the pattern against one base path before using another base path.\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/a/specific-path\", {\n\t\t\tlocale: \"de\",\n\t\t}).href\n\t).toBe(\"https://example.com/de/specific-path\");\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/b/specific-path\", {\n\t\t\tlocale: \"de\",\n\t\t}).href\n\t).toBe(\"https://example.com/de/specific-path\");\n});\n\n// https://github.com/opral/inlang-paraglide-js/issues/456\ntest(\"routing to a 404 page\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"/404\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"en\", \"/404\"],\n\t\t\t\t\t[\"de\", \"/de/404\"],\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: \"specific-path\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"en\", \"/specific-path\"],\n\t\t\t\t\t[\"de\", \"/de/404\"],\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: \"/:path(.*)?\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"en\", \"/:path(.*)?\"],\n\t\t\t\t\t[\"de\", \"/de/:path(.*)?\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/specific-path\", { locale: \"en\" })\n\t\t\t.href\n\t).toBe(\"https://example.com/specific-path\");\n\n\t// localizing to a 404 page\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/specific-path\", { locale: \"de\" })\n\t\t\t.href\n\t).toBe(\"https://example.com/de/404\");\n\n\t// other paths work because of the catch all\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/other-path\", { locale: \"de\" }).href\n\t).toBe(\"https://example.com/de/other-path\");\n});\n\n// Test showing the importance of pattern order in the localized array\ntest(\"pattern order in localized array - correct order (specific first)\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"/:path(.*)?\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t// CORRECT ORDER: more specific pattern first\n\t\t\t\t\t[\"de\", \"/de/:path(.*)?\"], // More specific pattern with prefix\n\t\t\t\t\t[\"en\", \"/:path(.*)?\"], // Less specific pattern without prefix\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\t// These should work correctly with the specific (de) pattern first\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about\", { locale: \"en\" }).href\n\t).toBe(\"https://example.com/about\");\n\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about\", { locale: \"de\" }).href\n\t).toBe(\"https://example.com/de/about\");\n\n\t// Delocalization should work correctly too\n\texpect(runtime.deLocalizeUrl(\"https://example.com/de/about\").href).toBe(\n\t\t\"https://example.com/about\"\n\t);\n});\n\n// Test showing the importance of pattern order in the localized array\ntest(\"pattern order in localized array - incorrect order (generic first)\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"/:path(.*)?\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t// INCORRECT ORDER: less specific pattern first\n\t\t\t\t\t[\"en\", \"/:path(.*)?\"], // Less specific pattern without prefix\n\t\t\t\t\t[\"de\", \"/de/:path(.*)?\"], // More specific pattern with prefix that may never match\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\t// English localization works as expected\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about\", { locale: \"en\" }).href\n\t).toBe(\"https://example.com/about\");\n\n\t// German localization still works when explicitly requested\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about\", { locale: \"de\" }).href\n\t).toBe(\"https://example.com/de/about\");\n\n\t// The problem happens with delocalization:\n\t// With incorrect pattern order, the generic /:path(.*)?\n\t// pattern matches first and swallows the /de/ prefix\n\texpect(runtime.deLocalizeUrl(\"https://example.com/de/about\").href).toBe(\n\t\t\"https://example.com/de/about\"\n\t); // Should be \"https://example.com/about\"\n});\n\n// Test for port number issue with specific port numbers in the URL pattern\ntest(\"handles explicit port numbers in URL patterns correctly\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\t// Using explicit port number - this causes issues with deLocalizeUrl\n\t\t\t\tpattern: \"http://localhost:5173/:path(.*)?\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \"http://localhost:5173/de/:path(.*)?\"],\n\t\t\t\t\t[\"en\", \"http://localhost:5173/:path(.*)?\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\t// Localization should work correctly\n\texpect(\n\t\truntime.localizeUrl(\"http://localhost:5173/about\", { locale: \"de\" }).href\n\t).toBe(\"http://localhost:5173/de/about\");\n\n\texpect(\n\t\truntime.localizeUrl(\"http://localhost:5173/about\", { locale: \"en\" }).href\n\t).toBe(\"http://localhost:5173/about\");\n\n\t// This is where the bug occurs - delocalizing a URL with a port number\n\t// The port number (5173) is incorrectly treated as a path parameter\n\texpect(runtime.deLocalizeUrl(\"http://localhost:5173/de/about\").href).toBe(\n\t\t\"http://localhost:5173/about\"\n\t);\n});\n\n// Test for the correct approach using port as a pattern parameter\ntest(\"correctly handles port numbers as pattern parameters\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\t// Using port as a proper pattern parameter with :: syntax\n\t\t\t\tpattern: \"http://localhost::port/:path(.*)?\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \"http://localhost::port/de/:path(.*)?\"],\n\t\t\t\t\t[\"en\", \"http://localhost::port/:path(.*)?\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\t// Localization should work correctly\n\texpect(\n\t\truntime.localizeUrl(\"http://localhost:5173/about\", { locale: \"de\" }).href\n\t).toBe(\"http://localhost:5173/de/about\");\n\n\texpect(\n\t\truntime.localizeUrl(\"http://localhost:5173/about\", { locale: \"en\" }).href\n\t).toBe(\"http://localhost:5173/about\");\n\n\t// Delocalization should also work correctly with the proper pattern\n\texpect(runtime.deLocalizeUrl(\"http://localhost:5173/de/about\").href).toBe(\n\t\t\"http://localhost:5173/about\"\n\t);\n});\n"]}
|
|
1
|
+
{"version":3,"file":"localize-url.test.js","sourceRoot":"","sources":["../../../src/compiler/runtime/localize-url.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,IAAI,CAAC,IAAI,CAAC;IACT,EAAE,IAAI,EAAE,kBAAkB,EAAE,WAAW,EAAE,SAAS,EAAE;IACpD;QACC,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE;YACZ;gBACC,OAAO,EAAE,QAAQ;gBACjB,SAAS,EAAE;oBACV,CAAC,IAAI,EAAE,QAAQ,CAAC;oBAChB,CAAC,IAAI,EAAE,WAAW,CAAC;iBACG;aACvB;SACD;KACD;CACD,CAAC,CAAC,wCAAwC,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE;IACtE,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC;QACrC,IAAI,EAAE,MAAM,UAAU,CAAC;YACtB,QAAQ,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE;SACrD,CAAC;QACF,QAAQ,EAAE,CAAC,KAAK,CAAC;QACjB,WAAW;KACX,CAAC,CAAC;IAEH,2EAA2E;IAC3E,MAAM,KAAK,GAIP,IAAI,GAAG,CAAC,+CAA+C,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC;IAC1B,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAC1B,WAAW;QACV,CAAC,CAAC,kDAAkD;QACpD,CAAC,CAAC,kDAAkD,CACrD,CAAC;IACF,MAAM,CACL,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CACnE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACf,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEhC,2EAA2E;IAC3E,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;QAC/B,IAAI,EAAE,iDAAiD;KACvD,CAAC,CAAC;IACH,KAAK,MAAM,MAAM,IAAI;QACpB,OAAO,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAChD,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC;KAChC,EAAE,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QACxC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAC1B,iDAAiD,CACjD,CAAC;IACH,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;IAC9C,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC;QACrC,IAAI,EAAE,MAAM,UAAU,CAAC;YACtB,QAAQ,EAAE;gBACT,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;aACrB;SACD,CAAC;QACF,QAAQ,EAAE,CAAC,KAAK,CAAC;QACjB,WAAW,EAAE;YACZ,gBAAgB;YAChB;gBACC,OAAO,EAAE,aAAa;gBACtB,SAAS,EAAE;oBACV,CAAC,IAAI,EAAE,aAAa,CAAC;oBACrB,CAAC,IAAI,EAAE,uBAAuB,CAAC;iBAC/B;aACD;YACD,YAAY;YACZ;gBACC,OAAO,EAAE,WAAW;gBACpB,SAAS,EAAE;oBACV,CAAC,IAAI,EAAE,WAAW,CAAC;oBACnB,CAAC,IAAI,EAAE,iBAAiB,CAAC;iBACzB;aACD;YACD,WAAW;YACX;gBACC,OAAO,EAAE,YAAY;gBACrB,SAAS,EAAE;oBACV,CAAC,IAAI,EAAE,eAAe,CAAC;oBACvB,CAAC,IAAI,EAAE,YAAY,CAAC;iBACpB;aACD;SACD;KACD,CAAC,CAAC;IAEH,sBAAsB;IACtB,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,0BAA0B,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACtE,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAEtC,sBAAsB;IACtB,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,6BAA6B,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACzE,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IAEnC,sBAAsB;IACtB,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,2BAA2B,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACvE,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAEpC,6BAA6B;IAC7B,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,8BAA8B,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CACtE,2BAA2B,CAC3B,CAAC;IAEF,gBAAgB;IAChB,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,gCAAgC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAC5E,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IAEnD,MAAM,CACL,OAAO,CAAC,aAAa,CAAC,0CAA0C,CAAC,CAAC,IAAI,CACtE,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAEzC,qBAAqB;IACrB,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,6BAA6B,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACzE,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAE5C,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,mCAAmC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAC3E,6BAA6B,CAC7B,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,mDAAmD;AACnD,IAAI,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;IACnF,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC;QACrC,IAAI,EAAE,MAAM,UAAU,CAAC;YACtB,QAAQ,EAAE;gBACT,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;aACrB;SACD,CAAC;QACF,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC;QAC/B,aAAa,EAAE,OAAO;QACtB,WAAW,EAAE;YACZ;gBACC,OAAO,EAAE,GAAG;gBACZ,SAAS,EAAE;oBACV,CAAC,IAAI,EAAE,KAAK,CAAC;oBACb,CAAC,IAAI,EAAE,GAAG,CAAC;iBACX;aACD;YACD;gBACC,OAAO,EAAE,QAAQ;gBACjB,SAAS,EAAE;oBACV,CAAC,IAAI,EAAE,WAAW,CAAC;oBACnB,CAAC,IAAI,EAAE,QAAQ,CAAC;iBAChB;aACD;SACD;KACD,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,CAAC,wBAAwB,IAAI,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxD,MAAM,CAAC,gBAAgB,IAAI,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,yBAAyB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3E,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,+BAA+B,CAAC,CAAC,CAAC,IAAI,CACzE,IAAI,CACJ,CAAC;IACF,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,yBAAyB,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CACjE,sBAAsB,CACtB,CAAC;IACF,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,+BAA+B,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CACvE,2BAA2B,CAC3B,CAAC;IACF,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,4BAA4B,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACxE,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IACvC,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,6CAA6C,EAAE;QAClE,MAAM,EAAE,IAAI;KACZ,CAAC,CAAC,IAAI,CACP,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;AACzD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;IACxD,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC;QACrC,IAAI,EAAE,MAAM,UAAU,CAAC;YACtB,QAAQ,EAAE;gBACT,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;aACrB;SACD,CAAC;QACF,QAAQ,EAAE,CAAC,KAAK,CAAC;QACjB,aAAa,EAAE,QAAQ;QACvB,WAAW,EAAE;YACZ;gBACC,gEAAgE;gBAChE,OAAO,EAAE,QAAQ;gBACjB,SAAS,EAAE;oBACV,CAAC,IAAI,EAAE,WAAW,CAAC;oBACnB,CAAC,IAAI,EAAE,QAAQ,CAAC;iBAChB;aACD;SACD;KACD,CAAC,CAAC;IAEH,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,2BAA2B,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACvE,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IACxC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,8BAA8B,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CACtE,4BAA4B,CAC5B,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;IACnF,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC;QACrC,IAAI,EAAE,MAAM,UAAU,CAAC;YACtB,QAAQ,EAAE;gBACT,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;aACrB;SACD,CAAC;QACF,QAAQ,EAAE,CAAC,KAAK,CAAC;QACjB,aAAa,EAAE,QAAQ;QACvB,WAAW,EAAE;YACZ;gBACC,OAAO,EAAE,YAAY;gBACrB,SAAS,EAAE;oBACV,CAAC,IAAI,EAAE,uBAAuB,CAAC;oBAC/B,CAAC,IAAI,EAAE,YAAY,CAAC;iBACpB;aACD;SACD;KACD,CAAC,CAAC;IAEH,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,yBAAyB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACrE,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IAC9C,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,oCAAoC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAC5E,0BAA0B,CAC1B,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;IACxD,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC;QACrC,IAAI,EAAE,MAAM,UAAU,CAAC;YACtB,QAAQ,EAAE;gBACT,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;aACrB;SACD,CAAC;QACF,QAAQ,EAAE,CAAC,KAAK,CAAC;QACjB,aAAa,EAAE,OAAO;QACtB,WAAW,EAAE;YACZ;gBACC,OAAO,EAAE,QAAQ;gBACjB,SAAS,EAAE;oBACV,CAAC,IAAI,EAAE,QAAQ,CAAC;oBAChB,CAAC,IAAI,EAAE,WAAW,CAAC;iBACnB;aACD;SACD;KACD,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,6BAA6B,CAAC,CAAC;IACrD,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjE,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;AACxD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;IACjF,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC;QACrC,IAAI,EAAE,MAAM,UAAU,CAAC;YACtB,QAAQ,EAAE;gBACT,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;aACrB;SACD,CAAC;QACF,QAAQ,EAAE,CAAC,KAAK,CAAC;QACjB,WAAW,EAAE;YACZ;gBACC,OAAO,EAAE,QAAQ;gBACjB,SAAS,EAAE;oBACV,CAAC,IAAI,EAAE,QAAQ,CAAC;oBAChB,CAAC,IAAI,EAAE,WAAW,CAAC;iBACnB;aACD;SACD;KACD,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,+BAA+B,CAAC,CAAC;IACvD,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,aAAa,EAAE,CAAC;IAC9C,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IAC5D,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAClD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;IACpC,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC;QACrC,IAAI,EAAE,MAAM,UAAU,CAAC;YACtB,QAAQ,EAAE;gBACT,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;aACrB;SACD,CAAC;QACF,QAAQ,EAAE,CAAC,KAAK,CAAC;QACjB,WAAW,EAAE;YACZ,iCAAiC;YACjC;gBACC,OAAO,EAAE,gCAAgC;gBACzC,SAAS,EAAE;oBACV,CAAC,IAAI,EAAE,mCAAmC,CAAC;oBAC3C,CAAC,IAAI,EAAE,gCAAgC,CAAC;iBACxC;aACD;YACD,4BAA4B;YAC5B;gBACC,OAAO,EAAE,4BAA4B;gBACrC,SAAS,EAAE;oBACV,CAAC,IAAI,EAAE,4BAA4B,CAAC;oBACpC,CAAC,IAAI,EAAE,+BAA+B,CAAC;iBACvC;aACD;SACD;KACD,CAAC,CAAC;IAEH,sDAAsD;IACtD,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,8BAA8B,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAC1E,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAE1C,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,8BAA8B,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAC1E,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAEvC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,iCAAiC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CACzE,8BAA8B,CAC9B,CAAC;IAEF,aAAa;IACb,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,8BAA8B,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAC1E,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAEvC,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,8BAA8B,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAC1E,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAEpC,eAAe;IACf,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,8BAA8B,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CACtE,2BAA2B,CAC3B,CAAC;IAEF,aAAa;IACb,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,2BAA2B,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACvE,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAEvC,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,2BAA2B,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACvE,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAEpC,eAAe;IACf,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,2BAA2B,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CACnE,2BAA2B,CAC3B,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,eAAe,EAAE,KAAK,IAAI,EAAE;IAChC,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC;QACrC,IAAI,EAAE,MAAM,UAAU,CAAC;YACtB,QAAQ,EAAE;gBACT,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;aAC3B;SACD,CAAC;QACF,QAAQ,EAAE,CAAC,KAAK,CAAC;QACjB,WAAW,EAAE;YACZ,kFAAkF;YAClF;gBACC,OAAO,EAAE,6BAA6B;gBACtC,SAAS,EAAE;oBACV,CAAC,IAAI,EAAE,gCAAgC,CAAC;oBACxC,CAAC,IAAI,EAAE,6BAA6B,CAAC;iBACrC;aACD;YACD,mFAAmF;YACnF;gBACC,OAAO,EAAE,8BAA8B;gBACvC,SAAS,EAAE;oBACV,CAAC,IAAI,EAAE,iCAAiC,CAAC;oBACzC,CAAC,IAAI,EAAE,8BAA8B,CAAC;iBACtC;aACD;YACD,8CAA8C;YAC9C;gBACC,OAAO,EAAE,4BAA4B;gBACrC,SAAS,EAAE;oBACV,CAAC,IAAI,EAAE,+BAA+B,CAAC;oBACvC,CAAC,IAAI,EAAE,+BAA+B,CAAC;iBACvC;aACD;SACD;KACD,CAAC,CAAC;IACH,2CAA2C;IAC3C,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,4BAA4B,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACxE,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IAErC,iDAAiD;IACjD,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,4BAA4B,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACxE,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAExC,oCAAoC;IACpC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,+BAA+B,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CACvE,4BAA4B,CAC5B,CAAC;IAEF,kCAAkC;IAClC,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,6BAA6B,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACzE,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAEtC,iCAAiC;IACjC,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,6BAA6B,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACzE,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAEzC,kCAAkC;IAClC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,gCAAgC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CACxE,6BAA6B,CAC7B,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;IAClD,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC;QACrC,IAAI,EAAE,MAAM,UAAU,CAAC;YACtB,QAAQ,EAAE;gBACT,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;aACrB;SACD,CAAC;QACF,QAAQ,EAAE,CAAC,KAAK,CAAC;QACjB,WAAW,EAAE;YACZ;gBACC,OAAO,EAAE,4BAA4B;gBACrC,SAAS,EAAE;oBACV,CAAC,IAAI,EAAE,4BAA4B,CAAC;oBACpC,CAAC,IAAI,EAAE,+BAA+B,CAAC;iBACvC;aACD;SACD;KACD,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,2BAA2B,CAAC,CAAC;IAEjD,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAC3D,8BAA8B,CAC9B,CAAC;IAEF,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;AAC3E,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;IAC1C,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC;QACrC,IAAI,EAAE,MAAM,UAAU,CAAC;YACtB,QAAQ,EAAE;gBACT,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;aACrB;SACD,CAAC;QACF,QAAQ,EAAE,CAAC,KAAK,CAAC;QACjB,WAAW,EAAE;YACZ;gBACC,OAAO,EAAE,2CAA2C;gBACpD,SAAS,EAAE;oBACV,CAAC,IAAI,EAAE,8CAA8C,CAAC;oBACtD,CAAC,IAAI,EAAE,2CAA2C,CAAC;iBACnD;aACD;SACD;KACD,CAAC,CAAC;IAEH,OAAO;IACP,MAAM,CACL,OAAO,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,gCAAgC,CAAC,CAAC,CAAC,IAAI,CACrE,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAEtC,QAAQ;IACR,MAAM,CACL,OAAO,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,iCAAiC,CAAC,CAAC,CAAC,IAAI,CACtE,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAEvC,UAAU;IACV,MAAM,CACL,OAAO,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC,IAAI,CACjE,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAElC,YAAY;IACZ,MAAM,CACL,OAAO,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC,IAAI,CAClE,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAEtC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CACzE,wBAAwB,CACxB,CAAC;IAEF,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAC5E,yBAAyB,CACzB,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;IAChD,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC;QACrC,IAAI,EAAE,MAAM,UAAU,CAAC;YACtB,QAAQ,EAAE;gBACT,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;aACrB;SACD,CAAC;QACF,QAAQ,EAAE,CAAC,KAAK,CAAC;QACjB,WAAW,EAAE;YACZ;gBACC,OAAO,EAAE,gCAAgC;gBACzC,SAAS,EAAE;oBACV,CAAC,IAAI,EAAE,mCAAmC,CAAC;oBAC3C,CAAC,IAAI,EAAE,gCAAgC,CAAC;iBACxC;aACD;SACD;KACD,CAAC,CAAC;IAEH,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,2CAA2C,EAAE;QAChE,MAAM,EAAE,IAAI;KACZ,CAAC,CAAC,IAAI,CACP,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IAEvD,MAAM,CACL,OAAO,CAAC,aAAa,CAAC,8CAA8C,CAAC,CAAC,IAAI,CAC1E,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;AACrD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;IACxC,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC;QACrC,IAAI,EAAE,MAAM,UAAU,CAAC;YACtB,QAAQ,EAAE;gBACT,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;aACrB;SACD,CAAC;QACF,QAAQ,EAAE,CAAC,KAAK,CAAC;QACjB,WAAW,EAAE;YACZ;gBACC,OAAO,EAAE,gCAAgC;gBACzC,SAAS,EAAE;oBACV,CAAC,IAAI,EAAE,mCAAmC,CAAC;oBAC3C,CAAC,IAAI,EAAE,gCAAgC,CAAC;iBACxC;aACD;SACD;KACD,CAAC,CAAC;IAEH,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,gCAAgC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAC5E,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAE5C,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,mCAAmC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAC3E,gCAAgC,CAChC,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,2CAA2C;AAC3C,EAAE;AACF,0EAA0E;AAC1E,+DAA+D;AAC/D,2EAA2E;AAC3E,IAAI,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;IACxC,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC;QACrC,IAAI,EAAE,MAAM,UAAU,CAAC;YACtB,QAAQ,EAAE;gBACT,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;aACrB;SACD,CAAC;QACF,QAAQ,EAAE,CAAC,KAAK,CAAC;QACjB,WAAW,EAAE;YACZ;gBACC,OAAO,EAAE,qBAAqB;gBAC9B,SAAS,EAAE;oBACV,CAAC,IAAI,EAAE,oBAAoB,CAAC;oBAC5B,CAAC,IAAI,EAAE,qBAAqB,CAAC;iBAC7B;aACD;SACD;KACD,CAAC,CAAC;IAEH,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,2BAA2B,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACvE,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IAEnC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,0BAA0B,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAClE,2BAA2B,CAC3B,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;IAC5D,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC;QACrC,IAAI,EAAE,MAAM,UAAU,CAAC;YACtB,QAAQ,EAAE;gBACT,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;aACrB;SACD,CAAC;QACF,QAAQ,EAAE,CAAC,KAAK,CAAC;QACjB,WAAW,EAAE;YACZ;gBACC,OAAO,EAAE,gCAAgC;gBACzC,SAAS,EAAE;oBACV,CAAC,IAAI,EAAE,mCAAmC,CAAC;oBAC3C,CAAC,IAAI,EAAE,mCAAmC,CAAC;iBAC3C;aACD;SACD;KACD,CAAC,CAAC;IAEH,sCAAsC;IACtC,OAAO,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAEvC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEvC,0DAA0D;IAC1D,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,2BAA2B,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CACjE,8BAA8B,CAC9B,CAAC;IAEF,iDAAiD;IACjD,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,2BAA2B,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACvE,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;AACxC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;IACjF,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC;QACrC,IAAI,EAAE,MAAM,UAAU,CAAC;YACtB,QAAQ,EAAE;gBACT,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;aACrB;SACD,CAAC;QACF,QAAQ,EAAE,CAAC,KAAK,CAAC;QACjB,WAAW,EAAE;YACZ;gBACC,OAAO,EAAE,gCAAgC;gBACzC,SAAS,EAAE;oBACV,CAAC,IAAI,EAAE,mCAAmC,CAAC;oBAC3C,CAAC,IAAI,EAAE,gCAAgC,CAAC;iBACxC;aACD;SACD;KACD,CAAC,CAAC;IAEH,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,2BAA2B,EAAE;QAChD,MAAM,EAAE,IAAI;KACZ,CAAC,CAAC,IAAI,CACP,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAEvC,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,8BAA8B,EAAE;QACnD,MAAM,EAAE,IAAI;KACZ,CAAC,CAAC,IAAI,CACP,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC;AAEH,0DAA0D;AAC1D,IAAI,CAAC,IAAI,CAAC;IACT,yEAAyE;IACzE,EAAE;IACF,8CAA8C;IAC9C;QACC,WAAW,EAAE;YACZ;gBACC,OAAO,EAAE,2CAA2C;gBACpD,SAAS,EAAE;oBACV,CAAC,IAAI,EAAE,8CAA8C,CAAC;oBACtD,CAAC,IAAI,EAAE,2CAA2C,CAAC;iBAC7B;aACvB;SACD;KACD;CACD,CAAC,CAAC,qBAAqB,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE;IACnD,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC;QACrC,IAAI,EAAE,MAAM,UAAU,CAAC;YACtB,QAAQ,EAAE;gBACT,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;aACrB;SACD,CAAC;QACF,GAAG,eAAe;KAClB,CAAC,CAAC;IAEH,OAAO,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAEvC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,2BAA2B,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CACjE,2BAA2B,CAC3B,CAAC;IAEF,OAAO,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAEvC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAC5D,yBAAyB,CACzB,CAAC;IAEF,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,2BAA2B,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CACjE,8BAA8B,CAC9B,CAAC;IAEF,iDAAiD;IACjD,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,2BAA2B,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACvE,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAEvC,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,2BAA2B,EAAE;QAChD,MAAM,EAAE,IAAW;KACnB,CAAC,CAAC,IAAI,CACP,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAEvC,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,2BAA2B,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACvE,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAEpC,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,8BAA8B,EAAE;QACnD,MAAM,EAAE,IAAW;KACnB,CAAC,CAAC,IAAI,CACP,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAEpC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,8BAA8B,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CACtE,2BAA2B,CAC3B,CAAC;IAEF,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,2BAA2B,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CACnE,2BAA2B,CAC3B,CAAC;IACF,KAAK,MAAM,IAAI,IAAI;QAClB,SAAS;QACT,QAAQ;QACR,eAAe;QACf,0BAA0B;QAC1B,GAAG;KACH,EAAE,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;QACtD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;QACpC,SAAS,CAAC,QAAQ,GAAG,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAC/C,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAChE,SAAS,CAAC,IAAI,CACd,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CACjE,QAAQ,CAAC,IAAI,CACb,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAClE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CACjE,SAAS,CAAC,IAAI,CACd,CAAC;IACH,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;IAC/C,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC;QACrC,IAAI,EAAE,MAAM,UAAU,CAAC;YACtB,QAAQ,EAAE;gBACT,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;aACrB;SACD,CAAC;QACF,QAAQ,EAAE,CAAC,KAAK,CAAC;QACjB,WAAW,EAAE;YACZ;gBACC,OAAO,EAAE,aAAa;gBACtB,SAAS,EAAE;oBACV,CAAC,IAAI,EAAE,gBAAgB,CAAC;oBACxB,CAAC,IAAI,EAAE,aAAa,CAAC;iBACrB;aACD;SACD;KACD,CAAC,CAAC;IAEH,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,2BAA2B,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACvE,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAEpC,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,2BAA2B,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACvE,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAEvC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,8BAA8B,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CACtE,2BAA2B,CAC3B,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,0DAA0D;AAC1D,IAAI,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;IAC1D,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC;QACrC,IAAI,EAAE,MAAM,UAAU,CAAC;YACtB,QAAQ,EAAE;gBACT,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;aACrB;SACD,CAAC;QACF,QAAQ,EAAE,CAAC,KAAK,CAAC;QACjB,WAAW,EAAE;YACZ;gBACC,OAAO,EAAE,aAAa;gBACtB,SAAS,EAAE;oBACV,CAAC,IAAI,EAAE,gBAAgB,CAAC;oBACxB,CAAC,IAAI,EAAE,gBAAgB,CAAC;iBACxB;aACD;SACD;KACD,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,yBAAyB,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CACjE,sBAAsB,CACtB,CAAC;IAEF,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,wBAAwB,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAChE,sBAAsB,CACtB,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,kFAAkF;AAClF,IAAI,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;IACrD,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC;QACrC,IAAI,EAAE,MAAM,UAAU,CAAC;YACtB,QAAQ,EAAE;gBACT,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;aACrB;SACD,CAAC;QACF,QAAQ,EAAE,CAAC,KAAK,CAAC;QACjB,WAAW,EAAE;YACZ;gBACC,OAAO,EAAE,QAAQ;gBACjB,SAAS,EAAE;oBACV,CAAC,IAAI,EAAE,QAAQ,CAAC;oBAChB,CAAC,IAAI,EAAE,QAAQ,CAAC;iBAChB;aACD;SACD;KACD,CAAC,CAAC;IAEH,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,sBAAsB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAClE,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAE/B,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,sBAAsB,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAC9D,sBAAsB,CACtB,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;IACvE,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC;QACrC,IAAI,EAAE,MAAM,UAAU,CAAC;YACtB,QAAQ,EAAE;gBACT,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;aACrB;SACD,CAAC;QACF,QAAQ,EAAE,CAAC,KAAK,CAAC;QACjB,WAAW,EAAE;YACZ;gBACC,OAAO,EAAE,gBAAgB;gBACzB,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;aACrC;SACD;KACD,CAAC,CAAC;IAEH,2DAA2D;IAC3D,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,mCAAmC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;SACxE,IAAI,CACN,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAE5C,6DAA6D;IAC7D,MAAM,CACL,OAAO,CAAC,aAAa,CAAC,sCAAsC,CAAC,CAAC,IAAI,CAClE,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;AAChD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;IACnF,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC;QACrC,IAAI,EAAE,MAAM,UAAU,CAAC;YACtB,QAAQ,EAAE;gBACT,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;aACrB;SACD,CAAC;QACF,QAAQ,EAAE,CAAC,KAAK,CAAC;QACjB,WAAW,EAAE;YACZ;gBACC,OAAO,EAAE,qCAAqC;gBAC9C,SAAS,EAAE;oBACV,CAAC,IAAI,EAAE,qCAAqC,CAAC;oBAC7C,CAAC,IAAI,EAAE,mBAAmB,CAAC;iBAC3B;aACD;SACD;KACD,CAAC,CAAC;IAEH,yEAAyE;IACzE,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,qCAAqC,EAAE;QAC1D,MAAM,EAAE,IAAI;KACZ,CAAC,CAAC,IAAI,CACP,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IAC/C,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,qCAAqC,EAAE;QAC1D,MAAM,EAAE,IAAI;KACZ,CAAC,CAAC,IAAI,CACP,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;AAChD,CAAC,CAAC,CAAC;AAEH,0DAA0D;AAC1D,IAAI,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;IACxC,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC;QACrC,IAAI,EAAE,MAAM,UAAU,CAAC;YACtB,QAAQ,EAAE;gBACT,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;aACrB;SACD,CAAC;QACF,QAAQ,EAAE,CAAC,KAAK,CAAC;QACjB,WAAW,EAAE;YACZ;gBACC,OAAO,EAAE,MAAM;gBACf,SAAS,EAAE;oBACV,CAAC,IAAI,EAAE,MAAM,CAAC;oBACd,CAAC,IAAI,EAAE,SAAS,CAAC;iBACjB;aACD;YACD;gBACC,OAAO,EAAE,eAAe;gBACxB,SAAS,EAAE;oBACV,CAAC,IAAI,EAAE,gBAAgB,CAAC;oBACxB,CAAC,IAAI,EAAE,SAAS,CAAC;iBACjB;aACD;YACD;gBACC,OAAO,EAAE,aAAa;gBACtB,SAAS,EAAE;oBACV,CAAC,IAAI,EAAE,aAAa,CAAC;oBACrB,CAAC,IAAI,EAAE,gBAAgB,CAAC;iBACxB;aACD;SACD;KACD,CAAC,CAAC;IAEH,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,mCAAmC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;SACxE,IAAI,CACN,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAE5C,2BAA2B;IAC3B,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,mCAAmC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;SACxE,IAAI,CACN,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IAErC,4CAA4C;IAC5C,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,gCAAgC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAC5E,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;AAC7C,CAAC,CAAC,CAAC;AAEH,sEAAsE;AACtE,IAAI,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;IACpF,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC;QACrC,IAAI,EAAE,MAAM,UAAU,CAAC;YACtB,QAAQ,EAAE;gBACT,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;aACrB;SACD,CAAC;QACF,QAAQ,EAAE,CAAC,KAAK,CAAC;QACjB,WAAW,EAAE;YACZ;gBACC,OAAO,EAAE,aAAa;gBACtB,SAAS,EAAE;oBACV,6CAA6C;oBAC7C,CAAC,IAAI,EAAE,gBAAgB,CAAC,EAAE,oCAAoC;oBAC9D,CAAC,IAAI,EAAE,aAAa,CAAC,EAAE,uCAAuC;iBAC9D;aACD;SACD;KACD,CAAC,CAAC;IAEH,mEAAmE;IACnE,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,2BAA2B,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACvE,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAEpC,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,2BAA2B,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACvE,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAEvC,2CAA2C;IAC3C,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,8BAA8B,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CACtE,2BAA2B,CAC3B,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,sEAAsE;AACtE,IAAI,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;IACrF,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC;QACrC,IAAI,EAAE,MAAM,UAAU,CAAC;YACtB,QAAQ,EAAE;gBACT,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;aACrB;SACD,CAAC;QACF,QAAQ,EAAE,CAAC,KAAK,CAAC;QACjB,WAAW,EAAE;YACZ;gBACC,OAAO,EAAE,aAAa;gBACtB,SAAS,EAAE;oBACV,+CAA+C;oBAC/C,CAAC,IAAI,EAAE,aAAa,CAAC,EAAE,uCAAuC;oBAC9D,CAAC,IAAI,EAAE,gBAAgB,CAAC,EAAE,yDAAyD;iBACnF;aACD;SACD;KACD,CAAC,CAAC;IAEH,yCAAyC;IACzC,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,2BAA2B,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACvE,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAEpC,4DAA4D;IAC5D,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,2BAA2B,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACvE,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAEvC,2CAA2C;IAC3C,wDAAwD;IACxD,qDAAqD;IACrD,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,8BAA8B,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CACtE,8BAA8B,CAC9B,CAAC,CAAC,wCAAwC;AAC5C,CAAC,CAAC,CAAC;AAEH,2EAA2E;AAC3E,IAAI,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;IAC1E,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC;QACrC,IAAI,EAAE,MAAM,UAAU,CAAC;YACtB,QAAQ,EAAE;gBACT,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;aACrB;SACD,CAAC;QACF,QAAQ,EAAE,CAAC,KAAK,CAAC;QACjB,WAAW,EAAE;YACZ;gBACC,qEAAqE;gBACrE,OAAO,EAAE,kCAAkC;gBAC3C,SAAS,EAAE;oBACV,CAAC,IAAI,EAAE,qCAAqC,CAAC;oBAC7C,CAAC,IAAI,EAAE,kCAAkC,CAAC;iBAC1C;aACD;SACD;KACD,CAAC,CAAC;IAEH,qCAAqC;IACrC,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,6BAA6B,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACzE,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAEzC,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,6BAA6B,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACzE,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAEtC,uEAAuE;IACvE,oEAAoE;IACpE,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,gCAAgC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CACxE,6BAA6B,CAC7B,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,kEAAkE;AAClE,IAAI,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;IACvE,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC;QACrC,IAAI,EAAE,MAAM,UAAU,CAAC;YACtB,QAAQ,EAAE;gBACT,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;aACrB;SACD,CAAC;QACF,QAAQ,EAAE,CAAC,KAAK,CAAC;QACjB,WAAW,EAAE;YACZ;gBACC,0DAA0D;gBAC1D,OAAO,EAAE,mCAAmC;gBAC5C,SAAS,EAAE;oBACV,CAAC,IAAI,EAAE,sCAAsC,CAAC;oBAC9C,CAAC,IAAI,EAAE,mCAAmC,CAAC;iBAC3C;aACD;SACD;KACD,CAAC,CAAC;IAEH,qCAAqC;IACrC,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,6BAA6B,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACzE,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAEzC,MAAM,CACL,OAAO,CAAC,WAAW,CAAC,6BAA6B,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACzE,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAEtC,oEAAoE;IACpE,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,gCAAgC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CACxE,6BAA6B,CAC7B,CAAC;AACH,CAAC,CAAC,CAAC","sourcesContent":["import { test, expect } from \"vitest\";\nimport { createParaglide } from \"../create-paraglide.js\";\nimport { newProject } from \"@inlang/sdk\";\n\ntest.each([\n\t{ name: \"default patterns\", urlPatterns: undefined },\n\t{\n\t\tname: \"custom patterns\",\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"/about\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"en\", \"/about\"],\n\t\t\t\t\t[\"de\", \"/de/ueber\"],\n\t\t\t\t] as [string, string][],\n\t\t\t},\n\t\t],\n\t},\n])(\"accepts readonly URL inputs with $name\", async ({ urlPatterns }) => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: { baseLocale: \"en\", locales: [\"en\", \"de\"] },\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns,\n\t});\n\n\t// Match SvelteKit 3's page.url type, including readonly search parameters.\n\tconst input: Readonly<\n\t\tOmit<URL, \"searchParams\"> & {\n\t\t\tsearchParams: Omit<URLSearchParams, \"append\" | \"delete\" | \"set\" | \"sort\">;\n\t\t}\n\t> = new URL(\"https://example.com/about?q=one&q=two#section\");\n\tconst before = input.href;\n\tconst localized = runtime.localizeUrl(input, { locale: \"de\" });\n\texpect(localized.href).toBe(\n\t\turlPatterns\n\t\t\t? \"https://example.com/de/ueber?q=one&q=two#section\"\n\t\t\t: \"https://example.com/de/about?q=one&q=two#section\"\n\t);\n\texpect(\n\t\truntime.deLocalizeUrl(Object.freeze({ href: localized.href })).href\n\t).toBe(before);\n\texpect(input.href).toBe(before);\n\n\t// A URL-like object must never leak out of the unmatched-pattern fallback.\n\tconst unmatched = Object.freeze({\n\t\thref: \"https://example.com/assets/?q=one&q=two#section\",\n\t});\n\tfor (const result of [\n\t\truntime.localizeUrl(unmatched, { locale: \"en\" }),\n\t\truntime.deLocalizeUrl(unmatched),\n\t]) {\n\t\texpect(result).toBeInstanceOf(URL);\n\t\texpect(result.href).toBe(unmatched.href);\n\t\tresult.searchParams.set(\"q\", \"changed\");\n\t\texpect(unmatched.href).toBe(\n\t\t\t\"https://example.com/assets/?q=one&q=two#section\"\n\t\t);\n\t}\n});\n\ntest(\"pathname based localization\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t// literal match\n\t\t\t{\n\t\t\t\tpattern: \"/blog/about\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"en\", \"/blog/about\"],\n\t\t\t\t\t[\"de\", \"/de/artikel/ueber-uns\"],\n\t\t\t\t],\n\t\t\t},\n\t\t\t// parameter\n\t\t\t{\n\t\t\t\tpattern: \"/blog/:id\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"en\", \"/blog/:id\"],\n\t\t\t\t\t[\"de\", \"/de/artikel/:id\"],\n\t\t\t\t],\n\t\t\t},\n\t\t\t// wildcard\n\t\t\t{\n\t\t\t\tpattern: \"/:path(.*)\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \"/de/:path(.*)\"],\n\t\t\t\t\t[\"en\", \"/:path(.*)\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\t// wildcard - en to de\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/home\", { locale: \"de\" }).href\n\t).toBe(\"https://example.com/de/home\");\n\n\t// wildcard - de to en\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/de/home\", { locale: \"en\" }).href\n\t).toBe(\"https://example.com/home\");\n\n\t// wildcard - en to en\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about\", { locale: \"en\" }).href\n\t).toBe(\"https://example.com/about\");\n\n\t// wildcard - delocalizing de\n\texpect(runtime.deLocalizeUrl(\"https://example.com/de/about\").href).toBe(\n\t\t\"https://example.com/about\"\n\t);\n\n\t// literal match\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/blog/about\", { locale: \"de\" }).href\n\t).toBe(\"https://example.com/de/artikel/ueber-uns\");\n\n\texpect(\n\t\truntime.deLocalizeUrl(\"https://example.com/de/artikel/ueber-uns\").href\n\t).toBe(\"https://example.com/blog/about\");\n\n\t// parameter matching\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/blog/56\", { locale: \"de\" }).href\n\t).toBe(\"https://example.com/de/artikel/56\");\n\n\texpect(runtime.deLocalizeUrl(\"https://example.com/de/artikel/56\").href).toBe(\n\t\t\"https://example.com/blog/56\"\n\t);\n});\n\n// https://github.com/opral/paraglide-js/issues/473\ntest(\"normalizes trailing slashes before matching translated pathnames\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\", \"baseLocale\"],\n\t\ttrailingSlash: \"never\",\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"/\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \"/de\"],\n\t\t\t\t\t[\"en\", \"/\"],\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: \"/about\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \"/de/ueber\"],\n\t\t\t\t\t[\"en\", \"/about\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\texpect(runtime.trailingSlash).toBe(\"never\");\n\texpect(\"normalizeTrailingSlash\" in runtime).toBe(false);\n\texpect(\"execUrlPattern\" in runtime).toBe(false);\n\texpect(runtime.extractLocaleFromUrl(\"https://example.com/de/\")).toBe(\"de\");\n\texpect(runtime.extractLocaleFromUrl(\"https://example.com/de/ueber/\")).toBe(\n\t\t\"de\"\n\t);\n\texpect(runtime.deLocalizeUrl(\"https://example.com/de/\").href).toBe(\n\t\t\"https://example.com/\"\n\t);\n\texpect(runtime.deLocalizeUrl(\"https://example.com/de/ueber/\").href).toBe(\n\t\t\"https://example.com/about\"\n\t);\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about/\", { locale: \"de\" }).href\n\t).toBe(\"https://example.com/de/ueber\");\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about/?ref=docs#section\", {\n\t\t\tlocale: \"de\",\n\t\t}).href\n\t).toBe(\"https://example.com/de/ueber?ref=docs#section\");\n});\n\ntest(\"adds trailing slashes when configured\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\ttrailingSlash: \"always\",\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\t// Existing patterns do not need to be rewritten for the policy.\n\t\t\t\tpattern: \"/about\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \"/de/ueber\"],\n\t\t\t\t\t[\"en\", \"/about\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about\", { locale: \"de\" }).href\n\t).toBe(\"https://example.com/de/ueber/\");\n\texpect(runtime.deLocalizeUrl(\"https://example.com/de/ueber\").href).toBe(\n\t\t\"https://example.com/about/\"\n\t);\n});\n\ntest(\"does not include a canonical trailing slash in wildcard captures\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\ttrailingSlash: \"always\",\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"/:path(.*)\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \"/de/:path(.*)/details\"],\n\t\t\t\t\t[\"en\", \"/:path(.*)\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/foo\", { locale: \"de\" }).href\n\t).toBe(\"https://example.com/de/foo/details/\");\n\texpect(runtime.deLocalizeUrl(\"https://example.com/de/foo/details\").href).toBe(\n\t\t\"https://example.com/foo/\"\n\t);\n});\n\ntest(\"keeps unmatched custom URLs unchanged\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\ttrailingSlash: \"never\",\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"/about\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"en\", \"/about\"],\n\t\t\t\t\t[\"de\", \"/de/ueber\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\tconst input = new URL(\"https://example.com/assets/\");\n\texpect(runtime.localizeUrl(input, { locale: \"de\" })).toBe(input);\n\texpect(runtime.deLocalizeUrl(input)).toBe(input);\n\texpect(input.href).toBe(\"https://example.com/assets/\");\n});\n\ntest(\"omitting trailingSlash preserves exact custom pattern matching\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"/about\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"en\", \"/about\"],\n\t\t\t\t\t[\"de\", \"/de/ueber\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\tconst input = new URL(\"https://example.com/de/ueber/\");\n\texpect(runtime.trailingSlash).toBeUndefined();\n\texpect(runtime.extractLocaleFromUrl(input)).toBeUndefined();\n\texpect(runtime.deLocalizeUrl(input)).toBe(input);\n});\n\ntest(\"cross domain urls\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t// Development/deployment mapping\n\t\t\t{\n\t\t\t\tpattern: \"https://localhost::port/:path*\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \"https://localhost::port/de/:path*\"],\n\t\t\t\t\t[\"en\", \"https://localhost::port/:path*\"],\n\t\t\t\t],\n\t\t\t},\n\t\t\t// Domain based localization\n\t\t\t{\n\t\t\t\tpattern: \"https://example.com/:path*\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"en\", \"https://example.com/:path*\"],\n\t\t\t\t\t[\"de\", \"https://de.example.com/:path*\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\t// in development use localhost with different mapping\n\texpect(\n\t\truntime.localizeUrl(\"https://localhost:5173/about\", { locale: \"de\" }).href\n\t).toBe(\"https://localhost:5173/de/about\");\n\n\texpect(\n\t\truntime.localizeUrl(\"https://localhost:5173/about\", { locale: \"en\" }).href\n\t).toBe(\"https://localhost:5173/about\");\n\n\texpect(runtime.deLocalizeUrl(\"https://localhost:5173/de/about\").href).toBe(\n\t\t\"https://localhost:5173/about\"\n\t);\n\n\t// DE routing\n\texpect(\n\t\truntime.localizeUrl(\"https://de.example.com/about\", { locale: \"de\" }).href\n\t).toBe(\"https://de.example.com/about\");\n\n\texpect(\n\t\truntime.localizeUrl(\"https://de.example.com/about\", { locale: \"en\" }).href\n\t).toBe(\"https://example.com/about\");\n\n\t// delocalizing\n\texpect(runtime.deLocalizeUrl(\"https://de.example.com/about\").href).toBe(\n\t\t\"https://example.com/about\"\n\t);\n\n\t// EN routing\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about\", { locale: \"de\" }).href\n\t).toBe(\"https://de.example.com/about\");\n\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about\", { locale: \"en\" }).href\n\t).toBe(\"https://example.com/about\");\n\n\t// delocalizing\n\texpect(runtime.deLocalizeUrl(\"https://example.com/about\").href).toBe(\n\t\t\"https://example.com/about\"\n\t);\n});\n\ntest(\"multi tenancy\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\", \"fr\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t// 1) customer1.fr => root path locale is fr, other locales via sub-path e.g. /en/\n\t\t\t{\n\t\t\t\tpattern: \"https://customer1.fr/:path*\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"en\", \"https://customer1.fr/en/:path*\"],\n\t\t\t\t\t[\"fr\", \"https://customer1.fr/:path*\"],\n\t\t\t\t],\n\t\t\t},\n\t\t\t// 2) customer2.com => root path locale is en, other locales via sub-path e.g. /fr/\n\t\t\t{\n\t\t\t\tpattern: \"https://customer2.com/:path*\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"fr\", \"https://customer2.com/fr/:path*\"],\n\t\t\t\t\t[\"en\", \"https://customer2.com/:path*\"],\n\t\t\t\t],\n\t\t\t},\n\t\t\t// 3) Any other domain => path-based for en/fr\n\t\t\t{\n\t\t\t\tpattern: \"https://:domain(.*)/:path*\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"en\", \"https://:domain(.*)/en/:path*\"],\n\t\t\t\t\t[\"fr\", \"https://:domain(.*)/fr/:path*\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\t// customer 1 - localizing french to french\n\texpect(\n\t\truntime.localizeUrl(\"https://customer1.fr/about\", { locale: \"fr\" }).href\n\t).toBe(\"https://customer1.fr/about\");\n\n\t// customer 1 - localizing from french to english\n\texpect(\n\t\truntime.localizeUrl(\"https://customer1.fr/about\", { locale: \"en\" }).href\n\t).toBe(\"https://customer1.fr/en/about\");\n\n\t// customer 1 - de-localizing french\n\texpect(runtime.deLocalizeUrl(\"https://customer1.fr/en/about\").href).toBe(\n\t\t\"https://customer1.fr/about\"\n\t);\n\n\t// customer 2 - english to english\n\texpect(\n\t\truntime.localizeUrl(\"https://customer2.com/about\", { locale: \"en\" }).href\n\t).toBe(\"https://customer2.com/about\");\n\n\t// customer 2 - english to french\n\texpect(\n\t\truntime.localizeUrl(\"https://customer2.com/about\", { locale: \"fr\" }).href\n\t).toBe(\"https://customer2.com/fr/about\");\n\n\t// customer 2 - de-localize french\n\texpect(runtime.deLocalizeUrl(\"https://customer2.com/fr/about\").href).toBe(\n\t\t\"https://customer2.com/about\"\n\t);\n});\n\ntest(\"providing a URL object as input\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"https://:domain(.*)/:path*\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"en\", \"https://:domain(.*)/:path*\"],\n\t\t\t\t\t[\"de\", \"https://de.:domain(.*)/:path*\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\tconst url = new URL(\"https://example.com/about\");\n\n\texpect(runtime.localizeUrl(url, { locale: \"de\" }).href).toBe(\n\t\t\"https://de.example.com/about\"\n\t);\n\n\texpect(runtime.deLocalizeUrl(url).href).toBe(\"https://example.com/about\");\n});\n\ntest(\"localhost with portname\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \":protocol://:domain(.*)::port?/:path(.*)?\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \":protocol://:domain(.*)::port?/de/:path(.*)?\"],\n\t\t\t\t\t[\"en\", \":protocol://:domain(.*)::port?/:path(.*)?\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\t// http\n\texpect(\n\t\truntime.deLocalizeUrl(new URL(\"http://localhost:5173/de/about\")).href\n\t).toBe(\"http://localhost:5173/about\");\n\n\t// https\n\texpect(\n\t\truntime.deLocalizeUrl(new URL(\"https://localhost:5173/de/about\")).href\n\t).toBe(\"https://localhost:5173/about\");\n\n\t// no port\n\texpect(\n\t\truntime.deLocalizeUrl(new URL(\"https://localhost/de/about\")).href\n\t).toBe(\"https://localhost/about\");\n\n\t// pathnames\n\texpect(\n\t\truntime.deLocalizeUrl(new URL(\"http://localhost:5173/about\")).href\n\t).toBe(\"http://localhost:5173/about\");\n\n\texpect(runtime.deLocalizeUrl(new URL(\"http://localhost:5173/\")).href).toBe(\n\t\t\"http://localhost:5173/\"\n\t);\n\n\texpect(runtime.deLocalizeUrl(new URL(\"https://localhost:5173/de\")).href).toBe(\n\t\t\"https://localhost:5173/\"\n\t);\n});\n\ntest(\"it keeps the query parameters\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"https://:domain(.*)/:path(.*)?\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \"https://:domain(.*)/de/:path(.*)?\"],\n\t\t\t\t\t[\"en\", \"https://:domain(.*)/:path(.*)?\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about?foo=bar&baz=qux\", {\n\t\t\tlocale: \"de\",\n\t\t}).href\n\t).toBe(\"https://example.com/de/about?foo=bar&baz=qux\");\n\n\texpect(\n\t\truntime.deLocalizeUrl(\"https://example.com/de/about?foo=bar&baz=qux\").href\n\t).toBe(\"https://example.com/about?foo=bar&baz=qux\");\n});\n\ntest(\"it keeps the url hash\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"https://:domain(.*)/:path(.*)?\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \"https://:domain(.*)/de/:path(.*)?\"],\n\t\t\t\t\t[\"en\", \"https://:domain(.*)/:path(.*)?\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about#test\", { locale: \"de\" }).href\n\t).toBe(\"https://example.com/de/about#test\");\n\n\texpect(runtime.deLocalizeUrl(\"https://example.com/de/about#test\").href).toBe(\n\t\t\"https://example.com/about#test\"\n\t);\n});\n\n// URL Pattern implicitly matches all paths\n//\n// The pattern https://example.com is interpreted as https://example.com.*\n// It effectively matches every path under https://example.com/\n// This means any request, including https://example.com/about, will match.\ntest(\"it keeps the url path\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"https://example.com\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \"https://example.de\"],\n\t\t\t\t\t[\"en\", \"https://example.com\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about\", { locale: \"de\" }).href\n\t).toBe(\"https://example.de/about\");\n\n\texpect(runtime.deLocalizeUrl(\"https://example.de/about\").href).toBe(\n\t\t\"https://example.com/about\"\n\t);\n});\n\ntest(\"uses getLocale when no locale is provided\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"https://:domain(.*)/:path(.*)?\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \"https://:domain(.*)/de/:path(.*)?\"],\n\t\t\t\t\t[\"en\", \"https://:domain(.*)/en/:path(.*)?\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\t// Override getLocale to return German\n\truntime.overwriteGetLocale(() => \"de\");\n\n\texpect(runtime.getLocale()).toBe(\"de\");\n\n\t// Should use \"de\" from getLocale since no locale provided\n\texpect(runtime.localizeUrl(\"https://example.com/about\").href).toBe(\n\t\t\"https://example.com/de/about\"\n\t);\n\n\t// Should still use explicit locale when provided\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about\", { locale: \"en\" }).href\n\t).toBe(\"https://example.com/en/about\");\n});\n\ntest(\"normalizes mixed-case explicit locales for custom url patterns\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"https://:domain(.*)/:path(.*)?\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \"https://:domain(.*)/de/:path(.*)?\"],\n\t\t\t\t\t[\"en\", \"https://:domain(.*)/:path(.*)?\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about\", {\n\t\t\tlocale: \"DE\",\n\t\t}).href\n\t).toBe(\"https://example.com/de/about\");\n\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/de/about\", {\n\t\t\tlocale: \"EN\",\n\t\t}).href\n\t).toBe(\"https://example.com/about\");\n});\n\n// https://github.com/opral/inlang-paraglide-js/issues/381\ntest.each([\n\t// empty url pattern will set TREE_SHAKE_DEFAULT_ULR_PATTERN_USED to true\n\t{},\n\t// real default url pattern to align behaviour\n\t{\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \":protocol://:domain(.*)::port?/:path(.*)?\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \":protocol://:domain(.*)::port?/de/:path(.*)?\"],\n\t\t\t\t\t[\"en\", \":protocol://:domain(.*)::port?/:path(.*)?\"],\n\t\t\t\t] as [string, string][],\n\t\t\t},\n\t\t],\n\t},\n])(\"default url pattern\", async (compilerOptions) => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\t...compilerOptions,\n\t});\n\n\truntime.overwriteGetLocale(() => \"en\");\n\n\texpect(runtime.localizeUrl(\"https://example.com/about\").href).toBe(\n\t\t\"https://example.com/about\"\n\t);\n\n\truntime.overwriteGetLocale(() => \"de\");\n\n\texpect(runtime.localizeUrl(\"https://example.com/\").href).toBe(\n\t\t\"https://example.com/de/\"\n\t);\n\n\texpect(runtime.localizeUrl(\"https://example.com/about\").href).toBe(\n\t\t\"https://example.com/de/about\"\n\t);\n\n\t// Should still use explicit locale when provided\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about\", { locale: \"de\" }).href\n\t).toBe(\"https://example.com/de/about\");\n\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about\", {\n\t\t\tlocale: \"DE\" as any,\n\t\t}).href\n\t).toBe(\"https://example.com/de/about\");\n\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about\", { locale: \"en\" }).href\n\t).toBe(\"https://example.com/about\");\n\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/de/about\", {\n\t\t\tlocale: \"EN\" as any,\n\t\t}).href\n\t).toBe(\"https://example.com/about\");\n\n\texpect(runtime.deLocalizeUrl(\"https://example.com/de/about\").href).toBe(\n\t\t\"https://example.com/about\"\n\t);\n\n\texpect(runtime.deLocalizeUrl(\"https://example.com/about\").href).toBe(\n\t\t\"https://example.com/about\"\n\t);\n\tfor (const path of [\n\t\t\"/about/\",\n\t\t\"/about\",\n\t\t\"/nested/page/\",\n\t\t\"/about/?ref=docs#section\",\n\t\t\"/\",\n\t]) {\n\t\tconst original = new URL(path, \"https://example.com\");\n\t\tconst localized = new URL(original);\n\t\tlocalized.pathname = \"/de\" + original.pathname;\n\t\texpect(runtime.localizeUrl(original, { locale: \"de\" }).href).toBe(\n\t\t\tlocalized.href\n\t\t);\n\t\texpect(runtime.localizeUrl(localized, { locale: \"en\" }).href).toBe(\n\t\t\toriginal.href\n\t\t);\n\t\texpect(runtime.deLocalizeUrl(localized).href).toBe(original.href);\n\t\texpect(runtime.localizeUrl(localized, { locale: \"de\" }).href).toBe(\n\t\t\tlocalized.href\n\t\t);\n\t}\n});\n\ntest(\"auto fills the url base path\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"/:path(.*)?\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \"/de/:path(.*)?\"],\n\t\t\t\t\t[\"en\", \"/:path(.*)?\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about\", { locale: \"en\" }).href\n\t).toBe(\"https://example.com/about\");\n\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about\", { locale: \"de\" }).href\n\t).toBe(\"https://example.com/de/about\");\n\n\texpect(runtime.deLocalizeUrl(\"https://example.com/de/about\").href).toBe(\n\t\t\"https://example.com/about\"\n\t);\n});\n\n// https://github.com/opral/inlang-paraglide-js/issues/454\ntest(\"works with no trailing slash at the end\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"/:path(.*)?\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"en\", \"/en/:path(.*)?\"],\n\t\t\t\t\t[\"de\", \"/de/:path(.*)?\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\texpect(runtime.deLocalizeUrl(\"https://example.com/en/\").href).toBe(\n\t\t\"https://example.com/\"\n\t);\n\n\texpect(runtime.deLocalizeUrl(\"https://example.com/en\").href).toBe(\n\t\t\"https://example.com/\"\n\t);\n});\n\n// https://github.com/opral/inlang-paraglide-js/issues/452#issuecomment-2715761308\ntest(\"falls through if no match is found\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"/about\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \"/ueber\"],\n\t\t\t\t\t[\"en\", \"/about\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/\", { locale: \"en\" }).href\n\t).toBe(\"https://example.com/\");\n\n\texpect(runtime.deLocalizeUrl(\"https://example.com/\").href).toBe(\n\t\t\"https://example.com/\"\n\t);\n});\n\ntest(\"defining no localized pattern leads to a fallthrough\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"/specific-path\",\n\t\t\t\tlocalized: [[\"en\", \"/specific-path\"]],\n\t\t\t},\n\t\t],\n\t});\n\n\t// doesn't localize because no localized pattern is defined\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/specific-path\", { locale: \"de\" })\n\t\t\t.href\n\t).toBe(\"https://example.com/specific-path\");\n\n\t// doesn't delocalize because no localized pattern is defined\n\texpect(\n\t\truntime.deLocalizeUrl(\"https://example.com/de/specific-path\").href\n\t).toBe(\"https://example.com/de/specific-path\");\n});\n\ntest(\"does not cache base-relative patterns containing protocol syntax\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"specific-path{/:value(https://.*)}?\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"en\", \"specific-path{/:value(https://.*)}?\"],\n\t\t\t\t\t[\"de\", \"/de/specific-path\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\t// Warm the pattern against one base path before using another base path.\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/a/specific-path\", {\n\t\t\tlocale: \"de\",\n\t\t}).href\n\t).toBe(\"https://example.com/de/specific-path\");\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/b/specific-path\", {\n\t\t\tlocale: \"de\",\n\t\t}).href\n\t).toBe(\"https://example.com/de/specific-path\");\n});\n\n// https://github.com/opral/inlang-paraglide-js/issues/456\ntest(\"routing to a 404 page\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"/404\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"en\", \"/404\"],\n\t\t\t\t\t[\"de\", \"/de/404\"],\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: \"specific-path\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"en\", \"/specific-path\"],\n\t\t\t\t\t[\"de\", \"/de/404\"],\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: \"/:path(.*)?\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"en\", \"/:path(.*)?\"],\n\t\t\t\t\t[\"de\", \"/de/:path(.*)?\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/specific-path\", { locale: \"en\" })\n\t\t\t.href\n\t).toBe(\"https://example.com/specific-path\");\n\n\t// localizing to a 404 page\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/specific-path\", { locale: \"de\" })\n\t\t\t.href\n\t).toBe(\"https://example.com/de/404\");\n\n\t// other paths work because of the catch all\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/other-path\", { locale: \"de\" }).href\n\t).toBe(\"https://example.com/de/other-path\");\n});\n\n// Test showing the importance of pattern order in the localized array\ntest(\"pattern order in localized array - correct order (specific first)\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"/:path(.*)?\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t// CORRECT ORDER: more specific pattern first\n\t\t\t\t\t[\"de\", \"/de/:path(.*)?\"], // More specific pattern with prefix\n\t\t\t\t\t[\"en\", \"/:path(.*)?\"], // Less specific pattern without prefix\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\t// These should work correctly with the specific (de) pattern first\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about\", { locale: \"en\" }).href\n\t).toBe(\"https://example.com/about\");\n\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about\", { locale: \"de\" }).href\n\t).toBe(\"https://example.com/de/about\");\n\n\t// Delocalization should work correctly too\n\texpect(runtime.deLocalizeUrl(\"https://example.com/de/about\").href).toBe(\n\t\t\"https://example.com/about\"\n\t);\n});\n\n// Test showing the importance of pattern order in the localized array\ntest(\"pattern order in localized array - incorrect order (generic first)\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"/:path(.*)?\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t// INCORRECT ORDER: less specific pattern first\n\t\t\t\t\t[\"en\", \"/:path(.*)?\"], // Less specific pattern without prefix\n\t\t\t\t\t[\"de\", \"/de/:path(.*)?\"], // More specific pattern with prefix that may never match\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\t// English localization works as expected\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about\", { locale: \"en\" }).href\n\t).toBe(\"https://example.com/about\");\n\n\t// German localization still works when explicitly requested\n\texpect(\n\t\truntime.localizeUrl(\"https://example.com/about\", { locale: \"de\" }).href\n\t).toBe(\"https://example.com/de/about\");\n\n\t// The problem happens with delocalization:\n\t// With incorrect pattern order, the generic /:path(.*)?\n\t// pattern matches first and swallows the /de/ prefix\n\texpect(runtime.deLocalizeUrl(\"https://example.com/de/about\").href).toBe(\n\t\t\"https://example.com/de/about\"\n\t); // Should be \"https://example.com/about\"\n});\n\n// Test for port number issue with specific port numbers in the URL pattern\ntest(\"handles explicit port numbers in URL patterns correctly\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\t// Using explicit port number - this causes issues with deLocalizeUrl\n\t\t\t\tpattern: \"http://localhost:5173/:path(.*)?\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \"http://localhost:5173/de/:path(.*)?\"],\n\t\t\t\t\t[\"en\", \"http://localhost:5173/:path(.*)?\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\t// Localization should work correctly\n\texpect(\n\t\truntime.localizeUrl(\"http://localhost:5173/about\", { locale: \"de\" }).href\n\t).toBe(\"http://localhost:5173/de/about\");\n\n\texpect(\n\t\truntime.localizeUrl(\"http://localhost:5173/about\", { locale: \"en\" }).href\n\t).toBe(\"http://localhost:5173/about\");\n\n\t// This is where the bug occurs - delocalizing a URL with a port number\n\t// The port number (5173) is incorrectly treated as a path parameter\n\texpect(runtime.deLocalizeUrl(\"http://localhost:5173/de/about\").href).toBe(\n\t\t\"http://localhost:5173/about\"\n\t);\n});\n\n// Test for the correct approach using port as a pattern parameter\ntest(\"correctly handles port numbers as pattern parameters\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\t// Using port as a proper pattern parameter with :: syntax\n\t\t\t\tpattern: \"http://localhost::port/:path(.*)?\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \"http://localhost::port/de/:path(.*)?\"],\n\t\t\t\t\t[\"en\", \"http://localhost::port/:path(.*)?\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\t// Localization should work correctly\n\texpect(\n\t\truntime.localizeUrl(\"http://localhost:5173/about\", { locale: \"de\" }).href\n\t).toBe(\"http://localhost:5173/de/about\");\n\n\texpect(\n\t\truntime.localizeUrl(\"http://localhost:5173/about\", { locale: \"en\" }).href\n\t).toBe(\"http://localhost:5173/about\");\n\n\t// Delocalization should also work correctly with the proper pattern\n\texpect(runtime.deLocalizeUrl(\"http://localhost:5173/de/about\").href).toBe(\n\t\t\"http://localhost:5173/about\"\n\t);\n});\n"]}
|
|
@@ -92,6 +92,47 @@ test("import statements in JSDoc examples survive in the generated runtime", ()
|
|
|
92
92
|
expect(runtime).toContain(` * import { m } from './messages.js'\n * m.hello({ name: 'world' }, { locale: "en" })`);
|
|
93
93
|
expect(runtime).not.toMatch(/^\s*import\s/m);
|
|
94
94
|
});
|
|
95
|
+
test.each(["JSDoc", "declarations"])("URL helpers accept readonly URLs through generated %s", async (mode) => {
|
|
96
|
+
let project = await typescriptProject({
|
|
97
|
+
useInMemoryFileSystem: true,
|
|
98
|
+
compilerOptions: superStrictRuleOutAnyErrorTsSettings,
|
|
99
|
+
});
|
|
100
|
+
project.createSourceFile("./runtime.js", createRuntimeFile({
|
|
101
|
+
baseLocale: "en",
|
|
102
|
+
locales: ["en", "de"],
|
|
103
|
+
compilerOptions: defaultCompilerOptions,
|
|
104
|
+
}));
|
|
105
|
+
if (mode === "declarations") {
|
|
106
|
+
let declaration = "";
|
|
107
|
+
project.createProgram().emit(undefined, (name, content) => {
|
|
108
|
+
if (name.endsWith("runtime.d.ts"))
|
|
109
|
+
declaration = content;
|
|
110
|
+
}, undefined, true);
|
|
111
|
+
expect(declaration).not.toBe("");
|
|
112
|
+
project = await typescriptProject({
|
|
113
|
+
useInMemoryFileSystem: true,
|
|
114
|
+
compilerOptions: superStrictRuleOutAnyErrorTsSettings,
|
|
115
|
+
});
|
|
116
|
+
project.createSourceFile("./runtime.d.ts", declaration);
|
|
117
|
+
}
|
|
118
|
+
project.createSourceFile("./consumer.ts", `import { localizeUrl, deLocalizeUrl } from "./runtime.js";
|
|
119
|
+
type ReadonlyURL = Readonly<Omit<URL, "searchParams"> & {
|
|
120
|
+
searchParams: Omit<URLSearchParams, "append" | "delete" | "set" | "sort">;
|
|
121
|
+
}>;
|
|
122
|
+
declare const page: { url: ReadonlyURL };
|
|
123
|
+
for (const input of [page.url, new URL("https://example.com"), "https://example.com"]) {
|
|
124
|
+
localizeUrl(input, { locale: "de" }) satisfies URL;
|
|
125
|
+
deLocalizeUrl(input) satisfies URL;
|
|
126
|
+
}
|
|
127
|
+
// @ts-expect-error - URL-like objects need an href
|
|
128
|
+
deLocalizeUrl({ pathname: "/about" });
|
|
129
|
+
// @ts-expect-error - href must be a string
|
|
130
|
+
localizeUrl({ href: 123 }, { locale: "de" });`);
|
|
131
|
+
const diagnostics = ts
|
|
132
|
+
.getPreEmitDiagnostics(project.createProgram())
|
|
133
|
+
.map((d) => ts.flattenDiagnosticMessageText(d.messageText, "\n"));
|
|
134
|
+
expect(diagnostics).toEqual([]);
|
|
135
|
+
});
|
|
95
136
|
test("runtime type", async () => {
|
|
96
137
|
const project = await typescriptProject({
|
|
97
138
|
useInMemoryFileSystem: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type.test.js","sourceRoot":"","sources":["../../../src/compiler/runtime/type.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, test } from \"vitest\";\nimport {\n\tcreateProject as typescriptProject,\n\tts,\n\ttype ProjectOptions,\n} from \"@ts-morph/bootstrap\";\nimport { createRuntimeFile } from \"./create-runtime.js\";\nimport fs from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"url\";\nimport { defaultCompilerOptions } from \"../compiler-options.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nconst superStrictRuleOutAnyErrorTsSettings: ProjectOptions[\"compilerOptions\"] =\n\t{\n\t\toutDir: \"dist\",\n\t\tdeclaration: true,\n\t\tallowJs: true,\n\t\tcheckJs: true,\n\t\tnoImplicitAny: true,\n\t\tnoUnusedLocals: true,\n\t\tnoUnusedParameters: true,\n\t\tnoImplicitReturns: true,\n\t\tnoImplicitThis: true,\n\t\tnoUncheckedIndexedAccess: true,\n\t\tnoPropertyAccessFromIndexSignature: true,\n\t\tmodule: ts.ModuleKind.Node16,\n\t\tstrict: true,\n\t};\n\ntest(\"createRuntimeFile throws if urlPatterns contains an unknown locale\", () => {\n\texpect(() =>\n\t\tcreateRuntimeFile({\n\t\t\tbaseLocale: \"en\",\n\t\t\tlocales: [\"en\", \"de\"],\n\t\t\tcompilerOptions: {\n\t\t\t\t...defaultCompilerOptions,\n\t\t\t\turlPatterns: [\n\t\t\t\t\t{\n\t\t\t\t\t\tpattern: \"https://example.com/:path*\",\n\t\t\t\t\t\tlocalized: [[\"fr\", \"https://example.com/fr/:path*\"]],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t})\n\t).toThrow(\n\t\t'Invalid locale \"fr\" in urlPatterns. It must be one of the locales defined in the \"locales\" array.'\n\t);\n});\n\ntest(\"createRuntimeFile throws if cookieSameSite is 'none' without cookieSecure\", () => {\n\tconst create = (cookieSecure?: boolean | \"auto\") =>\n\t\tcreateRuntimeFile({\n\t\t\tbaseLocale: \"en\",\n\t\t\tlocales: [\"en\", \"de\"],\n\t\t\tcompilerOptions: {\n\t\t\t\t...defaultCompilerOptions,\n\t\t\t\tcookieSameSite: \"none\",\n\t\t\t\tcookieSecure,\n\t\t\t},\n\t\t});\n\n\texpect(() => create()).toThrow(\n\t\t'cookieSameSite \"none\" requires cookieSecure to be true or \"auto\". Browsers reject SameSite=None cookies without the Secure attribute.'\n\t);\n\texpect(() => create(false)).toThrow();\n\texpect(() => create(true)).not.toThrow();\n\texpect(() => create(\"auto\")).not.toThrow();\n});\n\ntest(\"runtime with cookie attributes passes checkJs\", async () => {\n\tconst project = await typescriptProject({\n\t\tuseInMemoryFileSystem: true,\n\t\tcompilerOptions: superStrictRuleOutAnyErrorTsSettings,\n\t});\n\n\tproject.createSourceFile(\n\t\t\"./runtime.js\",\n\t\tcreateRuntimeFile({\n\t\t\tbaseLocale: \"en\",\n\t\t\tlocales: [\"en\", \"de\"],\n\t\t\tcompilerOptions: {\n\t\t\t\t...defaultCompilerOptions,\n\t\t\t\tcookieSameSite: \"lax\",\n\t\t\t\tcookieSecure: \"auto\",\n\t\t\t},\n\t\t})\n\t);\n\n\tconst diagnostics = ts\n\t\t.getPreEmitDiagnostics(project.createProgram())\n\t\t.map((d) => ts.flattenDiagnosticMessageText(d.messageText, \"\\n\"));\n\n\texpect(diagnostics).toEqual([]);\n});\n\ntest(\"cookie cache clearer remains internal in the generated runtime\", () => {\n\tconst jsdocRuntime = createRuntimeFile({\n\t\tbaseLocale: \"en\",\n\t\tlocales: [\"en\", \"de\"],\n\t\tcompilerOptions: {\n\t\t\t...defaultCompilerOptions,\n\t\t\tstrategy: [\"cookie\", \"baseLocale\"],\n\t\t},\n\t});\n\n\texpect(jsdocRuntime).toContain(\"function clearLocaleCookieCache\");\n\texpect(jsdocRuntime).not.toContain(\"export function clearLocaleCookieCache\");\n});\n\ntest(\"import statements in JSDoc examples survive in the generated runtime\", () => {\n\tconst runtime = createRuntimeFile({\n\t\tbaseLocale: \"en\",\n\t\tlocales: [\"en\", \"de\"],\n\t\tcompilerOptions: defaultCompilerOptions,\n\t});\n\n\texpect(runtime).toContain(\n\t\t` * import { m } from './messages.js'\\n * m.hello({ name: 'world' }, { locale: \"en\" })`\n\t);\n\texpect(runtime).not.toMatch(/^\\s*import\\s/m);\n});\n\ntest(\"runtime type\", async () => {\n\tconst project = await typescriptProject({\n\t\tuseInMemoryFileSystem: true,\n\t\tcompilerOptions: superStrictRuleOutAnyErrorTsSettings,\n\t});\n\n\tconst jsdocRuntime = createRuntimeFile({\n\t\tbaseLocale: \"en\",\n\t\tlocales: [\"en\"],\n\t\tcompilerOptions: defaultCompilerOptions,\n\t}).replace(\n\t\t'import * as pathToRegexp from \"@inlang/paraglide-js/path-to-regexp\";',\n\t\t\"\"\n\t);\n\n\tconst file = (path: string) => {\n\t\treturn [path, fs.readFileSync(resolve(__dirname, path), \"utf-8\")!] as const;\n\t};\n\n\tproject.createSourceFile(\"./runtime.js\", jsdocRuntime);\n\tproject.createSourceFile(...file(\"./type.ts\"));\n\tproject.createSourceFile(...file(\"./ambient.d.ts\"));\n\n\t// add the imports for the types in the runtime type\n\tfor (const name of fs.readdirSync(__dirname)) {\n\t\tif (name.endsWith(\".js\")) {\n\t\t\tproject.createSourceFile(...file(name));\n\t\t}\n\t}\n\n\tproject.createSourceFile(\n\t\t\"./test.ts\",\n\t\t`\n import * as runtime from \"./runtime.js\"\n import type { Runtime } from \"./type.js\"\n\n runtime satisfies Runtime\n\n\t\t// getLocale() should return type should be a union of language tags, not a generic string\n runtime.getLocale() satisfies \"de\" | \"en\" | \"en-US\"\n\n // locales should have a narrow type, not a generic string\n runtime.locales satisfies Readonly<Array<\"de\" | \"en\" | \"en-US\">>\n\n // setLocale() should fail if the given language tag is not included in locales\n // @ts-expect-error - invalid locale\n runtime.setLocale(\"fr\")\n\n // setLocale() should not fail if the given language tag is included in locales\n runtime.setLocale(\"de\")\n\n\t\t// getTextDirection() should return a strict direction union\n\t\truntime.getTextDirection() satisfies \"ltr\" | \"rtl\"\n\n\t\t// isLocale should narrow the type of it's argument\n\t\tconst thing = 5;\n\n\t\tlet a: \"de\" | \"en\" | \"en-US\";\n\n\t\tif(runtime.isLocale(thing)) {\n\t\t\ta = thing\n\t\t} else {\n\t\t\t// @ts-expect-error - thing is not a language tag\n\t\t\ta = thing\n\t\t}\n\n\t\t// to make ts not complain about unused variables\n\t\truntime.toLocale(\"EN\") satisfies \"de\" | \"en\" | \"en-US\" | undefined\n\t\truntime.toLocale(123) satisfies \"de\" | \"en\" | \"en-US\" | undefined\n\n\t\tconsole.log(a)\n `\n\t);\n\n\tconst program = project.createProgram();\n\tconst diagnostics = ts\n\t\t.getPreEmitDiagnostics(program)\n\t\t// ignore 'export' modifier cannot be applied to ambient modules and module augmentations since they are always visible. /ambient.d.ts\n\t\t.filter((d) => d.code !== 2668)\n\t\t.filter((d) => d.messageText.toString().includes(\"path-to-regexp\"));\n\tfor (const diagnostic of diagnostics) {\n\t\tconsole.error(diagnostic.messageText, diagnostic.file?.fileName);\n\t}\n\texpect(diagnostics.length).toEqual(0);\n});\n"]}
|
|
1
|
+
{"version":3,"file":"type.test.js","sourceRoot":"","sources":["../../../src/compiler/runtime/type.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, test } from \"vitest\";\nimport {\n\tcreateProject as typescriptProject,\n\tts,\n\ttype ProjectOptions,\n} from \"@ts-morph/bootstrap\";\nimport { createRuntimeFile } from \"./create-runtime.js\";\nimport fs from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"url\";\nimport { defaultCompilerOptions } from \"../compiler-options.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nconst superStrictRuleOutAnyErrorTsSettings: ProjectOptions[\"compilerOptions\"] =\n\t{\n\t\toutDir: \"dist\",\n\t\tdeclaration: true,\n\t\tallowJs: true,\n\t\tcheckJs: true,\n\t\tnoImplicitAny: true,\n\t\tnoUnusedLocals: true,\n\t\tnoUnusedParameters: true,\n\t\tnoImplicitReturns: true,\n\t\tnoImplicitThis: true,\n\t\tnoUncheckedIndexedAccess: true,\n\t\tnoPropertyAccessFromIndexSignature: true,\n\t\tmodule: ts.ModuleKind.Node16,\n\t\tstrict: true,\n\t};\n\ntest(\"createRuntimeFile throws if urlPatterns contains an unknown locale\", () => {\n\texpect(() =>\n\t\tcreateRuntimeFile({\n\t\t\tbaseLocale: \"en\",\n\t\t\tlocales: [\"en\", \"de\"],\n\t\t\tcompilerOptions: {\n\t\t\t\t...defaultCompilerOptions,\n\t\t\t\turlPatterns: [\n\t\t\t\t\t{\n\t\t\t\t\t\tpattern: \"https://example.com/:path*\",\n\t\t\t\t\t\tlocalized: [[\"fr\", \"https://example.com/fr/:path*\"]],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t})\n\t).toThrow(\n\t\t'Invalid locale \"fr\" in urlPatterns. It must be one of the locales defined in the \"locales\" array.'\n\t);\n});\n\ntest(\"createRuntimeFile throws if cookieSameSite is 'none' without cookieSecure\", () => {\n\tconst create = (cookieSecure?: boolean | \"auto\") =>\n\t\tcreateRuntimeFile({\n\t\t\tbaseLocale: \"en\",\n\t\t\tlocales: [\"en\", \"de\"],\n\t\t\tcompilerOptions: {\n\t\t\t\t...defaultCompilerOptions,\n\t\t\t\tcookieSameSite: \"none\",\n\t\t\t\tcookieSecure,\n\t\t\t},\n\t\t});\n\n\texpect(() => create()).toThrow(\n\t\t'cookieSameSite \"none\" requires cookieSecure to be true or \"auto\". Browsers reject SameSite=None cookies without the Secure attribute.'\n\t);\n\texpect(() => create(false)).toThrow();\n\texpect(() => create(true)).not.toThrow();\n\texpect(() => create(\"auto\")).not.toThrow();\n});\n\ntest(\"runtime with cookie attributes passes checkJs\", async () => {\n\tconst project = await typescriptProject({\n\t\tuseInMemoryFileSystem: true,\n\t\tcompilerOptions: superStrictRuleOutAnyErrorTsSettings,\n\t});\n\n\tproject.createSourceFile(\n\t\t\"./runtime.js\",\n\t\tcreateRuntimeFile({\n\t\t\tbaseLocale: \"en\",\n\t\t\tlocales: [\"en\", \"de\"],\n\t\t\tcompilerOptions: {\n\t\t\t\t...defaultCompilerOptions,\n\t\t\t\tcookieSameSite: \"lax\",\n\t\t\t\tcookieSecure: \"auto\",\n\t\t\t},\n\t\t})\n\t);\n\n\tconst diagnostics = ts\n\t\t.getPreEmitDiagnostics(project.createProgram())\n\t\t.map((d) => ts.flattenDiagnosticMessageText(d.messageText, \"\\n\"));\n\n\texpect(diagnostics).toEqual([]);\n});\n\ntest(\"cookie cache clearer remains internal in the generated runtime\", () => {\n\tconst jsdocRuntime = createRuntimeFile({\n\t\tbaseLocale: \"en\",\n\t\tlocales: [\"en\", \"de\"],\n\t\tcompilerOptions: {\n\t\t\t...defaultCompilerOptions,\n\t\t\tstrategy: [\"cookie\", \"baseLocale\"],\n\t\t},\n\t});\n\n\texpect(jsdocRuntime).toContain(\"function clearLocaleCookieCache\");\n\texpect(jsdocRuntime).not.toContain(\"export function clearLocaleCookieCache\");\n});\n\ntest(\"import statements in JSDoc examples survive in the generated runtime\", () => {\n\tconst runtime = createRuntimeFile({\n\t\tbaseLocale: \"en\",\n\t\tlocales: [\"en\", \"de\"],\n\t\tcompilerOptions: defaultCompilerOptions,\n\t});\n\n\texpect(runtime).toContain(\n\t\t` * import { m } from './messages.js'\\n * m.hello({ name: 'world' }, { locale: \"en\" })`\n\t);\n\texpect(runtime).not.toMatch(/^\\s*import\\s/m);\n});\n\ntest.each([\"JSDoc\", \"declarations\"])(\n\t\"URL helpers accept readonly URLs through generated %s\",\n\tasync (mode) => {\n\t\tlet project = await typescriptProject({\n\t\t\tuseInMemoryFileSystem: true,\n\t\t\tcompilerOptions: superStrictRuleOutAnyErrorTsSettings,\n\t\t});\n\t\tproject.createSourceFile(\n\t\t\t\"./runtime.js\",\n\t\t\tcreateRuntimeFile({\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t\tcompilerOptions: defaultCompilerOptions,\n\t\t\t})\n\t\t);\n\t\tif (mode === \"declarations\") {\n\t\t\tlet declaration = \"\";\n\t\t\tproject.createProgram().emit(\n\t\t\t\tundefined,\n\t\t\t\t(name, content) => {\n\t\t\t\t\tif (name.endsWith(\"runtime.d.ts\")) declaration = content;\n\t\t\t\t},\n\t\t\t\tundefined,\n\t\t\t\ttrue\n\t\t\t);\n\t\t\texpect(declaration).not.toBe(\"\");\n\t\t\tproject = await typescriptProject({\n\t\t\t\tuseInMemoryFileSystem: true,\n\t\t\t\tcompilerOptions: superStrictRuleOutAnyErrorTsSettings,\n\t\t\t});\n\t\t\tproject.createSourceFile(\"./runtime.d.ts\", declaration);\n\t\t}\n\t\tproject.createSourceFile(\n\t\t\t\"./consumer.ts\",\n\t\t\t`import { localizeUrl, deLocalizeUrl } from \"./runtime.js\";\ntype ReadonlyURL = Readonly<Omit<URL, \"searchParams\"> & {\n searchParams: Omit<URLSearchParams, \"append\" | \"delete\" | \"set\" | \"sort\">;\n}>;\ndeclare const page: { url: ReadonlyURL };\nfor (const input of [page.url, new URL(\"https://example.com\"), \"https://example.com\"]) {\n localizeUrl(input, { locale: \"de\" }) satisfies URL;\n deLocalizeUrl(input) satisfies URL;\n}\n// @ts-expect-error - URL-like objects need an href\ndeLocalizeUrl({ pathname: \"/about\" });\n// @ts-expect-error - href must be a string\nlocalizeUrl({ href: 123 }, { locale: \"de\" });`\n\t\t);\n\t\tconst diagnostics = ts\n\t\t\t.getPreEmitDiagnostics(project.createProgram())\n\t\t\t.map((d) => ts.flattenDiagnosticMessageText(d.messageText, \"\\n\"));\n\t\texpect(diagnostics).toEqual([]);\n\t}\n);\n\ntest(\"runtime type\", async () => {\n\tconst project = await typescriptProject({\n\t\tuseInMemoryFileSystem: true,\n\t\tcompilerOptions: superStrictRuleOutAnyErrorTsSettings,\n\t});\n\n\tconst jsdocRuntime = createRuntimeFile({\n\t\tbaseLocale: \"en\",\n\t\tlocales: [\"en\"],\n\t\tcompilerOptions: defaultCompilerOptions,\n\t}).replace(\n\t\t'import * as pathToRegexp from \"@inlang/paraglide-js/path-to-regexp\";',\n\t\t\"\"\n\t);\n\n\tconst file = (path: string) => {\n\t\treturn [path, fs.readFileSync(resolve(__dirname, path), \"utf-8\")!] as const;\n\t};\n\n\tproject.createSourceFile(\"./runtime.js\", jsdocRuntime);\n\tproject.createSourceFile(...file(\"./type.ts\"));\n\tproject.createSourceFile(...file(\"./ambient.d.ts\"));\n\n\t// add the imports for the types in the runtime type\n\tfor (const name of fs.readdirSync(__dirname)) {\n\t\tif (name.endsWith(\".js\")) {\n\t\t\tproject.createSourceFile(...file(name));\n\t\t}\n\t}\n\n\tproject.createSourceFile(\n\t\t\"./test.ts\",\n\t\t`\n import * as runtime from \"./runtime.js\"\n import type { Runtime } from \"./type.js\"\n\n runtime satisfies Runtime\n\n\t\t// getLocale() should return type should be a union of language tags, not a generic string\n runtime.getLocale() satisfies \"de\" | \"en\" | \"en-US\"\n\n // locales should have a narrow type, not a generic string\n runtime.locales satisfies Readonly<Array<\"de\" | \"en\" | \"en-US\">>\n\n // setLocale() should fail if the given language tag is not included in locales\n // @ts-expect-error - invalid locale\n runtime.setLocale(\"fr\")\n\n // setLocale() should not fail if the given language tag is included in locales\n runtime.setLocale(\"de\")\n\n\t\t// getTextDirection() should return a strict direction union\n\t\truntime.getTextDirection() satisfies \"ltr\" | \"rtl\"\n\n\t\t// isLocale should narrow the type of it's argument\n\t\tconst thing = 5;\n\n\t\tlet a: \"de\" | \"en\" | \"en-US\";\n\n\t\tif(runtime.isLocale(thing)) {\n\t\t\ta = thing\n\t\t} else {\n\t\t\t// @ts-expect-error - thing is not a language tag\n\t\t\ta = thing\n\t\t}\n\n\t\t// to make ts not complain about unused variables\n\t\truntime.toLocale(\"EN\") satisfies \"de\" | \"en\" | \"en-US\" | undefined\n\t\truntime.toLocale(123) satisfies \"de\" | \"en\" | \"en-US\" | undefined\n\n\t\tconsole.log(a)\n `\n\t);\n\n\tconst program = project.createProgram();\n\tconst diagnostics = ts\n\t\t.getPreEmitDiagnostics(program)\n\t\t// ignore 'export' modifier cannot be applied to ambient modules and module augmentations since they are always visible. /ambient.d.ts\n\t\t.filter((d) => d.code !== 2668)\n\t\t.filter((d) => d.messageText.toString().includes(\"path-to-regexp\"));\n\tfor (const diagnostic of diagnostics) {\n\t\tconsole.error(diagnostic.messageText, diagnostic.file?.fileName);\n\t}\n\texpect(diagnostics.length).toEqual(0);\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/env-variables/index.ts"],"names":[],"mappings":"AACA,MAAM,CAAC,MAAM,aAAa,GAAG;IAC5B,qBAAqB,EAAE,QAAQ;CAC/B,CAAA","sourcesContent":["\nexport const ENV_VARIABLES = {\n\tPARJS_PACKAGE_VERSION: \"2.
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/env-variables/index.ts"],"names":[],"mappings":"AACA,MAAM,CAAC,MAAM,aAAa,GAAG;IAC5B,qBAAqB,EAAE,QAAQ;CAC/B,CAAA","sourcesContent":["\nexport const ENV_VARIABLES = {\n\tPARJS_PACKAGE_VERSION: \"2.29.1\",\n}\n"]}
|