@fluenti/next 0.3.1 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dev-runner.d.ts +2 -6
- package/dist/dev-runner.d.ts.map +1 -1
- package/dist/dev-watcher.d.ts.map +1 -1
- package/dist/generate-server-module.d.ts.map +1 -1
- package/dist/index.cjs +18 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +41 -69
- package/dist/index.js.map +1 -1
- package/dist/middleware.cjs +2 -0
- package/dist/middleware.cjs.map +1 -0
- package/dist/middleware.js +36 -0
- package/dist/middleware.js.map +1 -0
- package/dist/navigation.cjs +3 -0
- package/dist/navigation.cjs.map +1 -0
- package/dist/navigation.js +29 -0
- package/dist/navigation.js.map +1 -0
- package/dist/provider.cjs +1 -6
- package/dist/provider.cjs.map +1 -1
- package/dist/provider.js +9 -187
- package/dist/provider.js.map +1 -1
- package/package.json +23 -3
package/dist/dev-runner.d.ts
CHANGED
|
@@ -9,14 +9,10 @@ export interface DevRunnerOptions {
|
|
|
9
9
|
/** Enable parallel compilation across locales using worker threads */
|
|
10
10
|
parallelCompile?: boolean;
|
|
11
11
|
}
|
|
12
|
-
/**
|
|
13
|
-
* Walk up from `cwd` to find `node_modules/.bin/fluenti`.
|
|
14
|
-
* Returns the absolute path or null if not found.
|
|
15
|
-
*/
|
|
16
|
-
export declare function resolveCliBin(cwd: string): string | null;
|
|
17
12
|
/**
|
|
18
13
|
* Run compile in-process via `@fluenti/cli` (for compileOnly mode),
|
|
19
|
-
* or
|
|
14
|
+
* or extract + compile in dev mode. Requires `@fluenti/cli` to be installed
|
|
15
|
+
* as a devDependency.
|
|
20
16
|
*/
|
|
21
17
|
export declare function runExtractCompile(options: DevRunnerOptions): Promise<void>;
|
|
22
18
|
/**
|
package/dist/dev-runner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-runner.d.ts","sourceRoot":"","sources":["../src/dev-runner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dev-runner.d.ts","sourceRoot":"","sources":["../src/dev-runner.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IACtB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAA;IAC9B,6EAA6E;IAC7E,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,+FAA+F;IAC/F,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,sEAAsE;IACtE,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+DhF;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,gBAAgB,EACzB,KAAK,SAAM,GACV,MAAM,IAAI,CAiCZ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-watcher.d.ts","sourceRoot":"","sources":["../src/dev-watcher.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAA;IACX,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,sEAAsE;IACtE,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B;AAID;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAY1E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,IAAI,
|
|
1
|
+
{"version":3,"file":"dev-watcher.d.ts","sourceRoot":"","sources":["../src/dev-watcher.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAA;IACX,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,sEAAsE;IACtE,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B;AAID;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAY1E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,IAAI,CAwCtE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-server-module.d.ts","sourceRoot":"","sources":["../src/generate-server-module.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAEnD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,oBAAoB,GAC3B,MAAM,
|
|
1
|
+
{"version":3,"file":"generate-server-module.d.ts","sourceRoot":"","sources":["../src/generate-server-module.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAEnD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,oBAAoB,GAC3B,MAAM,CAyPR"}
|
package/dist/index.cjs
CHANGED
|
@@ -1,18 +1,27 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require(`node:fs`),t=require(`node:path`),n=require(`node:url`),r=require(`@fluenti/core/config`),i=require(`@fluenti/core`),a=require(`@fluenti/core/internal`),o=require(`node:module`)
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require(`node:fs`),t=require(`node:path`),n=require(`node:url`),r=require(`@fluenti/core/config`),i=require(`@fluenti/core`),a=require(`@fluenti/core/internal`),o=require(`node:module`);function s(e,t){let n;n=t?.config&&typeof t.config==`object`?{...r.DEFAULT_FLUENTI_CONFIG,...t.config}:(0,r.loadConfigSync)(typeof t?.config==`string`?t.config:void 0,e);let i=t?.serverModuleOutDir??`.fluenti`,a=t?.cookieName??`locale`,o={fluentiConfig:n,serverModule:t?.serverModule??null,serverModuleOutDir:i,cookieName:a};return t?.resolveLocale&&(o.resolveLocale=t.resolveLocale),o}function c(n,r){if(r.serverModule)return(0,t.resolve)(n,r.serverModule);let o=(0,t.resolve)(n,r.serverModuleOutDir),s=(0,t.resolve)(o,`server.js`),c=(0,t.resolve)(o,`server.d.ts`);(0,e.existsSync)(o)||(0,e.mkdirSync)(o,{recursive:!0});let d=(0,a.resolveLocaleCodes)(r.fluentiConfig.locales),f=r.fluentiConfig.defaultLocale??r.fluentiConfig.sourceLocale,p=r.fluentiConfig.compileOutDir,m=r.fluentiConfig.fallbackChain,h=l(r.cookieName),g=l(f);for(let e of d)(0,i.validateLocale)(e,`next-plugin`);let _=u((0,t.relative)(o,(0,t.resolve)(n,p))),v=d.map(e=>` case '${l(e)}': return import('${_}/${e}')`).join(`
|
|
2
2
|
`),y=m?JSON.stringify(m):`undefined`;(0,e.writeFileSync)((0,t.resolve)(o,`client-provider.js`),`"use client";
|
|
3
3
|
// Auto-generated by @fluenti/next — do not edit
|
|
4
4
|
// @ts-nocheck
|
|
5
5
|
import { createElement } from 'react'
|
|
6
6
|
import { I18nProvider } from '@fluenti/react'
|
|
7
|
-
${
|
|
7
|
+
${d.map(e=>`import ${e.replace(/[^a-zA-Z0-9]/g,`_`)} from '${_}/${e}'`).join(`
|
|
8
8
|
`)}
|
|
9
9
|
|
|
10
|
-
const __allMessages = { ${
|
|
10
|
+
const __allMessages = { ${d.map(e=>{let t=e.replace(/[^a-zA-Z0-9]/g,`_`);return`'${l(e)}': ${t}`}).join(`, `)} }
|
|
11
11
|
|
|
12
12
|
export function ClientI18nProvider({ locale, fallbackLocale, fallbackChain, children }) {
|
|
13
13
|
return createElement(I18nProvider, { locale, fallbackLocale, messages: __allMessages, fallbackChain }, children)
|
|
14
14
|
}
|
|
15
|
-
`,`utf-8`)
|
|
15
|
+
`,`utf-8`),(0,e.writeFileSync)((0,t.resolve)(o,`client-provider.d.ts`),`// Auto-generated by @fluenti/next — do not edit
|
|
16
|
+
import type { ReactNode, ReactElement } from 'react'
|
|
17
|
+
|
|
18
|
+
export declare function ClientI18nProvider(props: {
|
|
19
|
+
locale: string
|
|
20
|
+
fallbackLocale: string
|
|
21
|
+
fallbackChain?: Record<string, string[]>
|
|
22
|
+
children: ReactNode
|
|
23
|
+
}): ReactElement
|
|
24
|
+
`,`utf-8`);let b=r.resolveLocale?`import __resolveLocale from '${u((0,t.relative)(o,(0,t.resolve)(n,r.resolveLocale)))}'`:null,x=r.resolveLocale?`resolveLocale: __resolveLocale,`:`resolveLocale: async () => {
|
|
16
25
|
try {
|
|
17
26
|
const { cookies, headers } = await import('next/headers')
|
|
18
27
|
const [cookieStore, headerStore] = await Promise.all([cookies(), headers()])
|
|
@@ -46,7 +55,7 @@ export function ClientI18nProvider({ locale, fallbackLocale, fallbackChain, chil
|
|
|
46
55
|
} catch {
|
|
47
56
|
return '${g}'
|
|
48
57
|
}
|
|
49
|
-
},`,S=JSON.stringify(
|
|
58
|
+
},`,S=JSON.stringify(d),C=`// Auto-generated by @fluenti/next — do not edit
|
|
50
59
|
// @ts-nocheck
|
|
51
60
|
import { createServerI18n } from '@fluenti/react/server'
|
|
52
61
|
import { createElement } from 'react'
|
|
@@ -158,5 +167,8 @@ export declare function I18nProvider(props: {
|
|
|
158
167
|
locale?: string
|
|
159
168
|
children: ReactNode
|
|
160
169
|
}): Promise<ReactElement>
|
|
161
|
-
`,`utf-8`),s}function
|
|
170
|
+
`,`utf-8`),s}function l(e){return e.replace(/\\/g,`\\\\`).replace(/'/g,`\\'`)}function u(e){return e.split(`\\`).join(`/`)}async function d(e){if(e.compileOnly)try{let{runCompile:n}=(0,o.createRequire)((0,t.join)(e.cwd,`package.json`))(`@fluenti/cli`);await n(e.cwd),console.log(`[fluenti] Compiling... done`),e.onSuccess?.();return}catch(t){let n=t instanceof Error?t:Error(String(t));if(e.throwOnError)throw n;console.warn(`[fluenti] Compile failed:`,n.message),e.onError?.(n);return}let n=null;try{n=(0,o.createRequire)((0,t.join)(e.cwd,`package.json`))(`@fluenti/cli`)}catch{}if(n)try{await n.runExtract(e.cwd),e.parallelCompile?await n.runCompile(e.cwd,{parallel:!0}):await n.runCompile(e.cwd),console.log(`[fluenti] Extracting and compiling... done`),e.onSuccess?.();return}catch(t){let n=t instanceof Error?t:Error(String(t));if(e.throwOnError)throw n;console.warn(`[fluenti] Extract/compile failed:`,n.message),e.onError?.(n);return}let r=`[fluenti] @fluenti/cli is required for auto-compile.
|
|
171
|
+
Install it as a devDependency:
|
|
172
|
+
pnpm add -D @fluenti/cli
|
|
173
|
+
See: https://fluenti.dev/start/introduction/`;if(e.throwOnError)throw Error(r);console.warn(r),e.onError?.(Error(r))}function f(e,t=300){let n=null,r=!1,i=!1;async function a(){r=!0;try{await d(e)}finally{r=!1,i&&(i=!1,o())}}function o(){n!==null&&clearTimeout(n),n=setTimeout(()=>{n=null,r?i=!0:a()},t)}return o}var p=null;function m(e,n){if(!n||n.length===0)return[(0,t.resolve)(e,`src`)];let r=new Set;for(let e of n){let t=e.replace(/^\.\//,``).split(`*`)[0].replace(/\/+$/,``);r.add(t||`.`)}return[...r].map(n=>(0,t.resolve)(e,n))}function h(n){p&&p();let{cwd:r,compiledDir:i,delay:a=1e3,include:s,exclude:c,parallelCompile:l}=n,u=(0,t.resolve)(r,i),d=(0,o.createRequire)(typeof __filename<`u`?__filename:{}.url)(`picomatch`),h=c?.length?d(c):()=>!1,g={cwd:r};l&&(g.parallelCompile=!0);let _=f(g,a);_();let v=m(r,s).map(n=>(0,e.watch)(n,{recursive:!0},(e,r)=>{r&&/\.[jt]sx?$/.test(r)&&(r.includes(`node_modules`)||r.includes(`.next`)||(0,t.resolve)(n,r).startsWith(u)||h(r)||_())})),y=()=>{for(let e of v)e.close();p=null};return p=y,y}function g(e){if(e&&!_(e))return v({},e);let t=e??{};return function(e){return v(t,e??{})}}function _(e){return[`config`,`serverModule`,`serverModuleOutDir`,`resolveLocale`,`cookieName`,`loaderEnforce`].some(t=>t in e)}function v(r,i){let a=process.cwd(),o=s(a,r),l=o.fluentiConfig,u=l.compileOutDir;(0,e.existsSync)((0,t.resolve)(a,u))||console.warn(`\n[fluenti] Compiled catalogs not found at ${u}.\nRun: npx fluenti extract && npx fluenti compile\n`);let d=c(a,o),f=(0,t.resolve)(typeof __dirname<`u`?__dirname:(0,t.dirname)((0,n.fileURLToPath)({}.url)),`loader.js`),p=i.webpack,m=!1,g=Object.fromEntries([`*.ts`,`*.tsx`,`*.js`,`*.jsx`].map(e=>[e,{condition:{not:`foreign`},loaders:[`@fluenti/next/loader`]}])),_=`./`+d.replace(a+`/`,``).replace(a+`\\`,``),v={"@fluenti/next":_},b=process.env.NODE_ENV===`development`||process.argv.some(e=>e===`dev`),x=l.devAutoCompile??!0;if(b&&x){let e={cwd:a,compiledDir:u,delay:l.devAutoCompileDelay??1e3};l.parallelCompile&&(e.parallelCompile=!0),l.include&&(e.include=l.include),l.exclude&&(e.exclude=l.exclude),h(e)}return{...i,turbopack:y(i.turbopack,{rules:g,resolveAlias:v}),webpack(e,t){let n=r.loaderEnforce===void 0&&!(`loaderEnforce`in r)?`pre`:r.loaderEnforce;e.module.rules.push({test:/\.[jt]sx?$/,...n?{enforce:n}:{},exclude:[/node_modules/,/\.next/],use:[{loader:f,options:{serverModulePath:d}}]}),e.resolve=e.resolve??{},e.resolve.alias=e.resolve.alias??{},e.resolve.alias[`@fluenti/next$`]=d;let i=l.buildAutoCompile??!0;return!t.dev&&i&&(e.plugins=e.plugins??[],e.plugins.push({apply(e){e.hooks.beforeRun.tapPromise(`fluenti-compile`,async()=>{if(m)return;m=!0;let e;try{e=await import(`@fluenti/cli`)}catch{return}await e.runCompile(a,l.parallelCompile?{parallel:!0}:void 0)})}})),p?p(e,t):e}}}function y(e,t){let n=e??{},r=n.rules??{},i=Object.keys(t.rules).filter(e=>e in r);return i.length>0&&console.warn(`[fluenti] Your turbopack.rules override Fluenti's loader for: ${i.join(`, `)}.\n Fluenti's t\`\` transform will NOT run on these file types.\n If this is intentional, you can suppress this warning with { devAutoCompile: false }.`),{...n,rules:{...t.rules,...r},resolveAlias:{...t.resolveAlias,...n.resolveAlias}}}var b='[fluenti] `withFluenti()` must be configured in next.config.ts before importing from "@fluenti/next".';function x(){throw Error(b)}var S=x,C=x,w=x,T=x,E=x,D=x,O=x,k=x,A=x;exports.DateTime=O,exports.I18nProvider=A,exports.NumberFormat=k,exports.Plural=E,exports.Select=D,exports.Trans=T,exports.getI18n=C,exports.setLocale=S,exports.t=w,exports.withFluenti=g;
|
|
162
174
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":[],"sources":["../src/read-config.ts","../src/generate-server-module.ts","../src/dev-runner.ts","../src/dev-watcher.ts","../src/with-fluenti.ts","../src/index.ts"],"sourcesContent":["import { loadConfigSync, DEFAULT_FLUENTI_CONFIG } from '@fluenti/core/config'\nimport type { FluentiBuildConfig } from '@fluenti/core/internal'\nimport type { WithFluentConfig, ResolvedFluentConfig } from './types'\n\n/**\n * Read fluenti.config.ts and merge with withFluenti() overrides.\n *\n * Delegates config file loading to `@fluenti/core`'s shared `loadConfigSync()`.\n */\nexport function resolveConfig(\n projectRoot: string,\n overrides?: WithFluentConfig,\n): ResolvedFluentConfig {\n let fluentiConfig: FluentiBuildConfig\n\n if (overrides?.config && typeof overrides.config === 'object') {\n // Inline config — merge with defaults\n fluentiConfig = { ...DEFAULT_FLUENTI_CONFIG, ...overrides.config }\n } else {\n // string path or auto-discover\n fluentiConfig = loadConfigSync(\n typeof overrides?.config === 'string' ? overrides.config : undefined,\n projectRoot,\n )\n }\n\n const serverModuleOutDir = overrides?.serverModuleOutDir ?? '.fluenti'\n const cookieName = overrides?.cookieName ?? 'locale'\n\n const resolved: ResolvedFluentConfig = {\n fluentiConfig,\n serverModule: overrides?.serverModule ?? null,\n serverModuleOutDir,\n cookieName,\n }\n if (overrides?.resolveLocale) resolved.resolveLocale = overrides.resolveLocale\n return resolved\n}\n","import { writeFileSync, mkdirSync, existsSync } from 'node:fs'\nimport { resolve, relative } from 'node:path'\nimport { validateLocale } from '@fluenti/core'\nimport { resolveLocaleCodes } from '@fluenti/core/internal'\nimport type { ResolvedFluentConfig } from './types'\n\n/**\n * Generate the server module that provides:\n * - setLocale / getI18n\n * - Trans / Plural / Select / DateTime / NumberFormat (server components)\n * - I18nProvider (async server component for layouts)\n *\n * @returns Absolute path to the generated server module.\n */\nexport function generateServerModule(\n projectRoot: string,\n config: ResolvedFluentConfig,\n): string {\n if (config.serverModule) {\n return resolve(projectRoot, config.serverModule)\n }\n\n const outDir = resolve(projectRoot, config.serverModuleOutDir)\n const outPath = resolve(outDir, 'server.js')\n const dtsPath = resolve(outDir, 'server.d.ts')\n\n if (!existsSync(outDir)) {\n mkdirSync(outDir, { recursive: true })\n }\n\n const locales = resolveLocaleCodes(config.fluentiConfig.locales)\n const defaultLocale = config.fluentiConfig.defaultLocale ?? config.fluentiConfig.sourceLocale\n const compiledDir = config.fluentiConfig.compileOutDir\n const fallbackChain = config.fluentiConfig.fallbackChain\n const cookieName = escapeJsSingleQuoted(config.cookieName)\n const defaultLocaleSafe = escapeJsSingleQuoted(defaultLocale)\n\n for (const locale of locales) {\n validateLocale(locale, 'next-plugin')\n }\n\n const compiledDirAbs = resolve(projectRoot, compiledDir)\n const compiledRelative = toForwardSlash(relative(outDir, compiledDirAbs))\n\n const localeImports = locales\n .map((locale) => ` case '${escapeJsSingleQuoted(locale)}': return import('${compiledRelative}/${locale}')`)\n .join('\\n')\n\n const fallbackChainStr = fallbackChain\n ? JSON.stringify(fallbackChain)\n : 'undefined'\n\n // Generate a 'use client' provider that imports messages statically.\n // Messages contain functions (interpolation) which can't cross the RSC boundary.\n const clientProviderPath = resolve(outDir, 'client-provider.js')\n\n const clientStaticImports = locales\n .map((locale) => {\n const safe = locale.replace(/[^a-zA-Z0-9]/g, '_')\n return `import ${safe} from '${compiledRelative}/${locale}'`\n })\n .join('\\n')\n\n const clientAllMessagesEntries = locales\n .map((locale) => {\n const safe = locale.replace(/[^a-zA-Z0-9]/g, '_')\n return `'${escapeJsSingleQuoted(locale)}': ${safe}`\n })\n .join(', ')\n\n const clientProviderSource = `\"use client\";\n// Auto-generated by @fluenti/next — do not edit\n// @ts-nocheck\nimport { createElement } from 'react'\nimport { I18nProvider } from '@fluenti/react'\n${clientStaticImports}\n\nconst __allMessages = { ${clientAllMessagesEntries} }\n\nexport function ClientI18nProvider({ locale, fallbackLocale, fallbackChain, children }) {\n return createElement(I18nProvider, { locale, fallbackLocale, messages: __allMessages, fallbackChain }, children)\n}\n`\n writeFileSync(clientProviderPath, clientProviderSource, 'utf-8')\n\n const resolveLocaleImport = config.resolveLocale\n ? (() => {\n const absPath = resolve(projectRoot, config.resolveLocale)\n const relPath = toForwardSlash(relative(outDir, absPath))\n return `import __resolveLocale from '${relPath}'`\n })()\n : null\n\n const resolveLocaleFn = config.resolveLocale\n ? `resolveLocale: __resolveLocale,`\n : `resolveLocale: async () => {\n try {\n const { cookies, headers } = await import('next/headers')\n const [cookieStore, headerStore] = await Promise.all([cookies(), headers()])\n\n // 1. Referer URL path segment (available in Server Action context)\n const referer = headerStore.get('referer')\n if (referer) {\n try {\n const seg = new URL(referer).pathname.split('/')[1]\n if (seg && __locales.includes(seg)) return seg\n } catch {}\n }\n\n // 2. Cookie (configurable name)\n const fromCookie = cookieStore.get('${cookieName}')?.value\n if (fromCookie && __locales.includes(fromCookie)) return fromCookie\n\n // 3. Accept-Language header\n const acceptLang = headerStore.get('accept-language')\n if (acceptLang) {\n for (const part of acceptLang.split(',')) {\n const lang = part.split(';')[0].trim()\n if (__locales.includes(lang)) return lang\n const prefix = lang.split('-')[0]\n const match = __locales.find(l => l === prefix || l.startsWith(prefix + '-'))\n if (match) return match\n }\n }\n\n return '${defaultLocaleSafe}'\n } catch {\n return '${defaultLocaleSafe}'\n }\n },`\n\n const localesArrayStr = JSON.stringify(locales)\n\n const moduleSource = `// Auto-generated by @fluenti/next — do not edit\n// @ts-nocheck\nimport { createServerI18n } from '@fluenti/react/server'\nimport { createElement } from 'react'\n${resolveLocaleImport ? `${resolveLocaleImport}\\n` : ''}\nconst __locales = ${localesArrayStr}\n\nconst serverI18n = createServerI18n({\n loadMessages: async (locale) => {\n switch (locale) {\n${localeImports}\n default: return import('${compiledRelative}/${defaultLocaleSafe}')\n }\n },\n fallbackLocale: '${defaultLocaleSafe}',\n fallbackChain: ${fallbackChainStr},\n ${resolveLocaleFn}\n})\n\nexport const setLocale = serverI18n.setLocale\nexport const getI18n = serverI18n.getI18n\nexport const t = (..._args) => {\n throw new Error(\n \"[fluenti] \\`t\\` imported from '@fluenti/next' is a compile-time API replaced at build time.\\\\n\" +\n ' Ensure:\\\\n' +\n ' 1. \\`withFluenti()\\` is configured in next.config.ts\\\\n' +\n ' 2. The file is inside src/ (not node_modules)\\\\n' +\n \" 3. For client components, import from '@fluenti/react'\",\n )\n}\nexport const Trans = serverI18n.Trans\nexport const Plural = serverI18n.Plural\nexport const Select = serverI18n.Select\nexport const DateTime = serverI18n.DateTime\nexport const NumberFormat = serverI18n.NumberFormat\n\n/**\n * Async server component for root layouts.\n *\n * Sets up both server-side (React.cache) and client-side (I18nProvider) i18n.\n */\nexport async function I18nProvider({ locale, children }) {\n const activeLocale = (locale && locale.trim()) ? locale : '${defaultLocaleSafe}'\n\n // 1. Initialize server-side i18n (React.cache scoped)\n serverI18n.setLocale(activeLocale)\n await serverI18n.getI18n()\n\n // 2. Import the local 'use client' provider that has messages statically bundled.\n // Messages contain functions (interpolation) which can't be serialized across the RSC boundary.\n const { ClientI18nProvider } = await import('./client-provider.js')\n\n return createElement(ClientI18nProvider, {\n locale: activeLocale,\n fallbackLocale: '${defaultLocaleSafe}',\n fallbackChain: ${fallbackChainStr},\n }, children)\n}\n`\n\n const dtsSource = `// Auto-generated by @fluenti/next — do not edit\nimport type { ReactNode, ReactElement } from 'react'\nimport type { CompileTimeT, FluentiCoreInstanceFull } from '@fluenti/core'\n\nexport declare function setLocale(locale: string): void\nexport declare function getI18n(): Promise<FluentiCoreInstanceFull & { locale: string }>\nexport declare const t: CompileTimeT\n\nexport declare function Trans(props: {\n children: ReactNode\n id?: string\n context?: string\n comment?: string\n render?: (translation: ReactNode) => ReactNode\n}): Promise<ReactElement>\n\nexport declare function Plural(props: {\n value: number\n id?: string\n context?: string\n comment?: string\n zero?: ReactNode\n one?: ReactNode\n two?: ReactNode\n few?: ReactNode\n many?: ReactNode\n other: ReactNode\n offset?: number\n}): Promise<ReactElement>\n\nexport declare function Select(props: {\n value: string\n id?: string\n context?: string\n comment?: string\n other: ReactNode\n options?: Record<string, ReactNode>\n [key: string]: ReactNode | Record<string, ReactNode> | string | undefined\n}): Promise<ReactElement>\n\nexport declare function DateTime(props: {\n value: Date | number\n style?: string\n}): Promise<ReactElement>\n\nexport declare function NumberFormat(props: {\n value: number\n style?: string\n}): Promise<ReactElement>\n\nexport declare function I18nProvider(props: {\n locale?: string\n children: ReactNode\n}): Promise<ReactElement>\n`\n\n writeFileSync(outPath, moduleSource, 'utf-8')\n writeFileSync(dtsPath, dtsSource, 'utf-8')\n\n return outPath\n}\n\n/** Escape a string for safe embedding inside a single-quoted JS string literal. */\nfunction escapeJsSingleQuoted(s: string): string {\n return s.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")\n}\n\nfunction toForwardSlash(p: string): string {\n return p.split('\\\\').join('/')\n}\n","import { exec } from 'node:child_process'\nimport { existsSync } from 'node:fs'\nimport { resolve, dirname, join } from 'node:path'\nimport { createRequire } from 'node:module'\n\nexport interface DevRunnerOptions {\n cwd: string\n onSuccess?: () => void\n onError?: (err: Error) => void\n /** If true, reject the promise on failure instead of swallowing the error */\n throwOnError?: boolean\n /** Run only compile (skip extract). Useful for production builds where source is unchanged. */\n compileOnly?: boolean\n /** Enable parallel compilation across locales using worker threads */\n parallelCompile?: boolean\n}\n\n/**\n * Walk up from `cwd` to find `node_modules/.bin/fluenti`.\n * Returns the absolute path or null if not found.\n */\nexport function resolveCliBin(cwd: string): string | null {\n let dir = cwd\n for (;;) {\n const bin = resolve(dir, 'node_modules/.bin/fluenti')\n if (existsSync(bin)) return bin\n const parent = dirname(dir)\n if (parent === dir) break\n dir = parent\n }\n return null\n}\n\n/**\n * Run compile in-process via `@fluenti/cli` (for compileOnly mode),\n * or fall back to shell-out for extract + compile (dev mode).\n */\nexport async function runExtractCompile(options: DevRunnerOptions): Promise<void> {\n if (options.compileOnly) {\n try {\n // Resolve @fluenti/cli from the project's cwd (not from this package's location)\n // using createRequire so pnpm's strict node_modules layout works correctly.\n // Use require() (not import()) to load @fluenti/cli — avoids CJS/ESM interop\n // issues when dynamic import() loads minified CJS with chunk requires.\n const projectRequire = createRequire(join(options.cwd, 'package.json'))\n const { runCompile } = projectRequire('@fluenti/cli')\n await runCompile(options.cwd)\n console.log('[fluenti] Compiling... done')\n options.onSuccess?.()\n return\n } catch (e) {\n const error = e instanceof Error ? e : new Error(String(e))\n if (options.throwOnError) throw error\n console.warn('[fluenti] Compile failed:', error.message)\n options.onError?.(error)\n return\n }\n }\n\n // Dev mode: try in-process extract + compile first (avoids shell-out overhead).\n // Step 1: check if @fluenti/cli is installed — if not, fall back to shell-out.\n // Step 2: run — errors here mean the CLI ran but failed; surface them, don't fall through.\n let fluentCli: { runExtract: (cwd: string) => Promise<void>; runCompile: (cwd: string, opts?: { parallel: boolean }) => Promise<void> } | null = null\n try {\n const projectRequire = createRequire(join(options.cwd, 'package.json'))\n fluentCli = projectRequire('@fluenti/cli')\n } catch {\n // @fluenti/cli not installed — fall back to shell-out\n }\n\n if (fluentCli) {\n try {\n await fluentCli.runExtract(options.cwd)\n if (options.parallelCompile) {\n await fluentCli.runCompile(options.cwd, { parallel: true })\n } else {\n await fluentCli.runCompile(options.cwd)\n }\n console.log('[fluenti] Extracting and compiling... done')\n options.onSuccess?.()\n return\n } catch (e) {\n const error = e instanceof Error ? e : new Error(String(e))\n if (options.throwOnError) throw error\n console.warn('[fluenti] Extract/compile failed:', error.message)\n options.onError?.(error)\n return\n }\n }\n\n const bin = resolveCliBin(options.cwd)\n if (!bin) {\n const msg = '[fluenti] CLI not found — skipping auto-compile. Install @fluenti/cli as a devDependency.'\n if (options.throwOnError) {\n return Promise.reject(new Error(msg))\n }\n console.warn(msg)\n return Promise.resolve()\n }\n\n const parallelFlag = options.parallelCompile ? ' --parallel' : ''\n const command = `${bin} extract && ${bin} compile${parallelFlag}`\n return new Promise<void>((resolve, reject) => {\n exec(\n command,\n { cwd: options.cwd },\n (err, _stdout, stderr) => {\n if (err) {\n const error = new Error(stderr || err.message)\n if (options.throwOnError) {\n reject(error)\n return\n }\n console.warn('[fluenti] Extract/compile failed:', error.message)\n options.onError?.(error)\n } else {\n console.log('[fluenti] Extracting and compiling... done')\n options.onSuccess?.()\n }\n resolve()\n },\n )\n })\n}\n\n/**\n * Create a debounced runner that collapses rapid calls.\n *\n * - If called while idle, schedules a run after `delay` ms.\n * - If called while a run is in progress, marks a pending rerun.\n * - Never runs concurrently.\n */\nexport function createDebouncedRunner(\n options: DevRunnerOptions,\n delay = 300,\n): () => void {\n let timer: ReturnType<typeof setTimeout> | null = null\n let running = false\n let pendingRerun = false\n\n async function execute(): Promise<void> {\n running = true\n try {\n await runExtractCompile(options)\n } finally {\n running = false\n if (pendingRerun) {\n pendingRerun = false\n schedule()\n }\n }\n }\n\n function schedule(): void {\n if (timer !== null) {\n clearTimeout(timer)\n }\n timer = setTimeout(() => {\n timer = null\n if (running) {\n pendingRerun = true\n } else {\n execute()\n }\n }, delay)\n }\n\n return schedule\n}\n","import { watch } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { createRequire } from 'node:module'\nimport { createDebouncedRunner } from './dev-runner'\n\nexport interface DevWatcherOptions {\n cwd: string\n compiledDir: string\n delay?: number\n /** Glob patterns from fluenti.config.ts `include` field */\n include?: string[]\n /** Glob patterns from fluenti.config.ts `exclude` field */\n exclude?: string[]\n /** Enable parallel compilation across locales using worker threads */\n parallelCompile?: boolean\n}\n\nlet activeWatcher: (() => void) | null = null\n\n/**\n * Extract watch directories from include glob patterns.\n *\n * Takes the static prefix before the first glob wildcard (`*`).\n * Falls back to `src` if no include patterns are provided.\n *\n * @example\n * extractWatchDirs('/proj', ['./src/**\\/*.tsx']) → ['/proj/src']\n * extractWatchDirs('/proj', ['./app/**\\/*.ts', './lib/**\\/*.ts']) → ['/proj/app', '/proj/lib']\n * extractWatchDirs('/proj', ['./**\\/*.ts']) → ['/proj']\n */\nexport function extractWatchDirs(cwd: string, include?: string[]): string[] {\n if (!include || include.length === 0) {\n return [resolve(cwd, 'src')]\n }\n\n const dirs = new Set<string>()\n for (const pattern of include) {\n const normalized = pattern.replace(/^\\.\\//, '')\n const staticPart = normalized.split('*')[0]!.replace(/\\/+$/, '')\n dirs.add(staticPart || '.')\n }\n return [...dirs].map(d => resolve(cwd, d))\n}\n\n/**\n * Start a standalone file watcher for dev auto-compile.\n *\n * Works independently of webpack/Turbopack — watches source directories\n * (inferred from `include` patterns) for changes and triggers\n * extract+compile via the debounced runner.\n *\n * Only one watcher is active at a time (guards against multiple `applyFluenti()` calls).\n *\n * @returns A cleanup function that stops the watcher.\n */\nexport function startDevWatcher(options: DevWatcherOptions): () => void {\n // Clean up previous watcher if one exists (e.g., dev server reload)\n if (activeWatcher) {\n activeWatcher()\n }\n\n const { cwd, compiledDir, delay = 1000, include, exclude, parallelCompile } = options\n const compiledDirResolved = resolve(cwd, compiledDir)\n const _require = createRequire(import.meta.url)\n const picomatch = _require('picomatch') as (patterns: string[]) => (str: string) => boolean\n const isExcluded = exclude?.length ? picomatch(exclude) : () => false\n const runnerOpts: Parameters<typeof createDebouncedRunner>[0] = { cwd }\n if (parallelCompile) runnerOpts.parallelCompile = true\n const debouncedRun = createDebouncedRunner(runnerOpts, delay)\n\n // Initial run\n debouncedRun()\n\n const watchDirs = extractWatchDirs(cwd, include)\n const watchers = watchDirs.map(dir =>\n watch(dir, { recursive: true }, (_event, filename) => {\n if (!filename) return\n if (!/\\.[jt]sx?$/.test(filename)) return\n if (filename.includes('node_modules') || filename.includes('.next')) return\n const full = resolve(dir, filename)\n if (full.startsWith(compiledDirResolved)) return\n if (isExcluded(filename)) return\n debouncedRun()\n }),\n )\n\n const cleanup = (): void => {\n for (const w of watchers) w.close()\n activeWatcher = null\n }\n\n activeWatcher = cleanup\n return cleanup\n}\n","import { existsSync } from 'node:fs'\nimport { resolve, dirname } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport type { WithFluentConfig } from './types'\nimport { resolveConfig } from './read-config'\nimport { generateServerModule } from './generate-server-module'\nimport { startDevWatcher } from './dev-watcher'\n\ntype NextConfig = Record<string, unknown>\n\n/**\n * Wrap your Next.js config with Fluenti support.\n *\n * Adds a webpack loader that transforms `t\\`\\`` and `t()` calls,\n * and generates a server module for RSC i18n.\n *\n * @example\n * ```ts\n * // next.config.ts — function style (recommended)\n * import { withFluenti } from '@fluenti/next'\n * export default withFluenti()({ reactStrictMode: true })\n * ```\n *\n * @example\n * ```ts\n * // next.config.ts — direct style\n * import { withFluenti } from '@fluenti/next'\n * export default withFluenti({ reactStrictMode: true })\n * ```\n */\nexport function withFluenti(fluentConfig?: WithFluentConfig): (nextConfig?: NextConfig) => NextConfig\nexport function withFluenti(nextConfig: NextConfig): NextConfig\nexport function withFluenti(\n configOrNext?: WithFluentConfig | NextConfig,\n): NextConfig | ((nextConfig?: NextConfig) => NextConfig) {\n if (configOrNext && !isFluentConfig(configOrNext as Record<string, unknown>)) {\n // Has keys but none are fluent-specific → treat as NextConfig\n return applyFluenti({}, configOrNext as NextConfig)\n }\n\n const fluentConfig = (configOrNext ?? {}) as WithFluentConfig\n return function wrappedConfig(nextConfig?: NextConfig): NextConfig {\n return applyFluenti(fluentConfig, nextConfig ?? {})\n }\n}\n\nfunction isFluentConfig(obj: Record<string, unknown>): boolean {\n const fluentOnlyKeys = [\n 'config', 'serverModule', 'serverModuleOutDir', 'resolveLocale',\n 'cookieName', 'loaderEnforce',\n ]\n return fluentOnlyKeys.some((key) => key in obj)\n}\n\nfunction applyFluenti(\n fluentConfig: WithFluentConfig,\n nextConfig: NextConfig,\n): NextConfig {\n const projectRoot = process.cwd()\n const resolved = resolveConfig(projectRoot, fluentConfig)\n const fluentiConfig = resolved.fluentiConfig\n const compiledDir = fluentiConfig.compileOutDir\n\n // Warn if compiled catalogs directory doesn't exist yet\n const compiledDirAbs = resolve(projectRoot, compiledDir)\n if (!existsSync(compiledDirAbs)) {\n console.warn(\n `\\n[fluenti] Compiled catalogs not found at ${compiledDir}.\\n` +\n `Run: npx fluenti extract && npx fluenti compile\\n`,\n )\n }\n\n // Generate server module for RSC\n const serverModulePath = generateServerModule(projectRoot, resolved)\n\n // Resolve the loader path — use import.meta.url for ESM compatibility\n const thisDir = typeof __dirname !== 'undefined'\n ? __dirname\n : dirname(fileURLToPath(import.meta.url))\n const loaderPath = resolve(thisDir, 'loader.js')\n\n const existingWebpack = nextConfig['webpack'] as\n | ((config: WebpackConfig, options: WebpackOptions) => WebpackConfig)\n | undefined\n\n let buildCompileRan = false\n\n // ── Turbopack config ──────────────────────────────────────────────\n // Turbopack loader-runner supports webpack loaders via turbopack.rules.\n // Use package name (not file path) — Turbopack resolves loaders as packages,\n // file paths trigger static analysis errors (TP1006) in the loader-runner.\n const fluentTurboRules = Object.fromEntries(\n ['*.ts', '*.tsx', '*.js', '*.jsx'].map((ext) => [\n ext,\n {\n condition: { not: 'foreign' },\n loaders: ['@fluenti/next/loader'],\n },\n ]),\n )\n\n // Turbopack resolveAlias requires relative paths (absolute paths get\n // misinterpreted as \"./abs/path\"). Use \"./\" + relative-from-cwd.\n const relativeServerModule = './' + serverModulePath\n .replace(projectRoot + '/', '')\n .replace(projectRoot + '\\\\', '')\n const fluentTurboAlias: Record<string, string> = {\n '@fluenti/next': relativeServerModule,\n }\n\n // ── Dev auto-compile via standalone watcher (works with both webpack & Turbopack) ──\n const isDev = process.env['NODE_ENV'] === 'development'\n || process.argv.some(a => a === 'dev')\n const devAutoCompile = fluentiConfig.devAutoCompile ?? true\n\n if (isDev && devAutoCompile) {\n const watcherOpts: Parameters<typeof startDevWatcher>[0] = {\n cwd: projectRoot,\n compiledDir,\n delay: fluentiConfig.devAutoCompileDelay ?? 1000,\n }\n if (fluentiConfig.parallelCompile) watcherOpts.parallelCompile = true\n if (fluentiConfig.include) watcherOpts.include = fluentiConfig.include\n if (fluentiConfig.exclude) watcherOpts.exclude = fluentiConfig.exclude\n startDevWatcher(watcherOpts)\n }\n\n return {\n ...nextConfig,\n turbopack: mergeTurbopackConfig(\n nextConfig['turbopack'] as Record<string, unknown> | undefined,\n { rules: fluentTurboRules, resolveAlias: fluentTurboAlias },\n ),\n webpack(config: WebpackConfig, options: WebpackOptions) {\n // Add fluenti loader\n const loaderEnforce = fluentConfig.loaderEnforce === undefined && !('loaderEnforce' in (fluentConfig as Record<string, unknown>))\n ? 'pre' as const\n : fluentConfig.loaderEnforce\n config.module.rules.push({\n test: /\\.[jt]sx?$/,\n ...(loaderEnforce ? { enforce: loaderEnforce } : {}),\n exclude: [/node_modules/, /\\.next/],\n use: [\n {\n loader: loaderPath,\n options: {\n serverModulePath,\n },\n },\n ],\n })\n\n // Add resolve alias so loader can import from generated server module\n config.resolve = config.resolve ?? {} as WebpackConfig['resolve']\n config.resolve.alias = config.resolve.alias ?? {}\n config.resolve.alias['@fluenti/next$'] = serverModulePath\n\n // Auto compile before production build via async beforeRun hook\n const buildAutoCompile = fluentiConfig.buildAutoCompile ?? true\n if (!options.dev && buildAutoCompile) {\n config.plugins = config.plugins ?? []\n config.plugins.push({\n apply(compiler: WebpackCompiler) {\n compiler.hooks.beforeRun.tapPromise('fluenti-compile', async () => {\n if (buildCompileRan) return\n buildCompileRan = true\n // Step 1: try to load @fluenti/cli — if not installed, skip silently\n let fluentCli: { runCompile: (cwd: string, opts?: { parallel?: boolean }) => Promise<void> }\n try {\n // @ts-expect-error — @fluenti/cli is an optional peer dependency\n fluentCli = await import('@fluenti/cli')\n } catch {\n // @fluenti/cli not installed — optional peer dep, nothing to do\n return\n }\n // Step 2: run compile — errors here mean compilation failed, let them surface\n await fluentCli.runCompile(projectRoot, fluentiConfig.parallelCompile ? { parallel: true } : undefined)\n })\n },\n })\n }\n\n // Call user's webpack config if provided\n if (existingWebpack) {\n return existingWebpack(config, options)\n }\n\n return config\n },\n }\n}\n\nfunction mergeTurbopackConfig(\n existing: Record<string, unknown> | undefined,\n fluenti: { rules: Record<string, unknown>; resolveAlias: Record<string, string> },\n): Record<string, unknown> {\n const base = existing ?? {}\n const userRules = (base['rules'] as Record<string, unknown>) ?? {}\n\n // Warn when user rules override fluenti's source-file rules\n const fluentKeys = Object.keys(fluenti.rules)\n const overlapping = fluentKeys.filter(k => k in userRules)\n if (overlapping.length > 0) {\n console.warn(\n `[fluenti] Your turbopack.rules override Fluenti's loader for: ${overlapping.join(', ')}.\\n` +\n ` Fluenti's t\\`\\` transform will NOT run on these file types.\\n` +\n ` If this is intentional, you can suppress this warning with { devAutoCompile: false }.`,\n )\n }\n\n return {\n ...base,\n rules: { ...fluenti.rules, ...userRules },\n resolveAlias: { ...fluenti.resolveAlias, ...(base['resolveAlias'] as Record<string, string>) },\n }\n}\n\n// Minimal webpack types for the config function\ninterface WebpackCompiler {\n hooks: {\n beforeRun: {\n tapPromise(name: string, cb: () => Promise<void>): void\n }\n }\n}\n\ninterface WebpackConfig {\n module: {\n rules: Array<Record<string, unknown>>\n }\n resolve: {\n alias?: Record<string, string>\n }\n plugins?: Array<{ apply(compiler: WebpackCompiler): void }>\n}\n\ninterface WebpackOptions {\n isServer: boolean\n dev: boolean\n}\n","/**\n * @fluenti/next — Next.js plugin for Fluenti\n *\n * Provides:\n * - `withFluenti()` — wraps next.config.ts with t`` transform support\n * - I18nProvider — async server component (exported from generated module)\n * - Webpack loader for strict, binding-aware tagged-template optimization\n *\n * @example\n * ```ts\n * // next.config.ts\n * import { withFluenti } from '@fluenti/next'\n * export default withFluenti()({ reactStrictMode: true })\n * ```\n *\n * @example\n * ```tsx\n * // app/layout.tsx — resolved by webpack alias to the generated module\n * import { I18nProvider } from '@fluenti/next'\n * ```\n */\nexport { withFluenti } from './with-fluenti'\nexport type { WithFluentConfig, I18nProviderProps } from './types'\n\n// ── Runtime stubs ────────────────────────────────────────────────────\n// TypeScript resolves types from this file (via package.json exports).\n// At runtime, webpack `resolve.alias` redirects `@fluenti/next$` to the\n// generated server module, so these stubs are never actually called in\n// a correctly configured project. They exist only to provide helpful\n// errors if `withFluenti()` is not configured.\n\nimport type { ReactNode, ReactElement } from 'react'\nimport type { CompileTimeT, FluentiCoreInstanceFull } from '@fluenti/core'\n\nconst NOT_CONFIGURED =\n '[fluenti] `withFluenti()` must be configured in next.config.ts before importing from \"@fluenti/next\".'\n\nfunction throwNotConfigured(): never {\n throw new Error(NOT_CONFIGURED)\n}\n\n/** @see Generated module for the real implementation. */\nexport const setLocale: (locale: string) => void = throwNotConfigured\n/** @see Generated module for the real implementation. */\nexport const getI18n: () => Promise<FluentiCoreInstanceFull & { locale: string }> = throwNotConfigured as () => Promise<FluentiCoreInstanceFull & { locale: string }>\n/** @see Generated module for the real implementation. */\nexport const t: CompileTimeT = throwNotConfigured as unknown as CompileTimeT\n/** @see Generated module for the real implementation. */\nexport const Trans: (props: { children: ReactNode; id?: string; context?: string; comment?: string; render?: (translation: ReactNode) => ReactNode }) => Promise<ReactElement> = throwNotConfigured as unknown as typeof Trans\n/** @see Generated module for the real implementation. */\nexport const Plural: (props: { value: number; id?: string; context?: string; comment?: string; zero?: ReactNode; one?: ReactNode; two?: ReactNode; few?: ReactNode; many?: ReactNode; other: ReactNode; offset?: number }) => Promise<ReactElement> = throwNotConfigured as unknown as typeof Plural\n/** @see Generated module for the real implementation. */\nexport const Select: (props: { value: string; id?: string; context?: string; comment?: string; other: ReactNode; options?: Record<string, ReactNode>; [key: string]: ReactNode | Record<string, ReactNode> | string | undefined }) => Promise<ReactElement> = throwNotConfigured as unknown as typeof Select\n/** @see Generated module for the real implementation. */\nexport const DateTime: (props: { value: Date | number; style?: string }) => Promise<ReactElement> = throwNotConfigured as unknown as typeof DateTime\n/** @see Generated module for the real implementation. */\nexport const NumberFormat: (props: { value: number; style?: string }) => Promise<ReactElement> = throwNotConfigured as unknown as typeof NumberFormat\n/** @see Generated module for the real implementation. */\nexport const I18nProvider: (props: { locale?: string; children: ReactNode }) => Promise<ReactElement> = throwNotConfigured as unknown as typeof I18nProvider\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../src/read-config.ts","../src/generate-server-module.ts","../src/dev-runner.ts","../src/dev-watcher.ts","../src/with-fluenti.ts","../src/index.ts"],"sourcesContent":["import { loadConfigSync, DEFAULT_FLUENTI_CONFIG } from '@fluenti/core/config'\nimport type { FluentiBuildConfig } from '@fluenti/core/internal'\nimport type { WithFluentConfig, ResolvedFluentConfig } from './types'\n\n/**\n * Read fluenti.config.ts and merge with withFluenti() overrides.\n *\n * Delegates config file loading to `@fluenti/core`'s shared `loadConfigSync()`.\n */\nexport function resolveConfig(\n projectRoot: string,\n overrides?: WithFluentConfig,\n): ResolvedFluentConfig {\n let fluentiConfig: FluentiBuildConfig\n\n if (overrides?.config && typeof overrides.config === 'object') {\n // Inline config — merge with defaults\n fluentiConfig = { ...DEFAULT_FLUENTI_CONFIG, ...overrides.config }\n } else {\n // string path or auto-discover\n fluentiConfig = loadConfigSync(\n typeof overrides?.config === 'string' ? overrides.config : undefined,\n projectRoot,\n )\n }\n\n const serverModuleOutDir = overrides?.serverModuleOutDir ?? '.fluenti'\n const cookieName = overrides?.cookieName ?? 'locale'\n\n const resolved: ResolvedFluentConfig = {\n fluentiConfig,\n serverModule: overrides?.serverModule ?? null,\n serverModuleOutDir,\n cookieName,\n }\n if (overrides?.resolveLocale) resolved.resolveLocale = overrides.resolveLocale\n return resolved\n}\n","import { writeFileSync, mkdirSync, existsSync } from 'node:fs'\nimport { resolve, relative } from 'node:path'\nimport { validateLocale } from '@fluenti/core'\nimport { resolveLocaleCodes } from '@fluenti/core/internal'\nimport type { ResolvedFluentConfig } from './types'\n\n/**\n * Generate the server module that provides:\n * - setLocale / getI18n\n * - Trans / Plural / Select / DateTime / NumberFormat (server components)\n * - I18nProvider (async server component for layouts)\n *\n * @returns Absolute path to the generated server module.\n */\nexport function generateServerModule(\n projectRoot: string,\n config: ResolvedFluentConfig,\n): string {\n if (config.serverModule) {\n return resolve(projectRoot, config.serverModule)\n }\n\n const outDir = resolve(projectRoot, config.serverModuleOutDir)\n const outPath = resolve(outDir, 'server.js')\n const dtsPath = resolve(outDir, 'server.d.ts')\n\n if (!existsSync(outDir)) {\n mkdirSync(outDir, { recursive: true })\n }\n\n const locales = resolveLocaleCodes(config.fluentiConfig.locales)\n const defaultLocale = config.fluentiConfig.defaultLocale ?? config.fluentiConfig.sourceLocale\n const compiledDir = config.fluentiConfig.compileOutDir\n const fallbackChain = config.fluentiConfig.fallbackChain\n const cookieName = escapeJsSingleQuoted(config.cookieName)\n const defaultLocaleSafe = escapeJsSingleQuoted(defaultLocale)\n\n for (const locale of locales) {\n validateLocale(locale, 'next-plugin')\n }\n\n const compiledDirAbs = resolve(projectRoot, compiledDir)\n const compiledRelative = toForwardSlash(relative(outDir, compiledDirAbs))\n\n const localeImports = locales\n .map((locale) => ` case '${escapeJsSingleQuoted(locale)}': return import('${compiledRelative}/${locale}')`)\n .join('\\n')\n\n const fallbackChainStr = fallbackChain\n ? JSON.stringify(fallbackChain)\n : 'undefined'\n\n // Generate a 'use client' provider that imports messages statically.\n // Messages contain functions (interpolation) which can't cross the RSC boundary.\n const clientProviderPath = resolve(outDir, 'client-provider.js')\n\n const clientStaticImports = locales\n .map((locale) => {\n const safe = locale.replace(/[^a-zA-Z0-9]/g, '_')\n return `import ${safe} from '${compiledRelative}/${locale}'`\n })\n .join('\\n')\n\n const clientAllMessagesEntries = locales\n .map((locale) => {\n const safe = locale.replace(/[^a-zA-Z0-9]/g, '_')\n return `'${escapeJsSingleQuoted(locale)}': ${safe}`\n })\n .join(', ')\n\n const clientProviderSource = `\"use client\";\n// Auto-generated by @fluenti/next — do not edit\n// @ts-nocheck\nimport { createElement } from 'react'\nimport { I18nProvider } from '@fluenti/react'\n${clientStaticImports}\n\nconst __allMessages = { ${clientAllMessagesEntries} }\n\nexport function ClientI18nProvider({ locale, fallbackLocale, fallbackChain, children }) {\n return createElement(I18nProvider, { locale, fallbackLocale, messages: __allMessages, fallbackChain }, children)\n}\n`\n writeFileSync(clientProviderPath, clientProviderSource, 'utf-8')\n\n const clientProviderDtsPath = resolve(outDir, 'client-provider.d.ts')\n const clientProviderDtsSource = `// Auto-generated by @fluenti/next — do not edit\nimport type { ReactNode, ReactElement } from 'react'\n\nexport declare function ClientI18nProvider(props: {\n locale: string\n fallbackLocale: string\n fallbackChain?: Record<string, string[]>\n children: ReactNode\n}): ReactElement\n`\n writeFileSync(clientProviderDtsPath, clientProviderDtsSource, 'utf-8')\n\n const resolveLocaleImport = config.resolveLocale\n ? (() => {\n const absPath = resolve(projectRoot, config.resolveLocale)\n const relPath = toForwardSlash(relative(outDir, absPath))\n return `import __resolveLocale from '${relPath}'`\n })()\n : null\n\n const resolveLocaleFn = config.resolveLocale\n ? `resolveLocale: __resolveLocale,`\n : `resolveLocale: async () => {\n try {\n const { cookies, headers } = await import('next/headers')\n const [cookieStore, headerStore] = await Promise.all([cookies(), headers()])\n\n // 1. Referer URL path segment (available in Server Action context)\n const referer = headerStore.get('referer')\n if (referer) {\n try {\n const seg = new URL(referer).pathname.split('/')[1]\n if (seg && __locales.includes(seg)) return seg\n } catch {}\n }\n\n // 2. Cookie (configurable name)\n const fromCookie = cookieStore.get('${cookieName}')?.value\n if (fromCookie && __locales.includes(fromCookie)) return fromCookie\n\n // 3. Accept-Language header\n const acceptLang = headerStore.get('accept-language')\n if (acceptLang) {\n for (const part of acceptLang.split(',')) {\n const lang = part.split(';')[0].trim()\n if (__locales.includes(lang)) return lang\n const prefix = lang.split('-')[0]\n const match = __locales.find(l => l === prefix || l.startsWith(prefix + '-'))\n if (match) return match\n }\n }\n\n return '${defaultLocaleSafe}'\n } catch {\n return '${defaultLocaleSafe}'\n }\n },`\n\n const localesArrayStr = JSON.stringify(locales)\n\n const moduleSource = `// Auto-generated by @fluenti/next — do not edit\n// @ts-nocheck\nimport { createServerI18n } from '@fluenti/react/server'\nimport { createElement } from 'react'\n${resolveLocaleImport ? `${resolveLocaleImport}\\n` : ''}\nconst __locales = ${localesArrayStr}\n\nconst serverI18n = createServerI18n({\n loadMessages: async (locale) => {\n switch (locale) {\n${localeImports}\n default: return import('${compiledRelative}/${defaultLocaleSafe}')\n }\n },\n fallbackLocale: '${defaultLocaleSafe}',\n fallbackChain: ${fallbackChainStr},\n ${resolveLocaleFn}\n})\n\nexport const setLocale = serverI18n.setLocale\nexport const getI18n = serverI18n.getI18n\nexport const t = (..._args) => {\n throw new Error(\n \"[fluenti] \\`t\\` imported from '@fluenti/next' is a compile-time API replaced at build time.\\\\n\" +\n ' Ensure:\\\\n' +\n ' 1. \\`withFluenti()\\` is configured in next.config.ts\\\\n' +\n ' 2. The file is inside src/ (not node_modules)\\\\n' +\n \" 3. For client components, import from '@fluenti/react'\",\n )\n}\nexport const Trans = serverI18n.Trans\nexport const Plural = serverI18n.Plural\nexport const Select = serverI18n.Select\nexport const DateTime = serverI18n.DateTime\nexport const NumberFormat = serverI18n.NumberFormat\n\n/**\n * Async server component for root layouts.\n *\n * Sets up both server-side (React.cache) and client-side (I18nProvider) i18n.\n */\nexport async function I18nProvider({ locale, children }) {\n const activeLocale = (locale && locale.trim()) ? locale : '${defaultLocaleSafe}'\n\n // 1. Initialize server-side i18n (React.cache scoped)\n serverI18n.setLocale(activeLocale)\n await serverI18n.getI18n()\n\n // 2. Import the local 'use client' provider that has messages statically bundled.\n // Messages contain functions (interpolation) which can't be serialized across the RSC boundary.\n const { ClientI18nProvider } = await import('./client-provider.js')\n\n return createElement(ClientI18nProvider, {\n locale: activeLocale,\n fallbackLocale: '${defaultLocaleSafe}',\n fallbackChain: ${fallbackChainStr},\n }, children)\n}\n`\n\n const dtsSource = `// Auto-generated by @fluenti/next — do not edit\nimport type { ReactNode, ReactElement } from 'react'\nimport type { CompileTimeT, FluentiCoreInstanceFull } from '@fluenti/core'\n\nexport declare function setLocale(locale: string): void\nexport declare function getI18n(): Promise<FluentiCoreInstanceFull & { locale: string }>\nexport declare const t: CompileTimeT\n\nexport declare function Trans(props: {\n children: ReactNode\n id?: string\n context?: string\n comment?: string\n render?: (translation: ReactNode) => ReactNode\n}): Promise<ReactElement>\n\nexport declare function Plural(props: {\n value: number\n id?: string\n context?: string\n comment?: string\n zero?: ReactNode\n one?: ReactNode\n two?: ReactNode\n few?: ReactNode\n many?: ReactNode\n other: ReactNode\n offset?: number\n}): Promise<ReactElement>\n\nexport declare function Select(props: {\n value: string\n id?: string\n context?: string\n comment?: string\n other: ReactNode\n options?: Record<string, ReactNode>\n [key: string]: ReactNode | Record<string, ReactNode> | string | undefined\n}): Promise<ReactElement>\n\nexport declare function DateTime(props: {\n value: Date | number\n style?: string\n}): Promise<ReactElement>\n\nexport declare function NumberFormat(props: {\n value: number\n style?: string\n}): Promise<ReactElement>\n\nexport declare function I18nProvider(props: {\n locale?: string\n children: ReactNode\n}): Promise<ReactElement>\n`\n\n writeFileSync(outPath, moduleSource, 'utf-8')\n writeFileSync(dtsPath, dtsSource, 'utf-8')\n\n return outPath\n}\n\n/** Escape a string for safe embedding inside a single-quoted JS string literal. */\nfunction escapeJsSingleQuoted(s: string): string {\n return s.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")\n}\n\nfunction toForwardSlash(p: string): string {\n return p.split('\\\\').join('/')\n}\n","import { join } from 'node:path'\nimport { createRequire } from 'node:module'\n\nexport interface DevRunnerOptions {\n cwd: string\n onSuccess?: () => void\n onError?: (err: Error) => void\n /** If true, reject the promise on failure instead of swallowing the error */\n throwOnError?: boolean\n /** Run only compile (skip extract). Useful for production builds where source is unchanged. */\n compileOnly?: boolean\n /** Enable parallel compilation across locales using worker threads */\n parallelCompile?: boolean\n}\n\n/**\n * Run compile in-process via `@fluenti/cli` (for compileOnly mode),\n * or extract + compile in dev mode. Requires `@fluenti/cli` to be installed\n * as a devDependency.\n */\nexport async function runExtractCompile(options: DevRunnerOptions): Promise<void> {\n if (options.compileOnly) {\n try {\n // Resolve @fluenti/cli from the project's cwd (not from this package's location)\n // using createRequire so pnpm's strict node_modules layout works correctly.\n // Use require() (not import()) to load @fluenti/cli — avoids CJS/ESM interop\n // issues when dynamic import() loads minified CJS with chunk requires.\n const projectRequire = createRequire(join(options.cwd, 'package.json'))\n const { runCompile } = projectRequire('@fluenti/cli')\n await runCompile(options.cwd)\n console.log('[fluenti] Compiling... done')\n options.onSuccess?.()\n return\n } catch (e) {\n const error = e instanceof Error ? e : new Error(String(e))\n if (options.throwOnError) throw error\n console.warn('[fluenti] Compile failed:', error.message)\n options.onError?.(error)\n return\n }\n }\n\n // Dev mode: run in-process extract + compile.\n // Step 1: load @fluenti/cli — if not installed, guide user to install it.\n // Step 2: run — errors here mean the CLI ran but failed; surface them.\n let fluentCli: { runExtract: (cwd: string) => Promise<void>; runCompile: (cwd: string, opts?: { parallel: boolean }) => Promise<void> } | null = null\n try {\n const projectRequire = createRequire(join(options.cwd, 'package.json'))\n fluentCli = projectRequire('@fluenti/cli')\n } catch {\n // @fluenti/cli not installed — will show install guide below\n }\n\n if (fluentCli) {\n try {\n await fluentCli.runExtract(options.cwd)\n if (options.parallelCompile) {\n await fluentCli.runCompile(options.cwd, { parallel: true })\n } else {\n await fluentCli.runCompile(options.cwd)\n }\n console.log('[fluenti] Extracting and compiling... done')\n options.onSuccess?.()\n return\n } catch (e) {\n const error = e instanceof Error ? e : new Error(String(e))\n if (options.throwOnError) throw error\n console.warn('[fluenti] Extract/compile failed:', error.message)\n options.onError?.(error)\n return\n }\n }\n\n const msg =\n '[fluenti] @fluenti/cli is required for auto-compile.\\n' +\n ' Install it as a devDependency:\\n' +\n ' pnpm add -D @fluenti/cli\\n' +\n ' See: https://fluenti.dev/start/introduction/'\n if (options.throwOnError) {\n throw new Error(msg)\n }\n console.warn(msg)\n options.onError?.(new Error(msg))\n}\n\n/**\n * Create a debounced runner that collapses rapid calls.\n *\n * - If called while idle, schedules a run after `delay` ms.\n * - If called while a run is in progress, marks a pending rerun.\n * - Never runs concurrently.\n */\nexport function createDebouncedRunner(\n options: DevRunnerOptions,\n delay = 300,\n): () => void {\n let timer: ReturnType<typeof setTimeout> | null = null\n let running = false\n let pendingRerun = false\n\n async function execute(): Promise<void> {\n running = true\n try {\n await runExtractCompile(options)\n } finally {\n running = false\n if (pendingRerun) {\n pendingRerun = false\n schedule()\n }\n }\n }\n\n function schedule(): void {\n if (timer !== null) {\n clearTimeout(timer)\n }\n timer = setTimeout(() => {\n timer = null\n if (running) {\n pendingRerun = true\n } else {\n execute()\n }\n }, delay)\n }\n\n return schedule\n}\n","import { watch } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { createRequire } from 'node:module'\nimport { createDebouncedRunner } from './dev-runner'\n\nexport interface DevWatcherOptions {\n cwd: string\n compiledDir: string\n delay?: number\n /** Glob patterns from fluenti.config.ts `include` field */\n include?: string[]\n /** Glob patterns from fluenti.config.ts `exclude` field */\n exclude?: string[]\n /** Enable parallel compilation across locales using worker threads */\n parallelCompile?: boolean\n}\n\nlet activeWatcher: (() => void) | null = null\n\n/**\n * Extract watch directories from include glob patterns.\n *\n * Takes the static prefix before the first glob wildcard (`*`).\n * Falls back to `src` if no include patterns are provided.\n *\n * @example\n * extractWatchDirs('/proj', ['./src/**\\/*.tsx']) → ['/proj/src']\n * extractWatchDirs('/proj', ['./app/**\\/*.ts', './lib/**\\/*.ts']) → ['/proj/app', '/proj/lib']\n * extractWatchDirs('/proj', ['./**\\/*.ts']) → ['/proj']\n */\nexport function extractWatchDirs(cwd: string, include?: string[]): string[] {\n if (!include || include.length === 0) {\n return [resolve(cwd, 'src')]\n }\n\n const dirs = new Set<string>()\n for (const pattern of include) {\n const normalized = pattern.replace(/^\\.\\//, '')\n const staticPart = normalized.split('*')[0]!.replace(/\\/+$/, '')\n dirs.add(staticPart || '.')\n }\n return [...dirs].map(d => resolve(cwd, d))\n}\n\n/**\n * Start a standalone file watcher for dev auto-compile.\n *\n * Works independently of webpack/Turbopack — watches source directories\n * (inferred from `include` patterns) for changes and triggers\n * extract+compile via the debounced runner.\n *\n * Only one watcher is active at a time (guards against multiple `applyFluenti()` calls).\n *\n * @returns A cleanup function that stops the watcher.\n */\nexport function startDevWatcher(options: DevWatcherOptions): () => void {\n // Clean up previous watcher if one exists (e.g., dev server reload)\n if (activeWatcher) {\n activeWatcher()\n }\n\n const { cwd, compiledDir, delay = 1000, include, exclude, parallelCompile } = options\n const compiledDirResolved = resolve(cwd, compiledDir)\n const _require = createRequire(\n typeof __filename !== 'undefined' ? __filename : import.meta.url,\n )\n const picomatch = _require('picomatch') as (patterns: string[]) => (str: string) => boolean\n const isExcluded = exclude?.length ? picomatch(exclude) : () => false\n const runnerOpts: Parameters<typeof createDebouncedRunner>[0] = { cwd }\n if (parallelCompile) runnerOpts.parallelCompile = true\n const debouncedRun = createDebouncedRunner(runnerOpts, delay)\n\n // Initial run\n debouncedRun()\n\n const watchDirs = extractWatchDirs(cwd, include)\n const watchers = watchDirs.map(dir =>\n watch(dir, { recursive: true }, (_event, filename) => {\n if (!filename) return\n if (!/\\.[jt]sx?$/.test(filename)) return\n if (filename.includes('node_modules') || filename.includes('.next')) return\n const full = resolve(dir, filename)\n if (full.startsWith(compiledDirResolved)) return\n if (isExcluded(filename)) return\n debouncedRun()\n }),\n )\n\n const cleanup = (): void => {\n for (const w of watchers) w.close()\n activeWatcher = null\n }\n\n activeWatcher = cleanup\n return cleanup\n}\n","import { existsSync } from 'node:fs'\nimport { resolve, dirname } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport type { WithFluentConfig } from './types'\nimport { resolveConfig } from './read-config'\nimport { generateServerModule } from './generate-server-module'\nimport { startDevWatcher } from './dev-watcher'\n\ntype NextConfig = Record<string, unknown>\n\n/**\n * Wrap your Next.js config with Fluenti support.\n *\n * Adds a webpack loader that transforms `t\\`\\`` and `t()` calls,\n * and generates a server module for RSC i18n.\n *\n * @example\n * ```ts\n * // next.config.ts — function style (recommended)\n * import { withFluenti } from '@fluenti/next'\n * export default withFluenti()({ reactStrictMode: true })\n * ```\n *\n * @example\n * ```ts\n * // next.config.ts — direct style\n * import { withFluenti } from '@fluenti/next'\n * export default withFluenti({ reactStrictMode: true })\n * ```\n */\nexport function withFluenti(fluentConfig?: WithFluentConfig): (nextConfig?: NextConfig) => NextConfig\nexport function withFluenti(nextConfig: NextConfig): NextConfig\nexport function withFluenti(\n configOrNext?: WithFluentConfig | NextConfig,\n): NextConfig | ((nextConfig?: NextConfig) => NextConfig) {\n if (configOrNext && !isFluentConfig(configOrNext as Record<string, unknown>)) {\n // Has keys but none are fluent-specific → treat as NextConfig\n return applyFluenti({}, configOrNext as NextConfig)\n }\n\n const fluentConfig = (configOrNext ?? {}) as WithFluentConfig\n return function wrappedConfig(nextConfig?: NextConfig): NextConfig {\n return applyFluenti(fluentConfig, nextConfig ?? {})\n }\n}\n\nfunction isFluentConfig(obj: Record<string, unknown>): boolean {\n const fluentOnlyKeys = [\n 'config', 'serverModule', 'serverModuleOutDir', 'resolveLocale',\n 'cookieName', 'loaderEnforce',\n ]\n return fluentOnlyKeys.some((key) => key in obj)\n}\n\nfunction applyFluenti(\n fluentConfig: WithFluentConfig,\n nextConfig: NextConfig,\n): NextConfig {\n const projectRoot = process.cwd()\n const resolved = resolveConfig(projectRoot, fluentConfig)\n const fluentiConfig = resolved.fluentiConfig\n const compiledDir = fluentiConfig.compileOutDir\n\n // Warn if compiled catalogs directory doesn't exist yet\n const compiledDirAbs = resolve(projectRoot, compiledDir)\n if (!existsSync(compiledDirAbs)) {\n console.warn(\n `\\n[fluenti] Compiled catalogs not found at ${compiledDir}.\\n` +\n `Run: npx fluenti extract && npx fluenti compile\\n`,\n )\n }\n\n // Generate server module for RSC\n const serverModulePath = generateServerModule(projectRoot, resolved)\n\n // Resolve the loader path — use import.meta.url for ESM compatibility\n const thisDir = typeof __dirname !== 'undefined'\n ? __dirname\n : dirname(fileURLToPath(import.meta.url))\n const loaderPath = resolve(thisDir, 'loader.js')\n\n const existingWebpack = nextConfig['webpack'] as\n | ((config: WebpackConfig, options: WebpackOptions) => WebpackConfig)\n | undefined\n\n let buildCompileRan = false\n\n // ── Turbopack config ──────────────────────────────────────────────\n // Turbopack loader-runner supports webpack loaders via turbopack.rules.\n // Use package name (not file path) — Turbopack resolves loaders as packages,\n // file paths trigger static analysis errors (TP1006) in the loader-runner.\n const fluentTurboRules = Object.fromEntries(\n ['*.ts', '*.tsx', '*.js', '*.jsx'].map((ext) => [\n ext,\n {\n condition: { not: 'foreign' },\n loaders: ['@fluenti/next/loader'],\n },\n ]),\n )\n\n // Turbopack resolveAlias requires relative paths (absolute paths get\n // misinterpreted as \"./abs/path\"). Use \"./\" + relative-from-cwd.\n const relativeServerModule = './' + serverModulePath\n .replace(projectRoot + '/', '')\n .replace(projectRoot + '\\\\', '')\n const fluentTurboAlias: Record<string, string> = {\n '@fluenti/next': relativeServerModule,\n }\n\n // ── Dev auto-compile via standalone watcher (works with both webpack & Turbopack) ──\n const isDev = process.env['NODE_ENV'] === 'development'\n || process.argv.some(a => a === 'dev')\n const devAutoCompile = fluentiConfig.devAutoCompile ?? true\n\n if (isDev && devAutoCompile) {\n const watcherOpts: Parameters<typeof startDevWatcher>[0] = {\n cwd: projectRoot,\n compiledDir,\n delay: fluentiConfig.devAutoCompileDelay ?? 1000,\n }\n if (fluentiConfig.parallelCompile) watcherOpts.parallelCompile = true\n if (fluentiConfig.include) watcherOpts.include = fluentiConfig.include\n if (fluentiConfig.exclude) watcherOpts.exclude = fluentiConfig.exclude\n startDevWatcher(watcherOpts)\n }\n\n return {\n ...nextConfig,\n turbopack: mergeTurbopackConfig(\n nextConfig['turbopack'] as Record<string, unknown> | undefined,\n { rules: fluentTurboRules, resolveAlias: fluentTurboAlias },\n ),\n webpack(config: WebpackConfig, options: WebpackOptions) {\n // Add fluenti loader\n const loaderEnforce = fluentConfig.loaderEnforce === undefined && !('loaderEnforce' in (fluentConfig as Record<string, unknown>))\n ? 'pre' as const\n : fluentConfig.loaderEnforce\n config.module.rules.push({\n test: /\\.[jt]sx?$/,\n ...(loaderEnforce ? { enforce: loaderEnforce } : {}),\n exclude: [/node_modules/, /\\.next/],\n use: [\n {\n loader: loaderPath,\n options: {\n serverModulePath,\n },\n },\n ],\n })\n\n // Add resolve alias so loader can import from generated server module\n config.resolve = config.resolve ?? {} as WebpackConfig['resolve']\n config.resolve.alias = config.resolve.alias ?? {}\n config.resolve.alias['@fluenti/next$'] = serverModulePath\n\n // Auto compile before production build via async beforeRun hook\n const buildAutoCompile = fluentiConfig.buildAutoCompile ?? true\n if (!options.dev && buildAutoCompile) {\n config.plugins = config.plugins ?? []\n config.plugins.push({\n apply(compiler: WebpackCompiler) {\n compiler.hooks.beforeRun.tapPromise('fluenti-compile', async () => {\n if (buildCompileRan) return\n buildCompileRan = true\n // Step 1: try to load @fluenti/cli — if not installed, skip silently\n let fluentCli: { runCompile: (cwd: string, opts?: { parallel?: boolean }) => Promise<void> }\n try {\n // @ts-expect-error — @fluenti/cli is an optional peer dependency\n fluentCli = await import('@fluenti/cli')\n } catch {\n // @fluenti/cli not installed — optional peer dep, nothing to do\n return\n }\n // Step 2: run compile — errors here mean compilation failed, let them surface\n await fluentCli.runCompile(projectRoot, fluentiConfig.parallelCompile ? { parallel: true } : undefined)\n })\n },\n })\n }\n\n // Call user's webpack config if provided\n if (existingWebpack) {\n return existingWebpack(config, options)\n }\n\n return config\n },\n }\n}\n\nfunction mergeTurbopackConfig(\n existing: Record<string, unknown> | undefined,\n fluenti: { rules: Record<string, unknown>; resolveAlias: Record<string, string> },\n): Record<string, unknown> {\n const base = existing ?? {}\n const userRules = (base['rules'] as Record<string, unknown>) ?? {}\n\n // Warn when user rules override fluenti's source-file rules\n const fluentKeys = Object.keys(fluenti.rules)\n const overlapping = fluentKeys.filter(k => k in userRules)\n if (overlapping.length > 0) {\n console.warn(\n `[fluenti] Your turbopack.rules override Fluenti's loader for: ${overlapping.join(', ')}.\\n` +\n ` Fluenti's t\\`\\` transform will NOT run on these file types.\\n` +\n ` If this is intentional, you can suppress this warning with { devAutoCompile: false }.`,\n )\n }\n\n return {\n ...base,\n rules: { ...fluenti.rules, ...userRules },\n resolveAlias: { ...fluenti.resolveAlias, ...(base['resolveAlias'] as Record<string, string>) },\n }\n}\n\n// Minimal webpack types for the config function\ninterface WebpackCompiler {\n hooks: {\n beforeRun: {\n tapPromise(name: string, cb: () => Promise<void>): void\n }\n }\n}\n\ninterface WebpackConfig {\n module: {\n rules: Array<Record<string, unknown>>\n }\n resolve: {\n alias?: Record<string, string>\n }\n plugins?: Array<{ apply(compiler: WebpackCompiler): void }>\n}\n\ninterface WebpackOptions {\n isServer: boolean\n dev: boolean\n}\n","/**\n * @fluenti/next — Next.js plugin for Fluenti\n *\n * Provides:\n * - `withFluenti()` — wraps next.config.ts with t`` transform support\n * - I18nProvider — async server component (exported from generated module)\n * - Webpack loader for strict, binding-aware tagged-template optimization\n *\n * @example\n * ```ts\n * // next.config.ts\n * import { withFluenti } from '@fluenti/next'\n * export default withFluenti()({ reactStrictMode: true })\n * ```\n *\n * @example\n * ```tsx\n * // app/layout.tsx — resolved by webpack alias to the generated module\n * import { I18nProvider } from '@fluenti/next'\n * ```\n */\nexport { withFluenti } from './with-fluenti'\nexport type { WithFluentConfig, I18nProviderProps } from './types'\n\n// ── Runtime stubs ────────────────────────────────────────────────────\n// TypeScript resolves types from this file (via package.json exports).\n// At runtime, webpack `resolve.alias` redirects `@fluenti/next$` to the\n// generated server module, so these stubs are never actually called in\n// a correctly configured project. They exist only to provide helpful\n// errors if `withFluenti()` is not configured.\n\nimport type { ReactNode, ReactElement } from 'react'\nimport type { CompileTimeT, FluentiCoreInstanceFull } from '@fluenti/core'\n\nconst NOT_CONFIGURED =\n '[fluenti] `withFluenti()` must be configured in next.config.ts before importing from \"@fluenti/next\".'\n\nfunction throwNotConfigured(): never {\n throw new Error(NOT_CONFIGURED)\n}\n\n/** @see Generated module for the real implementation. */\nexport const setLocale: (locale: string) => void = throwNotConfigured\n/** @see Generated module for the real implementation. */\nexport const getI18n: () => Promise<FluentiCoreInstanceFull & { locale: string }> = throwNotConfigured as () => Promise<FluentiCoreInstanceFull & { locale: string }>\n/** @see Generated module for the real implementation. */\nexport const t: CompileTimeT = throwNotConfigured as unknown as CompileTimeT\n/** @see Generated module for the real implementation. */\nexport const Trans: (props: { children: ReactNode; id?: string; context?: string; comment?: string; render?: (translation: ReactNode) => ReactNode }) => Promise<ReactElement> = throwNotConfigured as unknown as typeof Trans\n/** @see Generated module for the real implementation. */\nexport const Plural: (props: { value: number; id?: string; context?: string; comment?: string; zero?: ReactNode; one?: ReactNode; two?: ReactNode; few?: ReactNode; many?: ReactNode; other: ReactNode; offset?: number }) => Promise<ReactElement> = throwNotConfigured as unknown as typeof Plural\n/** @see Generated module for the real implementation. */\nexport const Select: (props: { value: string; id?: string; context?: string; comment?: string; other: ReactNode; options?: Record<string, ReactNode>; [key: string]: ReactNode | Record<string, ReactNode> | string | undefined }) => Promise<ReactElement> = throwNotConfigured as unknown as typeof Select\n/** @see Generated module for the real implementation. */\nexport const DateTime: (props: { value: Date | number; style?: string }) => Promise<ReactElement> = throwNotConfigured as unknown as typeof DateTime\n/** @see Generated module for the real implementation. */\nexport const NumberFormat: (props: { value: number; style?: string }) => Promise<ReactElement> = throwNotConfigured as unknown as typeof NumberFormat\n/** @see Generated module for the real implementation. */\nexport const I18nProvider: (props: { locale?: string; children: ReactNode }) => Promise<ReactElement> = throwNotConfigured as unknown as typeof I18nProvider\n"],"mappings":"mQASA,SAAgB,EACd,EACA,EACsB,CACtB,IAAI,EAEJ,AAKE,EALE,GAAW,QAAU,OAAO,EAAU,QAAW,SAEnC,CAAE,GAAG,EAAA,uBAAwB,GAAG,EAAU,OAAQ,EAGlE,EAAA,EAAA,gBACE,OAAO,GAAW,QAAW,SAAW,EAAU,OAAS,IAAA,GAC3D,EACD,CAGH,IAAM,EAAqB,GAAW,oBAAsB,WACtD,EAAa,GAAW,YAAc,SAEtC,EAAiC,CACrC,gBACA,aAAc,GAAW,cAAgB,KACzC,qBACA,aACD,CAED,OADI,GAAW,gBAAe,EAAS,cAAgB,EAAU,eAC1D,ECtBT,SAAgB,EACd,EACA,EACQ,CACR,GAAI,EAAO,aACT,OAAA,EAAA,EAAA,SAAe,EAAa,EAAO,aAAa,CAGlD,IAAM,GAAA,EAAA,EAAA,SAAiB,EAAa,EAAO,mBAAmB,CACxD,GAAA,EAAA,EAAA,SAAkB,EAAQ,YAAY,CACtC,GAAA,EAAA,EAAA,SAAkB,EAAQ,cAAc,EAE1C,EAAA,EAAA,YAAY,EAAO,GACrB,EAAA,EAAA,WAAU,EAAQ,CAAE,UAAW,GAAM,CAAC,CAGxC,IAAM,GAAA,EAAA,EAAA,oBAA6B,EAAO,cAAc,QAAQ,CAC1D,EAAgB,EAAO,cAAc,eAAiB,EAAO,cAAc,aAC3E,EAAc,EAAO,cAAc,cACnC,EAAgB,EAAO,cAAc,cACrC,EAAa,EAAqB,EAAO,WAAW,CACpD,EAAoB,EAAqB,EAAc,CAE7D,IAAK,IAAM,KAAU,GACnB,EAAA,EAAA,gBAAe,EAAQ,cAAc,CAIvC,IAAM,EAAmB,GAAA,EAAA,EAAA,UAAwB,GAAA,EAAA,EAAA,SADlB,EAAa,EAAY,CACgB,CAAC,CAEnE,EAAgB,EACnB,IAAK,GAAW,eAAe,EAAqB,EAAO,CAAC,oBAAoB,EAAiB,GAAG,EAAO,IAAI,CAC/G,KAAK;EAAK,CAEP,EAAmB,EACrB,KAAK,UAAU,EAAc,CAC7B,aAiCJ,EAAA,EAAA,gBAAA,EAAA,EAAA,SA7BmC,EAAQ,qBAAqB,CAgBnC;;;;;EAdD,EACzB,IAAK,GAEG,UADM,EAAO,QAAQ,gBAAiB,IAAI,CAC3B,SAAS,EAAiB,GAAG,EAAO,GAC1D,CACD,KAAK;EAAK,CAcO;;0BAZa,EAC9B,IAAK,GAAW,CACf,IAAM,EAAO,EAAO,QAAQ,gBAAiB,IAAI,CACjD,MAAO,IAAI,EAAqB,EAAO,CAAC,KAAK,KAC7C,CACD,KAAK,KAAK,CASoC;;;;;EAMO,QAAQ,EAahE,EAAA,EAAA,gBAAA,EAAA,EAAA,SAXsC,EAAQ,uBAAuB,CACrC;;;;;;;;;EAU8B,QAAQ,CAEtE,IAAM,EAAsB,EAAO,cAItB,gCADS,GAAA,EAAA,EAAA,UAAwB,GAAA,EAAA,EAAA,SADhB,EAAa,EAAO,cAAc,CACF,CAAC,CACV,GAEjD,KAEE,EAAkB,EAAO,cAC3B,kCACA;;;;;;;;;;;;;;;4CAesC,EAAW;;;;;;;;;;;;;;;gBAevC,EAAkB;;gBAElB,EAAkB;;MAI1B,EAAkB,KAAK,UAAU,EAAQ,CAEzC,EAAe;;;;EAIrB,EAAsB,GAAG,EAAoB,IAAM,GAAG;oBACpC,EAAgB;;;;;EAKlC,EAAc;gCACgB,EAAiB,GAAG,EAAkB;;;qBAGjD,EAAkB;mBACpB,EAAiB;IAChC,EAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;+DA0B2C,EAAkB;;;;;;;;;;;;uBAY1D,EAAkB;qBACpB,EAAiB;;;EAgEpC,OAHA,EAAA,EAAA,eAAc,EAAS,EAAc,QAAQ,EAC7C,EAAA,EAAA,eAAc,EAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAW,QAAQ,CAEnC,EAIT,SAAS,EAAqB,EAAmB,CAC/C,OAAO,EAAE,QAAQ,MAAO,OAAO,CAAC,QAAQ,KAAM,MAAM,CAGtD,SAAS,EAAe,EAAmB,CACzC,OAAO,EAAE,MAAM,KAAK,CAAC,KAAK,IAAI,CC9PhC,eAAsB,EAAkB,EAA0C,CAChF,GAAI,EAAQ,YACV,GAAI,CAMF,GAAM,CAAE,eAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,MADkC,EAAQ,IAAK,eAAe,CAAC,CACjC,eAAe,CACrD,MAAM,EAAW,EAAQ,IAAI,CAC7B,QAAQ,IAAI,8BAA8B,CAC1C,EAAQ,aAAa,CACrB,aACO,EAAG,CACV,IAAM,EAAQ,aAAa,MAAQ,EAAQ,MAAM,OAAO,EAAE,CAAC,CAC3D,GAAI,EAAQ,aAAc,MAAM,EAChC,QAAQ,KAAK,4BAA6B,EAAM,QAAQ,CACxD,EAAQ,UAAU,EAAM,CACxB,OAOJ,IAAI,EAA6I,KACjJ,GAAI,CAEF,GAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,MAD0C,EAAQ,IAAK,eAAe,CAAC,CAC5C,eAAe,MACpC,EAIR,GAAI,EACF,GAAI,CACF,MAAM,EAAU,WAAW,EAAQ,IAAI,CACnC,EAAQ,gBACV,MAAM,EAAU,WAAW,EAAQ,IAAK,CAAE,SAAU,GAAM,CAAC,CAE3D,MAAM,EAAU,WAAW,EAAQ,IAAI,CAEzC,QAAQ,IAAI,6CAA6C,CACzD,EAAQ,aAAa,CACrB,aACO,EAAG,CACV,IAAM,EAAQ,aAAa,MAAQ,EAAQ,MAAM,OAAO,EAAE,CAAC,CAC3D,GAAI,EAAQ,aAAc,MAAM,EAChC,QAAQ,KAAK,oCAAqC,EAAM,QAAQ,CAChE,EAAQ,UAAU,EAAM,CACxB,OAIJ,IAAM,EACJ;;;gDAIF,GAAI,EAAQ,aACV,MAAU,MAAM,EAAI,CAEtB,QAAQ,KAAK,EAAI,CACjB,EAAQ,UAAc,MAAM,EAAI,CAAC,CAUnC,SAAgB,EACd,EACA,EAAQ,IACI,CACZ,IAAI,EAA8C,KAC9C,EAAU,GACV,EAAe,GAEnB,eAAe,GAAyB,CACtC,EAAU,GACV,GAAI,CACF,MAAM,EAAkB,EAAQ,QACxB,CACR,EAAU,GACN,IACF,EAAe,GACf,GAAU,GAKhB,SAAS,GAAiB,CACpB,IAAU,MACZ,aAAa,EAAM,CAErB,EAAQ,eAAiB,CACvB,EAAQ,KACJ,EACF,EAAe,GAEf,GAAS,EAEV,EAAM,CAGX,OAAO,EC9GT,IAAI,EAAqC,KAazC,SAAgB,EAAiB,EAAa,EAA8B,CAC1E,GAAI,CAAC,GAAW,EAAQ,SAAW,EACjC,MAAO,EAAA,EAAA,EAAA,SAAS,EAAK,MAAM,CAAC,CAG9B,IAAM,EAAO,IAAI,IACjB,IAAK,IAAM,KAAW,EAAS,CAE7B,IAAM,EADa,EAAQ,QAAQ,QAAS,GAAG,CACjB,MAAM,IAAI,CAAC,GAAI,QAAQ,OAAQ,GAAG,CAChE,EAAK,IAAI,GAAc,IAAI,CAE7B,MAAO,CAAC,GAAG,EAAK,CAAC,IAAI,IAAA,EAAA,EAAA,SAAa,EAAK,EAAE,CAAC,CAc5C,SAAgB,EAAgB,EAAwC,CAElE,GACF,GAAe,CAGjB,GAAM,CAAE,MAAK,cAAa,QAAQ,IAAM,UAAS,UAAS,mBAAoB,EACxE,GAAA,EAAA,EAAA,SAA8B,EAAK,EAAY,CAI/C,GAAA,EAAA,EAAA,eAFJ,OAAO,WAAe,IAAc,WAAA,EAAA,CAAyB,IAC9D,CAC0B,YAAY,CACjC,EAAa,GAAS,OAAS,EAAU,EAAQ,KAAS,GAC1D,EAA0D,CAAE,MAAK,CACnE,IAAiB,EAAW,gBAAkB,IAClD,IAAM,EAAe,EAAsB,EAAY,EAAM,CAG7D,GAAc,CAGd,IAAM,EADY,EAAiB,EAAK,EAAQ,CACrB,IAAI,IAAA,EAAA,EAAA,OACvB,EAAK,CAAE,UAAW,GAAM,EAAG,EAAQ,IAAa,CAC/C,GACA,aAAa,KAAK,EAAS,GAC5B,EAAS,SAAS,eAAe,EAAI,EAAS,SAAS,QAAQ,GAEnE,EAAA,EAAA,SADqB,EAAK,EAAS,CAC1B,WAAW,EAAoB,EACpC,EAAW,EAAS,EACxB,GAAc,GACd,CACH,CAEK,MAAsB,CAC1B,IAAK,IAAM,KAAK,EAAU,EAAE,OAAO,CACnC,EAAgB,MAIlB,MADA,GAAgB,EACT,EC9DT,SAAgB,EACd,EACwD,CACxD,GAAI,GAAgB,CAAC,EAAe,EAAwC,CAE1E,OAAO,EAAa,EAAE,CAAE,EAA2B,CAGrD,IAAM,EAAgB,GAAgB,EAAE,CACxC,OAAO,SAAuB,EAAqC,CACjE,OAAO,EAAa,EAAc,GAAc,EAAE,CAAC,EAIvD,SAAS,EAAe,EAAuC,CAK7D,MAJuB,CACrB,SAAU,eAAgB,qBAAsB,gBAChD,aAAc,gBACf,CACqB,KAAM,GAAQ,KAAO,EAAI,CAGjD,SAAS,EACP,EACA,EACY,CACZ,IAAM,EAAc,QAAQ,KAAK,CAC3B,EAAW,EAAc,EAAa,EAAa,CACnD,EAAgB,EAAS,cACzB,EAAc,EAAc,eAI9B,EAAA,EAAA,aAAA,EAAA,EAAA,SAD2B,EAAa,EAAY,CACzB,EAC7B,QAAQ,KACN,8CAA8C,EAAY,sDAE3D,CAIH,IAAM,EAAmB,EAAqB,EAAa,EAAS,CAM9D,GAAA,EAAA,EAAA,SAHU,OAAO,UAAc,IACjC,WAAA,EAAA,EAAA,UAAA,EAAA,EAAA,eAAA,EAAA,CACkC,IAAI,CAAC,CACP,YAAY,CAE1C,EAAkB,EAAW,QAI/B,EAAkB,GAMhB,EAAmB,OAAO,YAC9B,CAAC,OAAQ,QAAS,OAAQ,QAAQ,CAAC,IAAK,GAAQ,CAC9C,EACA,CACE,UAAW,CAAE,IAAK,UAAW,CAC7B,QAAS,CAAC,uBAAuB,CAClC,CACF,CAAC,CACH,CAIK,EAAuB,KAAO,EACjC,QAAQ,EAAc,IAAK,GAAG,CAC9B,QAAQ,EAAc,KAAM,GAAG,CAC5B,EAA2C,CAC/C,gBAAiB,EAClB,CAGK,EAAA,QAAA,IAAA,WAAoC,eACrC,QAAQ,KAAK,KAAK,GAAK,IAAM,MAAM,CAClC,EAAiB,EAAc,gBAAkB,GAEvD,GAAI,GAAS,EAAgB,CAC3B,IAAM,EAAqD,CACzD,IAAK,EACL,cACA,MAAO,EAAc,qBAAuB,IAC7C,CACG,EAAc,kBAAiB,EAAY,gBAAkB,IAC7D,EAAc,UAAS,EAAY,QAAU,EAAc,SAC3D,EAAc,UAAS,EAAY,QAAU,EAAc,SAC/D,EAAgB,EAAY,CAG9B,MAAO,CACL,GAAG,EACH,UAAW,EACT,EAAW,UACX,CAAE,MAAO,EAAkB,aAAc,EAAkB,CAC5D,CACD,QAAQ,EAAuB,EAAyB,CAEtD,IAAM,EAAgB,EAAa,gBAAkB,IAAA,IAAa,EAAE,kBAAoB,GACpF,MACA,EAAa,cACjB,EAAO,OAAO,MAAM,KAAK,CACvB,KAAM,aACN,GAAI,EAAgB,CAAE,QAAS,EAAe,CAAG,EAAE,CACnD,QAAS,CAAC,eAAgB,SAAS,CACnC,IAAK,CACH,CACE,OAAQ,EACR,QAAS,CACP,mBACD,CACF,CACF,CACF,CAAC,CAGF,EAAO,QAAU,EAAO,SAAW,EAAE,CACrC,EAAO,QAAQ,MAAQ,EAAO,QAAQ,OAAS,EAAE,CACjD,EAAO,QAAQ,MAAM,kBAAoB,EAGzC,IAAM,EAAmB,EAAc,kBAAoB,GA6B3D,MA5BI,CAAC,EAAQ,KAAO,IAClB,EAAO,QAAU,EAAO,SAAW,EAAE,CACrC,EAAO,QAAQ,KAAK,CAClB,MAAM,EAA2B,CAC/B,EAAS,MAAM,UAAU,WAAW,kBAAmB,SAAY,CACjE,GAAI,EAAiB,OACrB,EAAkB,GAElB,IAAI,EACJ,GAAI,CAEF,EAAY,MAAM,OAAO,qBACnB,CAEN,OAGF,MAAM,EAAU,WAAW,EAAa,EAAc,gBAAkB,CAAE,SAAU,GAAM,CAAG,IAAA,GAAU,EACvG,EAEL,CAAC,EAIA,EACK,EAAgB,EAAQ,EAAQ,CAGlC,GAEV,CAGH,SAAS,EACP,EACA,EACyB,CACzB,IAAM,EAAO,GAAY,EAAE,CACrB,EAAa,EAAK,OAAwC,EAAE,CAI5D,EADa,OAAO,KAAK,EAAQ,MAAM,CACd,OAAO,GAAK,KAAK,EAAU,CAS1D,OARI,EAAY,OAAS,GACvB,QAAQ,KACN,iEAAiE,EAAY,KAAK,KAAK,CAAC,2JAGzF,CAGI,CACL,GAAG,EACH,MAAO,CAAE,GAAG,EAAQ,MAAO,GAAG,EAAW,CACzC,aAAc,CAAE,GAAG,EAAQ,aAAc,GAAI,EAAK,aAA4C,CAC/F,CCpLH,IAAM,EACJ,wGAEF,SAAS,GAA4B,CACnC,MAAU,MAAM,EAAe,CAIjC,IAAa,EAAsC,EAEtC,EAAuE,EAEvE,EAAkB,EAElB,EAAoK,EAEpK,EAAyO,EAEzO,EAAiP,EAEjP,EAAuF,EAEvF,EAAoF,EAEpF,EAA2F"}
|
package/dist/index.js
CHANGED
|
@@ -5,9 +5,8 @@ import { DEFAULT_FLUENTI_CONFIG as l, loadConfigSync as u } from "@fluenti/core/
|
|
|
5
5
|
import { validateLocale as d } from "@fluenti/core";
|
|
6
6
|
import { resolveLocaleCodes as f } from "@fluenti/core/internal";
|
|
7
7
|
import { createRequire as p } from "node:module";
|
|
8
|
-
import { exec as m } from "node:child_process";
|
|
9
8
|
//#region src/read-config.ts
|
|
10
|
-
function
|
|
9
|
+
function m(e, t) {
|
|
11
10
|
let n;
|
|
12
11
|
n = t?.config && typeof t.config == "object" ? {
|
|
13
12
|
...l,
|
|
@@ -23,13 +22,13 @@ function h(e, t) {
|
|
|
23
22
|
}
|
|
24
23
|
//#endregion
|
|
25
24
|
//#region src/generate-server-module.ts
|
|
26
|
-
function
|
|
25
|
+
function h(n, i) {
|
|
27
26
|
if (i.serverModule) return s(n, i.serverModule);
|
|
28
27
|
let a = s(n, i.serverModuleOutDir), c = s(a, "server.js"), l = s(a, "server.d.ts");
|
|
29
28
|
e(a) || t(a, { recursive: !0 });
|
|
30
|
-
let u = f(i.fluentiConfig.locales), p = i.fluentiConfig.defaultLocale ?? i.fluentiConfig.sourceLocale, m = i.fluentiConfig.compileOutDir, h = i.fluentiConfig.fallbackChain,
|
|
29
|
+
let u = f(i.fluentiConfig.locales), p = i.fluentiConfig.defaultLocale ?? i.fluentiConfig.sourceLocale, m = i.fluentiConfig.compileOutDir, h = i.fluentiConfig.fallbackChain, v = g(i.cookieName), y = g(p);
|
|
31
30
|
for (let e of u) d(e, "next-plugin");
|
|
32
|
-
let b =
|
|
31
|
+
let b = _(o(a, s(n, m))), x = u.map((e) => ` case '${g(e)}': return import('${b}/${e}')`).join("\n"), S = h ? JSON.stringify(h) : "undefined";
|
|
33
32
|
r(s(a, "client-provider.js"), `"use client";
|
|
34
33
|
// Auto-generated by @fluenti/next — do not edit
|
|
35
34
|
// @ts-nocheck
|
|
@@ -39,14 +38,14 @@ ${u.map((e) => `import ${e.replace(/[^a-zA-Z0-9]/g, "_")} from '${b}/${e}'`).joi
|
|
|
39
38
|
|
|
40
39
|
const __allMessages = { ${u.map((e) => {
|
|
41
40
|
let t = e.replace(/[^a-zA-Z0-9]/g, "_");
|
|
42
|
-
return `'${
|
|
41
|
+
return `'${g(e)}': ${t}`;
|
|
43
42
|
}).join(", ")} }
|
|
44
43
|
|
|
45
44
|
export function ClientI18nProvider({ locale, fallbackLocale, fallbackChain, children }) {
|
|
46
45
|
return createElement(I18nProvider, { locale, fallbackLocale, messages: __allMessages, fallbackChain }, children)
|
|
47
46
|
}
|
|
48
|
-
`, "utf-8");
|
|
49
|
-
let C = i.resolveLocale ? `import __resolveLocale from '${
|
|
47
|
+
`, "utf-8"), r(s(a, "client-provider.d.ts"), "// Auto-generated by @fluenti/next — do not edit\nimport type { ReactNode, ReactElement } from 'react'\n\nexport declare function ClientI18nProvider(props: {\n locale: string\n fallbackLocale: string\n fallbackChain?: Record<string, string[]>\n children: ReactNode\n}): ReactElement\n", "utf-8");
|
|
48
|
+
let C = i.resolveLocale ? `import __resolveLocale from '${_(o(a, s(n, i.resolveLocale)))}'` : null, w = i.resolveLocale ? "resolveLocale: __resolveLocale," : `resolveLocale: async () => {
|
|
50
49
|
try {
|
|
51
50
|
const { cookies, headers } = await import('next/headers')
|
|
52
51
|
const [cookieStore, headerStore] = await Promise.all([cookies(), headers()])
|
|
@@ -61,7 +60,7 @@ export function ClientI18nProvider({ locale, fallbackLocale, fallbackChain, chil
|
|
|
61
60
|
}
|
|
62
61
|
|
|
63
62
|
// 2. Cookie (configurable name)
|
|
64
|
-
const fromCookie = cookieStore.get('${
|
|
63
|
+
const fromCookie = cookieStore.get('${v}')?.value
|
|
65
64
|
if (fromCookie && __locales.includes(fromCookie)) return fromCookie
|
|
66
65
|
|
|
67
66
|
// 3. Accept-Language header
|
|
@@ -141,26 +140,15 @@ export async function I18nProvider({ locale, children }) {
|
|
|
141
140
|
}
|
|
142
141
|
`, "utf-8"), r(l, "// Auto-generated by @fluenti/next — do not edit\nimport type { ReactNode, ReactElement } from 'react'\nimport type { CompileTimeT, FluentiCoreInstanceFull } from '@fluenti/core'\n\nexport declare function setLocale(locale: string): void\nexport declare function getI18n(): Promise<FluentiCoreInstanceFull & { locale: string }>\nexport declare const t: CompileTimeT\n\nexport declare function Trans(props: {\n children: ReactNode\n id?: string\n context?: string\n comment?: string\n render?: (translation: ReactNode) => ReactNode\n}): Promise<ReactElement>\n\nexport declare function Plural(props: {\n value: number\n id?: string\n context?: string\n comment?: string\n zero?: ReactNode\n one?: ReactNode\n two?: ReactNode\n few?: ReactNode\n many?: ReactNode\n other: ReactNode\n offset?: number\n}): Promise<ReactElement>\n\nexport declare function Select(props: {\n value: string\n id?: string\n context?: string\n comment?: string\n other: ReactNode\n options?: Record<string, ReactNode>\n [key: string]: ReactNode | Record<string, ReactNode> | string | undefined\n}): Promise<ReactElement>\n\nexport declare function DateTime(props: {\n value: Date | number\n style?: string\n}): Promise<ReactElement>\n\nexport declare function NumberFormat(props: {\n value: number\n style?: string\n}): Promise<ReactElement>\n\nexport declare function I18nProvider(props: {\n locale?: string\n children: ReactNode\n}): Promise<ReactElement>\n", "utf-8"), c;
|
|
143
142
|
}
|
|
144
|
-
function
|
|
143
|
+
function g(e) {
|
|
145
144
|
return e.replace(/\\/g, "\\\\").replace(/'/g, "\\'");
|
|
146
145
|
}
|
|
147
|
-
function
|
|
146
|
+
function _(e) {
|
|
148
147
|
return e.split("\\").join("/");
|
|
149
148
|
}
|
|
150
149
|
//#endregion
|
|
151
150
|
//#region src/dev-runner.ts
|
|
152
|
-
function
|
|
153
|
-
let n = t;
|
|
154
|
-
for (;;) {
|
|
155
|
-
let t = s(n, "node_modules/.bin/fluenti");
|
|
156
|
-
if (e(t)) return t;
|
|
157
|
-
let r = i(n);
|
|
158
|
-
if (r === n) break;
|
|
159
|
-
n = r;
|
|
160
|
-
}
|
|
161
|
-
return null;
|
|
162
|
-
}
|
|
163
|
-
async function b(e) {
|
|
151
|
+
async function v(e) {
|
|
164
152
|
if (e.compileOnly) try {
|
|
165
153
|
let { runCompile: t } = p(a(e.cwd, "package.json"))("@fluenti/cli");
|
|
166
154
|
await t(e.cwd), console.log("[fluenti] Compiling... done"), e.onSuccess?.();
|
|
@@ -184,32 +172,16 @@ async function b(e) {
|
|
|
184
172
|
console.warn("[fluenti] Extract/compile failed:", n.message), e.onError?.(n);
|
|
185
173
|
return;
|
|
186
174
|
}
|
|
187
|
-
let n =
|
|
188
|
-
if (
|
|
189
|
-
|
|
190
|
-
return e.throwOnError ? Promise.reject(Error(t)) : (console.warn(t), Promise.resolve());
|
|
191
|
-
}
|
|
192
|
-
let r = `${n} extract && ${n} compile${e.parallelCompile ? " --parallel" : ""}`;
|
|
193
|
-
return new Promise((t, n) => {
|
|
194
|
-
m(r, { cwd: e.cwd }, (r, i, a) => {
|
|
195
|
-
if (r) {
|
|
196
|
-
let t = Error(a || r.message);
|
|
197
|
-
if (e.throwOnError) {
|
|
198
|
-
n(t);
|
|
199
|
-
return;
|
|
200
|
-
}
|
|
201
|
-
console.warn("[fluenti] Extract/compile failed:", t.message), e.onError?.(t);
|
|
202
|
-
} else console.log("[fluenti] Extracting and compiling... done"), e.onSuccess?.();
|
|
203
|
-
t();
|
|
204
|
-
});
|
|
205
|
-
});
|
|
175
|
+
let n = "[fluenti] @fluenti/cli is required for auto-compile.\n Install it as a devDependency:\n pnpm add -D @fluenti/cli\n See: https://fluenti.dev/start/introduction/";
|
|
176
|
+
if (e.throwOnError) throw Error(n);
|
|
177
|
+
console.warn(n), e.onError?.(Error(n));
|
|
206
178
|
}
|
|
207
|
-
function
|
|
179
|
+
function y(e, t = 300) {
|
|
208
180
|
let n = null, r = !1, i = !1;
|
|
209
181
|
async function a() {
|
|
210
182
|
r = !0;
|
|
211
183
|
try {
|
|
212
|
-
await
|
|
184
|
+
await v(e);
|
|
213
185
|
} finally {
|
|
214
186
|
r = !1, i && (i = !1, o());
|
|
215
187
|
}
|
|
@@ -223,8 +195,8 @@ function x(e, t = 300) {
|
|
|
223
195
|
}
|
|
224
196
|
//#endregion
|
|
225
197
|
//#region src/dev-watcher.ts
|
|
226
|
-
var
|
|
227
|
-
function
|
|
198
|
+
var b = null;
|
|
199
|
+
function x(e, t) {
|
|
228
200
|
if (!t || t.length === 0) return [s(e, "src")];
|
|
229
201
|
let n = /* @__PURE__ */ new Set();
|
|
230
202
|
for (let e of t) {
|
|
@@ -233,30 +205,30 @@ function C(e, t) {
|
|
|
233
205
|
}
|
|
234
206
|
return [...n].map((t) => s(e, t));
|
|
235
207
|
}
|
|
236
|
-
function
|
|
237
|
-
|
|
238
|
-
let { cwd: t, compiledDir: r, delay: i = 1e3, include: a, exclude: o, parallelCompile: c } = e, l = s(t, r), u = p(import.meta.url)("picomatch"), d = o?.length ? u(o) : () => !1, f = { cwd: t };
|
|
208
|
+
function S(e) {
|
|
209
|
+
b && b();
|
|
210
|
+
let { cwd: t, compiledDir: r, delay: i = 1e3, include: a, exclude: o, parallelCompile: c } = e, l = s(t, r), u = p(typeof __filename < "u" ? __filename : import.meta.url)("picomatch"), d = o?.length ? u(o) : () => !1, f = { cwd: t };
|
|
239
211
|
c && (f.parallelCompile = !0);
|
|
240
|
-
let m =
|
|
212
|
+
let m = y(f, i);
|
|
241
213
|
m();
|
|
242
|
-
let h =
|
|
214
|
+
let h = x(t, a).map((e) => n(e, { recursive: !0 }, (t, n) => {
|
|
243
215
|
n && /\.[jt]sx?$/.test(n) && (n.includes("node_modules") || n.includes(".next") || s(e, n).startsWith(l) || d(n) || m());
|
|
244
216
|
})), g = () => {
|
|
245
217
|
for (let e of h) e.close();
|
|
246
|
-
|
|
218
|
+
b = null;
|
|
247
219
|
};
|
|
248
|
-
return
|
|
220
|
+
return b = g, g;
|
|
249
221
|
}
|
|
250
222
|
//#endregion
|
|
251
223
|
//#region src/with-fluenti.ts
|
|
252
|
-
function
|
|
253
|
-
if (e && !
|
|
224
|
+
function C(e) {
|
|
225
|
+
if (e && !w(e)) return T({}, e);
|
|
254
226
|
let t = e ?? {};
|
|
255
227
|
return function(e) {
|
|
256
|
-
return
|
|
228
|
+
return T(t, e ?? {});
|
|
257
229
|
};
|
|
258
230
|
}
|
|
259
|
-
function
|
|
231
|
+
function w(e) {
|
|
260
232
|
return [
|
|
261
233
|
"config",
|
|
262
234
|
"serverModule",
|
|
@@ -266,10 +238,10 @@ function E(e) {
|
|
|
266
238
|
"loaderEnforce"
|
|
267
239
|
].some((t) => t in e);
|
|
268
240
|
}
|
|
269
|
-
function
|
|
270
|
-
let r = process.cwd(), a =
|
|
241
|
+
function T(t, n) {
|
|
242
|
+
let r = process.cwd(), a = m(r, t), o = a.fluentiConfig, l = o.compileOutDir;
|
|
271
243
|
e(s(r, l)) || console.warn(`\n[fluenti] Compiled catalogs not found at ${l}.\nRun: npx fluenti extract && npx fluenti compile\n`);
|
|
272
|
-
let u =
|
|
244
|
+
let u = h(r, a), d = s(typeof __dirname < "u" ? __dirname : i(c(import.meta.url)), "loader.js"), f = n.webpack, p = !1, g = Object.fromEntries([
|
|
273
245
|
"*.ts",
|
|
274
246
|
"*.tsx",
|
|
275
247
|
"*.js",
|
|
@@ -284,12 +256,12 @@ function D(t, n) {
|
|
|
284
256
|
compiledDir: l,
|
|
285
257
|
delay: o.devAutoCompileDelay ?? 1e3
|
|
286
258
|
};
|
|
287
|
-
o.parallelCompile && (e.parallelCompile = !0), o.include && (e.include = o.include), o.exclude && (e.exclude = o.exclude),
|
|
259
|
+
o.parallelCompile && (e.parallelCompile = !0), o.include && (e.include = o.include), o.exclude && (e.exclude = o.exclude), S(e);
|
|
288
260
|
}
|
|
289
261
|
return {
|
|
290
262
|
...n,
|
|
291
|
-
turbopack:
|
|
292
|
-
rules:
|
|
263
|
+
turbopack: E(n.turbopack, {
|
|
264
|
+
rules: g,
|
|
293
265
|
resolveAlias: v
|
|
294
266
|
}),
|
|
295
267
|
webpack(e, n) {
|
|
@@ -320,7 +292,7 @@ function D(t, n) {
|
|
|
320
292
|
}
|
|
321
293
|
};
|
|
322
294
|
}
|
|
323
|
-
function
|
|
295
|
+
function E(e, t) {
|
|
324
296
|
let n = e ?? {}, r = n.rules ?? {}, i = Object.keys(t.rules).filter((e) => e in r);
|
|
325
297
|
return i.length > 0 && console.warn(`[fluenti] Your turbopack.rules override Fluenti's loader for: ${i.join(", ")}.\n Fluenti's t\`\` transform will NOT run on these file types.\n If this is intentional, you can suppress this warning with { devAutoCompile: false }.`), {
|
|
326
298
|
...n,
|
|
@@ -336,12 +308,12 @@ function O(e, t) {
|
|
|
336
308
|
}
|
|
337
309
|
//#endregion
|
|
338
310
|
//#region src/index.ts
|
|
339
|
-
var
|
|
340
|
-
function
|
|
341
|
-
throw Error(
|
|
311
|
+
var D = "[fluenti] `withFluenti()` must be configured in next.config.ts before importing from \"@fluenti/next\".";
|
|
312
|
+
function O() {
|
|
313
|
+
throw Error(D);
|
|
342
314
|
}
|
|
343
|
-
var
|
|
315
|
+
var k = O, A = O, j = O, M = O, N = O, P = O, F = O, I = O, L = O;
|
|
344
316
|
//#endregion
|
|
345
|
-
export {
|
|
317
|
+
export { F as DateTime, L as I18nProvider, I as NumberFormat, N as Plural, P as Select, M as Trans, A as getI18n, k as setLocale, j as t, C as withFluenti };
|
|
346
318
|
|
|
347
319
|
//# sourceMappingURL=index.js.map
|