@inlang/paraglide-js 2.25.2 → 2.25.4
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/compiler/runtime/localize-href.test.js +37 -0
- package/dist/compiler/runtime/localize-href.test.js.map +1 -1
- package/dist/compiler/runtime/localize-url.js +4 -2
- package/dist/compiler/runtime/localize-url.js.map +1 -1
- package/dist/compiler/runtime/localize-url.test.js +15 -0
- package/dist/compiler/runtime/localize-url.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 +2 -2
|
@@ -204,4 +204,41 @@ test("keeps custom URLPattern path expressions on the generic fallback", async (
|
|
|
204
204
|
expect(runtime.localizeHref("/a", { locale: "de" })).toBe("/de/a");
|
|
205
205
|
expect(runtime.localizeHref("/about", { locale: "de" })).toBe("/about");
|
|
206
206
|
});
|
|
207
|
+
test.each([undefined, "always", "never"])("default hrefs preserve slashes unless trailingSlash is %s", async (trailingSlash) => {
|
|
208
|
+
const runtime = await createParaglide({
|
|
209
|
+
blob: await newProject({
|
|
210
|
+
settings: { baseLocale: "de", locales: ["de", "en"] },
|
|
211
|
+
}),
|
|
212
|
+
strategy: ["url", "baseLocale"],
|
|
213
|
+
trailingSlash,
|
|
214
|
+
});
|
|
215
|
+
const paths = ["/", "/about/", "/contact/"];
|
|
216
|
+
const suffix = trailingSlash === "never" ? "" : "/";
|
|
217
|
+
expect(paths.flatMap((path) => runtime.locales.map((locale) => runtime.localizeHref(path, { locale })))).toEqual([
|
|
218
|
+
"/",
|
|
219
|
+
"/en" + suffix,
|
|
220
|
+
"/about" + suffix,
|
|
221
|
+
"/en/about" + suffix,
|
|
222
|
+
"/contact" + suffix,
|
|
223
|
+
"/en/contact" + suffix,
|
|
224
|
+
]);
|
|
225
|
+
expect(runtime.localizeHref("/about", { locale: "en" })).toBe("/en/about" + (trailingSlash === "always" ? "/" : ""));
|
|
226
|
+
expect(runtime.deLocalizeHref("/en/about/?q=test#section")).toBe("/about" + suffix + "?q=test#section");
|
|
227
|
+
expect(runtime.localizeHref("/en/about/?q=test#section", { locale: "de" })).toBe("/about" + suffix + "?q=test#section");
|
|
228
|
+
});
|
|
229
|
+
test("default routes remove detected locales after repeated leading separators", async () => {
|
|
230
|
+
const runtime = await createParaglide({
|
|
231
|
+
blob: await newProject({
|
|
232
|
+
settings: { baseLocale: "en", locales: ["en", "de", "fr"] },
|
|
233
|
+
}),
|
|
234
|
+
strategy: ["url", "baseLocale"],
|
|
235
|
+
});
|
|
236
|
+
for (const suffix of ["", "/"]) {
|
|
237
|
+
const input = `https://example.com//de/about${suffix}?q=test#section`;
|
|
238
|
+
expect(runtime.extractLocaleFromUrl(input)).toBe("de");
|
|
239
|
+
expect(runtime.localizeUrl(input, { locale: "en" }).href).toBe(`https://example.com/about${suffix}?q=test#section`);
|
|
240
|
+
expect(runtime.localizeUrl(input, { locale: "fr" }).href).toBe(`https://example.com/fr/about${suffix}?q=test#section`);
|
|
241
|
+
expect(runtime.deLocalizeUrl(input).href).toBe(`https://example.com/about${suffix}?q=test#section`);
|
|
242
|
+
}
|
|
243
|
+
});
|
|
207
244
|
//# sourceMappingURL=localize-href.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"localize-href.test.js","sourceRoot":"","sources":["../../../src/compiler/runtime/localize-href.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(\"uses the locale from getLocale() if 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\", \"globalVariable\", \"baseLocale\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"http://:domain(.*)/:locale(de|en)?/:path(.*)?\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \"http://:domain(.*)/de/:path(.*)?\"],\n\t\t\t\t\t[\"en\", \"http://:domain(.*)/:path(.*)?\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\truntime.overwriteGetLocale(() => \"de\");\n\n\texpect(runtime.localizeHref(\"/hello\")).toBe(\"/de/hello\");\n\texpect(runtime.deLocalizeHref(\"/de/hello\")).toBe(\"/hello\");\n});\n\ntest(\"returns an absolute href if the provided href is absolute\", 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\", \"globalVariable\", \"baseLocale\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"http://:domain(.*)/:locale(de|en)?/:path(.*)?\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \"http://:domain(.*)/de/:path(.*)?\"],\n\t\t\t\t\t[\"en\", \"http://:domain(.*)/:path(.*)?\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\texpect(\n\t\truntime.localizeHref(\"http://example.com/hello\", { locale: \"de\" })\n\t).toBe(\"http://example.com/de/hello\");\n\texpect(runtime.deLocalizeHref(\"http://example.com/de/hello\")).toBe(\n\t\t\"http://example.com/hello\"\n\t);\n});\n\n// useful if domain based localization is used for example\ntest(\"returns an absolute href if the provided href is relative but the origin of the localized href differs\", 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\", \"globalVariable\", \"baseLocale\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"http://example.com/:path(.*)?\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \"http://de.example.com/:path(.*)?\"],\n\t\t\t\t\t[\"en\", \"http://example.com/:path(.*)?\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\t// simulating routing from current en page to de page\n\truntime.overwriteGetLocale(() => \"en\");\n\truntime.overwriteGetUrlOrigin(() => \"http://example.com\");\n\n\texpect(runtime.localizeHref(\"/hello\", { locale: \"de\" })).toBe(\n\t\t\"http://de.example.com/hello\"\n\t);\n\texpect(runtime.deLocalizeHref(\"http://de.example.com/hello\")).toBe(\n\t\t\"http://example.com/hello\"\n\t);\n\n\t// simulating routing from current de page to en page\n\truntime.overwriteGetLocale(() => \"de\");\n\n\texpect(runtime.localizeHref(\"/hello\", { locale: \"en\" })).toBe(\n\t\t\"http://example.com/hello\"\n\t);\n\texpect(runtime.deLocalizeHref(\"http://example.com/hello\")).toBe(\n\t\t\"http://example.com/hello\"\n\t);\n});\n\n// https://github.com/opral/inlang-paraglide-js/issues/362\ntest(\"adding a base path\", async () => {\n\tconst base = \"shop\";\n\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: `/{${base}/}?:path(.*)?`,\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", `/{${base}/}?de/:path(.*)?`],\n\t\t\t\t\t[\"en\", `/{${base}/}?:path(.*)?`],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\t// simulating the current locale to be en\n\truntime.overwriteGetLocale(() => \"en\");\n\n\texpect(runtime.localizeHref(\"/about\")).toBe(\"/shop/about\");\n\texpect(runtime.deLocalizeHref(\"/about\")).toBe(\"/shop/about\");\n\n\t// simulating current locale to be de\n\truntime.overwriteGetLocale(() => \"de\");\n\texpect(runtime.localizeHref(\"/about\")).toBe(\"/shop/de/about\");\n\texpect(runtime.deLocalizeHref(\"/de/about\")).toBe(\"/shop/about\");\n});\n\ntest(\"default url patterns to improve out of the box experience\", 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\tisServer: \"false\",\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: undefined,\n\t});\n\n\t// polyfilling window\n\tglobalThis.window = { location: new URL(\"http://example.com\") } as any;\n\n\texpect(runtime.urlPatterns).toStrictEqual([\n\t\t{\n\t\t\tpattern: \":protocol://:domain(.*)::port?/:path(.*)?\",\n\t\t\tlocalized: [\n\t\t\t\t[\"de\", \":protocol://:domain(.*)::port?/de/:path(.*)?\"],\n\t\t\t\t[\"fr\", \":protocol://:domain(.*)::port?/fr/:path(.*)?\"],\n\t\t\t\t[\"en\", \":protocol://:domain(.*)::port?/:path(.*)?\"],\n\t\t\t],\n\t\t},\n\t]);\n\n\t// expecting the baseLocale to not be included in the url\n\texpect(runtime.localizeHref(\"/about\", { locale: \"en\" })).toBe(\"/about\");\n\texpect(runtime.localizeHref(\"/about\", { locale: \"de\" })).toBe(\"/de/about\");\n\n\t// expecting root path to work\n\texpect(runtime.localizeHref(\"/\", { locale: \"en\" })).toBe(\"/\");\n\texpect(runtime.localizeHref(\"/\", { locale: \"de\" })).toBe(\"/de/\");\n\n\t// expecting de-localization to work\n\texpect(runtime.deLocalizeHref(\"/de/\")).toBe(\"/\");\n\texpect(runtime.deLocalizeHref(\"/de/about\")).toBe(\"/about\");\n\texpect(runtime.deLocalizeHref(\"/about\")).toBe(\"/about\");\n\n\t// expecting localhost to work (for development)\n\texpect(runtime.localizeHref(\"http://localhost:5173/\", { locale: \"de\" })).toBe(\n\t\t\"http://localhost:5173/de/\"\n\t);\n\n\t// de-localizing localhost\n\texpect(runtime.deLocalizeHref(\"http://localhost:5173/de\")).toBe(\n\t\t\"http://localhost:5173/\"\n\t);\n\n\t// pathnames\n\texpect(\n\t\truntime.localizeHref(\"http://localhost:5173/about\", { locale: \"de\" })\n\t).toBe(\"http://localhost:5173/de/about\");\n\n\texpect(runtime.deLocalizeHref(\"http://localhost:5173/de/about\")).toBe(\n\t\t\"http://localhost:5173/about\"\n\t);\n});\n\ntest(\"normalizes localized root hrefs and anchors\", 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\tisServer: \"false\",\n\t\tstrategy: [\"url\"],\n\t\ttrailingSlash: \"never\",\n\t});\n\n\tglobalThis.window = { location: new URL(\"http://example.com\") } as any;\n\n\texpect(runtime.localizeHref(\"/\", { locale: \"de\" })).toBe(\"/de\");\n\texpect(runtime.localizeHref(\"/#section\", { locale: \"de\" })).toBe(\n\t\t\"/de#section\"\n\t);\n\texpect(runtime.deLocalizeHref(\"/de/\")).toBe(\"/\");\n});\n\ntest(\"normalizes mixed-case explicit locales in localizeHref\", 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});\n\n\texpect(runtime.localizeHref(\"/about\", { locale: \"DE\" })).toBe(\"/de/about\");\n\n\texpect(runtime.localizeHref(\"/de/about\", { locale: \"EN\" })).toBe(\"/about\");\n});\n\ntest(\"keeps custom URLPattern path expressions on the generic fallback\", 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: \"/:slug(.)?\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"en\", \"/:slug(.)?\"],\n\t\t\t\t\t[\"de\", \"/de/:slug(.)?\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\truntime.overwriteGetLocale(() => \"en\");\n\truntime.overwriteGetUrlOrigin(() => \"https://example.com\");\n\n\t// `(.)` matches exactly one character in URLPattern. A prefix-only\n\t// implementation must not broaden this route into a catch-all.\n\texpect(runtime.localizeHref(\"/a\", { locale: \"de\" })).toBe(\"/de/a\");\n\texpect(runtime.localizeHref(\"/about\", { locale: \"de\" })).toBe(\"/about\");\n});\n"]}
|
|
1
|
+
{"version":3,"file":"localize-href.test.js","sourceRoot":"","sources":["../../../src/compiler/runtime/localize-href.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(\"uses the locale from getLocale() if 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\", \"globalVariable\", \"baseLocale\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"http://:domain(.*)/:locale(de|en)?/:path(.*)?\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \"http://:domain(.*)/de/:path(.*)?\"],\n\t\t\t\t\t[\"en\", \"http://:domain(.*)/:path(.*)?\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\truntime.overwriteGetLocale(() => \"de\");\n\n\texpect(runtime.localizeHref(\"/hello\")).toBe(\"/de/hello\");\n\texpect(runtime.deLocalizeHref(\"/de/hello\")).toBe(\"/hello\");\n});\n\ntest(\"returns an absolute href if the provided href is absolute\", 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\", \"globalVariable\", \"baseLocale\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"http://:domain(.*)/:locale(de|en)?/:path(.*)?\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \"http://:domain(.*)/de/:path(.*)?\"],\n\t\t\t\t\t[\"en\", \"http://:domain(.*)/:path(.*)?\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\texpect(\n\t\truntime.localizeHref(\"http://example.com/hello\", { locale: \"de\" })\n\t).toBe(\"http://example.com/de/hello\");\n\texpect(runtime.deLocalizeHref(\"http://example.com/de/hello\")).toBe(\n\t\t\"http://example.com/hello\"\n\t);\n});\n\n// useful if domain based localization is used for example\ntest(\"returns an absolute href if the provided href is relative but the origin of the localized href differs\", 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\", \"globalVariable\", \"baseLocale\"],\n\t\turlPatterns: [\n\t\t\t{\n\t\t\t\tpattern: \"http://example.com/:path(.*)?\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", \"http://de.example.com/:path(.*)?\"],\n\t\t\t\t\t[\"en\", \"http://example.com/:path(.*)?\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\t// simulating routing from current en page to de page\n\truntime.overwriteGetLocale(() => \"en\");\n\truntime.overwriteGetUrlOrigin(() => \"http://example.com\");\n\n\texpect(runtime.localizeHref(\"/hello\", { locale: \"de\" })).toBe(\n\t\t\"http://de.example.com/hello\"\n\t);\n\texpect(runtime.deLocalizeHref(\"http://de.example.com/hello\")).toBe(\n\t\t\"http://example.com/hello\"\n\t);\n\n\t// simulating routing from current de page to en page\n\truntime.overwriteGetLocale(() => \"de\");\n\n\texpect(runtime.localizeHref(\"/hello\", { locale: \"en\" })).toBe(\n\t\t\"http://example.com/hello\"\n\t);\n\texpect(runtime.deLocalizeHref(\"http://example.com/hello\")).toBe(\n\t\t\"http://example.com/hello\"\n\t);\n});\n\n// https://github.com/opral/inlang-paraglide-js/issues/362\ntest(\"adding a base path\", async () => {\n\tconst base = \"shop\";\n\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: `/{${base}/}?:path(.*)?`,\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"de\", `/{${base}/}?de/:path(.*)?`],\n\t\t\t\t\t[\"en\", `/{${base}/}?:path(.*)?`],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\t// simulating the current locale to be en\n\truntime.overwriteGetLocale(() => \"en\");\n\n\texpect(runtime.localizeHref(\"/about\")).toBe(\"/shop/about\");\n\texpect(runtime.deLocalizeHref(\"/about\")).toBe(\"/shop/about\");\n\n\t// simulating current locale to be de\n\truntime.overwriteGetLocale(() => \"de\");\n\texpect(runtime.localizeHref(\"/about\")).toBe(\"/shop/de/about\");\n\texpect(runtime.deLocalizeHref(\"/de/about\")).toBe(\"/shop/about\");\n});\n\ntest(\"default url patterns to improve out of the box experience\", 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\tisServer: \"false\",\n\t\tstrategy: [\"url\"],\n\t\turlPatterns: undefined,\n\t});\n\n\t// polyfilling window\n\tglobalThis.window = { location: new URL(\"http://example.com\") } as any;\n\n\texpect(runtime.urlPatterns).toStrictEqual([\n\t\t{\n\t\t\tpattern: \":protocol://:domain(.*)::port?/:path(.*)?\",\n\t\t\tlocalized: [\n\t\t\t\t[\"de\", \":protocol://:domain(.*)::port?/de/:path(.*)?\"],\n\t\t\t\t[\"fr\", \":protocol://:domain(.*)::port?/fr/:path(.*)?\"],\n\t\t\t\t[\"en\", \":protocol://:domain(.*)::port?/:path(.*)?\"],\n\t\t\t],\n\t\t},\n\t]);\n\n\t// expecting the baseLocale to not be included in the url\n\texpect(runtime.localizeHref(\"/about\", { locale: \"en\" })).toBe(\"/about\");\n\texpect(runtime.localizeHref(\"/about\", { locale: \"de\" })).toBe(\"/de/about\");\n\n\t// expecting root path to work\n\texpect(runtime.localizeHref(\"/\", { locale: \"en\" })).toBe(\"/\");\n\texpect(runtime.localizeHref(\"/\", { locale: \"de\" })).toBe(\"/de/\");\n\n\t// expecting de-localization to work\n\texpect(runtime.deLocalizeHref(\"/de/\")).toBe(\"/\");\n\texpect(runtime.deLocalizeHref(\"/de/about\")).toBe(\"/about\");\n\texpect(runtime.deLocalizeHref(\"/about\")).toBe(\"/about\");\n\n\t// expecting localhost to work (for development)\n\texpect(runtime.localizeHref(\"http://localhost:5173/\", { locale: \"de\" })).toBe(\n\t\t\"http://localhost:5173/de/\"\n\t);\n\n\t// de-localizing localhost\n\texpect(runtime.deLocalizeHref(\"http://localhost:5173/de\")).toBe(\n\t\t\"http://localhost:5173/\"\n\t);\n\n\t// pathnames\n\texpect(\n\t\truntime.localizeHref(\"http://localhost:5173/about\", { locale: \"de\" })\n\t).toBe(\"http://localhost:5173/de/about\");\n\n\texpect(runtime.deLocalizeHref(\"http://localhost:5173/de/about\")).toBe(\n\t\t\"http://localhost:5173/about\"\n\t);\n});\n\ntest(\"normalizes localized root hrefs and anchors\", 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\tisServer: \"false\",\n\t\tstrategy: [\"url\"],\n\t\ttrailingSlash: \"never\",\n\t});\n\n\tglobalThis.window = { location: new URL(\"http://example.com\") } as any;\n\n\texpect(runtime.localizeHref(\"/\", { locale: \"de\" })).toBe(\"/de\");\n\texpect(runtime.localizeHref(\"/#section\", { locale: \"de\" })).toBe(\n\t\t\"/de#section\"\n\t);\n\texpect(runtime.deLocalizeHref(\"/de/\")).toBe(\"/\");\n});\n\ntest(\"normalizes mixed-case explicit locales in localizeHref\", 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});\n\n\texpect(runtime.localizeHref(\"/about\", { locale: \"DE\" })).toBe(\"/de/about\");\n\n\texpect(runtime.localizeHref(\"/de/about\", { locale: \"EN\" })).toBe(\"/about\");\n});\n\ntest(\"keeps custom URLPattern path expressions on the generic fallback\", 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: \"/:slug(.)?\",\n\t\t\t\tlocalized: [\n\t\t\t\t\t[\"en\", \"/:slug(.)?\"],\n\t\t\t\t\t[\"de\", \"/de/:slug(.)?\"],\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\truntime.overwriteGetLocale(() => \"en\");\n\truntime.overwriteGetUrlOrigin(() => \"https://example.com\");\n\n\t// `(.)` matches exactly one character in URLPattern. A prefix-only\n\t// implementation must not broaden this route into a catch-all.\n\texpect(runtime.localizeHref(\"/a\", { locale: \"de\" })).toBe(\"/de/a\");\n\texpect(runtime.localizeHref(\"/about\", { locale: \"de\" })).toBe(\"/about\");\n});\n\ntest.each([undefined, \"always\", \"never\"] as const)(\n\t\"default hrefs preserve slashes unless trailingSlash is %s\",\n\tasync (trailingSlash) => {\n\t\tconst runtime = await createParaglide({\n\t\t\tblob: await newProject({\n\t\t\t\tsettings: { baseLocale: \"de\", locales: [\"de\", \"en\"] },\n\t\t\t}),\n\t\t\tstrategy: [\"url\", \"baseLocale\"],\n\t\t\ttrailingSlash,\n\t\t});\n\t\tconst paths = [\"/\", \"/about/\", \"/contact/\"];\n\t\tconst suffix = trailingSlash === \"never\" ? \"\" : \"/\";\n\t\texpect(\n\t\t\tpaths.flatMap((path) =>\n\t\t\t\truntime.locales.map((locale) => runtime.localizeHref(path, { locale }))\n\t\t\t)\n\t\t).toEqual([\n\t\t\t\"/\",\n\t\t\t\"/en\" + suffix,\n\t\t\t\"/about\" + suffix,\n\t\t\t\"/en/about\" + suffix,\n\t\t\t\"/contact\" + suffix,\n\t\t\t\"/en/contact\" + suffix,\n\t\t]);\n\t\texpect(runtime.localizeHref(\"/about\", { locale: \"en\" })).toBe(\n\t\t\t\"/en/about\" + (trailingSlash === \"always\" ? \"/\" : \"\")\n\t\t);\n\t\texpect(runtime.deLocalizeHref(\"/en/about/?q=test#section\")).toBe(\n\t\t\t\"/about\" + suffix + \"?q=test#section\"\n\t\t);\n\t\texpect(\n\t\t\truntime.localizeHref(\"/en/about/?q=test#section\", { locale: \"de\" })\n\t\t).toBe(\"/about\" + suffix + \"?q=test#section\");\n\t}\n);\n\ntest(\"default routes remove detected locales after repeated leading separators\", async () => {\n\tconst runtime = await createParaglide({\n\t\tblob: await newProject({\n\t\t\tsettings: { baseLocale: \"en\", locales: [\"en\", \"de\", \"fr\"] },\n\t\t}),\n\t\tstrategy: [\"url\", \"baseLocale\"],\n\t});\n\tfor (const suffix of [\"\", \"/\"]) {\n\t\tconst input = `https://example.com//de/about${suffix}?q=test#section`;\n\t\texpect(runtime.extractLocaleFromUrl(input)).toBe(\"de\");\n\t\texpect(runtime.localizeUrl(input, { locale: \"en\" }).href).toBe(\n\t\t\t`https://example.com/about${suffix}?q=test#section`\n\t\t);\n\t\texpect(runtime.localizeUrl(input, { locale: \"fr\" }).href).toBe(\n\t\t\t`https://example.com/fr/about${suffix}?q=test#section`\n\t\t);\n\t\texpect(runtime.deLocalizeUrl(input).href).toBe(\n\t\t\t`https://example.com/about${suffix}?q=test#section`\n\t\t);\n\t}\n});\n"]}
|
|
@@ -110,7 +110,8 @@ function localizeUrlDefaultPattern(url, locale) {
|
|
|
110
110
|
if (currentLocale === locale) {
|
|
111
111
|
return normalizeTrailingSlash(urlObj);
|
|
112
112
|
}
|
|
113
|
-
|
|
113
|
+
// Ignore leading separators like locale detection, preserving the remaining path.
|
|
114
|
+
const pathSegments = urlObj.pathname.replace(/^\/+/, "").split("/");
|
|
114
115
|
// If current path starts with a locale, remove it
|
|
115
116
|
if (pathSegments.length > 0 && toLocale(pathSegments[0])) {
|
|
116
117
|
pathSegments.shift();
|
|
@@ -205,7 +206,8 @@ export function deLocalizeUrl(url) {
|
|
|
205
206
|
*/
|
|
206
207
|
function deLocalizeUrlDefaultPattern(url) {
|
|
207
208
|
const urlObj = normalizeTrailingSlash(typeof url === "string" ? new URL(url, getUrlOrigin()) : new URL(url));
|
|
208
|
-
|
|
209
|
+
// Ignore leading separators like locale detection, preserving the remaining path.
|
|
210
|
+
const pathSegments = urlObj.pathname.replace(/^\/+/, "").split("/");
|
|
209
211
|
// If first segment is a locale, remove it
|
|
210
212
|
if (pathSegments.length > 0 && toLocale(pathSegments[0])) {
|
|
211
213
|
urlObj.pathname = "/" + pathSegments.slice(1).join("/");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"localize-url.js","sourceRoot":"","sources":["../../../src/compiler/runtime/localize-url.js"],"names":[],"mappings":"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","sourcesContent":["import { extractLocaleFromUrl } from \"./extract-locale-from-url.js\";\nimport { getLocale } from \"./get-locale.js\";\nimport { getUrlOrigin } from \"./get-url-origin.js\";\nimport { assertIsLocale, toLocale } from \"./check-locale.js\";\nimport {\n\tbaseLocale,\n\tTREE_SHAKE_DEFAULT_URL_PATTERN_USED,\n\ttrailingSlash,\n\turlPatterns,\n} from \"./variables.js\";\nimport { normalizeTrailingSlash } from \"./normalize-trailing-slash.js\";\nimport { execUrlPattern } from \"./exec-url-pattern.js\";\n\n/**\n * Lower-level URL localization function, primarily used in server contexts.\n *\n * This function is designed for server-side usage where you need precise control\n * over URL localization, such as in middleware or request handlers. It works with\n * URL objects and always returns absolute URLs.\n *\n * For client-side UI components, use `localizeHref()` instead, which provides\n * a more convenient API with relative paths and automatic locale detection.\n *\n * @see https://paraglidejs.com/i18n-routing\n *\n * @example\n * ```typescript\n * // Server middleware example\n * app.use((req, res, next) => {\n * const url = new URL(req.url, `${req.protocol}://${req.headers.host}`);\n * const localized = localizeUrl(url, { locale: \"de\" });\n *\n * if (localized.href !== url.href) {\n * return res.redirect(localized.href);\n * }\n * next();\n * });\n * ```\n *\n * @example\n * ```typescript\n * // Using with URL patterns\n * const url = new URL(\"https://example.com/about\");\n * localizeUrl(url, { locale: \"de\" });\n * // => URL(\"https://example.com/de/about\")\n *\n * // Using with domain-based localization\n * const url = new URL(\"https://example.com/store\");\n * localizeUrl(url, { locale: \"de\" });\n * // => URL(\"https://de.example.com/store\")\n * ```\n *\n * @param {string | URL} url - The URL to localize. If string, must be absolute.\n * @param {object} [options] - Options for localization\n * @param {Locale} [options.locale] - Target locale. If not provided, uses getLocale()\n * @returns {URL} The localized URL, always absolute\n */\nexport function localizeUrl(url, options) {\n\tconst targetLocale = options?.locale\n\t\t? assertIsLocale(options?.locale)\n\t\t: getLocale();\n\n\tif (TREE_SHAKE_DEFAULT_URL_PATTERN_USED) {\n\t\treturn localizeUrlDefaultPattern(url, targetLocale);\n\t}\n\n\tconst originalUrl = typeof url === \"string\" ? new URL(url) : url;\n\tconst urlObj =\n\t\ttrailingSlash === undefined\n\t\t\t? originalUrl\n\t\t\t: normalizeTrailingSlash(new URL(originalUrl));\n\n\t// Iterate over URL patterns\n\tfor (const element of urlPatterns) {\n\t\t// Most applications use a locale prefix (and sometimes a fixed domain)\n\t\t// with a trailing catch-all path. Those routes do not need URLPattern's\n\t\t// parser or matcher on every call. Keep the generic matcher below as the\n\t\t// fallback for every other URLPattern shape. This stays inside the outer\n\t\t// loop so specific patterns retain precedence over a later catch-all.\n\t\tconst fastPathLocalized = localizeUrlFastPath(\n\t\t\turlObj,\n\t\t\ttargetLocale,\n\t\t\telement\n\t\t);\n\t\tif (fastPathLocalized !== undefined) {\n\t\t\treturn fastPathLocalized;\n\t\t}\n\n\t\t// match localized patterns\n\t\tfor (const [, localizedPattern] of element.localized) {\n\t\t\tconst match = execUrlPattern(\n\t\t\t\tgetUrlPattern(localizedPattern, urlObj),\n\t\t\t\turlObj\n\t\t\t);\n\n\t\t\tif (!match) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst targetPattern = element.localized.find(\n\t\t\t\t([locale]) => locale === targetLocale\n\t\t\t)?.[1];\n\n\t\t\tif (!targetPattern) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst localizedUrl = fillPattern(\n\t\t\t\ttargetPattern,\n\t\t\t\taggregateGroups(match),\n\t\t\t\turlObj.origin\n\t\t\t);\n\t\t\treturn normalizeTrailingSlash(fillMissingUrlParts(localizedUrl, match));\n\t\t}\n\t\tconst unlocalizedMatch = execUrlPattern(\n\t\t\tgetUrlPattern(element.pattern, urlObj),\n\t\t\turlObj\n\t\t);\n\t\tif (unlocalizedMatch) {\n\t\t\tconst targetPattern = element.localized.find(\n\t\t\t\t([locale]) => locale === targetLocale\n\t\t\t)?.[1];\n\t\t\tif (targetPattern) {\n\t\t\t\tconst localizedUrl = fillPattern(\n\t\t\t\t\ttargetPattern,\n\t\t\t\t\taggregateGroups(unlocalizedMatch),\n\t\t\t\t\turlObj.origin\n\t\t\t\t);\n\t\t\t\treturn normalizeTrailingSlash(\n\t\t\t\t\tfillMissingUrlParts(localizedUrl, unlocalizedMatch)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\t// If no match found, return the original URL\n\treturn originalUrl;\n}\n\n/**\n * https://github.com/opral/inlang-paraglide-js/issues/381\n *\n * @param {string | URL} url\n * @param {Locale} locale\n * @returns {URL}\n */\nfunction localizeUrlDefaultPattern(url, locale) {\n\tconst urlObj = normalizeTrailingSlash(\n\t\ttypeof url === \"string\" ? new URL(url, getUrlOrigin()) : new URL(url)\n\t);\n\n\tconst currentLocale = extractLocaleFromUrl(urlObj);\n\n\t// If current locale matches target locale, no change needed\n\tif (currentLocale === locale) {\n\t\treturn normalizeTrailingSlash(urlObj);\n\t}\n\n\tconst pathSegments = urlObj.pathname.split(\"/\").filter(Boolean);\n\n\t// If current path starts with a locale, remove it\n\tif (pathSegments.length > 0 && toLocale(pathSegments[0])) {\n\t\tpathSegments.shift();\n\t}\n\n\t// For base locale, don't add prefix\n\tif (locale === baseLocale) {\n\t\turlObj.pathname = \"/\" + pathSegments.join(\"/\");\n\t} else {\n\t\t// For other locales, add prefix\n\t\turlObj.pathname = \"/\" + locale + \"/\" + pathSegments.join(\"/\");\n\t}\n\n\treturn normalizeTrailingSlash(urlObj);\n}\n\n/**\n * Low-level URL de-localization function, primarily used in server contexts.\n *\n * This function is designed for server-side usage where you need precise control\n * over URL de-localization, such as in middleware or request handlers. It works with\n * URL objects and always returns absolute URLs.\n *\n * For client-side UI components, use `deLocalizeHref()` instead, which provides\n * a more convenient API with relative paths.\n *\n * @see https://paraglidejs.com/i18n-routing\n *\n * @example\n * ```typescript\n * // Server middleware example\n * app.use((req, res, next) => {\n * const url = new URL(req.url, `${req.protocol}://${req.headers.host}`);\n * const baseUrl = deLocalizeUrl(url);\n *\n * // Store the base URL for later use\n * req.baseUrl = baseUrl;\n * next();\n * });\n * ```\n *\n * @example\n * ```typescript\n * // Using with URL patterns\n * const url = new URL(\"https://example.com/de/about\");\n * deLocalizeUrl(url); // => URL(\"https://example.com/about\")\n *\n * // Using with domain-based localization\n * const url = new URL(\"https://de.example.com/store\");\n * deLocalizeUrl(url); // => URL(\"https://example.com/store\")\n * ```\n *\n * @param {string | URL} url - The URL to de-localize. If string, must be absolute.\n * @returns {URL} The de-localized URL, always absolute\n */\nexport function deLocalizeUrl(url) {\n\tif (TREE_SHAKE_DEFAULT_URL_PATTERN_USED) {\n\t\treturn deLocalizeUrlDefaultPattern(url);\n\t}\n\n\tconst originalUrl = typeof url === \"string\" ? new URL(url) : url;\n\tconst urlObj =\n\t\ttrailingSlash === undefined\n\t\t\t? originalUrl\n\t\t\t: normalizeTrailingSlash(new URL(originalUrl));\n\n\t// Iterate over URL patterns\n\tfor (const element of urlPatterns) {\n\t\tconst fastPathDeLocalized = deLocalizeUrlFastPath(urlObj, element);\n\t\tif (fastPathDeLocalized !== undefined) {\n\t\t\treturn fastPathDeLocalized;\n\t\t}\n\n\t\t// Iterate over localized versions\n\t\tfor (const [, localizedPattern] of element.localized) {\n\t\t\tconst match = execUrlPattern(\n\t\t\t\tgetUrlPattern(localizedPattern, urlObj),\n\t\t\t\turlObj\n\t\t\t);\n\n\t\t\tif (match) {\n\t\t\t\t// Convert localized URL back to the base pattern\n\t\t\t\tconst groups = aggregateGroups(match);\n\n\t\t\t\tconst baseUrl = fillPattern(element.pattern, groups, urlObj.origin);\n\t\t\t\treturn normalizeTrailingSlash(fillMissingUrlParts(baseUrl, match));\n\t\t\t}\n\t\t}\n\t\t// match unlocalized pattern\n\t\tconst unlocalizedMatch = execUrlPattern(\n\t\t\tgetUrlPattern(element.pattern, urlObj),\n\t\t\turlObj\n\t\t);\n\t\tif (unlocalizedMatch) {\n\t\t\tconst baseUrl = fillPattern(\n\t\t\t\telement.pattern,\n\t\t\t\taggregateGroups(unlocalizedMatch),\n\t\t\t\turlObj.origin\n\t\t\t);\n\t\t\treturn normalizeTrailingSlash(\n\t\t\t\tfillMissingUrlParts(baseUrl, unlocalizedMatch)\n\t\t\t);\n\t\t}\n\t}\n\t// no match found return the original url\n\treturn originalUrl;\n}\n\n/**\n * De-localizes a URL using the default pattern (/:locale/*)\n * @param {string|URL} url\n * @returns {URL}\n */\nfunction deLocalizeUrlDefaultPattern(url) {\n\tconst urlObj = normalizeTrailingSlash(\n\t\ttypeof url === \"string\" ? new URL(url, getUrlOrigin()) : new URL(url)\n\t);\n\tconst pathSegments = urlObj.pathname.split(\"/\").filter(Boolean);\n\n\t// If first segment is a locale, remove it\n\tif (pathSegments.length > 0 && toLocale(pathSegments[0])) {\n\t\turlObj.pathname = \"/\" + pathSegments.slice(1).join(\"/\");\n\t}\n\n\treturn normalizeTrailingSlash(urlObj);\n}\n\n/**\n * Takes matches of implicit wildcards in the UrlPattern (when a part is missing\n * it is equal to '*') and adds them back to the result of fillPattern.\n *\n * At least protocol and hostname are required to create a valid URL inside fillPattern.\n *\n * @param {URL} url\n * @param {any} match\n * @returns {URL}\n */\nfunction fillMissingUrlParts(url, match) {\n\tif (match.protocol.groups[\"0\"]) {\n\t\turl.protocol = match.protocol.groups[\"0\"] ?? \"\";\n\t}\n\tif (match.hostname.groups[\"0\"]) {\n\t\turl.hostname = match.hostname.groups[\"0\"] ?? \"\";\n\t}\n\tif (match.username.groups[\"0\"]) {\n\t\turl.username = match.username.groups[\"0\"] ?? \"\";\n\t}\n\tif (match.password.groups[\"0\"]) {\n\t\turl.password = match.password.groups[\"0\"] ?? \"\";\n\t}\n\tif (match.port.groups[\"0\"]) {\n\t\turl.port = match.port.groups[\"0\"] ?? \"\";\n\t}\n\tif (match.pathname.groups[\"0\"]) {\n\t\turl.pathname = match.pathname.groups[\"0\"] ?? \"\";\n\t}\n\tif (match.search.groups[\"0\"]) {\n\t\turl.search = match.search.groups[\"0\"] ?? \"\";\n\t}\n\tif (match.hash.groups[\"0\"]) {\n\t\turl.hash = match.hash.groups[\"0\"] ?? \"\";\n\t}\n\n\treturn url;\n}\n\n/**\n * Fills a URL pattern with values for named groups, supporting all URLPattern-style modifiers.\n *\n * This function will eventually be replaced by https://github.com/whatwg/urlpattern/issues/73\n *\n * Matches:\n * - :name -> Simple\n * - :name? -> Optional\n * - :name+ -> One or more\n * - :name* -> Zero or more\n * - :name(...) -> Regex group\n * - {text} -> Group delimiter\n * - {text}? -> Optional group delimiter\n *\n * If the value is `null`, the segment is removed.\n *\n * @param {string} pattern - The URL pattern containing named groups.\n * @param {Record<string, string | null | undefined>} values - Object of values for named groups.\n * @param {string} origin - Base URL to use for URL construction.\n * @returns {URL} - The constructed URL with named groups filled.\n */\nfunction fillPattern(pattern, values, origin) {\n\t// Pre-process the pattern to handle explicit port numbers\n\t// This detects patterns like \"http://localhost:5173\" and protects the port number\n\t// from being interpreted as a parameter\n\tlet processedPattern = pattern.replace(\n\t\t/(https?:\\/\\/[^:/]+):(\\d+)(\\/|$)/g,\n\t\t(_, protocol, port, slash) => {\n\t\t\t// Replace \":5173\" with \"#PORT-5173#\" to protect it from parameter replacement\n\t\t\treturn `${protocol}#PORT-${port}#${slash}`;\n\t\t}\n\t);\n\n\t// First, handle group delimiters with curly braces\n\tlet processedGroupDelimiters = processedPattern.replace(\n\t\t/\\{([^{}]*)\\}([?+*]?)/g,\n\t\t(_, content, modifier) => {\n\t\t\t// For optional group delimiters\n\t\t\tif (modifier === \"?\") {\n\t\t\t\t// For optional groups, we'll include the content\n\t\t\t\treturn content;\n\t\t\t}\n\t\t\t// For non-optional group delimiters, always include the content\n\t\t\treturn content;\n\t\t}\n\t);\n\n\t// Then handle named groups\n\tlet filled = processedGroupDelimiters.replace(\n\t\t/(\\/?):([a-zA-Z0-9_]+)(\\([^)]*\\))?([?+*]?)/g,\n\t\t(_, slash, name, __, modifier) => {\n\t\t\tconst value = values[name];\n\n\t\t\tif (value === null) {\n\t\t\t\t// If value is null, remove the entire segment including the preceding slash\n\t\t\t\treturn \"\";\n\t\t\t}\n\n\t\t\tif (modifier === \"?\") {\n\t\t\t\t// Optional segment\n\t\t\t\treturn value !== undefined ? `${slash}${value}` : \"\";\n\t\t\t}\n\n\t\t\tif (modifier === \"+\" || modifier === \"*\") {\n\t\t\t\t// Repeatable segments\n\t\t\t\tif (value === undefined && modifier === \"+\") {\n\t\t\t\t\tthrow new Error(`Missing value for \"${name}\" (one or more required)`);\n\t\t\t\t}\n\t\t\t\treturn value ? `${slash}${value}` : \"\";\n\t\t\t}\n\n\t\t\t// Simple named group (no modifier)\n\t\t\tif (value === undefined) {\n\t\t\t\tthrow new Error(`Missing value for \"${name}\"`);\n\t\t\t}\n\n\t\t\treturn `${slash}${value}`;\n\t\t}\n\t);\n\n\t// Restore port numbers\n\tfilled = filled.replace(/#PORT-(\\d+)#/g, \":$1\");\n\n\treturn new URL(filled, origin);\n}\n\n/**\n * Aggregates named groups from various parts of the URLPattern match result.\n *\n *\n * @param {any} match - The URLPattern match result object.\n * @returns {Record<string, string | null | undefined>} An object containing all named groups from the match.\n */\nexport function aggregateGroups(match) {\n\treturn {\n\t\t...match.hash.groups,\n\t\t...match.hostname.groups,\n\t\t...match.password.groups,\n\t\t...match.pathname.groups,\n\t\t...match.port.groups,\n\t\t...match.protocol.groups,\n\t\t...match.search.groups,\n\t\t...match.username.groups,\n\t};\n}\n\n/** @type {Map<string, URLPattern>} */\nconst urlPatternCache = new Map();\n\nconst URL_PATTERN_CACHE_LIMIT = 128;\nconst ABSOLUTE_URL_PATTERN = /^(?:[A-Za-z][A-Za-z\\d+.-]*|:[A-Za-z][A-Za-z\\d_-]*):\\/\\//;\n\n/**\n * URLPattern's base URL affects relative patterns. Absolute patterns only\n * depend on the pattern itself, while root-relative patterns also depend on\n * the URL origin. Other relative patterns are deliberately not cached because\n * their semantics depend on the complete base URL.\n *\n * @param {string} pattern\n * @param {URL} url\n * @returns {URLPattern}\n */\nfunction getUrlPattern(pattern, url) {\n\tconst isAbsolutePattern = ABSOLUTE_URL_PATTERN.test(pattern);\n\tconst isRootRelativePattern = pattern.startsWith(\"/\");\n\tif (!isAbsolutePattern && !isRootRelativePattern) {\n\t\treturn new URLPattern(pattern, url.href);\n\t}\n\n\tconst key = isAbsolutePattern\n\t\t? pattern\n\t\t: JSON.stringify([url.origin, pattern]);\n\tconst cached = urlPatternCache.get(key);\n\tif (cached !== undefined) {\n\t\t// Refresh the entry so frequently used patterns stay in the bounded cache.\n\t\turlPatternCache.delete(key);\n\t\turlPatternCache.set(key, cached);\n\t\treturn cached;\n\t}\n\n\tconst compiled = new URLPattern(pattern, url.href);\n\tif (urlPatternCache.size >= URL_PATTERN_CACHE_LIMIT) {\n\t\tconst oldestKey = urlPatternCache.keys().next().value;\n\t\tif (oldestKey !== undefined) urlPatternCache.delete(oldestKey);\n\t}\n\turlPatternCache.set(key, compiled);\n\treturn compiled;\n}\n\n/**\n * A small, deliberately conservative subset of URLPattern routing.\n *\n * The compiler emits routes such as `/:path(.*)?`, `/de/:path*`, or\n * `https://example.com/:path*`. For those routes matching is equivalent to a\n * pathname prefix check and (optionally) an origin check. Everything that has\n * a dynamic host, a custom path regexp, or another URLPattern modifier keeps\n * using the generic implementation above.\n *\n * @typedef {{\n * protocol: string | undefined;\n * hostname: string | undefined;\n * port: string | undefined;\n * pathnamePrefix: string;\n * pathMode: \"segments\" | \"catch-all-optional\" | \"catch-all-required\";\n * }} FastPathPattern\n * @typedef {{\n * base: FastPathPattern;\n * localized: Array<{ locale: string; pattern: FastPathPattern }>;\n * }} FastPathRoute\n */\n\n/** @type {WeakMap<object, FastPathRoute | null>} */\nconst fastPathRouteCache = new WeakMap();\n\n/**\n * @param {URL} urlObj\n * @param {string} targetLocale\n * @param {{ pattern: string; localized: Array<[string, string]> }} element\n * @returns {URL | undefined}\n */\nfunction localizeUrlFastPath(urlObj, targetLocale, element) {\n\tconst route = getFastPathRoute(element);\n\tif (route === null) return undefined;\n\n\t// Preserve URLPattern's ordering: localized patterns are checked before\n\t// the unlocalized pattern, and the first matching pattern wins.\n\tfor (const localized of route.localized) {\n\t\tconst suffix = matchFastPathPattern(localized.pattern, urlObj);\n\t\tif (suffix === undefined) continue;\n\n\t\tconst target = route.localized.find(\n\t\t\t(candidate) => candidate.locale === targetLocale\n\t\t)?.pattern;\n\t\tif (target === undefined) continue;\n\n\t\treturn applyFastPathPattern(target, suffix, urlObj);\n\t}\n\n\tconst suffix = matchFastPathPattern(route.base, urlObj);\n\tif (suffix !== undefined) {\n\t\tconst target = route.localized.find(\n\t\t\t(candidate) => candidate.locale === targetLocale\n\t\t)?.pattern;\n\t\tif (target !== undefined) {\n\t\t\treturn applyFastPathPattern(target, suffix, urlObj);\n\t\t}\n\t}\n\n\treturn undefined;\n}\n\n/**\n * @param {URL} urlObj\n * @param {{ pattern: string; localized: Array<[string, string]> }} element\n * @returns {URL | undefined}\n */\nfunction deLocalizeUrlFastPath(urlObj, element) {\n\tconst route = getFastPathRoute(element);\n\tif (route === null) return undefined;\n\n\tfor (const localized of route.localized) {\n\t\tconst suffix = matchFastPathPattern(localized.pattern, urlObj);\n\t\tif (suffix !== undefined) {\n\t\t\treturn applyFastPathPattern(route.base, suffix, urlObj);\n\t\t}\n\t}\n\n\tconst suffix = matchFastPathPattern(route.base, urlObj);\n\tif (suffix !== undefined) {\n\t\treturn applyFastPathPattern(route.base, suffix, urlObj);\n\t}\n\n\treturn undefined;\n}\n\n/**\n * @param {{ pattern: string; localized: Array<[string, string]> }} element\n * @returns {FastPathRoute | null}\n */\nfunction getFastPathRoute(element) {\n\tconst cached = fastPathRouteCache.get(element);\n\tif (cached !== undefined) return cached;\n\n\tconst base = parseFastPathPattern(element.pattern);\n\tif (base === undefined) {\n\t\tfastPathRouteCache.set(element, null);\n\t\treturn null;\n\t}\n\n\tconst localized = [];\n\tfor (const [locale, pattern] of element.localized) {\n\t\tconst parsed = parseFastPathPattern(pattern);\n\t\tif (parsed === undefined || parsed.pathMode !== base.pathMode) {\n\t\t\tfastPathRouteCache.set(element, null);\n\t\t\treturn null;\n\t\t}\n\t\tlocalized.push({ locale, pattern: parsed });\n\t}\n\n\tconst route = { base, localized };\n\tfastPathRouteCache.set(element, route);\n\treturn route;\n}\n\n/**\n * Parse only catch-all path patterns. In particular, do not treat `:path(.)?`\n * as a catch-all: URLPattern's `(.)` means exactly one character and cannot be\n * represented by this prefix matcher without changing routing semantics.\n *\n * @param {string} pattern\n * @returns {FastPathPattern | undefined}\n */\nfunction parseFastPathPattern(pattern) {\n\tconst wildcard = pattern.match(/\\/:path(?:\\(\\.\\*\\)(?:\\?)?|\\*)$/);\n\tif (wildcard === null || wildcard.index === undefined) return undefined;\n\n\tconst prefix = pattern.slice(0, wildcard.index);\n\tconst originAndPath = parseFastPathOriginAndPath(prefix);\n\tif (originAndPath === undefined) return undefined;\n\tconst pathMode = wildcard[0].endsWith(\"*\")\n\t\t? \"segments\"\n\t\t: wildcard[0].endsWith(\"?\")\n\t\t\t? \"catch-all-optional\"\n\t\t\t: \"catch-all-required\";\n\n\treturn { ...originAndPath, pathMode };\n}\n\n/**\n * @param {string} prefix\n * @returns {FastPathPattern | undefined}\n */\nfunction parseFastPathOriginAndPath(prefix) {\n\tif (prefix === \"\" || prefix.startsWith(\"/\")) {\n\t\tif (hasUrlPatternSyntax(prefix)) return undefined;\n\t\treturn {\n\t\t\tprotocol: undefined,\n\t\t\thostname: undefined,\n\t\t\tport: undefined,\n\t\t\tpathnamePrefix: normalizePathPrefix(prefix),\n\t\t\tpathMode: \"catch-all-optional\",\n\t\t};\n\t}\n\n\t// A `:protocol://host` pattern is common in generated configurations. The\n\t// protocol is intentionally left unconstrained, just like URLPattern.\n\tconst dynamicProtocol = prefix.match(/^:protocol:\\/\\/([^/]+)(\\/.*)?$/);\n\tconst staticOrigin = prefix.match(\n\t\t/^([A-Za-z][A-Za-z\\d+.-]*):\\/\\/([^/]+)(\\/.*)?$/\n\t);\n\tif (dynamicProtocol !== null) {\n\t\tconst dynamicHost = dynamicProtocol[1] ?? \"\";\n\t\tconst hostMatch = dynamicHost.match(/^([^:(){}?*+]+)(?::(\\d+))?$/);\n\t\tif (\n\t\t\thostMatch === null ||\n\t\t\t(dynamicProtocol[2] !== undefined &&\n\t\t\t\thasUrlPatternSyntax(dynamicProtocol[2]))\n\t\t) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn {\n\t\t\tprotocol: undefined,\n\t\t\thostname: (hostMatch[1] ?? \"\").toLowerCase(),\n\t\t\tport: hostMatch[2],\n\t\t\tpathnamePrefix: normalizePathPrefix(dynamicProtocol[2] ?? \"\"),\n\t\t\tpathMode: \"catch-all-optional\",\n\t\t};\n\t}\n\n\tif (staticOrigin === null) return undefined;\n\n\tconst host = staticOrigin[2] ?? \"\";\n\tconst pathname = staticOrigin[3];\n\tconst hostMatch = host.match(/^([^:(){}?*+]+)(?::(\\d+))?$/);\n\tif (\n\t\thostMatch === null ||\n\t\t(pathname !== undefined && hasUrlPatternSyntax(pathname))\n\t) {\n\t\treturn undefined;\n\t}\n\n\treturn {\n\t\tprotocol: `${staticOrigin[1]}:`,\n\t\thostname: (hostMatch[1] ?? \"\").toLowerCase(),\n\t\tport: normalizePatternPort(hostMatch[2], `${staticOrigin[1]}:`),\n\t\tpathnamePrefix: normalizePathPrefix(pathname ?? \"\"),\n\t\tpathMode: \"catch-all-optional\",\n\t};\n}\n\n/**\n * @param {string | undefined} port\n * @param {string} protocol\n * @returns {string | undefined}\n */\nfunction normalizePatternPort(port, protocol) {\n\tif (port === \"80\" && protocol === \"http:\") return \"\";\n\tif (port === \"443\" && protocol === \"https:\") return \"\";\n\treturn port;\n}\n\n/**\n * @param {string} value\n * @returns {boolean}\n */\nfunction hasUrlPatternSyntax(value) {\n\treturn /[:(){}?*+]/.test(value);\n}\n\n/**\n * @param {string} pathname\n * @returns {string}\n */\nfunction normalizePathPrefix(pathname) {\n\tif (pathname === \"\" || pathname === \"/\") return \"/\";\n\treturn pathname.endsWith(\"/\") ? pathname.slice(0, -1) : pathname;\n}\n\n/**\n * @param {FastPathPattern} pattern\n * @param {URL} urlObj\n * @returns {string | undefined}\n */\nfunction matchFastPathPattern(pattern, urlObj) {\n\tif (pattern.protocol !== undefined && pattern.protocol !== urlObj.protocol) {\n\t\treturn undefined;\n\t}\n\tif (\n\t\tpattern.hostname !== undefined &&\n\t\tpattern.hostname !== urlObj.hostname.toLowerCase()\n\t) {\n\t\treturn undefined;\n\t}\n\tif (pattern.hostname !== undefined) {\n\t\tconst expectedPort =\n\t\t\tpattern.port ?? defaultPortForProtocol(pattern.protocol ?? urlObj.protocol);\n\t\tif (expectedPort !== urlObj.port) return undefined;\n\t}\n\n\tconst prefix = pattern.pathnamePrefix;\n\tif (prefix === \"/\") {\n\t\tif (urlObj.pathname.startsWith(\"//\")) return undefined;\n\t\tif (pattern.pathMode === \"segments\") {\n\t\t\treturn isNonEmptyPathSegments(urlObj.pathname)\n\t\t\t\t? urlObj.pathname\n\t\t\t\t: undefined;\n\t\t}\n\t\treturn urlObj.pathname;\n\t}\n\tif (urlObj.pathname === prefix) {\n\t\treturn pattern.pathMode === \"catch-all-required\" ? undefined : \"\";\n\t}\n\tif (urlObj.pathname.startsWith(`${prefix}/`)) {\n\t\tconst suffix = urlObj.pathname.slice(prefix.length);\n\t\tif (suffix.startsWith(\"//\")) return undefined;\n\t\tif (\n\t\t\tpattern.pathMode === \"segments\" &&\n\t\t\t!isNonEmptyPathSegments(suffix)\n\t\t) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn suffix;\n\t}\n\treturn undefined;\n}\n\n/**\n * @param {string} pathname\n * @returns {boolean}\n */\nfunction isNonEmptyPathSegments(pathname) {\n\treturn pathname.length > 1 && !pathname.endsWith(\"/\") && !pathname.includes(\"//\");\n}\n\n/**\n * URLPattern treats the default port as empty in URL instances.\n *\n * @param {string} protocol\n * @returns {string}\n */\nfunction defaultPortForProtocol(protocol) {\n\tif (protocol === \"http:\") return \"\";\n\tif (protocol === \"https:\") return \"\";\n\treturn \"\";\n}\n\n/**\n * @param {FastPathPattern} pattern\n * @param {string} suffix\n * @param {URL} source\n * @returns {URL}\n */\nfunction applyFastPathPattern(pattern, suffix, source) {\n\tconst localized = new URL(source.href);\n\tif (pattern.protocol !== undefined) localized.protocol = pattern.protocol;\n\tif (pattern.hostname !== undefined) {\n\t\tlocalized.hostname = pattern.hostname;\n\t\tlocalized.port =\n\t\t\tpattern.port ?? defaultPortForProtocol(localized.protocol);\n\t}\n\tlocalized.pathname = joinFastPathPrefix(pattern.pathnamePrefix, suffix);\n\treturn localized;\n}\n\n/**\n * @param {string} prefix\n * @param {string} suffix\n * @returns {string}\n */\nfunction joinFastPathPrefix(prefix, suffix) {\n\tif (prefix === \"/\") return suffix === \"\" ? \"/\" : suffix;\n\tif (suffix === \"\") return prefix;\n\treturn `${prefix}${suffix.startsWith(\"/\") ? suffix : `/${suffix}`}`;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"localize-url.js","sourceRoot":"","sources":["../../../src/compiler/runtime/localize-url.js"],"names":[],"mappings":"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","sourcesContent":["import { extractLocaleFromUrl } from \"./extract-locale-from-url.js\";\nimport { getLocale } from \"./get-locale.js\";\nimport { getUrlOrigin } from \"./get-url-origin.js\";\nimport { assertIsLocale, toLocale } from \"./check-locale.js\";\nimport {\n\tbaseLocale,\n\tTREE_SHAKE_DEFAULT_URL_PATTERN_USED,\n\ttrailingSlash,\n\turlPatterns,\n} from \"./variables.js\";\nimport { normalizeTrailingSlash } from \"./normalize-trailing-slash.js\";\nimport { execUrlPattern } from \"./exec-url-pattern.js\";\n\n/**\n * Lower-level URL localization function, primarily used in server contexts.\n *\n * This function is designed for server-side usage where you need precise control\n * over URL localization, such as in middleware or request handlers. It works with\n * URL objects and always returns absolute URLs.\n *\n * For client-side UI components, use `localizeHref()` instead, which provides\n * a more convenient API with relative paths and automatic locale detection.\n *\n * @see https://paraglidejs.com/i18n-routing\n *\n * @example\n * ```typescript\n * // Server middleware example\n * app.use((req, res, next) => {\n * const url = new URL(req.url, `${req.protocol}://${req.headers.host}`);\n * const localized = localizeUrl(url, { locale: \"de\" });\n *\n * if (localized.href !== url.href) {\n * return res.redirect(localized.href);\n * }\n * next();\n * });\n * ```\n *\n * @example\n * ```typescript\n * // Using with URL patterns\n * const url = new URL(\"https://example.com/about\");\n * localizeUrl(url, { locale: \"de\" });\n * // => URL(\"https://example.com/de/about\")\n *\n * // Using with domain-based localization\n * const url = new URL(\"https://example.com/store\");\n * localizeUrl(url, { locale: \"de\" });\n * // => URL(\"https://de.example.com/store\")\n * ```\n *\n * @param {string | URL} url - The URL to localize. If string, must be absolute.\n * @param {object} [options] - Options for localization\n * @param {Locale} [options.locale] - Target locale. If not provided, uses getLocale()\n * @returns {URL} The localized URL, always absolute\n */\nexport function localizeUrl(url, options) {\n\tconst targetLocale = options?.locale\n\t\t? assertIsLocale(options?.locale)\n\t\t: getLocale();\n\n\tif (TREE_SHAKE_DEFAULT_URL_PATTERN_USED) {\n\t\treturn localizeUrlDefaultPattern(url, targetLocale);\n\t}\n\n\tconst originalUrl = typeof url === \"string\" ? new URL(url) : url;\n\tconst urlObj =\n\t\ttrailingSlash === undefined\n\t\t\t? originalUrl\n\t\t\t: normalizeTrailingSlash(new URL(originalUrl));\n\n\t// Iterate over URL patterns\n\tfor (const element of urlPatterns) {\n\t\t// Most applications use a locale prefix (and sometimes a fixed domain)\n\t\t// with a trailing catch-all path. Those routes do not need URLPattern's\n\t\t// parser or matcher on every call. Keep the generic matcher below as the\n\t\t// fallback for every other URLPattern shape. This stays inside the outer\n\t\t// loop so specific patterns retain precedence over a later catch-all.\n\t\tconst fastPathLocalized = localizeUrlFastPath(\n\t\t\turlObj,\n\t\t\ttargetLocale,\n\t\t\telement\n\t\t);\n\t\tif (fastPathLocalized !== undefined) {\n\t\t\treturn fastPathLocalized;\n\t\t}\n\n\t\t// match localized patterns\n\t\tfor (const [, localizedPattern] of element.localized) {\n\t\t\tconst match = execUrlPattern(\n\t\t\t\tgetUrlPattern(localizedPattern, urlObj),\n\t\t\t\turlObj\n\t\t\t);\n\n\t\t\tif (!match) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst targetPattern = element.localized.find(\n\t\t\t\t([locale]) => locale === targetLocale\n\t\t\t)?.[1];\n\n\t\t\tif (!targetPattern) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst localizedUrl = fillPattern(\n\t\t\t\ttargetPattern,\n\t\t\t\taggregateGroups(match),\n\t\t\t\turlObj.origin\n\t\t\t);\n\t\t\treturn normalizeTrailingSlash(fillMissingUrlParts(localizedUrl, match));\n\t\t}\n\t\tconst unlocalizedMatch = execUrlPattern(\n\t\t\tgetUrlPattern(element.pattern, urlObj),\n\t\t\turlObj\n\t\t);\n\t\tif (unlocalizedMatch) {\n\t\t\tconst targetPattern = element.localized.find(\n\t\t\t\t([locale]) => locale === targetLocale\n\t\t\t)?.[1];\n\t\t\tif (targetPattern) {\n\t\t\t\tconst localizedUrl = fillPattern(\n\t\t\t\t\ttargetPattern,\n\t\t\t\t\taggregateGroups(unlocalizedMatch),\n\t\t\t\t\turlObj.origin\n\t\t\t\t);\n\t\t\t\treturn normalizeTrailingSlash(\n\t\t\t\t\tfillMissingUrlParts(localizedUrl, unlocalizedMatch)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\t// If no match found, return the original URL\n\treturn originalUrl;\n}\n\n/**\n * https://github.com/opral/inlang-paraglide-js/issues/381\n *\n * @param {string | URL} url\n * @param {Locale} locale\n * @returns {URL}\n */\nfunction localizeUrlDefaultPattern(url, locale) {\n\tconst urlObj = normalizeTrailingSlash(\n\t\ttypeof url === \"string\" ? new URL(url, getUrlOrigin()) : new URL(url)\n\t);\n\n\tconst currentLocale = extractLocaleFromUrl(urlObj);\n\n\t// If current locale matches target locale, no change needed\n\tif (currentLocale === locale) {\n\t\treturn normalizeTrailingSlash(urlObj);\n\t}\n\n\t// Ignore leading separators like locale detection, preserving the remaining path.\n\tconst pathSegments = urlObj.pathname.replace(/^\\/+/, \"\").split(\"/\");\n\n\t// If current path starts with a locale, remove it\n\tif (pathSegments.length > 0 && toLocale(pathSegments[0])) {\n\t\tpathSegments.shift();\n\t}\n\n\t// For base locale, don't add prefix\n\tif (locale === baseLocale) {\n\t\turlObj.pathname = \"/\" + pathSegments.join(\"/\");\n\t} else {\n\t\t// For other locales, add prefix\n\t\turlObj.pathname = \"/\" + locale + \"/\" + pathSegments.join(\"/\");\n\t}\n\n\treturn normalizeTrailingSlash(urlObj);\n}\n\n/**\n * Low-level URL de-localization function, primarily used in server contexts.\n *\n * This function is designed for server-side usage where you need precise control\n * over URL de-localization, such as in middleware or request handlers. It works with\n * URL objects and always returns absolute URLs.\n *\n * For client-side UI components, use `deLocalizeHref()` instead, which provides\n * a more convenient API with relative paths.\n *\n * @see https://paraglidejs.com/i18n-routing\n *\n * @example\n * ```typescript\n * // Server middleware example\n * app.use((req, res, next) => {\n * const url = new URL(req.url, `${req.protocol}://${req.headers.host}`);\n * const baseUrl = deLocalizeUrl(url);\n *\n * // Store the base URL for later use\n * req.baseUrl = baseUrl;\n * next();\n * });\n * ```\n *\n * @example\n * ```typescript\n * // Using with URL patterns\n * const url = new URL(\"https://example.com/de/about\");\n * deLocalizeUrl(url); // => URL(\"https://example.com/about\")\n *\n * // Using with domain-based localization\n * const url = new URL(\"https://de.example.com/store\");\n * deLocalizeUrl(url); // => URL(\"https://example.com/store\")\n * ```\n *\n * @param {string | URL} url - The URL to de-localize. If string, must be absolute.\n * @returns {URL} The de-localized URL, always absolute\n */\nexport function deLocalizeUrl(url) {\n\tif (TREE_SHAKE_DEFAULT_URL_PATTERN_USED) {\n\t\treturn deLocalizeUrlDefaultPattern(url);\n\t}\n\n\tconst originalUrl = typeof url === \"string\" ? new URL(url) : url;\n\tconst urlObj =\n\t\ttrailingSlash === undefined\n\t\t\t? originalUrl\n\t\t\t: normalizeTrailingSlash(new URL(originalUrl));\n\n\t// Iterate over URL patterns\n\tfor (const element of urlPatterns) {\n\t\tconst fastPathDeLocalized = deLocalizeUrlFastPath(urlObj, element);\n\t\tif (fastPathDeLocalized !== undefined) {\n\t\t\treturn fastPathDeLocalized;\n\t\t}\n\n\t\t// Iterate over localized versions\n\t\tfor (const [, localizedPattern] of element.localized) {\n\t\t\tconst match = execUrlPattern(\n\t\t\t\tgetUrlPattern(localizedPattern, urlObj),\n\t\t\t\turlObj\n\t\t\t);\n\n\t\t\tif (match) {\n\t\t\t\t// Convert localized URL back to the base pattern\n\t\t\t\tconst groups = aggregateGroups(match);\n\n\t\t\t\tconst baseUrl = fillPattern(element.pattern, groups, urlObj.origin);\n\t\t\t\treturn normalizeTrailingSlash(fillMissingUrlParts(baseUrl, match));\n\t\t\t}\n\t\t}\n\t\t// match unlocalized pattern\n\t\tconst unlocalizedMatch = execUrlPattern(\n\t\t\tgetUrlPattern(element.pattern, urlObj),\n\t\t\turlObj\n\t\t);\n\t\tif (unlocalizedMatch) {\n\t\t\tconst baseUrl = fillPattern(\n\t\t\t\telement.pattern,\n\t\t\t\taggregateGroups(unlocalizedMatch),\n\t\t\t\turlObj.origin\n\t\t\t);\n\t\t\treturn normalizeTrailingSlash(\n\t\t\t\tfillMissingUrlParts(baseUrl, unlocalizedMatch)\n\t\t\t);\n\t\t}\n\t}\n\t// no match found return the original url\n\treturn originalUrl;\n}\n\n/**\n * De-localizes a URL using the default pattern (/:locale/*)\n * @param {string|URL} url\n * @returns {URL}\n */\nfunction deLocalizeUrlDefaultPattern(url) {\n\tconst urlObj = normalizeTrailingSlash(\n\t\ttypeof url === \"string\" ? new URL(url, getUrlOrigin()) : new URL(url)\n\t);\n\t// Ignore leading separators like locale detection, preserving the remaining path.\n\tconst pathSegments = urlObj.pathname.replace(/^\\/+/, \"\").split(\"/\");\n\n\t// If first segment is a locale, remove it\n\tif (pathSegments.length > 0 && toLocale(pathSegments[0])) {\n\t\turlObj.pathname = \"/\" + pathSegments.slice(1).join(\"/\");\n\t}\n\n\treturn normalizeTrailingSlash(urlObj);\n}\n\n/**\n * Takes matches of implicit wildcards in the UrlPattern (when a part is missing\n * it is equal to '*') and adds them back to the result of fillPattern.\n *\n * At least protocol and hostname are required to create a valid URL inside fillPattern.\n *\n * @param {URL} url\n * @param {any} match\n * @returns {URL}\n */\nfunction fillMissingUrlParts(url, match) {\n\tif (match.protocol.groups[\"0\"]) {\n\t\turl.protocol = match.protocol.groups[\"0\"] ?? \"\";\n\t}\n\tif (match.hostname.groups[\"0\"]) {\n\t\turl.hostname = match.hostname.groups[\"0\"] ?? \"\";\n\t}\n\tif (match.username.groups[\"0\"]) {\n\t\turl.username = match.username.groups[\"0\"] ?? \"\";\n\t}\n\tif (match.password.groups[\"0\"]) {\n\t\turl.password = match.password.groups[\"0\"] ?? \"\";\n\t}\n\tif (match.port.groups[\"0\"]) {\n\t\turl.port = match.port.groups[\"0\"] ?? \"\";\n\t}\n\tif (match.pathname.groups[\"0\"]) {\n\t\turl.pathname = match.pathname.groups[\"0\"] ?? \"\";\n\t}\n\tif (match.search.groups[\"0\"]) {\n\t\turl.search = match.search.groups[\"0\"] ?? \"\";\n\t}\n\tif (match.hash.groups[\"0\"]) {\n\t\turl.hash = match.hash.groups[\"0\"] ?? \"\";\n\t}\n\n\treturn url;\n}\n\n/**\n * Fills a URL pattern with values for named groups, supporting all URLPattern-style modifiers.\n *\n * This function will eventually be replaced by https://github.com/whatwg/urlpattern/issues/73\n *\n * Matches:\n * - :name -> Simple\n * - :name? -> Optional\n * - :name+ -> One or more\n * - :name* -> Zero or more\n * - :name(...) -> Regex group\n * - {text} -> Group delimiter\n * - {text}? -> Optional group delimiter\n *\n * If the value is `null`, the segment is removed.\n *\n * @param {string} pattern - The URL pattern containing named groups.\n * @param {Record<string, string | null | undefined>} values - Object of values for named groups.\n * @param {string} origin - Base URL to use for URL construction.\n * @returns {URL} - The constructed URL with named groups filled.\n */\nfunction fillPattern(pattern, values, origin) {\n\t// Pre-process the pattern to handle explicit port numbers\n\t// This detects patterns like \"http://localhost:5173\" and protects the port number\n\t// from being interpreted as a parameter\n\tlet processedPattern = pattern.replace(\n\t\t/(https?:\\/\\/[^:/]+):(\\d+)(\\/|$)/g,\n\t\t(_, protocol, port, slash) => {\n\t\t\t// Replace \":5173\" with \"#PORT-5173#\" to protect it from parameter replacement\n\t\t\treturn `${protocol}#PORT-${port}#${slash}`;\n\t\t}\n\t);\n\n\t// First, handle group delimiters with curly braces\n\tlet processedGroupDelimiters = processedPattern.replace(\n\t\t/\\{([^{}]*)\\}([?+*]?)/g,\n\t\t(_, content, modifier) => {\n\t\t\t// For optional group delimiters\n\t\t\tif (modifier === \"?\") {\n\t\t\t\t// For optional groups, we'll include the content\n\t\t\t\treturn content;\n\t\t\t}\n\t\t\t// For non-optional group delimiters, always include the content\n\t\t\treturn content;\n\t\t}\n\t);\n\n\t// Then handle named groups\n\tlet filled = processedGroupDelimiters.replace(\n\t\t/(\\/?):([a-zA-Z0-9_]+)(\\([^)]*\\))?([?+*]?)/g,\n\t\t(_, slash, name, __, modifier) => {\n\t\t\tconst value = values[name];\n\n\t\t\tif (value === null) {\n\t\t\t\t// If value is null, remove the entire segment including the preceding slash\n\t\t\t\treturn \"\";\n\t\t\t}\n\n\t\t\tif (modifier === \"?\") {\n\t\t\t\t// Optional segment\n\t\t\t\treturn value !== undefined ? `${slash}${value}` : \"\";\n\t\t\t}\n\n\t\t\tif (modifier === \"+\" || modifier === \"*\") {\n\t\t\t\t// Repeatable segments\n\t\t\t\tif (value === undefined && modifier === \"+\") {\n\t\t\t\t\tthrow new Error(`Missing value for \"${name}\" (one or more required)`);\n\t\t\t\t}\n\t\t\t\treturn value ? `${slash}${value}` : \"\";\n\t\t\t}\n\n\t\t\t// Simple named group (no modifier)\n\t\t\tif (value === undefined) {\n\t\t\t\tthrow new Error(`Missing value for \"${name}\"`);\n\t\t\t}\n\n\t\t\treturn `${slash}${value}`;\n\t\t}\n\t);\n\n\t// Restore port numbers\n\tfilled = filled.replace(/#PORT-(\\d+)#/g, \":$1\");\n\n\treturn new URL(filled, origin);\n}\n\n/**\n * Aggregates named groups from various parts of the URLPattern match result.\n *\n *\n * @param {any} match - The URLPattern match result object.\n * @returns {Record<string, string | null | undefined>} An object containing all named groups from the match.\n */\nexport function aggregateGroups(match) {\n\treturn {\n\t\t...match.hash.groups,\n\t\t...match.hostname.groups,\n\t\t...match.password.groups,\n\t\t...match.pathname.groups,\n\t\t...match.port.groups,\n\t\t...match.protocol.groups,\n\t\t...match.search.groups,\n\t\t...match.username.groups,\n\t};\n}\n\n/** @type {Map<string, URLPattern>} */\nconst urlPatternCache = new Map();\n\nconst URL_PATTERN_CACHE_LIMIT = 128;\nconst ABSOLUTE_URL_PATTERN = /^(?:[A-Za-z][A-Za-z\\d+.-]*|:[A-Za-z][A-Za-z\\d_-]*):\\/\\//;\n\n/**\n * URLPattern's base URL affects relative patterns. Absolute patterns only\n * depend on the pattern itself, while root-relative patterns also depend on\n * the URL origin. Other relative patterns are deliberately not cached because\n * their semantics depend on the complete base URL.\n *\n * @param {string} pattern\n * @param {URL} url\n * @returns {URLPattern}\n */\nfunction getUrlPattern(pattern, url) {\n\tconst isAbsolutePattern = ABSOLUTE_URL_PATTERN.test(pattern);\n\tconst isRootRelativePattern = pattern.startsWith(\"/\");\n\tif (!isAbsolutePattern && !isRootRelativePattern) {\n\t\treturn new URLPattern(pattern, url.href);\n\t}\n\n\tconst key = isAbsolutePattern\n\t\t? pattern\n\t\t: JSON.stringify([url.origin, pattern]);\n\tconst cached = urlPatternCache.get(key);\n\tif (cached !== undefined) {\n\t\t// Refresh the entry so frequently used patterns stay in the bounded cache.\n\t\turlPatternCache.delete(key);\n\t\turlPatternCache.set(key, cached);\n\t\treturn cached;\n\t}\n\n\tconst compiled = new URLPattern(pattern, url.href);\n\tif (urlPatternCache.size >= URL_PATTERN_CACHE_LIMIT) {\n\t\tconst oldestKey = urlPatternCache.keys().next().value;\n\t\tif (oldestKey !== undefined) urlPatternCache.delete(oldestKey);\n\t}\n\turlPatternCache.set(key, compiled);\n\treturn compiled;\n}\n\n/**\n * A small, deliberately conservative subset of URLPattern routing.\n *\n * The compiler emits routes such as `/:path(.*)?`, `/de/:path*`, or\n * `https://example.com/:path*`. For those routes matching is equivalent to a\n * pathname prefix check and (optionally) an origin check. Everything that has\n * a dynamic host, a custom path regexp, or another URLPattern modifier keeps\n * using the generic implementation above.\n *\n * @typedef {{\n * protocol: string | undefined;\n * hostname: string | undefined;\n * port: string | undefined;\n * pathnamePrefix: string;\n * pathMode: \"segments\" | \"catch-all-optional\" | \"catch-all-required\";\n * }} FastPathPattern\n * @typedef {{\n * base: FastPathPattern;\n * localized: Array<{ locale: string; pattern: FastPathPattern }>;\n * }} FastPathRoute\n */\n\n/** @type {WeakMap<object, FastPathRoute | null>} */\nconst fastPathRouteCache = new WeakMap();\n\n/**\n * @param {URL} urlObj\n * @param {string} targetLocale\n * @param {{ pattern: string; localized: Array<[string, string]> }} element\n * @returns {URL | undefined}\n */\nfunction localizeUrlFastPath(urlObj, targetLocale, element) {\n\tconst route = getFastPathRoute(element);\n\tif (route === null) return undefined;\n\n\t// Preserve URLPattern's ordering: localized patterns are checked before\n\t// the unlocalized pattern, and the first matching pattern wins.\n\tfor (const localized of route.localized) {\n\t\tconst suffix = matchFastPathPattern(localized.pattern, urlObj);\n\t\tif (suffix === undefined) continue;\n\n\t\tconst target = route.localized.find(\n\t\t\t(candidate) => candidate.locale === targetLocale\n\t\t)?.pattern;\n\t\tif (target === undefined) continue;\n\n\t\treturn applyFastPathPattern(target, suffix, urlObj);\n\t}\n\n\tconst suffix = matchFastPathPattern(route.base, urlObj);\n\tif (suffix !== undefined) {\n\t\tconst target = route.localized.find(\n\t\t\t(candidate) => candidate.locale === targetLocale\n\t\t)?.pattern;\n\t\tif (target !== undefined) {\n\t\t\treturn applyFastPathPattern(target, suffix, urlObj);\n\t\t}\n\t}\n\n\treturn undefined;\n}\n\n/**\n * @param {URL} urlObj\n * @param {{ pattern: string; localized: Array<[string, string]> }} element\n * @returns {URL | undefined}\n */\nfunction deLocalizeUrlFastPath(urlObj, element) {\n\tconst route = getFastPathRoute(element);\n\tif (route === null) return undefined;\n\n\tfor (const localized of route.localized) {\n\t\tconst suffix = matchFastPathPattern(localized.pattern, urlObj);\n\t\tif (suffix !== undefined) {\n\t\t\treturn applyFastPathPattern(route.base, suffix, urlObj);\n\t\t}\n\t}\n\n\tconst suffix = matchFastPathPattern(route.base, urlObj);\n\tif (suffix !== undefined) {\n\t\treturn applyFastPathPattern(route.base, suffix, urlObj);\n\t}\n\n\treturn undefined;\n}\n\n/**\n * @param {{ pattern: string; localized: Array<[string, string]> }} element\n * @returns {FastPathRoute | null}\n */\nfunction getFastPathRoute(element) {\n\tconst cached = fastPathRouteCache.get(element);\n\tif (cached !== undefined) return cached;\n\n\tconst base = parseFastPathPattern(element.pattern);\n\tif (base === undefined) {\n\t\tfastPathRouteCache.set(element, null);\n\t\treturn null;\n\t}\n\n\tconst localized = [];\n\tfor (const [locale, pattern] of element.localized) {\n\t\tconst parsed = parseFastPathPattern(pattern);\n\t\tif (parsed === undefined || parsed.pathMode !== base.pathMode) {\n\t\t\tfastPathRouteCache.set(element, null);\n\t\t\treturn null;\n\t\t}\n\t\tlocalized.push({ locale, pattern: parsed });\n\t}\n\n\tconst route = { base, localized };\n\tfastPathRouteCache.set(element, route);\n\treturn route;\n}\n\n/**\n * Parse only catch-all path patterns. In particular, do not treat `:path(.)?`\n * as a catch-all: URLPattern's `(.)` means exactly one character and cannot be\n * represented by this prefix matcher without changing routing semantics.\n *\n * @param {string} pattern\n * @returns {FastPathPattern | undefined}\n */\nfunction parseFastPathPattern(pattern) {\n\tconst wildcard = pattern.match(/\\/:path(?:\\(\\.\\*\\)(?:\\?)?|\\*)$/);\n\tif (wildcard === null || wildcard.index === undefined) return undefined;\n\n\tconst prefix = pattern.slice(0, wildcard.index);\n\tconst originAndPath = parseFastPathOriginAndPath(prefix);\n\tif (originAndPath === undefined) return undefined;\n\tconst pathMode = wildcard[0].endsWith(\"*\")\n\t\t? \"segments\"\n\t\t: wildcard[0].endsWith(\"?\")\n\t\t\t? \"catch-all-optional\"\n\t\t\t: \"catch-all-required\";\n\n\treturn { ...originAndPath, pathMode };\n}\n\n/**\n * @param {string} prefix\n * @returns {FastPathPattern | undefined}\n */\nfunction parseFastPathOriginAndPath(prefix) {\n\tif (prefix === \"\" || prefix.startsWith(\"/\")) {\n\t\tif (hasUrlPatternSyntax(prefix)) return undefined;\n\t\treturn {\n\t\t\tprotocol: undefined,\n\t\t\thostname: undefined,\n\t\t\tport: undefined,\n\t\t\tpathnamePrefix: normalizePathPrefix(prefix),\n\t\t\tpathMode: \"catch-all-optional\",\n\t\t};\n\t}\n\n\t// A `:protocol://host` pattern is common in generated configurations. The\n\t// protocol is intentionally left unconstrained, just like URLPattern.\n\tconst dynamicProtocol = prefix.match(/^:protocol:\\/\\/([^/]+)(\\/.*)?$/);\n\tconst staticOrigin = prefix.match(\n\t\t/^([A-Za-z][A-Za-z\\d+.-]*):\\/\\/([^/]+)(\\/.*)?$/\n\t);\n\tif (dynamicProtocol !== null) {\n\t\tconst dynamicHost = dynamicProtocol[1] ?? \"\";\n\t\tconst hostMatch = dynamicHost.match(/^([^:(){}?*+]+)(?::(\\d+))?$/);\n\t\tif (\n\t\t\thostMatch === null ||\n\t\t\t(dynamicProtocol[2] !== undefined &&\n\t\t\t\thasUrlPatternSyntax(dynamicProtocol[2]))\n\t\t) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn {\n\t\t\tprotocol: undefined,\n\t\t\thostname: (hostMatch[1] ?? \"\").toLowerCase(),\n\t\t\tport: hostMatch[2],\n\t\t\tpathnamePrefix: normalizePathPrefix(dynamicProtocol[2] ?? \"\"),\n\t\t\tpathMode: \"catch-all-optional\",\n\t\t};\n\t}\n\n\tif (staticOrigin === null) return undefined;\n\n\tconst host = staticOrigin[2] ?? \"\";\n\tconst pathname = staticOrigin[3];\n\tconst hostMatch = host.match(/^([^:(){}?*+]+)(?::(\\d+))?$/);\n\tif (\n\t\thostMatch === null ||\n\t\t(pathname !== undefined && hasUrlPatternSyntax(pathname))\n\t) {\n\t\treturn undefined;\n\t}\n\n\treturn {\n\t\tprotocol: `${staticOrigin[1]}:`,\n\t\thostname: (hostMatch[1] ?? \"\").toLowerCase(),\n\t\tport: normalizePatternPort(hostMatch[2], `${staticOrigin[1]}:`),\n\t\tpathnamePrefix: normalizePathPrefix(pathname ?? \"\"),\n\t\tpathMode: \"catch-all-optional\",\n\t};\n}\n\n/**\n * @param {string | undefined} port\n * @param {string} protocol\n * @returns {string | undefined}\n */\nfunction normalizePatternPort(port, protocol) {\n\tif (port === \"80\" && protocol === \"http:\") return \"\";\n\tif (port === \"443\" && protocol === \"https:\") return \"\";\n\treturn port;\n}\n\n/**\n * @param {string} value\n * @returns {boolean}\n */\nfunction hasUrlPatternSyntax(value) {\n\treturn /[:(){}?*+]/.test(value);\n}\n\n/**\n * @param {string} pathname\n * @returns {string}\n */\nfunction normalizePathPrefix(pathname) {\n\tif (pathname === \"\" || pathname === \"/\") return \"/\";\n\treturn pathname.endsWith(\"/\") ? pathname.slice(0, -1) : pathname;\n}\n\n/**\n * @param {FastPathPattern} pattern\n * @param {URL} urlObj\n * @returns {string | undefined}\n */\nfunction matchFastPathPattern(pattern, urlObj) {\n\tif (pattern.protocol !== undefined && pattern.protocol !== urlObj.protocol) {\n\t\treturn undefined;\n\t}\n\tif (\n\t\tpattern.hostname !== undefined &&\n\t\tpattern.hostname !== urlObj.hostname.toLowerCase()\n\t) {\n\t\treturn undefined;\n\t}\n\tif (pattern.hostname !== undefined) {\n\t\tconst expectedPort =\n\t\t\tpattern.port ?? defaultPortForProtocol(pattern.protocol ?? urlObj.protocol);\n\t\tif (expectedPort !== urlObj.port) return undefined;\n\t}\n\n\tconst prefix = pattern.pathnamePrefix;\n\tif (prefix === \"/\") {\n\t\tif (urlObj.pathname.startsWith(\"//\")) return undefined;\n\t\tif (pattern.pathMode === \"segments\") {\n\t\t\treturn isNonEmptyPathSegments(urlObj.pathname)\n\t\t\t\t? urlObj.pathname\n\t\t\t\t: undefined;\n\t\t}\n\t\treturn urlObj.pathname;\n\t}\n\tif (urlObj.pathname === prefix) {\n\t\treturn pattern.pathMode === \"catch-all-required\" ? undefined : \"\";\n\t}\n\tif (urlObj.pathname.startsWith(`${prefix}/`)) {\n\t\tconst suffix = urlObj.pathname.slice(prefix.length);\n\t\tif (suffix.startsWith(\"//\")) return undefined;\n\t\tif (\n\t\t\tpattern.pathMode === \"segments\" &&\n\t\t\t!isNonEmptyPathSegments(suffix)\n\t\t) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn suffix;\n\t}\n\treturn undefined;\n}\n\n/**\n * @param {string} pathname\n * @returns {boolean}\n */\nfunction isNonEmptyPathSegments(pathname) {\n\treturn pathname.length > 1 && !pathname.endsWith(\"/\") && !pathname.includes(\"//\");\n}\n\n/**\n * URLPattern treats the default port as empty in URL instances.\n *\n * @param {string} protocol\n * @returns {string}\n */\nfunction defaultPortForProtocol(protocol) {\n\tif (protocol === \"http:\") return \"\";\n\tif (protocol === \"https:\") return \"\";\n\treturn \"\";\n}\n\n/**\n * @param {FastPathPattern} pattern\n * @param {string} suffix\n * @param {URL} source\n * @returns {URL}\n */\nfunction applyFastPathPattern(pattern, suffix, source) {\n\tconst localized = new URL(source.href);\n\tif (pattern.protocol !== undefined) localized.protocol = pattern.protocol;\n\tif (pattern.hostname !== undefined) {\n\t\tlocalized.hostname = pattern.hostname;\n\t\tlocalized.port =\n\t\t\tpattern.port ?? defaultPortForProtocol(localized.protocol);\n\t}\n\tlocalized.pathname = joinFastPathPrefix(pattern.pathnamePrefix, suffix);\n\treturn localized;\n}\n\n/**\n * @param {string} prefix\n * @param {string} suffix\n * @returns {string}\n */\nfunction joinFastPathPrefix(prefix, suffix) {\n\tif (prefix === \"/\") return suffix === \"\" ? \"/\" : suffix;\n\tif (suffix === \"\") return prefix;\n\treturn `${prefix}${suffix.startsWith(\"/\") ? suffix : `/${suffix}`}`;\n}\n"]}
|
|
@@ -501,6 +501,21 @@ test.each([
|
|
|
501
501
|
}).href).toBe("https://example.com/about");
|
|
502
502
|
expect(runtime.deLocalizeUrl("https://example.com/de/about").href).toBe("https://example.com/about");
|
|
503
503
|
expect(runtime.deLocalizeUrl("https://example.com/about").href).toBe("https://example.com/about");
|
|
504
|
+
for (const path of [
|
|
505
|
+
"/about/",
|
|
506
|
+
"/about",
|
|
507
|
+
"/nested/page/",
|
|
508
|
+
"/about/?ref=docs#section",
|
|
509
|
+
"/",
|
|
510
|
+
]) {
|
|
511
|
+
const original = new URL(path, "https://example.com");
|
|
512
|
+
const localized = new URL(original);
|
|
513
|
+
localized.pathname = "/de" + original.pathname;
|
|
514
|
+
expect(runtime.localizeUrl(original, { locale: "de" }).href).toBe(localized.href);
|
|
515
|
+
expect(runtime.localizeUrl(localized, { locale: "en" }).href).toBe(original.href);
|
|
516
|
+
expect(runtime.deLocalizeUrl(localized).href).toBe(original.href);
|
|
517
|
+
expect(runtime.localizeUrl(localized, { locale: "de" }).href).toBe(localized.href);
|
|
518
|
+
}
|
|
504
519
|
});
|
|
505
520
|
test("auto fills the url base path", async () => {
|
|
506
521
|
const runtime = await createParaglide({
|
|
@@ -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});\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":"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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 +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.25.
|
|
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.25.4\",\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@inlang/paraglide-js",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "2.25.
|
|
4
|
+
"version": "2.25.4",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"publishConfig": {
|
|
7
7
|
"access": "public",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"@inlang/recommend-sherlock": "^0.2.1",
|
|
30
|
-
"@inlang/sdk": "^3.0.
|
|
30
|
+
"@inlang/sdk": "^3.0.6",
|
|
31
31
|
"commander": "11.1.0",
|
|
32
32
|
"consola": "3.4.0",
|
|
33
33
|
"jiti": "^2.7.0",
|