@idioma/react 0.3.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"createTrans.d.ts","names":[],"sources":["../src/createTrans.tsx"],"sourcesContent":[],"mappings":";;;;;;;;AASA;AAUC;AAmBI,UA7BY,oBAAA,CA6BI;EAEO,QAAA,EA9BhB,SA8BgB;EAAf;EACT,EAAA,CAAA,EAAA,MAAA;EAAgB;EAChB,OAAA,CAAA,EAAA,MAAA;EAAG;EAAW,OAAA,CAAA,EAAA,MAAA;EAEF;EAAG,EAAA,CAAA,EAAA,MAAA;;;AACE;;UArBX,qBA4BG,CAAA,UAAA,MAAA,CAAA,CAAA;EACT;EAAgB,EAAA,EA3Bd,CA2Bc;EAChB;EAAG,QAAA,CAAA,EAAA,KAAA;EAEa;EAAG,OAAA,CAAA,EAAA,KAAA;EACJ;EAAc,EAAA,CAAA,EAAA,MAAA;AAOjC;;;;KA1BK,gBA6BQ,CAAA,UAAA,MAAA,EAAA,WA3BA,MA2BA,CAAA,MAAA,EA3Be,MA2Bf,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,CAAA,GA1BT,CA0BS,SAAA,MA1BO,EA0BP,GAzBT,EAyBS,CAzBN,CAyBM,CAAA,SAzBK,MAyBL,CAAA,MAAA,EAAA,KAAA,CAAA,GAAA;EACa,MAAA,CAAA,EAAA,KAAA;CAAtB,GAAA;EACe,MAAA,EAzBH,EAyBG,CAzBA,CAyBA,CAAA;CAAG,GAAA;EAApB,MAAA,CAAA,EAxBa,MAwBb,CAAA,MAAA,EAAA,OAAA,CAAA;CACqB;;;;AAgBvB,KApCK,oBAoCsB,CAAA,UAAA,MAAA,EAAA,WAlCd,MAkCc,CAAA,MAAA,EAlCC,cAkCD,EAAA,CAAA,CAAA,GAjCvB,CAiCuB,SAAA,MAjCP,EAiCO,GAhCvB,EAgCuB,CAhCpB,CAgCoB,CAAA,SAAA,EAAA,GAAA;EAAW,UAAA,CAAA,EAAA,KAAA;CAAmB,GAAA;EAajC,UAAA,EA3CJ,EA2CI,CA3CD,CA2CC,CAAA;CAAuB,GAAA;EAC7B,UAAA,CAAA,EA3CC,cA2CD,EAAA;CAEZ;;;;;;AAID,KA1CO,qBA0CP,CAAA,UAAA,MAAA,EAAA,WAxCQ,MAwCR,CAAA,MAAA,EAxCuB,MAwCvB,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,EAAA,WAvCQ,MAuCR,CAAA,MAAA,EAvCuB,cAuCvB,EAAA,CAAA,CAAA,GAtCD,qBAsCC,CAtCqB,CAsCrB,CAAA,GArCH,gBAqCG,CArCc,CAqCd,EArCiB,EAqCjB,CAAA,GApCH,oBAoCG,CApCkB,CAoClB,EApCqB,EAoCrB,CAAA;;;;;;;;;;;;;;;iBApBW,sBAAsB,mBAAmB;UAajC,uBAAuB;aAC7B,4BACP,sBACL,YAAU,oBAEV,yBAAK,eAAe,qBAErB"}
1
+ {"version":3,"file":"createTrans.d.ts","names":[],"sources":["../src/createTrans.tsx"],"sourcesContent":[],"mappings":";;;;;;;;AAUA;AAUC;AAmBI,UA7BY,oBAAA,CA6BI;EAEO,QAAA,EA9BhB,SA8BgB;EAAf;EACT,EAAA,CAAA,EAAA,MAAA;EAAgB;EAChB,OAAA,CAAA,EAAA,MAAA;EAAG;EAAW,OAAA,CAAA,EAAA,MAAA;EAEF;EAAG,EAAA,CAAA,EAAA,MAAA;;;AACE;;UArBX,qBA4BG,CAAA,UAAA,MAAA,CAAA,CAAA;EACT;EAAgB,EAAA,EA3Bd,CA2Bc;EAChB;EAAG,QAAA,CAAA,EAAA,KAAA;EAEa;EAAG,OAAA,CAAA,EAAA,KAAA;EACJ;EAAc,EAAA,CAAA,EAAA,MAAA;AAOjC;;;;KA1BK,gBA6BQ,CAAA,UAAA,MAAA,EAAA,WA3BA,MA2BA,CAAA,MAAA,EA3Be,MA2Bf,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,CAAA,GA1BT,CA0BS,SAAA,MA1BO,EA0BP,GAzBT,EAyBS,CAzBN,CAyBM,CAAA,SAzBK,MAyBL,CAAA,MAAA,EAAA,KAAA,CAAA,GAAA;EACa,MAAA,CAAA,EAAA,KAAA;CAAtB,GAAA;EACe,MAAA,EAzBH,EAyBG,CAzBA,CAyBA,CAAA;CAAG,GAAA;EAApB,MAAA,CAAA,EAxBa,MAwBb,CAAA,MAAA,EAAA,OAAA,CAAA;CACqB;;;;AAgBvB,KApCK,oBAoCsB,CAAA,UAAA,MAAA,EAAA,WAlCd,MAkCc,CAAA,MAAA,EAlCC,cAkCD,EAAA,CAAA,CAAA,GAjCvB,CAiCuB,SAAA,MAjCP,EAiCO,GAhCvB,EAgCuB,CAhCpB,CAgCoB,CAAA,SAAA,EAAA,GAAA;EAAW,UAAA,CAAA,EAAA,KAAA;CAAmB,GAAA;EAajC,UAAA,EA3CJ,EA2CI,CA3CD,CA2CC,CAAA;CAAuB,GAAA;EAC7B,UAAA,CAAA,EA3CC,cA2CD,EAAA;CAEZ;;;;;;AAID,KA1CO,qBA0CP,CAAA,UAAA,MAAA,EAAA,WAxCQ,MAwCR,CAAA,MAAA,EAxCuB,MAwCvB,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,EAAA,WAvCQ,MAuCR,CAAA,MAAA,EAvCuB,cAuCvB,EAAA,CAAA,CAAA,GAtCD,qBAsCC,CAtCqB,CAsCrB,CAAA,GArCH,gBAqCG,CArCc,CAqCd,EArCiB,EAqCjB,CAAA,GApCH,oBAoCG,CApCkB,CAoClB,EApCqB,EAoCrB,CAAA;;;;;;;;;;;;;;;iBApBW,sBAAsB,mBAAmB;UAajC,uBAAuB;aAC7B,4BACP,sBACL,YAAU,oBAEV,yBAAK,eAAe,qBAErB"}
@@ -1,2 +1,2 @@
1
- import{IdiomaContext as e}from"./context.js";import{useContext as t}from"react";function n(){function n(n){if(!t(e))throw Error(`[idioma] Trans must be used within an IdiomaProvider. Make sure to wrap your app with <IdiomaProvider>.`);if(`children`in n&&n.children!==void 0)return n.children;let{id:r}=n;if(r)return console.warn(`[idioma] Trans with id="${r}" was not transformed by Babel. Make sure @idioma/core Babel plugin is configured.`),r;throw Error(`[idioma] Trans requires either children or id prop`)}return n}export{n as createTrans};
1
+ import{IdiomaContext as e}from"./context.js";import{useContext as t}from"react";import{_warnNotInlined as n}from"@idioma/core/runtime";function r(){function r(r){if(!t(e))throw Error(`[idioma] Trans must be used within an IdiomaProvider. Make sure to wrap your app with <IdiomaProvider>.`);if(`children`in r&&r.children!==void 0)return r.children;let{id:i}=r;if(i)return n(`Trans:${i}`,`[idioma] Trans with id="${i}" was not transformed by Babel. Make sure @idioma/core Babel plugin is configured.`),i;throw Error(`[idioma] Trans requires either children or id prop`)}return r}export{r as createTrans};
2
2
  //# sourceMappingURL=createTrans.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createTrans.js","names":["useContext","IdiomaContext","createTrans","Trans","props","ctx","Error","children","undefined","id","console","warn"],"sources":["../src/createTrans.tsx"],"sourcesContent":["import { useContext, type ReactNode } from 'react';\nimport { IdiomaContext } from './context';\nimport { type BaseIdiomaConfig } from './createUseT';\nimport { type TransComponent } from './interpolate';\n\n/**\n * Inline mode props - when children are present.\n * Used for development and extracted by Babel in production.\n */\nexport interface TransInlineModeProps {\n children: ReactNode;\n /** Optional explicit key (overrides auto-hash) */\n id?: string;\n /** Translator context for key disambiguation (affects hash) */\n context?: string;\n /** Translator comment (extracted to PO #. comment for translators) */\n comment?: string;\n /** Namespace for large apps */\n ns?: string;\n}\n\n/**\n * Base props for key-only mode.\n */\ninterface TransKeyOnlyBaseProps<K extends string> {\n /** Translation key - must be a valid key from PO */\n id: K;\n /** No children allowed in key-only mode */\n children?: never;\n /** No context in key-only mode - message is defined in PO */\n context?: never;\n /** Namespace for large apps */\n ns?: string;\n}\n\n/**\n * Conditional values prop - required if message has placeholders.\n */\ntype TransValuesProps<\n K extends string,\n MV extends Record<string, Record<string, unknown>>,\n> = K extends keyof MV\n ? MV[K] extends Record<string, never>\n ? { values?: never }\n : { values: MV[K] }\n : { values?: Record<string, unknown> };\n\n/**\n * Conditional components prop - required if message has component tags.\n */\ntype TransComponentsProps<\n K extends string,\n MC extends Record<string, TransComponent[]>,\n> = K extends keyof MC\n ? MC[K] extends []\n ? { components?: never }\n : { components: MC[K] }\n : { components?: TransComponent[] };\n\n/**\n * Key-only mode props - when looking up by id.\n * Values are required if the message has {placeholders}.\n * Components are required if the message has <0>tags</0>.\n */\nexport type TransKeyOnlyModeProps<\n K extends string,\n MV extends Record<string, Record<string, unknown>>,\n MC extends Record<string, TransComponent[]>,\n> = TransKeyOnlyBaseProps<K> &\n TransValuesProps<K, MV> &\n TransComponentsProps<K, MC>;\n\n/**\n * Creates a typed Trans component that supports both inline and key-only modes.\n *\n * @example\n * // In generated idioma/index.ts:\n * export const Trans = createTrans<IdiomaTypes>()\n *\n * // Inline mode (dev, Babel extracts):\n * <Trans>Hello {name}</Trans>\n *\n * // Key-only mode (typed lookup):\n * <Trans id=\"welcome\" values={{ name: \"Ben\" }} />\n * <Trans id=\"legal.links\" components={[TermsLink, PrivacyLink]} />\n */\nexport function createTrans<C extends BaseIdiomaConfig = BaseIdiomaConfig>() {\n // Extract types from config\n type TK = C['TranslationKey'];\n type MV = C['MessageValues'];\n type MC = C['MessageComponents'];\n\n /**\n * Trans component for inline translations.\n *\n * In development and production, Babel transforms Trans to __Trans with\n * inlined translations. This function exists for type safety and to provide\n * a fallback when Babel hasn't transformed the code.\n */\n function Trans(props: TransInlineModeProps): ReactNode;\n function Trans<K extends TK>(\n props: TransKeyOnlyModeProps<\n K & string,\n MV,\n MC & Record<string, TransComponent[]>\n >,\n ): ReactNode;\n function Trans(\n props:\n | TransInlineModeProps\n | TransKeyOnlyModeProps<\n TK & string,\n MV,\n MC & Record<string, TransComponent[]>\n >,\n ): ReactNode {\n const ctx = useContext(IdiomaContext);\n if (!ctx) {\n throw new Error(\n '[idioma] Trans must be used within an IdiomaProvider. ' +\n 'Make sure to wrap your app with <IdiomaProvider>.',\n );\n }\n\n // Inline mode: children present - render them directly\n // Babel transforms this to __Trans with inlined translations\n if ('children' in props && props.children !== undefined) {\n return props.children;\n }\n\n // Key-only mode: Babel should transform this too\n // If we reach here, Babel hasn't transformed the code\n const { id } = props as TransKeyOnlyModeProps<\n TK & string,\n MV,\n MC & Record<string, TransComponent[]>\n >;\n if (id) {\n console.warn(\n `[idioma] Trans with id=\"${id}\" was not transformed by Babel. ` +\n 'Make sure @idioma/core Babel plugin is configured.',\n );\n return id;\n }\n\n throw new Error('[idioma] Trans requires either children or id prop');\n }\n\n return Trans;\n}\n"],"mappings":"gFAsFA,SAAgBE,GAA6D,CAqB3E,SAAAC,EAAAC,EAAA,CASwC,GAAA,CAA1BJ,EAAAC,EAAyB,CAC7B,MAAAK,MAEJ,0GACqD,CAAA,GAMrD,aAAcF,GAASA,EAAKG,WAAAC,IAAAA,GAAuB,OAC9CJ,EAAKG,SAKd,GAAA,CAAAE,MAAeL,EAIb,GACEK,EAID,OAHDC,QAAAC,KACE,2BAA2BF,EAAE,oFAE9B,CACMA,EAAE,MAAAH,MAGK,qDAAoD,CAGtE,OAAOH"}
1
+ {"version":3,"file":"createTrans.js","names":["_warnNotInlined","useContext","IdiomaContext","createTrans","Trans","props","ctx","Error","children","undefined","id"],"sources":["../src/createTrans.tsx"],"sourcesContent":["import { _warnNotInlined } from '@idioma/core/runtime';\nimport { useContext, type ReactNode } from 'react';\nimport { IdiomaContext } from './context';\nimport { type BaseIdiomaConfig } from './createUseT';\nimport { type TransComponent } from './interpolate';\n\n/**\n * Inline mode props - when children are present.\n * Used for development and extracted by Babel in production.\n */\nexport interface TransInlineModeProps {\n children: ReactNode;\n /** Optional explicit key (overrides auto-hash) */\n id?: string;\n /** Translator context for key disambiguation (affects hash) */\n context?: string;\n /** Translator comment (extracted to PO #. comment for translators) */\n comment?: string;\n /** Namespace for large apps */\n ns?: string;\n}\n\n/**\n * Base props for key-only mode.\n */\ninterface TransKeyOnlyBaseProps<K extends string> {\n /** Translation key - must be a valid key from PO */\n id: K;\n /** No children allowed in key-only mode */\n children?: never;\n /** No context in key-only mode - message is defined in PO */\n context?: never;\n /** Namespace for large apps */\n ns?: string;\n}\n\n/**\n * Conditional values prop - required if message has placeholders.\n */\ntype TransValuesProps<\n K extends string,\n MV extends Record<string, Record<string, unknown>>,\n> = K extends keyof MV\n ? MV[K] extends Record<string, never>\n ? { values?: never }\n : { values: MV[K] }\n : { values?: Record<string, unknown> };\n\n/**\n * Conditional components prop - required if message has component tags.\n */\ntype TransComponentsProps<\n K extends string,\n MC extends Record<string, TransComponent[]>,\n> = K extends keyof MC\n ? MC[K] extends []\n ? { components?: never }\n : { components: MC[K] }\n : { components?: TransComponent[] };\n\n/**\n * Key-only mode props - when looking up by id.\n * Values are required if the message has {placeholders}.\n * Components are required if the message has <0>tags</0>.\n */\nexport type TransKeyOnlyModeProps<\n K extends string,\n MV extends Record<string, Record<string, unknown>>,\n MC extends Record<string, TransComponent[]>,\n> = TransKeyOnlyBaseProps<K> &\n TransValuesProps<K, MV> &\n TransComponentsProps<K, MC>;\n\n/**\n * Creates a typed Trans component that supports both inline and key-only modes.\n *\n * @example\n * // In generated idioma/index.ts:\n * export const Trans = createTrans<IdiomaTypes>()\n *\n * // Inline mode (dev, Babel extracts):\n * <Trans>Hello {name}</Trans>\n *\n * // Key-only mode (typed lookup):\n * <Trans id=\"welcome\" values={{ name: \"Ben\" }} />\n * <Trans id=\"legal.links\" components={[TermsLink, PrivacyLink]} />\n */\nexport function createTrans<C extends BaseIdiomaConfig = BaseIdiomaConfig>() {\n // Extract types from config\n type TK = C['TranslationKey'];\n type MV = C['MessageValues'];\n type MC = C['MessageComponents'];\n\n /**\n * Trans component for inline translations.\n *\n * In development and production, Babel transforms Trans to __Trans with\n * inlined translations. This function exists for type safety and to provide\n * a fallback when Babel hasn't transformed the code.\n */\n function Trans(props: TransInlineModeProps): ReactNode;\n function Trans<K extends TK>(\n props: TransKeyOnlyModeProps<\n K & string,\n MV,\n MC & Record<string, TransComponent[]>\n >,\n ): ReactNode;\n function Trans(\n props:\n | TransInlineModeProps\n | TransKeyOnlyModeProps<\n TK & string,\n MV,\n MC & Record<string, TransComponent[]>\n >,\n ): ReactNode {\n const ctx = useContext(IdiomaContext);\n if (!ctx) {\n throw new Error(\n '[idioma] Trans must be used within an IdiomaProvider. ' +\n 'Make sure to wrap your app with <IdiomaProvider>.',\n );\n }\n\n // Inline mode: children present - render them directly\n // Babel transforms this to __Trans with inlined translations\n if ('children' in props && props.children !== undefined) {\n return props.children;\n }\n\n // Key-only mode: Babel should transform this too\n // If we reach here, Babel hasn't transformed the code\n const { id } = props as TransKeyOnlyModeProps<\n TK & string,\n MV,\n MC & Record<string, TransComponent[]>\n >;\n if (id) {\n _warnNotInlined(\n `Trans:${id}`,\n `[idioma] Trans with id=\"${id}\" was not transformed by Babel. ` +\n 'Make sure @idioma/core Babel plugin is configured.',\n );\n return id;\n }\n\n throw new Error('[idioma] Trans requires either children or id prop');\n }\n\n return Trans;\n}\n"],"mappings":"uIAuFA,SAAgBG,GAA6D,CAqB3E,SAAAC,EAAAC,EAAA,CASwC,GAAA,CAA1BJ,EAAAC,EAAyB,CAC7B,MAAAK,MAEJ,0GACqD,CAAA,GAMrD,aAAcF,GAASA,EAAKG,WAAAC,IAAAA,GAAuB,OAC9CJ,EAAKG,SAKd,GAAA,CAAAE,MAAeL,EAIb,GACEK,EAKD,OAJDV,EACE,SAASU,IACT,2BAA2BA,EAAE,oFAE9B,CACMA,EAAE,MAAAH,MAGK,qDAAoD,CAGtE,OAAOH"}
@@ -1 +1 @@
1
- {"version":3,"file":"createUseT.d.ts","names":[],"sources":["../src/createUseT.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"createUseT.d.ts","names":[],"sources":["../src/createUseT.ts"],"sourcesContent":[],"mappings":";;AAuBA;;;;;AAcA;;;;;;AAImB,UAlBF,gBAAA,CAkBE;EAAK,cAAA,EAAA,MAAA;EAAG,aAAA,EAhBV,MAgBU,CAAA,MAAA,EAhBK,MAgBL,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA;EAAW,iBAAA,EAfjB,MAeiB,CAAA,MAAA,EAAA,OAAA,EAAA,CAAA;;;;AACvB,KALH,cAKG,CAAA,WAJF,MAIE,CAAA,MAAA,EAJa,MAIb,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,EAAA,WAAA,MAAA,GAHO,OAGP,CAAA,MAHqB,EAGrB,EAAA,MAAA,CAAA,CAAA,GAAA,QADP,EAKI,GAAA,MALO,EAKP,GALY,EAKK,CALF,CAKE,CAAA,SALS,MAKT,CAAA,MAAA,EAAA,KAAA,CAAA,GAAA,KAAA,GALyC,CAKzC,EACD,CAL1B,EAK0B,GAAA,MALf,EAKe,CAAA;;;AACN,KAFV,iBAEU,CAAA,WADT,MACS,CAAA,MAAA,EADM,MACN,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,EAAA,WAAA,MAAA,GAAA,OAAA,CAAA,MAAc,EAAd,EAAA,MAAA,CAAA,CAAA,GAAA,QAEd,EAAA,GAAA,MAAW,EAAX,GAAgB,EAAhB,CAAmB,CAAnB,CAAA,SAA8B,MAA9B,CAAA,MAAA,EAAA,KAAA,CAAA,GAAsD,CAAtD,GAAA,KAAA,EAAW,CACjB,EADiB,GAAA,MACN,EADM,CAAA;;;;;;AACN,KAOD,cAPC,CAAA,WAAA,MAAA,EAAA,WASA,MATA,CAAA,MAAA,EAAA,OAAA,EAAA,CAAA,CAAA,GAAA,QAWL,EAXO,GAAA,MAWI,EAXJ,GAWS,EAXT,CAWY,CAXZ,CAAA,SAAA,EAAA,GAW4B,CAX5B,GAAA,KAAA,EAOf,CAKE,EALU,GAAA,MAKC,EALD,CAAA;;;;;AAIe,KASf,mBATe,CAAA,UAAA,MAAA,CAAA,GAUzB,CAVyB,SAAA,GAAA,KAAA,EAAA,IAAA,KAAA,IAAA,IAAA,KAAA,KAAA,EAAA,GAWrB,GAXqB,GAWf,mBAXe,CAWK,IAXL,CAAA,GAAA,KAAA;;;;;AAS3B;AACE,KASU,iBATV,CAAA,UAAA,MAAA,CAAA,GAUA,mBAVA,CAUoB,CAVpB,CAAA,SAAA,KAAA,GAAA,SAAA,GAAA,QAYY,mBAXR,CAW4B,CAX5B,CAAA,GAAA,MAAA,GAAA,MAAA,EAA0B;;AAAD,KAcnB,eAdmB,CAAA,UAAA,MAAA,CAAA,GAe7B,mBAf6B,CAeT,CAfS,CAAA,SAAA,KAAA,GAAA,KAAA,GAAA,IAAA;AAQ/B;;;AAGkC,UASjB,iBAAA,CATiB;EAApB;EAAmB,OAAA,CAAA,EAAA,MAAA;EAGrB;EAMK,OAAA,CAAA,EAAA,MAAA;EAiBL;EAAoB,EAAA,CAAA,EAAA,MAAA;;;;;;;;;;AAUD,KAVnB,SAUmB,CAAA,UAVC,gBAUD,GAVoB,gBAUpB,CAAA,GAAA;EAQC,CAAA,YAblB,cAakB,CAbH,CAaG,CAAA,eAAA,CAAA,EAbiB,CAajB,CAAA,gBAAA,CAAA,CAAA,GAZ1B,cAY0B,CAZX,CAYW,CAAA,gBAAA,CAAA,EAZU,CAYV,CAAA,mBAAA,CAAA,CAAA,GAAA,MAAA,CAAA,CAAA,IAAA,EAAA;IAAoB,EAAA,EAT5C,GAS4C;IAAtC,MAAA,EARF,CAQE,CAAA,eAAA,CAAA,CARiB,GAQjB,CAAA;IACO,MAAA,CAAA,EAAA,MAAA;IAAqB,OAAA,CAAA,EAAA,MAAA;IAApC,EAAA,CAAA,EAAA,MAAA;EAGE,CAAA,CAAA,EAAA,MAAA;EAWoB,CAAA,YAfd,iBAec,CAfI,CAeJ,CAAA,eAAA,CAAA,EAfwB,CAexB,CAAA,gBAAA,CAAA,CAAA,GAdtB,cAcsB,CAdP,CAcO,CAAA,gBAAA,CAAA,EAdc,CAcd,CAAA,mBAAA,CAAA,CAAA,GAAA,MAAA,CAAA,CAAA,IAAA,EAAA;IAAhB,EAAA,EAXJ,GAWI;IAAkC,MAAA,CAAA,EAAA,KAAA;IAChB,MAAA,CAAA,EAAA,MAAA;IAAlB,OAAA,CAAA,EAAA,MAAA;IAKgB,EAAA,CAAA,EAAA,MAAA;EAAhB,CAAA,CAAA,EAAA,MAAA;EAAmC,CAAA,UAAA,MAAA,CAAA,CAAA,MAAA,EANnC,eAMmC,CANnB,CAMmB,CAAA,SAAA,IAAA,GAND,CAMC,GAAA,KAAA,EAAA,MAAA,EALnC,iBAKmC,CALjB,CAKiB,CAAA,CAAA,EAAA,MAAA;EAKnC,CAAA,UAAA,MAAA,CAAA,CAAA,MAAA,EALA,eAKA,CALgB,CAKhB,CAAA,SAAA,KAAA,GALmC,CAKnC,GAAA,KAAA,CAAA,EAAA,MAAA;EACkB,CAAA,UAAA,MAAA,CAAA,CAAA,MAAA,EADlB,CACkB,EAAA,MAAA,EAAlB,iBAAkB,CAAA,CAAA,CAAA,EAAA,OAAA,EACjB,iBADiB,CAAA,EAAA,MAAA;CAAlB;AACC,iBAoCG,UApCH,CAAA,UAqCD,gBArCC,GAqCkB,gBArClB,CAAA,CAAA,CAAA,EAAA,GAAA,GAsCF,SAtCE,CAsCQ,CAtCR,CAAA"}
@@ -1,2 +1,2 @@
1
- import{IdiomaContext as e}from"./context.js";import{interpolateValues as t}from"./interpolate.js";import{useCallback as n,useContext as r}from"react";function i(){return function(){let i=r(e);if(!i)throw Error(`[idioma] useT must be used within an IdiomaProvider. Make sure to wrap your app with <IdiomaProvider>.`);let{locale:a}=i;return n((e,n,r)=>{if(typeof e==`object`){let{id:n,source:r,values:i}=e;console.warn(`[idioma] t({ id: "${n}" }) was not transformed by Babel. Make sure @idioma/core Babel plugin is configured.`);let a=r||n;return i&&Object.keys(i).length>0?t(a,i):a}let i=e,o=n,s;if(n&&typeof n==`object`&&`__m`in n&&(s=n.__m,o=r),!s)return o&&Object.keys(o).length>0?t(i,o):i;let c=s[a]??Object.values(s)[0];return c===void 0?o&&Object.keys(o).length>0?t(i,o):i:typeof c==`function`?c(o||{}):o&&Object.keys(o).length>0?t(c,o):c},[a])}}export{i as createUseT};
1
+ import{IdiomaContext as e}from"./context.js";import{interpolateValues as t}from"./interpolate.js";import{useCallback as n,useContext as r}from"react";import{_warnNotInlined as i}from"@idioma/core/runtime";function a(){return function(){let a=r(e);if(!a)throw Error(`[idioma] useT must be used within an IdiomaProvider. Make sure to wrap your app with <IdiomaProvider>.`);let{locale:o}=a;return n((e,n,r)=>{if(typeof e==`object`){let{id:n,source:r,values:a}=e;i(`t:${n}`,`[idioma] t({ id: "${n}" }) was not transformed by Babel. Make sure @idioma/core Babel plugin is configured.`);let o=r||n;return a&&Object.keys(a).length>0?t(o,a):o}let a=e,s=n,c;if(n&&typeof n==`object`&&`__m`in n&&(c=n.__m,s=r),!c)return s&&Object.keys(s).length>0?t(a,s):a;let l=c[o]??Object.values(c)[0];return l===void 0?s&&Object.keys(s).length>0?t(a,s):a:typeof l==`function`?l(s||{}):s&&Object.keys(s).length>0?t(l,s):l},[o])}}export{a as createUseT};
2
2
  //# sourceMappingURL=createUseT.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createUseT.js","names":["useCallback","useContext","IdiomaContext","interpolateValues","createUseT","useT","ctx","Error","locale","sourceOrArgs","values","options","id","source","objValues","console","warn","fallbackText","Object","keys","length","actualValues","localeMessages","__m","msg","undefined"],"sources":["../src/createUseT.ts"],"sourcesContent":["import { useCallback, useContext } from 'react';\nimport { IdiomaContext } from './context';\nimport { interpolateValues } from './interpolate';\n\ntype MessageFunction = (args: Record<string, unknown>) => string;\n\n// =============================================================================\n// IdiomaTypes - Single type parameter for cleaner API\n// =============================================================================\n\n/**\n * Base interface for project-specific Idioma types.\n * Generated by the compiler in types.d.ts.\n *\n * @example\n * // In generated types.d.ts:\n * export interface IdiomaTypes {\n * TranslationKey: 'greeting' | 'farewell';\n * MessageValues: { greeting: { name: string } };\n * MessageComponents: { greeting: [] };\n * }\n */\nexport interface BaseIdiomaConfig {\n TranslationKey: string;\n MessageValues: Record<string, Record<string, unknown>>;\n MessageComponents: Record<string, unknown[]>;\n}\n\n// =============================================================================\n// Helper Types for Strict Typing\n// =============================================================================\n\n// --- Key-only mode helpers ---\n\n/** Keys in MessageValues that have at least one required value.\n * TK filters to specific TranslationKey union, excluding index signature keys. */\nexport type KeysWithValues<\n MV extends Record<string, Record<string, unknown>>,\n TK extends string = Extract<keyof MV, string>,\n> = {\n [K in TK & keyof MV]: MV[K] extends Record<string, never> ? never : K;\n}[TK & keyof MV];\n\n/** Keys in MessageValues that have no required values.\n * TK filters to specific TranslationKey union, excluding index signature keys. */\nexport type KeysWithoutValues<\n MV extends Record<string, Record<string, unknown>>,\n TK extends string = Extract<keyof MV, string>,\n> = {\n [K in TK & keyof MV]: MV[K] extends Record<string, never> ? K : never;\n}[TK & keyof MV];\n\n/**\n * Derive string-only keys from TranslationKey + MessageComponents.\n * Keys with empty component arrays [] can be used with useT.\n * Keys with non-empty component arrays [TransComponent, ...] must use Trans.\n */\nexport type StringOnlyKeys<\n TK extends string,\n MC extends Record<string, unknown[]>,\n> = {\n [K in TK & keyof MC]: MC[K] extends [] ? K : never;\n}[TK & keyof MC];\n\n// --- Source text mode helpers ---\n\n/**\n * Recursively extract placeholder names from a template string.\n * \"Hello {name}, you have {count} items\" → \"name\" | \"count\"\n */\nexport type ExtractPlaceholders<S extends string> =\n S extends `${infer _}{${infer Key}}${infer Rest}`\n ? Key | ExtractPlaceholders<Rest>\n : never;\n\n/**\n * Build the required values object from extracted placeholders.\n * \"Hello {name}\" → { name: string | number }\n * \"No placeholders\" → undefined\n */\nexport type PlaceholderValues<S extends string> =\n ExtractPlaceholders<S> extends never\n ? undefined\n : { [K in ExtractPlaceholders<S>]: string | number };\n\n/** Check if a string has any placeholders */\nexport type HasPlaceholders<S extends string> =\n ExtractPlaceholders<S> extends never ? false : true;\n\n/**\n * Source text mode options: t(\"Submit\", undefined, { context: \"button\", ns: \"common\" })\n */\nexport interface SourceTextOptions {\n /** Translator context (changes key hash) */\n context?: string;\n /** Translator comment (extracted to PO #. comment for translators) */\n comment?: string;\n /** Namespace for scoped lookups (placeholder for future) */\n ns?: string;\n}\n\n/**\n * Type for the t function returned by useT.\n * Supports both source text mode and key-only mode with full type safety.\n *\n * @template C - IdiomaTypes interface containing TranslationKey, MessageValues, MessageComponents\n *\n * The TFunction only accepts keys where MessageComponents[K] is an empty array (string-only keys).\n */\nexport type TFunction<C extends BaseIdiomaConfig = BaseIdiomaConfig> = {\n // === Key-only mode ===\n\n // Keys that require values (only string-only keys allowed)\n <\n K extends KeysWithValues<C['MessageValues'], C['TranslationKey']> &\n StringOnlyKeys<C['TranslationKey'], C['MessageComponents']> &\n string,\n >(args: {\n id: K;\n values: C['MessageValues'][K];\n source?: string;\n context?: string;\n ns?: string;\n }): string;\n\n // Keys that don't require values (only string-only keys allowed)\n <\n K extends KeysWithoutValues<C['MessageValues'], C['TranslationKey']> &\n StringOnlyKeys<C['TranslationKey'], C['MessageComponents']> &\n string,\n >(args: {\n id: K;\n values?: never;\n source?: string;\n context?: string;\n ns?: string;\n }): string;\n\n // === Source text mode ===\n\n // Source text WITH placeholders - values required\n <S extends string>(\n source: HasPlaceholders<S> extends true ? S : never,\n values: PlaceholderValues<S>,\n ): string;\n\n // Source text WITHOUT placeholders - no values\n <S extends string>(\n source: HasPlaceholders<S> extends false ? S : never,\n ): string;\n\n // Source text with options (3rd arg)\n <S extends string>(\n source: S,\n values: PlaceholderValues<S>,\n options: SourceTextOptions,\n ): string;\n};\n\n/**\n * Creates a typed useT hook for imperative translations.\n *\n * Supports both source text mode and key-only mode:\n * - Source text: t('Hello world!') - hashes and looks up\n * - Key-only: t({ id: 'welcome' }) - direct key lookup\n *\n * Only works with messages that don't require component interpolation,\n * since it returns a string. For messages with <0>...</0> tags, use <Trans>.\n *\n * @example\n * // In generated idioma/index.ts:\n * export const useT = createUseT<IdiomaTypes>()\n *\n * // Usage:\n * const t = useT()\n * t('Hello world!') // source text mode\n * t('Hello {name}', { name: 'Ben' }) // with values (2nd arg)\n * t('Submit', undefined, { context: 'button' }) // with options (3rd arg)\n * t('Hello {name}', { name: 'Ben' }, { context: 'greeting' }) // both\n * t({ id: 'welcome' }) // key-only mode\n * t({ id: 'greeting', values: { name: 'Ben' }, ns: 'common' }) // with ns\n */\n// Internal runtime type for key-only args (untyped at runtime)\ninterface KeyOnlyArgsRuntime {\n id: string;\n source?: string;\n values?: Record<string, unknown>;\n context?: string;\n ns?: string;\n}\n\nexport function createUseT<\n C extends BaseIdiomaConfig = BaseIdiomaConfig,\n>(): () => TFunction<C> {\n /**\n * useT hook for imperative translations.\n *\n * Babel transforms t() calls to include inlined translations.\n * This hook handles the transformed calls and provides fallback behavior.\n */\n return function useT(): TFunction<C> {\n const ctx = useContext(IdiomaContext);\n if (!ctx) {\n throw new Error(\n '[idioma] useT must be used within an IdiomaProvider. ' +\n 'Make sure to wrap your app with <IdiomaProvider>.',\n );\n }\n\n const { locale } = ctx;\n\n return useCallback(\n (\n sourceOrArgs: string | KeyOnlyArgsRuntime,\n values?: Record<string, unknown>,\n options?: SourceTextOptions,\n ): string => {\n // Key-only mode: t({ id: 'welcome', source: 'Hello', values: { name }, ns: 'common' })\n // Babel should transform this, but if not, use source as fallback text\n if (typeof sourceOrArgs === 'object') {\n const { id, source, values: objValues } = sourceOrArgs;\n console.warn(\n `[idioma] t({ id: \"${id}\" }) was not transformed by Babel. ` +\n 'Make sure @idioma/core Babel plugin is configured.',\n );\n const fallbackText = source || id;\n if (objValues && Object.keys(objValues).length > 0) {\n return interpolateValues(fallbackText, objValues);\n }\n return fallbackText;\n }\n\n // Source text mode: t('Hello {name}', { name: 'Ben' }, { context: 'button' })\n // OR after Babel transformation: t('Hello {name}', { key: { en: '...', es: '...' } }, { name: 'Ben' })\n const source = sourceOrArgs;\n\n // Detect if Babel has inlined translations in arg 2\n // Babel transforms: t('src', { __m: { en: '...', es: '...' } }, { actualValues })\n let actualValues = values;\n let localeMessages:\n | Record<string, string | MessageFunction>\n | undefined;\n\n // Check if Babel has inlined translations via __m marker\n if (values && typeof values === 'object' && '__m' in values) {\n // Babel transformed: arg 2 is { __m: { en: '...', es: '...' } }\n localeMessages = (values as Record<string, unknown>).__m as Record<\n string,\n string | MessageFunction\n >;\n actualValues = options as unknown as Record<string, unknown>;\n }\n\n if (!localeMessages) {\n // Not transformed by Babel - fallback to source text\n return actualValues && Object.keys(actualValues).length > 0\n ? interpolateValues(source, actualValues)\n : source;\n }\n\n const msg = localeMessages[locale] ?? Object.values(localeMessages)[0];\n if (msg === undefined) {\n return actualValues && Object.keys(actualValues).length > 0\n ? interpolateValues(source, actualValues)\n : source;\n }\n\n if (typeof msg === 'function') {\n return msg(actualValues || {});\n }\n\n return actualValues && Object.keys(actualValues).length > 0\n ? interpolateValues(msg, actualValues)\n : msg;\n },\n [locale],\n ) as TFunction<C>;\n };\n}\n"],"mappings":"sJA+LA,SAAgBI,GAEQ,CAOtB,OAAO,UAA8B,CACnC,IAAME,EAAML,EAAWC,EAAc,CACrC,GAAI,CAACI,EACH,MAAUC,MACR,yGAED,CAGH,GAAM,CAAEC,UAAWF,EAEnB,OAAON,GAEHS,EACAC,EACAC,IACW,CAGX,GAAI,OAAOF,GAAiB,SAAU,CACpC,GAAM,CAAEG,KAAIC,OAAAA,EAAQH,OAAQI,GAAcL,EAC1CM,QAAQC,KACN,qBAAqBJ,EAAE,uFAExB,CACD,IAAMK,EAAeJ,GAAUD,EAI/B,OAHIE,GAAaI,OAAOC,KAAKL,EAAU,CAACM,OAAS,EACxCjB,EAAkBc,EAAcH,EAAU,CAE5CG,EAKT,IAAMJ,EAASJ,EAIXY,EAAeX,EACfY,EAcJ,GATIZ,GAAU,OAAOA,GAAW,UAAY,QAASA,IAEnDY,EAAkBZ,EAAmCa,IAIrDF,EAAeV,GAGb,CAACW,EAEH,OAAOD,GAAgBH,OAAOC,KAAKE,EAAa,CAACD,OAAS,EACtDjB,EAAkBU,EAAQQ,EAAa,CACvCR,EAGN,IAAMW,EAAMF,EAAed,IAAWU,OAAOR,OAAOY,EAAe,CAAC,GAWpE,OAVIE,IAAQC,IAAAA,GACHJ,GAAgBH,OAAOC,KAAKE,EAAa,CAACD,OAAS,EACtDjB,EAAkBU,EAAQQ,EAAa,CACvCR,EAGF,OAAOW,GAAQ,WACVA,EAAIH,GAAgB,EAAE,CAAC,CAGzBA,GAAgBH,OAAOC,KAAKE,EAAa,CAACD,OAAS,EACtDjB,EAAkBqB,EAAKH,EAAa,CACpCG,GAEN,CAAChB,EACH,CAAC"}
1
+ {"version":3,"file":"createUseT.js","names":["_warnNotInlined","useCallback","useContext","IdiomaContext","interpolateValues","createUseT","useT","ctx","Error","locale","sourceOrArgs","values","options","id","source","objValues","fallbackText","Object","keys","length","actualValues","localeMessages","__m","msg","undefined"],"sources":["../src/createUseT.ts"],"sourcesContent":["import { _warnNotInlined } from '@idioma/core/runtime';\nimport { useCallback, useContext } from 'react';\nimport { IdiomaContext } from './context';\nimport { interpolateValues } from './interpolate';\n\ntype MessageFunction = (args: Record<string, unknown>) => string;\n\n// =============================================================================\n// IdiomaTypes - Single type parameter for cleaner API\n// =============================================================================\n\n/**\n * Base interface for project-specific Idioma types.\n * Generated by the compiler in types.d.ts.\n *\n * @example\n * // In generated types.d.ts:\n * export interface IdiomaTypes {\n * TranslationKey: 'greeting' | 'farewell';\n * MessageValues: { greeting: { name: string } };\n * MessageComponents: { greeting: [] };\n * }\n */\nexport interface BaseIdiomaConfig {\n TranslationKey: string;\n MessageValues: Record<string, Record<string, unknown>>;\n MessageComponents: Record<string, unknown[]>;\n}\n\n// =============================================================================\n// Helper Types for Strict Typing\n// =============================================================================\n\n// --- Key-only mode helpers ---\n\n/** Keys in MessageValues that have at least one required value.\n * TK filters to specific TranslationKey union, excluding index signature keys. */\nexport type KeysWithValues<\n MV extends Record<string, Record<string, unknown>>,\n TK extends string = Extract<keyof MV, string>,\n> = {\n [K in TK & keyof MV]: MV[K] extends Record<string, never> ? never : K;\n}[TK & keyof MV];\n\n/** Keys in MessageValues that have no required values.\n * TK filters to specific TranslationKey union, excluding index signature keys. */\nexport type KeysWithoutValues<\n MV extends Record<string, Record<string, unknown>>,\n TK extends string = Extract<keyof MV, string>,\n> = {\n [K in TK & keyof MV]: MV[K] extends Record<string, never> ? K : never;\n}[TK & keyof MV];\n\n/**\n * Derive string-only keys from TranslationKey + MessageComponents.\n * Keys with empty component arrays [] can be used with useT.\n * Keys with non-empty component arrays [TransComponent, ...] must use Trans.\n */\nexport type StringOnlyKeys<\n TK extends string,\n MC extends Record<string, unknown[]>,\n> = {\n [K in TK & keyof MC]: MC[K] extends [] ? K : never;\n}[TK & keyof MC];\n\n// --- Source text mode helpers ---\n\n/**\n * Recursively extract placeholder names from a template string.\n * \"Hello {name}, you have {count} items\" → \"name\" | \"count\"\n */\nexport type ExtractPlaceholders<S extends string> =\n S extends `${infer _}{${infer Key}}${infer Rest}`\n ? Key | ExtractPlaceholders<Rest>\n : never;\n\n/**\n * Build the required values object from extracted placeholders.\n * \"Hello {name}\" → { name: string | number }\n * \"No placeholders\" → undefined\n */\nexport type PlaceholderValues<S extends string> =\n ExtractPlaceholders<S> extends never\n ? undefined\n : { [K in ExtractPlaceholders<S>]: string | number };\n\n/** Check if a string has any placeholders */\nexport type HasPlaceholders<S extends string> =\n ExtractPlaceholders<S> extends never ? false : true;\n\n/**\n * Source text mode options: t(\"Submit\", undefined, { context: \"button\", ns: \"common\" })\n */\nexport interface SourceTextOptions {\n /** Translator context (changes key hash) */\n context?: string;\n /** Translator comment (extracted to PO #. comment for translators) */\n comment?: string;\n /** Namespace for scoped lookups (placeholder for future) */\n ns?: string;\n}\n\n/**\n * Type for the t function returned by useT.\n * Supports both source text mode and key-only mode with full type safety.\n *\n * @template C - IdiomaTypes interface containing TranslationKey, MessageValues, MessageComponents\n *\n * The TFunction only accepts keys where MessageComponents[K] is an empty array (string-only keys).\n */\nexport type TFunction<C extends BaseIdiomaConfig = BaseIdiomaConfig> = {\n // === Key-only mode ===\n\n // Keys that require values (only string-only keys allowed)\n <\n K extends KeysWithValues<C['MessageValues'], C['TranslationKey']> &\n StringOnlyKeys<C['TranslationKey'], C['MessageComponents']> &\n string,\n >(args: {\n id: K;\n values: C['MessageValues'][K];\n source?: string;\n context?: string;\n ns?: string;\n }): string;\n\n // Keys that don't require values (only string-only keys allowed)\n <\n K extends KeysWithoutValues<C['MessageValues'], C['TranslationKey']> &\n StringOnlyKeys<C['TranslationKey'], C['MessageComponents']> &\n string,\n >(args: {\n id: K;\n values?: never;\n source?: string;\n context?: string;\n ns?: string;\n }): string;\n\n // === Source text mode ===\n\n // Source text WITH placeholders - values required\n <S extends string>(\n source: HasPlaceholders<S> extends true ? S : never,\n values: PlaceholderValues<S>,\n ): string;\n\n // Source text WITHOUT placeholders - no values\n <S extends string>(\n source: HasPlaceholders<S> extends false ? S : never,\n ): string;\n\n // Source text with options (3rd arg)\n <S extends string>(\n source: S,\n values: PlaceholderValues<S>,\n options: SourceTextOptions,\n ): string;\n};\n\n/**\n * Creates a typed useT hook for imperative translations.\n *\n * Supports both source text mode and key-only mode:\n * - Source text: t('Hello world!') - hashes and looks up\n * - Key-only: t({ id: 'welcome' }) - direct key lookup\n *\n * Only works with messages that don't require component interpolation,\n * since it returns a string. For messages with <0>...</0> tags, use <Trans>.\n *\n * @example\n * // In generated idioma/index.ts:\n * export const useT = createUseT<IdiomaTypes>()\n *\n * // Usage:\n * const t = useT()\n * t('Hello world!') // source text mode\n * t('Hello {name}', { name: 'Ben' }) // with values (2nd arg)\n * t('Submit', undefined, { context: 'button' }) // with options (3rd arg)\n * t('Hello {name}', { name: 'Ben' }, { context: 'greeting' }) // both\n * t({ id: 'welcome' }) // key-only mode\n * t({ id: 'greeting', values: { name: 'Ben' }, ns: 'common' }) // with ns\n */\n// Internal runtime type for key-only args (untyped at runtime)\ninterface KeyOnlyArgsRuntime {\n id: string;\n source?: string;\n values?: Record<string, unknown>;\n context?: string;\n ns?: string;\n}\n\nexport function createUseT<\n C extends BaseIdiomaConfig = BaseIdiomaConfig,\n>(): () => TFunction<C> {\n /**\n * useT hook for imperative translations.\n *\n * Babel transforms t() calls to include inlined translations.\n * This hook handles the transformed calls and provides fallback behavior.\n */\n return function useT(): TFunction<C> {\n const ctx = useContext(IdiomaContext);\n if (!ctx) {\n throw new Error(\n '[idioma] useT must be used within an IdiomaProvider. ' +\n 'Make sure to wrap your app with <IdiomaProvider>.',\n );\n }\n\n const { locale } = ctx;\n\n return useCallback(\n (\n sourceOrArgs: string | KeyOnlyArgsRuntime,\n values?: Record<string, unknown>,\n options?: SourceTextOptions,\n ): string => {\n // Key-only mode: t({ id: 'welcome', source: 'Hello', values: { name }, ns: 'common' })\n // Babel should transform this, but if not, use source as fallback text\n if (typeof sourceOrArgs === 'object') {\n const { id, source, values: objValues } = sourceOrArgs;\n _warnNotInlined(\n `t:${id}`,\n `[idioma] t({ id: \"${id}\" }) was not transformed by Babel. ` +\n 'Make sure @idioma/core Babel plugin is configured.',\n );\n const fallbackText = source || id;\n if (objValues && Object.keys(objValues).length > 0) {\n return interpolateValues(fallbackText, objValues);\n }\n return fallbackText;\n }\n\n // Source text mode: t('Hello {name}', { name: 'Ben' }, { context: 'button' })\n // OR after Babel transformation: t('Hello {name}', { key: { en: '...', es: '...' } }, { name: 'Ben' })\n const source = sourceOrArgs;\n\n // Detect if Babel has inlined translations in arg 2\n // Babel transforms: t('src', { __m: { en: '...', es: '...' } }, { actualValues })\n let actualValues = values;\n let localeMessages:\n | Record<string, string | MessageFunction>\n | undefined;\n\n // Check if Babel has inlined translations via __m marker\n if (values && typeof values === 'object' && '__m' in values) {\n // Babel transformed: arg 2 is { __m: { en: '...', es: '...' } }\n localeMessages = (values as Record<string, unknown>).__m as Record<\n string,\n string | MessageFunction\n >;\n actualValues = options as unknown as Record<string, unknown>;\n }\n\n if (!localeMessages) {\n // Not transformed by Babel - fallback to source text\n return actualValues && Object.keys(actualValues).length > 0\n ? interpolateValues(source, actualValues)\n : source;\n }\n\n const msg = localeMessages[locale] ?? Object.values(localeMessages)[0];\n if (msg === undefined) {\n return actualValues && Object.keys(actualValues).length > 0\n ? interpolateValues(source, actualValues)\n : source;\n }\n\n if (typeof msg === 'function') {\n return msg(actualValues || {});\n }\n\n return actualValues && Object.keys(actualValues).length > 0\n ? interpolateValues(msg, actualValues)\n : msg;\n },\n [locale],\n ) as TFunction<C>;\n };\n}\n"],"mappings":"6MAgMA,SAAgBK,GAEQ,CAOtB,OAAO,UAA8B,CACnC,IAAME,EAAML,EAAWC,EAAc,CACrC,GAAI,CAACI,EACH,MAAUC,MACR,yGAED,CAGH,GAAM,CAAEC,UAAWF,EAEnB,OAAON,GAEHS,EACAC,EACAC,IACW,CAGX,GAAI,OAAOF,GAAiB,SAAU,CACpC,GAAM,CAAEG,KAAIC,OAAAA,EAAQH,OAAQI,GAAcL,EAC1CV,EACE,KAAKa,IACL,qBAAqBA,EAAE,uFAExB,CACD,IAAMG,EAAeF,GAAUD,EAI/B,OAHIE,GAAaE,OAAOC,KAAKH,EAAU,CAACI,OAAS,EACxCf,EAAkBY,EAAcD,EAAU,CAE5CC,EAKT,IAAMF,EAASJ,EAIXU,EAAeT,EACfU,EAcJ,GATIV,GAAU,OAAOA,GAAW,UAAY,QAASA,IAEnDU,EAAkBV,EAAmCW,IAIrDF,EAAeR,GAGb,CAACS,EAEH,OAAOD,GAAgBH,OAAOC,KAAKE,EAAa,CAACD,OAAS,EACtDf,EAAkBU,EAAQM,EAAa,CACvCN,EAGN,IAAMS,EAAMF,EAAeZ,IAAWQ,OAAON,OAAOU,EAAe,CAAC,GAWpE,OAVIE,IAAQC,IAAAA,GACHJ,GAAgBH,OAAOC,KAAKE,EAAa,CAACD,OAAS,EACtDf,EAAkBU,EAAQM,EAAa,CACvCN,EAGF,OAAOS,GAAQ,WACVA,EAAIH,GAAgB,EAAE,CAAC,CAGzBA,GAAgBH,OAAOC,KAAKE,EAAa,CAACD,OAAS,EACtDf,EAAkBmB,EAAKH,EAAa,CACpCG,GAEN,CAACd,EACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/runtime-suspense/index.tsx"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/runtime-suspense/index.tsx"],"sourcesContent":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@idioma/react",
3
- "version": "0.3.1",
3
+ "version": "0.4.0",
4
4
  "description": "Compile-time React i18n - runtime package",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -54,7 +54,7 @@
54
54
  ],
55
55
  "license": "MIT",
56
56
  "dependencies": {
57
- "@idioma/core": "0.3.1"
57
+ "@idioma/core": "0.4.0"
58
58
  },
59
59
  "scripts": {
60
60
  "build": "tsdown",