@fluenti/solid 0.6.1 → 0.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/dist/components-entry-Bdm3s2x9.cjs +1 -0
  2. package/dist/{components-entry-C-Df62O-.js → components-entry-Dfzg6Idb.js} +189 -111
  3. package/dist/components-entry.cjs +1 -1
  4. package/dist/components-entry.js +1 -1
  5. package/dist/index.cjs +1 -2
  6. package/dist/index.js +1 -3
  7. package/dist/server.cjs +1 -2
  8. package/dist/server.js +0 -2
  9. package/dist/solid/src/compile-time-t.d.ts +0 -1
  10. package/dist/solid/src/compiled.d.ts +0 -1
  11. package/dist/solid/src/components/DateTime.d.ts +0 -1
  12. package/dist/solid/src/components/NumberFormat.d.ts +0 -1
  13. package/dist/solid/src/components-entry.d.ts +0 -1
  14. package/dist/solid/src/context.d.ts +7 -2
  15. package/dist/solid/src/hooks/__useI18n.d.ts +0 -1
  16. package/dist/solid/src/index.d.ts +0 -1
  17. package/dist/solid/src/msg.d.ts +0 -1
  18. package/dist/solid/src/plain-runtime.d.ts +0 -1
  19. package/dist/solid/src/plural.d.ts +0 -1
  20. package/dist/solid/src/provider.d.ts +0 -1
  21. package/dist/solid/src/rich-dom.d.ts +0 -1
  22. package/dist/solid/src/select.d.ts +0 -1
  23. package/dist/solid/src/server.d.ts +0 -1
  24. package/dist/solid/src/solid-runtime.d.ts +0 -1
  25. package/dist/solid/src/trans.d.ts +0 -1
  26. package/dist/solid/src/types.d.ts +0 -1
  27. package/dist/solid/src/use-i18n.d.ts +2 -2
  28. package/dist/solid/src/vite-plugin.d.ts +0 -1
  29. package/dist/vite-plugin.cjs +1 -2
  30. package/dist/vite-plugin.js +0 -2
  31. package/package.json +3 -3
  32. package/src/context.ts +158 -1
  33. package/src/use-i18n.ts +8 -1
  34. package/dist/components-entry-5CGlUlc5.cjs +0 -2
  35. package/dist/components-entry-5CGlUlc5.cjs.map +0 -1
  36. package/dist/components-entry-C-Df62O-.js.map +0 -1
  37. package/dist/index.cjs.map +0 -1
  38. package/dist/index.js.map +0 -1
  39. package/dist/server.cjs.map +0 -1
  40. package/dist/server.js.map +0 -1
  41. package/dist/solid/src/compile-time-t.d.ts.map +0 -1
  42. package/dist/solid/src/compiled.d.ts.map +0 -1
  43. package/dist/solid/src/components/DateTime.d.ts.map +0 -1
  44. package/dist/solid/src/components/NumberFormat.d.ts.map +0 -1
  45. package/dist/solid/src/components-entry.d.ts.map +0 -1
  46. package/dist/solid/src/context.d.ts.map +0 -1
  47. package/dist/solid/src/hooks/__useI18n.d.ts.map +0 -1
  48. package/dist/solid/src/index.d.ts.map +0 -1
  49. package/dist/solid/src/msg.d.ts.map +0 -1
  50. package/dist/solid/src/plain-runtime.d.ts.map +0 -1
  51. package/dist/solid/src/plural.d.ts.map +0 -1
  52. package/dist/solid/src/provider.d.ts.map +0 -1
  53. package/dist/solid/src/rich-dom.d.ts.map +0 -1
  54. package/dist/solid/src/select.d.ts.map +0 -1
  55. package/dist/solid/src/server.d.ts.map +0 -1
  56. package/dist/solid/src/solid-runtime.d.ts.map +0 -1
  57. package/dist/solid/src/trans.d.ts.map +0 -1
  58. package/dist/solid/src/types.d.ts.map +0 -1
  59. package/dist/solid/src/use-i18n.d.ts.map +0 -1
  60. package/dist/solid/src/vite-plugin.d.ts.map +0 -1
  61. package/dist/vite-plugin.cjs.map +0 -1
  62. package/dist/vite-plugin.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"components-entry-C-Df62O-.js","names":["createContext","ParentComponent","createFluentiContext","FluentiConfig","FluentiContext","I18nCtx","I18nProvider","props","ctx","_$createComponent","Provider","value","children","JSX","isNodeLike","value","Node","resolveValue","length","offsetIndices","extractMessage","message","components","visit","node","resolved","undefined","Array","isArray","child","String","nodeType","TEXT_NODE","textContent","DOCUMENT_FRAGMENT_NODE","from","childNodes","idx","inner","push","Element","cloneNode","appendChild","parent","entry","document","createTextNode","reconstruct","translated","combinedRe","result","lastIndex","match","RegExpExecArray","exec","index","slice","Number","isSelfClosing","isInteger","template","clone","serializeRichForms","keys","T","forms","Partial","Record","messages","key","extracted","Object","entries","includes","Dynamic","children","resolveChildren","createMemo","Component","JSX","useI18n","extractMessage","extractDomMessage","reconstruct","reconstructDomMessage","RichComponent","Element","FluentiTransProps","id","context","comment","tag","message","components","Record","__message","__components","TextToken","type","value","TagToken","name","Token","MAX_TOKEN_DEPTH","parseTokens","input","depth","tokens","pos","length","openIdx","indexOf","push","slice","selfCloseMatch","match","openMatch","tagName","contentStart","innerEnd","findClosingTag","innerContent","closingTag","startPos","openTag","closeTag","nextOpen","nextClose","renderTokens","elements","map","token","Comp","undefined","_$createComponent","component","Trans","props","t","resolvedChildren","raw","msg","comps","translated","toArray","extracted","result","Array","isArray","Dynamic","Component","JSX","buildICUPluralMessage","PLURAL_CATEGORIES","PluralCategory","useI18n","reconstruct","serializeRichForms","buildPlainPluralMessage","resolveCompiledMessageId","resolvePropValue","FluentiPluralProps","value","id","context","comment","offset","zero","Element","one","two","few","many","other","tag","Plural","props","t","resolvedValues","Partial","Record","cat","resolved","undefined","plainMessage","translated","message","count","_$createComponent","component","children","messages","components","icuMessage","result","length","Component","JSX","Dynamic","buildICUSelectMessage","normalizeSelectForms","useI18n","reconstruct","serializeRichForms","buildPlainSelectMessage","resolveCompiledMessageId","FluentiSelectProps","value","id","context","comment","other","Element","options","Record","tag","key","SelectComp","props","t","content","RESERVED_KEYS","Set","forms","undefined","Object","fromEntries","entries","filter","has","startsWith","plain","message","valueMap","orderedKeys","keys","const","messages","components","normalized","map","translated","length","_$createComponent","component","children","_$memo","useI18n","DateTimeProps","value","Date","format","FluentiDateTimeProps","DateTime","props","d","_$memo","useI18n","NumberProps","value","format","FluentiNumberFormatProps","NumberFormat","props","n","_$memo","Component","JSX","Dynamic","hashMessage","useI18n","resolveCompiledMessageId","reconstruct","FluentiCompiledTransProps","message","components","Element","id","context","comment","tag","FluentiCompiledPluralProps","value","FluentiCompiledSelectProps","valueMap","Record","FluentiCompiledRichPluralProps","FluentiCompiledRichSelectProps","__FluentiCompiledTrans","props","t","translated","undefined","result","length","Node","_$createComponent","component","children","__FluentiCompiledPlural","count","__FluentiCompiledSelect","__FluentiCompiledRichPlural","__FluentiCompiledRichSelect"],"sources":["../src/context.ts","../src/provider.tsx","../src/use-i18n.ts","../src/rich-dom.tsx","../src/trans.tsx","../src/plain-runtime.ts","../src/plural.tsx","../src/select.tsx","../src/components/DateTime.tsx","../src/components/NumberFormat.tsx","../src/compiled.tsx"],"sourcesContent":["import { createSignal, type Accessor } from 'solid-js'\nimport { createFluentiCore } from '@fluenti/core'\nimport type { FluentiCoreConfig, FluentiCoreConfigFull, Locale, LocalizedString, Messages, CompiledMessage, MessageDescriptor, DateFormatOptions, NumberFormatOptions, DiagnosticsConfig, CustomFormatter } from '@fluenti/core'\n\n/** Chunk loader for lazy locale loading */\nexport type ChunkLoader = (\n locale: string,\n) => Promise<Record<string, CompiledMessage> | { default: Record<string, CompiledMessage> }>\n\ninterface SplitRuntimeModule {\n __switchLocale?: (locale: string) => Promise<void>\n __preloadLocale?: (locale: string) => Promise<void>\n}\n\nconst SPLIT_RUNTIME_KEY = Symbol.for('fluenti.runtime.solid.v1')\n\nfunction getSplitRuntimeModule(): SplitRuntimeModule | null {\n const runtime = (globalThis as Record<PropertyKey, unknown>)[SPLIT_RUNTIME_KEY]\n return typeof runtime === 'object' && runtime !== null\n ? runtime as SplitRuntimeModule\n : null\n}\n\nfunction resolveChunkMessages(\n loaded: Record<string, CompiledMessage> | { default: Record<string, CompiledMessage> },\n): Record<string, CompiledMessage> {\n return typeof loaded === 'object' && loaded !== null && 'default' in loaded\n ? (loaded as { default: Record<string, CompiledMessage> }).default\n : loaded\n}\n\n/** @internal Map locale → default currency code */\nconst LOCALE_CURRENCY_MAP: Record<string, string> = {\n 'en': 'USD', 'en-US': 'USD', 'en-GB': 'GBP', 'en-AU': 'AUD', 'en-CA': 'CAD',\n 'zh-CN': 'CNY', 'zh-TW': 'TWD', 'zh-HK': 'HKD',\n 'ja': 'JPY', 'ja-JP': 'JPY',\n 'ko': 'KRW', 'ko-KR': 'KRW',\n 'de': 'EUR', 'de-DE': 'EUR', 'de-AT': 'EUR',\n 'fr': 'EUR', 'fr-FR': 'EUR', 'fr-CA': 'CAD',\n 'es': 'EUR', 'es-ES': 'EUR', 'es-MX': 'MXN',\n 'pt': 'EUR', 'pt-BR': 'BRL', 'pt-PT': 'EUR',\n 'it': 'EUR', 'ru': 'RUB', 'ar': 'SAR', 'hi': 'INR',\n}\n\n/** @internal Built-in date format styles (merged under user-provided dateFormats) */\nconst DEFAULT_DATE_FORMATS: Record<string, Intl.DateTimeFormatOptions> = {\n short: { year: 'numeric', month: 'numeric', day: 'numeric' },\n long: { year: 'numeric', month: 'long', day: 'numeric', weekday: 'long' },\n time: { hour: 'numeric', minute: 'numeric' },\n datetime: { year: 'numeric', month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric' },\n}\n\n/** @internal Built-in number format styles (merged under user-provided numberFormats) */\nconst DEFAULT_NUMBER_FORMATS: Record<string, Intl.NumberFormatOptions | ((locale: Locale) => Intl.NumberFormatOptions)> = {\n currency: (locale: string) => ({\n style: 'currency',\n currency: LOCALE_CURRENCY_MAP[locale] ?? LOCALE_CURRENCY_MAP[locale.split('-')[0]!] ?? 'USD',\n }),\n percent: { style: 'percent' },\n decimal: { minimumFractionDigits: 2, maximumFractionDigits: 2 },\n}\n\n/** Extended config with lazy locale loading support */\nexport interface FluentiConfig extends FluentiCoreConfig {\n /** Async chunk loader for lazy locale loading */\n chunkLoader?: ChunkLoader\n /** Enable lazy locale loading through chunkLoader */\n lazyLocaleLoading?: boolean\n /** Locale-specific fallback chains */\n fallbackChain?: Record<string, Locale[]>\n /** Named date format styles */\n dateFormats?: DateFormatOptions\n /** Named number format styles */\n numberFormats?: NumberFormatOptions\n /** Runtime diagnostics configuration */\n diagnostics?: DiagnosticsConfig\n /**\n * Custom message interpolation function.\n *\n * By default, the runtime uses a lightweight `{key}` replacer.\n * Pass the full `interpolate` from `@fluenti/core/runtime` for\n * runtime ICU MessageFormat support (plurals, selects, nested arguments).\n */\n interpolate?: (\n message: string,\n values: Record<string, unknown> | undefined,\n locale: string,\n formatters?: Record<string, CustomFormatter>,\n ) => string\n}\n\n/** Reactive i18n context holding locale signal and translation utilities */\nexport interface FluentiContext {\n /** Reactive accessor for the current locale */\n locale(): Locale\n /** Set the active locale (async when lazy locale loading is enabled) */\n setLocale(locale: Locale): Promise<void>\n /** Translate a message by id with optional interpolation values */\n t(id: string | MessageDescriptor, values?: Record<string, unknown>): LocalizedString\n /** Tagged template form: t`Hello ${name}` */\n t(strings: TemplateStringsArray, ...exprs: unknown[]): LocalizedString\n /** Merge additional messages into a locale catalog at runtime */\n loadMessages(locale: Locale, messages: Messages): void\n /** Return all locale codes that have loaded messages */\n getLocales(): Locale[]\n /** Format a date value for the current locale */\n d(value: Date | number, style?: string): LocalizedString\n /** Format a number value for the current locale */\n n(value: number, style?: string): LocalizedString\n /** Format an ICU message string directly (no catalog lookup) */\n format(message: string, values?: Record<string, unknown>): LocalizedString\n /** Whether a locale chunk is currently being loaded */\n isLoading: Accessor<boolean>\n /** Set of locales whose messages have been loaded */\n loadedLocales: Accessor<Set<string>>\n /** Preload a locale in the background without switching to it */\n preloadLocale(locale: string): void\n /** Check if a translation key exists for the given or current locale */\n te(key: string, loc?: string): boolean\n /** Get the raw compiled message for a key without interpolation */\n tm(key: string, loc?: string): CompiledMessage | undefined\n}\n\n/**\n * Create a reactive i18n context backed by Solid signals.\n *\n * The returned `t()` reads the internal `locale()` signal, so any\n * Solid computation that calls `t()` will re-run when the locale changes.\n *\n * @example\n * ```tsx\n * import { createFluenti } from '@fluenti/solid'\n * import messages from './locales/compiled/en.js'\n *\n * const ctx = createFluenti({\n * locale: 'en',\n * messages: { en: messages },\n * })\n *\n * // Use t`` tagged template (preferred)\n * const greeting = ctx.t`Hello, {name}!`\n * ```\n */\nexport function createFluentiContext(config: FluentiCoreConfig | FluentiConfig): FluentiContext {\n const [locale, setLocaleSignal] = createSignal<Locale>(config.locale)\n const [isLoading, setIsLoading] = createSignal(false)\n const loadedLocalesSet = new Set<string>([config.locale])\n const [loadedLocales, setLoadedLocales] = createSignal(new Set(loadedLocalesSet))\n const messages: Record<string, Messages> = { ...config.messages }\n const i18nConfig = config as FluentiConfig\n const lazyLocaleLoading = i18nConfig.lazyLocaleLoading\n ?? (config as FluentiConfig & { splitting?: boolean }).splitting\n ?? false\n\n // Create a core instance that handles all translation, lookup, fallback, and formatting logic.\n // Merge built-in date/number format styles under user-provided overrides.\n // Build config incrementally to satisfy exactOptionalPropertyTypes —\n // optional properties must not receive `undefined` as a value.\n const coreConfig: FluentiCoreConfigFull = {\n locale: config.locale,\n messages: config.messages ?? {},\n dateFormats: { ...DEFAULT_DATE_FORMATS, ...i18nConfig.dateFormats },\n numberFormats: { ...DEFAULT_NUMBER_FORMATS, ...i18nConfig.numberFormats },\n }\n if (config.fallbackLocale !== undefined) coreConfig.fallbackLocale = config.fallbackLocale\n if (i18nConfig.fallbackChain !== undefined) coreConfig.fallbackChain = i18nConfig.fallbackChain\n if (config.missing !== undefined) coreConfig.missing = config.missing\n if (i18nConfig.diagnostics !== undefined) coreConfig.diagnostics = i18nConfig.diagnostics as FluentiCoreConfigFull['diagnostics']\n if (i18nConfig.interpolate !== undefined) coreConfig.interpolate = i18nConfig.interpolate\n coreConfig.devWarnings = coreConfig.devWarnings ?? (typeof process !== 'undefined' && process.env?.['NODE_ENV'] === 'development')\n const i18n = createFluentiCore(coreConfig)\n\n function t(strings: TemplateStringsArray, ...exprs: unknown[]): LocalizedString\n function t(id: string | MessageDescriptor, values?: Record<string, unknown>): LocalizedString\n function t(idOrStrings: string | MessageDescriptor | TemplateStringsArray, ...rest: unknown[]): LocalizedString {\n const current = locale() // READ SIGNAL → reactive dependency for Solid re-renders\n if (i18n.locale !== current) i18n.locale = current\n // Dispatch to the correct overload based on input type\n if (Array.isArray(idOrStrings) && 'raw' in idOrStrings) {\n return i18n.t(idOrStrings as TemplateStringsArray, ...rest) as LocalizedString\n }\n return i18n.t(idOrStrings as string | MessageDescriptor, rest[0] as Record<string, unknown> | undefined) as LocalizedString\n }\n\n const loadMessages = (loc: Locale, msgs: Messages): void => {\n i18n.loadMessages(loc, msgs)\n // Keep local messages in sync for te/tm which check the local object\n // Intentional mutation: messages record is locally scoped to this context closure\n messages[loc] = { ...messages[loc], ...msgs }\n loadedLocalesSet.add(loc)\n setLoadedLocales(new Set(loadedLocalesSet))\n }\n\n let _localeRequestId = 0\n\n const setLocale = async (newLocale: Locale): Promise<void> => {\n if (!lazyLocaleLoading || !i18nConfig.chunkLoader) {\n setLocaleSignal(newLocale)\n return\n }\n\n const splitRuntime = getSplitRuntimeModule()\n\n if (loadedLocalesSet.has(newLocale)) {\n try {\n if (splitRuntime?.__switchLocale) {\n await splitRuntime.__switchLocale(newLocale)\n }\n } catch (e) {\n console.warn(`[fluenti] split runtime switch failed for locale \"${newLocale}\"`, e)\n }\n setLocaleSignal(newLocale)\n return\n }\n\n // Race-condition protection: track request ID\n const thisRequest = ++_localeRequestId\n setIsLoading(true)\n try {\n const loaded = resolveChunkMessages(await i18nConfig.chunkLoader(newLocale))\n // Always store loaded messages — they may be needed if locale is switched back\n i18n.loadMessages(newLocale, loaded)\n // Intentional mutation: messages record is locally scoped to this context closure\n messages[newLocale] = { ...messages[newLocale], ...loaded }\n loadedLocalesSet.add(newLocale)\n setLoadedLocales(new Set(loadedLocalesSet))\n // Stale request — a newer setLocale call superseded this one; don't switch locale\n if (thisRequest !== _localeRequestId) return\n try {\n if (splitRuntime?.__switchLocale) {\n await splitRuntime.__switchLocale(newLocale)\n }\n } catch (e) {\n console.warn(`[fluenti] split runtime switch failed for locale \"${newLocale}\"`, e)\n }\n // Re-check after async __switchLocale — a newer setLocale() may have superseded this one\n if (thisRequest !== _localeRequestId) return\n setLocaleSignal(newLocale)\n } finally {\n if (thisRequest === _localeRequestId) {\n setIsLoading(false)\n }\n }\n }\n\n const _preloadInFlight = new Set<string>()\n\n const preloadLocale = (loc: string): void => {\n if (!lazyLocaleLoading || loadedLocalesSet.has(loc) || !i18nConfig.chunkLoader || _preloadInFlight.has(loc)) return\n _preloadInFlight.add(loc)\n const splitRuntime = getSplitRuntimeModule()\n i18nConfig.chunkLoader(loc).then(async (loaded) => {\n const resolved = resolveChunkMessages(loaded)\n i18n.loadMessages(loc, resolved)\n // Intentional mutation: messages record is locally scoped to this context closure\n messages[loc] = { ...messages[loc], ...resolved }\n loadedLocalesSet.add(loc)\n setLoadedLocales(new Set(loadedLocalesSet))\n if (splitRuntime?.__preloadLocale) {\n await splitRuntime.__preloadLocale(loc)\n }\n }).catch((e: unknown) => {\n console.warn('[fluenti] preload failed:', loc, e)\n }).finally(() => {\n _preloadInFlight.delete(loc)\n })\n }\n\n const getLocales = (): Locale[] => i18n.getLocales()\n\n const d = (value: Date | number, style?: string): LocalizedString => {\n const current = locale() // READ SIGNAL → reactive dependency\n if (i18n.locale !== current) i18n.locale = current\n return i18n.d(value, style) as LocalizedString\n }\n\n const n = (value: number, style?: string): LocalizedString => {\n const current = locale() // READ SIGNAL → reactive dependency\n if (i18n.locale !== current) i18n.locale = current\n return i18n.n(value, style) as LocalizedString\n }\n\n const format = (message: string, values?: Record<string, unknown>): LocalizedString => {\n const current = locale() // READ SIGNAL → reactive dependency\n if (i18n.locale !== current) i18n.locale = current\n return i18n.format(message, values) as LocalizedString\n }\n\n const te = (key: string, loc?: string): boolean => {\n const msgs = messages[loc ?? locale()]\n return msgs !== undefined && key in msgs\n }\n\n const tm = (key: string, loc?: string): CompiledMessage | undefined => {\n const msgs = messages[loc ?? locale()]\n return msgs ? msgs[key] : undefined\n }\n\n return { locale, setLocale, t, loadMessages, getLocales, d, n, format, isLoading, loadedLocales, preloadLocale, te, tm }\n}\n\nexport const createFluenti = createFluentiContext\n","import { createContext } from 'solid-js'\nimport type { ParentComponent } from 'solid-js'\nimport { createFluentiContext } from './context'\nimport type { FluentiConfig, FluentiContext } from './context'\n\n/** Solid context object for i18n — used internally by useI18n() */\nexport const I18nCtx = createContext<FluentiContext>()\n\n/**\n * Provides the Fluenti i18n context to the Solid component tree.\n *\n * @example\n * ```tsx\n * import { I18nProvider, useI18n } from '@fluenti/solid'\n * import messages from './locales/compiled/en.js'\n *\n * function App() {\n * return (\n * <I18nProvider locale=\"en\" messages={{ en: messages }}>\n * <Content />\n * </I18nProvider>\n * )\n * }\n *\n * function Content() {\n * const { t } = useI18n()\n * return <h1>{t`Welcome to our app`}</h1>\n * }\n * ```\n */\nexport const I18nProvider: ParentComponent<FluentiConfig> = (props) => {\n const ctx = createFluentiContext(props)\n return <I18nCtx.Provider value={ctx}>{props.children}</I18nCtx.Provider>\n}\n","import { useContext } from 'solid-js'\nimport { I18nCtx } from './provider'\nimport type { FluentiContext } from './context'\n\n/**\n * Access the i18n context from the nearest `<I18nProvider>`.\n *\n * Throws if no provider is found in the component tree.\n */\nexport function useI18n(): FluentiContext {\n const ctx = useContext(I18nCtx)\n if (ctx) {\n return ctx\n }\n\n throw new Error(\n 'useI18n() must be used inside an <I18nProvider>.',\n )\n}\n\n/** Shorthand hook that returns only the current locale accessor. */\nexport function useLocale(): () => string {\n return useI18n().locale\n}\n","import type { JSX } from 'solid-js'\n\nfunction isNodeLike(value: unknown): value is Node {\n return typeof Node !== 'undefined' && value instanceof Node\n}\n\nfunction resolveValue(value: unknown): unknown {\n if (typeof value === 'function' && !(value as { length?: number }).length) {\n return (value as () => unknown)()\n }\n return value\n}\n\nimport { offsetIndices } from '@fluenti/core/runtime'\n\nexport function extractMessage(value: unknown): {\n message: string\n components: Node[]\n} {\n const components: Node[] = []\n let message = ''\n\n function visit(node: unknown): void {\n const resolved = resolveValue(node)\n if (resolved === null || resolved === undefined || typeof resolved === 'boolean') return\n if (Array.isArray(resolved)) {\n for (const child of resolved) visit(child)\n return\n }\n if (typeof resolved === 'string' || typeof resolved === 'number') {\n message += String(resolved)\n return\n }\n if (!isNodeLike(resolved)) return\n if (resolved.nodeType === Node.TEXT_NODE) {\n message += resolved.textContent ?? ''\n return\n }\n if (resolved.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n visit(Array.from(resolved.childNodes))\n return\n }\n\n const idx = components.length\n const inner = extractMessage(Array.from(resolved.childNodes))\n components.push((resolved as Element).cloneNode(false))\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 visit(value)\n return { message, components }\n}\n\nfunction appendChild(parent: Node, child: unknown): void {\n const resolved = resolveValue(child)\n if (resolved === null || resolved === undefined || typeof resolved === 'boolean') return\n if (Array.isArray(resolved)) {\n for (const entry of resolved) appendChild(parent, entry)\n return\n }\n if (typeof resolved === 'string' || typeof resolved === 'number') {\n parent.appendChild(document.createTextNode(String(resolved)))\n return\n }\n if (isNodeLike(resolved)) {\n parent.appendChild(resolved)\n }\n}\n\nexport function reconstruct(\n translated: string,\n components: Node[],\n): JSX.Element {\n const combinedRe = /<(\\d+)(?:\\/>|(>)([\\s\\S]*?)<\\/\\1>)/g\n const result: unknown[] = []\n let lastIndex = 0\n let match: RegExpExecArray | null\n\n combinedRe.lastIndex = 0\n match = combinedRe.exec(translated)\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\n if (!Number.isInteger(idx) || idx < 0 || idx >= components.length) {\n if (!isSelfClosing) {\n result.push(match[3] ?? '')\n }\n lastIndex = combinedRe.lastIndex\n match = combinedRe.exec(translated)\n continue\n }\n\n const template = components[idx]\n\n if (isSelfClosing) {\n if (template) {\n result.push(template.cloneNode(false))\n }\n } else {\n const inner = reconstruct(match[2] !== undefined ? match[3]! : '', components)\n if (template) {\n const clone = template.cloneNode(false)\n appendChild(clone, inner)\n result.push(clone)\n } else {\n result.push(match[3] ?? '')\n }\n }\n\n lastIndex = combinedRe.lastIndex\n match = combinedRe.exec(translated)\n }\n\n if (lastIndex < translated.length) {\n result.push(translated.slice(lastIndex))\n }\n\n return (result.length <= 1 ? result[0] ?? '' : result) as JSX.Element\n}\n\nexport function serializeRichForms<T extends string>(\n keys: readonly T[],\n forms: Partial<Record<T, unknown>> & Record<string, unknown>,\n): {\n messages: Record<string, string>\n components: Node[]\n} {\n const messages: Record<string, string> = {}\n const components: Node[] = []\n\n for (const key of keys) {\n const value = forms[key]\n if (value === undefined) continue\n const extracted = extractMessage(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 = extractMessage(value)\n messages[key] = offsetIndices(extracted.message, components.length)\n components.push(...extracted.components)\n }\n\n return { messages, components }\n}\n","import { Dynamic } from 'solid-js/web'\nimport { children as resolveChildren, createMemo } from 'solid-js'\nimport type { Component, JSX } from 'solid-js'\nimport { useI18n } from './use-i18n'\nimport { extractMessage as extractDomMessage, reconstruct as reconstructDomMessage } from './rich-dom'\n\n/** A Solid component that accepts children */\nexport type RichComponent = Component<{ children?: JSX.Element }>\n\n/** Props for the `<Trans>` component */\nexport interface FluentiTransProps {\n /** Override auto-generated hash 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 /** Wrapper element tag name. Defaults to no wrapper (Fragment). */\n tag?: string\n /** Children — the content to translate (legacy API) */\n children?: JSX.Element\n /** Translated message string with XML-like tags (e.g. `<bold>text</bold>`) */\n message?: string\n /** Map of tag names to Solid components */\n components?: Record<string, RichComponent>\n /** @internal Pre-computed message from build plugin */\n __message?: string\n /** @internal Pre-computed component map from build plugin */\n __components?: Record<string, RichComponent>\n}\n\n/**\n * A token from parsing the message string.\n * Either a plain text segment or a tag with inner content.\n */\ninterface TextToken {\n readonly type: 'text'\n readonly value: string\n}\n\ninterface TagToken {\n readonly type: 'tag'\n readonly name: string\n readonly children: readonly Token[]\n}\n\ntype Token = TextToken | TagToken\n\nconst MAX_TOKEN_DEPTH = 100\n\n/**\n * Parse a message string containing XML-like tags into a token tree.\n *\n * Supports:\n * - Named tags: `<bold>content</bold>`\n * - Self-closing tags: `<br/>`\n * - Nested tags: `<bold>hello <italic>world</italic></bold>`\n */\nfunction parseTokens(input: string, depth: number = 0): readonly Token[] {\n if (depth > MAX_TOKEN_DEPTH) {\n // Bail out as plain text to prevent stack overflow\n return [{ type: 'text', value: input }]\n }\n const tokens: Token[] = []\n let pos = 0\n\n while (pos < input.length) {\n const openIdx = input.indexOf('<', pos)\n\n if (openIdx === -1) {\n // No more tags — rest is plain text\n tokens.push({ type: 'text', value: input.slice(pos) })\n break\n }\n\n // Push any text before this tag\n if (openIdx > pos) {\n tokens.push({ type: 'text', value: input.slice(pos, openIdx) })\n }\n\n // Check for self-closing tag: <tagName/>\n const selfCloseMatch = input.slice(openIdx).match(/^<(\\w+)\\s*\\/>/)\n if (selfCloseMatch) {\n tokens.push({ type: 'tag', name: selfCloseMatch[1]!, children: [] })\n pos = openIdx + selfCloseMatch[0].length\n continue\n }\n\n // Check for opening tag: <tagName>\n const openMatch = input.slice(openIdx).match(/^<(\\w+)>/)\n if (!openMatch) {\n // Not a valid tag — treat '<' as text\n tokens.push({ type: 'text', value: '<' })\n pos = openIdx + 1\n continue\n }\n\n const tagName = openMatch[1]!\n const contentStart = openIdx + openMatch[0].length\n\n // Find the matching closing tag, respecting nesting\n const innerEnd = findClosingTag(input, tagName, contentStart)\n if (innerEnd === -1) {\n // No closing tag found — treat as plain text\n tokens.push({ type: 'text', value: input.slice(openIdx, contentStart) })\n pos = contentStart\n continue\n }\n\n const innerContent = input.slice(contentStart, innerEnd)\n const closingTag = `</${tagName}>`\n tokens.push({\n type: 'tag',\n name: tagName,\n children: parseTokens(innerContent, depth + 1),\n })\n pos = innerEnd + closingTag.length\n }\n\n return tokens\n}\n\n/**\n * Find the position of the matching closing tag, accounting for nesting\n * of the same tag name.\n *\n * Returns the index of the start of the closing tag, or -1 if not found.\n */\nfunction findClosingTag(input: string, tagName: string, startPos: number): number {\n const openTag = `<${tagName}>`\n const closeTag = `</${tagName}>`\n let depth = 1\n let pos = startPos\n\n while (pos < input.length && depth > 0) {\n const nextOpen = input.indexOf(openTag, pos)\n const nextClose = input.indexOf(closeTag, pos)\n\n if (nextClose === -1) return -1\n\n if (nextOpen !== -1 && nextOpen < nextClose) {\n depth++\n pos = nextOpen + openTag.length\n } else {\n depth--\n if (depth === 0) return nextClose\n pos = nextClose + closeTag.length\n }\n }\n\n return -1\n}\n\n/**\n * Render a token tree into Solid JSX elements using the components map.\n */\nfunction renderTokens(\n tokens: readonly Token[],\n components: Record<string, RichComponent>,\n): JSX.Element {\n const elements = tokens.map((token): JSX.Element => {\n if (token.type === 'text') {\n return token.value as unknown as JSX.Element\n }\n\n const Comp = components[token.name]\n if (!Comp) {\n // Unknown component — render inner content as plain text\n return renderTokens(token.children, components)\n }\n\n const innerContent = token.children.length > 0\n ? renderTokens(token.children, components)\n : undefined\n\n return (<Dynamic component={Comp}>{innerContent}</Dynamic>) as JSX.Element\n })\n\n if (elements.length === 1) return elements[0]!\n return (<>{elements}</>) as JSX.Element\n}\n\n/**\n * Render translated content with inline components.\n *\n * Supports two APIs:\n *\n * 1. **message + components** (recommended for rich text):\n * ```tsx\n * <Trans\n * message={t`Welcome to <bold>Fluenti</bold>!`}\n * components={{ bold: (props) => <strong>{props.children}</strong> }}\n * />\n * ```\n *\n * 2. **children** (legacy / simple passthrough):\n * ```tsx\n * <Trans>Click <a href=\"/next\">here</a> to continue</Trans>\n * ```\n */\nexport const Trans: Component<FluentiTransProps> = (props) => {\n const { t } = useI18n()\n const resolvedChildren = resolveChildren(() => props.children)\n // message + components API (including build-time __message/__components)\n // Note: the vite-plugin tagged-template transform wraps Solid expressions in\n // createMemo(), so props.message may be a memo accessor (function) instead of\n // a string. We unwrap it here to handle both cases.\n const message = createMemo(() => {\n const raw = props.__message ?? props.message\n return typeof raw === 'function' ? (raw as () => string)() : raw\n })\n const components = createMemo(() => props.__components ?? props.components)\n\n return (() => {\n const msg = message()\n const comps = components()\n\n if (msg !== undefined && comps) {\n const translated = t({\n ...(props.id !== undefined ? { id: props.id } : {}),\n message: msg,\n ...(props.context !== undefined ? { context: props.context } : {}),\n ...(props.comment !== undefined ? { comment: props.comment } : {}),\n })\n const tokens = parseTokens(translated)\n return renderTokens(tokens, comps)\n }\n\n // Fallback: children-only API with runtime extraction/reconstruction\n const children = resolvedChildren.toArray()\n if (children.length === 0) return null\n const extracted = extractDomMessage(children)\n const translated = t({\n ...(props.id !== undefined ? { id: props.id } : {}),\n message: extracted.message,\n ...(props.context !== undefined ? { context: props.context } : {}),\n ...(props.comment !== undefined ? { comment: props.comment } : {}),\n })\n const result = extracted.components.length > 0\n ? reconstructDomMessage(translated, extracted.components)\n : translated\n\n if (Array.isArray(result) && result.length > 1) {\n if (props.tag) {\n return (<Dynamic component={props.tag}>{result}</Dynamic>) as JSX.Element\n }\n return (<>{result}</>) as JSX.Element\n }\n\n return result as JSX.Element\n }) as unknown as JSX.Element\n}\n","import {\n PLURAL_CATEGORIES,\n buildICUPluralMessage,\n buildICUSelectMessage,\n hashMessage,\n normalizeSelectForms,\n type PluralCategory,\n} from '@fluenti/core/runtime'\n\nexport function resolvePropValue(value: unknown): unknown {\n if (typeof value === 'function' && !(value as { length?: number }).length) {\n return (value as () => unknown)()\n }\n return value\n}\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 isPlainTextValue(value: unknown): value is string | number {\n return typeof value === 'string' || typeof value === 'number'\n}\n\nexport function buildPlainPluralMessage(\n forms: Partial<Record<PluralCategory, unknown>>,\n offset?: number,\n): string | undefined {\n const plainForms: Partial<Record<PluralCategory, string>> = {}\n\n for (const category of PLURAL_CATEGORIES) {\n const resolved = resolvePropValue(forms[category])\n if (resolved === undefined) continue\n if (!isPlainTextValue(resolved)) return undefined\n plainForms[category] = String(resolved)\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, unknown>,\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 const resolved = resolvePropValue(value)\n if (resolved === undefined) continue\n if (!isPlainTextValue(resolved)) return undefined\n plainForms[key] = String(resolved)\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 { Dynamic } from 'solid-js/web'\nimport type { Component, JSX } from 'solid-js'\nimport { buildICUPluralMessage, PLURAL_CATEGORIES, type PluralCategory } from '@fluenti/core/runtime'\nimport { useI18n } from './use-i18n'\nimport { reconstruct, serializeRichForms } from './rich-dom'\nimport { buildPlainPluralMessage, resolveCompiledMessageId, resolvePropValue } from './plain-runtime'\n\n/** Props for the `<Plural>` component */\nexport interface FluentiPluralProps {\n /** The numeric value to pluralise */\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 /** Offset from value before selecting form */\n offset?: number\n /** Message for the \"zero\" plural category */\n zero?: string | JSX.Element\n /** Message for the \"one\" plural category */\n one?: string | JSX.Element\n /** Message for the \"two\" plural category */\n two?: string | JSX.Element\n /** Message for the \"few\" plural category */\n few?: string | JSX.Element\n /** Message for the \"many\" plural category */\n many?: string | JSX.Element\n /** Fallback message when no category-specific prop matches */\n other: string | JSX.Element\n /** Wrapper element tag name. Defaults to no wrapper (Fragment). */\n tag?: string\n}\n\n/**\n * `<Plural>` component — shorthand for ICU plural patterns.\n *\n * Plural form props (`zero`, `one`, `two`, `few`, `many`, `other`) are treated\n * as source-language messages. The component builds an ICU plural message,\n * looks it up via `t()` in the catalog, and interpolates the translated result.\n *\n * When no catalog translation exists, the component falls back to interpolating\n * the source-language ICU message directly via core's `interpolate`.\n *\n * Rich text is supported via JSX element props:\n * ```tsx\n * <Plural\n * value={count()}\n * zero={<>No <strong>items</strong> left</>}\n * one={<><em>1</em> item remaining</>}\n * other={<><strong>{count()}</strong> items remaining</>}\n * />\n * ```\n *\n * String props still work (backward compatible):\n * ```tsx\n * <Plural value={count()} zero=\"No items\" one=\"# item\" other=\"# items\" />\n * ```\n *\n * @example\n * ```tsx\n * import { Plural } from '@fluenti/solid/components'\n *\n * function ItemCount(props: { count: number }) {\n * return <Plural value={props.count} one=\"# item\" other=\"# items\" />\n * }\n * ```\n */\nexport const Plural: Component<FluentiPluralProps> = (props) => {\n const { t } = useI18n()\n\n return (() => {\n const resolvedValues: Partial<Record<PluralCategory, string | JSX.Element>> = {}\n for (const cat of PLURAL_CATEGORIES) {\n const resolved = resolvePropValue(props[cat]) as string | JSX.Element | undefined\n if (resolved !== undefined) {\n resolvedValues[cat] = resolved\n }\n }\n const plainMessage = buildPlainPluralMessage(resolvedValues, props.offset)\n if (plainMessage !== undefined) {\n const translated = t(\n {\n id: resolveCompiledMessageId(props.id, plainMessage, props.context),\n message: plainMessage,\n ...(props.context !== undefined ? { context: props.context } : {}),\n ...(props.comment !== undefined ? { comment: props.comment } : {}),\n },\n { count: props.value },\n )\n\n if (props.tag) {\n return (<Dynamic component={props.tag}>{translated}</Dynamic>) as JSX.Element\n }\n return (<>{translated}</>) as JSX.Element\n }\n\n const { messages, components } = serializeRichForms(PLURAL_CATEGORIES, resolvedValues)\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 props.offset,\n )\n\n const translated = t(\n {\n id: resolveCompiledMessageId(props.id, icuMessage, props.context),\n message: icuMessage,\n ...(props.context !== undefined ? { context: props.context } : {}),\n ...(props.comment !== undefined ? { comment: props.comment } : {}),\n },\n { count: props.value },\n )\n\n const result = components.length > 0 ? reconstruct(translated, components) : translated\n if (props.tag) {\n return (<Dynamic component={props.tag}>{result}</Dynamic>) as JSX.Element\n }\n return (<>{result}</>) as JSX.Element\n }) as unknown as JSX.Element\n}\n","import type { Component, JSX } from 'solid-js'\nimport { Dynamic } from 'solid-js/web'\nimport { buildICUSelectMessage, normalizeSelectForms } from '@fluenti/core/runtime'\nimport { useI18n } from './use-i18n'\nimport { reconstruct, serializeRichForms } from './rich-dom'\nimport { buildPlainSelectMessage, resolveCompiledMessageId } from './plain-runtime'\n\n/** Props for the `<Select>` component */\nexport interface FluentiSelectProps {\n /** The value to match against prop keys */\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 /** Fallback message when no key matches */\n other: string | JSX.Element\n /**\n * Named options map. Keys are match values, values are display strings or JSX.\n * Takes precedence over dynamic attrs when both are provided.\n *\n * @example `{ male: 'He', female: 'She' }`\n */\n options?: Record<string, string | JSX.Element>\n /** Wrapper element tag name. Defaults to no wrapper (Fragment). */\n tag?: string\n /** Additional key/message pairs for matching (attrs fallback) */\n [key: string]: unknown\n}\n\n/**\n * Render a message selected by matching `value` against prop keys.\n *\n * Options can be provided via the type-safe `options` prop (recommended)\n * or as direct attrs (convenience). When both are present, `options` takes\n * precedence.\n *\n * Rich text is supported via JSX element values in the `options` prop or\n * as direct JSX element props:\n * ```tsx\n * <Select\n * value={gender()}\n * options={{\n * male: <><strong>He</strong> liked this</>,\n * female: <><strong>She</strong> liked this</>,\n * }}\n * other={<><em>They</em> liked this</>}\n * />\n * ```\n *\n * Falls back to the `other` prop when no key matches.\n *\n * @example\n * ```tsx\n * import { Select } from '@fluenti/solid/components'\n *\n * function Greeting(props: { gender: string }) {\n * return (\n * <Select value={props.gender}\n * male=\"He liked your post\"\n * female=\"She liked your post\"\n * other=\"They liked your post\"\n * />\n * )\n * }\n * ```\n */\nexport const SelectComp: Component<FluentiSelectProps> = (props) => {\n const { t } = useI18n()\n\n const content = () => {\n const RESERVED_KEYS = new Set(['value', 'id', 'context', 'comment', 'options', 'other', 'tag', 'children', 'ref', 'class', 'className', 'style', 'classList', 'on', 'oncapture', 'use', 'prop'])\n const forms: Record<string, unknown> = props.options !== undefined\n ? { ...props.options, other: props.other }\n : {\n ...Object.fromEntries(\n Object.entries(props).filter(([key]) =>\n !RESERVED_KEYS.has(key)\n && !key.startsWith('data-')\n && !key.startsWith('aria-')\n && !key.startsWith('on'),\n ),\n ),\n other: props.other,\n }\n const plain = buildPlainSelectMessage(forms)\n if (plain !== undefined) {\n return t(\n {\n id: resolveCompiledMessageId(props.id, plain.message, props.context),\n message: plain.message,\n ...(props.context !== undefined ? { context: props.context } : {}),\n ...(props.comment !== undefined ? { comment: props.comment } : {}),\n },\n { value: plain.valueMap[props.value] ?? 'other' },\n )\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([...orderedKeys].map((key) => [key, messages[key] ?? ''])),\n )\n const translated = t(\n {\n id: resolveCompiledMessageId(props.id, buildICUSelectMessage(normalized.forms), props.context),\n message: buildICUSelectMessage(normalized.forms),\n ...(props.context !== undefined ? { context: props.context } : {}),\n ...(props.comment !== undefined ? { comment: props.comment } : {}),\n },\n { value: normalized.valueMap[props.value] ?? 'other' },\n )\n\n return components.length > 0 ? reconstruct(translated, components) : translated\n }\n\n return (() => {\n if (props.tag) {\n return (<Dynamic component={props.tag}>{content()}</Dynamic>) as JSX.Element\n }\n return (<>{content()}</>) as JSX.Element\n }) as unknown as JSX.Element\n}\n","import { useI18n } from '../use-i18n'\n\nexport interface DateTimeProps {\n /** Date value to format */\n value: Date | number\n /** Named format key defined in dateFormats config */\n format?: string\n}\n\n/** @alias DateTimeProps */\nexport type FluentiDateTimeProps = DateTimeProps\n\n/**\n * `<DateTime>` — date formatting component using Intl APIs.\n *\n * @example\n * ```tsx\n * <DateTime value={new Date()} format=\"long\" />\n * ```\n */\nexport function DateTime(props: DateTimeProps) {\n const { d } = useI18n()\n return <>{d(props.value, props.format)}</>\n}\n","import { useI18n } from '../use-i18n'\n\nexport interface NumberProps {\n /** Number value to format */\n value: number\n /** Named format key defined in numberFormats config */\n format?: string\n}\n\n/** @alias NumberProps */\nexport type FluentiNumberFormatProps = NumberProps\n\n/**\n * `<NumberFormat>` — number formatting component using Intl APIs.\n *\n * @example\n * ```tsx\n * <NumberFormat value={1234.56} format=\"currency\" />\n * ```\n */\nexport function NumberFormat(props: NumberProps) {\n const { n } = useI18n()\n return <>{n(props.value, props.format)}</>\n}\n","import type { Component, JSX } from 'solid-js'\nimport { Dynamic } from 'solid-js/web'\nimport { hashMessage } from '@fluenti/core/runtime'\nimport { useI18n } from './use-i18n'\nimport { resolveCompiledMessageId } from './plain-runtime'\nimport { reconstruct } from './rich-dom'\n\nexport interface FluentiCompiledTransProps {\n message: string\n components?: JSX.Element[]\n id?: string\n context?: string\n comment?: string\n tag?: string\n}\n\nexport interface FluentiCompiledPluralProps {\n value: number\n message: string\n id?: string\n context?: string\n comment?: string\n tag?: 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?: string\n}\n\nexport interface FluentiCompiledRichPluralProps extends FluentiCompiledPluralProps {\n components: JSX.Element[]\n}\n\nexport interface FluentiCompiledRichSelectProps extends FluentiCompiledSelectProps {\n components: JSX.Element[]\n}\n\n/** @internal Build-plugin fast path for compiled `<Trans>` usage. */\nexport const __FluentiCompiledTrans: Component<FluentiCompiledTransProps> = (props) => {\n const { t } = useI18n()\n\n return (() => {\n const translated = t({\n id: props.id ?? hashMessage(props.message, props.context),\n message: props.message,\n ...(props.context !== undefined ? { context: props.context } : {}),\n ...(props.comment !== undefined ? { comment: props.comment } : {}),\n })\n const result = props.components && props.components.length > 0\n ? reconstruct(translated, props.components as unknown as Node[])\n : translated\n\n if (props.tag) {\n return (<Dynamic component={props.tag}>{result}</Dynamic>) as JSX.Element\n }\n return (<>{result}</>) as unknown as JSX.Element\n }) as unknown as JSX.Element\n}\n\n/** @internal Build-plugin fast path for plain-text `<Plural>` usage. */\nexport const __FluentiCompiledPlural: Component<FluentiCompiledPluralProps> = (props) => {\n const { t } = useI18n()\n\n return (() => {\n const translated = t(\n {\n id: resolveCompiledMessageId(props.id, props.message, props.context),\n message: props.message,\n ...(props.context !== undefined ? { context: props.context } : {}),\n ...(props.comment !== undefined ? { comment: props.comment } : {}),\n },\n { count: props.value },\n )\n\n if (props.tag) {\n return (<Dynamic component={props.tag}>{translated}</Dynamic>) as JSX.Element\n }\n return (<>{translated}</>) as JSX.Element\n }) as unknown as JSX.Element\n}\n\n/** @internal Build-plugin fast path for plain-text `<Select>` usage. */\nexport const __FluentiCompiledSelect: Component<FluentiCompiledSelectProps> = (props) => {\n const { t } = useI18n()\n\n return (() => {\n const translated = t(\n {\n id: resolveCompiledMessageId(props.id, props.message, props.context),\n message: props.message,\n ...(props.context !== undefined ? { context: props.context } : {}),\n ...(props.comment !== undefined ? { comment: props.comment } : {}),\n },\n { value: props.valueMap?.[props.value] ?? 'other' },\n )\n\n if (props.tag) {\n return (<Dynamic component={props.tag}>{translated}</Dynamic>) as JSX.Element\n }\n return (<>{translated}</>) as JSX.Element\n }) as unknown as JSX.Element\n}\n\n/** @internal Build-plugin fast path for rich-text `<Plural>` usage. */\nexport const __FluentiCompiledRichPlural: Component<FluentiCompiledRichPluralProps> = (props) => {\n const { t } = useI18n()\n\n return (() => {\n const translated = t(\n {\n id: resolveCompiledMessageId(props.id, props.message, props.context),\n message: props.message,\n ...(props.context !== undefined ? { context: props.context } : {}),\n ...(props.comment !== undefined ? { comment: props.comment } : {}),\n },\n { count: props.value },\n )\n const result = props.components.length > 0\n ? reconstruct(translated, props.components as unknown as Node[])\n : translated\n\n if (props.tag) {\n return (<Dynamic component={props.tag}>{result}</Dynamic>) as JSX.Element\n }\n return (<>{result}</>) as JSX.Element\n }) as unknown as JSX.Element\n}\n\n/** @internal Build-plugin fast path for rich-text `<Select>` usage. */\nexport const __FluentiCompiledRichSelect: Component<FluentiCompiledRichSelectProps> = (props) => {\n const { t } = useI18n()\n\n return (() => {\n const translated = t(\n {\n id: resolveCompiledMessageId(props.id, props.message, props.context),\n message: props.message,\n ...(props.context !== undefined ? { context: props.context } : {}),\n ...(props.comment !== undefined ? { comment: props.comment } : {}),\n },\n { value: props.valueMap?.[props.value] ?? 'other' },\n )\n const result = props.components.length > 0\n ? reconstruct(translated, props.components as unknown as Node[])\n : translated\n\n if (props.tag) {\n return (<Dynamic component={props.tag}>{result}</Dynamic>) as JSX.Element\n }\n return (<>{result}</>) as JSX.Element\n }) as unknown as JSX.Element\n}\n"],"mappings":";;;;;AAcA,IAAM,IAAoB,OAAO,IAAI,2BAA2B;AAEhE,SAAS,IAAmD;CAC1D,IAAM,IAAW,WAA4C;AAC7D,QAAO,OAAO,KAAY,YAAY,IAClC,IACA;;AAGN,SAAS,EACP,GACiC;AACjC,QAAO,OAAO,KAAW,YAAY,KAAmB,aAAa,IAChE,EAAwD,UACzD;;AAIN,IAAM,IAA8C;CAClD,IAAM;CAAO,SAAS;CAAO,SAAS;CAAO,SAAS;CAAO,SAAS;CACtE,SAAS;CAAO,SAAS;CAAO,SAAS;CACzC,IAAM;CAAO,SAAS;CACtB,IAAM;CAAO,SAAS;CACtB,IAAM;CAAO,SAAS;CAAO,SAAS;CACtC,IAAM;CAAO,SAAS;CAAO,SAAS;CACtC,IAAM;CAAO,SAAS;CAAO,SAAS;CACtC,IAAM;CAAO,SAAS;CAAO,SAAS;CACtC,IAAM;CAAO,IAAM;CAAO,IAAM;CAAO,IAAM;CAC9C,EAGK,IAAmE;CACvE,OAAO;EAAE,MAAM;EAAW,OAAO;EAAW,KAAK;EAAW;CAC5D,MAAM;EAAE,MAAM;EAAW,OAAO;EAAQ,KAAK;EAAW,SAAS;EAAQ;CACzE,MAAM;EAAE,MAAM;EAAW,QAAQ;EAAW;CAC5C,UAAU;EAAE,MAAM;EAAW,OAAO;EAAS,KAAK;EAAW,MAAM;EAAW,QAAQ;EAAW;CAClG,EAGK,IAAoH;CACxH,WAAW,OAAoB;EAC7B,OAAO;EACP,UAAU,EAAoB,MAAW,EAAoB,EAAO,MAAM,IAAI,CAAC,OAAQ;EACxF;CACD,SAAS,EAAE,OAAO,WAAW;CAC7B,SAAS;EAAE,uBAAuB;EAAG,uBAAuB;EAAG;CAChE;AAmFD,SAAgB,EAAqB,GAA2D;CAC9F,IAAM,CAAC,GAAQ,KAAmB,EAAqB,EAAO,OAAO,EAC/D,CAAC,GAAW,KAAgB,EAAa,GAAM,EAC/C,IAAmB,IAAI,IAAY,CAAC,EAAO,OAAO,CAAC,EACnD,CAAC,GAAe,KAAoB,EAAa,IAAI,IAAI,EAAiB,CAAC,EAC3E,IAAqC,EAAE,GAAG,EAAO,UAAU,EAC3D,IAAa,GACb,IAAoB,EAAW,qBAC/B,EAAmD,aACpD,IAMC,IAAoC;EACxC,QAAQ,EAAO;EACf,UAAU,EAAO,YAAY,EAAE;EAC/B,aAAa;GAAE,GAAG;GAAsB,GAAG,EAAW;GAAa;EACnE,eAAe;GAAE,GAAG;GAAwB,GAAG,EAAW;GAAe;EAC1E;AAMD,CALI,EAAO,mBAAmB,KAAA,MAAW,EAAW,iBAAiB,EAAO,iBACxE,EAAW,kBAAkB,KAAA,MAAW,EAAW,gBAAgB,EAAW,gBAC9E,EAAO,YAAY,KAAA,MAAW,EAAW,UAAU,EAAO,UAC1D,EAAW,gBAAgB,KAAA,MAAW,EAAW,cAAc,EAAW,cAC1E,EAAW,gBAAgB,KAAA,MAAW,EAAW,cAAc,EAAW,cAC9E,EAAW,cAAc,EAAW,gBAAgB,OAAO,UAAY,OAAA,QAAA,IAAA,aAA6C;CACpH,IAAM,IAAO,EAAkB,EAAW;CAI1C,SAAS,EAAE,GAAgE,GAAG,GAAkC;EAC9G,IAAM,IAAU,GAAQ;AAMxB,SALI,EAAK,WAAW,MAAS,EAAK,SAAS,IAEvC,MAAM,QAAQ,EAAY,IAAI,SAAS,IAClC,EAAK,EAAE,GAAqC,GAAG,EAAK,GAEtD,EAAK,EAAE,GAA2C,EAAK,GAA0C;;CAG1G,IAAM,KAAgB,GAAa,MAAyB;AAM1D,EALA,EAAK,aAAa,GAAK,EAAK,EAG5B,EAAS,KAAO;GAAE,GAAG,EAAS;GAAM,GAAG;GAAM,EAC7C,EAAiB,IAAI,EAAI,EACzB,EAAiB,IAAI,IAAI,EAAiB,CAAC;IAGzC,IAAmB,GAEjB,IAAY,OAAO,MAAqC;AAC5D,MAAI,CAAC,KAAqB,CAAC,EAAW,aAAa;AACjD,KAAgB,EAAU;AAC1B;;EAGF,IAAM,IAAe,GAAuB;AAE5C,MAAI,EAAiB,IAAI,EAAU,EAAE;AACnC,OAAI;AACF,IAAI,GAAc,kBAChB,MAAM,EAAa,eAAe,EAAU;YAEvC,GAAG;AACV,YAAQ,KAAK,qDAAqD,EAAU,IAAI,EAAE;;AAEpF,KAAgB,EAAU;AAC1B;;EAIF,IAAM,IAAc,EAAE;AACtB,IAAa,GAAK;AAClB,MAAI;GACF,IAAM,IAAS,EAAqB,MAAM,EAAW,YAAY,EAAU,CAAC;AAQ5E,OANA,EAAK,aAAa,GAAW,EAAO,EAEpC,EAAS,KAAa;IAAE,GAAG,EAAS;IAAY,GAAG;IAAQ,EAC3D,EAAiB,IAAI,EAAU,EAC/B,EAAiB,IAAI,IAAI,EAAiB,CAAC,EAEvC,MAAgB,EAAkB;AACtC,OAAI;AACF,IAAI,GAAc,kBAChB,MAAM,EAAa,eAAe,EAAU;YAEvC,GAAG;AACV,YAAQ,KAAK,qDAAqD,EAAU,IAAI,EAAE;;AAGpF,OAAI,MAAgB,EAAkB;AACtC,KAAgB,EAAU;YAClB;AACR,GAAI,MAAgB,KAClB,EAAa,GAAM;;IAKnB,oBAAmB,IAAI,KAAa;AAqD1C,QAAO;EAAE;EAAQ;EAAW;EAAG;EAAc,kBA9BV,EAAK,YAAY;EA8BK,IA5B9C,GAAsB,MAAoC;GACnE,IAAM,IAAU,GAAQ;AAExB,UADI,EAAK,WAAW,MAAS,EAAK,SAAS,IACpC,EAAK,EAAE,GAAO,EAAM;;EAyB+B,IAtBjD,GAAe,MAAoC;GAC5D,IAAM,IAAU,GAAQ;AAExB,UADI,EAAK,WAAW,MAAS,EAAK,SAAS,IACpC,EAAK,EAAE,GAAO,EAAM;;EAmBkC,SAhB/C,GAAiB,MAAsD;GACrF,IAAM,IAAU,GAAQ;AAExB,UADI,EAAK,WAAW,MAAS,EAAK,SAAS,IACpC,EAAK,OAAO,GAAS,EAAO;;EAakC;EAAW;EAAe,gBAnD1E,MAAsB;AAC3C,OAAI,CAAC,KAAqB,EAAiB,IAAI,EAAI,IAAI,CAAC,EAAW,eAAe,EAAiB,IAAI,EAAI,CAAE;AAC7G,KAAiB,IAAI,EAAI;GACzB,IAAM,IAAe,GAAuB;AAC5C,KAAW,YAAY,EAAI,CAAC,KAAK,OAAO,MAAW;IACjD,IAAM,IAAW,EAAqB,EAAO;AAM7C,IALA,EAAK,aAAa,GAAK,EAAS,EAEhC,EAAS,KAAO;KAAE,GAAG,EAAS;KAAM,GAAG;KAAU,EACjD,EAAiB,IAAI,EAAI,EACzB,EAAiB,IAAI,IAAI,EAAiB,CAAC,EACvC,GAAc,mBAChB,MAAM,EAAa,gBAAgB,EAAI;KAEzC,CAAC,OAAO,MAAe;AACvB,YAAQ,KAAK,6BAA6B,GAAK,EAAE;KACjD,CAAC,cAAc;AACf,MAAiB,OAAO,EAAI;KAC5B;;EAiC4G,KAVpG,GAAa,MAA0B;GACjD,IAAM,IAAO,EAAS,KAAO,GAAQ;AACrC,UAAO,MAAS,KAAA,KAAa,KAAO;;EAQ8E,KALxG,GAAa,MAA8C;GACrE,IAAM,IAAO,EAAS,KAAO,GAAQ;AACrC,UAAO,IAAO,EAAK,KAAO,KAAA;;EAG4F;;AAG1H,IAAa,IAAgB,GCvShBK,IAAUL,GAA+B,EAwBzCM,KAAgDC,MAAU;CACrE,IAAMC,IAAMN,EAAqBK,EAAM;AACvC,QAAAE,EAAQJ,EAAQK,UAAQ;EAACC,OAAOH;EAAG,IAAAI,WAAA;AAAA,UAAGL,EAAMK;;EAAQ,CAAA;;;;ACvBtD,SAAgB,IAA0B;CACxC,IAAM,IAAM,EAAW,EAAQ;AAC/B,KAAI,EACF,QAAO;AAGT,OAAU,MACR,mDACD;;AAIH,SAAgB,IAA0B;AACxC,QAAO,GAAS,CAAC;;;;ACpBnB,SAASE,EAAWC,GAA+B;AACjD,QAAO,OAAOC,OAAS,OAAeD,aAAiBC;;AAGzD,SAASC,EAAaF,GAAyB;AAI7C,QAHI,OAAOA,KAAU,cAAc,CAAEA,EAA8BG,SACzDH,GAAyB,GAE5BA;;AAKT,SAAgBK,EAAeL,GAG7B;CACA,IAAMO,IAAqB,EAAE,EACzBD,IAAU;CAEd,SAASE,EAAMC,GAAqB;EAClC,IAAMC,IAAWR,EAAaO,EAAK;AACnC,MAAIC,KAAa,QAAkC,OAAOA,KAAa,UAAW;AAClF,MAAIE,MAAMC,QAAQH,EAAS,EAAE;AAC3B,QAAK,IAAMI,KAASJ,EAAUF,GAAMM,EAAM;AAC1C;;AAEF,MAAI,OAAOJ,KAAa,YAAY,OAAOA,KAAa,UAAU;AAChEJ,QAAWS,OAAOL,EAAS;AAC3B;;AAEF,MAAI,CAACX,EAAWW,EAAS,CAAE;AAC3B,MAAIA,EAASM,aAAaf,KAAKgB,WAAW;AACxCX,QAAWI,EAASQ,eAAe;AACnC;;AAEF,MAAIR,EAASM,aAAaf,KAAKkB,wBAAwB;AACrDX,KAAMI,MAAMQ,KAAKV,EAASW,WAAW,CAAC;AACtC;;EAGF,IAAMC,IAAMf,EAAWJ,QACjBoB,IAAQlB,EAAeO,MAAMQ,KAAKV,EAASW,WAAW,CAAC;AAG7D,EAFAd,EAAWiB,KAAMd,EAAqBgB,UAAU,GAAM,CAAC,EACvDnB,EAAWiB,KAAK,GAAGD,EAAMhB,WAAW,EAChCgB,EAAMjB,YAAY,MAAMiB,EAAMhB,WAAWJ,WAAW,IACtDG,KAAW,IAAIgB,EAAG,MAElBhB,KAAW,IAAIgB,EAAG,GAAIlB,EAAcmB,EAAMjB,SAASgB,IAAM,EAAE,CAAA,IAAKA,EAAG;;AAKvE,QADAd,EAAMR,EAAM,EACL;EAAEM;EAASC;EAAY;;AAGhC,SAASoB,EAAYC,GAAcd,GAAsB;CACvD,IAAMJ,IAAWR,EAAaY,EAAM;AAChCJ,YAAa,QAAkC,OAAOA,KAAa,YACvE;MAAIE,MAAMC,QAAQH,EAAS,EAAE;AAC3B,QAAK,IAAMmB,KAASnB,EAAUiB,GAAYC,GAAQC,EAAM;AACxD;;AAEF,MAAI,OAAOnB,KAAa,YAAY,OAAOA,KAAa,UAAU;AAChEkB,KAAOD,YAAYG,SAASC,eAAehB,OAAOL,EAAS,CAAC,CAAC;AAC7D;;AAEF,EAAIX,EAAWW,EAAS,IACtBkB,EAAOD,YAAYjB,EAAS;;;AAIhC,SAAgBsB,EACdC,GACA1B,GACa;CACb,IAAM2B,IAAa,sCACbC,IAAoB,EAAE,EACxBC,IAAY,GACZC;AAIJ,MAFAH,EAAWE,YAAY,GACvBC,IAAQH,EAAWK,KAAKN,EAAW,EAC5BI,MAAU,OAAM;AACrB,EAAIA,EAAMG,QAAQJ,KAChBD,EAAOX,KAAKS,EAAWQ,MAAML,GAAWC,EAAMG,MAAM,CAAC;EAGvD,IAAMlB,IAAMoB,OAAOL,EAAM,GAAG,EACtBM,IAAgBN,EAAM,OAAO1B,KAAAA;AAEnC,MAAI,CAAC+B,OAAOE,UAAUtB,EAAI,IAAIA,IAAM,KAAKA,KAAOf,EAAWJ,QAAQ;AAKjEkC,GAJKM,KACHR,EAAOX,KAAKa,EAAM,MAAM,GAAG,EAE7BD,IAAYF,EAAWE,WACvBC,IAAQH,EAAWK,KAAKN,EAAW;AACnC;;EAGF,IAAMY,IAAWtC,EAAWe;AAE5B,MAAIqB,GACEE,KACFV,EAAOX,KAAKqB,EAASnB,UAAU,GAAM,CAAC;OAEnC;GACL,IAAMH,IAAQS,EAAYK,EAAM,OAAO1B,KAAAA,IAAwB,KAAZ0B,EAAM,IAAU9B,EAAW;AAC9E,OAAIsC,GAAU;IACZ,IAAMC,IAAQD,EAASnB,UAAU,GAAM;AAEvCS,IADAR,EAAYmB,GAAOvB,EAAM,EACzBY,EAAOX,KAAKsB,EAAM;SAElBX,GAAOX,KAAKa,EAAM,MAAM,GAAG;;AAK/BA,EADAD,IAAYF,EAAWE,WACvBC,IAAQH,EAAWK,KAAKN,EAAW;;AAOrC,QAJIG,IAAYH,EAAW9B,UACzBgC,EAAOX,KAAKS,EAAWQ,MAAML,EAAU,CAAC,EAGlCD,EAAOhC,UAAU,IAAIgC,EAAO,MAAM,KAAKA;;AAGjD,SAAgBY,EACdC,GACAE,GAIA;CACA,IAAMG,IAAmC,EAAE,EACrC9C,IAAqB,EAAE;AAE7B,MAAK,IAAM+C,KAAON,GAAM;EACtB,IAAMhD,IAAQkD,EAAMI;AACpB,MAAItD,MAAUW,KAAAA,EAAW;EACzB,IAAM4C,IAAYlD,EAAeL,EAAM;AAEvCO,EADA8C,EAASC,KAAOlD,EAAcmD,EAAUjD,SAASC,EAAWJ,OAAO,EACnEI,EAAWiB,KAAK,GAAG+B,EAAUhD,WAAW;;AAG1C,MAAK,IAAM,CAAC+C,GAAKtD,MAAUwD,OAAOC,QAAQP,EAAM,EAAE;AAChD,MAAIF,EAAKU,SAASJ,EAAS,IAAItD,MAAUW,KAAAA,EAAW;EACpD,IAAM4C,IAAYlD,EAAeL,EAAM;AAEvCO,EADA8C,EAASC,KAAOlD,EAAcmD,EAAUjD,SAASC,EAAWJ,OAAO,EACnEI,EAAWiB,KAAK,GAAG+B,EAAUhD,WAAW;;AAG1C,QAAO;EAAE8C;EAAU9C;EAAY;;;;AC3GjC,IAAMiF,IAAkB;AAUxB,SAASC,EAAYC,GAAeC,IAAgB,GAAqB;AACvE,KAAIA,IAAQH,EAEV,QAAO,CAAC;EAAEL,MAAM;EAAQC,OAAOM;EAAO,CAAC;CAEzC,IAAME,IAAkB,EAAE,EACtBC,IAAM;AAEV,QAAOA,IAAMH,EAAMI,SAAQ;EACzB,IAAMC,IAAUL,EAAMM,QAAQ,KAAKH,EAAI;AAEvC,MAAIE,MAAY,IAAI;AAElBH,KAAOK,KAAK;IAAEd,MAAM;IAAQC,OAAOM,EAAMQ,MAAML,EAAG;IAAG,CAAC;AACtD;;AAIF,EAAIE,IAAUF,KACZD,EAAOK,KAAK;GAAEd,MAAM;GAAQC,OAAOM,EAAMQ,MAAML,GAAKE,EAAO;GAAG,CAAC;EAIjE,IAAMI,IAAiBT,EAAMQ,MAAMH,EAAQ,CAACK,MAAM,gBAAgB;AAClE,MAAID,GAAgB;AAElBN,GADAD,EAAOK,KAAK;IAAEd,MAAM;IAAOG,MAAMa,EAAe;IAAKvC,UAAU,EAAA;IAAI,CAAC,EACpEiC,IAAME,IAAUI,EAAe,GAAGL;AAClC;;EAIF,IAAMO,IAAYX,EAAMQ,MAAMH,EAAQ,CAACK,MAAM,WAAW;AACxD,MAAI,CAACC,GAAW;AAGdR,GADAD,EAAOK,KAAK;IAAEd,MAAM;IAAQC,OAAO;IAAK,CAAC,EACzCS,IAAME,IAAU;AAChB;;EAGF,IAAMO,IAAUD,EAAU,IACpBE,IAAeR,IAAUM,EAAU,GAAGP,QAGtCU,IAAWC,EAAef,GAAOY,GAASC,EAAa;AAC7D,MAAIC,MAAa,IAAI;AAGnBX,GADAD,EAAOK,KAAK;IAAEd,MAAM;IAAQC,OAAOM,EAAMQ,MAAMH,GAASQ,EAAY;IAAG,CAAC,EACxEV,IAAMU;AACN;;EAGF,IAAMG,IAAehB,EAAMQ,MAAMK,GAAcC,EAAS,EAClDG,IAAa,KAAKL,EAAO;AAM/BT,EALAD,EAAOK,KAAK;GACVd,MAAM;GACNG,MAAMgB;GACN1C,UAAU6B,EAAYiB,GAAcf,IAAQ,EAAC;GAC9C,CAAC,EACFE,IAAMW,IAAWG,EAAWb;;AAG9B,QAAOF;;AAST,SAASa,EAAef,GAAeY,GAAiBM,GAA0B;CAChF,IAAMC,IAAU,IAAIP,EAAO,IACrBQ,IAAW,KAAKR,EAAO,IACzBX,IAAQ,GACRE,IAAMe;AAEV,QAAOf,IAAMH,EAAMI,UAAUH,IAAQ,IAAG;EACtC,IAAMoB,IAAWrB,EAAMM,QAAQa,GAAShB,EAAI,EACtCmB,IAAYtB,EAAMM,QAAQc,GAAUjB,EAAI;AAE9C,MAAImB,MAAc,GAAI,QAAO;AAE7B,MAAID,MAAa,MAAMA,IAAWC,EAEhCnB,CADAF,KACAE,IAAMkB,IAAWF,EAAQf;OACpB;AAEL,OADAH,KACIA,MAAU,EAAG,QAAOqB;AACxBnB,OAAMmB,IAAYF,EAAShB;;;AAI/B,QAAO;;AAMT,SAASmB,EACPrB,GACAd,GACa;CACb,IAAMoC,IAAWtB,EAAOuB,KAAKC,MAAuB;AAClD,MAAIA,EAAMjC,SAAS,OACjB,QAAOiC,EAAMhC;EAGf,IAAMiC,IAAOvC,EAAWsC,EAAM9B;AAU9B,SATK+B,IASEE,EAAE5D,GAAO;GAAC6D,WAAWH;GAAIzD,UAJXwD,EAAMxD,SAASkC,SAAS,IACzCmB,EAAaG,EAAMxD,UAAUkB,EAAW,GACxCwC,KAAAA;GAE2C,CAAA,GAPtCL,EAAaG,EAAMxD,UAAUkB,EAAW;GAQjD;AAGF,QADIoC,EAASpB,WAAW,IAAUoB,EAAS,KAChCA;;AAqBb,IAAaO,KAAuCC,MAAU;CAC5D,IAAM,EAAEC,SAAM1D,GAAS,EACjB2D,IAAmB/D,QAAsB6D,EAAM9D,SAAS,EAKxDiB,IAAUf,QAAiB;EAC/B,IAAM+D,IAAMH,EAAM1C,aAAa0C,EAAM7C;AACrC,SAAO,OAAOgD,KAAQ,aAAcA,GAAsB,GAAGA;GAC7D,EACI/C,IAAahB,QAAiB4D,EAAMzC,gBAAgByC,EAAM5C,WAAW;AAE3E,eAAc;EACZ,IAAMgD,IAAMjD,GAAS,EACfkD,IAAQjD,GAAY;AAE1B,MAAIgD,MAAQR,KAAAA,KAAaS,EAQvB,QAAOd,EADQxB,EANIkC,EAAE;GACnB,GAAID,EAAMjD,OAAO6C,KAAAA,IAA+B,EAAE,GAArB,EAAE7C,IAAIiD,EAAMjD,IAAI;GAC7CI,SAASiD;GACT,GAAIJ,EAAMhD,YAAY4C,KAAAA,IAAyC,EAAE,GAA/B,EAAE5C,SAASgD,EAAMhD,SAAS;GAC5D,GAAIgD,EAAM/C,YAAY2C,KAAAA,IAAyC,EAAE,GAA/B,EAAE3C,SAAS+C,EAAM/C,SAAS;GAC7D,CAAC,CACoC,EACVoD,EAAM;EAIpC,IAAMnE,IAAWgE,EAAiBK,SAAS;AAC3C,MAAIrE,EAASkC,WAAW,EAAG,QAAO;EAClC,IAAMoC,IAAY/D,EAAkBP,EAAS,EACvCoE,IAAaL,EAAE;GACnB,GAAID,EAAMjD,OAAO6C,KAAAA,IAA+B,EAAE,GAArB,EAAE7C,IAAIiD,EAAMjD,IAAI;GAC7CI,SAASqD,EAAUrD;GACnB,GAAI6C,EAAMhD,YAAY4C,KAAAA,IAAyC,EAAE,GAA/B,EAAE5C,SAASgD,EAAMhD,SAAS;GAC5D,GAAIgD,EAAM/C,YAAY2C,KAAAA,IAAyC,EAAE,GAA/B,EAAE3C,SAAS+C,EAAM/C,SAAS;GAC7D,CAAC,EACIwD,IAASD,EAAUpD,WAAWgB,SAAS,IACzCzB,EAAsB2D,GAAYE,EAAUpD,WAAW,GACvDkD;AASJ,SAPII,MAAMC,QAAQF,EAAO,IAAIA,EAAOrC,SAAS,KACvC4B,EAAM9C,MACD2C,EAAE5D,GAAO;GAAA,IAAC6D,YAAS;AAAA,WAAEE,EAAM9C;;GAAGhB,UAAGuE;GAAM,CAAA,GAErCA;;;;;AC7OjB,SAAgB,EAAiB,GAAyB;AAIxD,QAHI,OAAO,KAAU,cAAc,CAAE,EAA8B,SACzD,GAAyB,GAE5B;;AAGT,SAAgB,EACd,GACA,GACA,GACQ;AACR,QAAO,MAAO,MAAY,KAAA,IAAY,IAAU,EAAY,GAAS,EAAQ;;AAG/E,SAAS,EAAiB,GAA0C;AAClE,QAAO,OAAO,KAAU,YAAY,OAAO,KAAU;;AAGvD,SAAgB,EACd,GACA,GACoB;CACpB,IAAM,IAAsD,EAAE;AAE9D,MAAK,IAAM,KAAY,GAAmB;EACxC,IAAM,IAAW,EAAiB,EAAM,GAAU;AAC9C,YAAa,KAAA,GACjB;OAAI,CAAC,EAAiB,EAAS,CAAE;AACjC,KAAW,KAAY,OAAO,EAAS;;;AAGrC,OAAW,UAAa,KAAA,EAC5B,QAAO,EAAsB,GAA2E,EAAO;;AAGjH,SAAgB,EACd,GACmE;CACnE,IAAM,IAAqC,EAAE;AAE7C,MAAK,IAAM,CAAC,GAAK,MAAU,OAAO,QAAQ,EAAM,EAAE;EAChD,IAAM,IAAW,EAAiB,EAAM;AACpC,YAAa,KAAA,GACjB;OAAI,CAAC,EAAiB,EAAS,CAAE;AACjC,KAAW,KAAO,OAAO,EAAS;;;AAGpC,KAAI,EAAW,UAAa,KAAA,EAAW;CAEvC,IAAM,IAAa,EAAqB,EAAW;AACnD,QAAO;EACL,SAAS,EAAsB,EAAW,MAAM;EAChD,UAAU,EAAW;EACtB;;;;ACMH,IAAa6B,KAAyCC,MAAU;CAC9D,IAAM,EAAEC,MAAMtB,GAAS;AAEvB,eAAc;EACZ,IAAMuB,IAAwE,EAAE;AAChF,OAAK,IAAMG,KAAO5B,GAAmB;GACnC,IAAM6B,IAAWtB,EAAiBgB,EAAMK,GAAK;AAC7C,GAAIC,MAAaC,KAAAA,MACfL,EAAeG,KAAOC;;EAG1B,IAAME,IAAe1B,EAAwBoB,GAAgBF,EAAMV,OAAO;AAC1E,MAAIkB,MAAiBD,KAAAA,GAAW;GAC9B,IAAME,IAAaR,EACjB;IACEd,IAAIJ,EAAyBiB,EAAMb,IAAIqB,GAAcR,EAAMZ,QAAQ;IACnEsB,SAASF;IACT,GAAIR,EAAMZ,YAAYmB,KAAAA,IAAyC,EAAE,GAA/B,EAAEnB,SAASY,EAAMZ,SAAS;IAC5D,GAAIY,EAAMX,YAAYkB,KAAAA,IAAyC,EAAE,GAA/B,EAAElB,SAASW,EAAMX,SAAS;IAC7D,EACD,EAAEsB,OAAOX,EAAMd,OACjB,CAAC;AAKD,UAHIc,EAAMF,MACDc,EAAEvC,GAAO;IAAA,IAACwC,YAAS;AAAA,YAAEb,EAAMF;;IAAGgB,UAAGL;IAAU,CAAA,GAEzCA;;EAGb,IAAM,EAAEM,aAAUC,kBAAenC,EAAmBJ,GAAmByB,EAAe,EAChFe,IAAazC,EACjB;GACE,GAAIuC,EAAS,SAAYR,KAAAA,KAAa,EAAEhB,MAAMwB,EAAS,MAAS;GAChE,GAAIA,EAAS,QAAWR,KAAAA,KAAa,EAAEd,KAAKsB,EAAS,KAAQ;GAC7D,GAAIA,EAAS,QAAWR,KAAAA,KAAa,EAAEb,KAAKqB,EAAS,KAAQ;GAC7D,GAAIA,EAAS,QAAWR,KAAAA,KAAa,EAAEZ,KAAKoB,EAAS,KAAQ;GAC7D,GAAIA,EAAS,SAAYR,KAAAA,KAAa,EAAEX,MAAMmB,EAAS,MAAS;GAChElB,OAAOkB,EAAS,SAAY;GAC7B,EACDf,EAAMV,OACP,EAEKmB,IAAaR,EACjB;GACEd,IAAIJ,EAAyBiB,EAAMb,IAAI8B,GAAYjB,EAAMZ,QAAQ;GACjEsB,SAASO;GACT,GAAIjB,EAAMZ,YAAYmB,KAAAA,IAAyC,EAAE,GAA/B,EAAEnB,SAASY,EAAMZ,SAAS;GAC5D,GAAIY,EAAMX,YAAYkB,KAAAA,IAAyC,EAAE,GAA/B,EAAElB,SAASW,EAAMX,SAAS;GAC7D,EACD,EAAEsB,OAAOX,EAAMd,OACjB,CAAC,EAEKgC,IAASF,EAAWG,SAAS,IAAIvC,EAAY6B,GAAYO,EAAW,GAAGP;AAI7E,SAHIT,EAAMF,MACDc,EAAEvC,GAAO;GAAA,IAACwC,YAAS;AAAA,WAAEb,EAAMF;;GAAGgB,UAAGI;GAAM,CAAA,GAErCA;;GCxDFuB,KAA6CC,MAAU;CAClE,IAAM,EAAEC,MAAMlB,GAAS,EAEjBmB,UAAgB;EACpB,IAAMC,IAAgB,IAAIC,IAAI;GAAC;GAAS;GAAM;GAAW;GAAW;GAAW;GAAS;GAAO;GAAY;GAAO;GAAS;GAAa;GAAS;GAAa;GAAM;GAAa;GAAO;GAAO,CAAC,EAC1LC,IAAiCL,EAAML,YAAYW,KAAAA,IAErD;GACA,GAAGC,OAAOC,YACRD,OAAOE,QAAQT,EAAM,CAACU,QAAQ,CAACZ,OAC7B,CAACK,EAAcQ,IAAIb,EAAI,IACpB,CAACA,EAAIc,WAAW,QAAQ,IACxB,CAACd,EAAIc,WAAW,QAAQ,IACxB,CAACd,EAAIc,WAAW,KACrB,CACF,CAAC;GACDnB,OAAOO,EAAMP;GACd,GAXC;GAAE,GAAGO,EAAML;GAASF,OAAOO,EAAMP;GAAO,EAYtCoB,IAAQ3B,EAAwBmB,EAAM;AAC5C,MAAIQ,MAAUP,KAAAA,EACZ,QAAOL,EACL;GACEX,IAAIH,EAAyBa,EAAMV,IAAIuB,EAAMC,SAASd,EAAMT,QAAQ;GACpEuB,SAASD,EAAMC;GACf,GAAId,EAAMT,YAAYe,KAAAA,IAAyC,EAAE,GAA/B,EAAEf,SAASS,EAAMT,SAAS;GAC5D,GAAIS,EAAMR,YAAYc,KAAAA,IAAyC,EAAE,GAA/B,EAAEd,SAASQ,EAAMR,SAAS;GAC7D,EACD,EAAEH,OAAOwB,EAAME,SAASf,EAAMX,UAAU,SAC1C,CAAC;EAGH,IAAM2B,IAAc,CAAC,GAAGT,OAAOU,KAAKZ,EAAM,CAACK,QAAOZ,MAAOA,MAAQ,QAAQ,EAAE,QAAQ,EAC7E,EAAEqB,aAAUC,kBAAenC,EAAmB+B,GAAaX,EAAM,EACjEgB,IAAavC,EACjByB,OAAOC,YAAY,CAAC,GAAGQ,EAAY,CAACM,KAAKxB,MAAQ,CAACA,GAAKqB,EAASrB,MAAQ,GAAG,CAAC,CAC9E,CAAC,EACKyB,IAAatB,EACjB;GACEX,IAAIH,EAAyBa,EAAMV,IAAIT,EAAsBwC,EAAWhB,MAAM,EAAEL,EAAMT,QAAQ;GAC9FuB,SAASjC,EAAsBwC,EAAWhB,MAAM;GAChD,GAAIL,EAAMT,YAAYe,KAAAA,IAAyC,EAAE,GAA/B,EAAEf,SAASS,EAAMT,SAAS;GAC5D,GAAIS,EAAMR,YAAYc,KAAAA,IAAyC,EAAE,GAA/B,EAAEd,SAASQ,EAAMR,SAAS;GAC7D,EACD,EAAEH,OAAOgC,EAAWN,SAASf,EAAMX,UAAU,SAC/C,CAAC;AAED,SAAO+B,EAAWI,SAAS,IAAIxC,EAAYuC,GAAYH,EAAW,GAAGG;;AAGvE,eACMvB,EAAMH,MACD4B,EAAE7C,GAAO;EAAA,IAAC8C,YAAS;AAAA,UAAE1B,EAAMH;;EAAG,IAAA8B,WAAA;AAAA,UAAGzB,GAAS;;EAAA,CAAA,GAE5C0B,EAAI1B,EAAO;;;;ACtGtB,SAAgBiC,EAASC,GAAsB;CAC7C,IAAM,EAAEC,SAAMR,GAAS;AACvB,QAAAS,QAAUD,EAAED,EAAML,OAAOK,EAAMH,OAAO,CAAA;;;;ACFxC,SAAgBW,EAAaC,GAAoB;CAC/C,IAAM,EAAEC,SAAMP,GAAS;AACvB,QAAAQ,QAAUD,EAAED,EAAMJ,OAAOI,EAAMH,OAAO,CAAA;;;;ACsBxC,IAAa4B,KAAgEC,MAAU;CACrF,IAAM,EAAEC,MAAMpB,GAAS;AAEvB,eAAc;EACZ,IAAMqB,IAAaD,EAAE;GACnBb,IAAIY,EAAMZ,MAAMR,EAAYoB,EAAMf,SAASe,EAAMX,QAAQ;GACzDJ,SAASe,EAAMf;GACf,GAAIe,EAAMX,YAAYc,KAAAA,IAAyC,EAAE,GAA/B,EAAEd,SAASW,EAAMX,SAAS;GAC5D,GAAIW,EAAMV,YAAYa,KAAAA,IAAyC,EAAE,GAA/B,EAAEb,SAASU,EAAMV,SAAS;GAC7D,CAAC,EACIc,IAASJ,EAAMd,cAAcc,EAAMd,WAAWmB,SAAS,IACzDtB,EAAYmB,GAAYF,EAAMd,WAAgC,GAC9DgB;AAKJ,SAHIF,EAAMT,MACDgB,EAAE5B,GAAO;GAAA,IAAC6B,YAAS;AAAA,WAAER,EAAMT;;GAAGkB,UAAGL;GAAM,CAAA,GAErCA;;GAKFM,KAAkEV,MAAU;CACvF,IAAM,EAAEC,MAAMpB,GAAS;AAEvB,eAAc;EACZ,IAAMqB,IAAaD,EACjB;GACEb,IAAIN,EAAyBkB,EAAMZ,IAAIY,EAAMf,SAASe,EAAMX,QAAQ;GACpEJ,SAASe,EAAMf;GACf,GAAIe,EAAMX,YAAYc,KAAAA,IAAyC,EAAE,GAA/B,EAAEd,SAASW,EAAMX,SAAS;GAC5D,GAAIW,EAAMV,YAAYa,KAAAA,IAAyC,EAAE,GAA/B,EAAEb,SAASU,EAAMV,SAAS;GAC7D,EACD,EAAEqB,OAAOX,EAAMP,OACjB,CAAC;AAKD,SAHIO,EAAMT,MACDgB,EAAE5B,GAAO;GAAA,IAAC6B,YAAS;AAAA,WAAER,EAAMT;;GAAGkB,UAAGP;GAAU,CAAA,GAEzCA;;GAKFU,KAAkEZ,MAAU;CACvF,IAAM,EAAEC,MAAMpB,GAAS;AAEvB,eAAc;EACZ,IAAMqB,IAAaD,EACjB;GACEb,IAAIN,EAAyBkB,EAAMZ,IAAIY,EAAMf,SAASe,EAAMX,QAAQ;GACpEJ,SAASe,EAAMf;GACf,GAAIe,EAAMX,YAAYc,KAAAA,IAAyC,EAAE,GAA/B,EAAEd,SAASW,EAAMX,SAAS;GAC5D,GAAIW,EAAMV,YAAYa,KAAAA,IAAyC,EAAE,GAA/B,EAAEb,SAASU,EAAMV,SAAS;GAC7D,EACD,EAAEG,OAAOO,EAAML,WAAWK,EAAMP,UAAU,SAC5C,CAAC;AAKD,SAHIO,EAAMT,MACDgB,EAAE5B,GAAO;GAAA,IAAC6B,YAAS;AAAA,WAAER,EAAMT;;GAAGkB,UAAGP;GAAU,CAAA,GAEzCA;;GAKFW,KAA0Eb,MAAU;CAC/F,IAAM,EAAEC,MAAMpB,GAAS;AAEvB,eAAc;EACZ,IAAMqB,IAAaD,EACjB;GACEb,IAAIN,EAAyBkB,EAAMZ,IAAIY,EAAMf,SAASe,EAAMX,QAAQ;GACpEJ,SAASe,EAAMf;GACf,GAAIe,EAAMX,YAAYc,KAAAA,IAAyC,EAAE,GAA/B,EAAEd,SAASW,EAAMX,SAAS;GAC5D,GAAIW,EAAMV,YAAYa,KAAAA,IAAyC,EAAE,GAA/B,EAAEb,SAASU,EAAMV,SAAS;GAC7D,EACD,EAAEqB,OAAOX,EAAMP,OACjB,CAAC,EACKW,IAASJ,EAAMd,WAAWmB,SAAS,IACrCtB,EAAYmB,GAAYF,EAAMd,WAAgC,GAC9DgB;AAKJ,SAHIF,EAAMT,MACDgB,EAAE5B,GAAO;GAAA,IAAC6B,YAAS;AAAA,WAAER,EAAMT;;GAAGkB,UAAGL;GAAM,CAAA,GAErCA;;GAKFU,KAA0Ed,MAAU;CAC/F,IAAM,EAAEC,MAAMpB,GAAS;AAEvB,eAAc;EACZ,IAAMqB,IAAaD,EACjB;GACEb,IAAIN,EAAyBkB,EAAMZ,IAAIY,EAAMf,SAASe,EAAMX,QAAQ;GACpEJ,SAASe,EAAMf;GACf,GAAIe,EAAMX,YAAYc,KAAAA,IAAyC,EAAE,GAA/B,EAAEd,SAASW,EAAMX,SAAS;GAC5D,GAAIW,EAAMV,YAAYa,KAAAA,IAAyC,EAAE,GAA/B,EAAEb,SAASU,EAAMV,SAAS;GAC7D,EACD,EAAEG,OAAOO,EAAML,WAAWK,EAAMP,UAAU,SAC5C,CAAC,EACKW,IAASJ,EAAMd,WAAWmB,SAAS,IACrCtB,EAAYmB,GAAYF,EAAMd,WAAgC,GAC9DgB;AAKJ,SAHIF,EAAMT,MACDgB,EAAE5B,GAAO;GAAA,IAAC6B,YAAS;AAAA,WAAER,EAAMT;;GAAGkB,UAAGL;GAAM,CAAA,GAErCA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../src/compile-time-t.ts"],"sourcesContent":["import type { CompileTimeT } from '@fluenti/core'\n\nexport const t: CompileTimeT = ((..._args: unknown[]) => {\n throw new Error(\n \"[fluenti] `t` imported from '@fluenti/solid' is a compile-time API. \" +\n 'Use it only with the Fluenti build transform inside a component or custom hook. ' +\n 'For runtime lookups, use useI18n().t(...).',\n )\n}) as CompileTimeT\n"],"mappings":"qJAEA,IAAa,IAAoB,GAAG,IAAqB,CACvD,MAAU,MACR,iMAGD"}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/compile-time-t.ts"],"sourcesContent":["import type { CompileTimeT } from '@fluenti/core'\n\nexport const t: CompileTimeT = ((..._args: unknown[]) => {\n throw new Error(\n \"[fluenti] `t` imported from '@fluenti/solid' is a compile-time API. \" +\n 'Use it only with the Fluenti build transform inside a component or custom hook. ' +\n 'For runtime lookups, use useI18n().t(...).',\n )\n}) as CompileTimeT\n"],"mappings":";;;AAEA,IAAa,MAAoB,GAAG,MAAqB;AACvD,OAAU,MACR,iMAGD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.cjs","names":[],"sources":["../src/server.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks'\nimport { createFluentiCore } from '@fluenti/core'\nimport type {\n FluentiCoreInstanceFull,\n FluentiCoreConfigFull,\n Locale,\n Messages,\n DateFormatOptions,\n NumberFormatOptions,\n} from '@fluenti/core'\n\n// Re-export SSR utilities from core for convenience\nexport { detectLocale, getSSRLocaleScript, getHydratedLocale, isRTL, getDirection } from '@fluenti/core'\nexport type { DetectLocaleOptions } from '@fluenti/core'\n\n/**\n * Configuration for `createServerI18n`.\n */\nexport interface ServerI18nConfig {\n /** Load messages for a given locale. Called once per locale per request. */\n loadMessages: (locale: string) => Promise<Messages | { default: Messages }>\n /** Fallback locale when a translation is missing */\n fallbackLocale?: string\n /**\n * Auto-resolve locale when `setLocale()` was not called.\n *\n * This is the fallback for contexts where the layout doesn't run — most\n * notably `\"use server\"` functions, which are independent requests\n * that skip the layout tree entirely.\n *\n * Common patterns:\n * - Read from a cookie via `getRequestEvent()`\n * - Read from a request header set by middleware\n *\n * If omitted and `setLocale()` was not called, `getI18n()` will throw.\n */\n resolveLocale?: () => string | Promise<string>\n /** Custom fallback chains per locale */\n fallbackChain?: Record<string, Locale[]>\n /** Custom date format styles */\n dateFormats?: DateFormatOptions\n /** Custom number format styles */\n numberFormats?: NumberFormatOptions\n /** Handler for missing translation keys */\n missing?: (locale: Locale, id: string) => string | undefined\n}\n\n/**\n * The object returned by `createServerI18n`.\n */\nexport interface ServerI18n {\n /**\n * Set the locale for the current server request.\n * Call this once in your entry-server or root layout before any `getI18n()` calls.\n */\n setLocale: (locale: string) => void\n\n /**\n * Get a fully configured i18n instance for the current request.\n * Messages are loaded lazily and cached.\n */\n getI18n: () => Promise<FluentiCoreInstanceFull & { locale: string }>\n\n /**\n * Run a callback with per-request locale isolation.\n *\n * Uses `AsyncLocalStorage` to scope locale and instance to the callback,\n * preventing cross-request locale leakage in concurrent SSR environments.\n *\n * @example\n * ```ts\n * // In your SolidStart middleware\n * export function middleware(event) {\n * const locale = detectLocaleFromEvent(event)\n * return withLocale(locale, () => handleRequest(event))\n * }\n * ```\n */\n withLocale: <T>(locale: string, fn: () => T | Promise<T>) => Promise<T>\n}\n\n/** Per-request store shape */\ninterface RequestStore {\n locale: string | null\n instance: (FluentiCoreInstanceFull & { locale: string }) | null\n}\n\n/**\n * Create server-side i18n utilities for SolidStart.\n *\n * Uses `AsyncLocalStorage` for per-request isolation of locale state.\n * Wrap each request in `withLocale(locale, fn)` for safe concurrent SSR,\n * or use `setLocale()` / `getI18n()` directly if concurrency is not a concern.\n *\n * @example\n * ```ts\n * // lib/i18n.server.ts\n * import { createServerI18n } from '@fluenti/solid/server'\n *\n * export const { setLocale, getI18n, withLocale } = createServerI18n({\n * loadMessages: (locale) => import(`../locales/compiled/${locale}.ts`),\n * fallbackLocale: 'en',\n * })\n * ```\n *\n * @example Per-request isolation (recommended for concurrent SSR):\n * ```ts\n * // src/middleware.ts\n * import { withLocale } from './lib/i18n.server'\n *\n * export function middleware(event) {\n * const locale = detectLocaleFromEvent(event)\n * return withLocale(locale, () => handleRequest(event))\n * }\n * ```\n */\nexport function createServerI18n(config: ServerI18nConfig): ServerI18n {\n const als = new AsyncLocalStorage<RequestStore>()\n\n // Module-level message cache — safe to share across requests (keyed by locale)\n const messageCache = new Map<string, Messages>()\n\n // Module-level fallback store for when ALS context is not active\n let fallbackStore: RequestStore = { locale: null, instance: null }\n\n function getStore(): RequestStore {\n const store = als.getStore()\n if (!store && typeof process !== 'undefined' && process.env?.['NODE_ENV'] === 'development') {\n console.warn('[fluenti] Server i18n used without withLocale() — locale state is shared across requests. Use withLocale() for concurrent SSR safety.')\n }\n return store ?? fallbackStore\n }\n\n function setLocale(locale: string): void {\n const store = getStore()\n store.locale = locale\n store.instance = null\n }\n\n async function loadLocaleMessages(locale: string): Promise<Messages> {\n const cached = messageCache.get(locale)\n if (cached) return cached\n\n const raw = await config.loadMessages(locale)\n const messages: Messages =\n typeof raw === 'object' && raw !== null && 'default' in raw\n ? (raw as { default: Messages }).default\n : (raw as Messages)\n\n messageCache.set(locale, messages)\n return messages\n }\n\n async function buildInstance(locale: string): Promise<FluentiCoreInstanceFull & { locale: string }> {\n const allMessages: Record<string, Messages> = {}\n allMessages[locale] = await loadLocaleMessages(locale)\n\n if (config.fallbackLocale && config.fallbackLocale !== locale) {\n allMessages[config.fallbackLocale] = await loadLocaleMessages(config.fallbackLocale)\n }\n\n const fluentConfig: FluentiCoreConfigFull = {\n locale,\n messages: allMessages,\n }\n if (config.fallbackLocale !== undefined) fluentConfig.fallbackLocale = config.fallbackLocale\n if (config.fallbackChain !== undefined) fluentConfig.fallbackChain = config.fallbackChain\n if (config.dateFormats !== undefined) fluentConfig.dateFormats = config.dateFormats\n if (config.numberFormats !== undefined) fluentConfig.numberFormats = config.numberFormats\n if (config.missing !== undefined) fluentConfig.missing = config.missing\n\n return createFluentiCore(fluentConfig)\n }\n\n async function getI18n(): Promise<FluentiCoreInstanceFull & { locale: string }> {\n const store = getStore()\n\n // If setLocale() was never called, try the resolveLocale fallback.\n if (!store.locale && config.resolveLocale) {\n store.locale = await config.resolveLocale()\n }\n\n const locale = store.locale\n\n if (!locale) {\n throw new Error(\n '[fluenti] No locale set. Call setLocale(locale) in your entry-server or layout before using getI18n(), ' +\n 'or provide a resolveLocale function in createServerI18n config to auto-detect locale ' +\n 'in server functions and other contexts where the layout does not run.',\n )\n }\n\n // Return cached instance if locale hasn't changed\n if (store.instance && store.instance.locale === locale) {\n return store.instance\n }\n\n store.instance = await buildInstance(locale)\n return store.instance\n }\n\n async function withLocale<T>(locale: string, fn: () => T | Promise<T>): Promise<T> {\n const store: RequestStore = { locale, instance: null }\n return als.run(store, async () => {\n return fn()\n })\n }\n\n return { setLocale, getI18n, withLocale }\n}\n"],"mappings":"gIAoHA,SAAgB,EAAiB,EAAsC,CACrE,IAAM,EAAM,IAAI,EAAA,kBAGV,EAAe,IAAI,IAGrB,EAA8B,CAAE,OAAQ,KAAM,SAAU,KAAM,CAElE,SAAS,GAAyB,CAChC,IAAM,EAAQ,EAAI,UAAU,CAI5B,MAHI,CAAC,GAAS,OAAO,QAAY,KAAA,QAAA,IAAA,WAA6C,eAC5E,QAAQ,KAAK,wIAAwI,CAEhJ,GAAS,EAGlB,SAAS,EAAU,EAAsB,CACvC,IAAM,EAAQ,GAAU,CACxB,EAAM,OAAS,EACf,EAAM,SAAW,KAGnB,eAAe,EAAmB,EAAmC,CACnE,IAAM,EAAS,EAAa,IAAI,EAAO,CACvC,GAAI,EAAQ,OAAO,EAEnB,IAAM,EAAM,MAAM,EAAO,aAAa,EAAO,CACvC,EACJ,OAAO,GAAQ,UAAY,GAAgB,YAAa,EACnD,EAA8B,QAC9B,EAGP,OADA,EAAa,IAAI,EAAQ,EAAS,CAC3B,EAGT,eAAe,EAAc,EAAuE,CAClG,IAAM,EAAwC,EAAE,CAChD,EAAY,GAAU,MAAM,EAAmB,EAAO,CAElD,EAAO,gBAAkB,EAAO,iBAAmB,IACrD,EAAY,EAAO,gBAAkB,MAAM,EAAmB,EAAO,eAAe,EAGtF,IAAM,EAAsC,CAC1C,SACA,SAAU,EACX,CAOD,OANI,EAAO,iBAAmB,IAAA,KAAW,EAAa,eAAiB,EAAO,gBAC1E,EAAO,gBAAkB,IAAA,KAAW,EAAa,cAAgB,EAAO,eACxE,EAAO,cAAgB,IAAA,KAAW,EAAa,YAAc,EAAO,aACpE,EAAO,gBAAkB,IAAA,KAAW,EAAa,cAAgB,EAAO,eACxE,EAAO,UAAY,IAAA,KAAW,EAAa,QAAU,EAAO,UAEhE,EAAA,EAAA,mBAAyB,EAAa,CAGxC,eAAe,GAAiE,CAC9E,IAAM,EAAQ,GAAU,CAGpB,CAAC,EAAM,QAAU,EAAO,gBAC1B,EAAM,OAAS,MAAM,EAAO,eAAe,EAG7C,IAAM,EAAS,EAAM,OAErB,GAAI,CAAC,EACH,MAAU,MACR,oQAGD,CASH,OALI,EAAM,UAAY,EAAM,SAAS,SAAW,IAIhD,EAAM,SAAW,MAAM,EAAc,EAAO,EAHnC,EAAM,SAOjB,eAAe,EAAc,EAAgB,EAAsC,CACjF,IAAM,EAAsB,CAAE,SAAQ,SAAU,KAAM,CACtD,OAAO,EAAI,IAAI,EAAO,SACb,GAAI,CACX,CAGJ,MAAO,CAAE,YAAW,UAAS,aAAY"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.js","names":[],"sources":["../src/server.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks'\nimport { createFluentiCore } from '@fluenti/core'\nimport type {\n FluentiCoreInstanceFull,\n FluentiCoreConfigFull,\n Locale,\n Messages,\n DateFormatOptions,\n NumberFormatOptions,\n} from '@fluenti/core'\n\n// Re-export SSR utilities from core for convenience\nexport { detectLocale, getSSRLocaleScript, getHydratedLocale, isRTL, getDirection } from '@fluenti/core'\nexport type { DetectLocaleOptions } from '@fluenti/core'\n\n/**\n * Configuration for `createServerI18n`.\n */\nexport interface ServerI18nConfig {\n /** Load messages for a given locale. Called once per locale per request. */\n loadMessages: (locale: string) => Promise<Messages | { default: Messages }>\n /** Fallback locale when a translation is missing */\n fallbackLocale?: string\n /**\n * Auto-resolve locale when `setLocale()` was not called.\n *\n * This is the fallback for contexts where the layout doesn't run — most\n * notably `\"use server\"` functions, which are independent requests\n * that skip the layout tree entirely.\n *\n * Common patterns:\n * - Read from a cookie via `getRequestEvent()`\n * - Read from a request header set by middleware\n *\n * If omitted and `setLocale()` was not called, `getI18n()` will throw.\n */\n resolveLocale?: () => string | Promise<string>\n /** Custom fallback chains per locale */\n fallbackChain?: Record<string, Locale[]>\n /** Custom date format styles */\n dateFormats?: DateFormatOptions\n /** Custom number format styles */\n numberFormats?: NumberFormatOptions\n /** Handler for missing translation keys */\n missing?: (locale: Locale, id: string) => string | undefined\n}\n\n/**\n * The object returned by `createServerI18n`.\n */\nexport interface ServerI18n {\n /**\n * Set the locale for the current server request.\n * Call this once in your entry-server or root layout before any `getI18n()` calls.\n */\n setLocale: (locale: string) => void\n\n /**\n * Get a fully configured i18n instance for the current request.\n * Messages are loaded lazily and cached.\n */\n getI18n: () => Promise<FluentiCoreInstanceFull & { locale: string }>\n\n /**\n * Run a callback with per-request locale isolation.\n *\n * Uses `AsyncLocalStorage` to scope locale and instance to the callback,\n * preventing cross-request locale leakage in concurrent SSR environments.\n *\n * @example\n * ```ts\n * // In your SolidStart middleware\n * export function middleware(event) {\n * const locale = detectLocaleFromEvent(event)\n * return withLocale(locale, () => handleRequest(event))\n * }\n * ```\n */\n withLocale: <T>(locale: string, fn: () => T | Promise<T>) => Promise<T>\n}\n\n/** Per-request store shape */\ninterface RequestStore {\n locale: string | null\n instance: (FluentiCoreInstanceFull & { locale: string }) | null\n}\n\n/**\n * Create server-side i18n utilities for SolidStart.\n *\n * Uses `AsyncLocalStorage` for per-request isolation of locale state.\n * Wrap each request in `withLocale(locale, fn)` for safe concurrent SSR,\n * or use `setLocale()` / `getI18n()` directly if concurrency is not a concern.\n *\n * @example\n * ```ts\n * // lib/i18n.server.ts\n * import { createServerI18n } from '@fluenti/solid/server'\n *\n * export const { setLocale, getI18n, withLocale } = createServerI18n({\n * loadMessages: (locale) => import(`../locales/compiled/${locale}.ts`),\n * fallbackLocale: 'en',\n * })\n * ```\n *\n * @example Per-request isolation (recommended for concurrent SSR):\n * ```ts\n * // src/middleware.ts\n * import { withLocale } from './lib/i18n.server'\n *\n * export function middleware(event) {\n * const locale = detectLocaleFromEvent(event)\n * return withLocale(locale, () => handleRequest(event))\n * }\n * ```\n */\nexport function createServerI18n(config: ServerI18nConfig): ServerI18n {\n const als = new AsyncLocalStorage<RequestStore>()\n\n // Module-level message cache — safe to share across requests (keyed by locale)\n const messageCache = new Map<string, Messages>()\n\n // Module-level fallback store for when ALS context is not active\n let fallbackStore: RequestStore = { locale: null, instance: null }\n\n function getStore(): RequestStore {\n const store = als.getStore()\n if (!store && typeof process !== 'undefined' && process.env?.['NODE_ENV'] === 'development') {\n console.warn('[fluenti] Server i18n used without withLocale() — locale state is shared across requests. Use withLocale() for concurrent SSR safety.')\n }\n return store ?? fallbackStore\n }\n\n function setLocale(locale: string): void {\n const store = getStore()\n store.locale = locale\n store.instance = null\n }\n\n async function loadLocaleMessages(locale: string): Promise<Messages> {\n const cached = messageCache.get(locale)\n if (cached) return cached\n\n const raw = await config.loadMessages(locale)\n const messages: Messages =\n typeof raw === 'object' && raw !== null && 'default' in raw\n ? (raw as { default: Messages }).default\n : (raw as Messages)\n\n messageCache.set(locale, messages)\n return messages\n }\n\n async function buildInstance(locale: string): Promise<FluentiCoreInstanceFull & { locale: string }> {\n const allMessages: Record<string, Messages> = {}\n allMessages[locale] = await loadLocaleMessages(locale)\n\n if (config.fallbackLocale && config.fallbackLocale !== locale) {\n allMessages[config.fallbackLocale] = await loadLocaleMessages(config.fallbackLocale)\n }\n\n const fluentConfig: FluentiCoreConfigFull = {\n locale,\n messages: allMessages,\n }\n if (config.fallbackLocale !== undefined) fluentConfig.fallbackLocale = config.fallbackLocale\n if (config.fallbackChain !== undefined) fluentConfig.fallbackChain = config.fallbackChain\n if (config.dateFormats !== undefined) fluentConfig.dateFormats = config.dateFormats\n if (config.numberFormats !== undefined) fluentConfig.numberFormats = config.numberFormats\n if (config.missing !== undefined) fluentConfig.missing = config.missing\n\n return createFluentiCore(fluentConfig)\n }\n\n async function getI18n(): Promise<FluentiCoreInstanceFull & { locale: string }> {\n const store = getStore()\n\n // If setLocale() was never called, try the resolveLocale fallback.\n if (!store.locale && config.resolveLocale) {\n store.locale = await config.resolveLocale()\n }\n\n const locale = store.locale\n\n if (!locale) {\n throw new Error(\n '[fluenti] No locale set. Call setLocale(locale) in your entry-server or layout before using getI18n(), ' +\n 'or provide a resolveLocale function in createServerI18n config to auto-detect locale ' +\n 'in server functions and other contexts where the layout does not run.',\n )\n }\n\n // Return cached instance if locale hasn't changed\n if (store.instance && store.instance.locale === locale) {\n return store.instance\n }\n\n store.instance = await buildInstance(locale)\n return store.instance\n }\n\n async function withLocale<T>(locale: string, fn: () => T | Promise<T>): Promise<T> {\n const store: RequestStore = { locale, instance: null }\n return als.run(store, async () => {\n return fn()\n })\n }\n\n return { setLocale, getI18n, withLocale }\n}\n"],"mappings":";;;AAoHA,SAAgB,EAAiB,GAAsC;CACrE,IAAM,IAAM,IAAI,GAAiC,EAG3C,oBAAe,IAAI,KAAuB,EAG5C,IAA8B;EAAE,QAAQ;EAAM,UAAU;EAAM;CAElE,SAAS,IAAyB;EAChC,IAAM,IAAQ,EAAI,UAAU;AAI5B,SAHI,CAAC,KAAS,OAAO,UAAY,OAAA,QAAA,IAAA,aAA6C,iBAC5E,QAAQ,KAAK,wIAAwI,EAEhJ,KAAS;;CAGlB,SAAS,EAAU,GAAsB;EACvC,IAAM,IAAQ,GAAU;AAExB,EADA,EAAM,SAAS,GACf,EAAM,WAAW;;CAGnB,eAAe,EAAmB,GAAmC;EACnE,IAAM,IAAS,EAAa,IAAI,EAAO;AACvC,MAAI,EAAQ,QAAO;EAEnB,IAAM,IAAM,MAAM,EAAO,aAAa,EAAO,EACvC,IACJ,OAAO,KAAQ,YAAY,KAAgB,aAAa,IACnD,EAA8B,UAC9B;AAGP,SADA,EAAa,IAAI,GAAQ,EAAS,EAC3B;;CAGT,eAAe,EAAc,GAAuE;EAClG,IAAM,IAAwC,EAAE;AAGhD,EAFA,EAAY,KAAU,MAAM,EAAmB,EAAO,EAElD,EAAO,kBAAkB,EAAO,mBAAmB,MACrD,EAAY,EAAO,kBAAkB,MAAM,EAAmB,EAAO,eAAe;EAGtF,IAAM,IAAsC;GAC1C;GACA,UAAU;GACX;AAOD,SANI,EAAO,mBAAmB,KAAA,MAAW,EAAa,iBAAiB,EAAO,iBAC1E,EAAO,kBAAkB,KAAA,MAAW,EAAa,gBAAgB,EAAO,gBACxE,EAAO,gBAAgB,KAAA,MAAW,EAAa,cAAc,EAAO,cACpE,EAAO,kBAAkB,KAAA,MAAW,EAAa,gBAAgB,EAAO,gBACxE,EAAO,YAAY,KAAA,MAAW,EAAa,UAAU,EAAO,UAEzD,EAAkB,EAAa;;CAGxC,eAAe,IAAiE;EAC9E,IAAM,IAAQ,GAAU;AAGxB,EAAI,CAAC,EAAM,UAAU,EAAO,kBAC1B,EAAM,SAAS,MAAM,EAAO,eAAe;EAG7C,IAAM,IAAS,EAAM;AAErB,MAAI,CAAC,EACH,OAAU,MACR,oQAGD;AASH,SALI,EAAM,YAAY,EAAM,SAAS,WAAW,MAIhD,EAAM,WAAW,MAAM,EAAc,EAAO,GAHnC,EAAM;;CAOjB,eAAe,EAAc,GAAgB,GAAsC;EACjF,IAAM,IAAsB;GAAE;GAAQ,UAAU;GAAM;AACtD,SAAO,EAAI,IAAI,GAAO,YACb,GAAI,CACX;;AAGJ,QAAO;EAAE;EAAW;EAAS;EAAY"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"compile-time-t.d.ts","sourceRoot":"","sources":["../../../src/compile-time-t.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAEjD,eAAO,MAAM,CAAC,EAAE,YAME,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"compiled.d.ts","sourceRoot":"","sources":["../../../src/compiled.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAO9C,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,GAAG,CAAC,OAAO,EAAE,CAAA;IAC1B,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjC,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,8BAA+B,SAAQ,0BAA0B;IAChF,UAAU,EAAE,GAAG,CAAC,OAAO,EAAE,CAAA;CAC1B;AAED,MAAM,WAAW,8BAA+B,SAAQ,0BAA0B;IAChF,UAAU,EAAE,GAAG,CAAC,OAAO,EAAE,CAAA;CAC1B;AAED,qEAAqE;AACrE,eAAO,MAAM,sBAAsB,EAAE,SAAS,CAAC,yBAAyB,CAmBvE,CAAA;AAED,wEAAwE;AACxE,eAAO,MAAM,uBAAuB,EAAE,SAAS,CAAC,0BAA0B,CAmBzE,CAAA;AAED,wEAAwE;AACxE,eAAO,MAAM,uBAAuB,EAAE,SAAS,CAAC,0BAA0B,CAmBzE,CAAA;AAED,uEAAuE;AACvE,eAAO,MAAM,2BAA2B,EAAE,SAAS,CAAC,8BAA8B,CAsBjF,CAAA;AAED,uEAAuE;AACvE,eAAO,MAAM,2BAA2B,EAAE,SAAS,CAAC,8BAA8B,CAsBjF,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"DateTime.d.ts","sourceRoot":"","sources":["../../../../src/components/DateTime.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,2BAA2B;IAC3B,KAAK,EAAE,IAAI,GAAG,MAAM,CAAA;IACpB,qDAAqD;IACrD,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,2BAA2B;AAC3B,MAAM,MAAM,oBAAoB,GAAG,aAAa,CAAA;AAEhD;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,kCAG5C"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"NumberFormat.d.ts","sourceRoot":"","sources":["../../../../src/components/NumberFormat.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,6BAA6B;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,yBAAyB;AACzB,MAAM,MAAM,wBAAwB,GAAG,WAAW,CAAA;AAElD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,kCAG9C"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"components-entry.d.ts","sourceRoot":"","sources":["../../../src/components-entry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,YAAY,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,YAAY,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAClD,OAAO,EAAE,UAAU,IAAI,MAAM,EAAE,MAAM,UAAU,CAAA;AAC/C,YAAY,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAChD,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACxD,YAAY,EAAE,WAAW,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAA;AACtF,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,2BAA2B,EAC3B,2BAA2B,GAC5B,MAAM,YAAY,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/context.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"__useI18n.d.ts","sourceRoot":"","sources":["../../../../src/hooks/__useI18n.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAE9C;;;;;;;;GAQG;AACH,wBAAgB,SAAS,IAAI,cAAc,CAE1C"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACzC,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EAAE,CAAC,EAAE,MAAM,kBAAkB,CAAA;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAClF,YAAY,EACV,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACb,oBAAoB,EACpB,WAAW,EACX,wBAAwB,GACzB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"msg.d.ts","sourceRoot":"","sources":["../../../src/msg.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"plain-runtime.d.ts","sourceRoot":"","sources":["../../../src/plain-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAA;AAE9B,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAKxD;AAED,wBAAgB,wBAAwB,CACtC,EAAE,EAAE,MAAM,GAAG,SAAS,EACtB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GAAG,SAAS,GAC1B,MAAM,CAER;AAMD,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,EAC/C,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,GAAG,SAAS,CAYpB;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAAG,SAAS,CAiBnE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"plural.d.ts","sourceRoot":"","sources":["../../../src/plural.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAM9C,yCAAyC;AACzC,MAAM,WAAW,kBAAkB;IACjC,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAA;IACb,2DAA2D;IAC3D,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,OAAO,CAAA;IAC3B,4CAA4C;IAC5C,GAAG,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,OAAO,CAAA;IAC1B,4CAA4C;IAC5C,GAAG,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,OAAO,CAAA;IAC1B,4CAA4C;IAC5C,GAAG,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,OAAO,CAAA;IAC1B,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,OAAO,CAAA;IAC3B,8DAA8D;IAC9D,KAAK,EAAE,MAAM,GAAG,GAAG,CAAC,OAAO,CAAA;IAC3B,mEAAmE;IACnE,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,eAAO,MAAM,MAAM,EAAE,SAAS,CAAC,kBAAkB,CA0DhD,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/provider.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAE/C,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAE9D,mEAAmE;AACnE,eAAO,MAAM,OAAO,wDAAkC,CAAA;AAEtD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,YAAY,EAAE,eAAe,CAAC,aAAa,CAGvD,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"rich-dom.d.ts","sourceRoot":"","sources":["../../../src/rich-dom.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAenC,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG;IAC9C,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,IAAI,EAAE,CAAA;CACnB,CAsCA;AAkBD,wBAAgB,WAAW,CACzB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,IAAI,EAAE,GACjB,GAAG,CAAC,OAAO,CAmDb;AAED,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,EACjD,IAAI,EAAE,SAAS,CAAC,EAAE,EAClB,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3D;IACD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,UAAU,EAAE,IAAI,EAAE,CAAA;CACnB,CAoBA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../../src/select.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAO9C,yCAAyC;AACzC,MAAM,WAAW,kBAAkB;IACjC,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAA;IACb,2DAA2D;IAC3D,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,2CAA2C;IAC3C,KAAK,EAAE,MAAM,GAAG,GAAG,CAAC,OAAO,CAAA;IAC3B;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,CAAA;IAC9C,mEAAmE;IACnE,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,iEAAiE;IACjE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,eAAO,MAAM,UAAU,EAAE,SAAS,CAAC,kBAAkB,CAuDpD,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/server.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,uBAAuB,EAEvB,MAAM,EACN,QAAQ,EACR,iBAAiB,EACjB,mBAAmB,EACpB,MAAM,eAAe,CAAA;AAGtB,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AACxG,YAAY,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AAExD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,4EAA4E;IAC5E,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,GAAG;QAAE,OAAO,EAAE,QAAQ,CAAA;KAAE,CAAC,CAAA;IAC3E,oDAAoD;IACpD,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;;;;;;;;;;;OAYG;IACH,aAAa,CAAC,EAAE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAC9C,wCAAwC;IACxC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;IACxC,gCAAgC;IAChC,WAAW,CAAC,EAAE,iBAAiB,CAAA;IAC/B,kCAAkC;IAClC,aAAa,CAAC,EAAE,mBAAmB,CAAA;IACnC,2CAA2C;IAC3C,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAA;CAC7D;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;;OAGG;IACH,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IAEnC;;;OAGG;IACH,OAAO,EAAE,MAAM,OAAO,CAAC,uBAAuB,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAEpE;;;;;;;;;;;;;;OAcG;IACH,UAAU,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAA;CACxE;AAQD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,CA6FrE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"solid-runtime.d.ts","sourceRoot":"","sources":["../../../src/solid-runtime.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAE5D,eAAO,MAAM,qBAAqB,EAAE,gBAUlC,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"trans.d.ts","sourceRoot":"","sources":["../../../src/trans.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAI9C,8CAA8C;AAC9C,MAAM,MAAM,aAAa,GAAG,SAAS,CAAC;IAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;CAAE,CAAC,CAAA;AAEjE,wCAAwC;AACxC,MAAM,WAAW,iBAAiB;IAChC,sCAAsC;IACtC,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,mEAAmE;IACnE,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,uDAAuD;IACvD,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;IACtB,8EAA8E;IAC9E,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IAC1C,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,6DAA6D;IAC7D,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;CAC7C;AAyJD;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,KAAK,EAAE,SAAS,CAAC,iBAAiB,CAmD9C,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,KAAK,EACV,iBAAiB,EACjB,MAAM,EACN,eAAe,EACf,QAAQ,EACR,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACpB,MAAM,eAAe,CAAA;AAEtB,2CAA2C;AAC3C,MAAM,MAAM,WAAW,GAAG,CACxB,MAAM,EAAE,MAAM,KACX,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;CAAE,CAAC,CAAA;AAE5F,uDAAuD;AACvD,MAAM,WAAW,aAAc,SAAQ,iBAAiB;IACtD,iDAAiD;IACjD,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,qDAAqD;IACrD,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,+BAA+B;IAC/B,WAAW,CAAC,EAAE,iBAAiB,CAAA;IAC/B,iCAAiC;IACjC,aAAa,CAAC,EAAE,mBAAmB,CAAA;CACpC;AAED,4EAA4E;AAC5E,MAAM,WAAW,cAAc;IAC7B,+CAA+C;IAC/C,MAAM,IAAI,MAAM,CAAA;IAChB,wEAAwE;IACxE,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACxC,mEAAmE;IACnE,CAAC,CAAC,EAAE,EAAE,MAAM,GAAG,iBAAiB,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,eAAe,CAAA;IACpF,6CAA6C;IAC7C,CAAC,CAAC,OAAO,EAAE,oBAAoB,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,GAAG,eAAe,CAAA;IACtE,iEAAiE;IACjE,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAA;IACtD,wDAAwD;IACxD,UAAU,IAAI,MAAM,EAAE,CAAA;IACtB,iDAAiD;IACjD,CAAC,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,eAAe,CAAA;IACxD,mDAAmD;IACnD,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,eAAe,CAAA;IACjD,gEAAgE;IAChE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,eAAe,CAAA;IAC1E,uDAAuD;IACvD,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;IAC5B,qDAAqD;IACrD,aAAa,EAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;IACpC,iEAAiE;IACjE,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CACpC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-i18n.d.ts","sourceRoot":"","sources":["../../../src/use-i18n.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAE/C;;;;GAIG;AACH,wBAAgB,OAAO,IAAI,cAAc,CASxC;AAED,oEAAoE;AACpE,wBAAgB,SAAS,IAAI,MAAM,MAAM,CAExC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"vite-plugin.d.ts","sourceRoot":"","sources":["../../../src/vite-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAClC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAIhE,YAAY,EAAE,oBAAoB,IAAI,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAEvF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,MAAM,EAAE,CAM7E"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"vite-plugin.cjs","names":[],"sources":["../src/solid-runtime.ts","../src/vite-plugin.ts"],"sourcesContent":["import { createRuntimeGenerator } from '@fluenti/vite-plugin'\nimport type { RuntimeGenerator } from '@fluenti/vite-plugin'\n\nexport const solidRuntimeGenerator: RuntimeGenerator = createRuntimeGenerator({\n imports: `import { createSignal } from 'solid-js'\\nimport { createStore, reconcile } from 'solid-js/store'`,\n catalogInit: 'const [__catalog, __setCatalog] = createStore({ ...__defaultMsgs })',\n localeInit: (defaultLocale) => `const [__currentLocale, __setCurrentLocale] = createSignal(${JSON.stringify(defaultLocale)})`,\n loadingInit: 'const [__loading, __setLoading] = createSignal(false)',\n catalogUpdate: (msgs) => `__setCatalog(reconcile(${msgs}))`,\n localeUpdate: (locale) => `__setCurrentLocale(${locale})`,\n loadingUpdate: (value) => `__setLoading(${value})`,\n localeRead: '__currentLocale()',\n runtimeKey: 'fluenti.runtime.solid.v1',\n})\n","import type { Plugin } from 'vite'\nimport type { FluentiPluginOptions } from '@fluenti/vite-plugin'\nimport { createFluentiPlugins } from '@fluenti/vite-plugin'\nimport { solidRuntimeGenerator } from './solid-runtime'\n\nexport type { FluentiPluginOptions as FluentiSolidOptions } from '@fluenti/vite-plugin'\n\n/**\n * Fluenti SolidJS Vite plugin.\n *\n * @example Minimal — no fluenti.config.ts needed\n * ```ts\n * // vite.config.ts\n * import fluentiSolid from '@fluenti/solid/vite-plugin'\n *\n * export default defineConfig({\n * plugins: [fluentiSolid({ config: { locales: ['en', 'ja'] } })],\n * })\n * ```\n *\n * @example With fluenti.config.ts (for advanced options)\n * ```ts\n * export default defineConfig({\n * plugins: [fluentiSolid()], // auto-reads fluenti.config.ts\n * })\n * ```\n */\nexport default function fluentiSolid(options?: FluentiPluginOptions): Plugin[] {\n return createFluentiPlugins(\n { ...(options?.config !== undefined ? { config: options.config } : {}), framework: 'solid' },\n [],\n solidRuntimeGenerator,\n )\n}\n"],"mappings":"sCAGA,IAAa,GAAA,EAAA,EAAA,wBAAiE,CAC5E,QAAS;yDACT,YAAa,sEACb,WAAa,GAAkB,8DAA8D,KAAK,UAAU,EAAc,CAAC,GAC3H,YAAa,wDACb,cAAgB,GAAS,0BAA0B,EAAK,IACxD,aAAe,GAAW,sBAAsB,EAAO,GACvD,cAAgB,GAAU,gBAAgB,EAAM,GAChD,WAAY,oBACZ,WAAY,2BACb,CAAC,CCcF,SAAwB,EAAa,EAA0C,CAC7E,OAAA,EAAA,EAAA,sBACE,CAAE,GAAI,GAAS,SAAW,IAAA,GAAyC,EAAE,CAA/B,CAAE,OAAQ,EAAQ,OAAQ,CAAQ,UAAW,QAAS,CAC5F,EAAE,CACF,EACD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"vite-plugin.js","names":[],"sources":["../src/solid-runtime.ts","../src/vite-plugin.ts"],"sourcesContent":["import { createRuntimeGenerator } from '@fluenti/vite-plugin'\nimport type { RuntimeGenerator } from '@fluenti/vite-plugin'\n\nexport const solidRuntimeGenerator: RuntimeGenerator = createRuntimeGenerator({\n imports: `import { createSignal } from 'solid-js'\\nimport { createStore, reconcile } from 'solid-js/store'`,\n catalogInit: 'const [__catalog, __setCatalog] = createStore({ ...__defaultMsgs })',\n localeInit: (defaultLocale) => `const [__currentLocale, __setCurrentLocale] = createSignal(${JSON.stringify(defaultLocale)})`,\n loadingInit: 'const [__loading, __setLoading] = createSignal(false)',\n catalogUpdate: (msgs) => `__setCatalog(reconcile(${msgs}))`,\n localeUpdate: (locale) => `__setCurrentLocale(${locale})`,\n loadingUpdate: (value) => `__setLoading(${value})`,\n localeRead: '__currentLocale()',\n runtimeKey: 'fluenti.runtime.solid.v1',\n})\n","import type { Plugin } from 'vite'\nimport type { FluentiPluginOptions } from '@fluenti/vite-plugin'\nimport { createFluentiPlugins } from '@fluenti/vite-plugin'\nimport { solidRuntimeGenerator } from './solid-runtime'\n\nexport type { FluentiPluginOptions as FluentiSolidOptions } from '@fluenti/vite-plugin'\n\n/**\n * Fluenti SolidJS Vite plugin.\n *\n * @example Minimal — no fluenti.config.ts needed\n * ```ts\n * // vite.config.ts\n * import fluentiSolid from '@fluenti/solid/vite-plugin'\n *\n * export default defineConfig({\n * plugins: [fluentiSolid({ config: { locales: ['en', 'ja'] } })],\n * })\n * ```\n *\n * @example With fluenti.config.ts (for advanced options)\n * ```ts\n * export default defineConfig({\n * plugins: [fluentiSolid()], // auto-reads fluenti.config.ts\n * })\n * ```\n */\nexport default function fluentiSolid(options?: FluentiPluginOptions): Plugin[] {\n return createFluentiPlugins(\n { ...(options?.config !== undefined ? { config: options.config } : {}), framework: 'solid' },\n [],\n solidRuntimeGenerator,\n )\n}\n"],"mappings":";;AAGA,IAAa,IAA0C,EAAuB;CAC5E,SAAS;CACT,aAAa;CACb,aAAa,MAAkB,8DAA8D,KAAK,UAAU,EAAc,CAAC;CAC3H,aAAa;CACb,gBAAgB,MAAS,0BAA0B,EAAK;CACxD,eAAe,MAAW,sBAAsB,EAAO;CACvD,gBAAgB,MAAU,gBAAgB,EAAM;CAChD,YAAY;CACZ,YAAY;CACb,CAAC;;;ACcF,SAAwB,EAAa,GAA0C;AAC7E,QAAO,EACL;EAAE,GAAI,GAAS,WAAW,KAAA,IAAyC,EAAE,GAA/B,EAAE,QAAQ,EAAQ,QAAQ;EAAQ,WAAW;EAAS,EAC5F,EAAE,EACF,EACD"}