@absolutejs/absolute 0.20.0-beta.169 → 0.20.0-beta.170
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/CHANGELOG.md +80 -0
- package/README.md +232 -0
- package/changelog.json +228 -0
- package/dist/angular/browser.js +7 -8
- package/dist/angular/browser.js.map +6 -5
- package/dist/angular/components/core/streamingSlotRegistrar.js +6 -2
- package/dist/angular/components/core/streamingSlotRegistry.js +7 -3
- package/dist/angular/index.js +555 -156
- package/dist/angular/index.js.map +29 -23
- package/dist/angular/server.js +555 -156
- package/dist/angular/server.js.map +29 -23
- package/dist/build/buildWorker.js +14 -8
- package/dist/build.js +4949 -1941
- package/dist/build.js.map +72 -42
- package/dist/cli/{add-7azr0c83.js → add-6a7pjkn9.js} +11 -7
- package/dist/cli/{analyze-3cyek6v3.js → analyze-606fshwa.js} +1 -1
- package/dist/cli/{build-25rz8v25.js → build-g81xqbb9.js} +1 -1
- package/dist/cli/{compile-4jnfxts9.js → compile-9y1w9zpj.js} +3 -3
- package/dist/cli/config/server.js +10699 -1538
- package/dist/cli/{dev-9tk5hn2e.js → dev-hyeb89hp.js} +5 -1
- package/dist/cli/{doctor-4nv2c2j3.js → doctor-h55y9hj1.js} +1 -1
- package/dist/cli/{generate-v75p2fct.js → generate-20x1pkf7.js} +4 -4
- package/dist/cli/{htmx-427swtdz.js → htmx-6mz2h7k1.js} +2 -2
- package/dist/cli/{index-bhbs6d5z.js → index-32ge2w1f.js} +12 -4
- package/dist/cli/{index-a4ws2jwd.js → index-3wz3mktm.js} +1 -1
- package/dist/cli/{index-b7hjgknf.js → index-9sksd8c8.js} +13 -4
- package/dist/cli/{index-eyzwc7gz.js → index-qbrzvmh9.js} +4 -2
- package/dist/cli/index-qw98g1p6.js +269 -0
- package/dist/cli/{index-434b7j4a.js → index-vtp20gwf.js} +69 -1
- package/dist/cli/{index-h7qhz02e.js → index-wk0pyxrg.js} +3 -0
- package/dist/cli/{index-k3y8cb6c.js → index-z6f43b20.js} +1 -1
- package/dist/cli/index.js +16 -16
- package/dist/cli/{islands-8sgky9gh.js → islands-dc54e5y1.js} +1 -1
- package/dist/cli/{ls-4m4yqwww.js → ls-b6zz24nt.js} +1 -1
- package/dist/cli/{mobile-hcxjr2gf.js → mobile-ajnnvqtv.js} +3 -3
- package/dist/cli/prerender-fqpp0m1j.js +10 -0
- package/dist/cli/{remove-1ycjx85k.js → remove-t8x1mrxg.js} +4 -4
- package/dist/cli/{start-mbaejxhm.js → start-d6p831ny.js} +3 -3
- package/dist/cli/{typecheck-dr068pmh.js → typecheck-stbt0qt5.js} +6 -1
- package/dist/cli/{workspace-1sycp9g1.js → workspace-61hh6jq1.js} +1 -1
- package/dist/client/chunks/index-6b66nzyf.js +381 -0
- package/dist/client/chunks/index-6b66nzyf.js.map +11 -0
- package/dist/client/chunks/{islands-rc28k5sx.js → islands-s2ta5ajb.js} +5 -2
- package/dist/client/chunks/{islands-rc28k5sx.js.map → islands-s2ta5ajb.js.map} +7 -6
- package/dist/client/index.js +160 -3
- package/dist/client/index.js.map +6 -4
- package/dist/client/navigation.js +764 -0
- package/dist/client/navigation.js.map +10 -0
- package/dist/client/prefetch.js +33 -375
- package/dist/client/prefetch.js.map +3 -4
- package/dist/core/streamingSlotRegistrar.js +5 -2
- package/dist/core/streamingSlotRegistrar.js.map +5 -4
- package/dist/core/streamingSlotRegistry.js +5 -2
- package/dist/core/streamingSlotRegistry.js.map +5 -4
- package/dist/dev/client/cspNonce.ts +28 -0
- package/dist/dev/client/handlers/html.ts +4 -3
- package/dist/dev/client/handlers/htmx.ts +3 -2
- package/dist/dev/client/handlers/svelte.ts +15 -90
- package/dist/dev/client/syncDevtools.ts +2 -1
- package/dist/dev/serverBootstrap.js +11 -4
- package/dist/i18n/index.js +543 -0
- package/dist/i18n/index.js.map +15 -0
- package/dist/index.js +6339 -2233
- package/dist/index.js.map +89 -54
- package/dist/islands/index.js +282 -40
- package/dist/islands/index.js.map +14 -10
- package/dist/mobile/browser.js +7 -2
- package/dist/mobile/browser.js.map +5 -4
- package/dist/mobile/index.js +7 -2
- package/dist/mobile/index.js.map +5 -4
- package/dist/mobile/remoteMacAgentEntry.js +1 -1
- package/dist/react/components/browser/index.js +94 -4
- package/dist/react/components/index.js +150 -10
- package/dist/react/components/index.js.map +15 -10
- package/dist/react/hooks/index.js +479 -13
- package/dist/react/hooks/index.js.map +12 -4
- package/dist/react/index.js +769 -166
- package/dist/react/index.js.map +32 -21
- package/dist/react/router/browser.js +21 -4
- package/dist/react/router/browser.js.map +5 -4
- package/dist/react/router/index.js +21 -4
- package/dist/react/router/index.js.map +5 -4
- package/dist/react/server.js +597 -203
- package/dist/react/server.js.map +25 -15
- package/dist/src/angular/zoneRuntime.d.ts +5 -0
- package/dist/src/build/buildReactServerComponents.d.ts +22 -0
- package/dist/src/build/downlevelAsyncForZone.d.ts +1 -0
- package/dist/src/build/fileRoutes.d.ts +65 -0
- package/dist/src/build/fonts/buildFonts.d.ts +25 -0
- package/dist/src/build/fonts/fallbackMetrics.d.ts +13 -0
- package/dist/src/build/fonts/googleFonts.d.ts +18 -0
- package/dist/src/build/fonts/injectFontTags.d.ts +7 -0
- package/dist/src/build/fonts/parseFontMetrics.d.ts +4 -0
- package/dist/src/build/generateReactIndexes.d.ts +7 -1
- package/dist/src/build/htmlIncludes.d.ts +16 -0
- package/dist/src/build/inlineSourceMapComment.d.ts +1 -0
- package/dist/src/build/scanConventions.d.ts +3 -0
- package/dist/src/build/vitals.d.ts +21 -0
- package/dist/src/client/formActions.d.ts +29 -0
- package/dist/src/client/index.d.ts +2 -0
- package/dist/src/client/navigation.d.ts +16 -0
- package/dist/src/client/prefetch.d.ts +2 -30
- package/dist/src/core/build.d.ts +2 -2
- package/dist/src/core/cspNonce.d.ts +12 -0
- package/dist/src/core/fileRouteAdapter.d.ts +15 -0
- package/dist/src/core/fileRoutes.d.ts +5 -0
- package/dist/src/core/formActionFlash.d.ts +25 -0
- package/dist/src/core/formActions.d.ts +249 -0
- package/dist/src/core/index.d.ts +5 -0
- package/dist/src/core/partialPrerender.d.ts +28 -0
- package/dist/src/core/partialPrerenderServe.d.ts +24 -0
- package/dist/src/core/precompressed.d.ts +11 -1
- package/dist/src/core/prerenderNonce.d.ts +9 -0
- package/dist/src/core/productionRuntime.d.ts +4 -2
- package/dist/src/core/serverOnlyStaticFiles.d.ts +8 -0
- package/dist/src/core/staticHtmlNonce.d.ts +2 -0
- package/dist/src/core/vitals.d.ts +108 -0
- package/dist/src/dev/angular/fastHmrCompiler.d.ts +1 -1
- package/dist/src/dev/client/cspNonce.d.ts +2 -0
- package/dist/src/dev/fileRouteRefresher.d.ts +5 -0
- package/dist/src/dev/importCost/instrument.d.ts +1 -1
- package/dist/src/dev/reactServerComponentsRebuild.d.ts +3 -0
- package/dist/src/i18n/defineMessages.d.ts +5 -0
- package/dist/src/i18n/formatMessage.d.ts +26 -0
- package/dist/src/i18n/index.d.ts +6 -0
- package/dist/src/i18n/intlCache.d.ts +5 -0
- package/dist/src/i18n/routing.d.ts +28 -0
- package/dist/src/i18n/translator.d.ts +11 -0
- package/dist/src/mobile/androidRelease.d.ts +2 -2
- package/dist/src/mobile/iosRelease.d.ts +4 -4
- package/dist/src/mobile/materializedBundle.d.ts +1 -1
- package/dist/src/mobile/mobileInspect.d.ts +1 -1
- package/dist/src/mobile/releaseArtifact.d.ts +2 -2
- package/dist/src/mobile/remoteMacProtocol.d.ts +2 -2
- package/dist/src/plugins/i18n.d.ts +30 -0
- package/dist/src/plugins/index.d.ts +2 -1
- package/dist/src/plugins/secureHeaders.d.ts +48 -0
- package/dist/src/react/components/Head.d.ts +1 -1
- package/dist/src/react/components/StreamSlot.browser.d.ts +1 -0
- package/dist/src/react/components/StreamSlot.d.ts +5 -1
- package/dist/src/react/components/SuspenseSlot.browser.d.ts +2 -0
- package/dist/src/react/components/SuspenseSlot.d.ts +12 -0
- package/dist/src/react/fileRoute.d.ts +18 -0
- package/dist/src/react/hooks/index.d.ts +4 -0
- package/dist/src/react/hooks/useFormAction.d.ts +42 -0
- package/dist/src/react/hooks/useI18n.d.ts +15 -0
- package/dist/src/react/index.d.ts +2 -0
- package/dist/src/react/server.d.ts +2 -0
- package/dist/src/react/serverComponents/constants.d.ts +11 -0
- package/dist/src/react/serverComponents/flightPayload.d.ts +2 -0
- package/dist/src/react/serverComponents/pageHandler.d.ts +14 -0
- package/dist/src/svelte/browser.d.ts +1 -0
- package/dist/src/svelte/fileRoute.d.ts +15 -0
- package/dist/src/svelte/i18n.d.ts +8 -0
- package/dist/src/svelte/index.d.ts +2 -0
- package/dist/src/svelte/lowerAwaitSlotSyntax.d.ts +5 -1
- package/dist/src/svelte/renderToReadableStream.d.ts +10 -2
- package/dist/src/svelte/router/browser.d.ts +3 -1
- package/dist/src/svelte/router/goto.d.ts +13 -10
- package/dist/src/svelte/router/guards.d.ts +43 -0
- package/dist/src/svelte/router/index.d.ts +3 -1
- package/dist/src/svelte/router/lazy.d.ts +17 -0
- package/dist/src/svelte/router/lazyModule.d.ts +29 -0
- package/dist/src/svelte/router/navigation.d.ts +55 -0
- package/dist/src/svelte/router/pushState.d.ts +4 -2
- package/dist/src/svelte/router/scroll.d.ts +34 -0
- package/dist/src/svelte/routerSsr.d.ts +9 -0
- package/dist/src/svelte/server.d.ts +1 -0
- package/dist/src/utils/cspNonceRef.d.ts +8 -0
- package/dist/src/utils/fontAssets.d.ts +17 -0
- package/dist/src/utils/formActionProtocol.d.ts +10 -0
- package/dist/src/utils/generateHeadElement.d.ts +1 -1
- package/dist/src/utils/index.d.ts +1 -0
- package/dist/src/utils/inlinePageCss.d.ts +18 -0
- package/dist/src/utils/loadConfig.d.ts +5 -0
- package/dist/src/utils/localeRef.d.ts +10 -0
- package/dist/src/utils/resolveConvention.d.ts +6 -1
- package/dist/src/utils/streamingSlots.d.ts +5 -0
- package/dist/src/vue/browser.d.ts +2 -0
- package/dist/src/vue/components/Image.d.ts +2 -2
- package/dist/src/vue/index.d.ts +2 -0
- package/dist/src/vue/serverDataPayload.d.ts +32 -0
- package/dist/src/vue/serverDataState.d.ts +9 -0
- package/dist/src/vue/useServerData.browser.d.ts +6 -0
- package/dist/src/vue/useServerData.d.ts +24 -0
- package/dist/svelte/browser.js +330 -3
- package/dist/svelte/browser.js.map +8 -4
- package/dist/svelte/components/AwaitSlot.svelte +5 -0
- package/dist/svelte/components/Head.svelte +50 -0
- package/dist/svelte/components/JsonLd.svelte +9 -1
- package/dist/svelte/components/StreamSlot.svelte +5 -0
- package/dist/svelte/index.js +1017 -117
- package/dist/svelte/index.js.map +38 -24
- package/dist/svelte/router/Link.svelte +40 -8
- package/dist/svelte/router/Route.svelte +157 -12
- package/dist/svelte/router/Route.svelte.d.ts +39 -5
- package/dist/svelte/router/Router.svelte +140 -25
- package/dist/svelte/router/Router.svelte.d.ts +5 -1
- package/dist/svelte/router/browser.ts +10 -0
- package/dist/svelte/router/goto.ts +15 -86
- package/dist/svelte/router/guards.ts +112 -0
- package/dist/svelte/router/index.ts +10 -0
- package/dist/svelte/router/lazy.ts +82 -0
- package/dist/svelte/router/lazyModule.ts +74 -0
- package/dist/svelte/router/navigation.ts +412 -0
- package/dist/svelte/router/pushState.ts +7 -4
- package/dist/svelte/router/scroll.ts +286 -0
- package/dist/svelte/server.js +747 -252
- package/dist/svelte/server.js.map +30 -20
- package/dist/types/angular.d.ts +2 -0
- package/dist/types/build.d.ts +37 -0
- package/dist/types/conventions.d.ts +3 -0
- package/dist/types/fileRoutes.d.ts +72 -0
- package/dist/types/fonts.d.ts +86 -0
- package/dist/types/formAction.d.ts +54 -0
- package/dist/types/globals.d.ts +10 -0
- package/dist/types/i18n.d.ts +185 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/metadata.d.ts +11 -0
- package/dist/types/navigation.d.ts +37 -0
- package/dist/types/prefetch.d.ts +10 -0
- package/dist/types/sitemap.d.ts +4 -0
- package/dist/types/svelteRouter.d.ts +89 -2
- package/dist/types/svelteRouter.ts +112 -2
- package/dist/types/vue.d.ts +46 -1
- package/dist/utils/iconVersion.ts +34 -0
- package/dist/vue/browser.js +107 -11
- package/dist/vue/browser.js.map +7 -4
- package/dist/vue/components/index.js +5 -2
- package/dist/vue/components/index.js.map +5 -4
- package/dist/vue/index.js +712 -158
- package/dist/vue/index.js.map +32 -23
- package/dist/vue/server.js +310 -79
- package/dist/vue/server.js.map +20 -15
- package/package.json +9 -1
- package/dist/cli/prerender-mfnwsvyt.js +0 -7
- package/dist/src/plugins/pageRouter.d.ts +0 -1
- /package/dist/cli/{index-j7m8pq48.js → index-rervww4p.js} +0 -0
|
@@ -0,0 +1,543 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
function __accessProp(key) {
|
|
8
|
+
return this[key];
|
|
9
|
+
}
|
|
10
|
+
var __toESMCache_node;
|
|
11
|
+
var __toESMCache_esm;
|
|
12
|
+
var __toESM = (mod, isNodeMode, target) => {
|
|
13
|
+
var canCache = mod != null && typeof mod === "object";
|
|
14
|
+
if (canCache) {
|
|
15
|
+
var cache = isNodeMode ? __toESMCache_node ??= new WeakMap : __toESMCache_esm ??= new WeakMap;
|
|
16
|
+
var cached = cache.get(mod);
|
|
17
|
+
if (cached)
|
|
18
|
+
return cached;
|
|
19
|
+
}
|
|
20
|
+
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
21
|
+
const to = isNodeMode || !mod || !mod.__esModule || !__hasOwnProp.call(mod, "default") ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
22
|
+
if (mod && typeof mod === "object" || typeof mod === "function") {
|
|
23
|
+
for (let key of __getOwnPropNames(mod))
|
|
24
|
+
if (!__hasOwnProp.call(to, key))
|
|
25
|
+
__defProp(to, key, {
|
|
26
|
+
get: __accessProp.bind(mod, key),
|
|
27
|
+
enumerable: true
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
if (canCache)
|
|
31
|
+
cache.set(mod, to);
|
|
32
|
+
return to;
|
|
33
|
+
};
|
|
34
|
+
var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
|
|
35
|
+
var __returnValue = (v) => v;
|
|
36
|
+
function __exportSetter(name, newValue) {
|
|
37
|
+
this[name] = __returnValue.bind(null, newValue);
|
|
38
|
+
}
|
|
39
|
+
var __export = (target, all) => {
|
|
40
|
+
for (var name in all)
|
|
41
|
+
__defProp(target, name, {
|
|
42
|
+
get: all[name],
|
|
43
|
+
enumerable: true,
|
|
44
|
+
configurable: true,
|
|
45
|
+
set: __exportSetter.bind(all, name)
|
|
46
|
+
});
|
|
47
|
+
};
|
|
48
|
+
var __legacyDecorateClassTS = function(decorators, target, key, desc) {
|
|
49
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
50
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
|
|
51
|
+
r = Reflect.decorate(decorators, target, key, desc);
|
|
52
|
+
else
|
|
53
|
+
for (var i = decorators.length - 1;i >= 0; i--)
|
|
54
|
+
if (d = decorators[i])
|
|
55
|
+
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
56
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
57
|
+
};
|
|
58
|
+
var __legacyMetadataTS = (k, v) => {
|
|
59
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
|
|
60
|
+
return Reflect.metadata(k, v);
|
|
61
|
+
};
|
|
62
|
+
var __esm = (fn, res, err) => () => {
|
|
63
|
+
if (fn)
|
|
64
|
+
try {
|
|
65
|
+
res = fn(fn = 0);
|
|
66
|
+
} catch (e) {
|
|
67
|
+
err = [e];
|
|
68
|
+
}
|
|
69
|
+
if (err)
|
|
70
|
+
throw err[0];
|
|
71
|
+
return res;
|
|
72
|
+
};
|
|
73
|
+
var __require = import.meta.require;
|
|
74
|
+
|
|
75
|
+
// src/i18n/routing.ts
|
|
76
|
+
var RTL_SCRIPTS, RTL_LANGUAGES, scriptOf = (locale) => {
|
|
77
|
+
try {
|
|
78
|
+
return new Intl.Locale(locale).maximize().script;
|
|
79
|
+
} catch {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
}, localeDirection = (locale) => {
|
|
83
|
+
const script = scriptOf(locale);
|
|
84
|
+
const direction = script !== undefined && RTL_SCRIPTS.has(script) || script === undefined && RTL_LANGUAGES.has(locale.split(/[-_]/)[0]?.toLowerCase() ?? "") ? "rtl" : "ltr";
|
|
85
|
+
return direction;
|
|
86
|
+
}, parseAcceptLanguage = (header) => {
|
|
87
|
+
if (!header)
|
|
88
|
+
return [];
|
|
89
|
+
const tags = header.split(",").map((part, order) => {
|
|
90
|
+
const [rawTag = "", ...params] = part.trim().split(";");
|
|
91
|
+
const qualityParam = params.map((param) => param.trim()).find((param) => param.startsWith("q="));
|
|
92
|
+
const quality = qualityParam ? Number(qualityParam.slice(2)) : 1;
|
|
93
|
+
return {
|
|
94
|
+
order,
|
|
95
|
+
quality: Number.isFinite(quality) ? quality : 0,
|
|
96
|
+
tag: rawTag.trim()
|
|
97
|
+
};
|
|
98
|
+
}).filter((entry) => entry.tag !== "" && entry.tag !== "*").filter((entry) => entry.quality > 0);
|
|
99
|
+
return tags.sort((left, right) => right.quality - left.quality || left.order - right.order).map((entry) => entry.tag);
|
|
100
|
+
}, languageOf = (tag) => tag.split(/[-_]/)[0]?.toLowerCase() ?? "", localeFromPath = (pathname, locales) => {
|
|
101
|
+
const segment = pathname.split("/")[1] ?? "";
|
|
102
|
+
return locales.find((locale) => locale === segment);
|
|
103
|
+
}, matchLocale = (tag, locales) => {
|
|
104
|
+
const lower = tag.toLowerCase();
|
|
105
|
+
const exact = locales.find((locale) => locale.toLowerCase() === lower);
|
|
106
|
+
if (exact)
|
|
107
|
+
return exact;
|
|
108
|
+
const language = languageOf(tag);
|
|
109
|
+
return locales.find((locale) => languageOf(locale) === language);
|
|
110
|
+
}, negotiateLocale = (requested, locales, fallback) => {
|
|
111
|
+
for (const tag of requested) {
|
|
112
|
+
const match = matchLocale(tag, locales);
|
|
113
|
+
if (match)
|
|
114
|
+
return match;
|
|
115
|
+
}
|
|
116
|
+
return fallback;
|
|
117
|
+
}, readCookie = (header, name) => {
|
|
118
|
+
if (!header)
|
|
119
|
+
return;
|
|
120
|
+
for (const part of header.split(";")) {
|
|
121
|
+
const separator = part.indexOf("=");
|
|
122
|
+
if (separator === -1)
|
|
123
|
+
continue;
|
|
124
|
+
if (part.slice(0, separator).trim() !== name)
|
|
125
|
+
continue;
|
|
126
|
+
try {
|
|
127
|
+
return decodeURIComponent(part.slice(separator + 1).trim());
|
|
128
|
+
} catch {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return;
|
|
133
|
+
}, stripLocalePrefix = (pathname, locales) => {
|
|
134
|
+
const locale = localeFromPath(pathname, locales);
|
|
135
|
+
if (locale === undefined)
|
|
136
|
+
return pathname;
|
|
137
|
+
const rest = pathname.slice(locale.length + 1);
|
|
138
|
+
return rest === "" ? "/" : rest;
|
|
139
|
+
}, resolveStrategy = (routing) => routing.strategy ?? "prefix", localizePath = (path, locale, routing) => {
|
|
140
|
+
if (resolveStrategy(routing) !== "prefix")
|
|
141
|
+
return path;
|
|
142
|
+
const base = stripLocalePrefix(path, routing.locales);
|
|
143
|
+
if (locale === routing.defaultLocale && !routing.prefixDefault)
|
|
144
|
+
return base;
|
|
145
|
+
return base === "/" ? `/${locale}` : `/${locale}${base}`;
|
|
146
|
+
}, trimOrigin = (origin) => origin.replace(/\/+$/, ""), domainHref = (origin, host, path) => {
|
|
147
|
+
const protocol = /^(https?:)\/\//.exec(origin)?.[1] ?? "https:";
|
|
148
|
+
return `${protocol}//${host}${path}`;
|
|
149
|
+
}, domainAlternates = (base, routing, origin) => {
|
|
150
|
+
const hosts = routing.domains ?? {};
|
|
151
|
+
const links = routing.locales.flatMap((locale) => {
|
|
152
|
+
const host = hosts[locale];
|
|
153
|
+
return host ? [{ href: domainHref(origin, host, base), hreflang: locale }] : [];
|
|
154
|
+
});
|
|
155
|
+
const defaultHost = hosts[routing.defaultLocale];
|
|
156
|
+
if (defaultHost)
|
|
157
|
+
links.push({
|
|
158
|
+
href: domainHref(origin, defaultHost, base),
|
|
159
|
+
hreflang: "x-default"
|
|
160
|
+
});
|
|
161
|
+
return links;
|
|
162
|
+
}, alternateLinks = (path, routing, origin) => {
|
|
163
|
+
const strategy = resolveStrategy(routing);
|
|
164
|
+
const base = stripLocalePrefix(path, routing.locales);
|
|
165
|
+
const links = [];
|
|
166
|
+
if (strategy === "negotiate")
|
|
167
|
+
return links;
|
|
168
|
+
if (strategy === "domain")
|
|
169
|
+
return domainAlternates(base, routing, origin);
|
|
170
|
+
const root = trimOrigin(origin);
|
|
171
|
+
for (const locale of routing.locales) {
|
|
172
|
+
links.push({
|
|
173
|
+
href: `${root}${localizePath(base, locale, routing)}`,
|
|
174
|
+
hreflang: locale
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
links.push({ href: `${root}${base}`, hreflang: "x-default" });
|
|
178
|
+
return links;
|
|
179
|
+
};
|
|
180
|
+
var init_routing = __esm(() => {
|
|
181
|
+
RTL_SCRIPTS = new Set([
|
|
182
|
+
"Adlm",
|
|
183
|
+
"Arab",
|
|
184
|
+
"Aran",
|
|
185
|
+
"Hebr",
|
|
186
|
+
"Mand",
|
|
187
|
+
"Nkoo",
|
|
188
|
+
"Rohg",
|
|
189
|
+
"Samr",
|
|
190
|
+
"Syrc",
|
|
191
|
+
"Thaa"
|
|
192
|
+
]);
|
|
193
|
+
RTL_LANGUAGES = new Set([
|
|
194
|
+
"ar",
|
|
195
|
+
"arc",
|
|
196
|
+
"ckb",
|
|
197
|
+
"dv",
|
|
198
|
+
"fa",
|
|
199
|
+
"he",
|
|
200
|
+
"iw",
|
|
201
|
+
"ps",
|
|
202
|
+
"sd",
|
|
203
|
+
"syr",
|
|
204
|
+
"ug",
|
|
205
|
+
"ur",
|
|
206
|
+
"yi"
|
|
207
|
+
]);
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
// src/i18n/defineMessages.ts
|
|
211
|
+
var defineMessages = (catalog) => catalog;
|
|
212
|
+
// src/i18n/intlCache.ts
|
|
213
|
+
var numberFormats = new Map;
|
|
214
|
+
var dateTimeFormats = new Map;
|
|
215
|
+
var pluralRules = new Map;
|
|
216
|
+
var relativeTimeFormats = new Map;
|
|
217
|
+
var listFormats = new Map;
|
|
218
|
+
var cacheKey = (locale, options) => `${locale}|${options ? JSON.stringify(options) : ""}`;
|
|
219
|
+
var cached = (cache, key, create) => {
|
|
220
|
+
const existing = cache.get(key);
|
|
221
|
+
if (existing)
|
|
222
|
+
return existing;
|
|
223
|
+
const created = create();
|
|
224
|
+
cache.set(key, created);
|
|
225
|
+
return created;
|
|
226
|
+
};
|
|
227
|
+
var getDateTimeFormat = (locale, options) => cached(dateTimeFormats, cacheKey(locale, options), () => new Intl.DateTimeFormat(locale, options));
|
|
228
|
+
var getListFormat = (locale, options) => cached(listFormats, cacheKey(locale, options), () => new Intl.ListFormat(locale, options));
|
|
229
|
+
var getNumberFormat = (locale, options) => cached(numberFormats, cacheKey(locale, options), () => new Intl.NumberFormat(locale, options));
|
|
230
|
+
var getPluralRules = (locale, options) => cached(pluralRules, cacheKey(locale, options), () => new Intl.PluralRules(locale, options));
|
|
231
|
+
var getRelativeTimeFormat = (locale, options) => cached(relativeTimeFormats, cacheKey(locale, options), () => new Intl.RelativeTimeFormat(locale, options));
|
|
232
|
+
|
|
233
|
+
// src/i18n/formatMessage.ts
|
|
234
|
+
var SYNTAX_CHARS = new Set(["{", "}", "#", "|"]);
|
|
235
|
+
var WHITESPACE = /\s/;
|
|
236
|
+
var isBranchKind = (value) => value === "plural" || value === "select" || value === "selectordinal";
|
|
237
|
+
var skipWhitespace = (cursor) => {
|
|
238
|
+
while (cursor.index < cursor.source.length && WHITESPACE.test(cursor.source.charAt(cursor.index))) {
|
|
239
|
+
cursor.index += 1;
|
|
240
|
+
}
|
|
241
|
+
};
|
|
242
|
+
var syntaxError = (cursor, expected) => new SyntaxError(`Invalid ICU message (expected ${expected} at ${cursor.index}): ${cursor.source}`);
|
|
243
|
+
var readToken = (cursor, stops) => {
|
|
244
|
+
const start = cursor.index;
|
|
245
|
+
while (cursor.index < cursor.source.length && !stops.includes(cursor.source.charAt(cursor.index))) {
|
|
246
|
+
cursor.index += 1;
|
|
247
|
+
}
|
|
248
|
+
return cursor.source.slice(start, cursor.index).trim();
|
|
249
|
+
};
|
|
250
|
+
var expectChar = (cursor, char) => {
|
|
251
|
+
skipWhitespace(cursor);
|
|
252
|
+
if (cursor.source.charAt(cursor.index) !== char)
|
|
253
|
+
throw syntaxError(cursor, `"${char}"`);
|
|
254
|
+
cursor.index += 1;
|
|
255
|
+
};
|
|
256
|
+
var readQuoted = (cursor, inPlural) => {
|
|
257
|
+
const next = cursor.source.charAt(cursor.index + 1);
|
|
258
|
+
if (next === "'") {
|
|
259
|
+
cursor.index += 2;
|
|
260
|
+
return "'";
|
|
261
|
+
}
|
|
262
|
+
const opensQuote = SYNTAX_CHARS.has(next) && (next !== "#" || inPlural);
|
|
263
|
+
if (!opensQuote) {
|
|
264
|
+
cursor.index += 1;
|
|
265
|
+
return "'";
|
|
266
|
+
}
|
|
267
|
+
cursor.index += 1;
|
|
268
|
+
let text = "";
|
|
269
|
+
while (cursor.index < cursor.source.length) {
|
|
270
|
+
const char = cursor.source.charAt(cursor.index);
|
|
271
|
+
const isEscapedQuote = char === "'" && cursor.source.charAt(cursor.index + 1) === "'";
|
|
272
|
+
if (char === "'" && !isEscapedQuote)
|
|
273
|
+
break;
|
|
274
|
+
text += char;
|
|
275
|
+
cursor.index += isEscapedQuote ? 2 : 1;
|
|
276
|
+
}
|
|
277
|
+
cursor.index += 1;
|
|
278
|
+
return text;
|
|
279
|
+
};
|
|
280
|
+
var pushText = (nodes, value) => {
|
|
281
|
+
const last = nodes[nodes.length - 1];
|
|
282
|
+
if (last?.kind === "text") {
|
|
283
|
+
last.value += value;
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
nodes.push({ kind: "text", value });
|
|
287
|
+
};
|
|
288
|
+
var parseBranchOption = (cursor, kind, branches) => {
|
|
289
|
+
if (cursor.index >= cursor.source.length)
|
|
290
|
+
throw syntaxError(cursor, '"}"');
|
|
291
|
+
const selector = readToken(cursor, `{}
|
|
292
|
+
\r`);
|
|
293
|
+
const offsetMatch = /^offset:(\d+)$/.exec(selector);
|
|
294
|
+
if (offsetMatch && kind !== "select") {
|
|
295
|
+
branches.offset = Number(offsetMatch[1]);
|
|
296
|
+
skipWhitespace(cursor);
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
if (selector === "")
|
|
300
|
+
throw syntaxError(cursor, "a selector");
|
|
301
|
+
expectChar(cursor, "{");
|
|
302
|
+
branches.options[selector] = parseNodes(cursor, kind !== "select");
|
|
303
|
+
expectChar(cursor, "}");
|
|
304
|
+
skipWhitespace(cursor);
|
|
305
|
+
};
|
|
306
|
+
var parseBranchOptions = (cursor, kind) => {
|
|
307
|
+
const branches = { offset: 0, options: {} };
|
|
308
|
+
skipWhitespace(cursor);
|
|
309
|
+
while (cursor.source.charAt(cursor.index) !== "}") {
|
|
310
|
+
parseBranchOption(cursor, kind, branches);
|
|
311
|
+
}
|
|
312
|
+
if (branches.options.other === undefined)
|
|
313
|
+
throw syntaxError(cursor, 'an "other" branch');
|
|
314
|
+
return branches;
|
|
315
|
+
};
|
|
316
|
+
var parseArgument = (cursor) => {
|
|
317
|
+
skipWhitespace(cursor);
|
|
318
|
+
const name = readToken(cursor, ",}");
|
|
319
|
+
if (name === "")
|
|
320
|
+
throw syntaxError(cursor, "an argument name");
|
|
321
|
+
if (cursor.source.charAt(cursor.index) === "}") {
|
|
322
|
+
cursor.index += 1;
|
|
323
|
+
return { format: undefined, kind: "argument", name, style: undefined };
|
|
324
|
+
}
|
|
325
|
+
cursor.index += 1;
|
|
326
|
+
const format = readToken(cursor, ",}");
|
|
327
|
+
if (isBranchKind(format)) {
|
|
328
|
+
expectChar(cursor, ",");
|
|
329
|
+
const { offset, options } = parseBranchOptions(cursor, format);
|
|
330
|
+
expectChar(cursor, "}");
|
|
331
|
+
return { kind: format, name, offset, options };
|
|
332
|
+
}
|
|
333
|
+
let style;
|
|
334
|
+
if (cursor.source.charAt(cursor.index) === ",") {
|
|
335
|
+
cursor.index += 1;
|
|
336
|
+
style = readToken(cursor, "}");
|
|
337
|
+
}
|
|
338
|
+
expectChar(cursor, "}");
|
|
339
|
+
return { format, kind: "argument", name, style };
|
|
340
|
+
};
|
|
341
|
+
var parseNode = (cursor, inPlural, nodes) => {
|
|
342
|
+
const char = cursor.source.charAt(cursor.index);
|
|
343
|
+
if (char === "{") {
|
|
344
|
+
cursor.index += 1;
|
|
345
|
+
nodes.push(parseArgument(cursor));
|
|
346
|
+
return;
|
|
347
|
+
}
|
|
348
|
+
if (char === "#" && inPlural) {
|
|
349
|
+
cursor.index += 1;
|
|
350
|
+
nodes.push({ kind: "pound" });
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
if (char === "'") {
|
|
354
|
+
pushText(nodes, readQuoted(cursor, inPlural));
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
pushText(nodes, char);
|
|
358
|
+
cursor.index += 1;
|
|
359
|
+
};
|
|
360
|
+
var parseNodes = (cursor, inPlural) => {
|
|
361
|
+
const nodes = [];
|
|
362
|
+
while (cursor.index < cursor.source.length && cursor.source.charAt(cursor.index) !== "}") {
|
|
363
|
+
parseNode(cursor, inPlural, nodes);
|
|
364
|
+
}
|
|
365
|
+
return nodes;
|
|
366
|
+
};
|
|
367
|
+
var parseMessage = (source) => {
|
|
368
|
+
const cursor = { index: 0, source };
|
|
369
|
+
const nodes = parseNodes(cursor, false);
|
|
370
|
+
if (cursor.index < source.length)
|
|
371
|
+
throw syntaxError(cursor, "end of message");
|
|
372
|
+
return nodes;
|
|
373
|
+
};
|
|
374
|
+
var parsedCache = new Map;
|
|
375
|
+
var parseCached = (source) => {
|
|
376
|
+
const cached = parsedCache.get(source);
|
|
377
|
+
if (cached)
|
|
378
|
+
return cached;
|
|
379
|
+
let parsed;
|
|
380
|
+
try {
|
|
381
|
+
parsed = parseMessage(source);
|
|
382
|
+
} catch (error) {
|
|
383
|
+
parsed = error instanceof SyntaxError ? error : new SyntaxError(String(error));
|
|
384
|
+
}
|
|
385
|
+
parsedCache.set(source, parsed);
|
|
386
|
+
return parsed;
|
|
387
|
+
};
|
|
388
|
+
var INTEGER_OPTIONS = { maximumFractionDigits: 0 };
|
|
389
|
+
var PERCENT_OPTIONS = { style: "percent" };
|
|
390
|
+
var numberOptions = (style) => {
|
|
391
|
+
if (style === "integer")
|
|
392
|
+
return INTEGER_OPTIONS;
|
|
393
|
+
if (style === "percent")
|
|
394
|
+
return PERCENT_OPTIONS;
|
|
395
|
+
const currency = /^::currency\/([A-Za-z]{3})$/.exec(style ?? "");
|
|
396
|
+
const options = currency?.[1] ? { currency: currency[1].toUpperCase(), style: "currency" } : {};
|
|
397
|
+
return options;
|
|
398
|
+
};
|
|
399
|
+
var toDate = (value) => {
|
|
400
|
+
if (value instanceof Date)
|
|
401
|
+
return value;
|
|
402
|
+
if (typeof value === "number" || typeof value === "string")
|
|
403
|
+
return new Date(value);
|
|
404
|
+
return;
|
|
405
|
+
};
|
|
406
|
+
var dateStyleOf = (style) => {
|
|
407
|
+
if (style === "full" || style === "long" || style === "short")
|
|
408
|
+
return style;
|
|
409
|
+
return "medium";
|
|
410
|
+
};
|
|
411
|
+
var formatDateArgument = (locale, value, format, style) => {
|
|
412
|
+
const date = toDate(value);
|
|
413
|
+
if (!date || Number.isNaN(date.getTime()))
|
|
414
|
+
return String(value);
|
|
415
|
+
const resolvedStyle = dateStyleOf(style);
|
|
416
|
+
const options = format === "date" ? { dateStyle: resolvedStyle } : { timeStyle: resolvedStyle };
|
|
417
|
+
return getDateTimeFormat(locale, options).format(date);
|
|
418
|
+
};
|
|
419
|
+
var formatValue = (locale, value) => {
|
|
420
|
+
if (typeof value === "number" || typeof value === "bigint")
|
|
421
|
+
return getNumberFormat(locale).format(value);
|
|
422
|
+
if (value instanceof Date)
|
|
423
|
+
return getDateTimeFormat(locale).format(value);
|
|
424
|
+
return String(value);
|
|
425
|
+
};
|
|
426
|
+
var formatArgument = (locale, node, params) => {
|
|
427
|
+
if (!(node.name in params))
|
|
428
|
+
return `{${node.name}}`;
|
|
429
|
+
const value = params[node.name];
|
|
430
|
+
if (node.format === "number") {
|
|
431
|
+
const numeric = typeof value === "bigint" ? value : Number(value);
|
|
432
|
+
return getNumberFormat(locale, numberOptions(node.style)).format(numeric);
|
|
433
|
+
}
|
|
434
|
+
if (node.format === "date" || node.format === "time")
|
|
435
|
+
return formatDateArgument(locale, value, node.format, node.style);
|
|
436
|
+
return formatValue(locale, value);
|
|
437
|
+
};
|
|
438
|
+
var selectBranch = (locale, node, value) => {
|
|
439
|
+
if (node.kind === "select") {
|
|
440
|
+
return node.options[String(value)] ?? node.options.other ?? [];
|
|
441
|
+
}
|
|
442
|
+
const numeric = Number(value);
|
|
443
|
+
const exact = node.options[`=${numeric}`];
|
|
444
|
+
if (exact)
|
|
445
|
+
return exact;
|
|
446
|
+
const category = getPluralRules(locale, {
|
|
447
|
+
type: node.kind === "selectordinal" ? "ordinal" : "cardinal"
|
|
448
|
+
}).select(numeric - node.offset);
|
|
449
|
+
return node.options[category] ?? node.options.other ?? [];
|
|
450
|
+
};
|
|
451
|
+
var formatNodes = (locale, nodes, params, pound) => nodes.map((node) => {
|
|
452
|
+
if (node.kind === "text")
|
|
453
|
+
return node.value;
|
|
454
|
+
if (node.kind === "pound")
|
|
455
|
+
return pound ?? "#";
|
|
456
|
+
if (node.kind === "argument")
|
|
457
|
+
return formatArgument(locale, node, params);
|
|
458
|
+
if (!(node.name in params))
|
|
459
|
+
return `{${node.name}}`;
|
|
460
|
+
const value = params[node.name];
|
|
461
|
+
const branch = selectBranch(locale, node, value);
|
|
462
|
+
const branchPound = node.kind === "select" ? pound : getNumberFormat(locale).format(Number(value) - node.offset);
|
|
463
|
+
return formatNodes(locale, branch, params, branchPound);
|
|
464
|
+
}).join("");
|
|
465
|
+
var formatMessage = (locale, message, params = {}) => {
|
|
466
|
+
if (!message.includes("{") && !message.includes("'"))
|
|
467
|
+
return message;
|
|
468
|
+
const parsed = parseCached(message);
|
|
469
|
+
if (parsed instanceof SyntaxError)
|
|
470
|
+
return message;
|
|
471
|
+
return formatNodes(locale, parsed, params, undefined);
|
|
472
|
+
};
|
|
473
|
+
|
|
474
|
+
// src/i18n/index.ts
|
|
475
|
+
init_routing();
|
|
476
|
+
|
|
477
|
+
// src/i18n/translator.ts
|
|
478
|
+
var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
479
|
+
var lookupMessage = (messages, key) => {
|
|
480
|
+
let node = messages;
|
|
481
|
+
for (const segment of key.split(".")) {
|
|
482
|
+
if (typeof node !== "object")
|
|
483
|
+
return;
|
|
484
|
+
node = node[segment];
|
|
485
|
+
}
|
|
486
|
+
return typeof node === "string" ? node : undefined;
|
|
487
|
+
};
|
|
488
|
+
var isMessageTreeValue = (value) => typeof value === "string" || isMessageTree(value);
|
|
489
|
+
var isI18nPayload = (value) => isRecord(value) && typeof value.locale === "string" && typeof value.defaultLocale === "string" && (value.dir === "ltr" || value.dir === "rtl") && isMessageTree(value.messages);
|
|
490
|
+
var isMessageTree = (value) => isRecord(value) && Object.values(value).every(isMessageTreeValue);
|
|
491
|
+
var toDate2 = (value) => value instanceof Date ? value : new Date(value);
|
|
492
|
+
var warnedKeys = new Set;
|
|
493
|
+
var warnMissing = (locale, key) => {
|
|
494
|
+
const id = `${locale}:${key}`;
|
|
495
|
+
if (warnedKeys.has(id))
|
|
496
|
+
return;
|
|
497
|
+
warnedKeys.add(id);
|
|
498
|
+
console.warn(`[i18n] Missing message "${key}" for locale "${locale}"`);
|
|
499
|
+
};
|
|
500
|
+
var createTranslator = (payload) => {
|
|
501
|
+
const { locale, messages } = payload;
|
|
502
|
+
const t = (key, ...args) => {
|
|
503
|
+
const message = lookupMessage(messages, key);
|
|
504
|
+
if (message === undefined) {
|
|
505
|
+
warnMissing(locale, key);
|
|
506
|
+
return key;
|
|
507
|
+
}
|
|
508
|
+
const [params] = args;
|
|
509
|
+
return formatMessage(locale, message, isRecord(params) ? params : {});
|
|
510
|
+
};
|
|
511
|
+
const translator = {
|
|
512
|
+
dir: payload.dir,
|
|
513
|
+
locale,
|
|
514
|
+
t,
|
|
515
|
+
formatDate: (value, options) => getDateTimeFormat(locale, options).format(toDate2(value)),
|
|
516
|
+
formatList: (items, options) => getListFormat(locale, options).format(items),
|
|
517
|
+
formatNumber: (value, options) => getNumberFormat(locale, options).format(value),
|
|
518
|
+
formatRelativeTime: (value, unit, options) => getRelativeTimeFormat(locale, options).format(value, unit),
|
|
519
|
+
has: (key) => lookupMessage(messages, key) !== undefined
|
|
520
|
+
};
|
|
521
|
+
return translator;
|
|
522
|
+
};
|
|
523
|
+
export {
|
|
524
|
+
alternateLinks,
|
|
525
|
+
createTranslator,
|
|
526
|
+
defineMessages,
|
|
527
|
+
formatMessage,
|
|
528
|
+
isI18nPayload,
|
|
529
|
+
isMessageTree,
|
|
530
|
+
localeDirection,
|
|
531
|
+
localeFromPath,
|
|
532
|
+
localizePath,
|
|
533
|
+
lookupMessage,
|
|
534
|
+
matchLocale,
|
|
535
|
+
negotiateLocale,
|
|
536
|
+
parseAcceptLanguage,
|
|
537
|
+
parseMessage,
|
|
538
|
+
readCookie,
|
|
539
|
+
stripLocalePrefix
|
|
540
|
+
};
|
|
541
|
+
|
|
542
|
+
//# debugId=0FA989FB7592974F64756E2164756E21
|
|
543
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/i18n/routing.ts", "../src/i18n/defineMessages.ts", "../src/i18n/intlCache.ts", "../src/i18n/formatMessage.ts", "../src/i18n/index.ts", "../src/i18n/translator.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/* Locale routing helpers shared by the server plugin, the sitemap and\n * browser code (language switchers): path prefixes, hreflang alternates,\n * Accept-Language negotiation and text direction. No server imports. */\n\nimport type {\n\tAlternateLink,\n\tLocaleRoutingConfig,\n\tTextDirection\n} from '../../types/i18n';\n\nconst RTL_SCRIPTS = new Set([\n\t'Adlm',\n\t'Arab',\n\t'Aran',\n\t'Hebr',\n\t'Mand',\n\t'Nkoo',\n\t'Rohg',\n\t'Samr',\n\t'Syrc',\n\t'Thaa'\n]);\n\nconst RTL_LANGUAGES = new Set([\n\t'ar',\n\t'arc',\n\t'ckb',\n\t'dv',\n\t'fa',\n\t'he',\n\t'iw',\n\t'ps',\n\t'sd',\n\t'syr',\n\t'ug',\n\t'ur',\n\t'yi'\n]);\n\nconst scriptOf = (locale: string) => {\n\ttry {\n\t\treturn new Intl.Locale(locale).maximize().script;\n\t} catch {\n\t\treturn undefined;\n\t}\n};\n\n/** `rtl` for locales written right to left (Arabic, Hebrew, Persian,\n * Urdu, … or any tag with an RTL script subtag), else `ltr`. */\nexport const localeDirection = (locale: string) => {\n\tconst script = scriptOf(locale);\n\tconst direction: TextDirection =\n\t\t(script !== undefined && RTL_SCRIPTS.has(script)) ||\n\t\t(script === undefined &&\n\t\t\tRTL_LANGUAGES.has(locale.split(/[-_]/)[0]?.toLowerCase() ?? ''))\n\t\t\t? 'rtl'\n\t\t\t: 'ltr';\n\n\treturn direction;\n};\n\ntype WeightedTag = { tag: string; quality: number; order: number };\n\n/** Language tags from an `Accept-Language` header, best first. */\nexport const parseAcceptLanguage = (header: string | null | undefined) => {\n\tif (!header) return [];\n\tconst tags: WeightedTag[] = header\n\t\t.split(',')\n\t\t.map((part, order) => {\n\t\t\tconst [rawTag = '', ...params] = part.trim().split(';');\n\t\t\tconst qualityParam = params\n\t\t\t\t.map((param) => param.trim())\n\t\t\t\t.find((param) => param.startsWith('q='));\n\t\t\tconst quality = qualityParam ? Number(qualityParam.slice(2)) : 1;\n\n\t\t\treturn {\n\t\t\t\torder,\n\t\t\t\tquality: Number.isFinite(quality) ? quality : 0,\n\t\t\t\ttag: rawTag.trim()\n\t\t\t};\n\t\t})\n\t\t.filter((entry) => entry.tag !== '' && entry.tag !== '*')\n\t\t.filter((entry) => entry.quality > 0);\n\n\treturn tags\n\t\t.sort(\n\t\t\t(left, right) =>\n\t\t\t\tright.quality - left.quality || left.order - right.order\n\t\t)\n\t\t.map((entry) => entry.tag);\n};\n\nconst languageOf = (tag: string) => tag.split(/[-_]/)[0]?.toLowerCase() ?? '';\n\n/** The locale named by the path's first segment, if it is one. */\nexport const localeFromPath = <Locale extends string>(\n\tpathname: string,\n\tlocales: readonly Locale[]\n) => {\n\tconst segment = pathname.split('/')[1] ?? '';\n\n\treturn locales.find((locale) => locale === segment);\n};\n/** The configured locale that best matches one requested tag: an exact\n * (case-insensitive) match, then the same language (`fr-CA` → `fr`, or\n * `fr` → `fr-FR`). */\nexport const matchLocale = <Locale extends string>(\n\ttag: string,\n\tlocales: readonly Locale[]\n) => {\n\tconst lower = tag.toLowerCase();\n\tconst exact = locales.find((locale) => locale.toLowerCase() === lower);\n\tif (exact) return exact;\n\tconst language = languageOf(tag);\n\n\treturn locales.find((locale) => languageOf(locale) === language);\n};\n/** The first requested tag that matches a configured locale, else\n * `fallback`. */\nexport const negotiateLocale = <Locale extends string>(\n\trequested: readonly string[],\n\tlocales: readonly Locale[],\n\tfallback: Locale\n) => {\n\tfor (const tag of requested) {\n\t\tconst match = matchLocale(tag, locales);\n\t\tif (match) return match;\n\t}\n\n\treturn fallback;\n};\n/** A cookie's value from a `Cookie` header. */\nexport const readCookie = (header: string | null | undefined, name: string) => {\n\tif (!header) return undefined;\n\tfor (const part of header.split(';')) {\n\t\tconst separator = part.indexOf('=');\n\t\tif (separator === -1) continue;\n\t\tif (part.slice(0, separator).trim() !== name) continue;\n\t\ttry {\n\t\t\treturn decodeURIComponent(part.slice(separator + 1).trim());\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\treturn undefined;\n};\n/** `pathname` without a leading locale segment (`/fr/about` → `/about`). */\nexport const stripLocalePrefix = (\n\tpathname: string,\n\tlocales: readonly string[]\n) => {\n\tconst locale = localeFromPath(pathname, locales);\n\tif (locale === undefined) return pathname;\n\tconst rest = pathname.slice(locale.length + 1);\n\n\treturn rest === '' ? '/' : rest;\n};\n\nconst resolveStrategy = (routing: LocaleRoutingConfig) =>\n\trouting.strategy ?? 'prefix';\n\n/** `path` as it is addressed in `locale`. Under `prefix` this swaps or\n * adds the locale segment (the default locale stays unprefixed unless\n * `prefixDefault`); other strategies keep one path for every locale. */\nexport const localizePath = <Locale extends string>(\n\tpath: string,\n\tlocale: Locale,\n\trouting: LocaleRoutingConfig<Locale>\n) => {\n\tif (resolveStrategy(routing) !== 'prefix') return path;\n\tconst base = stripLocalePrefix(path, routing.locales);\n\tif (locale === routing.defaultLocale && !routing.prefixDefault) return base;\n\n\treturn base === '/' ? `/${locale}` : `/${locale}${base}`;\n};\n\nconst trimOrigin = (origin: string) => origin.replace(/\\/+$/, '');\n\nconst domainHref = (origin: string, host: string, path: string) => {\n\tconst protocol = /^(https?:)\\/\\//.exec(origin)?.[1] ?? 'https:';\n\n\treturn `${protocol}//${host}${path}`;\n};\n\nconst domainAlternates = <Locale extends string>(\n\tbase: string,\n\trouting: LocaleRoutingConfig<Locale>,\n\torigin: string\n) => {\n\tconst hosts: Partial<Record<Locale, string>> = routing.domains ?? {};\n\tconst links: AlternateLink[] = routing.locales.flatMap((locale) => {\n\t\tconst host = hosts[locale];\n\n\t\treturn host\n\t\t\t? [{ href: domainHref(origin, host, base), hreflang: locale }]\n\t\t\t: [];\n\t});\n\tconst defaultHost = hosts[routing.defaultLocale];\n\tif (defaultHost)\n\t\tlinks.push({\n\t\t\thref: domainHref(origin, defaultHost, base),\n\t\t\threflang: 'x-default'\n\t\t});\n\n\treturn links;\n};\n\n/** hreflang alternates for `path` (with or without a locale prefix): one\n * per locale plus `x-default`. Empty under `negotiate`, where every\n * locale shares one URL. `origin` makes the hrefs absolute, as search\n * engines require. */\nexport const alternateLinks = <Locale extends string>(\n\tpath: string,\n\trouting: LocaleRoutingConfig<Locale>,\n\torigin: string\n) => {\n\tconst strategy = resolveStrategy(routing);\n\tconst base = stripLocalePrefix(path, routing.locales);\n\tconst links: AlternateLink[] = [];\n\tif (strategy === 'negotiate') return links;\n\tif (strategy === 'domain') return domainAlternates(base, routing, origin);\n\tconst root = trimOrigin(origin);\n\tfor (const locale of routing.locales) {\n\t\tlinks.push({\n\t\t\thref: `${root}${localizePath(base, locale, routing)}`,\n\t\t\threflang: locale\n\t\t});\n\t}\n\tlinks.push({ href: `${root}${base}`, hreflang: 'x-default' });\n\n\treturn links;\n};\n",
|
|
6
|
+
"import type { MessageCatalog } from '../../types/i18n';\n\n/** Declare the default locale's catalog. Returns it unchanged, typed with\n * its literal strings so `t()` checks keys and ICU parameters (the same\n * as writing `as const`). */\nexport const defineMessages = <const Catalog extends MessageCatalog>(\n\tcatalog: Catalog\n) => catalog;\n",
|
|
7
|
+
"/* Intl formatters are expensive to construct; keep one per locale and\n * options. Options are keyed by their JSON, which is stable for the plain\n * option objects callers pass. */\n\nconst numberFormats = new Map<string, Intl.NumberFormat>();\nconst dateTimeFormats = new Map<string, Intl.DateTimeFormat>();\nconst pluralRules = new Map<string, Intl.PluralRules>();\nconst relativeTimeFormats = new Map<string, Intl.RelativeTimeFormat>();\nconst listFormats = new Map<string, Intl.ListFormat>();\n\nconst cacheKey = (locale: string, options: object | undefined) =>\n\t`${locale}|${options ? JSON.stringify(options) : ''}`;\n\nconst cached = <Formatter>(\n\tcache: Map<string, Formatter>,\n\tkey: string,\n\tcreate: () => Formatter\n) => {\n\tconst existing = cache.get(key);\n\tif (existing) return existing;\n\tconst created = create();\n\tcache.set(key, created);\n\n\treturn created;\n};\n\nexport const getDateTimeFormat = (\n\tlocale: string,\n\toptions?: Intl.DateTimeFormatOptions\n) =>\n\tcached(\n\t\tdateTimeFormats,\n\t\tcacheKey(locale, options),\n\t\t() => new Intl.DateTimeFormat(locale, options)\n\t);\nexport const getListFormat = (\n\tlocale: string,\n\toptions?: Intl.ListFormatOptions\n) =>\n\tcached(\n\t\tlistFormats,\n\t\tcacheKey(locale, options),\n\t\t() => new Intl.ListFormat(locale, options)\n\t);\nexport const getNumberFormat = (\n\tlocale: string,\n\toptions?: Intl.NumberFormatOptions\n) =>\n\tcached(\n\t\tnumberFormats,\n\t\tcacheKey(locale, options),\n\t\t() => new Intl.NumberFormat(locale, options)\n\t);\nexport const getPluralRules = (\n\tlocale: string,\n\toptions?: Intl.PluralRulesOptions\n) =>\n\tcached(\n\t\tpluralRules,\n\t\tcacheKey(locale, options),\n\t\t() => new Intl.PluralRules(locale, options)\n\t);\nexport const getRelativeTimeFormat = (\n\tlocale: string,\n\toptions?: Intl.RelativeTimeFormatOptions\n) =>\n\tcached(\n\t\trelativeTimeFormats,\n\t\tcacheKey(locale, options),\n\t\t() => new Intl.RelativeTimeFormat(locale, options)\n\t);\n",
|
|
8
|
+
"/* A small ICU MessageFormat formatter on the platform's Intl APIs.\n *\n * Supported: `{name}`, `{name, number[, integer|percent|::currency/EUR]}`,\n * `{name, date|time[, short|medium|long|full]}`,\n * `{name, plural|selectordinal, [offset:N] =N {…} one {…} other {…}}` with\n * `#`, `{name, select, a {…} other {…}}`, nesting, and apostrophe quoting\n * (`''` is a quote, `'{…}'` is literal text). Parsed messages are cached\n * per string; Intl formatters are cached per locale and options. */\n\nimport {\n\tgetDateTimeFormat,\n\tgetNumberFormat,\n\tgetPluralRules\n} from './intlCache';\n\ntype TextNode = { kind: 'text'; value: string };\ntype PoundNode = { kind: 'pound' };\ntype ArgumentNode = {\n\tkind: 'argument';\n\tname: string;\n\tformat: string | undefined;\n\tstyle: string | undefined;\n};\ntype BranchNode = {\n\tkind: 'plural' | 'select' | 'selectordinal';\n\tname: string;\n\toffset: number;\n\toptions: Record<string, MessageNode[]>;\n};\nexport type MessageNode = ArgumentNode | BranchNode | PoundNode | TextNode;\n\ntype Cursor = { source: string; index: number };\ntype Branches = { offset: number; options: Record<string, MessageNode[]> };\n\nconst SYNTAX_CHARS = new Set(['{', '}', '#', '|']);\nconst WHITESPACE = /\\s/;\n\nconst isBranchKind = (\n\tvalue: string\n): value is 'plural' | 'select' | 'selectordinal' =>\n\tvalue === 'plural' || value === 'select' || value === 'selectordinal';\n\nconst skipWhitespace = (cursor: Cursor) => {\n\twhile (\n\t\tcursor.index < cursor.source.length &&\n\t\tWHITESPACE.test(cursor.source.charAt(cursor.index))\n\t) {\n\t\tcursor.index += 1;\n\t}\n};\n\nconst syntaxError = (cursor: Cursor, expected: string) =>\n\tnew SyntaxError(\n\t\t`Invalid ICU message (expected ${expected} at ${cursor.index}): ${cursor.source}`\n\t);\n\n/** Read up to (not including) the first of `stops`, trimmed. */\nconst readToken = (cursor: Cursor, stops: string) => {\n\tconst start = cursor.index;\n\twhile (\n\t\tcursor.index < cursor.source.length &&\n\t\t!stops.includes(cursor.source.charAt(cursor.index))\n\t) {\n\t\tcursor.index += 1;\n\t}\n\n\treturn cursor.source.slice(start, cursor.index).trim();\n};\n\nconst expectChar = (cursor: Cursor, char: string) => {\n\tskipWhitespace(cursor);\n\tif (cursor.source.charAt(cursor.index) !== char)\n\t\tthrow syntaxError(cursor, `\"${char}\"`);\n\tcursor.index += 1;\n};\n\n/** `'` handling: `''` → `'`; `'` before a syntax char opens a quoted run\n * that ends at the next lone `'`; any other `'` is literal. */\nconst readQuoted = (cursor: Cursor, inPlural: boolean) => {\n\tconst next = cursor.source.charAt(cursor.index + 1);\n\tif (next === \"'\") {\n\t\tcursor.index += 2;\n\n\t\treturn \"'\";\n\t}\n\tconst opensQuote = SYNTAX_CHARS.has(next) && (next !== '#' || inPlural);\n\tif (!opensQuote) {\n\t\tcursor.index += 1;\n\n\t\treturn \"'\";\n\t}\n\tcursor.index += 1;\n\tlet text = '';\n\twhile (cursor.index < cursor.source.length) {\n\t\tconst char = cursor.source.charAt(cursor.index);\n\t\tconst isEscapedQuote =\n\t\t\tchar === \"'\" && cursor.source.charAt(cursor.index + 1) === \"'\";\n\t\tif (char === \"'\" && !isEscapedQuote) break;\n\t\ttext += char;\n\t\tcursor.index += isEscapedQuote ? 2 : 1;\n\t}\n\tcursor.index += 1;\n\n\treturn text;\n};\n\nconst pushText = (nodes: MessageNode[], value: string) => {\n\tconst last = nodes[nodes.length - 1];\n\tif (last?.kind === 'text') {\n\t\tlast.value += value;\n\n\t\treturn;\n\t}\n\tnodes.push({ kind: 'text', value });\n};\n\n/** Read one `selector {message}` pair (or an `offset:N`) into `branches`. */\nconst parseBranchOption = (\n\tcursor: Cursor,\n\tkind: BranchNode['kind'],\n\tbranches: Branches\n) => {\n\tif (cursor.index >= cursor.source.length) throw syntaxError(cursor, '\"}\"');\n\tconst selector = readToken(cursor, '{} \\n\\t\\r');\n\tconst offsetMatch = /^offset:(\\d+)$/.exec(selector);\n\tif (offsetMatch && kind !== 'select') {\n\t\tbranches.offset = Number(offsetMatch[1]);\n\t\tskipWhitespace(cursor);\n\n\t\treturn;\n\t}\n\tif (selector === '') throw syntaxError(cursor, 'a selector');\n\texpectChar(cursor, '{');\n\tbranches.options[selector] = parseNodes(cursor, kind !== 'select');\n\texpectChar(cursor, '}');\n\tskipWhitespace(cursor);\n};\n\nconst parseBranchOptions = (cursor: Cursor, kind: BranchNode['kind']) => {\n\tconst branches: Branches = { offset: 0, options: {} };\n\tskipWhitespace(cursor);\n\twhile (cursor.source.charAt(cursor.index) !== '}') {\n\t\tparseBranchOption(cursor, kind, branches);\n\t}\n\tif (branches.options.other === undefined)\n\t\tthrow syntaxError(cursor, 'an \"other\" branch');\n\n\treturn branches;\n};\n\nconst parseArgument = (cursor: Cursor): MessageNode => {\n\tskipWhitespace(cursor);\n\tconst name = readToken(cursor, ',}');\n\tif (name === '') throw syntaxError(cursor, 'an argument name');\n\tif (cursor.source.charAt(cursor.index) === '}') {\n\t\tcursor.index += 1;\n\n\t\treturn { format: undefined, kind: 'argument', name, style: undefined };\n\t}\n\tcursor.index += 1;\n\tconst format = readToken(cursor, ',}');\n\tif (isBranchKind(format)) {\n\t\texpectChar(cursor, ',');\n\t\tconst { offset, options } = parseBranchOptions(cursor, format);\n\t\texpectChar(cursor, '}');\n\n\t\treturn { kind: format, name, offset, options };\n\t}\n\tlet style: string | undefined;\n\tif (cursor.source.charAt(cursor.index) === ',') {\n\t\tcursor.index += 1;\n\t\tstyle = readToken(cursor, '}');\n\t}\n\texpectChar(cursor, '}');\n\n\treturn { format, kind: 'argument', name, style };\n};\n\n/** Consume the node starting at the cursor (not a closing `}`). */\nconst parseNode = (cursor: Cursor, inPlural: boolean, nodes: MessageNode[]) => {\n\tconst char = cursor.source.charAt(cursor.index);\n\tif (char === '{') {\n\t\tcursor.index += 1;\n\t\tnodes.push(parseArgument(cursor));\n\n\t\treturn;\n\t}\n\tif (char === '#' && inPlural) {\n\t\tcursor.index += 1;\n\t\tnodes.push({ kind: 'pound' });\n\n\t\treturn;\n\t}\n\tif (char === \"'\") {\n\t\tpushText(nodes, readQuoted(cursor, inPlural));\n\n\t\treturn;\n\t}\n\tpushText(nodes, char);\n\tcursor.index += 1;\n};\n\nconst parseNodes = (cursor: Cursor, inPlural: boolean) => {\n\tconst nodes: MessageNode[] = [];\n\twhile (\n\t\tcursor.index < cursor.source.length &&\n\t\tcursor.source.charAt(cursor.index) !== '}'\n\t) {\n\t\tparseNode(cursor, inPlural, nodes);\n\t}\n\n\treturn nodes;\n};\n\n/** Parse an ICU message into nodes. Throws `SyntaxError` on bad syntax. */\nexport const parseMessage = (source: string) => {\n\tconst cursor: Cursor = { index: 0, source };\n\tconst nodes = parseNodes(cursor, false);\n\tif (cursor.index < source.length)\n\t\tthrow syntaxError(cursor, 'end of message');\n\n\treturn nodes;\n};\n\nconst parsedCache = new Map<string, MessageNode[] | SyntaxError>();\n\nconst parseCached = (source: string) => {\n\tconst cached = parsedCache.get(source);\n\tif (cached) return cached;\n\tlet parsed: MessageNode[] | SyntaxError;\n\ttry {\n\t\tparsed = parseMessage(source);\n\t} catch (error) {\n\t\tparsed =\n\t\t\terror instanceof SyntaxError\n\t\t\t\t? error\n\t\t\t\t: new SyntaxError(String(error));\n\t}\n\tparsedCache.set(source, parsed);\n\n\treturn parsed;\n};\n\nconst INTEGER_OPTIONS: Intl.NumberFormatOptions = { maximumFractionDigits: 0 };\nconst PERCENT_OPTIONS: Intl.NumberFormatOptions = { style: 'percent' };\n\nconst numberOptions = (style: string | undefined) => {\n\tif (style === 'integer') return INTEGER_OPTIONS;\n\tif (style === 'percent') return PERCENT_OPTIONS;\n\tconst currency = /^::currency\\/([A-Za-z]{3})$/.exec(style ?? '');\n\tconst options: Intl.NumberFormatOptions = currency?.[1]\n\t\t? { currency: currency[1].toUpperCase(), style: 'currency' }\n\t\t: {};\n\n\treturn options;\n};\n\nconst toDate = (value: unknown) => {\n\tif (value instanceof Date) return value;\n\tif (typeof value === 'number' || typeof value === 'string')\n\t\treturn new Date(value);\n\n\treturn undefined;\n};\n\nconst dateStyleOf = (style: string | undefined) => {\n\tif (style === 'full' || style === 'long' || style === 'short') return style;\n\n\treturn 'medium';\n};\n\nconst formatDateArgument = (\n\tlocale: string,\n\tvalue: unknown,\n\tformat: 'date' | 'time',\n\tstyle: string | undefined\n) => {\n\tconst date = toDate(value);\n\tif (!date || Number.isNaN(date.getTime())) return String(value);\n\tconst resolvedStyle = dateStyleOf(style);\n\tconst options: Intl.DateTimeFormatOptions =\n\t\tformat === 'date'\n\t\t\t? { dateStyle: resolvedStyle }\n\t\t\t: { timeStyle: resolvedStyle };\n\n\treturn getDateTimeFormat(locale, options).format(date);\n};\n\nconst formatValue = (locale: string, value: unknown) => {\n\tif (typeof value === 'number' || typeof value === 'bigint')\n\t\treturn getNumberFormat(locale).format(value);\n\tif (value instanceof Date) return getDateTimeFormat(locale).format(value);\n\n\treturn String(value);\n};\n\nconst formatArgument = (\n\tlocale: string,\n\tnode: ArgumentNode,\n\tparams: Record<string, unknown>\n) => {\n\tif (!(node.name in params)) return `{${node.name}}`;\n\tconst value = params[node.name];\n\tif (node.format === 'number') {\n\t\tconst numeric = typeof value === 'bigint' ? value : Number(value);\n\n\t\treturn getNumberFormat(locale, numberOptions(node.style)).format(\n\t\t\tnumeric\n\t\t);\n\t}\n\tif (node.format === 'date' || node.format === 'time')\n\t\treturn formatDateArgument(locale, value, node.format, node.style);\n\n\treturn formatValue(locale, value);\n};\n\nconst selectBranch = (locale: string, node: BranchNode, value: unknown) => {\n\tif (node.kind === 'select') {\n\t\treturn node.options[String(value)] ?? node.options.other ?? [];\n\t}\n\tconst numeric = Number(value);\n\tconst exact = node.options[`=${numeric}`];\n\tif (exact) return exact;\n\tconst category = getPluralRules(locale, {\n\t\ttype: node.kind === 'selectordinal' ? 'ordinal' : 'cardinal'\n\t}).select(numeric - node.offset);\n\n\treturn node.options[category] ?? node.options.other ?? [];\n};\n\nconst formatNodes = (\n\tlocale: string,\n\tnodes: MessageNode[],\n\tparams: Record<string, unknown>,\n\tpound: string | undefined\n): string =>\n\tnodes\n\t\t.map((node) => {\n\t\t\tif (node.kind === 'text') return node.value;\n\t\t\tif (node.kind === 'pound') return pound ?? '#';\n\t\t\tif (node.kind === 'argument')\n\t\t\t\treturn formatArgument(locale, node, params);\n\t\t\tif (!(node.name in params)) return `{${node.name}}`;\n\t\t\tconst value = params[node.name];\n\t\t\tconst branch = selectBranch(locale, node, value);\n\t\t\tconst branchPound =\n\t\t\t\tnode.kind === 'select'\n\t\t\t\t\t? pound\n\t\t\t\t\t: getNumberFormat(locale).format(\n\t\t\t\t\t\t\tNumber(value) - node.offset\n\t\t\t\t\t\t);\n\n\t\t\treturn formatNodes(locale, branch, params, branchPound);\n\t\t})\n\t\t.join('');\n\n/** Format an ICU message for `locale`. A message that fails to parse is\n * returned as written; a missing parameter renders as `{name}`. */\nexport const formatMessage = (\n\tlocale: string,\n\tmessage: string,\n\tparams: Record<string, unknown> = {}\n) => {\n\tif (!message.includes('{') && !message.includes(\"'\")) return message;\n\tconst parsed = parseCached(message);\n\tif (parsed instanceof SyntaxError) return message;\n\n\treturn formatNodes(locale, parsed, params, undefined);\n};\n",
|
|
9
|
+
"/* `@absolutejs/absolute/i18n`: the browser-safe half of i18n — the ICU\n * formatter, translators over a hydrated payload, Intl helpers and the\n * locale routing helpers. The server plugin (`defineI18n`, `i18nPlugin`)\n * is exported from `@absolutejs/absolute`. */\n\nexport { defineMessages } from './defineMessages';\nexport { formatMessage, parseMessage } from './formatMessage';\nexport type { MessageNode } from './formatMessage';\nexport {\n\talternateLinks,\n\tlocaleDirection,\n\tlocaleFromPath,\n\tlocalizePath,\n\tmatchLocale,\n\tnegotiateLocale,\n\tparseAcceptLanguage,\n\treadCookie,\n\tstripLocalePrefix\n} from './routing';\nexport {\n\tcreateTranslator,\n\tisI18nPayload,\n\tisMessageTree,\n\tlookupMessage\n} from './translator';\nexport type * from '../../types/i18n';\n",
|
|
10
|
+
"import type {\n\tDateInput,\n\tI18nPayload,\n\tMessageCatalog,\n\tMessageTree,\n\tTranslate,\n\tTranslator\n} from '../../types/i18n';\nimport { formatMessage } from './formatMessage';\nimport {\n\tgetDateTimeFormat,\n\tgetListFormat,\n\tgetNumberFormat,\n\tgetRelativeTimeFormat\n} from './intlCache';\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n\ttypeof value === 'object' && value !== null && !Array.isArray(value);\n\n/** The message at a dot-separated key, or undefined. */\nexport const lookupMessage = (messages: MessageTree, key: string) => {\n\tlet node: string | MessageTree | undefined = messages;\n\tfor (const segment of key.split('.')) {\n\t\tif (typeof node !== 'object') return undefined;\n\t\tnode = node[segment];\n\t}\n\n\treturn typeof node === 'string' ? node : undefined;\n};\n\nconst isMessageTreeValue = (value: unknown): value is string | MessageTree =>\n\ttypeof value === 'string' || isMessageTree(value);\n\n/** Whether `value` is an i18n payload (as passed through page props). */\nexport const isI18nPayload = (value: unknown): value is I18nPayload =>\n\tisRecord(value) &&\n\ttypeof value.locale === 'string' &&\n\ttypeof value.defaultLocale === 'string' &&\n\t(value.dir === 'ltr' || value.dir === 'rtl') &&\n\tisMessageTree(value.messages);\n/** Whether `value` is a catalog: nested plain objects of strings. */\nexport const isMessageTree = (value: unknown): value is MessageTree =>\n\tisRecord(value) && Object.values(value).every(isMessageTreeValue);\n\nconst toDate = (value: DateInput) =>\n\tvalue instanceof Date ? value : new Date(value);\n\nconst warnedKeys = new Set<string>();\n\nconst warnMissing = (locale: string, key: string) => {\n\tconst id = `${locale}:${key}`;\n\tif (warnedKeys.has(id)) return;\n\twarnedKeys.add(id);\n\tconsole.warn(`[i18n] Missing message \"${key}\" for locale \"${locale}\"`);\n};\n\n/** A translator over a payload's messages. Pass your default catalog's\n * type (`createTranslator<typeof en>(payload)`) to type-check keys and\n * ICU parameters. */\nexport const createTranslator = <Catalog = MessageCatalog>(\n\tpayload: I18nPayload\n) => {\n\tconst { locale, messages } = payload;\n\tconst t: Translate<Catalog> = (key, ...args: unknown[]) => {\n\t\tconst message = lookupMessage(messages, key);\n\t\tif (message === undefined) {\n\t\t\twarnMissing(locale, key);\n\n\t\t\treturn key;\n\t\t}\n\t\tconst [params] = args;\n\n\t\treturn formatMessage(locale, message, isRecord(params) ? params : {});\n\t};\n\tconst translator: Translator<Catalog> = {\n\t\tdir: payload.dir,\n\t\tlocale,\n\t\tt,\n\t\tformatDate: (value, options) =>\n\t\t\tgetDateTimeFormat(locale, options).format(toDate(value)),\n\t\tformatList: (items, options) =>\n\t\t\tgetListFormat(locale, options).format(items),\n\t\tformatNumber: (value, options) =>\n\t\t\tgetNumberFormat(locale, options).format(value),\n\t\tformatRelativeTime: (value, unit, options) =>\n\t\t\tgetRelativeTimeFormat(locale, options).format(value, unit),\n\t\thas: (key) => lookupMessage(messages, key) !== undefined\n\t};\n\n\treturn translator;\n};\n"
|
|
11
|
+
],
|
|
12
|
+
"mappings": "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",
|
|
13
|
+
"debugId": "0FA989FB7592974F64756E2164756E21",
|
|
14
|
+
"names": []
|
|
15
|
+
}
|