@fluenti/cli 0.6.2 → 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/extract-path.d.ts +18 -0
- package/dist/cli/src/extract-workflow.d.ts +17 -0
- package/dist/cli.cjs +10 -10
- package/dist/cli.js +270 -299
- package/dist/{compile-C3VLvhUf.cjs → compile-1ie6pZBL.cjs} +1 -1
- package/dist/compile-worker.cjs +1 -1
- package/dist/doctor-BjxAnm7z.cjs +23 -0
- package/dist/{doctor-BqXXxyST.js → doctor-CLfvuKpJ.js} +288 -181
- package/dist/index.cjs +1 -1
- package/dist/index.js +17 -96
- package/dist/{tsx-extractor-AOjsbOmp.cjs → tsx-extractor-DFptqjVk.cjs} +1 -1
- package/dist/vue-extractor.cjs +1 -1
- package/package.json +2 -2
- package/dist/doctor-xp8WS8sr.cjs +0 -23
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./doctor-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./doctor-BjxAnm7z.cjs`),t=require(`./tsx-extractor-DFptqjVk.cjs`),n=require(`./compile-1ie6pZBL.cjs`);let r=require(`@fluenti/core/compiler`),i=require(`node:fs`),a=require(`node:path`),o=require(`@fluenti/core/config`);function s(e){return e}function c(t,n){if(!(0,i.existsSync)(t))return{};let r=(0,i.readFileSync)(t,`utf-8`);return n===`json`?e.u(r):e.c(r)}function l(e){let t={};for(let[n,r]of Object.entries(e))r.obsolete||(t[n]=r.translation??r.message??n);return t}async function u(t,s){let u=await(0,o.loadConfig)(void 0,t),d=(0,r.resolveLocaleCodes)(u.locales),f=u.format===`json`?`.json`:`.po`,p=(0,a.resolve)(t,u.compileOutDir);(0,i.mkdirSync)(p,{recursive:!0});let m=u.plugins?.length?(0,r.createPluginRunner)(u.plugins):void 0,h={};for(let e of d)h[e]=c((0,a.resolve)(t,u.catalogDir,`${e}${f}`),u.format);let g=n.t(h);for(let e of d)if(m){let t={locale:e,messages:l(h[e]),outDir:p,config:u};await m.runBeforeCompile(t)}if(s?.parallel&&d.length>1){let t=await e.s(d.map(e=>({locale:e,catalog:h[e],allIds:g,sourceLocale:u.sourceLocale})));for(let e of t)(0,i.writeFileSync)((0,a.resolve)(p,`${e.locale}.js`),e.code,`utf-8`)}else for(let e of d){let{code:t}=n.n(h[e],e,g,u.sourceLocale);(0,i.writeFileSync)((0,a.resolve)(p,`${e}.js`),t,`utf-8`)}let _=n.r(d,u.compileOutDir);(0,i.writeFileSync)((0,a.resolve)(p,`index.js`),_,`utf-8`);let v=n.i(g,h,u.sourceLocale);(0,i.writeFileSync)((0,a.resolve)(p,`messages.d.ts`),v,`utf-8`);for(let e of d)if(m){let t={locale:e,messages:l(h[e]),outDir:p,config:u};await m.runAfterCompile(t)}}async function d(t,n){await e.o(t,await(0,o.loadConfig)(void 0,t),n)}exports.collectAllIds=n.t,exports.compileCatalog=n.n,exports.compileIndex=n.r,exports.defineConfig=s,exports.extractFromTsx=t.t,exports.formatDoctorReport=e.t,Object.defineProperty(exports,`hashMessage`,{enumerable:!0,get:function(){return r.hashMessage}}),Object.defineProperty(exports,`loadConfig`,{enumerable:!0,get:function(){return o.loadConfig}}),exports.readJsonCatalog=e.u,exports.readPoCatalog=e.c,exports.rewriteFluentiImports=e.i,exports.runCodemod=e.a,exports.runCompile=u,exports.runDoctor=e.n,exports.runExtract=d,exports.updateCatalog=e.f,exports.writeJsonCatalog=e.d,exports.writePoCatalog=e.l;
|
package/dist/index.js
CHANGED
|
@@ -1,37 +1,35 @@
|
|
|
1
1
|
import { i as e, n as t, r as n, t as r } from "./compile-CZVpE5Md.js";
|
|
2
2
|
import { t as i } from "./tsx-extractor-C-HZNobu.js";
|
|
3
|
-
import { a, c as o, d as s, f as c, i as l, l as u, n as d, o as f, p, s as m, t as h, u as g } from "./doctor-
|
|
3
|
+
import { a, c as o, d as s, f as c, i as l, l as u, n as d, o as f, p, s as m, t as h, u as g } from "./doctor-CLfvuKpJ.js";
|
|
4
4
|
import { createPluginRunner as _, hashMessage as v, resolveLocaleCodes as y } from "@fluenti/core/compiler";
|
|
5
5
|
import { existsSync as b, mkdirSync as x, readFileSync as S, writeFileSync as C } from "node:fs";
|
|
6
|
-
import {
|
|
7
|
-
import D from "fast-glob";
|
|
8
|
-
import { createHash as O } from "node:crypto";
|
|
6
|
+
import { resolve as w } from "node:path";
|
|
9
7
|
//#region src/config.ts
|
|
10
|
-
function
|
|
8
|
+
function T(e) {
|
|
11
9
|
return e;
|
|
12
10
|
}
|
|
13
11
|
//#endregion
|
|
14
12
|
//#region src/compile-runner.ts
|
|
15
|
-
function
|
|
13
|
+
function E(e, t) {
|
|
16
14
|
if (!b(e)) return {};
|
|
17
15
|
let n = S(e, "utf-8");
|
|
18
16
|
return t === "json" ? s(n) : u(n);
|
|
19
17
|
}
|
|
20
|
-
function
|
|
18
|
+
function D(e) {
|
|
21
19
|
let t = {};
|
|
22
20
|
for (let [n, r] of Object.entries(e)) r.obsolete || (t[n] = r.translation ?? r.message ?? n);
|
|
23
21
|
return t;
|
|
24
22
|
}
|
|
25
|
-
async function
|
|
26
|
-
let s = await o(void 0, i), c = y(s.locales), l = s.format === "json" ? ".json" : ".po", u =
|
|
23
|
+
async function O(i, a) {
|
|
24
|
+
let s = await o(void 0, i), c = y(s.locales), l = s.format === "json" ? ".json" : ".po", u = w(i, s.compileOutDir);
|
|
27
25
|
x(u, { recursive: !0 });
|
|
28
26
|
let d = s.plugins?.length ? _(s.plugins) : void 0, f = {};
|
|
29
|
-
for (let e of c) f[e] =
|
|
27
|
+
for (let e of c) f[e] = E(w(i, s.catalogDir, `${e}${l}`), s.format);
|
|
30
28
|
let p = r(f);
|
|
31
29
|
for (let e of c) if (d) {
|
|
32
30
|
let t = {
|
|
33
31
|
locale: e,
|
|
34
|
-
messages:
|
|
32
|
+
messages: D(f[e]),
|
|
35
33
|
outDir: u,
|
|
36
34
|
config: s
|
|
37
35
|
};
|
|
@@ -44,19 +42,19 @@ async function M(i, a) {
|
|
|
44
42
|
allIds: p,
|
|
45
43
|
sourceLocale: s.sourceLocale
|
|
46
44
|
})));
|
|
47
|
-
for (let t of e) C(
|
|
45
|
+
for (let t of e) C(w(u, `${t.locale}.js`), t.code, "utf-8");
|
|
48
46
|
} else for (let e of c) {
|
|
49
47
|
let { code: n } = t(f[e], e, p, s.sourceLocale);
|
|
50
|
-
C(
|
|
48
|
+
C(w(u, `${e}.js`), n, "utf-8");
|
|
51
49
|
}
|
|
52
50
|
let h = n(c, s.compileOutDir);
|
|
53
|
-
C(
|
|
51
|
+
C(w(u, "index.js"), h, "utf-8");
|
|
54
52
|
let g = e(p, f, s.sourceLocale);
|
|
55
|
-
C(
|
|
53
|
+
C(w(u, "messages.d.ts"), g, "utf-8");
|
|
56
54
|
for (let e of c) if (d) {
|
|
57
55
|
let t = {
|
|
58
56
|
locale: e,
|
|
59
|
-
messages:
|
|
57
|
+
messages: D(f[e]),
|
|
60
58
|
outDir: u,
|
|
61
59
|
config: s
|
|
62
60
|
};
|
|
@@ -65,85 +63,8 @@ async function M(i, a) {
|
|
|
65
63
|
}
|
|
66
64
|
//#endregion
|
|
67
65
|
//#region src/extract-runner.ts
|
|
68
|
-
function
|
|
69
|
-
|
|
70
|
-
}
|
|
71
|
-
function P(e) {
|
|
72
|
-
return e.split("\\").join("/");
|
|
73
|
-
}
|
|
74
|
-
function F(e, t) {
|
|
75
|
-
let n = P(t), r = !1, i = e.map((e) => P(e.origin.file) === n ? e : (r = !0, {
|
|
76
|
-
...e,
|
|
77
|
-
origin: {
|
|
78
|
-
...e.origin,
|
|
79
|
-
file: n
|
|
80
|
-
}
|
|
81
|
-
}));
|
|
82
|
-
return {
|
|
83
|
-
messages: r ? i : [...e],
|
|
84
|
-
changed: r
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
function I(e, t) {
|
|
88
|
-
if (!b(e)) return {};
|
|
89
|
-
let n = S(e, "utf-8");
|
|
90
|
-
return t === "json" ? s(n) : u(n);
|
|
91
|
-
}
|
|
92
|
-
function L(e, t, n) {
|
|
93
|
-
let r = n === "json" ? c(t) : g(t);
|
|
94
|
-
try {
|
|
95
|
-
x(w(e), { recursive: !0 }), C(e, r, "utf-8");
|
|
96
|
-
} catch (t) {
|
|
97
|
-
let n = t instanceof Error ? t.message : String(t);
|
|
98
|
-
throw Error(`Failed to write catalog "${e}": ${n}`);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
async function R(e, t) {
|
|
102
|
-
if (T(e) === ".vue") try {
|
|
103
|
-
let { extractFromVue: n } = await import("./vue-extractor.js");
|
|
104
|
-
return n(t, e);
|
|
105
|
-
} catch {
|
|
106
|
-
return [];
|
|
107
|
-
}
|
|
108
|
-
return i(t, e);
|
|
109
|
-
}
|
|
110
|
-
async function z(e, t) {
|
|
111
|
-
let n = await o(void 0, e), r = y(n.locales), i = await D(n.include, {
|
|
112
|
-
cwd: e,
|
|
113
|
-
ignore: n.exclude ?? [],
|
|
114
|
-
absolute: !1
|
|
115
|
-
}), a = [], s = t?.useCache === !1 ? null : new f(E(e, n.catalogDir), N(e));
|
|
116
|
-
for (let t of i) {
|
|
117
|
-
let n = E(e, t), r = P(t);
|
|
118
|
-
if (s) {
|
|
119
|
-
let e = s.get(n);
|
|
120
|
-
if (e) {
|
|
121
|
-
let t = F(e, r);
|
|
122
|
-
a.push(...t.messages), t.changed && s.set(n, t.messages);
|
|
123
|
-
continue;
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
let i = F(await R(r, S(n, "utf-8")), r).messages;
|
|
127
|
-
a.push(...i), s && s.set(n, i);
|
|
128
|
-
}
|
|
129
|
-
s && (s.prune(new Set(i.map((t) => E(e, t)))), s.save());
|
|
130
|
-
let c = n.plugins?.length ? _(n.plugins) : void 0;
|
|
131
|
-
if (c) {
|
|
132
|
-
let e = /* @__PURE__ */ new Map();
|
|
133
|
-
for (let t of a) e.set(t.id, t);
|
|
134
|
-
let t = {
|
|
135
|
-
messages: e,
|
|
136
|
-
sourceLocale: n.sourceLocale,
|
|
137
|
-
targetLocales: r.filter((e) => e !== n.sourceLocale),
|
|
138
|
-
config: n
|
|
139
|
-
};
|
|
140
|
-
await c.runAfterExtract(t);
|
|
141
|
-
}
|
|
142
|
-
let l = n.format === "json" ? ".json" : ".po", u = t?.clean ?? !1, d = t?.stripFuzzy ?? !1;
|
|
143
|
-
for (let t of r) {
|
|
144
|
-
let r = E(e, n.catalogDir, `${t}${l}`), { catalog: i } = p(I(r, n.format), a, { stripFuzzy: d });
|
|
145
|
-
L(r, u ? Object.fromEntries(Object.entries(i).filter(([, e]) => !e.obsolete)) : i, n.format);
|
|
146
|
-
}
|
|
66
|
+
async function k(e, t) {
|
|
67
|
+
await f(e, await o(void 0, e), t);
|
|
147
68
|
}
|
|
148
69
|
//#endregion
|
|
149
|
-
export { r as collectAllIds, t as compileCatalog, n as compileIndex,
|
|
70
|
+
export { r as collectAllIds, t as compileCatalog, n as compileIndex, T as defineConfig, i as extractFromTsx, h as formatDoctorReport, v as hashMessage, o as loadConfig, s as readJsonCatalog, u as readPoCatalog, l as rewriteFluentiImports, a as runCodemod, O as runCompile, d as runDoctor, k as runExtract, p as updateCatalog, c as writeJsonCatalog, g as writePoCatalog };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
require(`./doctor-
|
|
1
|
+
require(`./doctor-BjxAnm7z.cjs`);let e=require(`@fluenti/core/transform`);var t=new Set([`@fluenti/core`,`@fluenti/react`,`@fluenti/vue`,`@fluenti/solid`,`@fluenti/next`]);function n(e){let t=e.trim();if(/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(t))return t;if(/^[a-zA-Z_$][a-zA-Z0-9_$.]*$/.test(t)&&!t.endsWith(`.`)){let e=t.split(`.`);return e[e.length-1]}let n=t.match(/^([a-zA-Z_$][a-zA-Z0-9_$.]*)\s*\(/);return n?n[1].replace(/\./g,`_`):``}function r(e,t){let r=``,i=0;for(let a=0;a<e.length;a++){if(r+=e[a],a>=t.length)continue;let o=n(t[a]);if(o===``){r+=`{arg${i}}`,i++;continue}r+=`{${o}}`}return r}function i(e,t,n){if(!e.message)return;let r=n.loc?.start.line??1,i=(n.loc?.start.column??0)+1;return{id:e.id,message:e.message,...e.context===void 0?{}:{context:e.context},...e.comment===void 0?{}:{comment:e.comment},origin:{file:t,line:r,column:i}}}function a(t,n){if(!t.message)return;let r=n??e.createMessageId;return{id:t.id??r(t.message,t.context),message:t.message,...t.context===void 0?{}:{context:t.context},...t.comment===void 0?{}:{comment:t.comment}}}function o(e,t){if(e.type===`StringLiteral`)return a({message:e.value},t);if(e.type===`TemplateLiteral`){let n=e;return n.expressions.length===0?a({message:n.quasis.map(e=>e.value.cooked??e.value.raw).join(``)},t):void 0}if(e.type!==`ObjectExpression`)return;let n={};for(let t of e.properties){if(t.type!==`ObjectProperty`)continue;let e=t;if(e.computed||!T(e.key))continue;let r=e.key.name;if(![`id`,`message`,`context`,`comment`].includes(r))continue;let i=p(e.value);i!==void 0&&(n[r]=i)}if(n.message)return a(n,t)}var s=new Set([`id`,`value`,`context`,`comment`,`options`,`other`,`tag`]);function c(e,t,n){let r=[];for(let[e,n]of Object.entries(t))r.push(`${e} {${n}}`);return r.push(`other {${n}}`),`{${e}, select, ${r.join(` `)}}`}function l(e,t){let r,i,a,o,c,l={};for(let u of e.attributes){if(u.type!==`JSXAttribute`)continue;let e=u;if(e.name.type!==`JSXIdentifier`)continue;let d=String(e.name.name);if(d===`id`){i=e.value?p(e.value):void 0;continue}if(d===`value`){let i=e.value?p(e.value)??m(e.value,t):void 0;r=i?n(i)||i:void 0;continue}if(d===`context`){a=e.value?p(e.value):void 0;continue}if(d===`comment`){o=e.value?p(e.value):void 0;continue}if(d===`other`){c=e.value?p(e.value):void 0;continue}if(s.has(d))continue;let f=e.value?p(e.value):void 0;f!==void 0&&(l[d]=f)}return{varName:r,id:i,context:a,comment:o,cases:l,other:c}}function u(e){let t=[`zero`,`one`,`two`,`few`,`many`,`other`],n=e.value??e.count??`count`,r=[],i=e.offset;for(let n of t){let t=e[n];if(t===void 0)continue;let i=n===`zero`?`=0`:n;r.push(`${i} {${t}}`)}return r.length===0?``:`{${n}, plural, ${i?`offset:${i} `:``}${r.join(` `)}}`}function d(e){let t=0;function n(e){let r=``;for(let i of e){if(i.type===`JSXText`){r+=f(i.value);continue}if(i.type===`JSXElement`){let e=t++,a=n(i.children);if(a===void 0)return;r+=`<${e}>${a}</${e}>`;continue}if(i.type===`JSXFragment`){let e=n(i.children);if(e===void 0)return;r+=e;continue}if(i.type===`JSXExpressionContainer`){let e=i.expression;if(e.type===`StringLiteral`){r+=e.value;continue}if(e.type===`NumericLiteral`){r+=String(e.value);continue}return}}return r}let r=n(e);if(r!==void 0)return r.replace(/\s+/g,` `).trim()||void 0}function f(e){return e.replace(/\s+/g,` `)}function p(e){if(e.type===`StringLiteral`)return e.value;if(e.type===`NumericLiteral`)return String(e.value);if(e.type===`JSXExpressionContainer`)return p(e.expression);if(e.type===`TemplateLiteral`){let t=e;if(t.expressions.length===0)return t.quasis.map(e=>e.value.cooked??e.value.raw).join(``)}}function m(e,t){if(!(e.start==null||e.end==null))return e.type===`JSXExpressionContainer`?m(e.expression,t):t.slice(e.start,e.end).trim()}function h(e,t){for(let n of e.attributes){if(n.type!==`JSXAttribute`)continue;let e=n;if(e.name.type===`JSXIdentifier`&&e.name.name===t)return e}}function g(e,t){let n={};for(let r of[`id`,`value`,`count`,`offset`,`zero`,`one`,`two`,`few`,`many`,`other`]){let i=h(e,r);if(!i?.value)continue;let a=p(i.value);if(a!==void 0){n[r]=a;continue}let o=m(i.value,t);o!==void 0&&(r===`value`||r===`count`||r===`offset`)&&(n[r]=o)}return n}function _(t,n,i){let a=r(n.quasi.quasis.map(e=>e.value.cooked??e.value.raw),n.quasi.expressions.map(e=>e.start==null||e.end==null?``:t.slice(e.start,e.end)));return{id:(i??e.createMessageId)(a),message:a}}function v(e){let n=new Map,r=Array.isArray(e.body)?e.body:[];for(let e of r)if(b(e)&&t.has(e.source.value))for(let t of e.specifiers){if(!x(t))continue;let e=S(t);(e===`t`||e===`msg`)&&n.set(t.local.name,e)}return n}function y(t,n,r){let a=(0,e.parseSourceModule)(t);if(!a)return console.warn(`[fluenti] Failed to parse ${n} — skipping message extraction`),[];let s=[],f=v(a);return(0,e.walkSourceAst)(a,a=>{if(a.type===`TaggedTemplateExpression`){let e=a;if(T(e.tag)&&(e.tag.name===`t`||f.has(e.tag.name))){let a=_(t,e,r);f.get(e.tag.name)===`msg`&&(a.comment=`msg tagged template`);let o=i(a,n,e);o&&s.push(o)}return}if(a.type===`CallExpression`){let e=a,t=f.get(e.callee&&T(e.callee)?e.callee.name:``);if(T(e.callee)&&(e.callee.name===`t`||f.has(e.callee.name)&&t===`t`)){if(f.has(e.callee.name)&&e.arguments[0]?.type!==`ObjectExpression`)return;let t=e.arguments[0]?o(e.arguments[0],r):void 0,a=t?i(t,n,e):void 0;a&&s.push(a)}else if(e.callee.type===`MemberExpression`&&T(e.callee.object)&&f.get(e.callee.object.name)===`msg`&&T(e.callee.property)&&e.callee.property.name===`descriptor`&&e.arguments[0]){let t=o(e.arguments[0],r),a=t?i(t,n,e):void 0;a&&s.push(a)}return}if(a.type!==`JSXElement`)return;let m=a,v=m.openingElement,y=C(v.name);if(y===`Trans`){let e=h(v,`message`),t=h(v,`id`),a=h(v,`context`),o=h(v,`comment`),c=e?.value?w({id:t?.value?p(t.value):void 0,message:p(e.value),context:a?.value?p(a.value):void 0,comment:o?.value?p(o.value):void 0},r):w({id:t?.value?p(t.value):void 0,message:d(m.children),context:a?.value?p(a.value):void 0,comment:o?.value?p(o.value):void 0},r),l=c?i(c,n,m):void 0;l&&s.push(l);return}if(y===`Plural`){let a=g(v,t),o=u(a);if(!o)return;let c=r??e.createMessageId,l=i({id:a.id??c(o),message:o},n,m);l&&s.push(l);return}if(y===`Select`){let{varName:a,id:o,context:u,comment:d,cases:f,other:p}=l(v,t);if(!a||!p||Object.keys(f).length===0)return;let h=c(a,f,p),g=i({id:o??(r??e.createMessageId)(h,u),message:h,...u===void 0?{}:{context:u},...d===void 0?{}:{comment:d}},n,m);g&&s.push(g)}}),s}function b(t){return(0,e.isSourceNode)(t)&&t.type===`ImportDeclaration`}function x(t){return(0,e.isSourceNode)(t)&&t.type===`ImportSpecifier`}function S(e){if(e.imported.type===`Identifier`)return e.imported.name;if(e.imported.type===`StringLiteral`)return e.imported.value}function C(e){if(e.type===`JSXIdentifier`)return String(e.name)}function w(e,t){let n={};return e.id!==void 0&&(n.id=e.id),e.message!==void 0&&(n.message=e.message),e.context!==void 0&&(n.context=e.context),e.comment!==void 0&&(n.comment=e.comment),a(n,t)}function T(t){return(0,e.isSourceNode)(t)&&t.type===`Identifier`}Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return y}});
|
package/dist/vue-extractor.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./doctor-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./doctor-BjxAnm7z.cjs`);const e=require(`./tsx-extractor-DFptqjVk.cjs`);let t=require(`@fluenti/core/transform`),n=require(`@vue/compiler-sfc`);var r=1,i=2,a=7,o=6;function s(e){return e.filter(e=>e.type===i).map(e=>(e.content??``).trim()).join(``)}function c(e,t){let n=e.split(`|`).map(e=>e.trim()),r=[`one`,`other`,`zero`,`few`,`many`],i=[];if(n.length===2)i.push(`one {${n[0]}}`),i.push(`other {${n[1]}}`);else for(let e=0;e<n.length&&e<r.length;e++)i.push(`${r[e]} {${n[e]}}`);return`{${t}, plural, ${i.join(` `)}}`}var l=new Set([`id`,`value`,`context`,`comment`,`options`,`other`,`tag`]);function u(e,t,n){let r=[];for(let[e,n]of Object.entries(t))r.push(`${e} {${n}}`);return r.push(`other {${n}}`),`{${e}, select, ${r.join(` `)}}`}function d(e){let t=e.count??`count`,n=[`zero`,`one`,`two`,`few`,`many`,`other`],r=[],i=e.offset;for(let t of n)if(e[t]!==void 0){let n=t===`zero`?`=0`:t;r.push(`${n} {${e[t]}}`)}return r.length===0?``:`{${t}, plural, ${i?`offset:${i} `:``}${r.join(` `)}}`}function f(e,n,i,h){if(e.type===r){let r=e.props?.find(e=>e.type===a&&m(e)===`t`);if(r){let a=new Set([`plural`]),o=(r.modifiers??[]).map(e=>typeof e==`string`?e:e.content),l=o.includes(`plural`),u=o.filter(e=>!a.has(e)),d=r.arg?.content,f=d?[d,...u].join(`.`):void 0,p=s(e.children??[]);if(l){let e=c(p,r.exp?.content??`count`),a=f??(h??t.createMessageId)(e);i.push({id:a,message:e,origin:{file:n,line:r.loc.start.line,column:r.loc.start.column}})}else if(p){let e=f??(h??t.createMessageId)(p);i.push({id:e,message:p,origin:{file:n,line:r.loc.start.line,column:r.loc.start.column}})}}if(e.tag===`Trans`){let r=e.props?.find(e=>e.type===o&&m(e)===`message`),a=e.props?.find(e=>e.type===o&&m(e)===`id`),s=e.props?.find(e=>e.type===o&&m(e)===`context`),c=e.props?.find(e=>e.type===o&&m(e)===`comment`),l=s?.value?.content,u=c?.value?.content;if(r?.value){let o=r.value.content,s=h??t.createMessageId,c=a?.value?.content??s(o,l);i.push({id:c,message:o,...l===void 0?{}:{context:l},...u===void 0?{}:{comment:u},origin:{file:n,line:e.loc.start.line,column:e.loc.start.column}})}else if(e.children&&e.children.length>0){let r=p(e.children);if(r.message){let o=h??t.createMessageId,s=a?.value?.content??o(r.message,l);i.push({id:s,message:r.message,...l===void 0?{}:{context:l},...u===void 0?{}:{comment:u},origin:{file:n,line:e.loc.start.line,column:e.loc.start.column}})}}}if(e.tag===`Plural`){let r={},s,c;for(let t of e.props??[])t.type===o&&t.value&&(r[m(t)]=t.value.content),t.type===a&&m(t)===`bind`&&t.arg?.content===`value`&&t.exp&&(s=t.exp.content),t.type===a&&m(t)===`bind`&&t.arg?.content===`offset`&&t.exp&&(c=t.exp.content);let l=s??r.count??`count`,u=c??r.offset,f=d({...r,count:l,...u===void 0?{}:{offset:u}});if(f){let a=r.id??(h??t.createMessageId)(f);i.push({id:a,message:f,origin:{file:n,line:e.loc.start.line,column:e.loc.start.column}})}}if(e.tag===`Select`){let r,s,c,d,f,p={};for(let t of e.props??[]){if(t.type===o&&t.value){let e=m(t);if(e===`id`){s=t.value.content;continue}if(e===`context`){c=t.value.content;continue}if(e===`comment`){d=t.value.content;continue}if(e===`other`){f=t.value.content;continue}if(l.has(e))continue;p[e]=t.value.content}t.type===a&&m(t)===`bind`&&t.arg?.content===`value`&&t.exp&&(r=t.exp.content)}if(r&&f&&Object.keys(p).length>0){let a=u(r,p,f),o=s??(h??t.createMessageId)(a,c);i.push({id:o,message:a,...c===void 0?{}:{context:c},...d===void 0?{}:{comment:d},origin:{file:n,line:e.loc.start.line,column:e.loc.start.column}})}}}if(e.children)for(let t of e.children)f(t,n,i,h)}function p(e){let t=0,n=!1;return{message:e.map(e=>{if(e.type===i)return(e.content??``).trim()?e.content??``:``;if(e.type===r&&e.tag){n=!0;let r=t++;return`<${r}>${p(e.children??[]).message}</${r}>`}return``}).join(``).trim(),hasElements:n}}function m(e){return typeof e.name==`string`?e.name:e.name.content}function h(t,n,r){let i=[],a=/\{\{([\s\S]*?)\}\}/g,o;for(;(o=a.exec(t))!==null;){let a=o[1]?.trim();if(!a)continue;let s=e.t(a,n,r);if(s.length===0)continue;let c=t.slice(0,o.index).split(`
|
|
2
2
|
`).length-1;for(let e of s)i.push({...e,origin:{...e.origin,line:e.origin.line+c}})}return i}function g(t,r,i){let a=[],{descriptor:o}=(0,n.parse)(t,{filename:r});if(o.template?.ast&&f(o.template.ast,r,a,i),o.template?.content){let t=e.t(o.template.content,r,i),n=o.template.loc.start.line-1,s=new Set(a.map(e=>e.id));for(let e of t)s.has(e.id)||a.push({...e,origin:{...e.origin,line:e.origin.line+n}});let c=new Set(a.map(e=>e.id)),l=h(o.template.content,r,i);for(let e of l)c.has(e.id)||a.push({...e,origin:{...e.origin,line:e.origin.line+n}})}if(o.scriptSetup?.content){let t=e.t(o.scriptSetup.content,r,i),n=o.scriptSetup.loc.start.line-1;for(let e of t)a.push({...e,origin:{...e.origin,line:e.origin.line+n}})}if(o.script?.content){let t=e.t(o.script.content,r,i),n=o.script.loc.start.line-1;for(let e of t)a.push({...e,origin:{...e.origin,line:e.origin.line+n}})}return a}exports.extractFromVue=g;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fluenti/cli",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.3",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Fluenti CLI — message extraction from Vue SFC & TSX, PO/JSON catalog compilation",
|
|
6
6
|
"homepage": "https://fluenti.dev",
|
|
@@ -72,7 +72,7 @@
|
|
|
72
72
|
"fast-glob": "^3",
|
|
73
73
|
"gettext-parser": "^9",
|
|
74
74
|
"jiti": "^2",
|
|
75
|
-
"@fluenti/core": "0.6.
|
|
75
|
+
"@fluenti/core": "0.6.3"
|
|
76
76
|
},
|
|
77
77
|
"peerDependencies": {
|
|
78
78
|
"@vue/compiler-sfc": "^3.5"
|
package/dist/doctor-xp8WS8sr.cjs
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
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));let l=require(`@fluenti/core/compiler`),u=require(`gettext-parser`);u=c(u);let d=require(`@fluenti/core/config`),f=require(`node:fs`),p=require(`node:path`),m=require(`node:worker_threads`),h=require(`node:os`),g=require(`node:url`),_=require(`fast-glob`);_=c(_);let v=require(`consola`);v=c(v);function y(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:x(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:b(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 b(e,t){if(!e)return t;let n=[...new Set([...Array.isArray(e)?e:[e],t])];return n.length===1?n[0]:n}function x(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&&ee(a.origin,r))return{id:i,entry:a}}function ee(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,u=Array.isArray(c)&&c.length===1?c[0]:c,d=!n&&(a.comments?.flag?.includes(`fuzzy`)??!1),{comment:f,customId:p,sourceMessage:m}=te(a.comments?.extracted),h=m&&(p!==void 0||(0,l.hashMessage)(m,i)===e)?m:void 0,g=p??(h?e:(0,l.hashMessage)(e,i));t[g]={message:h??e,...i===void 0?{}:{context:i},...f===void 0?{}:{comment:f},...o?{translation:o}:{},...u===void 0?{}:{origin:u},...d?{fuzzy:!0}:{},...n?{obsolete:!0}:{}}}}function D(e){let t=u.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,l.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 u.po.compile(r).toString()}function te(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=ne(e.slice(7));continue}i.push(e)}return{...i.length>0?{comment:i.join(`
|
|
8
|
-
`)}:{},...n?{customId:n}:{},...r?{sourceMessage:r}:{}}}function ne(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,l.hashMessage)(t,n)&&(i.push(`${T} ${e}`),i.push(`msg\`${t}\``)),i.length>0?i.join(`
|
|
9
|
-
`):void 0}var k=3e4;function A(){return(0,p.resolve)(typeof __dirname<`u`?__dirname:(0,p.dirname)((0,g.fileURLToPath)({}.url)),`compile-worker.js`)}async function j(e,t){if(e.length===0)return[];if(e.length===1){let{compileCatalog:t}=await Promise.resolve().then(()=>require(`./compile-C3VLvhUf.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=A();if(!(0,f.existsSync)(n))return M(e);let r=t??Math.min(e.length,(0,h.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 m.Worker(n),u=setTimeout(()=>{o||(o=!0,s--,l.terminate(),t(Error(`Worker timed out after ${k}ms compiling locale "${r.locale}"`)))},k);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 M(e){let{compileCatalog:t}=await Promise.resolve().then(()=>require(`./compile-C3VLvhUf.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 N=`1`,P=class{data;cachePath;dirty=!1;constructor(e,t){this.cachePath=(0,p.resolve)(t?(0,p.resolve)(e,`.cache`,t):(0,p.resolve)(e,`.cache`),`extract-cache.json`),this.data=this.load()}get(e){let t=this.data.entries[e];if(t)try{let n=(0,f.statSync)(e);if(n.mtimeMs===t.mtime&&n.size===t.size)return t.messages}catch{}}set(e,t){try{let n=(0,f.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,f.mkdirSync)((0,p.dirname)(this.cachePath),{recursive:!0}),(0,f.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,f.existsSync)(this.cachePath)){let e=(0,f.readFileSync)(this.cachePath,`utf-8`),t=JSON.parse(e);if(t.version===N)return t}}catch{}return{version:N,entries:{}}}},F=new Set([`Trans`,`Plural`,`Select`,`DateTime`,`NumberFormat`]),I=[`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 L(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 R(e){let t=e.isType?`type `:``;return e.imported===e.local?`${t}${e.imported}`:`${t}${e.imported} as ${e.local}`}function z(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 B(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 { ${z(r.flatMap(e=>e[1].split(`,`).map(e=>L(e)).filter(e=>e.imported.length>0))).map(R).join(`, `)} } from '${t}'\n`,a=!0;return e.replace(n,()=>a?(a=!1,i):``)}function V(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(L),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&&F.has(t.imported)&&i.endsWith(`/components`)){c.push(t);continue}s.push(t)}let u=[];s.length>0&&!i.endsWith(`/components`)&&u.push(`import { ${z(s).map(R).join(`, `)} } from '@fluenti/${a}'`),c.length>0&&u.push(`import { ${z(c).map(R).join(`, `)} } from '@fluenti/${a}/components'`),l.length>0&&u.push(`import { ${z(l).map(R).join(`, `)} } from '@fluenti/core/runtime'`),s.length>0&&i.endsWith(`/components`)&&u.unshift(`import { ${z(s).map(R).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=B(t,e);r!==t&&(t=r,n=!0)}return{code:t,changed:n}}async function H(e){let t=await(0,_.default)(e.include&&e.include.length>0?e.include:I,{cwd:e.cwd,absolute:!1,ignore:[`**/node_modules/**`,`**/dist/**`,`**/.fluenti/**`]}),n=[];for(let r of t){let t=(0,p.resolve)(e.cwd,r),i=V((0,f.readFileSync)(t,`utf-8`));i.changed&&(e.write&&(0,f.writeFileSync)(t,i.code,`utf-8`),n.push({file:r,changed:!0}))}return{changedFiles:n,changedCount:n.length}}var U=/^[a-zA-Z]{2,3}(-[a-zA-Z0-9]{1,8})*$/;function W(e){if(!U.test(e))throw Error(`Invalid locale format: "${e}"`);return e}var G=[{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 K(e){for(let t of G)if(t.dep in e)return{name:t.name,pluginPackage:t.pluginPackage};return{name:`unknown`,pluginPackage:null}}function q(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 J(e){let t=(0,p.resolve)(e.cwd,`package.json`);if(!(0,f.existsSync)(t)){v.default.error(`No package.json found in current directory.`);return}let n=JSON.parse((0,f.readFileSync)(t,`utf-8`)),r=K({...n.dependencies,...n.devDependencies});v.default.info(`Detected framework: ${r.name}`),r.pluginPackage&&v.default.info(`Recommended plugin: ${r.pluginPackage}`);let i=(0,p.resolve)(e.cwd,`fluenti.config.ts`);if((0,f.existsSync)(i)){v.default.warn(`fluenti.config.ts already exists. Skipping config generation.`);return}let a=await v.default.prompt(`Source locale?`,{type:`text`,default:`en`,placeholder:`en`});if(typeof a==`symbol`)return;let o=await v.default.prompt(`Target locales (comma-separated)?`,{type:`text`,default:`ja,zh-CN`,placeholder:`ja,zh-CN`});if(typeof o==`symbol`)return;let s=await v.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);W(a);for(let e of c)W(e);(0,f.writeFileSync)(i,q({sourceLocale:a,locales:[a,...c.filter(e=>e!==a)],format:s}),`utf-8`),v.default.success(`Created fluenti.config.ts`);let l=(0,p.resolve)(e.cwd,`.gitignore`),u=`src/locales/compiled/`;(0,f.existsSync)(l)?(0,f.readFileSync)(l,`utf-8`).includes(u)||((0,f.appendFileSync)(l,`\n# Fluenti compiled catalogs\n${u}\n`),v.default.success(`Updated .gitignore`)):((0,f.writeFileSync)(l,`# Fluenti compiled catalogs\n${u}\n`),v.default.success(`Created .gitignore`));let d=n.scripts??{},m={},h=!1;if(d[`i18n:extract`]||(m[`i18n:extract`]=`fluenti extract`,h=!0),d[`i18n:compile`]||(m[`i18n:compile`]=`fluenti compile`,h=!0),h){let e={...n,scripts:{...d,...m}};(0,f.writeFileSync)(t,JSON.stringify(e,null,2)+`
|
|
21
|
-
`,`utf-8`),v.default.success(`Added i18n:extract and i18n:compile scripts to package.json`)}v.default.log(``),v.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 Y=[`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}`],ie=/import\s*\{[\s\S]*?\binterpolate\b[\s\S]*?\}\s*from\s*['"]@fluenti\/(react|vue|solid)(?:\/components)?['"]/g,ae=/from\s*['"]@fluenti\/core\/internal['"]/g;function X(e){return(0,f.existsSync)(e)?(0,f.readFileSync)(e,`utf-8`):void 0}function oe(e,t){if(t)return(0,p.resolve)(e,t);for(let t of[`fluenti.config.ts`,`fluenti.config.mts`,`fluenti.config.js`,`fluenti.config.mjs`]){let n=(0,p.resolve)(e,t);if((0,f.existsSync)(n))return n}}async function se(e){return(0,_.default)(Y,{cwd:e,absolute:!1,ignore:[`**/node_modules/**`,`**/dist/**`,`**/.fluenti/**`]})}function Z(e,t,n,r){e.push({severity:t,code:n,message:r})}function ce(e){let t=X((0,p.resolve)(e,`package.json`));if(t)return JSON.parse(t)}function le(e){return e?e.includes(`@fluenti/`)&&e.includes(`vite-plugin`):!1}function Q(e,t){return[...e.matchAll(t)].length}async function $(e){let t=[],n=ce(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=K({...n.dependencies,...n.devDependencies}),i=oe(e.cwd,e.config),a=await se(e.cwd),o=0,s=0,c=!1,l=!1;for(let t of a){let n=(0,f.readFileSync)((0,p.resolve)(e.cwd,t),`utf-8`);o+=Q(n,ie),s+=Q(n,ae),c||=n.includes(`@fluenti/`),l||=n.includes(`from '@fluenti/`)&&n.includes(" t`")}if(o>0&&Z(t,`warning`,`main-entry-interpolate`,`Found ${o} import(s) of interpolate from framework packages. Import interpolate from @fluenti/core/runtime instead.`),s>0&&Z(t,`warning`,`core-internal-imports`,`Found ${s} import(s) from @fluenti/core/internal. Use @fluenti/core/runtime or @fluenti/core/compiler.`),i||Z(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,p.resolve)(e.cwd,t)).find(e=>(0,f.existsSync)(e)),r=n?X(n):void 0;c&&!r?.includes(`withFluenti(`)&&Z(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,p.resolve)(e.cwd,t)).find(e=>(0,f.existsSync)(e)),r=n?X(n):void 0;(c||l)&&!le(r)&&Z(t,`warning`,`missing-vite-plugin`,`Project imports Fluenti but vite.config does not appear to include a Fluenti Vite plugin.`)}if(i&&(0,f.existsSync)(i))try{let n=await(0,d.loadConfig)(i),r=n.format===`json`?`.json`:`.po`,a=(0,p.resolve)(e.cwd,n.catalogDir,`${n.sourceLocale}${r}`);(0,f.existsSync)(a)||Z(t,`warning`,`missing-source-catalog`,`Source catalog not found: ${a}`);let o=(0,p.resolve)(e.cwd,n.compileOutDir,`index.js`);(0,f.existsSync)(o)||Z(t,`warning`,`missing-compiled-catalogs`,`Compiled catalogs not found at ${o}. Run "fluenti compile".`)}catch(e){Z(t,`error`,`invalid-config`,`Failed to load Fluenti config: ${e instanceof Error?e.message:String(e)}`)}return t.length===0&&Z(t,`info`,`ok`,`No Fluenti migration or configuration issues detected.`),{framework:r.name,findings:t,...i?{configPath:i}:{}}}function ue(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 H}}),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 y}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return V}}),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 $}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return J}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return ue}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return C}});
|