@arch-cadre/intl 0.0.24 → 0.0.28

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":"index.mjs","names":["React"],"sources":["../../src/client/index.ts"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { createContext, useContext } from \"react\";\nimport { formatMessage, getNestedMessage } from \"../shared/utils.js\";\nimport type { AbstractIntlMessages, TranslationKeys } from \"../types.js\";\n\ntype ContextType = {\n locale: string;\n messages: AbstractIntlMessages;\n};\n\nconst CONTEXT_SYMBOL = Symbol.for(\"kryo-intl-context\");\nconst IntlContext =\n (globalThis as any)[CONTEXT_SYMBOL] ||\n createContext<ContextType | null>(null);\n\nif (!(globalThis as any)[CONTEXT_SYMBOL]) {\n (globalThis as any)[CONTEXT_SYMBOL] = IntlContext;\n}\n\nexport function I18nProvider({\n children,\n locale,\n messages,\n}: {\n children: React.ReactNode;\n locale: string;\n messages: AbstractIntlMessages;\n}) {\n return React.createElement(\n IntlContext.Provider,\n { value: { locale, messages } },\n children,\n );\n}\n\nexport function useLocale() {\n const context = useContext(IntlContext) as ContextType | null;\n if (!context) {\n throw new Error(\"useLocale must be used within I18nProvider\");\n }\n return context.locale;\n}\n\n/**\n * Client-side hook for translations with IntelliSense support.\n */\nexport function useTranslation() {\n const context = useContext(IntlContext) as ContextType | null;\n if (!context) {\n throw new Error(\"useTranslation must be used within I18nProvider\");\n }\n\n const { messages, locale } = context;\n\n const t = (key: TranslationKeys, values?: Record<string, any>) => {\n const message = getNestedMessage(messages, String(key));\n\n if (typeof message !== \"string\") {\n return String(key);\n }\n\n return formatMessage(message, values);\n };\n\n return { t, locale };\n}\n\nexport const useTranslations = useTranslation;\n"],"mappings":"qKAYA,MAAM,EAAiB,OAAO,IAAI,oBAAoB,CAChD,EACH,WAAmB,IACpB,EAAkC,KAAK,CAEnC,WAAmB,KACtB,WAAmB,GAAkB,GAGxC,SAAgB,EAAa,CAC3B,WACA,SACA,YAKC,CACD,OAAOA,EAAM,cACX,EAAY,SACZ,CAAE,MAAO,CAAE,SAAQ,WAAU,CAAE,CAC/B,EACD,CAGH,SAAgB,GAAY,CAC1B,IAAM,EAAU,EAAW,EAAY,CACvC,GAAI,CAAC,EACH,MAAU,MAAM,6CAA6C,CAE/D,OAAO,EAAQ,OAMjB,SAAgB,GAAiB,CAC/B,IAAM,EAAU,EAAW,EAAY,CACvC,GAAI,CAAC,EACH,MAAU,MAAM,kDAAkD,CAGpE,GAAM,CAAE,WAAU,UAAW,EAY7B,MAAO,CAAE,GAVE,EAAsB,IAAiC,CAChE,IAAM,EAAU,EAAiB,EAAU,OAAO,EAAI,CAAC,CAMvD,OAJI,OAAO,GAAY,SAIhB,EAAc,EAAS,EAAO,CAH5B,OAAO,EAAI,EAMV,SAAQ,CAGtB,MAAa,EAAkB"}
1
+ {"version":3,"file":"index.mjs","names":["React"],"sources":["../../src/client/index.ts"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { createContext, useContext } from \"react\";\nimport { formatMessage, getNestedMessage } from \"../shared/utils\";\nimport type { AbstractIntlMessages, TranslationKeys } from \"../types\";\n\ntype ContextType = {\n locale: string;\n messages: AbstractIntlMessages;\n};\n\nconst CONTEXT_SYMBOL = Symbol.for(\"kryo-intl-context\");\nconst IntlContext =\n (globalThis as any)[CONTEXT_SYMBOL] ||\n createContext<ContextType | null>(null);\n\nif (!(globalThis as any)[CONTEXT_SYMBOL]) {\n (globalThis as any)[CONTEXT_SYMBOL] = IntlContext;\n}\n\nexport function I18nProvider({\n children,\n locale,\n messages,\n}: {\n children: React.ReactNode;\n locale: string;\n messages: AbstractIntlMessages;\n}) {\n return React.createElement(\n IntlContext.Provider,\n { value: { locale, messages } },\n children,\n );\n}\n\nexport function useLocale() {\n const context = useContext(IntlContext) as ContextType | null;\n if (!context) {\n throw new Error(\"useLocale must be used within I18nProvider\");\n }\n return context.locale;\n}\n\n/**\n * Client-side hook for translations with IntelliSense support.\n */\nexport function useTranslation() {\n const context = useContext(IntlContext) as ContextType | null;\n if (!context) {\n throw new Error(\"useTranslation must be used within I18nProvider\");\n }\n\n const { messages, locale } = context;\n\n const t = (key: TranslationKeys, values?: Record<string, any>) => {\n const message = getNestedMessage(messages, String(key));\n\n if (typeof message !== \"string\") {\n return String(key);\n }\n\n return formatMessage(message, values);\n };\n\n return { t, locale };\n}\n\nexport const useTranslations = useTranslation;\n"],"mappings":"qKAYA,MAAM,EAAiB,OAAO,IAAI,oBAAoB,CAChD,EACH,WAAmB,IACpB,EAAkC,KAAK,CAEnC,WAAmB,KACtB,WAAmB,GAAkB,GAGxC,SAAgB,EAAa,CAC3B,WACA,SACA,YAKC,CACD,OAAOA,EAAM,cACX,EAAY,SACZ,CAAE,MAAO,CAAE,SAAQ,WAAU,CAAE,CAC/B,EACD,CAGH,SAAgB,GAAY,CAC1B,IAAM,EAAU,EAAW,EAAY,CACvC,GAAI,CAAC,EACH,MAAU,MAAM,6CAA6C,CAE/D,OAAO,EAAQ,OAMjB,SAAgB,GAAiB,CAC/B,IAAM,EAAU,EAAW,EAAY,CACvC,GAAI,CAAC,EACH,MAAU,MAAM,kDAAkD,CAGpE,GAAM,CAAE,WAAU,UAAW,EAY7B,MAAO,CAAE,GAVE,EAAsB,IAAiC,CAChE,IAAM,EAAU,EAAiB,EAAU,OAAO,EAAI,CAAC,CAMvD,OAJI,OAAO,GAAY,SAIhB,EAAc,EAAS,EAAO,CAH5B,OAAO,EAAI,EAMV,SAAQ,CAGtB,MAAa,EAAkB"}
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`../shared/utils.cjs`),n=require(`../client/index.cjs`),r=require(`../shared/constants.cjs`),i=require(`./module-loader.cjs`);let a=require(`react`);a=e.__toESM(a);let o=require(`node:fs/promises`);o=e.__toESM(o);let s=require(`node:path`);s=e.__toESM(s);let c=require(`@formatjs/intl-localematcher`),l=require(`negotiator`);l=e.__toESM(l);let u=require(`next/headers`);function d(e,t){let n={...e};for(let r of Object.keys(t))t[r]instanceof Object&&r in e&&e[r]instanceof Object?n[r]=d(e[r],t[r]):n[r]=t[r];return n}let f=null;function p(e){f=Array.from(new Set([...f||[],...e]))}async function m(e,t){(f===null||f.length===0)&&p(await i.discoverLocalePaths());let n={},r=s.default.join(process.cwd(),`locales`),a=new Set;if(f)for(let e of f)a.add(e);if(t)for(let e of t)a.add(e);a.add(r);for(let t of Array.from(a)){let r=s.default.join(t,e);try{await o.default.access(r);let e=await o.default.readdir(r);for(let t of e)if(t.endsWith(`.json`)){let e=s.default.join(r,t),i=await o.default.readFile(e,`utf-8`),a=JSON.parse(i);n=d(n,a)}}catch{}}return n}function h(e,t){let n=(0,u.headers)();return(0,c.match)(new l.default({headers:Object.fromEntries(n.entries())}).languages(),e,t)}async function g({children:e}){let t=(await(0,u.cookies)()).get(r.COOKIE_NAME)?.value||r.DEFAULT_LOCALE,i=await m(t);return a.default.createElement(n.I18nProvider,{locale:t,messages:i},e)}async function _(){let e=(await(0,u.cookies)()).get(r.COOKIE_NAME)?.value||r.DEFAULT_LOCALE,n=await m(e);return{t:(e,r)=>{let i=t.getNestedMessage(n,String(e));return typeof i==`string`?t.formatMessage(i,r):String(e)},locale:e}}exports.I18nProvider=g,exports.detectLocale=h,exports.discoverLocalePaths=i.discoverLocalePaths,exports.getMessages=m,exports.getModuleLocalePaths=i.getModuleLocalePaths,exports.getTranslation=_,exports.registerLocalePaths=p;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`../shared/utils.cjs`),n=require(`../client/index.cjs`),r=require(`../shared/constants.cjs`),i=require(`./module-loader.cjs`);let a=require(`react`);a=e.__toESM(a);let o=require(`node:fs/promises`);o=e.__toESM(o);let s=require(`node:path`);s=e.__toESM(s);let c=require(`@formatjs/intl-localematcher`),l=require(`negotiator`);l=e.__toESM(l);let u=require(`next/headers`);function d(e,t){let n={...e};for(let r of Object.keys(t))t[r]instanceof Object&&r in e&&e[r]instanceof Object?n[r]=d(e[r],t[r]):n[r]=t[r];return n}let f=null;function p(e){f=Array.from(new Set([...f||[],...e]))}async function m(e,t){(f===null||f.length===0)&&p(await i.discoverLocalePaths());let n={},r=s.default.join(process.cwd(),`locales`),a=new Set;if(f)for(let e of f)a.add(e);if(t)for(let e of t)a.add(e);a.add(r);for(let t of Array.from(a)){let r=s.default.join(t,e);try{await o.default.access(r);let e=await o.default.readdir(r);for(let t of e)if(t.endsWith(`on`)){let e=s.default.join(r,t),i=await o.default.readFile(e,`utf-8`),a=JSON.parse(i);n=d(n,a)}}catch{}}return n}function h(e,t){let n=(0,u.headers)();return(0,c.match)(new l.default({headers:Object.fromEntries(n.entries())}).languages(),e,t)}async function g({children:e}){let t=(await(0,u.cookies)()).get(r.COOKIE_NAME)?.value||r.DEFAULT_LOCALE,i=await m(t);return a.default.createElement(n.I18nProvider,{locale:t,messages:i},e)}async function _(){let e=(await(0,u.cookies)()).get(r.COOKIE_NAME)?.value||r.DEFAULT_LOCALE,n=await m(e);return{t:(e,r)=>{let i=t.getNestedMessage(n,String(e));return typeof i==`string`?t.formatMessage(i,r):String(e)},locale:e}}exports.I18nProvider=g,exports.detectLocale=h,exports.discoverLocalePaths=i.discoverLocalePaths,exports.getMessages=m,exports.getModuleLocalePaths=i.getModuleLocalePaths,exports.getTranslation=_,exports.registerLocalePaths=p;
@@ -1,2 +1,2 @@
1
- import{formatMessage as e,getNestedMessage as t}from"../shared/utils.mjs";import{I18nProvider as n}from"../client/index.mjs";import{COOKIE_NAME as r,DEFAULT_LOCALE as i}from"../shared/constants.mjs";import{discoverLocalePaths as a,getModuleLocalePaths as o}from"./module-loader.mjs";import s from"react";import c from"node:fs/promises";import l from"node:path";import{match as u}from"@formatjs/intl-localematcher";import d from"negotiator";import{cookies as f,headers as p}from"next/headers";function m(e,t){let n={...e};for(let r of Object.keys(t))t[r]instanceof Object&&r in e&&e[r]instanceof Object?n[r]=m(e[r],t[r]):n[r]=t[r];return n}let h=null;function g(e){h=Array.from(new Set([...h||[],...e]))}async function _(e,t){(h===null||h.length===0)&&g(await a());let n={},r=l.join(process.cwd(),`locales`),i=new Set;if(h)for(let e of h)i.add(e);if(t)for(let e of t)i.add(e);i.add(r);for(let t of Array.from(i)){let r=l.join(t,e);try{await c.access(r);let e=await c.readdir(r);for(let t of e)if(t.endsWith(`.json`)){let e=l.join(r,t),i=await c.readFile(e,`utf-8`),a=JSON.parse(i);n=m(n,a)}}catch{}}return n}function v(e,t){let n=p();return u(new d({headers:Object.fromEntries(n.entries())}).languages(),e,t)}async function y({children:e}){let t=(await f()).get(r)?.value||i,a=await _(t);return s.createElement(n,{locale:t,messages:a},e)}async function b(){let n=(await f()).get(r)?.value||i,a=await _(n);return{t:(n,r)=>{let i=t(a,String(n));return typeof i==`string`?e(i,r):String(n)},locale:n}}export{y as I18nProvider,v as detectLocale,a as discoverLocalePaths,_ as getMessages,o as getModuleLocalePaths,b as getTranslation,g as registerLocalePaths};
1
+ import{formatMessage as e,getNestedMessage as t}from"../shared/utils.mjs";import{I18nProvider as n}from"../client/index.mjs";import{COOKIE_NAME as r,DEFAULT_LOCALE as i}from"../shared/constants.mjs";import{discoverLocalePaths as a,getModuleLocalePaths as o}from"./module-loader.mjs";import s from"react";import c from"node:fs/promises";import l from"node:path";import{match as u}from"@formatjs/intl-localematcher";import d from"negotiator";import{cookies as f,headers as p}from"next/headers";function m(e,t){let n={...e};for(let r of Object.keys(t))t[r]instanceof Object&&r in e&&e[r]instanceof Object?n[r]=m(e[r],t[r]):n[r]=t[r];return n}let h=null;function g(e){h=Array.from(new Set([...h||[],...e]))}async function _(e,t){(h===null||h.length===0)&&g(await a());let n={},r=l.join(process.cwd(),`locales`),i=new Set;if(h)for(let e of h)i.add(e);if(t)for(let e of t)i.add(e);i.add(r);for(let t of Array.from(i)){let r=l.join(t,e);try{await c.access(r);let e=await c.readdir(r);for(let t of e)if(t.endsWith(`on`)){let e=l.join(r,t),i=await c.readFile(e,`utf-8`),a=JSON.parse(i);n=m(n,a)}}catch{}}return n}function v(e,t){let n=p();return u(new d({headers:Object.fromEntries(n.entries())}).languages(),e,t)}async function y({children:e}){let t=(await f()).get(r)?.value||i,a=await _(t);return s.createElement(n,{locale:t,messages:a},e)}async function b(){let n=(await f()).get(r)?.value||i,a=await _(n);return{t:(n,r)=>{let i=t(a,String(n));return typeof i==`string`?e(i,r):String(n)},locale:n}}export{y as I18nProvider,v as detectLocale,a as discoverLocalePaths,_ as getMessages,o as getModuleLocalePaths,b as getTranslation,g as registerLocalePaths};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["ClientProvider"],"sources":["../../src/server/index.ts"],"sourcesContent":["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { match } from \"@formatjs/intl-localematcher\";\nimport Negotiator from \"negotiator\";\nimport { cookies, headers } from \"next/headers\";\nimport React from \"react\";\nimport { I18nProvider as ClientProvider } from \"../client/index.js\";\nimport { COOKIE_NAME, DEFAULT_LOCALE } from \"../shared/constants.js\";\nimport { formatMessage, getNestedMessage } from \"../shared/utils.js\";\nimport type {\n AbstractIntlMessages,\n NestedKeyOf,\n TranslationKeys,\n} from \"../types.js\";\nimport { discoverLocalePaths } from \"./module-loader.js\";\n\nfunction deepMerge(target: any, source: any) {\n const result = { ...target };\n for (const key of Object.keys(source)) {\n if (\n source[key] instanceof Object &&\n key in target &&\n target[key] instanceof Object\n ) {\n result[key] = deepMerge(target[key], source[key]);\n } else {\n result[key] = source[key];\n }\n }\n return result;\n}\n\n// Internal state for locale paths\nlet registeredPaths: string[] | null = null;\n\n/**\n * Register additional directories to search for locales.\n * Can be called multiple times, but usually called once in RootLayout.\n */\nexport function registerLocalePaths(paths: string[]) {\n registeredPaths = Array.from(new Set([...(registeredPaths || []), ...paths]));\n}\n\nexport async function getMessages(\n locale: string,\n searchDirectories?: string[],\n) {\n // Auto-discovery if no paths registered\n if (registeredPaths === null || registeredPaths.length === 0) {\n const discovered = await discoverLocalePaths();\n registerLocalePaths(discovered);\n }\n\n let messages: AbstractIntlMessages = {};\n\n const defaultDir = path.join(process.cwd(), \"locales\");\n\n // Use provided paths, or registered paths, or just default\n const directoriesToScan = new Set<string>();\n\n if (registeredPaths) {\n for (const p of registeredPaths) directoriesToScan.add(p);\n }\n if (searchDirectories) {\n for (const p of searchDirectories) directoriesToScan.add(p);\n }\n directoriesToScan.add(defaultDir);\n\n for (const dir of Array.from(directoriesToScan)) {\n const localeDir = path.join(dir, locale);\n try {\n await fs.access(localeDir);\n const files = await fs.readdir(localeDir);\n\n for (const file of files) {\n if (file.endsWith(\".json\")) {\n const filePath = path.join(localeDir, file);\n const fileContent = await fs.readFile(filePath, \"utf-8\");\n const jsonContent = JSON.parse(fileContent);\n\n messages = deepMerge(messages, jsonContent);\n }\n }\n } catch (error) {\n // Ignore missing directories\n }\n }\n\n return messages;\n}\n\nexport function detectLocale(\n supportedLocales: string[],\n defaultLocale: string,\n) {\n const headerList = headers();\n const languages = new Negotiator({\n headers: Object.fromEntries((headerList as any).entries()),\n }).languages();\n\n return match(languages, supportedLocales, defaultLocale);\n}\n\n/**\n * Smart Server Component that handles locale detection and message loading automatically.\n */\nexport async function I18nProvider({\n children,\n}: {\n children: React.ReactNode;\n}) {\n const cookieStore = await cookies();\n const locale = cookieStore.get(COOKIE_NAME)?.value || DEFAULT_LOCALE;\n const messages = await getMessages(locale);\n\n // @ts-expect-error\n return React.createElement(ClientProvider, { locale, messages }, children);\n}\n\nexport * from \"./module-loader.js\";\n\nexport async function getTranslation() {\n const cookieStore = await cookies();\n const locale = cookieStore.get(COOKIE_NAME)?.value || DEFAULT_LOCALE;\n\n // If paths haven't been registered yet, we might be in a race condition.\n // In a real production app, we might want to have a deterministic way to load these.\n const messages = await getMessages(locale);\n\n const t = (key: TranslationKeys, values?: Record<string, any>) => {\n const message = getNestedMessage(messages, String(key));\n\n if (typeof message !== \"string\") {\n return String(key);\n }\n\n return formatMessage(message, values);\n };\n\n return { t, locale };\n}\n"],"mappings":"4eAgBA,SAAS,EAAU,EAAa,EAAa,CAC3C,IAAM,EAAS,CAAE,GAAG,EAAQ,CAC5B,IAAK,IAAM,KAAO,OAAO,KAAK,EAAO,CAEjC,EAAO,aAAgB,QACvB,KAAO,GACP,EAAO,aAAgB,OAEvB,EAAO,GAAO,EAAU,EAAO,GAAM,EAAO,GAAK,CAEjD,EAAO,GAAO,EAAO,GAGzB,OAAO,EAIT,IAAI,EAAmC,KAMvC,SAAgB,EAAoB,EAAiB,CACnD,EAAkB,MAAM,KAAK,IAAI,IAAI,CAAC,GAAI,GAAmB,EAAE,CAAG,GAAG,EAAM,CAAC,CAAC,CAG/E,eAAsB,EACpB,EACA,EACA,EAEI,IAAoB,MAAQ,EAAgB,SAAW,IAEzD,EADmB,MAAM,GAAqB,CACf,CAGjC,IAAI,EAAiC,EAAE,CAEjC,EAAa,EAAK,KAAK,QAAQ,KAAK,CAAE,UAAU,CAGhD,EAAoB,IAAI,IAE9B,GAAI,EACF,IAAK,IAAM,KAAK,EAAiB,EAAkB,IAAI,EAAE,CAE3D,GAAI,EACF,IAAK,IAAM,KAAK,EAAmB,EAAkB,IAAI,EAAE,CAE7D,EAAkB,IAAI,EAAW,CAEjC,IAAK,IAAM,KAAO,MAAM,KAAK,EAAkB,CAAE,CAC/C,IAAM,EAAY,EAAK,KAAK,EAAK,EAAO,CACxC,GAAI,CACF,MAAM,EAAG,OAAO,EAAU,CAC1B,IAAM,EAAQ,MAAM,EAAG,QAAQ,EAAU,CAEzC,IAAK,IAAM,KAAQ,EACjB,GAAI,EAAK,SAAS,QAAQ,CAAE,CAC1B,IAAM,EAAW,EAAK,KAAK,EAAW,EAAK,CACrC,EAAc,MAAM,EAAG,SAAS,EAAU,QAAQ,CAClD,EAAc,KAAK,MAAM,EAAY,CAE3C,EAAW,EAAU,EAAU,EAAY,OAGjC,GAKlB,OAAO,EAGT,SAAgB,EACd,EACA,EACA,CACA,IAAM,EAAa,GAAS,CAK5B,OAAO,EAJW,IAAI,EAAW,CAC/B,QAAS,OAAO,YAAa,EAAmB,SAAS,CAAC,CAC3D,CAAC,CAAC,WAAW,CAEU,EAAkB,EAAc,CAM1D,eAAsB,EAAa,CACjC,YAGC,CAED,IAAM,GADc,MAAM,GAAS,EACR,IAAI,EAAY,EAAE,OAAS,EAChD,EAAW,MAAM,EAAY,EAAO,CAG1C,OAAO,EAAM,cAAcA,EAAgB,CAAE,SAAQ,WAAU,CAAE,EAAS,CAK5E,eAAsB,GAAiB,CAErC,IAAM,GADc,MAAM,GAAS,EACR,IAAI,EAAY,EAAE,OAAS,EAIhD,EAAW,MAAM,EAAY,EAAO,CAY1C,MAAO,CAAE,GAVE,EAAsB,IAAiC,CAChE,IAAM,EAAU,EAAiB,EAAU,OAAO,EAAI,CAAC,CAMvD,OAJI,OAAO,GAAY,SAIhB,EAAc,EAAS,EAAO,CAH5B,OAAO,EAAI,EAMV,SAAQ"}
1
+ {"version":3,"file":"index.mjs","names":["ClientProvider"],"sources":["../../src/server/index.ts"],"sourcesContent":["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { match } from \"@formatjs/intl-localematcher\";\nimport Negotiator from \"negotiator\";\nimport { cookies, headers } from \"next/headers\";\nimport React from \"react\";\nimport { I18nProvider as ClientProvider } from \"../client/index\";\nimport { COOKIE_NAME, DEFAULT_LOCALE } from \"../shared/constants\";\nimport { formatMessage, getNestedMessage } from \"../shared/utils\";\nimport type {\n AbstractIntlMessages,\n NestedKeyOf,\n TranslationKeys,\n} from \"../types\";\nimport { discoverLocalePaths } from \"./module-loader\";\n\nfunction deepMerge(target: any, source: any) {\n const result = { ...target };\n for (const key of Object.keys(source)) {\n if (\n source[key] instanceof Object &&\n key in target &&\n target[key] instanceof Object\n ) {\n result[key] = deepMerge(target[key], source[key]);\n } else {\n result[key] = source[key];\n }\n }\n return result;\n}\n\n// Internal state for locale paths\nlet registeredPaths: string[] | null = null;\n\n/**\n * Register additional directories to search for locales.\n * Can be called multiple times, but usually called once in RootLayout.\n */\nexport function registerLocalePaths(paths: string[]) {\n registeredPaths = Array.from(new Set([...(registeredPaths || []), ...paths]));\n}\n\nexport async function getMessages(\n locale: string,\n searchDirectories?: string[],\n) {\n // Auto-discovery if no paths registered\n if (registeredPaths === null || registeredPaths.length === 0) {\n const discovered = await discoverLocalePaths();\n registerLocalePaths(discovered);\n }\n\n let messages: AbstractIntlMessages = {};\n\n const defaultDir = path.join(process.cwd(), \"locales\");\n\n // Use provided paths, or registered paths, or just default\n const directoriesToScan = new Set<string>();\n\n if (registeredPaths) {\n for (const p of registeredPaths) directoriesToScan.add(p);\n }\n if (searchDirectories) {\n for (const p of searchDirectories) directoriesToScan.add(p);\n }\n directoriesToScan.add(defaultDir);\n\n for (const dir of Array.from(directoriesToScan)) {\n const localeDir = path.join(dir, locale);\n try {\n await fs.access(localeDir);\n const files = await fs.readdir(localeDir);\n\n for (const file of files) {\n if (file.endsWith(\"on\")) {\n const filePath = path.join(localeDir, file);\n const fileContent = await fs.readFile(filePath, \"utf-8\");\n const jsonContent = JSON.parse(fileContent);\n\n messages = deepMerge(messages, jsonContent);\n }\n }\n } catch (error) {\n // Ignore missing directories\n }\n }\n\n return messages;\n}\n\nexport function detectLocale(\n supportedLocales: string[],\n defaultLocale: string,\n) {\n const headerList = headers();\n const languages = new Negotiator({\n headers: Object.fromEntries((headerList as any).entries()),\n }).languages();\n\n return match(languages, supportedLocales, defaultLocale);\n}\n\n/**\n * Smart Server Component that handles locale detection and message loading automatically.\n */\nexport async function I18nProvider({\n children,\n}: {\n children: React.ReactNode;\n}) {\n const cookieStore = await cookies();\n const locale = cookieStore.get(COOKIE_NAME)?.value || DEFAULT_LOCALE;\n const messages = await getMessages(locale);\n\n // @ts-expect-error\n return React.createElement(ClientProvider, { locale, messages }, children);\n}\n\nexport * from \"./module-loader\";\n\nexport async function getTranslation() {\n const cookieStore = await cookies();\n const locale = cookieStore.get(COOKIE_NAME)?.value || DEFAULT_LOCALE;\n\n // If paths haven't been registered yet, we might be in a race condition.\n // In a real production app, we might want to have a deterministic way to load these.\n const messages = await getMessages(locale);\n\n const t = (key: TranslationKeys, values?: Record<string, any>) => {\n const message = getNestedMessage(messages, String(key));\n\n if (typeof message !== \"string\") {\n return String(key);\n }\n\n return formatMessage(message, values);\n };\n\n return { t, locale };\n}\n"],"mappings":"4eAgBA,SAAS,EAAU,EAAa,EAAa,CAC3C,IAAM,EAAS,CAAE,GAAG,EAAQ,CAC5B,IAAK,IAAM,KAAO,OAAO,KAAK,EAAO,CAEjC,EAAO,aAAgB,QACvB,KAAO,GACP,EAAO,aAAgB,OAEvB,EAAO,GAAO,EAAU,EAAO,GAAM,EAAO,GAAK,CAEjD,EAAO,GAAO,EAAO,GAGzB,OAAO,EAIT,IAAI,EAAmC,KAMvC,SAAgB,EAAoB,EAAiB,CACnD,EAAkB,MAAM,KAAK,IAAI,IAAI,CAAC,GAAI,GAAmB,EAAE,CAAG,GAAG,EAAM,CAAC,CAAC,CAG/E,eAAsB,EACpB,EACA,EACA,EAEI,IAAoB,MAAQ,EAAgB,SAAW,IAEzD,EADmB,MAAM,GAAqB,CACf,CAGjC,IAAI,EAAiC,EAAE,CAEjC,EAAa,EAAK,KAAK,QAAQ,KAAK,CAAE,UAAU,CAGhD,EAAoB,IAAI,IAE9B,GAAI,EACF,IAAK,IAAM,KAAK,EAAiB,EAAkB,IAAI,EAAE,CAE3D,GAAI,EACF,IAAK,IAAM,KAAK,EAAmB,EAAkB,IAAI,EAAE,CAE7D,EAAkB,IAAI,EAAW,CAEjC,IAAK,IAAM,KAAO,MAAM,KAAK,EAAkB,CAAE,CAC/C,IAAM,EAAY,EAAK,KAAK,EAAK,EAAO,CACxC,GAAI,CACF,MAAM,EAAG,OAAO,EAAU,CAC1B,IAAM,EAAQ,MAAM,EAAG,QAAQ,EAAU,CAEzC,IAAK,IAAM,KAAQ,EACjB,GAAI,EAAK,SAAS,KAAK,CAAE,CACvB,IAAM,EAAW,EAAK,KAAK,EAAW,EAAK,CACrC,EAAc,MAAM,EAAG,SAAS,EAAU,QAAQ,CAClD,EAAc,KAAK,MAAM,EAAY,CAE3C,EAAW,EAAU,EAAU,EAAY,OAGjC,GAKlB,OAAO,EAGT,SAAgB,EACd,EACA,EACA,CACA,IAAM,EAAa,GAAS,CAK5B,OAAO,EAJW,IAAI,EAAW,CAC/B,QAAS,OAAO,YAAa,EAAmB,SAAS,CAAC,CAC3D,CAAC,CAAC,WAAW,CAEU,EAAkB,EAAc,CAM1D,eAAsB,EAAa,CACjC,YAGC,CAED,IAAM,GADc,MAAM,GAAS,EACR,IAAI,EAAY,EAAE,OAAS,EAChD,EAAW,MAAM,EAAY,EAAO,CAG1C,OAAO,EAAM,cAAcA,EAAgB,CAAE,SAAQ,WAAU,CAAE,EAAS,CAK5E,eAAsB,GAAiB,CAErC,IAAM,GADc,MAAM,GAAS,EACR,IAAI,EAAY,EAAE,OAAS,EAIhD,EAAW,MAAM,EAAY,EAAO,CAY1C,MAAO,CAAE,GAVE,EAAsB,IAAiC,CAChE,IAAM,EAAU,EAAiB,EAAU,OAAO,EAAI,CAAC,CAMvD,OAJI,OAAO,GAAY,SAIhB,EAAc,EAAS,EAAO,CAH5B,OAAO,EAAI,EAMV,SAAQ"}
@@ -1 +1 @@
1
- const e=require(`../_virtual/_rolldown/runtime.cjs`);let t=require(`node:fs/promises`);t=e.__toESM(t);let n=require(`node:path`);n=e.__toESM(n),require(`server-only`);async function r(){let e=[],r=process.cwd(),i=await(async e=>{let r=[`pnpm-workspace.yaml`,`package.json`],i=e;for(console.log(`[intl]: Searching for monorepo root starting from: ${e}`);i!==n.default.parse(i).root;){for(let e of r)try{if(await t.default.access(n.default.join(i,e)),e===`pnpm-workspace.yaml`)return i}catch{}i=n.default.dirname(i)}return null})(r);if(i){let r=n.default.join(i,`packages`);try{let i=await t.default.readdir(r,{withFileTypes:!0});for(let a of i)if(a.isDirectory()){let i=n.default.join(r,a.name,`locales`);try{await t.default.access(i),e.push(i)}catch{}}}catch{}}let a=n.default.join(r,`node_modules`,`@arch-cadre`);try{let r=await t.default.readdir(a,{withFileTypes:!0});for(let i of r){let r=n.default.join(a,i.name,`locales`);try{await t.default.access(r),e.push(r)}catch{}}}catch{}let o=n.default.join(r,`modules`);try{let r=await t.default.readdir(o,{withFileTypes:!0});for(let i of r)if(i.isDirectory()){let r=n.default.join(o,i.name,`locales`);try{await t.default.access(r),e.push(r)}catch{}}}catch{}return Array.from(new Set(e))}async function i(e=[],t=`modules`){return r()}exports.discoverLocalePaths=r,exports.getModuleLocalePaths=i;
1
+ const e=require(`../_virtual/_rolldown/runtime.cjs`);let t=require(`node:fs/promises`);t=e.__toESM(t);let n=require(`node:path`);n=e.__toESM(n),require(`server-only`);async function r(){let e=[],r=process.cwd(),i=await(async e=>{let r=[`pnpm-workspace.yaml`,`packageon`],i=e;for(console.log(`[intl]: Searching for monorepo root starting from: ${e}`);i!==n.default.parse(i).root;){for(let e of r)try{if(await t.default.access(n.default.join(i,e)),e===`pnpm-workspace.yaml`)return i}catch{}i=n.default.dirname(i)}return null})(r);if(i){let r=n.default.join(i,`packages`);try{let i=await t.default.readdir(r,{withFileTypes:!0});for(let a of i)if(a.isDirectory()){let i=n.default.join(r,a.name,`locales`);try{await t.default.access(i),e.push(i)}catch{}}}catch{}}let a=n.default.join(r,`node_modules`,`@arch-cadre`);try{let r=await t.default.readdir(a,{withFileTypes:!0});for(let i of r){let r=n.default.join(a,i.name,`locales`);try{await t.default.access(r),e.push(r)}catch{}}}catch{}let o=n.default.join(r,`modules`);try{let r=await t.default.readdir(o,{withFileTypes:!0});for(let i of r)if(i.isDirectory()){let r=n.default.join(o,i.name,`locales`);try{await t.default.access(r),e.push(r)}catch{}}}catch{}return Array.from(new Set(e))}async function i(e=[],t=`modules`){return r()}exports.discoverLocalePaths=r,exports.getModuleLocalePaths=i;
@@ -1,2 +1,2 @@
1
- import e from"node:fs/promises";import t from"node:path";import"server-only";async function n(){let n=[],r=process.cwd(),i=await(async n=>{let r=[`pnpm-workspace.yaml`,`package.json`],i=n;for(console.log(`[intl]: Searching for monorepo root starting from: ${n}`);i!==t.parse(i).root;){for(let n of r)try{if(await e.access(t.join(i,n)),n===`pnpm-workspace.yaml`)return i}catch{}i=t.dirname(i)}return null})(r);if(i){let r=t.join(i,`packages`);try{let i=await e.readdir(r,{withFileTypes:!0});for(let a of i)if(a.isDirectory()){let i=t.join(r,a.name,`locales`);try{await e.access(i),n.push(i)}catch{}}}catch{}}let a=t.join(r,`node_modules`,`@arch-cadre`);try{let r=await e.readdir(a,{withFileTypes:!0});for(let i of r){let r=t.join(a,i.name,`locales`);try{await e.access(r),n.push(r)}catch{}}}catch{}let o=t.join(r,`modules`);try{let r=await e.readdir(o,{withFileTypes:!0});for(let i of r)if(i.isDirectory()){let r=t.join(o,i.name,`locales`);try{await e.access(r),n.push(r)}catch{}}}catch{}return Array.from(new Set(n))}async function r(e=[],t=`modules`){return n()}export{n as discoverLocalePaths,r as getModuleLocalePaths};
1
+ import e from"node:fs/promises";import t from"node:path";import"server-only";async function n(){let n=[],r=process.cwd(),i=await(async n=>{let r=[`pnpm-workspace.yaml`,`packageon`],i=n;for(console.log(`[intl]: Searching for monorepo root starting from: ${n}`);i!==t.parse(i).root;){for(let n of r)try{if(await e.access(t.join(i,n)),n===`pnpm-workspace.yaml`)return i}catch{}i=t.dirname(i)}return null})(r);if(i){let r=t.join(i,`packages`);try{let i=await e.readdir(r,{withFileTypes:!0});for(let a of i)if(a.isDirectory()){let i=t.join(r,a.name,`locales`);try{await e.access(i),n.push(i)}catch{}}}catch{}}let a=t.join(r,`node_modules`,`@arch-cadre`);try{let r=await e.readdir(a,{withFileTypes:!0});for(let i of r){let r=t.join(a,i.name,`locales`);try{await e.access(r),n.push(r)}catch{}}}catch{}let o=t.join(r,`modules`);try{let r=await e.readdir(o,{withFileTypes:!0});for(let i of r)if(i.isDirectory()){let r=t.join(o,i.name,`locales`);try{await e.access(r),n.push(r)}catch{}}}catch{}return Array.from(new Set(n))}async function r(e=[],t=`modules`){return n()}export{n as discoverLocalePaths,r as getModuleLocalePaths};
2
2
  //# sourceMappingURL=module-loader.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"module-loader.mjs","names":[],"sources":["../../src/server/module-loader.ts"],"sourcesContent":["import \"server-only\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport async function discoverLocalePaths(): Promise<string[]> {\n const paths: string[] = [];\n const root = process.cwd();\n\n // Helper to find monorepo root (looking for pnpm-workspace.yaml or turbo.json)\n const findMonorepoRoot = async (current: string): Promise<string | null> => {\n const indicators = [\"pnpm-workspace.yaml\", \"package.json\"];\n let dir = current;\n\n console.log(\n `[intl]: Searching for monorepo root starting from: ${current}`,\n );\n\n while (dir !== path.parse(dir).root) {\n for (const indicator of indicators) {\n try {\n await fs.access(path.join(dir, indicator));\n // If we find pnpm-workspace.yaml, this is definitely it\n if (indicator === \"pnpm-workspace.yaml\") return dir;\n } catch {}\n }\n dir = path.dirname(dir);\n }\n return null;\n };\n\n const monorepoRoot = await findMonorepoRoot(root);\n\n // 1. Monorepo 'packages' scan\n if (monorepoRoot) {\n const packagesDir = path.join(monorepoRoot, \"packages\");\n try {\n const entries = await fs.readdir(packagesDir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const localePath = path.join(packagesDir, entry.name, \"locales\");\n try {\n await fs.access(localePath);\n\n paths.push(localePath);\n } catch {}\n }\n }\n } catch (e) {}\n }\n\n // 2. node_modules/@arch-cadre scan (relative to app root)\n const nodeModulesKryo = path.join(root, \"node_modules\", \"@arch-cadre\");\n try {\n const entries = await fs.readdir(nodeModulesKryo, { withFileTypes: true });\n for (const entry of entries) {\n const localePath = path.join(nodeModulesKryo, entry.name, \"locales\");\n try {\n await fs.access(localePath);\n paths.push(localePath);\n } catch {}\n }\n } catch (e) {}\n\n // 3. Local 'modules' scan (relative to app root)\n const localModulesDir = path.join(root, \"modules\");\n try {\n const entries = await fs.readdir(localModulesDir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const localePath = path.join(localModulesDir, entry.name, \"locales\");\n try {\n await fs.access(localePath);\n paths.push(localePath);\n } catch {}\n }\n }\n } catch (e) {}\n\n return Array.from(new Set(paths));\n}\n\n/**\n * Legacy support or manual overrides\n */\nexport async function getModuleLocalePaths(\n packageModules: string[] = [],\n localModulesDir: string = \"modules\",\n): Promise<string[]> {\n // ... rest of the existing function if we want to keep it,\n // but we'll probably favor discoverLocalePaths\n return discoverLocalePaths();\n}\n"],"mappings":"6EAIA,eAAsB,GAAyC,CAC7D,IAAM,EAAkB,EAAE,CACpB,EAAO,QAAQ,KAAK,CAwBpB,EAAe,MArBI,KAAO,IAA4C,CAC1E,IAAM,EAAa,CAAC,sBAAuB,eAAe,CACtD,EAAM,EAMV,IAJA,QAAQ,IACN,sDAAsD,IACvD,CAEM,IAAQ,EAAK,MAAM,EAAI,CAAC,MAAM,CACnC,IAAK,IAAM,KAAa,EACtB,GAAI,CAGF,GAFA,MAAM,EAAG,OAAO,EAAK,KAAK,EAAK,EAAU,CAAC,CAEtC,IAAc,sBAAuB,OAAO,OAC1C,EAEV,EAAM,EAAK,QAAQ,EAAI,CAEzB,OAAO,OAGmC,EAAK,CAGjD,GAAI,EAAc,CAChB,IAAM,EAAc,EAAK,KAAK,EAAc,WAAW,CACvD,GAAI,CACF,IAAM,EAAU,MAAM,EAAG,QAAQ,EAAa,CAAE,cAAe,GAAM,CAAC,CACtE,IAAK,IAAM,KAAS,EAClB,GAAI,EAAM,aAAa,CAAE,CACvB,IAAM,EAAa,EAAK,KAAK,EAAa,EAAM,KAAM,UAAU,CAChE,GAAI,CACF,MAAM,EAAG,OAAO,EAAW,CAE3B,EAAM,KAAK,EAAW,MAChB,SAGF,GAId,IAAM,EAAkB,EAAK,KAAK,EAAM,eAAgB,cAAc,CACtE,GAAI,CACF,IAAM,EAAU,MAAM,EAAG,QAAQ,EAAiB,CAAE,cAAe,GAAM,CAAC,CAC1E,IAAK,IAAM,KAAS,EAAS,CAC3B,IAAM,EAAa,EAAK,KAAK,EAAiB,EAAM,KAAM,UAAU,CACpE,GAAI,CACF,MAAM,EAAG,OAAO,EAAW,CAC3B,EAAM,KAAK,EAAW,MAChB,SAEA,EAGZ,IAAM,EAAkB,EAAK,KAAK,EAAM,UAAU,CAClD,GAAI,CACF,IAAM,EAAU,MAAM,EAAG,QAAQ,EAAiB,CAAE,cAAe,GAAM,CAAC,CAC1E,IAAK,IAAM,KAAS,EAClB,GAAI,EAAM,aAAa,CAAE,CACvB,IAAM,EAAa,EAAK,KAAK,EAAiB,EAAM,KAAM,UAAU,CACpE,GAAI,CACF,MAAM,EAAG,OAAO,EAAW,CAC3B,EAAM,KAAK,EAAW,MAChB,SAGF,EAEZ,OAAO,MAAM,KAAK,IAAI,IAAI,EAAM,CAAC,CAMnC,eAAsB,EACpB,EAA2B,EAAE,CAC7B,EAA0B,UACP,CAGnB,OAAO,GAAqB"}
1
+ {"version":3,"file":"module-loader.mjs","names":[],"sources":["../../src/server/module-loader.ts"],"sourcesContent":["import \"server-only\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport async function discoverLocalePaths(): Promise<string[]> {\n const paths: string[] = [];\n const root = process.cwd();\n\n // Helper to find monorepo root (looking for pnpm-workspace.yaml or turboon)\n const findMonorepoRoot = async (current: string): Promise<string | null> => {\n const indicators = [\"pnpm-workspace.yaml\", \"packageon\"];\n let dir = current;\n\n console.log(\n `[intl]: Searching for monorepo root starting from: ${current}`,\n );\n\n while (dir !== path.parse(dir).root) {\n for (const indicator of indicators) {\n try {\n await fs.access(path.join(dir, indicator));\n // If we find pnpm-workspace.yaml, this is definitely it\n if (indicator === \"pnpm-workspace.yaml\") return dir;\n } catch { }\n }\n dir = path.dirname(dir);\n }\n return null;\n };\n\n const monorepoRoot = await findMonorepoRoot(root);\n\n // 1. Monorepo 'packages' scan\n if (monorepoRoot) {\n const packagesDir = path.join(monorepoRoot, \"packages\");\n try {\n const entries = await fs.readdir(packagesDir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const localePath = path.join(packagesDir, entry.name, \"locales\");\n try {\n await fs.access(localePath);\n\n paths.push(localePath);\n } catch { }\n }\n }\n } catch (e) { }\n }\n\n // 2. node_modules/@arch-cadre scan (relative to app root)\n const nodeModulesKryo = path.join(root, \"node_modules\", \"@arch-cadre\");\n try {\n const entries = await fs.readdir(nodeModulesKryo, { withFileTypes: true });\n for (const entry of entries) {\n const localePath = path.join(nodeModulesKryo, entry.name, \"locales\");\n try {\n await fs.access(localePath);\n paths.push(localePath);\n } catch { }\n }\n } catch (e) { }\n\n // 3. Local 'modules' scan (relative to app root)\n const localModulesDir = path.join(root, \"modules\");\n try {\n const entries = await fs.readdir(localModulesDir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const localePath = path.join(localModulesDir, entry.name, \"locales\");\n try {\n await fs.access(localePath);\n paths.push(localePath);\n } catch { }\n }\n }\n } catch (e) { }\n\n return Array.from(new Set(paths));\n}\n\n/**\n * Legacy support or manual overrides\n */\nexport async function getModuleLocalePaths(\n packageModules: string[] = [],\n localModulesDir: string = \"modules\",\n): Promise<string[]> {\n // ... rest of the existing function if we want to keep it,\n // but we'll probably favor discoverLocalePaths\n return discoverLocalePaths();\n}\n"],"mappings":"6EAIA,eAAsB,GAAyC,CAC7D,IAAM,EAAkB,EAAE,CACpB,EAAO,QAAQ,KAAK,CAwBpB,EAAe,MArBI,KAAO,IAA4C,CAC1E,IAAM,EAAa,CAAC,sBAAuB,YAAY,CACnD,EAAM,EAMV,IAJA,QAAQ,IACN,sDAAsD,IACvD,CAEM,IAAQ,EAAK,MAAM,EAAI,CAAC,MAAM,CACnC,IAAK,IAAM,KAAa,EACtB,GAAI,CAGF,GAFA,MAAM,EAAG,OAAO,EAAK,KAAK,EAAK,EAAU,CAAC,CAEtC,IAAc,sBAAuB,OAAO,OAC1C,EAEV,EAAM,EAAK,QAAQ,EAAI,CAEzB,OAAO,OAGmC,EAAK,CAGjD,GAAI,EAAc,CAChB,IAAM,EAAc,EAAK,KAAK,EAAc,WAAW,CACvD,GAAI,CACF,IAAM,EAAU,MAAM,EAAG,QAAQ,EAAa,CAAE,cAAe,GAAM,CAAC,CACtE,IAAK,IAAM,KAAS,EAClB,GAAI,EAAM,aAAa,CAAE,CACvB,IAAM,EAAa,EAAK,KAAK,EAAa,EAAM,KAAM,UAAU,CAChE,GAAI,CACF,MAAM,EAAG,OAAO,EAAW,CAE3B,EAAM,KAAK,EAAW,MAChB,SAGF,GAId,IAAM,EAAkB,EAAK,KAAK,EAAM,eAAgB,cAAc,CACtE,GAAI,CACF,IAAM,EAAU,MAAM,EAAG,QAAQ,EAAiB,CAAE,cAAe,GAAM,CAAC,CAC1E,IAAK,IAAM,KAAS,EAAS,CAC3B,IAAM,EAAa,EAAK,KAAK,EAAiB,EAAM,KAAM,UAAU,CACpE,GAAI,CACF,MAAM,EAAG,OAAO,EAAW,CAC3B,EAAM,KAAK,EAAW,MAChB,SAEA,EAGZ,IAAM,EAAkB,EAAK,KAAK,EAAM,UAAU,CAClD,GAAI,CACF,IAAM,EAAU,MAAM,EAAG,QAAQ,EAAiB,CAAE,cAAe,GAAM,CAAC,CAC1E,IAAK,IAAM,KAAS,EAClB,GAAI,EAAM,aAAa,CAAE,CACvB,IAAM,EAAa,EAAK,KAAK,EAAiB,EAAM,KAAM,UAAU,CACpE,GAAI,CACF,MAAM,EAAG,OAAO,EAAW,CAC3B,EAAM,KAAK,EAAW,MAChB,SAGF,EAEZ,OAAO,MAAM,KAAK,IAAI,IAAI,EAAM,CAAC,CAMnC,eAAsB,EACpB,EAA2B,EAAE,CAC7B,EAA0B,UACP,CAGnB,OAAO,GAAqB"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.mjs","names":[],"sources":["../../src/shared/utils.ts"],"sourcesContent":["import type { AbstractIntlMessages } from \"../types.js\";\n\nexport function getNestedMessage(\n messages: AbstractIntlMessages | undefined,\n path: string,\n): string | AbstractIntlMessages | undefined {\n if (!messages) return undefined;\n\n // Try direct match first (optimization + exact match with dots)\n if (path in messages) return messages[path];\n\n const parts = path.split(\".\");\n let current: any = messages;\n\n let i = 0;\n while (i < parts.length) {\n if (typeof current !== \"object\" || current === null) return undefined;\n\n // Try to match longest possible key from current position\n let found = false;\n for (let j = parts.length; j > i; j--) {\n const keyAttempt = parts.slice(i, j).join(\".\");\n if (keyAttempt in current) {\n current = current[keyAttempt];\n i = j;\n found = true;\n break;\n }\n }\n\n if (!found) {\n // If we can't match anything, check if we are at the end and looking for a partial key?\n // But strictly, we failed to traverse.\n return undefined;\n }\n }\n\n return current;\n}\n\nexport function formatMessage(\n message: string,\n values?: Record<string, any>,\n): string {\n if (!values) return message;\n\n return message.replace(/{(\\w+)}/g, (match, key) => {\n return values[key] !== undefined ? String(values[key]) : match;\n });\n}\n\n/**\n * Identity function used as a marker for static analysis tools to extract\n * translation keys that are defined as plain strings but translated later.\n */\nexport const i18n = (key: string): string => key;\n"],"mappings":"AAEA,SAAgB,EACd,EACA,EAC2C,CAC3C,GAAI,CAAC,EAAU,OAGf,GAAI,KAAQ,EAAU,OAAO,EAAS,GAEtC,IAAM,EAAQ,EAAK,MAAM,IAAI,CACzB,EAAe,EAEf,EAAI,EACR,KAAO,EAAI,EAAM,QAAQ,CACvB,GAAI,OAAO,GAAY,WAAY,EAAkB,OAGrD,IAAI,EAAQ,GACZ,IAAK,IAAI,EAAI,EAAM,OAAQ,EAAI,EAAG,IAAK,CACrC,IAAM,EAAa,EAAM,MAAM,EAAG,EAAE,CAAC,KAAK,IAAI,CAC9C,GAAI,KAAc,EAAS,CACzB,EAAU,EAAQ,GAClB,EAAI,EACJ,EAAQ,GACR,OAIJ,GAAI,CAAC,EAGH,OAIJ,OAAO,EAGT,SAAgB,EACd,EACA,EACQ,CAGR,OAFK,EAEE,EAAQ,QAAQ,YAAa,EAAO,IAClC,EAAO,KAAS,IAAA,GAAkC,EAAtB,OAAO,EAAO,GAAK,CACtD,CAJkB,EAWtB,MAAa,EAAQ,GAAwB"}
1
+ {"version":3,"file":"utils.mjs","names":[],"sources":["../../src/shared/utils.ts"],"sourcesContent":["import type { AbstractIntlMessages } from \"../types\";\n\nexport function getNestedMessage(\n messages: AbstractIntlMessages | undefined,\n path: string,\n): string | AbstractIntlMessages | undefined {\n if (!messages) return undefined;\n\n // Try direct match first (optimization + exact match with dots)\n if (path in messages) return messages[path];\n\n const parts = path.split(\".\");\n let current: any = messages;\n\n let i = 0;\n while (i < parts.length) {\n if (typeof current !== \"object\" || current === null) return undefined;\n\n // Try to match longest possible key from current position\n let found = false;\n for (let j = parts.length; j > i; j--) {\n const keyAttempt = parts.slice(i, j).join(\".\");\n if (keyAttempt in current) {\n current = current[keyAttempt];\n i = j;\n found = true;\n break;\n }\n }\n\n if (!found) {\n // If we can't match anything, check if we are at the end and looking for a partial key?\n // But strictly, we failed to traverse.\n return undefined;\n }\n }\n\n return current;\n}\n\nexport function formatMessage(\n message: string,\n values?: Record<string, any>,\n): string {\n if (!values) return message;\n\n return message.replace(/{(\\w+)}/g, (match, key) => {\n return values[key] !== undefined ? String(values[key]) : match;\n });\n}\n\n/**\n * Identity function used as a marker for static analysis tools to extract\n * translation keys that are defined as plain strings but translated later.\n */\nexport const i18n = (key: string): string => key;\n"],"mappings":"AAEA,SAAgB,EACd,EACA,EAC2C,CAC3C,GAAI,CAAC,EAAU,OAGf,GAAI,KAAQ,EAAU,OAAO,EAAS,GAEtC,IAAM,EAAQ,EAAK,MAAM,IAAI,CACzB,EAAe,EAEf,EAAI,EACR,KAAO,EAAI,EAAM,QAAQ,CACvB,GAAI,OAAO,GAAY,WAAY,EAAkB,OAGrD,IAAI,EAAQ,GACZ,IAAK,IAAI,EAAI,EAAM,OAAQ,EAAI,EAAG,IAAK,CACrC,IAAM,EAAa,EAAM,MAAM,EAAG,EAAE,CAAC,KAAK,IAAI,CAC9C,GAAI,KAAc,EAAS,CACzB,EAAU,EAAQ,GAClB,EAAI,EACJ,EAAQ,GACR,OAIJ,GAAI,CAAC,EAGH,OAIJ,OAAO,EAGT,SAAgB,EACd,EACA,EACQ,CAGR,OAFK,EAEE,EAAQ,QAAQ,YAAa,EAAO,IAClC,EAAO,KAAS,IAAA,GAAkC,EAAtB,OAAO,EAAO,GAAK,CACtD,CAJkB,EAWtB,MAAa,EAAQ,GAAwB"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.cts","names":[],"sources":["../src/types.ts"],"mappings":";;;KAEK,YAAA,UAAsB,QAAA;AAAA,UAEV,YAAA,SAAqB,YAAA;;;;QAK9B,MAAA;EAAA,UACI,YAAA;AAAA;AAAA,KAGA,oBAAA,GAAuB,MAAA;;AATkB;;KAczC,WAAA,+BACI,UAAA,uBAAiC,UAAA,CAAW,GAAA,sBACnD,GAAA,QAAW,GAAA,IAAO,WAAA,CAAY,UAAA,CAAW,GAAA,UACzC,GAAA,WACD,UAAA;;AATR;;KAcY,eAAA,kBAAiC,CAAA,eAAgB,YAAA,GACzD,WAAA,CAAY,YAAA,CAAa,CAAA,qBACzB,WAAA,CAAY,YAAA"}
1
+ {"version":3,"file":"types.d.cts","names":[],"sources":["../src/types.ts"],"mappings":";;;KAEK,YAAA,UAAsB,QAAA;AAAA,UAEV,YAAA,SAAqB,YAAA;;;;QAK9B,MAAA;EAAA,UACI,YAAA;AAAA;AAAA,KAGA,oBAAA,GAAuB,MAAA;;AATmB;;KAc1C,WAAA,+BACI,UAAA,uBAAiC,UAAA,CAAW,GAAA,sBACrD,GAAA,QAAW,GAAA,IAAO,WAAA,CAAY,UAAA,CAAW,GAAA,UACzC,GAAA,WACC,UAAA;;AATR;;KAcY,eAAA,kBAAiC,CAAA,eAAgB,YAAA,GACzD,WAAA,CAAY,YAAA,CAAa,CAAA,qBACzB,WAAA,CAAY,YAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.mts","names":[],"sources":["../src/types.ts"],"mappings":";;;KAEK,YAAA,UAAsB,QAAA;AAAA,UAEV,YAAA,SAAqB,YAAA;;;;QAK9B,MAAA;EAAA,UACI,YAAA;AAAA;AAAA,KAGA,oBAAA,GAAuB,MAAA;;AATkB;;KAczC,WAAA,+BACI,UAAA,uBAAiC,UAAA,CAAW,GAAA,sBACnD,GAAA,QAAW,GAAA,IAAO,WAAA,CAAY,UAAA,CAAW,GAAA,UACzC,GAAA,WACD,UAAA;;AATR;;KAcY,eAAA,kBAAiC,CAAA,eAAgB,YAAA,GACzD,WAAA,CAAY,YAAA,CAAa,CAAA,qBACzB,WAAA,CAAY,YAAA"}
1
+ {"version":3,"file":"types.d.mts","names":[],"sources":["../src/types.ts"],"mappings":";;;KAEK,YAAA,UAAsB,QAAA;AAAA,UAEV,YAAA,SAAqB,YAAA;;;;QAK9B,MAAA;EAAA,UACI,YAAA;AAAA;AAAA,KAGA,oBAAA,GAAuB,MAAA;;AATmB;;KAc1C,WAAA,+BACI,UAAA,uBAAiC,UAAA,CAAW,GAAA,sBACrD,GAAA,QAAW,GAAA,IAAO,WAAA,CAAY,UAAA,CAAW,GAAA,UACzC,GAAA,WACC,UAAA;;AATR;;KAcY,eAAA,kBAAiC,CAAA,eAAgB,YAAA,GACzD,WAAA,CAAY,YAAA,CAAa,CAAA,qBACzB,WAAA,CAAY,YAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arch-cadre/intl",
3
- "version": "0.0.24",
3
+ "version": "0.0.28",
4
4
  "type": "module",
5
5
  "description": "Core Intl for Kryo framework",
6
6
  "exports": {