astro-intl 2.0.2 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/config-messages.test.js +3 -2
- package/dist/__tests__/fallback-routes.test.d.ts +1 -0
- package/dist/__tests__/fallback-routes.test.js +48 -0
- package/dist/core.d.ts +1 -1
- package/dist/core.js +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.js +29 -1
- package/dist/middleware.js +3 -1
- package/dist/store.d.ts +3 -1
- package/dist/store.js +64 -44
- package/dist/types/index.d.ts +6 -0
- package/package.json +12 -12
- package/dist/react.d.ts +0 -5
- package/dist/react.js +0 -42
|
@@ -75,9 +75,10 @@ describe("Config-based messages (simple approach)", () => {
|
|
|
75
75
|
await setRequestLocale(new URL("https://example.com/fr/page"));
|
|
76
76
|
expect(getTranslations()("greeting")).toBe("Bonjour");
|
|
77
77
|
});
|
|
78
|
-
it("should
|
|
78
|
+
it("should return false when no config or messages are provided", async () => {
|
|
79
79
|
const url = new URL("https://example.com/en/page");
|
|
80
|
-
await
|
|
80
|
+
const result = await setRequestLocale(url);
|
|
81
|
+
expect(result).toBe(false);
|
|
81
82
|
});
|
|
82
83
|
});
|
|
83
84
|
describe("defineRequestConfig (next-intl style)", () => {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach } from "vitest";
|
|
2
|
+
import { __resetRequestConfig } from "../core.js";
|
|
3
|
+
import { setFallbackRoutes, getFallbackRoutes } from "../store.js";
|
|
4
|
+
describe("Fallback Routes (Astro 6.1+)", () => {
|
|
5
|
+
beforeEach(() => {
|
|
6
|
+
__resetRequestConfig();
|
|
7
|
+
});
|
|
8
|
+
it("returns empty array by default", () => {
|
|
9
|
+
expect(getFallbackRoutes()).toEqual([]);
|
|
10
|
+
});
|
|
11
|
+
it("stores and retrieves fallback routes", () => {
|
|
12
|
+
const routes = [
|
|
13
|
+
{ pattern: "/fr/about", pathname: "/fr/about/", locale: "fr" },
|
|
14
|
+
{ pattern: "/de/about", pathname: "/de/about/", locale: "de" },
|
|
15
|
+
];
|
|
16
|
+
setFallbackRoutes(routes);
|
|
17
|
+
expect(getFallbackRoutes()).toEqual(routes);
|
|
18
|
+
});
|
|
19
|
+
it("overwrites previous fallback routes on re-set", () => {
|
|
20
|
+
setFallbackRoutes([
|
|
21
|
+
{ pattern: "/fr/about", pathname: "/fr/about/", locale: "fr" },
|
|
22
|
+
]);
|
|
23
|
+
const newRoutes = [
|
|
24
|
+
{ pattern: "/de/contact", pathname: "/de/contact/", locale: "de" },
|
|
25
|
+
];
|
|
26
|
+
setFallbackRoutes(newRoutes);
|
|
27
|
+
expect(getFallbackRoutes()).toEqual(newRoutes);
|
|
28
|
+
});
|
|
29
|
+
it("clears fallback routes on reset", () => {
|
|
30
|
+
setFallbackRoutes([
|
|
31
|
+
{ pattern: "/fr/about", pathname: "/fr/about/", locale: "fr" },
|
|
32
|
+
]);
|
|
33
|
+
__resetRequestConfig();
|
|
34
|
+
expect(getFallbackRoutes()).toEqual([]);
|
|
35
|
+
});
|
|
36
|
+
it("handles routes without pathname (pattern-only)", () => {
|
|
37
|
+
const routes = [
|
|
38
|
+
{ pattern: "/fr/blog/[...slug]", locale: "fr" },
|
|
39
|
+
];
|
|
40
|
+
setFallbackRoutes(routes);
|
|
41
|
+
expect(getFallbackRoutes()).toEqual(routes);
|
|
42
|
+
expect(getFallbackRoutes()[0].pathname).toBeUndefined();
|
|
43
|
+
});
|
|
44
|
+
it("handles empty array without errors", () => {
|
|
45
|
+
setFallbackRoutes([]);
|
|
46
|
+
expect(getFallbackRoutes()).toEqual([]);
|
|
47
|
+
});
|
|
48
|
+
});
|
package/dist/core.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { setRequestLocale, runWithLocale, getLocale, getLocales, isValidLocale, getMessages, getDefaultLocale, defineRequestConfig, __setConfigMessages, __resetRequestConfig, __setIntlConfig, } from "./store.js";
|
|
1
|
+
export { setRequestLocale, runWithLocale, getLocale, getLocales, isValidLocale, getMessages, getDefaultLocale, defineRequestConfig, getFallbackRoutes, setFallbackRoutes, __setConfigMessages, __resetRequestConfig, __setIntlConfig, } from "./store.js";
|
|
2
2
|
export { getTranslations } from "./translations.js";
|
|
3
3
|
export { getNestedValue, type DotPaths } from "./interpolation.js";
|
|
4
4
|
export { sanitizeLocale, sanitizeHtml, escapeRegExp } from "./sanitize.js";
|
package/dist/core.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// ─── Store (request lifecycle) ──────────────────────────────────────
|
|
2
|
-
export { setRequestLocale, runWithLocale, getLocale, getLocales, isValidLocale, getMessages, getDefaultLocale, defineRequestConfig, __setConfigMessages, __resetRequestConfig, __setIntlConfig, } from "./store.js";
|
|
2
|
+
export { setRequestLocale, runWithLocale, getLocale, getLocales, isValidLocale, getMessages, getDefaultLocale, defineRequestConfig, getFallbackRoutes, setFallbackRoutes, __setConfigMessages, __resetRequestConfig, __setIntlConfig, } from "./store.js";
|
|
3
3
|
// ─── Translations ───────────────────────────────────────────────────
|
|
4
4
|
export { getTranslations } from "./translations.js";
|
|
5
5
|
// ─── Interpolation utilities ────────────────────────────────────────
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { AstroIntegration } from "astro";
|
|
2
2
|
import type { MessagesConfig, RoutesMap } from "./types/index.js";
|
|
3
|
-
import { setRequestLocale as _setRequestLocale, runWithLocale as _runWithLocale, getLocale as _getLocale, getLocales as _getLocales, isValidLocale as _isValidLocale, getMessages as _getMessages, getTranslations as _getTranslations, defineRequestConfig as _defineRequestConfig,
|
|
3
|
+
import { setRequestLocale as _setRequestLocale, runWithLocale as _runWithLocale, getLocale as _getLocale, getLocales as _getLocales, isValidLocale as _isValidLocale, getMessages as _getMessages, getTranslations as _getTranslations, defineRequestConfig as _defineRequestConfig, getFallbackRoutes as _getFallbackRoutes, __resetRequestConfig as _resetRequestConfig } from "./core.js";
|
|
4
|
+
import { path as _path, switchLocalePath as _switchLocalePath } from "./core.js";
|
|
4
5
|
export type AstroIntlOptions = {
|
|
5
6
|
enabled?: boolean;
|
|
6
7
|
defaultLocale?: string;
|
|
@@ -18,7 +19,8 @@ export declare const getMessages: typeof _getMessages;
|
|
|
18
19
|
export declare const getTranslations: typeof _getTranslations;
|
|
19
20
|
export declare const defineRequestConfig: typeof _defineRequestConfig;
|
|
20
21
|
export declare const __resetRequestConfig: typeof _resetRequestConfig;
|
|
22
|
+
export declare const getFallbackRoutes: typeof _getFallbackRoutes;
|
|
21
23
|
export declare const path: typeof _path;
|
|
22
24
|
export declare const switchLocalePath: typeof _switchLocalePath;
|
|
23
|
-
export type { RequestConfig, Primitive, GetRequestConfigFn, MessagesConfig, IntlConfig, RoutesMap, ExtractParams, ParamsForRoute, } from "./types/index.js";
|
|
25
|
+
export type { RequestConfig, Primitive, GetRequestConfigFn, MessagesConfig, IntlConfig, RoutesMap, ExtractParams, ParamsForRoute, FallbackRouteInfo, } from "./types/index.js";
|
|
24
26
|
export type { DotPaths } from "./core.js";
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { setRequestLocale as _setRequestLocale, runWithLocale as _runWithLocale, getLocale as _getLocale, getLocales as _getLocales, isValidLocale as _isValidLocale, getMessages as _getMessages, getTranslations as _getTranslations, defineRequestConfig as _defineRequestConfig,
|
|
1
|
+
import { setRequestLocale as _setRequestLocale, runWithLocale as _runWithLocale, getLocale as _getLocale, getLocales as _getLocales, isValidLocale as _isValidLocale, getMessages as _getMessages, getTranslations as _getTranslations, defineRequestConfig as _defineRequestConfig, getFallbackRoutes as _getFallbackRoutes, setFallbackRoutes as _setFallbackRoutes, __resetRequestConfig as _resetRequestConfig, __setConfigMessages, __setIntlConfig, } from "./core.js";
|
|
2
|
+
import { path as _path, switchLocalePath as _switchLocalePath } from "./core.js";
|
|
2
3
|
export default function astroIntl(options = {}) {
|
|
3
4
|
const { enabled = true, defaultLocale, locales, messages, routes } = options;
|
|
4
5
|
if (defaultLocale || locales || routes) {
|
|
@@ -27,6 +28,32 @@ export default function astroIntl(options = {}) {
|
|
|
27
28
|
},
|
|
28
29
|
});
|
|
29
30
|
},
|
|
31
|
+
"astro:routes:resolved": ({ routes }) => {
|
|
32
|
+
if (!enabled)
|
|
33
|
+
return;
|
|
34
|
+
const collected = [];
|
|
35
|
+
for (const route of routes) {
|
|
36
|
+
// fallbackRoutes is available in Astro 6.1+
|
|
37
|
+
const fallbacks = route.fallbackRoutes;
|
|
38
|
+
if (!fallbacks)
|
|
39
|
+
continue;
|
|
40
|
+
for (const fb of fallbacks) {
|
|
41
|
+
// Extract locale from the pattern (first segment after /)
|
|
42
|
+
const segments = (fb.pathname ?? fb.pattern).split("/");
|
|
43
|
+
const locale = segments[1] || "";
|
|
44
|
+
if (locale) {
|
|
45
|
+
collected.push({
|
|
46
|
+
pattern: fb.pattern,
|
|
47
|
+
pathname: fb.pathname,
|
|
48
|
+
locale,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (collected.length > 0) {
|
|
54
|
+
_setFallbackRoutes(collected);
|
|
55
|
+
}
|
|
56
|
+
},
|
|
30
57
|
},
|
|
31
58
|
};
|
|
32
59
|
}
|
|
@@ -40,5 +67,6 @@ export const getMessages = _getMessages;
|
|
|
40
67
|
export const getTranslations = _getTranslations;
|
|
41
68
|
export const defineRequestConfig = _defineRequestConfig;
|
|
42
69
|
export const __resetRequestConfig = _resetRequestConfig;
|
|
70
|
+
export const getFallbackRoutes = _getFallbackRoutes;
|
|
43
71
|
export const path = _path;
|
|
44
72
|
export const switchLocalePath = _switchLocalePath;
|
package/dist/middleware.js
CHANGED
|
@@ -44,7 +44,9 @@ export function createIntlMiddleware(options) {
|
|
|
44
44
|
if (!lang || !locales.includes(lang)) {
|
|
45
45
|
return next();
|
|
46
46
|
}
|
|
47
|
-
await setRequestLocale(context.url);
|
|
47
|
+
const ok = await setRequestLocale(context.url);
|
|
48
|
+
if (!ok)
|
|
49
|
+
return next();
|
|
48
50
|
// Rewrite translated routes to their canonical filesystem paths
|
|
49
51
|
if (routes) {
|
|
50
52
|
const rewrittenPath = resolveTranslatedRoute(context.url.pathname, lang, routes, resolvedDefaultLocale);
|
package/dist/store.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { GetRequestConfigFn, MessagesConfig, IntlConfig, RequestConfig, RoutesMap } from "./types/index.js";
|
|
1
|
+
import type { GetRequestConfigFn, MessagesConfig, IntlConfig, RequestConfig, RoutesMap, FallbackRouteInfo } from "./types/index.js";
|
|
2
2
|
export declare function __setIntlConfig(config: Partial<IntlConfig>): void;
|
|
3
3
|
export declare function getDefaultLocale(): string;
|
|
4
4
|
export declare function getRoutes(): RoutesMap | undefined;
|
|
@@ -7,6 +7,8 @@ export declare function isValidLocale(locale: string): boolean;
|
|
|
7
7
|
export declare function defineRequestConfig(fn: (locale: string) => Promise<RequestConfig> | RequestConfig): GetRequestConfigFn;
|
|
8
8
|
export declare function __setConfigMessages(messages: MessagesConfig): void;
|
|
9
9
|
export declare function __resetRequestConfig(): void;
|
|
10
|
+
export declare function setFallbackRoutes(routes: FallbackRouteInfo[]): void;
|
|
11
|
+
export declare function getFallbackRoutes(): FallbackRouteInfo[];
|
|
10
12
|
export declare function setRequestLocale(url: URL, getConfig?: GetRequestConfigFn): Promise<boolean>;
|
|
11
13
|
export declare function runWithLocale<R>(url: URL, fn: () => R | Promise<R>, getConfig?: GetRequestConfigFn): Promise<R>;
|
|
12
14
|
export declare function getLocale(): string;
|
package/dist/store.js
CHANGED
|
@@ -1,73 +1,91 @@
|
|
|
1
1
|
import { sanitizeLocale } from "./sanitize.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
2
|
+
const GLOBAL_KEY = Symbol.for("__astro_intl_store__");
|
|
3
|
+
const g = globalThis;
|
|
4
|
+
function getGlobalState() {
|
|
5
|
+
const existing = g[GLOBAL_KEY];
|
|
6
|
+
if (existing)
|
|
7
|
+
return existing;
|
|
8
|
+
const fresh = {
|
|
9
|
+
registeredGetRequestConfig: null,
|
|
10
|
+
configMessages: null,
|
|
11
|
+
intlConfig: { defaultLocale: "en", locales: [] },
|
|
12
|
+
als: null,
|
|
13
|
+
alsInitialized: false,
|
|
14
|
+
fallbackState: null,
|
|
15
|
+
};
|
|
16
|
+
g[GLOBAL_KEY] = fresh;
|
|
17
|
+
return fresh;
|
|
18
|
+
}
|
|
19
|
+
const $ = getGlobalState();
|
|
20
|
+
// ─── AsyncLocalStorage detection ────────────────────────────────────
|
|
8
21
|
function ensureAls() {
|
|
9
|
-
if (alsInitialized)
|
|
22
|
+
if ($.alsInitialized)
|
|
10
23
|
return;
|
|
11
|
-
alsInitialized = true;
|
|
24
|
+
$.alsInitialized = true;
|
|
12
25
|
try {
|
|
13
26
|
const g = globalThis;
|
|
14
27
|
if (typeof g.AsyncLocalStorage === "function") {
|
|
15
|
-
als = new g.AsyncLocalStorage();
|
|
28
|
+
$.als = new g.AsyncLocalStorage();
|
|
16
29
|
}
|
|
17
30
|
}
|
|
18
31
|
catch {
|
|
19
32
|
// Not available — fallback mode
|
|
20
33
|
}
|
|
21
34
|
}
|
|
22
|
-
// ─── Fallback global variable (for runtimes without ALS) ────────────
|
|
23
|
-
let fallbackState = null;
|
|
24
35
|
// ─── Internal getters/setters ───────────────────────────────────────
|
|
25
36
|
function getRequestState() {
|
|
26
37
|
ensureAls();
|
|
27
|
-
if (als) {
|
|
28
|
-
return als.getStore() ?? null;
|
|
38
|
+
if ($.als) {
|
|
39
|
+
return $.als.getStore() ?? null;
|
|
29
40
|
}
|
|
30
|
-
return fallbackState;
|
|
41
|
+
return $.fallbackState;
|
|
31
42
|
}
|
|
32
43
|
// ─── Public API ─────────────────────────────────────────────────────
|
|
33
44
|
export function __setIntlConfig(config) {
|
|
34
45
|
if (config.defaultLocale) {
|
|
35
|
-
intlConfig = {
|
|
46
|
+
$.intlConfig = { ...$.intlConfig, defaultLocale: config.defaultLocale };
|
|
36
47
|
}
|
|
37
48
|
if (config.locales) {
|
|
38
|
-
intlConfig = {
|
|
49
|
+
$.intlConfig = { ...$.intlConfig, locales: config.locales };
|
|
39
50
|
}
|
|
40
51
|
if (config.routes) {
|
|
41
|
-
intlConfig = {
|
|
52
|
+
$.intlConfig = { ...$.intlConfig, routes: config.routes };
|
|
42
53
|
detectRouteConflicts(config.routes);
|
|
43
54
|
}
|
|
44
55
|
}
|
|
45
56
|
export function getDefaultLocale() {
|
|
46
|
-
return intlConfig.defaultLocale;
|
|
57
|
+
return $.intlConfig.defaultLocale;
|
|
47
58
|
}
|
|
48
59
|
export function getRoutes() {
|
|
49
|
-
return intlConfig.routes;
|
|
60
|
+
return $.intlConfig.routes;
|
|
50
61
|
}
|
|
51
62
|
export function getLocales() {
|
|
52
|
-
return intlConfig.locales;
|
|
63
|
+
return $.intlConfig.locales;
|
|
53
64
|
}
|
|
54
65
|
export function isValidLocale(locale) {
|
|
55
|
-
if (intlConfig.locales.length === 0)
|
|
66
|
+
if ($.intlConfig.locales.length === 0)
|
|
56
67
|
return true;
|
|
57
|
-
return intlConfig.locales.includes(locale);
|
|
68
|
+
return $.intlConfig.locales.includes(locale);
|
|
58
69
|
}
|
|
59
70
|
export function defineRequestConfig(fn) {
|
|
60
|
-
registeredGetRequestConfig = fn;
|
|
71
|
+
$.registeredGetRequestConfig = fn;
|
|
61
72
|
return fn;
|
|
62
73
|
}
|
|
63
74
|
export function __setConfigMessages(messages) {
|
|
64
|
-
configMessages = messages;
|
|
75
|
+
$.configMessages = messages;
|
|
65
76
|
}
|
|
66
77
|
export function __resetRequestConfig() {
|
|
67
|
-
registeredGetRequestConfig = null;
|
|
68
|
-
configMessages = null;
|
|
69
|
-
fallbackState = null;
|
|
70
|
-
intlConfig = { defaultLocale: "en", locales: [], routes: undefined };
|
|
78
|
+
$.registeredGetRequestConfig = null;
|
|
79
|
+
$.configMessages = null;
|
|
80
|
+
$.fallbackState = null;
|
|
81
|
+
$.intlConfig = { defaultLocale: "en", locales: [], routes: undefined, fallbackRoutes: [] };
|
|
82
|
+
}
|
|
83
|
+
// ─── Fallback routes (Astro 6.1+ astro:routes:resolved) ─────────────
|
|
84
|
+
export function setFallbackRoutes(routes) {
|
|
85
|
+
$.intlConfig = { ...$.intlConfig, fallbackRoutes: routes };
|
|
86
|
+
}
|
|
87
|
+
export function getFallbackRoutes() {
|
|
88
|
+
return $.intlConfig.fallbackRoutes ?? [];
|
|
71
89
|
}
|
|
72
90
|
// ─── Route conflict detection ────────────────────────────────────────
|
|
73
91
|
function normalizeTemplate(template) {
|
|
@@ -113,11 +131,11 @@ async function resolveMessages(locale, source) {
|
|
|
113
131
|
// ─── setRequestLocale ───────────────────────────────────────────────
|
|
114
132
|
export async function setRequestLocale(url, getConfig) {
|
|
115
133
|
const [, lang] = url.pathname.split("/");
|
|
116
|
-
if (lang && intlConfig.locales.length > 0 &&
|
|
134
|
+
if (lang && $.intlConfig.locales.length > 0 && !$.intlConfig.locales.includes(lang)) {
|
|
117
135
|
return false;
|
|
118
136
|
}
|
|
119
|
-
const locale = sanitizeLocale(lang || intlConfig.defaultLocale);
|
|
120
|
-
const resolvedGetConfig = getConfig ?? registeredGetRequestConfig;
|
|
137
|
+
const locale = sanitizeLocale(lang || $.intlConfig.defaultLocale);
|
|
138
|
+
const resolvedGetConfig = getConfig ?? $.registeredGetRequestConfig;
|
|
121
139
|
let state;
|
|
122
140
|
if (resolvedGetConfig) {
|
|
123
141
|
const config = await resolvedGetConfig(locale);
|
|
@@ -126,42 +144,44 @@ export async function setRequestLocale(url, getConfig) {
|
|
|
126
144
|
messages: config.messages,
|
|
127
145
|
};
|
|
128
146
|
}
|
|
129
|
-
else if (configMessages) {
|
|
130
|
-
const messages = await resolveMessages(locale, configMessages);
|
|
147
|
+
else if ($.configMessages) {
|
|
148
|
+
const messages = await resolveMessages(locale, $.configMessages);
|
|
131
149
|
state = { locale, messages };
|
|
132
150
|
}
|
|
133
151
|
else {
|
|
134
|
-
|
|
135
|
-
|
|
152
|
+
// No config available — this can happen when Astro 6's built-in i18n
|
|
153
|
+
// router triggers internal reroutes before the user middleware runs.
|
|
154
|
+
// Return false so the caller can decide what to do.
|
|
155
|
+
return false;
|
|
136
156
|
}
|
|
137
|
-
fallbackState = state;
|
|
157
|
+
$.fallbackState = state;
|
|
138
158
|
return true;
|
|
139
159
|
}
|
|
140
160
|
// ─── runWithLocale (concurrency-safe via AsyncLocalStorage) ─────────
|
|
141
161
|
export async function runWithLocale(url, fn, getConfig) {
|
|
142
162
|
const [, lang] = url.pathname.split("/");
|
|
143
|
-
const locale = sanitizeLocale(lang || intlConfig.defaultLocale);
|
|
144
|
-
const resolvedGetConfig = getConfig ?? registeredGetRequestConfig;
|
|
163
|
+
const locale = sanitizeLocale(lang || $.intlConfig.defaultLocale);
|
|
164
|
+
const resolvedGetConfig = getConfig ?? $.registeredGetRequestConfig;
|
|
145
165
|
let state;
|
|
146
166
|
if (resolvedGetConfig) {
|
|
147
167
|
const config = await resolvedGetConfig(locale);
|
|
148
168
|
state = { locale: config.locale, messages: config.messages };
|
|
149
169
|
}
|
|
150
|
-
else if (configMessages) {
|
|
151
|
-
const messages = await resolveMessages(locale, configMessages);
|
|
170
|
+
else if ($.configMessages) {
|
|
171
|
+
const messages = await resolveMessages(locale, $.configMessages);
|
|
152
172
|
state = { locale, messages };
|
|
153
173
|
}
|
|
154
174
|
else {
|
|
155
175
|
throw new Error("[astro-intl] No getRequestConfig or messages provided. " +
|
|
156
176
|
"Either pass getConfig to setRequestLocale(), use defineRequestConfig(), or add messages to the integration options.");
|
|
157
177
|
}
|
|
158
|
-
if (als) {
|
|
159
|
-
return als.run(state, () => {
|
|
160
|
-
fallbackState = state;
|
|
178
|
+
if ($.als) {
|
|
179
|
+
return $.als.run(state, () => {
|
|
180
|
+
$.fallbackState = state;
|
|
161
181
|
return fn();
|
|
162
182
|
});
|
|
163
183
|
}
|
|
164
|
-
fallbackState = state;
|
|
184
|
+
$.fallbackState = state;
|
|
165
185
|
return fn();
|
|
166
186
|
}
|
|
167
187
|
// ─── Read current state ─────────────────────────────────────────────
|
package/dist/types/index.d.ts
CHANGED
|
@@ -14,8 +14,14 @@ export type RoutesMap = {
|
|
|
14
14
|
};
|
|
15
15
|
export type ExtractParams<T extends string> = T extends `${string}[${infer P}]${infer Rest}` ? P | ExtractParams<Rest> : never;
|
|
16
16
|
export type ParamsForRoute<Template extends string> = [ExtractParams<Template>] extends [never] ? Record<string, never> : Record<ExtractParams<Template>, string>;
|
|
17
|
+
export type FallbackRouteInfo = {
|
|
18
|
+
pattern: string;
|
|
19
|
+
pathname?: string;
|
|
20
|
+
locale: string;
|
|
21
|
+
};
|
|
17
22
|
export type IntlConfig = {
|
|
18
23
|
defaultLocale: string;
|
|
19
24
|
locales: string[];
|
|
20
25
|
routes?: RoutesMap;
|
|
26
|
+
fallbackRoutes?: FallbackRouteInfo[];
|
|
21
27
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "astro-intl",
|
|
3
|
-
"version": "2.0
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Sistema de internacionalización simple y type-safe para Astro.",
|
|
6
6
|
"keywords": [
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
}
|
|
59
59
|
},
|
|
60
60
|
"peerDependencies": {
|
|
61
|
-
"astro": "^4 || ^5"
|
|
61
|
+
"astro": "^4 || ^5 || ^6"
|
|
62
62
|
},
|
|
63
63
|
"peerDependenciesMeta": {
|
|
64
64
|
"react": {
|
|
@@ -80,20 +80,20 @@
|
|
|
80
80
|
"access": "public"
|
|
81
81
|
},
|
|
82
82
|
"devDependencies": {
|
|
83
|
-
"@eslint/js": "^9.
|
|
83
|
+
"@eslint/js": "^9.39.4",
|
|
84
84
|
"@testing-library/jest-dom": "^6.9.1",
|
|
85
85
|
"@testing-library/react": "^16.3.2",
|
|
86
|
-
"@types/react": "^18.3.
|
|
87
|
-
"@vitest/ui": "^4.
|
|
88
|
-
"astro": "^
|
|
89
|
-
"eslint": "^9.
|
|
90
|
-
"happy-dom": "^20.
|
|
91
|
-
"prettier": "^3.
|
|
86
|
+
"@types/react": "^18.3.28",
|
|
87
|
+
"@vitest/ui": "^4.1.2",
|
|
88
|
+
"astro": "^6.1.2",
|
|
89
|
+
"eslint": "^9.39.4",
|
|
90
|
+
"happy-dom": "^20.8.9",
|
|
91
|
+
"prettier": "^3.8.1",
|
|
92
92
|
"react": "^19.2.4",
|
|
93
93
|
"react-dom": "^19.2.4",
|
|
94
|
+
"svelte": "^5.55.1",
|
|
94
95
|
"typescript": "^5.9.3",
|
|
95
|
-
"typescript-eslint": "^8.
|
|
96
|
-
"
|
|
97
|
-
"vitest": "^4.0.18"
|
|
96
|
+
"typescript-eslint": "^8.58.0",
|
|
97
|
+
"vitest": "^4.1.2"
|
|
98
98
|
}
|
|
99
99
|
}
|
package/dist/react.d.ts
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import type { ReactNode } from "react";
|
|
2
|
-
import { type DotPaths } from "./interpolation.js";
|
|
3
|
-
export declare function createGetTranslationsReact<UI extends Record<string, Record<string, unknown>>, DefaultLocale extends keyof UI>(ui: UI, defaultLocale: DefaultLocale): <N extends keyof UI[DefaultLocale]>(lang: string | undefined, namespace: N) => ((key: DotPaths<UI[DefaultLocale][N]>) => string) & {
|
|
4
|
-
rich: (key: DotPaths<UI[DefaultLocale][N]>, tags: Record<string, (chunks: string) => ReactNode>) => ReactNode[];
|
|
5
|
-
};
|
package/dist/react.js
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { getNestedValue } from "./interpolation.js";
|
|
2
|
-
import { escapeRegExp } from "./sanitize.js";
|
|
3
|
-
export function createGetTranslationsReact(ui, defaultLocale) {
|
|
4
|
-
return function getTranslationsReact(lang, namespace) {
|
|
5
|
-
const resolvedLang = lang && lang in ui ? lang : defaultLocale;
|
|
6
|
-
const messages = ui[resolvedLang][namespace];
|
|
7
|
-
function t(key) {
|
|
8
|
-
const value = getNestedValue(messages, key);
|
|
9
|
-
return typeof value === "string" ? value : key;
|
|
10
|
-
}
|
|
11
|
-
const rich = function (key, tags) {
|
|
12
|
-
const str = t(key);
|
|
13
|
-
// Función recursiva para procesar tags anidados
|
|
14
|
-
function processString(input) {
|
|
15
|
-
const tagNames = Object.keys(tags).map(escapeRegExp);
|
|
16
|
-
const regex = new RegExp(`<(${tagNames.join("|")})>(.*?)<\\/(\\1)>`, "g");
|
|
17
|
-
const result = [];
|
|
18
|
-
let lastIndex = 0;
|
|
19
|
-
let match;
|
|
20
|
-
while ((match = regex.exec(input)) !== null) {
|
|
21
|
-
if (match.index > lastIndex) {
|
|
22
|
-
result.push(input.slice(lastIndex, match.index));
|
|
23
|
-
}
|
|
24
|
-
const [, tag, chunks] = match;
|
|
25
|
-
// Procesar recursivamente el contenido del tag
|
|
26
|
-
const processedChunks = processString(chunks);
|
|
27
|
-
const chunksAsString = processedChunks
|
|
28
|
-
.map((chunk) => (typeof chunk === "string" ? chunk : ""))
|
|
29
|
-
.join("");
|
|
30
|
-
result.push(tags[tag](chunksAsString));
|
|
31
|
-
lastIndex = match.index + match[0].length;
|
|
32
|
-
}
|
|
33
|
-
if (lastIndex < input.length)
|
|
34
|
-
result.push(input.slice(lastIndex));
|
|
35
|
-
return result;
|
|
36
|
-
}
|
|
37
|
-
return processString(str);
|
|
38
|
-
};
|
|
39
|
-
Object.assign(t, { rich });
|
|
40
|
-
return t;
|
|
41
|
-
};
|
|
42
|
-
}
|