@let-value/translate-react 1.1.2-beta.2 → 1.1.2

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/index.cjs CHANGED
@@ -168,14 +168,64 @@ function Plural({ number, forms, context }) {
168
168
  return (0, react.createElement)(react.Fragment, null, ...result);
169
169
  }
170
170
 
171
+ //#endregion
172
+ //#region src/translatorCache.ts
173
+ const cacheNoParent = /* @__PURE__ */ new WeakMap();
174
+ const cacheWithParent = /* @__PURE__ */ new WeakMap();
175
+ function getFromWeakMap(translations, parent) {
176
+ if (!parent) return cacheNoParent.get(translations);
177
+ return cacheWithParent.get(translations)?.get(parent);
178
+ }
179
+ function setInWeakMap(translations, parent, translator) {
180
+ if (!parent) {
181
+ cacheNoParent.set(translations, translator);
182
+ return;
183
+ }
184
+ let byParent = cacheWithParent.get(translations);
185
+ if (!byParent) {
186
+ byParent = /* @__PURE__ */ new WeakMap();
187
+ cacheWithParent.set(translations, byParent);
188
+ }
189
+ byParent.set(parent, translator);
190
+ }
191
+ const MAX_STRUCTURAL_ENTRIES = 32;
192
+ const structuralCache = [];
193
+ function toSortedEntries(translations) {
194
+ return Object.entries(translations).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0);
195
+ }
196
+ function findStructural(sortedEntries, parent) {
197
+ for (const entry of structuralCache) {
198
+ if (entry.parent !== parent || entry.sortedEntries.length !== sortedEntries.length) continue;
199
+ if (entry.sortedEntries.every(([k, v], i) => sortedEntries[i][0] === k && sortedEntries[i][1] === v)) return entry.translator;
200
+ }
201
+ }
202
+ function getCachedTranslator(translations, parent) {
203
+ const cached = getFromWeakMap(translations, parent);
204
+ if (cached) return cached;
205
+ const sortedEntries = toSortedEntries(translations);
206
+ const structural = findStructural(sortedEntries, parent);
207
+ if (structural) {
208
+ setInWeakMap(translations, parent, structural);
209
+ return structural;
210
+ }
211
+ const translator = new __let_value_translate.Translator(translations, parent);
212
+ setInWeakMap(translations, parent, translator);
213
+ structuralCache.unshift({
214
+ sortedEntries,
215
+ parent,
216
+ translator
217
+ });
218
+ if (structuralCache.length > MAX_STRUCTURAL_ENTRIES) structuralCache.pop();
219
+ return translator;
220
+ }
221
+
171
222
  //#endregion
172
223
  //#region src/components/TranslationsProvider.ts
173
- function TranslationsProvider({ translations = {}, children }) {
224
+ const EMPTY_TRANSLATIONS = {};
225
+ function TranslationsProvider({ translations = EMPTY_TRANSLATIONS, children }) {
174
226
  const parent = (0, react.use)(translatorContext);
175
- const translator = (0, react.useMemo)(() => {
176
- return new __let_value_translate.Translator(translations, parent);
177
- }, [parent, translations]);
178
- return (0, react.createElement)(translatorContext.Provider, { value: translator }, (0, react.createElement)(react.Suspense, null, children));
227
+ const translator = getCachedTranslator(translations, parent);
228
+ return (0, react.createElement)(translatorContext.Provider, { value: translator }, children);
179
229
  }
180
230
 
181
231
  //#endregion
package/dist/index.d.cts CHANGED
@@ -1,6 +1,8 @@
1
- import { Locale, LocaleTranslator, Translator } from "@let-value/translate";
2
- import * as react0 from "react";
1
+ import * as _let_value_translate0 from "@let-value/translate";
2
+ import { Locale, LocaleTranslator } from "@let-value/translate";
3
+ import * as react1 from "react";
3
4
  import { ReactNode } from "react";
5
+ import * as gettext_parser0 from "gettext-parser";
4
6
  import { GetTextTranslations } from "gettext-parser";
5
7
  export * from "@let-value/translate";
6
8
 
@@ -12,7 +14,7 @@ interface LocaleProviderProps {
12
14
  declare function LocaleProvider({
13
15
  locale,
14
16
  children
15
- }: LocaleProviderProps): react0.FunctionComponentElement<react0.ProviderProps<Locale | undefined>>;
17
+ }: LocaleProviderProps): react1.FunctionComponentElement<react1.ProviderProps<Locale | undefined>>;
16
18
  //#endregion
17
19
  //#region src/components/Message.d.ts
18
20
  interface MessageProps {
@@ -22,7 +24,7 @@ interface MessageProps {
22
24
  declare function Message({
23
25
  context,
24
26
  children
25
- }: MessageProps): string | react0.FunctionComponentElement<react0.FragmentProps>;
27
+ }: MessageProps): string | react1.FunctionComponentElement<react1.FragmentProps>;
26
28
  //#endregion
27
29
  //#region src/components/Plural.d.ts
28
30
  interface PluralProps {
@@ -34,11 +36,13 @@ declare function Plural({
34
36
  number,
35
37
  forms,
36
38
  context
37
- }: PluralProps): react0.FunctionComponentElement<react0.FragmentProps>;
39
+ }: PluralProps): react1.FunctionComponentElement<react1.FragmentProps>;
38
40
  //#endregion
39
- //#region src/components/TranslationsProvider.d.ts
41
+ //#region src/translatorCache.d.ts
40
42
  type TranslationLoader = () => Promise<GetTextTranslations>;
41
43
  type TranslationEntry = GetTextTranslations | TranslationLoader;
44
+ //#endregion
45
+ //#region src/components/TranslationsProvider.d.ts
42
46
  interface TranslationsProviderProps {
43
47
  translations?: Partial<Record<Locale, TranslationEntry>>;
44
48
  children?: ReactNode;
@@ -46,12 +50,12 @@ interface TranslationsProviderProps {
46
50
  declare function TranslationsProvider({
47
51
  translations,
48
52
  children
49
- }: TranslationsProviderProps): react0.FunctionComponentElement<react0.ProviderProps<Translator<Partial<Record<Locale, (GetTextTranslations | {
50
- default: GetTextTranslations;
51
- }) | Promise<GetTextTranslations | {
52
- default: GetTextTranslations;
53
- }> | (() => Promise<GetTextTranslations | {
54
- default: GetTextTranslations;
53
+ }: TranslationsProviderProps): react1.FunctionComponentElement<react1.ProviderProps<_let_value_translate0.Translator<Partial<Record<Locale, (gettext_parser0.GetTextTranslations | {
54
+ default: gettext_parser0.GetTextTranslations;
55
+ }) | Promise<gettext_parser0.GetTextTranslations | {
56
+ default: gettext_parser0.GetTextTranslations;
57
+ }> | (() => Promise<gettext_parser0.GetTextTranslations | {
58
+ default: gettext_parser0.GetTextTranslations;
55
59
  }>)>>> | undefined>>;
56
60
  //#endregion
57
61
  //#region src/hooks/useLocale.d.ts
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../src/components/LocaleProvider.ts","../src/components/Message.ts","../src/components/Plural.ts","../src/components/TranslationsProvider.ts","../src/hooks/useLocale.ts","../src/hooks/useTranslations.ts"],"sourcesContent":[],"mappings":";;;;;;;UAIiB,mBAAA;UACL;aACG;;iBAGC,cAAA;;;GAAqC,sBAAmB,MAAA,CAAA,yBAAA,MAAA,CAAA,cAAA;;;UCHvD,YAAA;;YAEH;;iBAGE,OAAA;;;GAA+B,wBAAY,MAAA,CAAA,yBAAA,MAAA,CAAA,aAAA;;;UCL1C,WAAA;;kBAEG;;;iBAIJ,MAAA;;;;GAAmC,cAAW,MAAA,CAAA,yBAAA,MAAA,CAAA,aAAA;;;KCNzD,iBAAA,SAA0B,QAAQ;KAClC,gBAAA,GAAmB,sBAAsB;UAE7B,yBAAA;iBACE,QAAQ,OAAO,QAAQ;EHNzB,QAAA,CAAA,EGOF,SHPE;;AACL,iBGSI,oBAAA,CHTJ;EAAA,YAAA;EAAA;AAAA,CAAA,EGS0D,yBHT1D,CAAA,EGSmF,MAAA,CAAA,wBHTnF,CGSmF,MAAA,CAAA,aHTnF,CGSmF,UHTnF,CGSmF,OHTnF,CGSmF,MHTnF,CGSmF,MHTnF,EAAA,CGSmF,mBHTnF,GAAA;SACG,qBAAA;CAAS,CAAA,UAAA,oBAAA,GAAA;EAGR,OAAA,qBAAc;CAAA,CAAA,GAAA,CAAA,GAAA,UAAA,oBAAA,GAAA;SAAG,qBAAA;SAAQ,SAAA,CAAA,CAAA;;;iBILzB,SAAA,CAAA,GAAa;;;iBC0Bb,eAAA,UAAyB,SAAS"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/components/LocaleProvider.ts","../src/components/Message.ts","../src/components/Plural.ts","../src/translatorCache.ts","../src/components/TranslationsProvider.ts","../src/hooks/useLocale.ts","../src/hooks/useTranslations.ts"],"sourcesContent":[],"mappings":";;;;;;;;;UAIiB,mBAAA;UACL;aACG;;iBAGC,cAAA;;;GAAqC,sBAAmB,MAAA,CAAA,yBAAA,MAAA,CAAA,cAAA;;;UCHvD,YAAA;;YAEH;;iBAGE,OAAA;;;GAA+B,wBAAY,MAAA,CAAA,yBAAA,MAAA,CAAA,aAAA;;;UCL1C,WAAA;;kBAEG;;;iBAIJ,MAAA;;;;GAAmC,cAAW,MAAA,CAAA,yBAAA,MAAA,CAAA,aAAA;;;KCRzD,iBAAA,SAA0B,QAAQ;KAC3B,gBAAA,GAAmB,sBAAsB;;;UCApC,yBAAA;iBACE,QAAQ,OAAO,QAAQ;aAC3B;;iBAKC,oBAAA;;;GAAsE,4BAAyB,MAAA,CAAA,yBAAA,MAAA,CAAA,cAAA,qBAAA,CAAA,WAAA,QAAA,OAAA,SAAA,eAAA,CAAA,mBAAA;WAAA,eAAA,CAAA;;EJR9F,OAAA,qCAAmB;CAAA,CAAA,GAAA,CAAA,GAAA,UAAA,uCAAA;SACxB,qCAAA;SACG,SAAA,CAAA,CAAA;;;iBKFC,SAAA,CAAA,GAAa;;;iBC0Bb,eAAA,UAAyB,SAAS"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,8 @@
1
+ import * as _let_value_translate0 from "@let-value/translate";
1
2
  import { Locale, LocaleTranslator, Translator } from "@let-value/translate";
2
- import * as react1 from "react";
3
+ import * as react5 from "react";
3
4
  import { ReactNode } from "react";
5
+ import * as gettext_parser0 from "gettext-parser";
4
6
  import { GetTextTranslations } from "gettext-parser";
5
7
  export * from "@let-value/translate";
6
8
 
@@ -12,7 +14,7 @@ interface LocaleProviderProps {
12
14
  declare function LocaleProvider({
13
15
  locale,
14
16
  children
15
- }: LocaleProviderProps): react1.FunctionComponentElement<react1.ProviderProps<Locale | undefined>>;
17
+ }: LocaleProviderProps): react5.FunctionComponentElement<react5.ProviderProps<Locale | undefined>>;
16
18
  //#endregion
17
19
  //#region src/components/Message.d.ts
18
20
  interface MessageProps {
@@ -22,7 +24,7 @@ interface MessageProps {
22
24
  declare function Message({
23
25
  context,
24
26
  children
25
- }: MessageProps): string | react1.FunctionComponentElement<react1.FragmentProps>;
27
+ }: MessageProps): string | react5.FunctionComponentElement<react5.FragmentProps>;
26
28
  //#endregion
27
29
  //#region src/components/Plural.d.ts
28
30
  interface PluralProps {
@@ -34,11 +36,13 @@ declare function Plural({
34
36
  number,
35
37
  forms,
36
38
  context
37
- }: PluralProps): react1.FunctionComponentElement<react1.FragmentProps>;
39
+ }: PluralProps): react5.FunctionComponentElement<react5.FragmentProps>;
38
40
  //#endregion
39
- //#region src/components/TranslationsProvider.d.ts
41
+ //#region src/translatorCache.d.ts
40
42
  type TranslationLoader = () => Promise<GetTextTranslations>;
41
43
  type TranslationEntry = GetTextTranslations | TranslationLoader;
44
+ //#endregion
45
+ //#region src/components/TranslationsProvider.d.ts
42
46
  interface TranslationsProviderProps {
43
47
  translations?: Partial<Record<Locale, TranslationEntry>>;
44
48
  children?: ReactNode;
@@ -46,12 +50,12 @@ interface TranslationsProviderProps {
46
50
  declare function TranslationsProvider({
47
51
  translations,
48
52
  children
49
- }: TranslationsProviderProps): react1.FunctionComponentElement<react1.ProviderProps<Translator<Partial<Record<Locale, (GetTextTranslations | {
50
- default: GetTextTranslations;
51
- }) | Promise<GetTextTranslations | {
52
- default: GetTextTranslations;
53
- }> | (() => Promise<GetTextTranslations | {
54
- default: GetTextTranslations;
53
+ }: TranslationsProviderProps): react5.FunctionComponentElement<react5.ProviderProps<_let_value_translate0.Translator<Partial<Record<Locale, (gettext_parser0.GetTextTranslations | {
54
+ default: gettext_parser0.GetTextTranslations;
55
+ }) | Promise<gettext_parser0.GetTextTranslations | {
56
+ default: gettext_parser0.GetTextTranslations;
57
+ }> | (() => Promise<gettext_parser0.GetTextTranslations | {
58
+ default: gettext_parser0.GetTextTranslations;
55
59
  }>)>>> | undefined>>;
56
60
  //#endregion
57
61
  //#region src/hooks/useLocale.d.ts
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/components/LocaleProvider.ts","../src/components/Message.ts","../src/components/Plural.ts","../src/components/TranslationsProvider.ts","../src/hooks/useLocale.ts","../src/hooks/useTranslations.ts"],"sourcesContent":[],"mappings":";;;;;;;UAIiB,mBAAA;UACL;aACG;;iBAGC,cAAA;;;GAAqC,sBAAmB,MAAA,CAAA,yBAAA,MAAA,CAAA,cAAA;;;UCHvD,YAAA;;YAEH;;iBAGE,OAAA;;;GAA+B,wBAAY,MAAA,CAAA,yBAAA,MAAA,CAAA,aAAA;;;UCL1C,WAAA;;kBAEG;;;iBAIJ,MAAA;;;;GAAmC,cAAW,MAAA,CAAA,yBAAA,MAAA,CAAA,aAAA;;;KCNzD,iBAAA,SAA0B,QAAQ;KAClC,gBAAA,GAAmB,sBAAsB;UAE7B,yBAAA;iBACE,QAAQ,OAAO,QAAQ;EHNzB,QAAA,CAAA,EGOF,SHPE;;AACL,iBGSI,oBAAA,CHTJ;EAAA,YAAA;EAAA;AAAA,CAAA,EGS0D,yBHT1D,CAAA,EGSmF,MAAA,CAAA,wBHTnF,CGSmF,MAAA,CAAA,aHTnF,CGSmF,UHTnF,CGSmF,OHTnF,CGSmF,MHTnF,CGSmF,MHTnF,EAAA,CGSmF,mBHTnF,GAAA;SACG,qBAAA;CAAS,CAAA,UAAA,oBAAA,GAAA;EAGR,OAAA,qBAAc;CAAA,CAAA,GAAA,CAAA,GAAA,UAAA,oBAAA,GAAA;SAAG,qBAAA;SAAQ,SAAA,CAAA,CAAA;;;iBILzB,SAAA,CAAA,GAAa;;;iBC0Bb,eAAA,UAAyB,SAAS"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/components/LocaleProvider.ts","../src/components/Message.ts","../src/components/Plural.ts","../src/translatorCache.ts","../src/components/TranslationsProvider.ts","../src/hooks/useLocale.ts","../src/hooks/useTranslations.ts"],"sourcesContent":[],"mappings":";;;;;;;;;UAIiB,mBAAA;UACL;aACG;;iBAGC,cAAA;;;GAAqC,sBAAmB,MAAA,CAAA,yBAAA,MAAA,CAAA,cAAA;;;UCHvD,YAAA;;YAEH;;iBAGE,OAAA;;;GAA+B,wBAAY,MAAA,CAAA,yBAAA,MAAA,CAAA,aAAA;;;UCL1C,WAAA;;kBAEG;;;iBAIJ,MAAA;;;;GAAmC,cAAW,MAAA,CAAA,yBAAA,MAAA,CAAA,aAAA;;;KCRzD,iBAAA,SAA0B,QAAQ;KAC3B,gBAAA,GAAmB,sBAAsB;;;UCApC,yBAAA;iBACE,QAAQ,OAAO,QAAQ;aAC3B;;iBAKC,oBAAA;;;GAAsE,4BAAyB,MAAA,CAAA,yBAAA,MAAA,CAAA,cAAA,qBAAA,CAAA,WAAA,QAAA,OAAA,SAAA,eAAA,CAAA,mBAAA;WAAA,eAAA,CAAA;;EJR9F,OAAA,qCAAmB;CAAA,CAAA,GAAA,CAAA,GAAA,UAAA,uCAAA;SACxB,qCAAA;SACG,SAAA,CAAA,CAAA;;;iBKFC,SAAA,CAAA,GAAa;;;iBC0Bb,eAAA,UAAyB,SAAS"}
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { Translator, message, plural } from "@let-value/translate";
2
- import { Children, Fragment, Suspense, createContext, createElement, isValidElement, use, useMemo } from "react";
2
+ import { Children, Fragment, createContext, createElement, isValidElement, use } from "react";
3
3
 
4
4
  export * from "@let-value/translate"
5
5
 
@@ -145,14 +145,64 @@ function Plural({ number, forms, context }) {
145
145
  return createElement(Fragment, null, ...result);
146
146
  }
147
147
 
148
+ //#endregion
149
+ //#region src/translatorCache.ts
150
+ const cacheNoParent = /* @__PURE__ */ new WeakMap();
151
+ const cacheWithParent = /* @__PURE__ */ new WeakMap();
152
+ function getFromWeakMap(translations, parent) {
153
+ if (!parent) return cacheNoParent.get(translations);
154
+ return cacheWithParent.get(translations)?.get(parent);
155
+ }
156
+ function setInWeakMap(translations, parent, translator) {
157
+ if (!parent) {
158
+ cacheNoParent.set(translations, translator);
159
+ return;
160
+ }
161
+ let byParent = cacheWithParent.get(translations);
162
+ if (!byParent) {
163
+ byParent = /* @__PURE__ */ new WeakMap();
164
+ cacheWithParent.set(translations, byParent);
165
+ }
166
+ byParent.set(parent, translator);
167
+ }
168
+ const MAX_STRUCTURAL_ENTRIES = 32;
169
+ const structuralCache = [];
170
+ function toSortedEntries(translations) {
171
+ return Object.entries(translations).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0);
172
+ }
173
+ function findStructural(sortedEntries, parent) {
174
+ for (const entry of structuralCache) {
175
+ if (entry.parent !== parent || entry.sortedEntries.length !== sortedEntries.length) continue;
176
+ if (entry.sortedEntries.every(([k, v], i) => sortedEntries[i][0] === k && sortedEntries[i][1] === v)) return entry.translator;
177
+ }
178
+ }
179
+ function getCachedTranslator(translations, parent) {
180
+ const cached = getFromWeakMap(translations, parent);
181
+ if (cached) return cached;
182
+ const sortedEntries = toSortedEntries(translations);
183
+ const structural = findStructural(sortedEntries, parent);
184
+ if (structural) {
185
+ setInWeakMap(translations, parent, structural);
186
+ return structural;
187
+ }
188
+ const translator = new Translator(translations, parent);
189
+ setInWeakMap(translations, parent, translator);
190
+ structuralCache.unshift({
191
+ sortedEntries,
192
+ parent,
193
+ translator
194
+ });
195
+ if (structuralCache.length > MAX_STRUCTURAL_ENTRIES) structuralCache.pop();
196
+ return translator;
197
+ }
198
+
148
199
  //#endregion
149
200
  //#region src/components/TranslationsProvider.ts
150
- function TranslationsProvider({ translations = {}, children }) {
201
+ const EMPTY_TRANSLATIONS = {};
202
+ function TranslationsProvider({ translations = EMPTY_TRANSLATIONS, children }) {
151
203
  const parent = use(translatorContext);
152
- const translator = useMemo(() => {
153
- return new Translator(translations, parent);
154
- }, [parent, translations]);
155
- return createElement(translatorContext.Provider, { value: translator }, createElement(Suspense, null, children));
204
+ const translator = getCachedTranslator(translations, parent);
205
+ return createElement(translatorContext.Provider, { value: translator }, children);
156
206
  }
157
207
 
158
208
  //#endregion
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["result: ReactNode[]","strings: string[]","values: ReactNode[]","result: ReactNode[]","result: ReactNode[]"],"sources":["../src/context.ts","../src/components/LocaleProvider.ts","../src/hooks/useTranslations.ts","../src/utils.ts","../src/components/Message.ts","../src/components/Plural.ts","../src/components/TranslationsProvider.ts","../src/hooks/useLocale.ts"],"sourcesContent":["import type { Locale, Translator } from \"@let-value/translate\";\nimport { createContext } from \"react\";\n\nexport const localeContext = createContext<Locale | undefined>(undefined);\nexport const translatorContext = createContext<Translator | undefined>(undefined);\n","import type { Locale } from \"@let-value/translate\";\nimport { createElement, type ReactNode } from \"react\";\nimport { localeContext } from \"../context.ts\";\n\nexport interface LocaleProviderProps {\n locale: Locale;\n children?: ReactNode;\n}\n\nexport function LocaleProvider({ locale, children }: LocaleProviderProps) {\n return createElement(localeContext.Provider, { value: locale }, children);\n}\n","import type { Locale, LocaleTranslator } from \"@let-value/translate\";\nimport { use } from \"react\";\n\nimport { localeContext, translatorContext } from \"../context.ts\";\n\n/** @deprecated replace with `use` from react */\n// biome-ignore lint/suspicious/noExplicitAny: we need to decorate the promise\nfunction getPromiseState(promise: any) {\n switch (promise.status) {\n case \"pending\":\n return { status: \"pending\" };\n case \"fulfilled\":\n return { status: \"fulfilled\", value: promise.value };\n case \"rejected\":\n return { status: \"rejected\", reason: promise.reason };\n default: {\n promise.status = \"pending\";\n promise.then((value: unknown) => {\n promise.status = \"fulfilled\";\n promise.value = value;\n });\n promise.catch((reason: unknown) => {\n promise.status = \"rejected\";\n promise.reason = reason;\n });\n return getPromiseState(promise);\n }\n }\n}\n\nexport function useTranslations(locale?: Locale): LocaleTranslator {\n const requestedLocale = locale ?? use(localeContext) ?? (\"unknown\" as never);\n const translator = use(translatorContext);\n if (!translator) {\n throw new Error(\"TranslationsProvider is missing\");\n }\n\n const resource = translator.fetchLocale(requestedLocale);\n if (!(resource instanceof Promise)) {\n return resource;\n }\n\n const state = getPromiseState(resource);\n if (state.status === \"pending\") {\n throw resource;\n }\n if (state.status === \"rejected\") {\n throw state.reason;\n }\n if (state.status === \"fulfilled\") {\n return state.value;\n }\n\n return use(resource);\n}\n","import { Children, Fragment, isValidElement, type PropsWithChildren, type ReactNode } from \"react\";\n\nexport function buildTemplateFromChildren(children: ReactNode): {\n strings: string[];\n values: ReactNode[];\n} {\n function flatten(nodes: ReactNode): ReactNode[] {\n const result: ReactNode[] = [];\n Children.forEach(nodes, (child) => {\n if (isValidElement(child) && child.type === Fragment) {\n result.push(...flatten((child.props as PropsWithChildren).children));\n } else {\n result.push(child);\n }\n });\n return result;\n }\n\n const array = flatten(children);\n const strings: string[] = [\"\"];\n const values: ReactNode[] = [];\n let expectValue = false;\n\n array.forEach((child) => {\n if (typeof child === \"string\") {\n if (expectValue) {\n values.push(child);\n strings.push(\"\");\n expectValue = false;\n } else {\n strings[strings.length - 1] += child;\n expectValue = true;\n }\n } else if (typeof child === \"number\" || child != null) {\n values.push(child as ReactNode);\n strings.push(\"\");\n expectValue = false;\n }\n });\n\n return { strings, values };\n}\n","import { message } from \"@let-value/translate\";\nimport { createElement, Fragment, type ReactNode } from \"react\";\n\nimport { useTranslations } from \"../hooks/useTranslations.ts\";\nimport { buildTemplateFromChildren } from \"../utils.ts\";\n\nexport interface MessageProps {\n context?: string;\n children: ReactNode;\n}\n\nexport function Message({ context, children }: MessageProps) {\n const translator = useTranslations();\n const { strings, values } = buildTemplateFromChildren(children);\n\n if (values.length === 0) {\n const input = strings.join(\"\");\n if (context) {\n return translator.context(context as \"\").message(input as never);\n }\n return translator.message(input as never);\n }\n\n const tokens = values.map((_, i) => `\\u0000${i}\\u0000`);\n const built = message(strings as unknown as TemplateStringsArray, ...tokens);\n const translated = context\n ? translator.translate({ context: context as \"\", id: built })\n : translator.translate(built);\n\n // biome-ignore lint/suspicious/noControlCharactersInRegex: using null separators\n const parts = translated.split(/\\u0000(\\d+)\\u0000/);\n const result: ReactNode[] = [];\n for (let i = 0; i < parts.length; i += 2) {\n result.push(parts[i]);\n const idx = parts[i + 1];\n if (idx !== undefined) {\n result.push(values[Number(idx)]);\n }\n }\n\n return createElement(Fragment, null, ...result);\n}\n","import { message, plural } from \"@let-value/translate\";\nimport { createElement, Fragment, type ReactNode } from \"react\";\n\nimport { useTranslations } from \"../hooks/useTranslations.ts\";\nimport { buildTemplateFromChildren } from \"../utils.ts\";\n\nexport interface PluralProps {\n number: number;\n forms: readonly ReactNode[];\n context?: string;\n}\n\nexport function Plural({ number, forms, context }: PluralProps) {\n const translator = useTranslations();\n\n const built = forms.map((child, i) => {\n const { strings, values } = buildTemplateFromChildren(child);\n const tokens = values.map((_, j) => `\\u0000${i}-${j}\\u0000`);\n return { message: message(strings as unknown as TemplateStringsArray, ...tokens), values };\n });\n\n const messages = built.map((b) => b.message);\n const input = plural(...messages, number);\n\n const translated = context\n ? translator.translate({ context: context as \"\", id: input })\n : translator.translate(input);\n\n // biome-ignore lint/suspicious/noControlCharactersInRegex: using null separators\n const parts = translated.split(/\\u0000(\\d+)-(\\d+)\\u0000/);\n const result: ReactNode[] = [];\n for (let i = 0; i < parts.length; ) {\n result.push(parts[i]);\n if (i + 2 < parts.length) {\n const formIndex = Number(parts[i + 1]);\n const valueIndex = Number(parts[i + 2]);\n result.push(built[formIndex].values[valueIndex]);\n }\n i += 3;\n }\n\n return createElement(Fragment, null, ...result);\n}\n","import type { Locale } from \"@let-value/translate\";\nimport { Translator } from \"@let-value/translate\";\nimport type { GetTextTranslations } from \"gettext-parser\";\nimport { createElement, type ReactNode, Suspense, use, useMemo } from \"react\";\nimport { translatorContext } from \"../context.ts\";\n\ntype TranslationLoader = () => Promise<GetTextTranslations>;\ntype TranslationEntry = GetTextTranslations | TranslationLoader;\n\nexport interface TranslationsProviderProps {\n translations?: Partial<Record<Locale, TranslationEntry>>;\n children?: ReactNode;\n}\n\nexport function TranslationsProvider({ translations = {}, children }: TranslationsProviderProps) {\n const parent = use(translatorContext);\n\n const translator = useMemo(() => {\n // Create a nested Translator that inherits from parent and merges entries\n return new Translator(translations, parent);\n }, [parent, translations]);\n\n return createElement(translatorContext.Provider, { value: translator }, createElement(Suspense, null, children));\n}\n","import type { Locale } from \"@let-value/translate\";\nimport { use } from \"react\";\nimport { localeContext } from \"../context.ts\";\n\nexport function useLocale(): Locale | undefined {\n return use(localeContext);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["result: ReactNode[]","strings: string[]","values: ReactNode[]","result: ReactNode[]","result: ReactNode[]","structuralCache: StructuralEntry[]","EMPTY_TRANSLATIONS: TranslationsMap"],"sources":["../src/context.ts","../src/components/LocaleProvider.ts","../src/hooks/useTranslations.ts","../src/utils.ts","../src/components/Message.ts","../src/components/Plural.ts","../src/translatorCache.ts","../src/components/TranslationsProvider.ts","../src/hooks/useLocale.ts"],"sourcesContent":["import type { Locale, Translator } from \"@let-value/translate\";\nimport { createContext } from \"react\";\n\nexport const localeContext = createContext<Locale | undefined>(undefined);\nexport const translatorContext = createContext<Translator | undefined>(undefined);\n","import type { Locale } from \"@let-value/translate\";\nimport { createElement, type ReactNode } from \"react\";\nimport { localeContext } from \"../context.ts\";\n\nexport interface LocaleProviderProps {\n locale: Locale;\n children?: ReactNode;\n}\n\nexport function LocaleProvider({ locale, children }: LocaleProviderProps) {\n return createElement(localeContext.Provider, { value: locale }, children);\n}\n","import type { Locale, LocaleTranslator } from \"@let-value/translate\";\nimport { use } from \"react\";\n\nimport { localeContext, translatorContext } from \"../context.ts\";\n\n/** @deprecated replace with `use` from react */\n// biome-ignore lint/suspicious/noExplicitAny: we need to decorate the promise\nfunction getPromiseState(promise: any) {\n switch (promise.status) {\n case \"pending\":\n return { status: \"pending\" };\n case \"fulfilled\":\n return { status: \"fulfilled\", value: promise.value };\n case \"rejected\":\n return { status: \"rejected\", reason: promise.reason };\n default: {\n promise.status = \"pending\";\n promise.then((value: unknown) => {\n promise.status = \"fulfilled\";\n promise.value = value;\n });\n promise.catch((reason: unknown) => {\n promise.status = \"rejected\";\n promise.reason = reason;\n });\n return getPromiseState(promise);\n }\n }\n}\n\nexport function useTranslations(locale?: Locale): LocaleTranslator {\n const requestedLocale = locale ?? use(localeContext) ?? (\"unknown\" as never);\n const translator = use(translatorContext);\n if (!translator) {\n throw new Error(\"TranslationsProvider is missing\");\n }\n\n const resource = translator.fetchLocale(requestedLocale);\n if (!(resource instanceof Promise)) {\n return resource;\n }\n\n const state = getPromiseState(resource);\n if (state.status === \"pending\") {\n throw resource;\n }\n if (state.status === \"rejected\") {\n throw state.reason;\n }\n if (state.status === \"fulfilled\") {\n return state.value;\n }\n\n return use(resource);\n}\n","import { Children, Fragment, isValidElement, type PropsWithChildren, type ReactNode } from \"react\";\n\nexport function buildTemplateFromChildren(children: ReactNode): {\n strings: string[];\n values: ReactNode[];\n} {\n function flatten(nodes: ReactNode): ReactNode[] {\n const result: ReactNode[] = [];\n Children.forEach(nodes, (child) => {\n if (isValidElement(child) && child.type === Fragment) {\n result.push(...flatten((child.props as PropsWithChildren).children));\n } else {\n result.push(child);\n }\n });\n return result;\n }\n\n const array = flatten(children);\n const strings: string[] = [\"\"];\n const values: ReactNode[] = [];\n let expectValue = false;\n\n array.forEach((child) => {\n if (typeof child === \"string\") {\n if (expectValue) {\n values.push(child);\n strings.push(\"\");\n expectValue = false;\n } else {\n strings[strings.length - 1] += child;\n expectValue = true;\n }\n } else if (typeof child === \"number\" || child != null) {\n values.push(child as ReactNode);\n strings.push(\"\");\n expectValue = false;\n }\n });\n\n return { strings, values };\n}\n","import { message } from \"@let-value/translate\";\nimport { createElement, Fragment, type ReactNode } from \"react\";\n\nimport { useTranslations } from \"../hooks/useTranslations.ts\";\nimport { buildTemplateFromChildren } from \"../utils.ts\";\n\nexport interface MessageProps {\n context?: string;\n children: ReactNode;\n}\n\nexport function Message({ context, children }: MessageProps) {\n const translator = useTranslations();\n const { strings, values } = buildTemplateFromChildren(children);\n\n if (values.length === 0) {\n const input = strings.join(\"\");\n if (context) {\n return translator.context(context as \"\").message(input as never);\n }\n return translator.message(input as never);\n }\n\n const tokens = values.map((_, i) => `\\u0000${i}\\u0000`);\n const built = message(strings as unknown as TemplateStringsArray, ...tokens);\n const translated = context\n ? translator.translate({ context: context as \"\", id: built })\n : translator.translate(built);\n\n // biome-ignore lint/suspicious/noControlCharactersInRegex: using null separators\n const parts = translated.split(/\\u0000(\\d+)\\u0000/);\n const result: ReactNode[] = [];\n for (let i = 0; i < parts.length; i += 2) {\n result.push(parts[i]);\n const idx = parts[i + 1];\n if (idx !== undefined) {\n result.push(values[Number(idx)]);\n }\n }\n\n return createElement(Fragment, null, ...result);\n}\n","import { message, plural } from \"@let-value/translate\";\nimport { createElement, Fragment, type ReactNode } from \"react\";\n\nimport { useTranslations } from \"../hooks/useTranslations.ts\";\nimport { buildTemplateFromChildren } from \"../utils.ts\";\n\nexport interface PluralProps {\n number: number;\n forms: readonly ReactNode[];\n context?: string;\n}\n\nexport function Plural({ number, forms, context }: PluralProps) {\n const translator = useTranslations();\n\n const built = forms.map((child, i) => {\n const { strings, values } = buildTemplateFromChildren(child);\n const tokens = values.map((_, j) => `\\u0000${i}-${j}\\u0000`);\n return { message: message(strings as unknown as TemplateStringsArray, ...tokens), values };\n });\n\n const messages = built.map((b) => b.message);\n const input = plural(...messages, number);\n\n const translated = context\n ? translator.translate({ context: context as \"\", id: input })\n : translator.translate(input);\n\n // biome-ignore lint/suspicious/noControlCharactersInRegex: using null separators\n const parts = translated.split(/\\u0000(\\d+)-(\\d+)\\u0000/);\n const result: ReactNode[] = [];\n for (let i = 0; i < parts.length; ) {\n result.push(parts[i]);\n if (i + 2 < parts.length) {\n const formIndex = Number(parts[i + 1]);\n const valueIndex = Number(parts[i + 2]);\n result.push(built[formIndex].values[valueIndex]);\n }\n i += 3;\n }\n\n return createElement(Fragment, null, ...result);\n}\n","import type { Locale } from \"@let-value/translate\";\nimport { Translator } from \"@let-value/translate\";\nimport type { GetTextTranslations } from \"gettext-parser\";\n\ntype TranslationLoader = () => Promise<GetTextTranslations>;\nexport type TranslationEntry = GetTextTranslations | TranslationLoader;\nexport type TranslationsMap = Partial<Record<Locale, TranslationEntry>>;\n\n// Fast path: WeakMap keyed on the translations object reference.\n// GC-safe — entries are collected when the object is no longer reachable.\nconst cacheNoParent = new WeakMap<object, Translator>();\nconst cacheWithParent = new WeakMap<object, WeakMap<Translator, Translator>>();\n\nfunction getFromWeakMap(translations: TranslationsMap, parent: Translator | undefined): Translator | undefined {\n if (!parent) return cacheNoParent.get(translations);\n return cacheWithParent.get(translations)?.get(parent);\n}\n\nfunction setInWeakMap(translations: TranslationsMap, parent: Translator | undefined, translator: Translator): void {\n if (!parent) {\n cacheNoParent.set(translations, translator);\n return;\n }\n let byParent = cacheWithParent.get(translations);\n if (!byParent) {\n byParent = new WeakMap();\n cacheWithParent.set(translations, byParent);\n }\n byParent.set(parent, translator);\n}\n\n// Slow path: bounded structural cache for dynamically-created translations objects\n// (e.g. `translations={{ en: data }}` — new wrapper object, stable value references).\n// Bounded to cap memory usage in infinite-render scenarios.\nconst MAX_STRUCTURAL_ENTRIES = 32;\n\ntype SortedEntry = [Locale, TranslationEntry];\n\ninterface StructuralEntry {\n sortedEntries: SortedEntry[];\n parent: Translator | undefined;\n translator: Translator;\n}\n\nconst structuralCache: StructuralEntry[] = [];\n\nfunction toSortedEntries(translations: TranslationsMap): SortedEntry[] {\n return (Object.entries(translations) as SortedEntry[]).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));\n}\n\nfunction findStructural(sortedEntries: SortedEntry[], parent: Translator | undefined): Translator | undefined {\n for (const entry of structuralCache) {\n if (entry.parent !== parent || entry.sortedEntries.length !== sortedEntries.length) continue;\n if (entry.sortedEntries.every(([k, v], i) => sortedEntries[i][0] === k && sortedEntries[i][1] === v)) {\n return entry.translator;\n }\n }\n return undefined;\n}\n\nexport function getCachedTranslator(translations: TranslationsMap, parent: Translator | undefined): Translator {\n // Fast path: same object reference\n const cached = getFromWeakMap(translations, parent);\n if (cached) return cached;\n\n // Slow path: same locale keys and value references, different wrapper object\n const sortedEntries = toSortedEntries(translations);\n const structural = findStructural(sortedEntries, parent);\n if (structural) {\n // Backfill WeakMap so subsequent renders with the same new-object are O(1)\n setInWeakMap(translations, parent, structural);\n return structural;\n }\n\n const translator = new Translator(translations, parent);\n setInWeakMap(translations, parent, translator);\n structuralCache.unshift({ sortedEntries, parent, translator });\n if (structuralCache.length > MAX_STRUCTURAL_ENTRIES) structuralCache.pop();\n return translator;\n}\n\n/** Exported only for tests — do not use in application code. */\nexport const _structuralCacheSize = (): number => structuralCache.length;\n","import type { Locale } from \"@let-value/translate\";\nimport { createElement, type ReactNode, use } from \"react\";\nimport { translatorContext } from \"../context.ts\";\nimport { type TranslationEntry, type TranslationsMap, getCachedTranslator } from \"../translatorCache.ts\";\n\nexport interface TranslationsProviderProps {\n translations?: Partial<Record<Locale, TranslationEntry>>;\n children?: ReactNode;\n}\n\nconst EMPTY_TRANSLATIONS: TranslationsMap = {};\n\nexport function TranslationsProvider({ translations = EMPTY_TRANSLATIONS, children }: TranslationsProviderProps) {\n const parent = use(translatorContext);\n const translator = getCachedTranslator(translations, parent);\n return createElement(translatorContext.Provider, { value: translator }, children);\n}\n","import type { Locale } from \"@let-value/translate\";\nimport { use } from \"react\";\nimport { localeContext } from \"../context.ts\";\n\nexport function useLocale(): Locale | undefined {\n return use(localeContext);\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@let-value/translate-react",
3
- "version": "1.1.2-beta.2",
3
+ "version": "1.1.2",
4
4
  "type": "module",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.js",
@@ -24,10 +24,10 @@
24
24
  "test": "node --test"
25
25
  },
26
26
  "dependencies": {
27
- "@let-value/translate": "1.1.2-beta.2"
27
+ "@let-value/translate": "1.1.2"
28
28
  },
29
29
  "devDependencies": {
30
- "@let-value/translate-e2e": "1.1.2-beta.2",
30
+ "@let-value/translate-e2e": "1.1.2",
31
31
  "@types/gettext-parser": "8.0.0",
32
32
  "@types/react": "19.1.13",
33
33
  "@types/react-dom": "19.1.9",