@fluenti/react 0.5.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/dist/Number-DfzWPfIE.js +142 -0
- package/dist/Number-DfzWPfIE.js.map +1 -0
- package/dist/Number-JCugssFE.cjs +2 -0
- package/dist/Number-JCugssFE.cjs.map +1 -0
- package/dist/components-entry.cjs +1 -1
- package/dist/components-entry.cjs.map +1 -1
- package/dist/components-entry.js +63 -84
- package/dist/components-entry.js.map +1 -1
- package/dist/icu-rich-BlDjwT5Z.cjs +2 -0
- package/dist/icu-rich-BlDjwT5Z.cjs.map +1 -0
- package/dist/{icu-rich-ChVWsA7C.js → icu-rich-C6B9ns4t.js} +7 -4
- package/dist/icu-rich-C6B9ns4t.js.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +77 -77
- package/dist/react/src/compile-time-t.d.ts.map +1 -0
- package/dist/react/src/components/DateTime.d.ts.map +1 -0
- package/dist/react/src/components/Number.d.ts.map +1 -0
- package/dist/react/src/components/Plural.d.ts.map +1 -0
- package/dist/react/src/components/Select.d.ts.map +1 -0
- package/dist/{components → react/src/components}/Trans.d.ts +1 -1
- package/dist/react/src/components/Trans.d.ts.map +1 -0
- package/dist/react/src/components/compiled.d.ts +46 -0
- package/dist/react/src/components/compiled.d.ts.map +1 -0
- package/dist/{components → react/src/components}/icu-rich.d.ts +1 -1
- package/dist/react/src/components/icu-rich.d.ts.map +1 -0
- package/dist/react/src/components/plain.d.ts +9 -0
- package/dist/react/src/components/plain.d.ts.map +1 -0
- package/dist/{components → react/src/components}/plural-core.d.ts +2 -2
- package/dist/react/src/components/plural-core.d.ts.map +1 -0
- package/dist/{components → react/src/components}/trans-core.d.ts +1 -1
- package/dist/react/src/components/trans-core.d.ts.map +1 -0
- package/dist/{components-entry.d.ts → react/src/components-entry.d.ts} +1 -1
- package/dist/react/src/components-entry.d.ts.map +1 -0
- package/dist/react/src/context.d.ts.map +1 -0
- package/dist/react/src/create-fluenti.d.ts.map +1 -0
- package/dist/react/src/global-registry.d.ts.map +1 -0
- package/dist/react/src/hooks/__useI18n.d.ts.map +1 -0
- package/dist/react/src/hooks/useI18n.d.ts.map +1 -0
- package/dist/{index.d.ts → react/src/index.d.ts} +7 -2
- package/dist/react/src/index.d.ts.map +1 -0
- package/dist/react/src/msg.d.ts.map +1 -0
- package/dist/react/src/provider.d.ts.map +1 -0
- package/dist/react/src/react-runtime.d.ts.map +1 -0
- package/dist/{server.d.ts → react/src/server.d.ts} +2 -2
- package/dist/react/src/server.d.ts.map +1 -0
- package/dist/{types.d.ts → react/src/types.d.ts} +1 -1
- package/dist/react/src/types.d.ts.map +1 -0
- package/dist/react/src/vite-plugin.d.ts.map +1 -0
- package/dist/server.cjs +1 -1
- package/dist/server.cjs.map +1 -1
- package/dist/server.js +2 -2
- package/dist/server.js.map +1 -1
- package/dist/vite-plugin.cjs +1 -1
- package/dist/vite-plugin.cjs.map +1 -1
- package/dist/vite-plugin.js +1 -1
- package/dist/vite-plugin.js.map +1 -1
- package/package.json +18 -18
- package/dist/compile-time-t.d.ts.map +0 -1
- package/dist/components/DateTime.d.ts.map +0 -1
- package/dist/components/Number.d.ts.map +0 -1
- package/dist/components/Plural.d.ts.map +0 -1
- package/dist/components/Select.d.ts.map +0 -1
- package/dist/components/Trans.d.ts.map +0 -1
- package/dist/components/icu-rich.d.ts.map +0 -1
- package/dist/components/plural-core.d.ts.map +0 -1
- package/dist/components/trans-core.d.ts.map +0 -1
- package/dist/components-entry.d.ts.map +0 -1
- package/dist/context-DVbvrSE8.cjs +0 -2
- package/dist/context-DVbvrSE8.cjs.map +0 -1
- package/dist/context-DVudCV1o.js +0 -7
- package/dist/context-DVudCV1o.js.map +0 -1
- package/dist/context.d.ts.map +0 -1
- package/dist/create-fluenti.d.ts.map +0 -1
- package/dist/global-registry.d.ts.map +0 -1
- package/dist/hooks/__useI18n.d.ts.map +0 -1
- package/dist/hooks/useI18n.d.ts.map +0 -1
- package/dist/icu-rich-ChVWsA7C.js.map +0 -1
- package/dist/icu-rich-CotMVC_x.cjs +0 -2
- package/dist/icu-rich-CotMVC_x.cjs.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/msg.d.ts.map +0 -1
- package/dist/provider.d.ts.map +0 -1
- package/dist/react-runtime.d.ts.map +0 -1
- package/dist/server.d.ts.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/vite-plugin.d.ts.map +0 -1
- /package/dist/{compile-time-t.d.ts → react/src/compile-time-t.d.ts} +0 -0
- /package/dist/{components → react/src/components}/DateTime.d.ts +0 -0
- /package/dist/{components → react/src/components}/Number.d.ts +0 -0
- /package/dist/{components → react/src/components}/Plural.d.ts +0 -0
- /package/dist/{components → react/src/components}/Select.d.ts +0 -0
- /package/dist/{context.d.ts → react/src/context.d.ts} +0 -0
- /package/dist/{create-fluenti.d.ts → react/src/create-fluenti.d.ts} +0 -0
- /package/dist/{global-registry.d.ts → react/src/global-registry.d.ts} +0 -0
- /package/dist/{hooks → react/src/hooks}/__useI18n.d.ts +0 -0
- /package/dist/{hooks → react/src/hooks}/useI18n.d.ts +0 -0
- /package/dist/{msg.d.ts → react/src/msg.d.ts} +0 -0
- /package/dist/{provider.d.ts → react/src/provider.d.ts} +0 -0
- /package/dist/{react-runtime.d.ts → react/src/react-runtime.d.ts} +0 -0
- /package/dist/{vite-plugin.d.ts → react/src/vite-plugin.d.ts} +0 -0
package/README.md
CHANGED
|
@@ -75,6 +75,8 @@ import { t, useI18n, Trans, Plural, Select } from '@fluenti/react'
|
|
|
75
75
|
function Dashboard() {
|
|
76
76
|
const { d, n, locale, setLocale } = useI18n()
|
|
77
77
|
const name = 'Alice'
|
|
78
|
+
const count = 3
|
|
79
|
+
const role = 'editor'
|
|
78
80
|
|
|
79
81
|
return (
|
|
80
82
|
<div>
|
|
@@ -101,6 +103,8 @@ function Dashboard() {
|
|
|
101
103
|
}
|
|
102
104
|
```
|
|
103
105
|
|
|
106
|
+
`@fluenti/react/components` remains available as an explicit subpath when you want to keep component imports separate in bundle-sensitive or no-plugin setups.
|
|
107
|
+
|
|
104
108
|
---
|
|
105
109
|
|
|
106
110
|
## Compile-Time Transform
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { a as e, c as t, i as n, l as r, n as i, o as a, r as o, s, t as c } from "./icu-rich-C6B9ns4t.js";
|
|
2
|
+
import { createContext as l, createElement as u, memo as d, useContext as f, useMemo as p } from "react";
|
|
3
|
+
import { Fragment as m, jsx as h } from "react/jsx-runtime";
|
|
4
|
+
import { PLURAL_CATEGORIES as g, buildICUPluralMessage as _, buildICUSelectMessage as v, hashMessage as y, normalizeSelectForms as b } from "@fluenti/core/runtime";
|
|
5
|
+
//#region src/context.ts
|
|
6
|
+
var x = /* @__PURE__ */ l(null), S = /* @__PURE__ */ d(function({ children: e, id: n, context: i, comment: a, tag: o, render: c, __id: l, __message: d, __components: g }) {
|
|
7
|
+
let _ = f(x);
|
|
8
|
+
if (!_) throw Error("[fluenti] <Trans> must be used within an <I18nProvider>");
|
|
9
|
+
if (d !== void 0) {
|
|
10
|
+
let e = d, s = g ?? [], f = n ?? l ?? t(e, i), p = _.t({
|
|
11
|
+
id: f,
|
|
12
|
+
message: e,
|
|
13
|
+
...i === void 0 ? {} : { context: i },
|
|
14
|
+
...a === void 0 ? {} : { comment: a }
|
|
15
|
+
}), v = s.length > 0 ? r(p, s) : p;
|
|
16
|
+
return c ? c(v) : o ? u(o, null, v) : /* @__PURE__ */ h(m, { children: v });
|
|
17
|
+
}
|
|
18
|
+
let { message: v, components: y } = p(() => s(e), [e]), b = p(() => n ?? l ?? t(v, i), [
|
|
19
|
+
n,
|
|
20
|
+
l,
|
|
21
|
+
v,
|
|
22
|
+
i
|
|
23
|
+
]), S = _.t({
|
|
24
|
+
id: b,
|
|
25
|
+
message: v,
|
|
26
|
+
...i === void 0 ? {} : { context: i },
|
|
27
|
+
...a === void 0 ? {} : { comment: a }
|
|
28
|
+
}), C = y.length > 0 ? r(S, y) : S;
|
|
29
|
+
return c ? c(C) : o ? u(o, null, C) : /* @__PURE__ */ h(m, { children: C });
|
|
30
|
+
});
|
|
31
|
+
//#endregion
|
|
32
|
+
//#region src/components/plain.ts
|
|
33
|
+
function C(e, t, n) {
|
|
34
|
+
return e ?? (n === void 0 ? t : y(t, n));
|
|
35
|
+
}
|
|
36
|
+
function w(e) {
|
|
37
|
+
return typeof e == "string" || typeof e == "number";
|
|
38
|
+
}
|
|
39
|
+
function T(e, t) {
|
|
40
|
+
let n = {};
|
|
41
|
+
for (let t of g) {
|
|
42
|
+
let r = e[t];
|
|
43
|
+
if (r !== void 0) {
|
|
44
|
+
if (!w(r)) return;
|
|
45
|
+
n[t] = String(r);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (n.other !== void 0) return _(n, t);
|
|
49
|
+
}
|
|
50
|
+
function E(e) {
|
|
51
|
+
let t = {};
|
|
52
|
+
for (let [n, r] of Object.entries(e)) if (r !== void 0) {
|
|
53
|
+
if (!w(r)) return;
|
|
54
|
+
t[n] = String(r);
|
|
55
|
+
}
|
|
56
|
+
if (t.other === void 0) return;
|
|
57
|
+
let n = b(t);
|
|
58
|
+
return {
|
|
59
|
+
message: v(n.forms),
|
|
60
|
+
valueMap: n.valueMap
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
//#endregion
|
|
64
|
+
//#region src/components/Plural.tsx
|
|
65
|
+
var D = /* @__PURE__ */ d(function({ value: t, id: r, context: i, comment: o, zero: s, one: l, two: u, few: d, many: p, other: g, offset: _ }) {
|
|
66
|
+
let v = f(x);
|
|
67
|
+
if (!v) throw Error("[fluenti] <Plural> must be used within an <I18nProvider>");
|
|
68
|
+
let y = {
|
|
69
|
+
zero: s,
|
|
70
|
+
one: l,
|
|
71
|
+
two: u,
|
|
72
|
+
few: d,
|
|
73
|
+
many: p,
|
|
74
|
+
other: g
|
|
75
|
+
}, b = T(y, _);
|
|
76
|
+
if (b !== void 0) return /* @__PURE__ */ h(m, { children: v.t({
|
|
77
|
+
id: C(r, b, i),
|
|
78
|
+
message: b,
|
|
79
|
+
...i === void 0 ? {} : { context: i },
|
|
80
|
+
...o === void 0 ? {} : { comment: o }
|
|
81
|
+
}, { count: t }) });
|
|
82
|
+
let { messages: S, components: w } = e(a, y), E = c({
|
|
83
|
+
...S.zero !== void 0 && { zero: S.zero },
|
|
84
|
+
...S.one !== void 0 && { one: S.one },
|
|
85
|
+
...S.two !== void 0 && { two: S.two },
|
|
86
|
+
...S.few !== void 0 && { few: S.few },
|
|
87
|
+
...S.many !== void 0 && { many: S.many },
|
|
88
|
+
other: S.other ?? ""
|
|
89
|
+
}, _);
|
|
90
|
+
return /* @__PURE__ */ h(m, { children: n({
|
|
91
|
+
id: C(r, E, i),
|
|
92
|
+
message: E,
|
|
93
|
+
...i === void 0 ? {} : { context: i },
|
|
94
|
+
...o === void 0 ? {} : { comment: o }
|
|
95
|
+
}, { count: t }, (e, t) => v.t(e, t), w) });
|
|
96
|
+
}), O = /* @__PURE__ */ d(function(t) {
|
|
97
|
+
let r = f(x);
|
|
98
|
+
if (!r) throw Error("[fluenti] <Select> must be used within an <I18nProvider>");
|
|
99
|
+
let { value: a, id: s, context: c, comment: l, other: d, options: p, tag: g, ..._ } = t, v = p === void 0 ? {
|
|
100
|
+
...Object.fromEntries(Object.entries(_).filter(([e]) => ![
|
|
101
|
+
"value",
|
|
102
|
+
"id",
|
|
103
|
+
"context",
|
|
104
|
+
"comment",
|
|
105
|
+
"options",
|
|
106
|
+
"other",
|
|
107
|
+
"tag"
|
|
108
|
+
].includes(e))),
|
|
109
|
+
other: d
|
|
110
|
+
} : {
|
|
111
|
+
...p,
|
|
112
|
+
other: d
|
|
113
|
+
}, y = E(v);
|
|
114
|
+
if (y !== void 0) {
|
|
115
|
+
let e = r.t({
|
|
116
|
+
id: C(s, y.message, c),
|
|
117
|
+
message: y.message,
|
|
118
|
+
...c === void 0 ? {} : { context: c },
|
|
119
|
+
...l === void 0 ? {} : { comment: l }
|
|
120
|
+
}, { value: y.valueMap[a] ?? "other" });
|
|
121
|
+
return g ? u(g, null, e) : /* @__PURE__ */ h(m, { children: e });
|
|
122
|
+
}
|
|
123
|
+
let b = [...Object.keys(v).filter((e) => e !== "other"), "other"], { messages: S, components: w } = e(b, v), T = o(Object.fromEntries([...b].map((e) => [e, S[e] ?? ""]))), D = i(T.forms), O = n({
|
|
124
|
+
id: C(s, D, c),
|
|
125
|
+
message: D,
|
|
126
|
+
...c === void 0 ? {} : { context: c },
|
|
127
|
+
...l === void 0 ? {} : { comment: l }
|
|
128
|
+
}, { value: T.valueMap[a] ?? "other" }, (e, t) => r.t(e, t), w);
|
|
129
|
+
return g ? u(g, null, O) : /* @__PURE__ */ h(m, { children: O });
|
|
130
|
+
}), k = /* @__PURE__ */ d(function({ value: e, format: t }) {
|
|
131
|
+
let n = f(x);
|
|
132
|
+
if (!n) throw Error("[fluenti] <DateTime> must be used within an <I18nProvider>");
|
|
133
|
+
return /* @__PURE__ */ h(m, { children: n.d(e, t) });
|
|
134
|
+
}), A = /* @__PURE__ */ d(function({ value: e, format: t }) {
|
|
135
|
+
let n = f(x);
|
|
136
|
+
if (!n) throw Error("[fluenti] <Number> must be used within an <I18nProvider>");
|
|
137
|
+
return /* @__PURE__ */ h(m, { children: n.n(e, t) });
|
|
138
|
+
});
|
|
139
|
+
//#endregion
|
|
140
|
+
export { C as a, D as i, k as n, S as o, O as r, x as s, A as t };
|
|
141
|
+
|
|
142
|
+
//# sourceMappingURL=Number-DfzWPfIE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Number-DfzWPfIE.js","names":[],"sources":["../src/context.ts","../src/components/Trans.tsx","../src/components/plain.ts","../src/components/Plural.tsx","../src/components/Select.tsx","../src/components/DateTime.tsx","../src/components/Number.tsx"],"sourcesContent":["import { createContext } from 'react'\nimport type { FluentiContext } from './types'\n\nexport const I18nContext = /* @__PURE__ */ createContext<FluentiContext | null>(null)\n","import {\n createElement,\n memo,\n useContext,\n useMemo,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport { I18nContext } from '../context'\nimport { hashMessage, extractMessage, reconstruct } from './trans-core'\n\nexport interface FluentiTransProps {\n /** Source text with embedded components */\n children?: ReactNode\n /** Override auto-generated hash ID */\n id?: string\n /** Message context used for identity and translator disambiguation */\n context?: string\n /** Context comment for translators */\n comment?: string\n /** Wrapper element tag name (e.g. 'span', 'div'). Defaults to Fragment (no wrapper). */\n tag?: keyof React.JSX.IntrinsicElements\n /** Custom render wrapper */\n render?: (translation: ReactNode) => ReactNode\n /** @internal Pre-computed message ID from build plugin */\n __id?: string\n /** @internal Pre-computed ICU message from build plugin */\n __message?: string\n /** @internal Pre-computed component list from build plugin */\n __components?: ReactElement[]\n}\n\n/**\n * `<Trans>` component for rich-text translations containing nested React elements.\n *\n * @example\n * ```tsx\n * <Trans>Read the <a href=\"/docs\">documentation</a> for more info.</Trans>\n * ```\n */\nexport const Trans = /* @__PURE__ */ memo(function Trans({\n children,\n id,\n context,\n comment,\n tag,\n render,\n __id,\n __message,\n __components,\n}: FluentiTransProps) {\n const ctx = useContext(I18nContext)\n if (!ctx) {\n throw new Error('[fluenti] <Trans> must be used within an <I18nProvider>')\n }\n\n // Fast path: build plugin pre-computed message and components\n const hasPrecomputed = __message !== undefined\n if (hasPrecomputed) {\n const message = __message!\n const components = __components ?? []\n const messageId = id ?? __id ?? hashMessage(message, context)\n const translated = ctx.t(\n {\n id: messageId,\n message,\n ...(context !== undefined ? { context } : {}),\n ...(comment !== undefined ? { comment } : {}),\n },\n )\n\n const result = components.length > 0 ? reconstruct(translated, components) : translated\n if (render) return render(result)\n return tag ? createElement(tag, null, result) : <>{result}</>\n }\n\n const { message, components } = useMemo(\n () => extractMessage(children),\n [children],\n )\n const messageId = useMemo(\n () => id ?? __id ?? hashMessage(message, context),\n [id, __id, message, context],\n )\n\n const translated = ctx.t(\n {\n id: messageId,\n message,\n ...(context !== undefined ? { context } : {}),\n ...(comment !== undefined ? { comment } : {}),\n },\n )\n\n const result = components.length > 0 ? reconstruct(translated, components) : translated\n if (render) return render(result)\n return tag ? createElement(tag, null, result) : <>{result}</>\n})\n","import {\n PLURAL_CATEGORIES,\n buildICUPluralMessage,\n buildICUSelectMessage,\n hashMessage,\n normalizeSelectForms,\n type PluralCategory,\n} from '@fluenti/core/runtime'\nimport type { ReactNode } from 'react'\n\nexport function resolveCompiledMessageId(\n id: string | undefined,\n message: string,\n context: string | undefined,\n): string {\n return id ?? (context === undefined ? message : hashMessage(message, context))\n}\n\nfunction isPlainReactNode(value: ReactNode | undefined): value is string | number {\n return typeof value === 'string' || typeof value === 'number'\n}\n\nexport function buildPlainPluralMessage(\n forms: Record<PluralCategory, ReactNode | undefined>,\n offset?: number,\n): string | undefined {\n const plainForms: Partial<Record<PluralCategory, string>> = {}\n\n for (const category of PLURAL_CATEGORIES) {\n const value = forms[category]\n if (value === undefined) continue\n if (!isPlainReactNode(value)) return undefined\n plainForms[category] = String(value)\n }\n\n if (plainForms['other'] === undefined) return undefined\n return buildICUPluralMessage(plainForms as Partial<Record<PluralCategory, string>> & { other: string }, offset)\n}\n\nexport function buildPlainSelectMessage(\n forms: Record<string, ReactNode | undefined>,\n): { message: string; valueMap: Record<string, string> } | undefined {\n const plainForms: Record<string, string> = {}\n\n for (const [key, value] of Object.entries(forms)) {\n if (value === undefined) continue\n if (!isPlainReactNode(value)) return undefined\n plainForms[key] = String(value)\n }\n\n if (plainForms['other'] === undefined) return undefined\n\n const normalized = normalizeSelectForms(plainForms)\n return {\n message: buildICUSelectMessage(normalized.forms),\n valueMap: normalized.valueMap,\n }\n}\n","import { memo, useContext, type ReactNode } from 'react'\nimport { I18nContext } from '../context'\nimport { PLURAL_CATEGORIES, type PluralCategory } from './plural-core'\nimport { buildICUPluralMessage, renderRichTranslation, serializeRichForms } from './icu-rich'\nimport { buildPlainPluralMessage, resolveCompiledMessageId } from './plain'\n\nexport interface FluentiPluralProps {\n /** The count value */\n value: number\n /** Override the auto-generated synthetic ICU message id */\n id?: string\n /** Message context used for identity and translator disambiguation */\n context?: string\n /** Translator-facing note preserved in extraction catalogs */\n comment?: string\n /** Text for zero (if language supports) */\n zero?: ReactNode\n /** Singular form. `#` replaced with value */\n one?: ReactNode\n /** Dual form (Arabic, etc.) */\n two?: ReactNode\n /** Few form (Slavic languages, etc.) */\n few?: ReactNode\n /** Many form */\n many?: ReactNode\n /** Default plural form */\n other: ReactNode\n /** Offset from value before selecting form */\n offset?: number\n}\n\n/**\n * `<Plural>` — ICU plural handling as a component.\n *\n * @example\n * ```tsx\n * <Plural value={count} zero=\"No messages\" one=\"# message\" other=\"# messages\" />\n * ```\n */\nexport const Plural = /* @__PURE__ */ memo(function Plural({\n value,\n id,\n context,\n comment,\n zero,\n one,\n two,\n few,\n many,\n other,\n offset,\n}: FluentiPluralProps) {\n const ctx = useContext(I18nContext)\n if (!ctx) {\n throw new Error('[fluenti] <Plural> must be used within an <I18nProvider>')\n }\n\n const forms: Record<PluralCategory, ReactNode | undefined> = {\n zero,\n one,\n two,\n few,\n many,\n other,\n }\n const plainMessage = buildPlainPluralMessage(forms, offset)\n if (plainMessage !== undefined) {\n return <>{ctx.t(\n {\n id: resolveCompiledMessageId(id, plainMessage, context),\n message: plainMessage,\n ...(context !== undefined ? { context } : {}),\n ...(comment !== undefined ? { comment } : {}),\n },\n { count: value },\n )}</>\n }\n\n const { messages, components } = serializeRichForms(PLURAL_CATEGORIES, forms)\n const icuMessage = buildICUPluralMessage(\n {\n ...(messages.zero !== undefined && { zero: messages.zero }),\n ...(messages.one !== undefined && { one: messages.one }),\n ...(messages.two !== undefined && { two: messages.two }),\n ...(messages.few !== undefined && { few: messages.few }),\n ...(messages.many !== undefined && { many: messages.many }),\n other: messages.other ?? '',\n },\n offset,\n )\n\n const descriptor = {\n id: resolveCompiledMessageId(id, icuMessage, context),\n message: icuMessage,\n ...(context !== undefined ? { context } : {}),\n ...(comment !== undefined ? { comment } : {}),\n }\n\n return <>{renderRichTranslation(descriptor, { count: value }, (desc, values) => ctx.t(desc, values), components)}</>\n})\n","import { createElement, memo, useContext, type ReactNode } from 'react'\nimport { I18nContext } from '../context'\nimport { buildICUSelectMessage, normalizeSelectForms, renderRichTranslation, serializeRichForms } from './icu-rich'\nimport { buildPlainSelectMessage, resolveCompiledMessageId } from './plain'\n\nexport interface FluentiSelectProps {\n /** The selector value */\n value: string\n /** Override the auto-generated synthetic ICU message id */\n id?: string\n /** Message context used for identity and translator disambiguation */\n context?: string\n /** Translator-facing note preserved in extraction catalogs */\n comment?: string\n /** Default case */\n other: ReactNode\n /** Type-safe named options. Takes precedence over direct case props. */\n options?: Record<string, ReactNode>\n /** Wrapper element tag name (e.g. 'span', 'div'). Defaults to Fragment (no wrapper). */\n tag?: keyof React.JSX.IntrinsicElements\n /** Named cases — any string key maps to a ReactNode */\n [key: string]: ReactNode | Record<string, ReactNode> | keyof React.JSX.IntrinsicElements | undefined\n}\n\n/**\n * `<Select>` — ICU select for gender, role, or other categorical values.\n *\n * @example\n * ```tsx\n * <Select\n * value={gender}\n * male=\"He liked your post\"\n * female=\"She liked your post\"\n * other=\"They liked your post\"\n * />\n * ```\n */\nexport const Select = /* @__PURE__ */ memo(function Select(props: FluentiSelectProps) {\n const ctx = useContext(I18nContext)\n if (!ctx) {\n throw new Error('[fluenti] <Select> must be used within an <I18nProvider>')\n }\n\n const { value, id, context, comment, other, options, tag, ...cases } = props\n const forms: Record<string, ReactNode | undefined> = options === undefined\n ? {\n ...Object.fromEntries(\n Object.entries(cases).filter(([key]) => !['value', 'id', 'context', 'comment', 'options', 'other', 'tag'].includes(key)),\n ),\n other,\n }\n : {\n ...options,\n other,\n }\n const plain = buildPlainSelectMessage(forms)\n if (plain !== undefined) {\n const translated = ctx.t(\n {\n id: resolveCompiledMessageId(id, plain.message, context),\n message: plain.message,\n ...(context !== undefined ? { context } : {}),\n ...(comment !== undefined ? { comment } : {}),\n },\n { value: plain.valueMap[value] ?? 'other' },\n )\n\n return tag ? createElement(tag, null, translated) : <>{translated}</>\n }\n\n const orderedKeys = [...Object.keys(forms).filter(key => key !== 'other'), 'other'] as const\n const { messages, components } = serializeRichForms(orderedKeys, forms)\n const normalized = normalizeSelectForms(\n Object.fromEntries(\n [...orderedKeys].map((key) => [key, messages[key] ?? '']),\n ),\n )\n const icuMessage = buildICUSelectMessage(normalized.forms)\n\n const descriptor = {\n id: resolveCompiledMessageId(id, icuMessage, context),\n message: icuMessage,\n ...(context !== undefined ? { context } : {}),\n ...(comment !== undefined ? { comment } : {}),\n }\n\n const result = renderRichTranslation(\n descriptor,\n { value: normalized.valueMap[value] ?? 'other' },\n (desc, values) => ctx.t(desc, values),\n components,\n )\n return tag ? createElement(tag, null, result) : <>{result}</>\n})\n","import { memo, useContext } from 'react'\nimport { I18nContext } from '../context'\n\nexport interface FluentiDateTimeProps {\n /** Date value to format */\n value: Date | number\n /** Named format key defined in dateFormats config */\n format?: string\n}\n\n/**\n * `<DateTime>` — formatting component using Intl APIs.\n *\n * @example\n * ```tsx\n * <DateTime value={new Date()} format=\"long\" />\n * ```\n */\nexport const DateTime = /* @__PURE__ */ memo(function DateTime({ value, format }: FluentiDateTimeProps) {\n const ctx = useContext(I18nContext)\n if (!ctx) {\n throw new Error('[fluenti] <DateTime> must be used within an <I18nProvider>')\n }\n return <>{ctx.d(value, format)}</>\n})\n","import { memo, useContext } from 'react'\nimport { I18nContext } from '../context'\n\nexport interface NumberFormatProps {\n /** Number value to format */\n value: number\n /** Named format key defined in numberFormats config */\n format?: string\n}\n\n/** @alias NumberFormatProps */\nexport type FluentiNumberFormatProps = NumberFormatProps\n\n/**\n * `<Number>` — number formatting component using Intl APIs.\n *\n * @example\n * ```tsx\n * <Number value={1234.56} format=\"currency\" />\n * ```\n */\nexport const NumberFormat = /* @__PURE__ */ memo(function NumberFormat({ value, format }: NumberFormatProps) {\n const ctx = useContext(I18nContext)\n if (!ctx) {\n throw new Error('[fluenti] <Number> must be used within an <I18nProvider>')\n }\n return <>{ctx.n(value, format)}</>\n})\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require(`./icu-rich-BlDjwT5Z.cjs`);let t=require(`react`),n=require(`react/jsx-runtime`),r=require(`@fluenti/core/runtime`);var i=(0,t.createContext)(null),a=(0,t.memo)(function({children:a,id:o,context:s,comment:c,tag:l,render:u,__id:d,__message:f,__components:p}){let m=(0,t.useContext)(i);if(!m)throw Error(`[fluenti] <Trans> must be used within an <I18nProvider>`);if(f!==void 0){let i=f,a=p??[],h=o??d??(0,r.hashMessage)(i,s),g=m.t({id:h,message:i,...s===void 0?{}:{context:s},...c===void 0?{}:{comment:c}}),_=a.length>0?e.i(g,a):g;return u?u(_):l?(0,t.createElement)(l,null,_):(0,n.jsx)(n.Fragment,{children:_})}let{message:h,components:g}=(0,t.useMemo)(()=>e.r(a),[a]),_=(0,t.useMemo)(()=>o??d??(0,r.hashMessage)(h,s),[o,d,h,s]),v=m.t({id:_,message:h,...s===void 0?{}:{context:s},...c===void 0?{}:{comment:c}}),y=g.length>0?e.i(v,g):v;return u?u(y):l?(0,t.createElement)(l,null,y):(0,n.jsx)(n.Fragment,{children:y})});function o(e,t,n){return e??(n===void 0?t:(0,r.hashMessage)(t,n))}function s(e){return typeof e==`string`||typeof e==`number`}function c(e,t){let n={};for(let t of r.PLURAL_CATEGORIES){let r=e[t];if(r!==void 0){if(!s(r))return;n[t]=String(r)}}if(n.other!==void 0)return(0,r.buildICUPluralMessage)(n,t)}function l(e){let t={};for(let[n,r]of Object.entries(e))if(r!==void 0){if(!s(r))return;t[n]=String(r)}if(t.other===void 0)return;let n=(0,r.normalizeSelectForms)(t);return{message:(0,r.buildICUSelectMessage)(n.forms),valueMap:n.valueMap}}var u=(0,t.memo)(function({value:a,id:s,context:l,comment:u,zero:d,one:f,two:p,few:m,many:h,other:g,offset:_}){let v=(0,t.useContext)(i);if(!v)throw Error(`[fluenti] <Plural> must be used within an <I18nProvider>`);let y={zero:d,one:f,two:p,few:m,many:h,other:g},b=c(y,_);if(b!==void 0)return(0,n.jsx)(n.Fragment,{children:v.t({id:o(s,b,l),message:b,...l===void 0?{}:{context:l},...u===void 0?{}:{comment:u}},{count:a})});let{messages:x,components:S}=e.n(r.PLURAL_CATEGORIES,y),C=(0,r.buildICUPluralMessage)({...x.zero!==void 0&&{zero:x.zero},...x.one!==void 0&&{one:x.one},...x.two!==void 0&&{two:x.two},...x.few!==void 0&&{few:x.few},...x.many!==void 0&&{many:x.many},other:x.other??``},_);return(0,n.jsx)(n.Fragment,{children:e.t({id:o(s,C,l),message:C,...l===void 0?{}:{context:l},...u===void 0?{}:{comment:u}},{count:a},(e,t)=>v.t(e,t),S)})}),d=(0,t.memo)(function(a){let s=(0,t.useContext)(i);if(!s)throw Error(`[fluenti] <Select> must be used within an <I18nProvider>`);let{value:c,id:u,context:d,comment:f,other:p,options:m,tag:h,...g}=a,_=m===void 0?{...Object.fromEntries(Object.entries(g).filter(([e])=>![`value`,`id`,`context`,`comment`,`options`,`other`,`tag`].includes(e))),other:p}:{...m,other:p},v=l(_);if(v!==void 0){let e=s.t({id:o(u,v.message,d),message:v.message,...d===void 0?{}:{context:d},...f===void 0?{}:{comment:f}},{value:v.valueMap[c]??`other`});return h?(0,t.createElement)(h,null,e):(0,n.jsx)(n.Fragment,{children:e})}let y=[...Object.keys(_).filter(e=>e!==`other`),`other`],{messages:b,components:x}=e.n(y,_),S=(0,r.normalizeSelectForms)(Object.fromEntries([...y].map(e=>[e,b[e]??``]))),C=(0,r.buildICUSelectMessage)(S.forms),w=e.t({id:o(u,C,d),message:C,...d===void 0?{}:{context:d},...f===void 0?{}:{comment:f}},{value:S.valueMap[c]??`other`},(e,t)=>s.t(e,t),x);return h?(0,t.createElement)(h,null,w):(0,n.jsx)(n.Fragment,{children:w})}),f=(0,t.memo)(function({value:e,format:r}){let a=(0,t.useContext)(i);if(!a)throw Error(`[fluenti] <DateTime> must be used within an <I18nProvider>`);return(0,n.jsx)(n.Fragment,{children:a.d(e,r)})}),p=(0,t.memo)(function({value:e,format:r}){let a=(0,t.useContext)(i);if(!a)throw Error(`[fluenti] <Number> must be used within an <I18nProvider>`);return(0,n.jsx)(n.Fragment,{children:a.n(e,r)})});Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return p}});
|
|
2
|
+
//# sourceMappingURL=Number-JCugssFE.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Number-JCugssFE.cjs","names":[],"sources":["../src/context.ts","../src/components/Trans.tsx","../src/components/plain.ts","../src/components/Plural.tsx","../src/components/Select.tsx","../src/components/DateTime.tsx","../src/components/Number.tsx"],"sourcesContent":["import { createContext } from 'react'\nimport type { FluentiContext } from './types'\n\nexport const I18nContext = /* @__PURE__ */ createContext<FluentiContext | null>(null)\n","import {\n createElement,\n memo,\n useContext,\n useMemo,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport { I18nContext } from '../context'\nimport { hashMessage, extractMessage, reconstruct } from './trans-core'\n\nexport interface FluentiTransProps {\n /** Source text with embedded components */\n children?: ReactNode\n /** Override auto-generated hash ID */\n id?: string\n /** Message context used for identity and translator disambiguation */\n context?: string\n /** Context comment for translators */\n comment?: string\n /** Wrapper element tag name (e.g. 'span', 'div'). Defaults to Fragment (no wrapper). */\n tag?: keyof React.JSX.IntrinsicElements\n /** Custom render wrapper */\n render?: (translation: ReactNode) => ReactNode\n /** @internal Pre-computed message ID from build plugin */\n __id?: string\n /** @internal Pre-computed ICU message from build plugin */\n __message?: string\n /** @internal Pre-computed component list from build plugin */\n __components?: ReactElement[]\n}\n\n/**\n * `<Trans>` component for rich-text translations containing nested React elements.\n *\n * @example\n * ```tsx\n * <Trans>Read the <a href=\"/docs\">documentation</a> for more info.</Trans>\n * ```\n */\nexport const Trans = /* @__PURE__ */ memo(function Trans({\n children,\n id,\n context,\n comment,\n tag,\n render,\n __id,\n __message,\n __components,\n}: FluentiTransProps) {\n const ctx = useContext(I18nContext)\n if (!ctx) {\n throw new Error('[fluenti] <Trans> must be used within an <I18nProvider>')\n }\n\n // Fast path: build plugin pre-computed message and components\n const hasPrecomputed = __message !== undefined\n if (hasPrecomputed) {\n const message = __message!\n const components = __components ?? []\n const messageId = id ?? __id ?? hashMessage(message, context)\n const translated = ctx.t(\n {\n id: messageId,\n message,\n ...(context !== undefined ? { context } : {}),\n ...(comment !== undefined ? { comment } : {}),\n },\n )\n\n const result = components.length > 0 ? reconstruct(translated, components) : translated\n if (render) return render(result)\n return tag ? createElement(tag, null, result) : <>{result}</>\n }\n\n const { message, components } = useMemo(\n () => extractMessage(children),\n [children],\n )\n const messageId = useMemo(\n () => id ?? __id ?? hashMessage(message, context),\n [id, __id, message, context],\n )\n\n const translated = ctx.t(\n {\n id: messageId,\n message,\n ...(context !== undefined ? { context } : {}),\n ...(comment !== undefined ? { comment } : {}),\n },\n )\n\n const result = components.length > 0 ? reconstruct(translated, components) : translated\n if (render) return render(result)\n return tag ? createElement(tag, null, result) : <>{result}</>\n})\n","import {\n PLURAL_CATEGORIES,\n buildICUPluralMessage,\n buildICUSelectMessage,\n hashMessage,\n normalizeSelectForms,\n type PluralCategory,\n} from '@fluenti/core/runtime'\nimport type { ReactNode } from 'react'\n\nexport function resolveCompiledMessageId(\n id: string | undefined,\n message: string,\n context: string | undefined,\n): string {\n return id ?? (context === undefined ? message : hashMessage(message, context))\n}\n\nfunction isPlainReactNode(value: ReactNode | undefined): value is string | number {\n return typeof value === 'string' || typeof value === 'number'\n}\n\nexport function buildPlainPluralMessage(\n forms: Record<PluralCategory, ReactNode | undefined>,\n offset?: number,\n): string | undefined {\n const plainForms: Partial<Record<PluralCategory, string>> = {}\n\n for (const category of PLURAL_CATEGORIES) {\n const value = forms[category]\n if (value === undefined) continue\n if (!isPlainReactNode(value)) return undefined\n plainForms[category] = String(value)\n }\n\n if (plainForms['other'] === undefined) return undefined\n return buildICUPluralMessage(plainForms as Partial<Record<PluralCategory, string>> & { other: string }, offset)\n}\n\nexport function buildPlainSelectMessage(\n forms: Record<string, ReactNode | undefined>,\n): { message: string; valueMap: Record<string, string> } | undefined {\n const plainForms: Record<string, string> = {}\n\n for (const [key, value] of Object.entries(forms)) {\n if (value === undefined) continue\n if (!isPlainReactNode(value)) return undefined\n plainForms[key] = String(value)\n }\n\n if (plainForms['other'] === undefined) return undefined\n\n const normalized = normalizeSelectForms(plainForms)\n return {\n message: buildICUSelectMessage(normalized.forms),\n valueMap: normalized.valueMap,\n }\n}\n","import { memo, useContext, type ReactNode } from 'react'\nimport { I18nContext } from '../context'\nimport { PLURAL_CATEGORIES, type PluralCategory } from './plural-core'\nimport { buildICUPluralMessage, renderRichTranslation, serializeRichForms } from './icu-rich'\nimport { buildPlainPluralMessage, resolveCompiledMessageId } from './plain'\n\nexport interface FluentiPluralProps {\n /** The count value */\n value: number\n /** Override the auto-generated synthetic ICU message id */\n id?: string\n /** Message context used for identity and translator disambiguation */\n context?: string\n /** Translator-facing note preserved in extraction catalogs */\n comment?: string\n /** Text for zero (if language supports) */\n zero?: ReactNode\n /** Singular form. `#` replaced with value */\n one?: ReactNode\n /** Dual form (Arabic, etc.) */\n two?: ReactNode\n /** Few form (Slavic languages, etc.) */\n few?: ReactNode\n /** Many form */\n many?: ReactNode\n /** Default plural form */\n other: ReactNode\n /** Offset from value before selecting form */\n offset?: number\n}\n\n/**\n * `<Plural>` — ICU plural handling as a component.\n *\n * @example\n * ```tsx\n * <Plural value={count} zero=\"No messages\" one=\"# message\" other=\"# messages\" />\n * ```\n */\nexport const Plural = /* @__PURE__ */ memo(function Plural({\n value,\n id,\n context,\n comment,\n zero,\n one,\n two,\n few,\n many,\n other,\n offset,\n}: FluentiPluralProps) {\n const ctx = useContext(I18nContext)\n if (!ctx) {\n throw new Error('[fluenti] <Plural> must be used within an <I18nProvider>')\n }\n\n const forms: Record<PluralCategory, ReactNode | undefined> = {\n zero,\n one,\n two,\n few,\n many,\n other,\n }\n const plainMessage = buildPlainPluralMessage(forms, offset)\n if (plainMessage !== undefined) {\n return <>{ctx.t(\n {\n id: resolveCompiledMessageId(id, plainMessage, context),\n message: plainMessage,\n ...(context !== undefined ? { context } : {}),\n ...(comment !== undefined ? { comment } : {}),\n },\n { count: value },\n )}</>\n }\n\n const { messages, components } = serializeRichForms(PLURAL_CATEGORIES, forms)\n const icuMessage = buildICUPluralMessage(\n {\n ...(messages.zero !== undefined && { zero: messages.zero }),\n ...(messages.one !== undefined && { one: messages.one }),\n ...(messages.two !== undefined && { two: messages.two }),\n ...(messages.few !== undefined && { few: messages.few }),\n ...(messages.many !== undefined && { many: messages.many }),\n other: messages.other ?? '',\n },\n offset,\n )\n\n const descriptor = {\n id: resolveCompiledMessageId(id, icuMessage, context),\n message: icuMessage,\n ...(context !== undefined ? { context } : {}),\n ...(comment !== undefined ? { comment } : {}),\n }\n\n return <>{renderRichTranslation(descriptor, { count: value }, (desc, values) => ctx.t(desc, values), components)}</>\n})\n","import { createElement, memo, useContext, type ReactNode } from 'react'\nimport { I18nContext } from '../context'\nimport { buildICUSelectMessage, normalizeSelectForms, renderRichTranslation, serializeRichForms } from './icu-rich'\nimport { buildPlainSelectMessage, resolveCompiledMessageId } from './plain'\n\nexport interface FluentiSelectProps {\n /** The selector value */\n value: string\n /** Override the auto-generated synthetic ICU message id */\n id?: string\n /** Message context used for identity and translator disambiguation */\n context?: string\n /** Translator-facing note preserved in extraction catalogs */\n comment?: string\n /** Default case */\n other: ReactNode\n /** Type-safe named options. Takes precedence over direct case props. */\n options?: Record<string, ReactNode>\n /** Wrapper element tag name (e.g. 'span', 'div'). Defaults to Fragment (no wrapper). */\n tag?: keyof React.JSX.IntrinsicElements\n /** Named cases — any string key maps to a ReactNode */\n [key: string]: ReactNode | Record<string, ReactNode> | keyof React.JSX.IntrinsicElements | undefined\n}\n\n/**\n * `<Select>` — ICU select for gender, role, or other categorical values.\n *\n * @example\n * ```tsx\n * <Select\n * value={gender}\n * male=\"He liked your post\"\n * female=\"She liked your post\"\n * other=\"They liked your post\"\n * />\n * ```\n */\nexport const Select = /* @__PURE__ */ memo(function Select(props: FluentiSelectProps) {\n const ctx = useContext(I18nContext)\n if (!ctx) {\n throw new Error('[fluenti] <Select> must be used within an <I18nProvider>')\n }\n\n const { value, id, context, comment, other, options, tag, ...cases } = props\n const forms: Record<string, ReactNode | undefined> = options === undefined\n ? {\n ...Object.fromEntries(\n Object.entries(cases).filter(([key]) => !['value', 'id', 'context', 'comment', 'options', 'other', 'tag'].includes(key)),\n ),\n other,\n }\n : {\n ...options,\n other,\n }\n const plain = buildPlainSelectMessage(forms)\n if (plain !== undefined) {\n const translated = ctx.t(\n {\n id: resolveCompiledMessageId(id, plain.message, context),\n message: plain.message,\n ...(context !== undefined ? { context } : {}),\n ...(comment !== undefined ? { comment } : {}),\n },\n { value: plain.valueMap[value] ?? 'other' },\n )\n\n return tag ? createElement(tag, null, translated) : <>{translated}</>\n }\n\n const orderedKeys = [...Object.keys(forms).filter(key => key !== 'other'), 'other'] as const\n const { messages, components } = serializeRichForms(orderedKeys, forms)\n const normalized = normalizeSelectForms(\n Object.fromEntries(\n [...orderedKeys].map((key) => [key, messages[key] ?? '']),\n ),\n )\n const icuMessage = buildICUSelectMessage(normalized.forms)\n\n const descriptor = {\n id: resolveCompiledMessageId(id, icuMessage, context),\n message: icuMessage,\n ...(context !== undefined ? { context } : {}),\n ...(comment !== undefined ? { comment } : {}),\n }\n\n const result = renderRichTranslation(\n descriptor,\n { value: normalized.valueMap[value] ?? 'other' },\n (desc, values) => ctx.t(desc, values),\n components,\n )\n return tag ? createElement(tag, null, result) : <>{result}</>\n})\n","import { memo, useContext } from 'react'\nimport { I18nContext } from '../context'\n\nexport interface FluentiDateTimeProps {\n /** Date value to format */\n value: Date | number\n /** Named format key defined in dateFormats config */\n format?: string\n}\n\n/**\n * `<DateTime>` — formatting component using Intl APIs.\n *\n * @example\n * ```tsx\n * <DateTime value={new Date()} format=\"long\" />\n * ```\n */\nexport const DateTime = /* @__PURE__ */ memo(function DateTime({ value, format }: FluentiDateTimeProps) {\n const ctx = useContext(I18nContext)\n if (!ctx) {\n throw new Error('[fluenti] <DateTime> must be used within an <I18nProvider>')\n }\n return <>{ctx.d(value, format)}</>\n})\n","import { memo, useContext } from 'react'\nimport { I18nContext } from '../context'\n\nexport interface NumberFormatProps {\n /** Number value to format */\n value: number\n /** Named format key defined in numberFormats config */\n format?: string\n}\n\n/** @alias NumberFormatProps */\nexport type FluentiNumberFormatProps = NumberFormatProps\n\n/**\n * `<Number>` — number formatting component using Intl APIs.\n *\n * @example\n * ```tsx\n * <Number value={1234.56} format=\"currency\" />\n * ```\n */\nexport const NumberFormat = /* @__PURE__ */ memo(function NumberFormat({ value, format }: NumberFormatProps) {\n const ctx = useContext(I18nContext)\n if (!ctx) {\n throw new Error('[fluenti] <Number> must be used within an <I18nProvider>')\n }\n return <>{ctx.n(value, format)}</>\n})\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./
|
|
1
|
+
"use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./Number-JCugssFE.cjs`),t=require(`./icu-rich-BlDjwT5Z.cjs`);let n=require(`react`),r=require(`react/jsx-runtime`),i=require(`@fluenti/core/runtime`);function a(e,t,i){return i?i(e):t?(0,n.createElement)(t,null,e):(0,r.jsx)(r.Fragment,{children:e})}var o=(0,n.memo)(function({message:t,id:r,context:o,comment:s,tag:c,render:l}){let u=(0,n.useContext)(e.s);if(!u)throw Error(`[fluenti] <Trans> must be used within an <I18nProvider>`);return a(u.t({id:r??(0,i.hashMessage)(t,o),message:t,...o===void 0?{}:{context:o},...s===void 0?{}:{comment:s}}),c,l)}),s=(0,n.memo)(function({message:r,components:o,id:s,context:c,comment:l,tag:u,render:d}){let f=(0,n.useContext)(e.s);if(!f)throw Error(`[fluenti] <Trans> must be used within an <I18nProvider>`);return a(t.t({id:s??(0,i.hashMessage)(r,c),message:r,...c===void 0?{}:{context:c},...l===void 0?{}:{comment:l}},void 0,(e,t)=>f.t(e,t),o),u,d)}),c=(0,n.memo)(function({value:t,message:i,id:a,context:o,comment:s}){let c=(0,n.useContext)(e.s);if(!c)throw Error(`[fluenti] <Plural> must be used within an <I18nProvider>`);return(0,r.jsx)(r.Fragment,{children:c.t({id:e.a(a,i,o),message:i,...o===void 0?{}:{context:o},...s===void 0?{}:{comment:s}},{count:t})})}),l=(0,n.memo)(function({value:t,message:i,valueMap:a,id:o,context:s,comment:c,tag:l}){let u=(0,n.useContext)(e.s);if(!u)throw Error(`[fluenti] <Select> must be used within an <I18nProvider>`);let d=u.t({id:e.a(o,i,s),message:i,...s===void 0?{}:{context:s},...c===void 0?{}:{comment:c}},{value:a?.[t]??`other`});return l?(0,n.createElement)(l,null,d):(0,r.jsx)(r.Fragment,{children:d})}),u=(0,n.memo)(function({value:i,message:a,components:o,id:s,context:c,comment:l}){let u=(0,n.useContext)(e.s);if(!u)throw Error(`[fluenti] <Plural> must be used within an <I18nProvider>`);return(0,r.jsx)(r.Fragment,{children:t.t({id:e.a(s,a,c),message:a,...c===void 0?{}:{context:c},...l===void 0?{}:{comment:l}},{count:i},(e,t)=>u.t(e,t),o)})}),d=(0,n.memo)(function({value:i,message:a,valueMap:o,components:s,id:c,context:l,comment:u,tag:d}){let f=(0,n.useContext)(e.s);if(!f)throw Error(`[fluenti] <Select> must be used within an <I18nProvider>`);let p=t.t({id:e.a(c,a,l),message:a,...l===void 0?{}:{context:l},...u===void 0?{}:{comment:u}},{value:o?.[i]??`other`},(e,t)=>f.t(e,t),s);return d?(0,n.createElement)(d,null,p):(0,r.jsx)(r.Fragment,{children:p})});exports.DateTime=e.n,exports.NumberFormat=e.t,exports.Plural=e.i,exports.Select=e.r,exports.Trans=e.o,exports.__FluentiCompiledPlural=c,exports.__FluentiCompiledRichPlural=u,exports.__FluentiCompiledRichSelect=d,exports.__FluentiCompiledRichTrans=s,exports.__FluentiCompiledSelect=l,exports.__FluentiCompiledTrans=o;
|
|
2
2
|
//# sourceMappingURL=components-entry.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components-entry.cjs","names":[],"sources":["../src/components/Trans.tsx","../src/components/Plural.tsx","../src/components/Select.tsx","../src/components/DateTime.tsx","../src/components/Number.tsx"],"sourcesContent":["import {\n createElement,\n memo,\n useContext,\n useMemo,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport { I18nContext } from '../context'\nimport { hashMessage, extractMessage, reconstruct } from './trans-core'\n\nexport interface FluentiTransProps {\n /** Source text with embedded components */\n children: ReactNode\n /** Override auto-generated hash ID */\n id?: string\n /** Message context used for identity and translator disambiguation */\n context?: string\n /** Context comment for translators */\n comment?: string\n /** Wrapper element tag name (e.g. 'span', 'div'). Defaults to Fragment (no wrapper). */\n tag?: keyof React.JSX.IntrinsicElements\n /** Custom render wrapper */\n render?: (translation: ReactNode) => ReactNode\n /** @internal Pre-computed message ID from build plugin */\n __id?: string\n /** @internal Pre-computed ICU message from build plugin */\n __message?: string\n /** @internal Pre-computed component list from build plugin */\n __components?: ReactElement[]\n}\n\n/**\n * `<Trans>` component for rich-text translations containing nested React elements.\n *\n * @example\n * ```tsx\n * <Trans>Read the <a href=\"/docs\">documentation</a> for more info.</Trans>\n * ```\n */\nexport const Trans = memo(function Trans({\n children,\n id,\n context,\n comment,\n tag,\n render,\n __id,\n __message,\n __components,\n}: FluentiTransProps) {\n const ctx = useContext(I18nContext)\n if (!ctx) {\n throw new Error('[fluenti] <Trans> must be used within an <I18nProvider>')\n }\n\n // Fast path: build plugin pre-computed message and components\n const hasPrecomputed = __message !== undefined\n\n const { message, components } = useMemo(\n () => hasPrecomputed\n ? { message: __message!, components: __components ?? [] }\n : extractMessage(children),\n [hasPrecomputed, __message, __components, children],\n )\n const messageId = useMemo(\n () => id ?? __id ?? hashMessage(message, context),\n [id, __id, message, context],\n )\n\n const translated = ctx.t(\n {\n id: messageId,\n message,\n ...(context !== undefined ? { context } : {}),\n ...(comment !== undefined ? { comment } : {}),\n },\n )\n\n const result = reconstruct(translated, components)\n if (render) return render(result)\n return tag ? createElement(tag, null, result) : <>{result}</>\n})\n","import { memo, useContext, type ReactNode } from 'react'\nimport { hashMessage } from '@fluenti/core/internal'\nimport { I18nContext } from '../context'\nimport { PLURAL_CATEGORIES, type PluralCategory } from './plural-core'\nimport { buildICUPluralMessage, renderRichTranslation, serializeRichForms } from './icu-rich'\n\nexport interface FluentiPluralProps {\n /** The count value */\n value: number\n /** Override the auto-generated synthetic ICU message id */\n id?: string\n /** Message context used for identity and translator disambiguation */\n context?: string\n /** Translator-facing note preserved in extraction catalogs */\n comment?: string\n /** Text for zero (if language supports) */\n zero?: ReactNode\n /** Singular form. `#` replaced with value */\n one?: ReactNode\n /** Dual form (Arabic, etc.) */\n two?: ReactNode\n /** Few form (Slavic languages, etc.) */\n few?: ReactNode\n /** Many form */\n many?: ReactNode\n /** Default plural form */\n other: ReactNode\n /** Offset from value before selecting form */\n offset?: number\n}\n\n/**\n * `<Plural>` — ICU plural handling as a component.\n *\n * @example\n * ```tsx\n * <Plural value={count} zero=\"No messages\" one=\"# message\" other=\"# messages\" />\n * ```\n */\nexport const Plural = memo(function Plural({\n value,\n id,\n context,\n comment,\n zero,\n one,\n two,\n few,\n many,\n other,\n offset,\n}: FluentiPluralProps) {\n const ctx = useContext(I18nContext)\n if (!ctx) {\n throw new Error('[fluenti] <Plural> must be used within an <I18nProvider>')\n }\n\n const forms: Record<PluralCategory, ReactNode | undefined> = {\n zero,\n one,\n two,\n few,\n many,\n other,\n }\n const { messages, components } = serializeRichForms(PLURAL_CATEGORIES, forms)\n const icuMessage = buildICUPluralMessage(\n {\n ...(messages.zero !== undefined && { zero: messages.zero }),\n ...(messages.one !== undefined && { one: messages.one }),\n ...(messages.two !== undefined && { two: messages.two }),\n ...(messages.few !== undefined && { few: messages.few }),\n ...(messages.many !== undefined && { many: messages.many }),\n other: messages.other ?? '',\n },\n offset,\n )\n\n const descriptor = {\n id: id ?? (context === undefined ? icuMessage : hashMessage(icuMessage, context)),\n message: icuMessage,\n ...(context !== undefined ? { context } : {}),\n ...(comment !== undefined ? { comment } : {}),\n }\n\n return <>{renderRichTranslation(descriptor, { count: value }, (desc, values) => ctx.t(desc, values), components)}</>\n})\n","import { createElement, memo, useContext, type ReactNode } from 'react'\nimport { hashMessage } from '@fluenti/core/internal'\nimport { I18nContext } from '../context'\nimport { buildICUSelectMessage, normalizeSelectForms, renderRichTranslation, serializeRichForms } from './icu-rich'\n\nexport interface FluentiSelectProps {\n /** The selector value */\n value: string\n /** Override the auto-generated synthetic ICU message id */\n id?: string\n /** Message context used for identity and translator disambiguation */\n context?: string\n /** Translator-facing note preserved in extraction catalogs */\n comment?: string\n /** Default case */\n other: ReactNode\n /** Type-safe named options. Takes precedence over direct case props. */\n options?: Record<string, ReactNode>\n /** Wrapper element tag name (e.g. 'span', 'div'). Defaults to Fragment (no wrapper). */\n tag?: keyof React.JSX.IntrinsicElements\n /** Named cases — any string key maps to a ReactNode */\n [key: string]: ReactNode | Record<string, ReactNode> | keyof React.JSX.IntrinsicElements | undefined\n}\n\n/**\n * `<Select>` — ICU select for gender, role, or other categorical values.\n *\n * @example\n * ```tsx\n * <Select\n * value={gender}\n * male=\"He liked your post\"\n * female=\"She liked your post\"\n * other=\"They liked your post\"\n * />\n * ```\n */\nexport const Select = memo(function Select(props: FluentiSelectProps) {\n const ctx = useContext(I18nContext)\n if (!ctx) {\n throw new Error('[fluenti] <Select> must be used within an <I18nProvider>')\n }\n\n const { value, id, context, comment, other, options, tag, ...cases } = props\n const forms: Record<string, ReactNode | undefined> = options === undefined\n ? {\n ...Object.fromEntries(\n Object.entries(cases).filter(([key]) => !['value', 'id', 'context', 'comment', 'options', 'other', 'tag'].includes(key)),\n ),\n other,\n }\n : {\n ...options,\n other,\n }\n\n const orderedKeys = [...Object.keys(forms).filter(key => key !== 'other'), 'other'] as const\n const { messages, components } = serializeRichForms(orderedKeys, forms)\n const normalized = normalizeSelectForms(\n Object.fromEntries(\n [...orderedKeys].map((key) => [key, messages[key] ?? '']),\n ),\n )\n const icuMessage = buildICUSelectMessage(normalized.forms)\n\n const descriptor = {\n id: id ?? (context === undefined ? icuMessage : hashMessage(icuMessage, context)),\n message: icuMessage,\n ...(context !== undefined ? { context } : {}),\n ...(comment !== undefined ? { comment } : {}),\n }\n\n const result = renderRichTranslation(\n descriptor,\n { value: normalized.valueMap[value] ?? 'other' },\n (desc, values) => ctx.t(desc, values),\n components,\n )\n return tag ? createElement(tag, null, result) : <>{result}</>\n})\n","import { memo, useContext } from 'react'\nimport { I18nContext } from '../context'\n\nexport interface FluentiDateTimeProps {\n /** Date value to format */\n value: Date | number\n /** Named format key defined in dateFormats config */\n format?: string\n}\n\n/**\n * `<DateTime>` — formatting component using Intl APIs.\n *\n * @example\n * ```tsx\n * <DateTime value={new Date()} format=\"long\" />\n * ```\n */\nexport const DateTime = memo(function DateTime({ value, format }: FluentiDateTimeProps) {\n const ctx = useContext(I18nContext)\n if (!ctx) {\n throw new Error('[fluenti] <DateTime> must be used within an <I18nProvider>')\n }\n return <>{ctx.d(value, format)}</>\n})\n","import { memo, useContext } from 'react'\nimport { I18nContext } from '../context'\n\nexport interface NumberFormatProps {\n /** Number value to format */\n value: number\n /** Named format key defined in numberFormats config */\n format?: string\n}\n\n/** @alias NumberFormatProps */\nexport type FluentiNumberFormatProps = NumberFormatProps\n\n/**\n * `<Number>` — number formatting component using Intl APIs.\n *\n * @example\n * ```tsx\n * <Number value={1234.56} format=\"currency\" />\n * ```\n */\nexport const NumberFormat = memo(function NumberFormat({ value, format }: NumberFormatProps) {\n const ctx = useContext(I18nContext)\n if (!ctx) {\n throw new Error('[fluenti] <Number> must be used within an <I18nProvider>')\n }\n return <>{ctx.n(value, format)}</>\n})\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"components-entry.cjs","names":[],"sources":["../src/components/compiled.tsx"],"sourcesContent":["import { createElement, memo, useContext } from 'react'\nimport { I18nContext } from '../context'\nimport { hashMessage } from './trans-core'\nimport { renderRichTranslation } from './icu-rich'\nimport { resolveCompiledMessageId } from './plain'\n\nexport interface FluentiCompiledTransProps {\n message: string\n id?: string\n context?: string\n comment?: string\n tag?: keyof React.JSX.IntrinsicElements\n render?: (translation: React.ReactNode) => React.ReactNode\n}\n\nexport interface FluentiCompiledPluralProps {\n value: number\n message: string\n id?: string\n context?: string\n comment?: string\n}\n\nexport interface FluentiCompiledSelectProps {\n value: string\n message: string\n valueMap?: Record<string, string>\n id?: string\n context?: string\n comment?: string\n tag?: keyof React.JSX.IntrinsicElements\n}\n\nexport interface FluentiCompiledRichTransProps extends FluentiCompiledTransProps {\n components: React.ReactElement[]\n}\n\nexport interface FluentiCompiledRichPluralProps extends FluentiCompiledPluralProps {\n components: React.ReactElement[]\n}\n\nexport interface FluentiCompiledRichSelectProps extends FluentiCompiledSelectProps {\n components: React.ReactElement[]\n}\n\nfunction renderCompiledTransResult(\n result: React.ReactNode,\n tag: keyof React.JSX.IntrinsicElements | undefined,\n render: ((translation: React.ReactNode) => React.ReactNode) | undefined,\n) {\n if (render) {\n return render(result)\n }\n return tag ? createElement(tag, null, result) : <>{result}</>\n}\n\n/** @internal Build-plugin fast path for plain-text `<Trans>` usage. */\nexport const __FluentiCompiledTrans = /* @__PURE__ */ memo(function FluentiCompiledTrans({\n message,\n id,\n context,\n comment,\n tag,\n render,\n}: FluentiCompiledTransProps) {\n const ctx = useContext(I18nContext)\n if (!ctx) {\n throw new Error('[fluenti] <Trans> must be used within an <I18nProvider>')\n }\n\n const translated = ctx.t(\n {\n id: id ?? hashMessage(message, context),\n message,\n ...(context !== undefined ? { context } : {}),\n ...(comment !== undefined ? { comment } : {}),\n },\n )\n\n return renderCompiledTransResult(translated, tag, render)\n})\n\n/** @internal Build-plugin fast path for rich-text `<Trans>` usage. */\nexport const __FluentiCompiledRichTrans = /* @__PURE__ */ memo(function FluentiCompiledRichTrans({\n message,\n components,\n id,\n context,\n comment,\n tag,\n render,\n}: FluentiCompiledRichTransProps) {\n const ctx = useContext(I18nContext)\n if (!ctx) {\n throw new Error('[fluenti] <Trans> must be used within an <I18nProvider>')\n }\n\n const descriptor = {\n id: id ?? hashMessage(message, context),\n message,\n ...(context !== undefined ? { context } : {}),\n ...(comment !== undefined ? { comment } : {}),\n }\n const translated = renderRichTranslation(\n descriptor,\n undefined,\n (desc, values) => ctx.t(desc, values),\n components,\n )\n\n return renderCompiledTransResult(translated, tag, render)\n})\n\n/** @internal Build-plugin fast path for plain-text `<Plural>` usage. */\nexport const __FluentiCompiledPlural = /* @__PURE__ */ memo(function FluentiCompiledPlural({\n value,\n message,\n id,\n context,\n comment,\n}: FluentiCompiledPluralProps) {\n const ctx = useContext(I18nContext)\n if (!ctx) {\n throw new Error('[fluenti] <Plural> must be used within an <I18nProvider>')\n }\n\n const translated = ctx.t(\n {\n id: resolveCompiledMessageId(id, message, context),\n message,\n ...(context !== undefined ? { context } : {}),\n ...(comment !== undefined ? { comment } : {}),\n },\n { count: value },\n )\n\n return <>{translated}</>\n})\n\n/** @internal Build-plugin fast path for plain-text `<Select>` usage. */\nexport const __FluentiCompiledSelect = /* @__PURE__ */ memo(function FluentiCompiledSelect({\n value,\n message,\n valueMap,\n id,\n context,\n comment,\n tag,\n}: FluentiCompiledSelectProps) {\n const ctx = useContext(I18nContext)\n if (!ctx) {\n throw new Error('[fluenti] <Select> must be used within an <I18nProvider>')\n }\n\n const translated = ctx.t(\n {\n id: resolveCompiledMessageId(id, message, context),\n message,\n ...(context !== undefined ? { context } : {}),\n ...(comment !== undefined ? { comment } : {}),\n },\n { value: valueMap?.[value] ?? 'other' },\n )\n\n return tag ? createElement(tag, null, translated) : <>{translated}</>\n})\n\n/** @internal Build-plugin fast path for rich-text `<Plural>` usage. */\nexport const __FluentiCompiledRichPlural = /* @__PURE__ */ memo(function FluentiCompiledRichPlural({\n value,\n message,\n components,\n id,\n context,\n comment,\n}: FluentiCompiledRichPluralProps) {\n const ctx = useContext(I18nContext)\n if (!ctx) {\n throw new Error('[fluenti] <Plural> must be used within an <I18nProvider>')\n }\n\n const descriptor = {\n id: resolveCompiledMessageId(id, message, context),\n message,\n ...(context !== undefined ? { context } : {}),\n ...(comment !== undefined ? { comment } : {}),\n }\n\n return <>{renderRichTranslation(descriptor, { count: value }, (desc, values) => ctx.t(desc, values), components)}</>\n})\n\n/** @internal Build-plugin fast path for rich-text `<Select>` usage. */\nexport const __FluentiCompiledRichSelect = /* @__PURE__ */ memo(function FluentiCompiledRichSelect({\n value,\n message,\n valueMap,\n components,\n id,\n context,\n comment,\n tag,\n}: FluentiCompiledRichSelectProps) {\n const ctx = useContext(I18nContext)\n if (!ctx) {\n throw new Error('[fluenti] <Select> must be used within an <I18nProvider>')\n }\n\n const descriptor = {\n id: resolveCompiledMessageId(id, message, context),\n message,\n ...(context !== undefined ? { context } : {}),\n ...(comment !== undefined ? { comment } : {}),\n }\n const translated = renderRichTranslation(\n descriptor,\n { value: valueMap?.[value] ?? 'other' },\n (desc, values) => ctx.t(desc, values),\n components,\n )\n\n return tag ? createElement(tag, null, translated) : <>{translated}</>\n})\n"],"mappings":"uPA6CA,SAAS,EACP,EACA,EACA,EACA,CAIA,OAHI,EACK,EAAO,EAAO,CAEhB,GAAA,EAAA,EAAA,eAAoB,EAAK,KAAM,EAAO,EAAG,EAAA,EAAA,KAAA,EAAA,SAAA,CAAA,SAAG,EAAU,CAAA,CAI/D,IAAa,GAAyC,EAAA,EAAA,MAAK,SAA8B,CACvF,UACA,KACA,UACA,UACA,MACA,UAC4B,CAC5B,IAAM,GAAA,EAAA,EAAA,YAAiB,EAAA,EAAY,CACnC,GAAI,CAAC,EACH,MAAU,MAAM,0DAA0D,CAY5E,OAAO,EATY,EAAI,EACrB,CACE,GAAI,IAAA,EAAA,EAAA,aAAkB,EAAS,EAAQ,CACvC,UACA,GAAI,IAAY,IAAA,GAA0B,EAAE,CAAhB,CAAE,UAAS,CACvC,GAAI,IAAY,IAAA,GAA0B,EAAE,CAAhB,CAAE,UAAS,CACxC,CACF,CAE4C,EAAK,EAAO,EACzD,CAGW,GAA6C,EAAA,EAAA,MAAK,SAAkC,CAC/F,UACA,aACA,KACA,UACA,UACA,MACA,UACgC,CAChC,IAAM,GAAA,EAAA,EAAA,YAAiB,EAAA,EAAY,CACnC,GAAI,CAAC,EACH,MAAU,MAAM,0DAA0D,CAgB5E,OAAO,EAPY,EAAA,EANA,CACjB,GAAI,IAAA,EAAA,EAAA,aAAkB,EAAS,EAAQ,CACvC,UACA,GAAI,IAAY,IAAA,GAA0B,EAAE,CAAhB,CAAE,UAAS,CACvC,GAAI,IAAY,IAAA,GAA0B,EAAE,CAAhB,CAAE,UAAS,CACxC,CAGC,IAAA,IACC,EAAM,IAAW,EAAI,EAAE,EAAM,EAAO,CACrC,EACD,CAE4C,EAAK,EAAO,EACzD,CAGW,GAA0C,EAAA,EAAA,MAAK,SAA+B,CACzF,QACA,UACA,KACA,UACA,WAC6B,CAC7B,IAAM,GAAA,EAAA,EAAA,YAAiB,EAAA,EAAY,CACnC,GAAI,CAAC,EACH,MAAU,MAAM,2DAA2D,CAa7E,OAAO,EAAA,EAAA,KAAA,EAAA,SAAA,CAAA,SAVY,EAAI,EACrB,CACE,GAAI,EAAA,EAAyB,EAAI,EAAS,EAAQ,CAClD,UACA,GAAI,IAAY,IAAA,GAA0B,EAAE,CAAhB,CAAE,UAAS,CACvC,GAAI,IAAY,IAAA,GAA0B,EAAE,CAAhB,CAAE,UAAS,CACxC,CACD,CAAE,MAAO,EAAO,CACjB,CAEuB,CAAA,EACxB,CAGW,GAA0C,EAAA,EAAA,MAAK,SAA+B,CACzF,QACA,UACA,WACA,KACA,UACA,UACA,OAC6B,CAC7B,IAAM,GAAA,EAAA,EAAA,YAAiB,EAAA,EAAY,CACnC,GAAI,CAAC,EACH,MAAU,MAAM,2DAA2D,CAG7E,IAAM,EAAa,EAAI,EACrB,CACE,GAAI,EAAA,EAAyB,EAAI,EAAS,EAAQ,CAClD,UACA,GAAI,IAAY,IAAA,GAA0B,EAAE,CAAhB,CAAE,UAAS,CACvC,GAAI,IAAY,IAAA,GAA0B,EAAE,CAAhB,CAAE,UAAS,CACxC,CACD,CAAE,MAAO,IAAW,IAAU,QAAS,CACxC,CAED,OAAO,GAAA,EAAA,EAAA,eAAoB,EAAK,KAAM,EAAW,EAAG,EAAA,EAAA,KAAA,EAAA,SAAA,CAAA,SAAG,EAAc,CAAA,EACrE,CAGW,GAA8C,EAAA,EAAA,MAAK,SAAmC,CACjG,QACA,UACA,aACA,KACA,UACA,WACiC,CACjC,IAAM,GAAA,EAAA,EAAA,YAAiB,EAAA,EAAY,CACnC,GAAI,CAAC,EACH,MAAU,MAAM,2DAA2D,CAU7E,OAAO,EAAA,EAAA,KAAA,EAAA,SAAA,CAAA,SAAG,EAAA,EAPS,CACjB,GAAI,EAAA,EAAyB,EAAI,EAAS,EAAQ,CAClD,UACA,GAAI,IAAY,IAAA,GAA0B,EAAE,CAAhB,CAAE,UAAS,CACvC,GAAI,IAAY,IAAA,GAA0B,EAAE,CAAhB,CAAE,UAAS,CACxC,CAE2C,CAAE,MAAO,EAAO,EAAG,EAAM,IAAW,EAAI,EAAE,EAAM,EAAO,CAAE,EAAW,CAAI,CAAA,EACpH,CAGW,GAA8C,EAAA,EAAA,MAAK,SAAmC,CACjG,QACA,UACA,WACA,aACA,KACA,UACA,UACA,OACiC,CACjC,IAAM,GAAA,EAAA,EAAA,YAAiB,EAAA,EAAY,CACnC,GAAI,CAAC,EACH,MAAU,MAAM,2DAA2D,CAS7E,IAAM,EAAa,EAAA,EANA,CACjB,GAAI,EAAA,EAAyB,EAAI,EAAS,EAAQ,CAClD,UACA,GAAI,IAAY,IAAA,GAA0B,EAAE,CAAhB,CAAE,UAAS,CACvC,GAAI,IAAY,IAAA,GAA0B,EAAE,CAAhB,CAAE,UAAS,CACxC,CAGC,CAAE,MAAO,IAAW,IAAU,QAAS,EACtC,EAAM,IAAW,EAAI,EAAE,EAAM,EAAO,CACrC,EACD,CAED,OAAO,GAAA,EAAA,EAAA,eAAoB,EAAK,KAAM,EAAW,EAAG,EAAA,EAAA,KAAA,EAAA,SAAA,CAAA,SAAG,EAAc,CAAA,EACrE"}
|
package/dist/components-entry.js
CHANGED
|
@@ -1,91 +1,70 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { createElement as
|
|
5
|
-
import { Fragment as
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
let
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
2
|
+
import { a as e, i as t, n, o as r, r as i, s as a, t as o } from "./Number-DfzWPfIE.js";
|
|
3
|
+
import { c as s, i as c } from "./icu-rich-C6B9ns4t.js";
|
|
4
|
+
import { createElement as l, memo as u, useContext as d } from "react";
|
|
5
|
+
import { Fragment as f, jsx as p } from "react/jsx-runtime";
|
|
6
|
+
//#region src/components/compiled.tsx
|
|
7
|
+
function m(e, t, n) {
|
|
8
|
+
return n ? n(e) : t ? l(t, null, e) : /* @__PURE__ */ p(f, { children: e });
|
|
9
|
+
}
|
|
10
|
+
var h = /* @__PURE__ */ u(function({ message: e, id: t, context: n, comment: r, tag: i, render: o }) {
|
|
11
|
+
let c = d(a);
|
|
12
|
+
if (!c) throw Error("[fluenti] <Trans> must be used within an <I18nProvider>");
|
|
13
|
+
return m(c.t({
|
|
14
|
+
id: t ?? s(e, n),
|
|
15
|
+
message: e,
|
|
16
|
+
...n === void 0 ? {} : { context: n },
|
|
17
|
+
...r === void 0 ? {} : { comment: r }
|
|
18
|
+
}), i, o);
|
|
19
|
+
}), g = /* @__PURE__ */ u(function({ message: e, components: t, id: n, context: r, comment: i, tag: o, render: l }) {
|
|
20
|
+
let u = d(a);
|
|
21
|
+
if (!u) throw Error("[fluenti] <Trans> must be used within an <I18nProvider>");
|
|
22
|
+
return m(c({
|
|
23
|
+
id: n ?? s(e, r),
|
|
24
|
+
message: e,
|
|
25
|
+
...r === void 0 ? {} : { context: r },
|
|
26
|
+
...i === void 0 ? {} : { comment: i }
|
|
27
|
+
}, void 0, (e, t) => u.t(e, t), t), o, l);
|
|
28
|
+
}), _ = /* @__PURE__ */ u(function({ value: t, message: n, id: r, context: i, comment: o }) {
|
|
29
|
+
let s = d(a);
|
|
30
|
+
if (!s) throw Error("[fluenti] <Plural> must be used within an <I18nProvider>");
|
|
31
|
+
return /* @__PURE__ */ p(f, { children: s.t({
|
|
32
|
+
id: e(r, n, i),
|
|
33
|
+
message: n,
|
|
34
|
+
...i === void 0 ? {} : { context: i },
|
|
28
35
|
...o === void 0 ? {} : { comment: o }
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
two: d,
|
|
38
|
-
few: p,
|
|
39
|
-
many: _,
|
|
40
|
-
other: v
|
|
41
|
-
}), C = l({
|
|
42
|
-
...x.zero !== void 0 && { zero: x.zero },
|
|
43
|
-
...x.one !== void 0 && { one: x.one },
|
|
44
|
-
...x.two !== void 0 && { two: x.two },
|
|
45
|
-
...x.few !== void 0 && { few: x.few },
|
|
46
|
-
...x.many !== void 0 && { many: x.many },
|
|
47
|
-
other: x.other ?? ""
|
|
48
|
-
}, y);
|
|
49
|
-
return /* @__PURE__ */ h(m, { children: r({
|
|
50
|
-
id: i ?? (a === void 0 ? C : g(C, a)),
|
|
51
|
-
message: C,
|
|
52
|
-
...a === void 0 ? {} : { context: a },
|
|
36
|
+
}, { count: t }) });
|
|
37
|
+
}), v = /* @__PURE__ */ u(function({ value: t, message: n, valueMap: r, id: i, context: o, comment: s, tag: c }) {
|
|
38
|
+
let u = d(a);
|
|
39
|
+
if (!u) throw Error("[fluenti] <Select> must be used within an <I18nProvider>");
|
|
40
|
+
let m = u.t({
|
|
41
|
+
id: e(i, n, o),
|
|
42
|
+
message: n,
|
|
43
|
+
...o === void 0 ? {} : { context: o },
|
|
53
44
|
...s === void 0 ? {} : { comment: s }
|
|
54
|
-
}, {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
...l === void 0 ? {} : { context: l },
|
|
76
|
-
...d === void 0 ? {} : { comment: d }
|
|
77
|
-
}, { value: w.valueMap[o] ?? "other" }, (e, t) => i.t(e, t), C);
|
|
78
|
-
return v ? u(v, null, E) : /* @__PURE__ */ h(m, { children: E });
|
|
79
|
-
}), x = d(function({ value: t, format: n }) {
|
|
80
|
-
let r = f(e);
|
|
81
|
-
if (!r) throw Error("[fluenti] <DateTime> must be used within an <I18nProvider>");
|
|
82
|
-
return /* @__PURE__ */ h(m, { children: r.d(t, n) });
|
|
83
|
-
}), S = d(function({ value: t, format: n }) {
|
|
84
|
-
let r = f(e);
|
|
85
|
-
if (!r) throw Error("[fluenti] <Number> must be used within an <I18nProvider>");
|
|
86
|
-
return /* @__PURE__ */ h(m, { children: r.n(t, n) });
|
|
45
|
+
}, { value: r?.[t] ?? "other" });
|
|
46
|
+
return c ? l(c, null, m) : /* @__PURE__ */ p(f, { children: m });
|
|
47
|
+
}), y = /* @__PURE__ */ u(function({ value: t, message: n, components: r, id: i, context: o, comment: s }) {
|
|
48
|
+
let l = d(a);
|
|
49
|
+
if (!l) throw Error("[fluenti] <Plural> must be used within an <I18nProvider>");
|
|
50
|
+
return /* @__PURE__ */ p(f, { children: c({
|
|
51
|
+
id: e(i, n, o),
|
|
52
|
+
message: n,
|
|
53
|
+
...o === void 0 ? {} : { context: o },
|
|
54
|
+
...s === void 0 ? {} : { comment: s }
|
|
55
|
+
}, { count: t }, (e, t) => l.t(e, t), r) });
|
|
56
|
+
}), b = /* @__PURE__ */ u(function({ value: t, message: n, valueMap: r, components: i, id: o, context: s, comment: u, tag: m }) {
|
|
57
|
+
let h = d(a);
|
|
58
|
+
if (!h) throw Error("[fluenti] <Select> must be used within an <I18nProvider>");
|
|
59
|
+
let g = c({
|
|
60
|
+
id: e(o, n, s),
|
|
61
|
+
message: n,
|
|
62
|
+
...s === void 0 ? {} : { context: s },
|
|
63
|
+
...u === void 0 ? {} : { comment: u }
|
|
64
|
+
}, { value: r?.[t] ?? "other" }, (e, t) => h.t(e, t), i);
|
|
65
|
+
return m ? l(m, null, g) : /* @__PURE__ */ p(f, { children: g });
|
|
87
66
|
});
|
|
88
67
|
//#endregion
|
|
89
|
-
export {
|
|
68
|
+
export { n as DateTime, o as NumberFormat, t as Plural, i as Select, r as Trans, _ as __FluentiCompiledPlural, y as __FluentiCompiledRichPlural, b as __FluentiCompiledRichSelect, g as __FluentiCompiledRichTrans, v as __FluentiCompiledSelect, h as __FluentiCompiledTrans };
|
|
90
69
|
|
|
91
70
|
//# sourceMappingURL=components-entry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components-entry.js","names":[],"sources":["../src/components/Trans.tsx","../src/components/Plural.tsx","../src/components/Select.tsx","../src/components/DateTime.tsx","../src/components/Number.tsx"],"sourcesContent":["import {\n createElement,\n memo,\n useContext,\n useMemo,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport { I18nContext } from '../context'\nimport { hashMessage, extractMessage, reconstruct } from './trans-core'\n\nexport interface FluentiTransProps {\n /** Source text with embedded components */\n children: ReactNode\n /** Override auto-generated hash ID */\n id?: string\n /** Message context used for identity and translator disambiguation */\n context?: string\n /** Context comment for translators */\n comment?: string\n /** Wrapper element tag name (e.g. 'span', 'div'). Defaults to Fragment (no wrapper). */\n tag?: keyof React.JSX.IntrinsicElements\n /** Custom render wrapper */\n render?: (translation: ReactNode) => ReactNode\n /** @internal Pre-computed message ID from build plugin */\n __id?: string\n /** @internal Pre-computed ICU message from build plugin */\n __message?: string\n /** @internal Pre-computed component list from build plugin */\n __components?: ReactElement[]\n}\n\n/**\n * `<Trans>` component for rich-text translations containing nested React elements.\n *\n * @example\n * ```tsx\n * <Trans>Read the <a href=\"/docs\">documentation</a> for more info.</Trans>\n * ```\n */\nexport const Trans = memo(function Trans({\n children,\n id,\n context,\n comment,\n tag,\n render,\n __id,\n __message,\n __components,\n}: FluentiTransProps) {\n const ctx = useContext(I18nContext)\n if (!ctx) {\n throw new Error('[fluenti] <Trans> must be used within an <I18nProvider>')\n }\n\n // Fast path: build plugin pre-computed message and components\n const hasPrecomputed = __message !== undefined\n\n const { message, components } = useMemo(\n () => hasPrecomputed\n ? { message: __message!, components: __components ?? [] }\n : extractMessage(children),\n [hasPrecomputed, __message, __components, children],\n )\n const messageId = useMemo(\n () => id ?? __id ?? hashMessage(message, context),\n [id, __id, message, context],\n )\n\n const translated = ctx.t(\n {\n id: messageId,\n message,\n ...(context !== undefined ? { context } : {}),\n ...(comment !== undefined ? { comment } : {}),\n },\n )\n\n const result = reconstruct(translated, components)\n if (render) return render(result)\n return tag ? createElement(tag, null, result) : <>{result}</>\n})\n","import { memo, useContext, type ReactNode } from 'react'\nimport { hashMessage } from '@fluenti/core/internal'\nimport { I18nContext } from '../context'\nimport { PLURAL_CATEGORIES, type PluralCategory } from './plural-core'\nimport { buildICUPluralMessage, renderRichTranslation, serializeRichForms } from './icu-rich'\n\nexport interface FluentiPluralProps {\n /** The count value */\n value: number\n /** Override the auto-generated synthetic ICU message id */\n id?: string\n /** Message context used for identity and translator disambiguation */\n context?: string\n /** Translator-facing note preserved in extraction catalogs */\n comment?: string\n /** Text for zero (if language supports) */\n zero?: ReactNode\n /** Singular form. `#` replaced with value */\n one?: ReactNode\n /** Dual form (Arabic, etc.) */\n two?: ReactNode\n /** Few form (Slavic languages, etc.) */\n few?: ReactNode\n /** Many form */\n many?: ReactNode\n /** Default plural form */\n other: ReactNode\n /** Offset from value before selecting form */\n offset?: number\n}\n\n/**\n * `<Plural>` — ICU plural handling as a component.\n *\n * @example\n * ```tsx\n * <Plural value={count} zero=\"No messages\" one=\"# message\" other=\"# messages\" />\n * ```\n */\nexport const Plural = memo(function Plural({\n value,\n id,\n context,\n comment,\n zero,\n one,\n two,\n few,\n many,\n other,\n offset,\n}: FluentiPluralProps) {\n const ctx = useContext(I18nContext)\n if (!ctx) {\n throw new Error('[fluenti] <Plural> must be used within an <I18nProvider>')\n }\n\n const forms: Record<PluralCategory, ReactNode | undefined> = {\n zero,\n one,\n two,\n few,\n many,\n other,\n }\n const { messages, components } = serializeRichForms(PLURAL_CATEGORIES, forms)\n const icuMessage = buildICUPluralMessage(\n {\n ...(messages.zero !== undefined && { zero: messages.zero }),\n ...(messages.one !== undefined && { one: messages.one }),\n ...(messages.two !== undefined && { two: messages.two }),\n ...(messages.few !== undefined && { few: messages.few }),\n ...(messages.many !== undefined && { many: messages.many }),\n other: messages.other ?? '',\n },\n offset,\n )\n\n const descriptor = {\n id: id ?? (context === undefined ? icuMessage : hashMessage(icuMessage, context)),\n message: icuMessage,\n ...(context !== undefined ? { context } : {}),\n ...(comment !== undefined ? { comment } : {}),\n }\n\n return <>{renderRichTranslation(descriptor, { count: value }, (desc, values) => ctx.t(desc, values), components)}</>\n})\n","import { createElement, memo, useContext, type ReactNode } from 'react'\nimport { hashMessage } from '@fluenti/core/internal'\nimport { I18nContext } from '../context'\nimport { buildICUSelectMessage, normalizeSelectForms, renderRichTranslation, serializeRichForms } from './icu-rich'\n\nexport interface FluentiSelectProps {\n /** The selector value */\n value: string\n /** Override the auto-generated synthetic ICU message id */\n id?: string\n /** Message context used for identity and translator disambiguation */\n context?: string\n /** Translator-facing note preserved in extraction catalogs */\n comment?: string\n /** Default case */\n other: ReactNode\n /** Type-safe named options. Takes precedence over direct case props. */\n options?: Record<string, ReactNode>\n /** Wrapper element tag name (e.g. 'span', 'div'). Defaults to Fragment (no wrapper). */\n tag?: keyof React.JSX.IntrinsicElements\n /** Named cases — any string key maps to a ReactNode */\n [key: string]: ReactNode | Record<string, ReactNode> | keyof React.JSX.IntrinsicElements | undefined\n}\n\n/**\n * `<Select>` — ICU select for gender, role, or other categorical values.\n *\n * @example\n * ```tsx\n * <Select\n * value={gender}\n * male=\"He liked your post\"\n * female=\"She liked your post\"\n * other=\"They liked your post\"\n * />\n * ```\n */\nexport const Select = memo(function Select(props: FluentiSelectProps) {\n const ctx = useContext(I18nContext)\n if (!ctx) {\n throw new Error('[fluenti] <Select> must be used within an <I18nProvider>')\n }\n\n const { value, id, context, comment, other, options, tag, ...cases } = props\n const forms: Record<string, ReactNode | undefined> = options === undefined\n ? {\n ...Object.fromEntries(\n Object.entries(cases).filter(([key]) => !['value', 'id', 'context', 'comment', 'options', 'other', 'tag'].includes(key)),\n ),\n other,\n }\n : {\n ...options,\n other,\n }\n\n const orderedKeys = [...Object.keys(forms).filter(key => key !== 'other'), 'other'] as const\n const { messages, components } = serializeRichForms(orderedKeys, forms)\n const normalized = normalizeSelectForms(\n Object.fromEntries(\n [...orderedKeys].map((key) => [key, messages[key] ?? '']),\n ),\n )\n const icuMessage = buildICUSelectMessage(normalized.forms)\n\n const descriptor = {\n id: id ?? (context === undefined ? icuMessage : hashMessage(icuMessage, context)),\n message: icuMessage,\n ...(context !== undefined ? { context } : {}),\n ...(comment !== undefined ? { comment } : {}),\n }\n\n const result = renderRichTranslation(\n descriptor,\n { value: normalized.valueMap[value] ?? 'other' },\n (desc, values) => ctx.t(desc, values),\n components,\n )\n return tag ? createElement(tag, null, result) : <>{result}</>\n})\n","import { memo, useContext } from 'react'\nimport { I18nContext } from '../context'\n\nexport interface FluentiDateTimeProps {\n /** Date value to format */\n value: Date | number\n /** Named format key defined in dateFormats config */\n format?: string\n}\n\n/**\n * `<DateTime>` — formatting component using Intl APIs.\n *\n * @example\n * ```tsx\n * <DateTime value={new Date()} format=\"long\" />\n * ```\n */\nexport const DateTime = memo(function DateTime({ value, format }: FluentiDateTimeProps) {\n const ctx = useContext(I18nContext)\n if (!ctx) {\n throw new Error('[fluenti] <DateTime> must be used within an <I18nProvider>')\n }\n return <>{ctx.d(value, format)}</>\n})\n","import { memo, useContext } from 'react'\nimport { I18nContext } from '../context'\n\nexport interface NumberFormatProps {\n /** Number value to format */\n value: number\n /** Named format key defined in numberFormats config */\n format?: string\n}\n\n/** @alias NumberFormatProps */\nexport type FluentiNumberFormatProps = NumberFormatProps\n\n/**\n * `<Number>` — number formatting component using Intl APIs.\n *\n * @example\n * ```tsx\n * <Number value={1234.56} format=\"currency\" />\n * ```\n */\nexport const NumberFormat = memo(function NumberFormat({ value, format }: NumberFormatProps) {\n const ctx = useContext(I18nContext)\n if (!ctx) {\n throw new Error('[fluenti] <Number> must be used within an <I18nProvider>')\n }\n return <>{ctx.n(value, format)}</>\n})\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"components-entry.js","names":[],"sources":["../src/components/compiled.tsx"],"sourcesContent":["import { createElement, memo, useContext } from 'react'\nimport { I18nContext } from '../context'\nimport { hashMessage } from './trans-core'\nimport { renderRichTranslation } from './icu-rich'\nimport { resolveCompiledMessageId } from './plain'\n\nexport interface FluentiCompiledTransProps {\n message: string\n id?: string\n context?: string\n comment?: string\n tag?: keyof React.JSX.IntrinsicElements\n render?: (translation: React.ReactNode) => React.ReactNode\n}\n\nexport interface FluentiCompiledPluralProps {\n value: number\n message: string\n id?: string\n context?: string\n comment?: string\n}\n\nexport interface FluentiCompiledSelectProps {\n value: string\n message: string\n valueMap?: Record<string, string>\n id?: string\n context?: string\n comment?: string\n tag?: keyof React.JSX.IntrinsicElements\n}\n\nexport interface FluentiCompiledRichTransProps extends FluentiCompiledTransProps {\n components: React.ReactElement[]\n}\n\nexport interface FluentiCompiledRichPluralProps extends FluentiCompiledPluralProps {\n components: React.ReactElement[]\n}\n\nexport interface FluentiCompiledRichSelectProps extends FluentiCompiledSelectProps {\n components: React.ReactElement[]\n}\n\nfunction renderCompiledTransResult(\n result: React.ReactNode,\n tag: keyof React.JSX.IntrinsicElements | undefined,\n render: ((translation: React.ReactNode) => React.ReactNode) | undefined,\n) {\n if (render) {\n return render(result)\n }\n return tag ? createElement(tag, null, result) : <>{result}</>\n}\n\n/** @internal Build-plugin fast path for plain-text `<Trans>` usage. */\nexport const __FluentiCompiledTrans = /* @__PURE__ */ memo(function FluentiCompiledTrans({\n message,\n id,\n context,\n comment,\n tag,\n render,\n}: FluentiCompiledTransProps) {\n const ctx = useContext(I18nContext)\n if (!ctx) {\n throw new Error('[fluenti] <Trans> must be used within an <I18nProvider>')\n }\n\n const translated = ctx.t(\n {\n id: id ?? hashMessage(message, context),\n message,\n ...(context !== undefined ? { context } : {}),\n ...(comment !== undefined ? { comment } : {}),\n },\n )\n\n return renderCompiledTransResult(translated, tag, render)\n})\n\n/** @internal Build-plugin fast path for rich-text `<Trans>` usage. */\nexport const __FluentiCompiledRichTrans = /* @__PURE__ */ memo(function FluentiCompiledRichTrans({\n message,\n components,\n id,\n context,\n comment,\n tag,\n render,\n}: FluentiCompiledRichTransProps) {\n const ctx = useContext(I18nContext)\n if (!ctx) {\n throw new Error('[fluenti] <Trans> must be used within an <I18nProvider>')\n }\n\n const descriptor = {\n id: id ?? hashMessage(message, context),\n message,\n ...(context !== undefined ? { context } : {}),\n ...(comment !== undefined ? { comment } : {}),\n }\n const translated = renderRichTranslation(\n descriptor,\n undefined,\n (desc, values) => ctx.t(desc, values),\n components,\n )\n\n return renderCompiledTransResult(translated, tag, render)\n})\n\n/** @internal Build-plugin fast path for plain-text `<Plural>` usage. */\nexport const __FluentiCompiledPlural = /* @__PURE__ */ memo(function FluentiCompiledPlural({\n value,\n message,\n id,\n context,\n comment,\n}: FluentiCompiledPluralProps) {\n const ctx = useContext(I18nContext)\n if (!ctx) {\n throw new Error('[fluenti] <Plural> must be used within an <I18nProvider>')\n }\n\n const translated = ctx.t(\n {\n id: resolveCompiledMessageId(id, message, context),\n message,\n ...(context !== undefined ? { context } : {}),\n ...(comment !== undefined ? { comment } : {}),\n },\n { count: value },\n )\n\n return <>{translated}</>\n})\n\n/** @internal Build-plugin fast path for plain-text `<Select>` usage. */\nexport const __FluentiCompiledSelect = /* @__PURE__ */ memo(function FluentiCompiledSelect({\n value,\n message,\n valueMap,\n id,\n context,\n comment,\n tag,\n}: FluentiCompiledSelectProps) {\n const ctx = useContext(I18nContext)\n if (!ctx) {\n throw new Error('[fluenti] <Select> must be used within an <I18nProvider>')\n }\n\n const translated = ctx.t(\n {\n id: resolveCompiledMessageId(id, message, context),\n message,\n ...(context !== undefined ? { context } : {}),\n ...(comment !== undefined ? { comment } : {}),\n },\n { value: valueMap?.[value] ?? 'other' },\n )\n\n return tag ? createElement(tag, null, translated) : <>{translated}</>\n})\n\n/** @internal Build-plugin fast path for rich-text `<Plural>` usage. */\nexport const __FluentiCompiledRichPlural = /* @__PURE__ */ memo(function FluentiCompiledRichPlural({\n value,\n message,\n components,\n id,\n context,\n comment,\n}: FluentiCompiledRichPluralProps) {\n const ctx = useContext(I18nContext)\n if (!ctx) {\n throw new Error('[fluenti] <Plural> must be used within an <I18nProvider>')\n }\n\n const descriptor = {\n id: resolveCompiledMessageId(id, message, context),\n message,\n ...(context !== undefined ? { context } : {}),\n ...(comment !== undefined ? { comment } : {}),\n }\n\n return <>{renderRichTranslation(descriptor, { count: value }, (desc, values) => ctx.t(desc, values), components)}</>\n})\n\n/** @internal Build-plugin fast path for rich-text `<Select>` usage. */\nexport const __FluentiCompiledRichSelect = /* @__PURE__ */ memo(function FluentiCompiledRichSelect({\n value,\n message,\n valueMap,\n components,\n id,\n context,\n comment,\n tag,\n}: FluentiCompiledRichSelectProps) {\n const ctx = useContext(I18nContext)\n if (!ctx) {\n throw new Error('[fluenti] <Select> must be used within an <I18nProvider>')\n }\n\n const descriptor = {\n id: resolveCompiledMessageId(id, message, context),\n message,\n ...(context !== undefined ? { context } : {}),\n ...(comment !== undefined ? { comment } : {}),\n }\n const translated = renderRichTranslation(\n descriptor,\n { value: valueMap?.[value] ?? 'other' },\n (desc, values) => ctx.t(desc, values),\n components,\n )\n\n return tag ? createElement(tag, null, translated) : <>{translated}</>\n})\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
let e=require(`react`),t=require(`@fluenti/core/runtime`);function n(r){let i=[],a=``;return e.Children.forEach(r,r=>{if(typeof r==`string`||typeof r==`number`)a+=String(r);else if((0,e.isValidElement)(r)){if(r.type===e.Fragment){let e=n(r.props.children);a+=(0,t.offsetIndices)(e.message,i.length),i.push(...e.components);return}let o=i.length,s=n(r.props.children);i.push(r),i.push(...s.components),s.message===``&&s.components.length===0?a+=`<${o}/>`:a+=`<${o}>${(0,t.offsetIndices)(s.message,o+1)}</${o}>`}}),{message:a,components:i}}function r(t,n){let i=/<(\d+)(?:\/>|(>)([\s\S]*?)<\/\1>)/g;if(!t.includes(`<`))return t;let a=[],o=0,s=0,c;if(i.lastIndex=0,c=i.exec(t),c===null)return t;for(;c!==null;){c.index>o&&a.push(t.slice(o,c.index));let l=Number(c[1]),u=c[2]===void 0,d=c[3]??``;if(!Number.isInteger(l)||l<0||l>=n.length){d&&a.push(d),o=i.lastIndex,c=i.exec(t);continue}let f=n[l];if(f){let t=`trans-${s++}`;if(u)a.push((0,e.cloneElement)(f,{key:t}));else{let i=r(d,n);a.push((0,e.cloneElement)(f,{key:t},i))}}else d&&a.push(d);o=i.lastIndex,c=i.exec(t)}return o<t.length&&a.push(t.slice(o)),a.length===1?a[0]:(0,e.createElement)(e.Fragment,null,...a)}function i(e){let t=n(e);return{message:t.message,components:t.components}}function a(e,n){let r=[],a={};for(let o of e){let e=n[o];if(e===void 0)continue;let s=i(e);a[o]=(0,t.offsetIndices)(s.message,r.length),r.push(...s.components)}for(let[o,s]of Object.entries(n)){if(e.includes(o)||s===void 0)continue;let n=i(s);a[o]=(0,t.offsetIndices)(n.message,r.length),r.push(...n.components)}return{messages:a,components:r}}function o(e,t,n,i){let a=n(e,t);return i.length>0?r(a,i):a}Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return o}});
|
|
2
|
+
//# sourceMappingURL=icu-rich-BlDjwT5Z.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icu-rich-BlDjwT5Z.cjs","names":[],"sources":["../src/components/trans-core.ts","../src/components/icu-rich.tsx"],"sourcesContent":["import {\n Children,\n isValidElement,\n cloneElement,\n createElement,\n Fragment,\n type ReactNode,\n type ReactElement,\n} from 'react'\nimport { hashMessage, offsetIndices } from '@fluenti/core/runtime'\n\nexport { hashMessage }\n\n/**\n * Extract a message string and component list from React children.\n *\n * Converts:\n * <Trans>Hello <b>{name}</b>, welcome!</Trans>\n * Into:\n * message: \"Hello <0>{name}</0>, welcome!\"\n * components: [<b>{name}</b>]\n *\n * @internal\n */\nexport function extractMessage(children: ReactNode): {\n message: string\n components: ReactElement[]\n} {\n const components: ReactElement[] = []\n let message = ''\n\n Children.forEach(children, (child) => {\n if (typeof child === 'string' || typeof child === 'number') {\n message += String(child)\n } else if (isValidElement(child)) {\n if (child.type === Fragment) {\n const inner = extractMessage((child.props as { children?: ReactNode }).children)\n message += offsetIndices(inner.message, components.length)\n components.push(...inner.components)\n return\n }\n\n const idx = components.length\n const inner = extractMessage((child.props as { children?: ReactNode }).children)\n components.push(child)\n components.push(...inner.components)\n if (inner.message === '' && inner.components.length === 0) {\n message += `<${idx}/>`\n } else {\n message += `<${idx}>${offsetIndices(inner.message, idx + 1)}</${idx}>`\n }\n }\n })\n\n return { message, components }\n}\n\n/**\n * Reconstruct a translated message string back into React elements.\n *\n * Parses \"<0>content</0>\" tags and replaces them with cloned components.\n *\n * @internal\n */\nexport function reconstruct(\n translated: string,\n components: ReactElement[],\n): ReactNode {\n const COMBINED_RE = /<(\\d+)(?:\\/>|(>)([\\s\\S]*?)<\\/\\1>)/g\n if (!translated.includes('<')) {\n return translated\n }\n\n const result: ReactNode[] = []\n let lastIndex = 0\n let keyCounter = 0\n let match: RegExpExecArray | null\n\n COMBINED_RE.lastIndex = 0\n match = COMBINED_RE.exec(translated)\n if (match === null) {\n return translated\n }\n\n while (match !== null) {\n if (match.index > lastIndex) {\n result.push(translated.slice(lastIndex, match.index))\n }\n\n const idx = Number(match[1])\n const isSelfClosing = match[2] === undefined\n const innerText = match[3] ?? ''\n\n if (!Number.isInteger(idx) || idx < 0 || idx >= components.length) {\n if (innerText) result.push(innerText)\n lastIndex = COMBINED_RE.lastIndex\n match = COMBINED_RE.exec(translated)\n continue\n }\n\n const component = components[idx]\n\n if (component) {\n // Use keyCounter (not idx) so duplicate component indices get unique keys\n const key = `trans-${keyCounter++}`\n if (isSelfClosing) {\n result.push(cloneElement(component, { key }))\n } else {\n const innerContent = reconstruct(innerText, components)\n result.push(cloneElement(component, { key }, innerContent))\n }\n } else {\n // Only push non-empty text to avoid inserting blank DOM nodes\n if (innerText) result.push(innerText)\n }\n\n lastIndex = COMBINED_RE.lastIndex\n match = COMBINED_RE.exec(translated)\n }\n\n if (lastIndex < translated.length) {\n result.push(translated.slice(lastIndex))\n }\n\n return result.length === 1 ? result[0]! : createElement(Fragment, null, ...result)\n}\n","import type { MessageDescriptor } from '@fluenti/core'\nimport {\n buildICUPluralMessage,\n buildICUSelectMessage,\n normalizeSelectForms,\n offsetIndices,\n} from '@fluenti/core/runtime'\nimport type { ReactElement, ReactNode } from 'react'\nimport { extractMessage, reconstruct } from './trans-core'\n\nexport { buildICUPluralMessage, buildICUSelectMessage, normalizeSelectForms }\n\nexport interface RichMessagePart {\n message: string\n components: ReactElement[]\n}\n\nexport function serializeRichNode(node: ReactNode): RichMessagePart {\n const extracted = extractMessage(node)\n return {\n message: extracted.message,\n components: extracted.components,\n }\n}\n\nexport function serializeRichForms<T extends string>(\n keys: readonly T[],\n forms: Partial<Record<T, ReactNode>> & Record<string, ReactNode | undefined>,\n): {\n messages: Partial<Record<T, string>> & Record<string, string>\n components: ReactElement[]\n} {\n const components: ReactElement[] = []\n const messages: Record<string, string> = {}\n\n for (const key of keys) {\n const value = forms[key]\n if (value === undefined) continue\n const extracted = serializeRichNode(value)\n messages[key] = offsetIndices(extracted.message, components.length)\n components.push(...extracted.components)\n }\n\n for (const [key, value] of Object.entries(forms)) {\n if (keys.includes(key as T) || value === undefined) continue\n const extracted = serializeRichNode(value)\n messages[key] = offsetIndices(extracted.message, components.length)\n components.push(...extracted.components)\n }\n\n return { messages: messages as Partial<Record<T, string>> & Record<string, string>, components }\n}\n\nexport function renderRichTranslation(\n descriptor: MessageDescriptor,\n values: Record<string, unknown> | undefined,\n translate: (descriptor: MessageDescriptor, values?: Record<string, unknown>) => string,\n components: ReactElement[],\n): ReactNode {\n const translated = translate(descriptor, values)\n return components.length > 0 ? reconstruct(translated, components) : translated\n}\n"],"mappings":"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"}
|