@fluenti/cli 0.6.1 → 0.6.3
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/cli/src/ai-provider.d.ts +0 -1
- package/dist/cli/src/catalog.d.ts +0 -1
- package/dist/cli/src/check.d.ts +0 -1
- package/dist/cli/src/cli.d.ts +0 -1
- package/dist/cli/src/codemod.d.ts +0 -1
- package/dist/cli/src/compile-cache.d.ts +0 -1
- package/dist/cli/src/compile-runner.d.ts +0 -1
- package/dist/cli/src/compile-worker.d.ts +0 -1
- package/dist/cli/src/compile.d.ts +0 -1
- package/dist/cli/src/config-loader.d.ts +0 -1
- package/dist/cli/src/config.d.ts +0 -1
- package/dist/cli/src/doctor.d.ts +0 -1
- package/dist/cli/src/extract-cache.d.ts +0 -1
- package/dist/cli/src/extract-path.d.ts +18 -0
- package/dist/cli/src/extract-runner.d.ts +0 -1
- package/dist/cli/src/extract-workflow.d.ts +17 -0
- package/dist/cli/src/glossary.d.ts +0 -1
- package/dist/cli/src/index.d.ts +0 -1
- package/dist/cli/src/init.d.ts +0 -1
- package/dist/cli/src/json-format.d.ts +0 -1
- package/dist/cli/src/lint.d.ts +0 -1
- package/dist/cli/src/migrate.d.ts +0 -1
- package/dist/cli/src/parallel-compile.d.ts +0 -1
- package/dist/cli/src/po-format.d.ts +0 -1
- package/dist/cli/src/stats-format.d.ts +0 -1
- package/dist/cli/src/translate-parse.d.ts +0 -1
- package/dist/cli/src/translate-prompt.d.ts +0 -1
- package/dist/cli/src/translate.d.ts +0 -1
- package/dist/cli/src/tsx-extractor.d.ts +0 -1
- package/dist/cli/src/validation.d.ts +0 -1
- package/dist/cli/src/vue-extractor.d.ts +0 -1
- package/dist/cli.cjs +10 -11
- package/dist/cli.js +270 -301
- package/dist/{compile-C3VLvhUf.cjs → compile-1ie6pZBL.cjs} +2 -3
- package/dist/compile-CZVpE5Md.js +0 -2
- package/dist/compile-worker.cjs +1 -2
- package/dist/compile-worker.js +0 -2
- package/dist/doctor-BjxAnm7z.cjs +23 -0
- package/dist/{doctor-BqXXxyST.js → doctor-CLfvuKpJ.js} +288 -183
- package/dist/index.cjs +1 -2
- package/dist/index.js +17 -81
- package/dist/tsx-extractor-C-HZNobu.js +0 -2
- package/dist/{tsx-extractor-AOjsbOmp.cjs → tsx-extractor-DFptqjVk.cjs} +1 -2
- package/dist/vue-extractor.cjs +2 -3
- package/dist/vue-extractor.js +0 -2
- package/package.json +2 -2
- package/dist/cli/src/ai-provider.d.ts.map +0 -1
- package/dist/cli/src/catalog.d.ts.map +0 -1
- package/dist/cli/src/check.d.ts.map +0 -1
- package/dist/cli/src/cli.d.ts.map +0 -1
- package/dist/cli/src/codemod.d.ts.map +0 -1
- package/dist/cli/src/compile-cache.d.ts.map +0 -1
- package/dist/cli/src/compile-runner.d.ts.map +0 -1
- package/dist/cli/src/compile-worker.d.ts.map +0 -1
- package/dist/cli/src/compile.d.ts.map +0 -1
- package/dist/cli/src/config-loader.d.ts.map +0 -1
- package/dist/cli/src/config.d.ts.map +0 -1
- package/dist/cli/src/doctor.d.ts.map +0 -1
- package/dist/cli/src/extract-cache.d.ts.map +0 -1
- package/dist/cli/src/extract-runner.d.ts.map +0 -1
- package/dist/cli/src/glossary.d.ts.map +0 -1
- package/dist/cli/src/index.d.ts.map +0 -1
- package/dist/cli/src/init.d.ts.map +0 -1
- package/dist/cli/src/json-format.d.ts.map +0 -1
- package/dist/cli/src/lint.d.ts.map +0 -1
- package/dist/cli/src/migrate.d.ts.map +0 -1
- package/dist/cli/src/parallel-compile.d.ts.map +0 -1
- package/dist/cli/src/po-format.d.ts.map +0 -1
- package/dist/cli/src/stats-format.d.ts.map +0 -1
- package/dist/cli/src/translate-parse.d.ts.map +0 -1
- package/dist/cli/src/translate-prompt.d.ts.map +0 -1
- package/dist/cli/src/translate.d.ts.map +0 -1
- package/dist/cli/src/tsx-extractor.d.ts.map +0 -1
- package/dist/cli/src/validation.d.ts.map +0 -1
- package/dist/cli/src/vue-extractor.d.ts.map +0 -1
- package/dist/cli.cjs.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/compile-C3VLvhUf.cjs.map +0 -1
- package/dist/compile-CZVpE5Md.js.map +0 -1
- package/dist/compile-worker.cjs.map +0 -1
- package/dist/compile-worker.js.map +0 -1
- package/dist/doctor-BqXXxyST.js.map +0 -1
- package/dist/doctor-xp8WS8sr.cjs +0 -24
- package/dist/doctor-xp8WS8sr.cjs.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/tsx-extractor-AOjsbOmp.cjs.map +0 -1
- package/dist/tsx-extractor-C-HZNobu.js.map +0 -1
- package/dist/vue-extractor.cjs.map +0 -1
- package/dist/vue-extractor.js.map +0 -1
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
const e=require(`./doctor-
|
|
1
|
+
const e=require(`./doctor-BjxAnm7z.cjs`);let t=require(`@fluenti/core/compiler`);var n=e.p({CATALOG_VERSION:()=>1,collectAllIds:()=>y,compileCatalog:()=>g,compileIndex:()=>v,compileTypeDeclaration:()=>S,extractMessageVariables:()=>b}),r=/\{(\w+)\}/g,i=/\{(\w+)\}/;function a(e){return i.test(e)}function o(e){return e.replace(/\\/g,`\\\\`).replace(/'/g,`\\'`).replace(/\n/g,`\\n`).replace(/\r/g,`\\r`)}function s(e,t){return/^\d/.test(t)?`${e}['${t}']`:`${e}.${t}`}function c(e){return e.replace(/\\/g,`\\\\`).replace(/`/g,"\\`").replace(/\$\{/g,"\\${").replace(/\n/g,`\\n`).replace(/\r/g,`\\r`)}function l(e){r.lastIndex=0;let t=[],n=0,i;for(;(i=r.exec(e))!==null;)t.push(c(e.slice(n,i.index))),t.push(`\${${s(`v`,i[1])}}`),n=r.lastIndex;return t.push(c(e.slice(n))),t.join(``)}var u=/\{(\w+),\s*(plural|select|selectordinal)\s*,/;function d(e){return u.test(e)}function f(e,t){if(e.length===0)return`''`;let n=e.map(e=>p(e,t));return n.length===1?n[0]:n.join(` + `)}function p(e,t){switch(e.type){case`text`:return`'${o(e.value)}'`;case`variable`:return e.name===`#`?`String(__c)`:`String(${s(`v`,e.name)} ?? '{${e.name}}')`;case`plural`:return m(e,t);case`select`:return h(e,t);case`function`:return`String(${s(`v`,e.variable)} ?? '')`}}function m(e,t){let n=e.offset??0,r=s(`v`,e.variable),i=n?`(${r} - ${n})`:r,a=[];a.push(`((c) => { const __c = c; `);let c=Object.keys(e.options).filter(e=>e.startsWith(`=`));if(c.length>0)for(let n of c){let r=n.slice(1),i=f(e.options[n],t);a.push(`if (c === ${r}) return ${i}; `)}let l=Object.keys(e.options).filter(e=>!e.startsWith(`=`));if(l.length>1||l.length===1&&l[0]!==`other`){a.push(`const __cat = new Intl.PluralRules('${o(t)}').select(c); `);for(let n of l){if(n===`other`)continue;let r=f(e.options[n],t);a.push(`if (__cat === '${o(n)}') return ${r}; `)}}let u=e.options.other?f(e.options.other,t):`''`;return a.push(`return ${u}; `),a.push(`})(${i})`),a.join(``)}function h(e,t){let n=[];n.push(`((s) => { `);let r=Object.keys(e.options).filter(e=>e!==`other`);for(let i of r){let r=f(e.options[i],t);n.push(`if (s === '${o(i)}') return ${r}; `)}let i=e.options.other?f(e.options.other,t):`''`;return n.push(`return ${i}; `),n.push(`})(String(${s(`v`,e.variable)} ?? ''))`),n.join(``)}function g(e,n,r,i,s){let c=[];c.push(`// @fluenti/compiled v1`),c.push(`// @ts-nocheck`);let u=[],p=0,m=[],h=new Map;for(let g of r){let r=(0,t.hashMessage)(g),v=h.get(r);if(v!==void 0&&v!==g)throw Error(`Hash collision detected: messages "${v}" and "${g}" produce the same hash "${r}"`);h.set(r,g);let y=`_${r}`,b=e[g],x=_(b,g,n,i,s?.skipFuzzy);if(x===void 0)c.push(`export const ${y} = undefined`),m.push(g);else if(d(x)){let e;try{e=(0,t.parse)(x)}catch(e){console.warn(`[fluenti] Skipping malformed ICU translation for "${g}" (${n}): ${e.message}`),c.push(`export const ${y} = undefined`),m.push(g),u.push({id:g,exportName:y});continue}let r=f(e,n);c.push(`export const ${y} = (v) => ${r}`),p++}else if(a(x)){let e=l(x);c.push(`export const ${y} = (v) => \`${e}\``),p++}else c.push(`export const ${y} = '${o(x)}'`),p++;u.push({id:g,exportName:y})}if(u.length===0)return{code:`// @fluenti/compiled v1
|
|
2
2
|
// empty catalog
|
|
3
3
|
export default {}
|
|
4
4
|
`,stats:{compiled:0,missing:[]}};c.push(``),c.push(`export default {`);for(let{id:e,exportName:t}of u)c.push(` '${o(e)}': ${t},`);return c.push(`}`),c.push(``),{code:c.join(`
|
|
5
5
|
`),stats:{compiled:p,missing:m}}}function _(e,t,n,r,i){let a=r??n;if(e&&!(i&&e.fuzzy)){if(e.translation!==void 0&&e.translation.length>0)return e.translation;if(n===a)return e.message??t}}function v(e,t){let n=[];n.push(`export const locales = ${JSON.stringify(e)}`),n.push(``),n.push(`export const loaders = {`);for(let t of e)n.push(` '${o(t)}': () => import('./${o(t)}.js'),`);return n.push(`}`),n.push(``),n.join(`
|
|
6
6
|
`)}function y(e){let t=new Set;for(let n of Object.values(e))for(let[e,r]of Object.entries(n))r.obsolete||t.add(e);return[...t].sort()}function b(e){let n=(0,t.parse)(e),r=new Map;return x(n,r),[...r.entries()].sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>({name:e,type:t}))}function x(e,t){for(let n of e)switch(n.type){case`variable`:n.name!==`#`&&!t.has(n.name)&&t.set(n.name,`string | number`);break;case`plural`:{let e=n;t.set(e.variable,`number`);for(let n of Object.values(e.options))x(n,t);break}case`select`:{let e=n,r=Object.keys(e.options).filter(e=>e!==`other`),i=`other`in e.options,a=r.map(e=>`'${e}'`).join(` | `),o=i?r.length>0?`${a} | string`:`string`:r.length>0?a:`string`;t.set(e.variable,o);for(let n of Object.values(e.options))x(n,t);break}case`function`:t.has(n.variable)||t.set(n.variable,`string | number`);break;case`text`:break}}function S(e,t,n){let r=[];if(r.push(`// Auto-generated by @fluenti/cli — do not edit`),r.push(``),r.push(`export type { LocalizedString } from '@fluenti/core'`),r.push(``),e.length===0)r.push(`export type MessageId = never`);else{r.push(`export type MessageId =`);for(let t of e)r.push(` | '${o(t)}'`)}r.push(``),r.push(`export interface MessageValues {`);for(let i of e){let e=b(t[n]?.[i]?.message??i),a=o(i);if(e.length===0)r.push(` '${a}': Record<string, never>`);else{let t=e.map(e=>`${e.name}: ${e.type}`).join(`; `);r.push(` '${a}': { ${t} }`)}}r.push(`}`),r.push(``);let i=Object.keys(t).map(e=>`'${o(e)}'`).join(` | `);return r.push(`// Auto-wiring: narrows t() and setLocale() to compiled types`),r.push(`declare module '@fluenti/core' {`),r.push(` interface FluentiTypeConfig {`),r.push(` locale: ${i||`string`}`),r.push(` messageIds: MessageId`),r.push(` messageValues: MessageValues`),r.push(` }`),r.push(`}`),r.push(``),r.join(`
|
|
7
|
-
`)}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return y}});
|
|
8
|
-
//# sourceMappingURL=compile-C3VLvhUf.cjs.map
|
|
7
|
+
`)}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return y}});
|
package/dist/compile-CZVpE5Md.js
CHANGED
package/dist/compile-worker.cjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
require(`./doctor-
|
|
2
|
-
//# sourceMappingURL=compile-worker.cjs.map
|
|
1
|
+
require(`./doctor-BjxAnm7z.cjs`);const e=require(`./compile-1ie6pZBL.cjs`);let t=require(`node:worker_threads`);t.parentPort.on(`message`,n=>{try{let{code:r,stats:i}=e.n(n.catalog,n.locale,n.allIds,n.sourceLocale,n.options);t.parentPort.postMessage({locale:n.locale,code:r,stats:i})}catch(e){t.parentPort.postMessage({locale:n.locale,code:``,stats:{compiled:0,missing:[]},error:e instanceof Error?e.message:String(e)})}});
|
package/dist/compile-worker.js
CHANGED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,n)=>{let r={};for(var i in e)t(r,i,{get:e[i],enumerable:!0});return n||t(r,Symbol.toStringTag,{value:`Module`}),r},s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,a)=>(a=n==null?{}:e(i(n)),s(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));const l=require(`./tsx-extractor-DFptqjVk.cjs`);let u=require(`@fluenti/core/compiler`),d=require(`gettext-parser`);d=c(d);let f=require(`@fluenti/core/config`),p=require(`node:fs`),m=require(`node:path`);m=c(m);let h=require(`node:worker_threads`),g=require(`node:os`),_=require(`node:url`),v=require(`fast-glob`);v=c(v);let y=require(`node:crypto`),b=require(`consola`);b=c(b);function x(e,t,n){let r=new Set(t.map(e=>e.id)),i=new Set,a={},o=0,s=0,c=0;for(let r of t){let t=e[r.id],c=t?void 0:te(e,r,i),l=`${r.origin.file}:${r.origin.line}`,u=t??c?.entry;if(c&&i.add(c.id),u)a[r.id]={...u,message:r.message??u.message,context:r.context,comment:r.comment,origin:l,obsolete:!1},s++;else if(a[r.id]){let e=a[r.id];a[r.id]={...e,origin:ee(e.origin,l)}}else a[r.id]={message:r.message,context:r.context,comment:r.comment,origin:l},o++;if(n?.stripFuzzy){let{fuzzy:e,...t}=a[r.id];a[r.id]=t}}for(let[t,i]of Object.entries(e))if(!r.has(t)){let{fuzzy:e,...r}=i;a[t]=n?.stripFuzzy?{...r,obsolete:!0}:{...i,obsolete:!0},c++}return{catalog:a,result:{added:o,unchanged:s,obsolete:c}}}function ee(e,t){if(!e)return t;let n=[...new Set([...Array.isArray(e)?e:[e],t])];return n.length===1?n[0]:n}function te(e,t,n){if(!t.context)return;let r=`${t.origin.file}:${t.origin.line}`;for(let[i,a]of Object.entries(e))if(!n.has(i)&&a.context===void 0&&a.message===t.message&&ne(a.origin,r))return{id:i,entry:a}}function ne(e,t){return e?(Array.isArray(e)?e:[e]).some(e=>e===t||S(e)===S(t)):!1}function S(e){return e.match(/^(.*):\d+$/)?.[1]??e}function C(e){let t=JSON.parse(e),n={};for(let[e,r]of Object.entries(t))if(typeof r==`object`&&r){let t=r;n[e]={message:typeof t.message==`string`?t.message:void 0,context:typeof t.context==`string`?t.context:void 0,comment:typeof t.comment==`string`?t.comment:void 0,translation:typeof t.translation==`string`?t.translation:void 0,origin:typeof t.origin==`string`||Array.isArray(t.origin)&&t.origin.every(e=>typeof e==`string`)?t.origin:void 0,obsolete:typeof t.obsolete==`boolean`?t.obsolete:void 0,fuzzy:typeof t.fuzzy==`boolean`?t.fuzzy:void 0}}return n}function w(e){let t={};for(let[n,r]of Object.entries(e)){let e={};r.message!==void 0&&(e.message=r.message),r.context!==void 0&&(e.context=r.context),r.comment!==void 0&&(e.comment=r.comment),r.translation!==void 0&&(e.translation=r.translation),r.origin!==void 0&&(e.origin=r.origin),r.obsolete&&(e.obsolete=!0),r.fuzzy&&(e.fuzzy=!0),t[n]=e}return JSON.stringify(t,null,2)+`
|
|
2
|
+
`}var T=`fluenti-id:`;function E(e,t,n){for(let[r,i]of Object.entries(e))for(let[e,a]of Object.entries(i)){if(!e)continue;let i=r||a.msgctxt||void 0,o=a.msgstr?.[0]??void 0,s=a.comments?.reference??void 0,c=s?.includes(`
|
|
3
|
+
`)?s.split(`
|
|
4
|
+
`).map(e=>e.trim()).filter(Boolean):s?.includes(` `)?s.split(/\s+/).filter(Boolean):s,l=Array.isArray(c)&&c.length===1?c[0]:c,d=!n&&(a.comments?.flag?.includes(`fuzzy`)??!1),{comment:f,customId:p,sourceMessage:m}=k(a.comments?.extracted),h=m&&(p!==void 0||(0,u.hashMessage)(m,i)===e)?m:void 0,g=p??(h?e:(0,u.hashMessage)(e,i));t[g]={message:h??e,...i===void 0?{}:{context:i},...f===void 0?{}:{comment:f},...o?{translation:o}:{},...l===void 0?{}:{origin:l},...d?{fuzzy:!0}:{},...n?{obsolete:!0}:{}}}}function D(e){let t=d.po.parse(e),n={};return E(t.translations??{},n,!1),t.obsolete&&E(t.obsolete,n,!0),n}function O(e){let t={"":{"":{msgid:``,msgstr:[`Content-Type: text/plain; charset=UTF-8
|
|
5
|
+
`]}}},n={};for(let[r,i]of Object.entries(e)){let e={msgid:i.message!==void 0&&(0,u.hashMessage)(i.message,i.context)===r?i.message??r:r,...i.context===void 0?{}:{msgctxt:i.context},msgstr:[i.translation??``]},a={};i.origin&&!i.obsolete&&(a.reference=Array.isArray(i.origin)?i.origin.join(`
|
|
6
|
+
`):i.origin);let o=re(r,i.message??r,i.context,i.comment);if(o&&(a.extracted=o),i.fuzzy&&!i.obsolete&&(a.flag=`fuzzy`),(a.reference||a.extracted||a.flag)&&(e.comments=a),i.obsolete){let t=i.context??``;n[t]??={},n[t][e.msgid]=e}else{let n=i.context??``;t[n]??={},t[n][e.msgid]=e}}let r={headers:{"Content-Type":`text/plain; charset=UTF-8`},translations:t,...Object.keys(n).length>0?{obsolete:n}:{}};return d.po.compile(r).toString()}function k(e){if(!e)return{};let t=e.split(`
|
|
7
|
+
`).map(e=>e.trim()).filter(Boolean),n,r,i=[];for(let e of t){if(e.startsWith(T)){n=e.slice(11).trim()||void 0;continue}if(e.startsWith("msg`")&&e.endsWith("`")){r=e.slice(4,-1);continue}if(e.startsWith(`Trans: `)){r=A(e.slice(7));continue}i.push(e)}return{...i.length>0?{comment:i.join(`
|
|
8
|
+
`)}:{},...n?{customId:n}:{},...r?{sourceMessage:r}:{}}}function A(e){let t=[],n=0;return e.replace(/<\/?([a-zA-Z][\w-]*)>/g,(e,r)=>{let i=r;if(e.startsWith(`</`)){for(let e=t.length-1;e>=0;e--){let n=t[e];if(n?.tag===i)return t=t.filter((t,n)=>n!==e),`</${n.index}>`}return e}let a=n++;return t.push({tag:i,index:a}),`<${a}>`})}function re(e,t,n,r){let i=[];return r&&i.push(r),e!==(0,u.hashMessage)(t,n)&&(i.push(`${T} ${e}`),i.push(`msg\`${t}\``)),i.length>0?i.join(`
|
|
9
|
+
`):void 0}var j=3e4;function ie(){return(0,m.resolve)(typeof __dirname<`u`?__dirname:(0,m.dirname)((0,_.fileURLToPath)({}.url)),`compile-worker.js`)}async function ae(e,t){if(e.length===0)return[];if(e.length===1){let{compileCatalog:t}=await Promise.resolve().then(()=>require(`./compile-1ie6pZBL.cjs`)).then(e=>e.a),n=e[0],{code:r,stats:i}=t(n.catalog,n.locale,n.allIds,n.sourceLocale,n.options);return[{locale:n.locale,code:r,stats:i}]}let n=ie();if(!(0,p.existsSync)(n))return oe(e);let r=t??Math.min(e.length,(0,g.availableParallelism)()),i=[],a=[...e],o=!1;return new Promise((e,t)=>{let s=0;function c(){if(o)return;let r=a.shift();if(!r){s===0&&e(i);return}s++;let l=new h.Worker(n),u=setTimeout(()=>{o||(o=!0,s--,l.terminate(),t(Error(`Worker timed out after ${j}ms compiling locale "${r.locale}"`)))},j);l.on(`message`,e=>{if(clearTimeout(u),!o){if(e.error){o=!0,s--,l.terminate(),t(Error(`Failed to compile locale "${e.locale}": ${e.error}`));return}i.push({locale:e.locale,code:e.code,stats:e.stats}),s--,l.terminate(),c()}}),l.on(`error`,e=>{clearTimeout(u),o||(o=!0,l.terminate(),t(Error(`Worker error compiling locale "${r.locale}": ${e.message}`)))}),l.on(`exit`,e=>{clearTimeout(u),e!==0&&!o&&(o=!0,t(Error(`Worker exited with code ${e} while compiling locale "${r.locale}"`)))});let d={locale:r.locale,catalog:r.catalog,allIds:r.allIds,sourceLocale:r.sourceLocale,options:r.options};l.postMessage(d)}let l=Math.min(r,a.length);for(let e=0;e<l;e++)c()})}async function oe(e){let{compileCatalog:t}=await Promise.resolve().then(()=>require(`./compile-1ie6pZBL.cjs`)).then(e=>e.a);return Promise.all(e.map(e=>{let{code:n,stats:r}=t(e.catalog,e.locale,e.allIds,e.sourceLocale,e.options);return{locale:e.locale,code:n,stats:r}}))}var M=`1`,se=class{data;cachePath;dirty=!1;constructor(e,t){this.cachePath=(0,m.resolve)(t?(0,m.resolve)(e,`.cache`,t):(0,m.resolve)(e,`.cache`),`extract-cache.json`),this.data=this.load()}get(e){let t=this.data.entries[e];if(t)try{let n=(0,p.statSync)(e);if(n.mtimeMs===t.mtime&&n.size===t.size)return t.messages}catch{}}set(e,t){try{let n=(0,p.statSync)(e);this.data.entries[e]={mtime:n.mtimeMs,size:n.size,messages:t},this.dirty=!0}catch{}}prune(e){for(let t of Object.keys(this.data.entries))e.has(t)||(delete this.data.entries[t],this.dirty=!0)}save(){if(this.dirty)try{(0,p.mkdirSync)((0,m.dirname)(this.cachePath),{recursive:!0}),(0,p.writeFileSync)(this.cachePath,JSON.stringify(this.data),`utf-8`),this.dirty=!1}catch{}}get size(){return Object.keys(this.data.entries).length}load(){try{if((0,p.existsSync)(this.cachePath)){let e=(0,p.readFileSync)(this.cachePath,`utf-8`),t=JSON.parse(e);if(t.version===M)return t}}catch{}return{version:M,entries:{}}}};function N(e){return e.split(`\\`).join(`/`)}function P(e,t,n=m){let r=n.isAbsolute(t)?n.normalize(t):n.resolve(e,t),i=n.relative(e,r);if(n.isAbsolute(i))throw Error(`Cannot extract "${r}" relative to "${e}". The include glob resolved to a file on a different drive, so Fluenti cannot keep PO references relative on this platform.`);return{absoluteFile:r,displayFile:N(i)}}function F(e,t){let n=N(t),r=!1,i=e.map(e=>N(e.origin.file)===n?e:(r=!0,{...e,origin:{...e.origin,file:n}}));return{messages:r?i:[...e],changed:r}}function I(e){return(0,y.createHash)(`md5`).update(e).digest(`hex`).slice(0,8)}function L(e,t){if(!(0,p.existsSync)(e))return{};let n=(0,p.readFileSync)(e,`utf-8`);return t===`json`?C(n):D(n)}function R(e,t,n){let r=n===`json`?w(t):O(t);try{(0,p.mkdirSync)((0,m.dirname)(e),{recursive:!0}),(0,p.writeFileSync)(e,r,`utf-8`)}catch(t){let n=t instanceof Error?t.message:String(t);throw Error(`Failed to write catalog "${e}": ${n}`)}}async function z(e,t,n){if((0,m.extname)(e)===`.vue`)try{let{extractFromVue:r}=await Promise.resolve().then(()=>require(`./vue-extractor.cjs`));return r(t,e,n)}catch{return[]}return l.t(t,e,n)}async function B(e,t,n){let r=(0,u.resolveLocaleCodes)(t.locales),i=await(0,v.default)(t.include,{cwd:e,ignore:t.exclude??[],absolute:!1}),a=[],o=n?.useCache===!1?null:new se((0,m.resolve)(e,t.catalogDir),I(e)),s=0,c=new Set;for(let n of i){let{absoluteFile:r,displayFile:i}=P(e,n);if(c.add(r),o){let e=o.get(r);if(e){let t=F(e,i);a.push(...t.messages),t.changed&&o.set(r,t.messages),s++;continue}}let l=F(await z(i,(0,p.readFileSync)(r,`utf-8`),t.idGenerator),i).messages;a.push(...l),o&&o.set(r,l)}o&&(o.prune(c),o.save());let l=t.plugins?.length?(0,u.createPluginRunner)(t.plugins):void 0;if(l){let e=new Map;for(let t of a)e.set(t.id,t);let n={messages:e,sourceLocale:t.sourceLocale,targetLocales:r.filter(e=>e!==t.sourceLocale),config:t};await l.runAfterExtract(n)}let d=t.format===`json`?`.json`:`.po`,f=n?.clean??!1,h=n?.stripFuzzy??!1,g=[];for(let n of r){let r=(0,m.resolve)(e,t.catalogDir,`${n}${d}`),{catalog:i,result:o}=x(L(r,t.format),a,{stripFuzzy:h});R(r,f?Object.fromEntries(Object.entries(i).filter(([,e])=>!e.obsolete)):i,t.format),g.push({locale:n,result:o})}return{fileCount:i.length,messageCount:a.length,cacheHits:s,localeResults:g}}var V=new Set([`Trans`,`Plural`,`Select`,`DateTime`,`NumberFormat`]),H=[`src/**/*.{ts,tsx,js,jsx,mts,cts,mjs,cjs,vue,mdx}`,`app/**/*.{ts,tsx,js,jsx,mts,cts,mjs,cjs,vue,mdx}`,`pages/**/*.{ts,tsx,js,jsx,mts,cts,mjs,cjs,vue,mdx}`,`components/**/*.{ts,tsx,js,jsx,mts,cts,mjs,cjs,vue,mdx}`,`layouts/**/*.{ts,tsx,js,jsx,mts,cts,mjs,cjs,vue,mdx}`];function U(e){let t=e.trim(),n=t.startsWith(`type `),r=(n?t.slice(5).trim():t).split(/\s+as\s+/);return{imported:r[0].trim(),local:(r[1]??r[0]).trim(),isType:n}}function W(e){let t=e.isType?`type `:``;return e.imported===e.local?`${t}${e.imported}`:`${t}${e.imported} as ${e.local}`}function G(e){let t=new Set,n=[];for(let r of e){let e=`${r.isType?`type:`:`value:`}${r.imported}:${r.local}`;t.has(e)||(t.add(e),n.push(r))}return n}function K(e,t){let n=RegExp(`import\\s*\\{([\\s\\S]*?)\\}\\s*from\\s*['"]${t.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}['"];?\\n?`,`g`),r=[...e.matchAll(n)];if(r.length<=1)return e;let i=`import { ${G(r.flatMap(e=>e[1].split(`,`).map(e=>U(e)).filter(e=>e.imported.length>0))).map(W).join(`, `)} } from '${t}'\n`,a=!0;return e.replace(n,()=>a?(a=!1,i):``)}function q(e){let t=e,n=!1,r=!1;if(t=t.replace(/import\s*\{([\s\S]*?)\}\s*from\s*['"](@fluenti\/(react|vue|solid)(?:\/components)?)['"];?/g,(e,t,i,a)=>{let o=t.split(`,`).map(e=>e.trim()).filter(Boolean).map(U),s=[],c=[],l=[];for(let e of o){let t={...e};if(a===`solid`&&t.imported===`createFluentiContext`&&(t.imported=`createFluenti`,t.local===`createFluentiContext`&&(t.local=`createFluenti`,r=!0)),t.imported===`interpolate`){l.push({...t,isType:!1});continue}if(!t.isType&&V.has(t.imported)&&i.endsWith(`/components`)){c.push(t);continue}s.push(t)}let u=[];s.length>0&&!i.endsWith(`/components`)&&u.push(`import { ${G(s).map(W).join(`, `)} } from '@fluenti/${a}'`),c.length>0&&u.push(`import { ${G(c).map(W).join(`, `)} } from '@fluenti/${a}/components'`),l.length>0&&u.push(`import { ${G(l).map(W).join(`, `)} } from '@fluenti/core/runtime'`),s.length>0&&i.endsWith(`/components`)&&u.unshift(`import { ${G(s).map(W).join(`, `)} } from '@fluenti/${a}'`);let d=u.join(`
|
|
10
|
+
`);return d!==e&&(n=!0),d}),r){let e=t.replace(/\bcreateFluentiContext\b/g,`createFluenti`);e!==t&&(t=e,n=!0)}for(let e of[`@fluenti/react`,`@fluenti/react/components`,`@fluenti/vue`,`@fluenti/vue/components`,`@fluenti/solid`,`@fluenti/solid/components`,`@fluenti/core/runtime`]){let r=K(t,e);r!==t&&(t=r,n=!0)}return{code:t,changed:n}}async function ce(e){let t=await(0,v.default)(e.include&&e.include.length>0?e.include:H,{cwd:e.cwd,absolute:!1,ignore:[`**/node_modules/**`,`**/dist/**`,`**/.fluenti/**`]}),n=[];for(let r of t){let t=(0,m.resolve)(e.cwd,r),i=q((0,p.readFileSync)(t,`utf-8`));i.changed&&(e.write&&(0,p.writeFileSync)(t,i.code,`utf-8`),n.push({file:r,changed:!0}))}return{changedFiles:n,changedCount:n.length}}var le=/^[a-zA-Z]{2,3}(-[a-zA-Z0-9]{1,8})*$/;function J(e){if(!le.test(e))throw Error(`Invalid locale format: "${e}"`);return e}var ue=[{dep:`next`,name:`nextjs`,pluginPackage:`@fluenti/next`},{dep:`nuxt`,name:`nuxt`,pluginPackage:`@fluenti/vue`},{dep:`@solidjs/start`,name:`solidstart`,pluginPackage:`@fluenti/solid`},{dep:`vue`,name:`vue`,pluginPackage:`@fluenti/vue`},{dep:`solid-js`,name:`solid`,pluginPackage:`@fluenti/solid`},{dep:`react`,name:`react`,pluginPackage:`@fluenti/react`}];function Y(e){for(let t of ue)if(t.dep in e)return{name:t.name,pluginPackage:t.pluginPackage};return{name:`unknown`,pluginPackage:null}}function de(e){let t=e.locales.map(e=>JSON.stringify(e)).join(`, `);return`import { defineConfig } from '@fluenti/cli'
|
|
11
|
+
|
|
12
|
+
export default defineConfig({
|
|
13
|
+
sourceLocale: ${JSON.stringify(e.sourceLocale)},
|
|
14
|
+
locales: [${t}],
|
|
15
|
+
catalogDir: './locales',
|
|
16
|
+
format: ${JSON.stringify(e.format)},
|
|
17
|
+
include: ['./src/**/*.{vue,tsx,jsx,ts,js}'],
|
|
18
|
+
compileOutDir: './src/locales/compiled',
|
|
19
|
+
})
|
|
20
|
+
`}async function fe(e){let t=(0,m.resolve)(e.cwd,`package.json`);if(!(0,p.existsSync)(t)){b.default.error(`No package.json found in current directory.`);return}let n=JSON.parse((0,p.readFileSync)(t,`utf-8`)),r=Y({...n.dependencies,...n.devDependencies});b.default.info(`Detected framework: ${r.name}`),r.pluginPackage&&b.default.info(`Recommended plugin: ${r.pluginPackage}`);let i=(0,m.resolve)(e.cwd,`fluenti.config.ts`);if((0,p.existsSync)(i)){b.default.warn(`fluenti.config.ts already exists. Skipping config generation.`);return}let a=await b.default.prompt(`Source locale?`,{type:`text`,default:`en`,placeholder:`en`});if(typeof a==`symbol`)return;let o=await b.default.prompt(`Target locales (comma-separated)?`,{type:`text`,default:`ja,zh-CN`,placeholder:`ja,zh-CN`});if(typeof o==`symbol`)return;let s=await b.default.prompt(`Catalog format?`,{type:`select`,options:[`po`,`json`],initial:`po`});if(typeof s==`symbol`)return;let c=o.split(`,`).map(e=>e.trim()).filter(Boolean);J(a);for(let e of c)J(e);(0,p.writeFileSync)(i,de({sourceLocale:a,locales:[a,...c.filter(e=>e!==a)],format:s}),`utf-8`),b.default.success(`Created fluenti.config.ts`);let l=(0,m.resolve)(e.cwd,`.gitignore`),u=`src/locales/compiled/`;(0,p.existsSync)(l)?(0,p.readFileSync)(l,`utf-8`).includes(u)||((0,p.appendFileSync)(l,`\n# Fluenti compiled catalogs\n${u}\n`),b.default.success(`Updated .gitignore`)):((0,p.writeFileSync)(l,`# Fluenti compiled catalogs\n${u}\n`),b.default.success(`Created .gitignore`));let d=n.scripts??{},f={},h=!1;if(d[`i18n:extract`]||(f[`i18n:extract`]=`fluenti extract`,h=!0),d[`i18n:compile`]||(f[`i18n:compile`]=`fluenti compile`,h=!0),h){let e={...n,scripts:{...d,...f}};(0,p.writeFileSync)(t,JSON.stringify(e,null,2)+`
|
|
21
|
+
`,`utf-8`),b.default.success(`Added i18n:extract and i18n:compile scripts to package.json`)}b.default.log(``),b.default.box({title:`Next steps`,message:[r.pluginPackage?`1. Install: pnpm add -D ${r.pluginPackage} @fluenti/cli`:`1. Install: pnpm add -D @fluenti/cli`,r.name===`nextjs`?`2. Add withFluenti() to your next.config.ts`:r.name===`unknown`?`2. Configure your build tool with the framework Vite plugin or @fluenti/next`:`2. Add the Vite plugin to your vite.config.ts (e.g. fluentiVue() from @fluenti/vue/vite-plugin)`,`3. Run: npx fluenti extract`,`4. Translate your messages`,`5. Run: npx fluenti compile`].join(`
|
|
22
|
+
`)})}var pe=[`src/**/*.{ts,tsx,js,jsx,mts,cts,mjs,cjs,vue,mdx}`,`app/**/*.{ts,tsx,js,jsx,mts,cts,mjs,cjs,vue,mdx}`,`pages/**/*.{ts,tsx,js,jsx,mts,cts,mjs,cjs,vue,mdx}`,`components/**/*.{ts,tsx,js,jsx,mts,cts,mjs,cjs,vue,mdx}`,`layouts/**/*.{ts,tsx,js,jsx,mts,cts,mjs,cjs,vue,mdx}`],me=/import\s*\{[\s\S]*?\binterpolate\b[\s\S]*?\}\s*from\s*['"]@fluenti\/(react|vue|solid)(?:\/components)?['"]/g,he=/from\s*['"]@fluenti\/core\/internal['"]/g;function X(e){return(0,p.existsSync)(e)?(0,p.readFileSync)(e,`utf-8`):void 0}function Z(e,t){if(t)return(0,m.resolve)(e,t);for(let t of[`fluenti.config.ts`,`fluenti.config.mts`,`fluenti.config.js`,`fluenti.config.mjs`]){let n=(0,m.resolve)(e,t);if((0,p.existsSync)(n))return n}}async function ge(e){return(0,v.default)(pe,{cwd:e,absolute:!1,ignore:[`**/node_modules/**`,`**/dist/**`,`**/.fluenti/**`]})}function Q(e,t,n,r){e.push({severity:t,code:n,message:r})}function _e(e){let t=X((0,m.resolve)(e,`package.json`));if(t)return JSON.parse(t)}function ve(e){return e?e.includes(`@fluenti/`)&&e.includes(`vite-plugin`):!1}function $(e,t){return[...e.matchAll(t)].length}async function ye(e){let t=[],n=_e(e.cwd);if(!n)return{framework:`unknown`,findings:[{severity:`error`,code:`missing-package-json`,message:`No package.json found in the current directory.`}]};let r=Y({...n.dependencies,...n.devDependencies}),i=Z(e.cwd,e.config),a=await ge(e.cwd),o=0,s=0,c=!1,l=!1;for(let t of a){let n=(0,p.readFileSync)((0,m.resolve)(e.cwd,t),`utf-8`);o+=$(n,me),s+=$(n,he),c||=n.includes(`@fluenti/`),l||=n.includes(`from '@fluenti/`)&&n.includes(" t`")}if(o>0&&Q(t,`warning`,`main-entry-interpolate`,`Found ${o} import(s) of interpolate from framework packages. Import interpolate from @fluenti/core/runtime instead.`),s>0&&Q(t,`warning`,`core-internal-imports`,`Found ${s} import(s) from @fluenti/core/internal. Use @fluenti/core/runtime or @fluenti/core/compiler.`),i||Q(t,`warning`,`missing-config`,`No fluenti.config.* file found.`),r.name===`nextjs`){let n=[`next.config.ts`,`next.config.mjs`,`next.config.js`].map(t=>(0,m.resolve)(e.cwd,t)).find(e=>(0,p.existsSync)(e)),r=n?X(n):void 0;c&&!r?.includes(`withFluenti(`)&&Q(t,`error`,`missing-with-fluenti`,`Next.js project imports Fluenti but next.config does not call withFluenti().`)}if(r.name===`react`||r.name===`vue`||r.name===`solid`){let n=[`vite.config.ts`,`vite.config.mts`,`vite.config.js`,`vite.config.mjs`].map(t=>(0,m.resolve)(e.cwd,t)).find(e=>(0,p.existsSync)(e)),r=n?X(n):void 0;(c||l)&&!ve(r)&&Q(t,`warning`,`missing-vite-plugin`,`Project imports Fluenti but vite.config does not appear to include a Fluenti Vite plugin.`)}if(i&&(0,p.existsSync)(i))try{let n=await(0,f.loadConfig)(i),r=n.format===`json`?`.json`:`.po`,a=(0,m.resolve)(e.cwd,n.catalogDir,`${n.sourceLocale}${r}`);(0,p.existsSync)(a)||Q(t,`warning`,`missing-source-catalog`,`Source catalog not found: ${a}`);let o=(0,m.resolve)(e.cwd,n.compileOutDir,`index.js`);(0,p.existsSync)(o)||Q(t,`warning`,`missing-compiled-catalogs`,`Compiled catalogs not found at ${o}. Run "fluenti compile".`)}catch(e){Q(t,`error`,`invalid-config`,`Failed to load Fluenti config: ${e instanceof Error?e.message:String(e)}`)}return t.length===0&&Q(t,`info`,`ok`,`No Fluenti migration or configuration issues detected.`),{framework:r.name,findings:t,...i?{configPath:i}:{}}}function be(e){let t=[`Framework: ${e.framework}`];e.configPath&&t.push(`Config: ${e.configPath}`),t.push(``);for(let n of e.findings){let e=n.severity===`error`?`✖`:n.severity===`warning`?`⚠`:`•`;t.push(`${e} [${n.code}] ${n.message}`)}return t.join(`
|
|
23
|
+
`)}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return ce}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return ye}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return B}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return fe}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return ae}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return be}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return C}});
|