@better-intl/cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.cjs +628 -0
- package/dist/bin.cjs.map +1 -0
- package/dist/bin.d.cts +1 -0
- package/dist/bin.d.ts +1 -0
- package/dist/bin.js +70 -0
- package/dist/bin.js.map +1 -0
- package/dist/chunk-PKWV2XQ2.js +560 -0
- package/dist/chunk-PKWV2XQ2.js.map +1 -0
- package/dist/index.cjs +571 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +32 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/package.json +35 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/dashboard.tsx","../src/commands.ts","../src/config.ts"],"names":["glob","resolve","relative","readFile","extract","jsxs","Box","Text","jsx","useApp","useState","useInput","useEffect","render","resolveFiles","extractAllMessages","loadAllCatalogs","mkdir","dirname","generateDefaultCatalog","mergeCatalog","writeFile","findMissingKeys","findDeadKeys","truncate","path","DEFAULT_CONFIG"],"mappings":";;;;;;;;;;;AAaA,eAAe,YAAA,CACb,QAAA,EACA,OAAA,EACA,GAAA,EACmB;AACnB,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,WAAA,MAAiB,SAASA,aAAA,CAAK,OAAA,EAAS,EAAE,GAAA,EAAK,CAAA,EAAG;AAChD,MAAA,MAAM,QAAA,GAAWC,YAAA,CAAQ,GAAA,EAAK,KAAK,CAAA;AACnC,MAAA,MAAM,GAAA,GAAMC,aAAA,CAAS,GAAA,EAAK,QAAQ,CAAA;AAElC,MAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,IAAA,CAAK,CAAC,EAAA,KAAO;AACtC,QAAA,MAAM,QAAQ,IAAI,MAAA;AAAA,UAChB,GAAG,OAAA,CAAQ,OAAA,EAAS,IAAI,CAAA,CAAE,OAAA,CAAQ,OAAO,OAAO;AAAA,SAClD;AACA,QAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,MACvB,CAAC,CAAA;AAED,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,CAAC,GAAG,IAAI,GAAA,CAAI,KAAK,CAAC,CAAA;AAC3B;AAEA,eAAe,kBAAA,CACb,QACA,GAAA,EAC6B;AAC7B,EAAA,MAAM,QAAQ,MAAM,YAAA,CAAa,OAAO,OAAA,EAAS,MAAA,CAAO,SAAS,GAAG,CAAA;AACpE,EAAA,MAAM,cAAkC,EAAC;AAEzC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,MAAA,GAAS,MAAMC,iBAAA,CAAS,IAAA,EAAM,OAAO,CAAA;AAC3C,IAAA,MAAM,OAAA,GAAUD,aAAA,CAAS,GAAA,EAAK,IAAI,CAAA;AAClC,IAAA,WAAA,CAAY,IAAA,CAAK,GAAGE,gBAAA,CAAQ,MAAA,EAAQ,EAAE,QAAA,EAAU,OAAA,EAAS,CAAC,CAAA;AAAA,EAC5D;AAEA,EAAA,OAAO,WAAA;AACT;AAEA,eAAe,eAAA,CACb,QACA,GAAA,EACmC;AACnC,EAAA,MAAM,WAAqC,EAAC;AAE5C,EAAA,KAAA,MAAW,MAAA,IAAU,OAAO,OAAA,EAAS;AACnC,IAAA,MAAM,WAAA,GAAcH,YAAA;AAAA,MAClB,GAAA;AAAA,MACA,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,UAAA,EAAY,MAAM;AAAA,KAC5C;AACA,IAAA,IAAI;AACF,MAAA,QAAA,CAAS,MAAM,IAAI,IAAA,CAAK,KAAA,CAAM,MAAME,iBAAA,CAAS,WAAA,EAAa,OAAO,CAAC,CAAA;AAAA,IACpE,CAAA,CAAA,MAAQ;AACN,MAAA,QAAA,CAAS,MAAM,IAAI,EAAC;AAAA,IACtB;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AAqBA,eAAe,mBAAA,CACb,QACA,GAAA,EAC0B;AAC1B,EAAA,MAAM,WAAA,GAAc,MAAM,kBAAA,CAAmB,MAAA,EAAQ,GAAG,CAAA;AACxD,EAAA,MAAM,QAAA,GAAW,MAAM,eAAA,CAAgB,MAAA,EAAQ,GAAG,CAAA;AAClD,EAAA,MAAM,YAAA,GAAe,IAAI,GAAA,CAAI,WAAA,CAAY,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AAEzD,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,EAAA,KAAA,MAAW,QAAA,IAAY,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAA,EAAG;AAC9C,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,EAAG;AACvC,MAAA,IAAI,CAAC,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA,EAAG;AAC1B,QAAA,UAAA,CAAW,IAAI,GAAG,CAAA;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAY,WAAA,CAAY,GAAA,CAAI,CAAC,GAAA,KAAQ;AACzC,IAAA,MAAM,eAAuC,EAAC;AAC9C,IAAA,KAAA,MAAW,MAAA,IAAU,OAAO,OAAA,EAAS;AACnC,MAAA,IAAI,IAAI,EAAA,KAAO,QAAA,CAAS,MAAM,CAAA,IAAK,EAAC,CAAA,EAAI;AACtC,QAAA,YAAA,CAAa,MAAM,CAAA,GAAI,QAAA,CAAS,MAAM,CAAA,CAAE,IAAI,EAAE,CAAA;AAAA,MAChD;AAAA,IACF;AACA,IAAA,OAAO;AAAA,MACL,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,MAAA,EAAQ,GAAG,GAAA,CAAI,QAAQ,IAAI,GAAA,CAAI,IAAI,CAAA,EAAA,EAAK,GAAA,CAAI,WAAW,CAAA,CAAA,CAAA;AAAA,MACvD,SAAS,GAAA,CAAI,cAAA;AAAA,MACb;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,SAAS,CAAC,GAAG,UAAU,CAAA,CAAE,GAAA,CAAI,CAAC,GAAA,KAAQ;AAC1C,IAAA,MAAM,eAAuC,EAAC;AAC9C,IAAA,KAAA,MAAW,MAAA,IAAU,OAAO,OAAA,EAAS;AACnC,MAAA,IAAI,GAAA,KAAQ,QAAA,CAAS,MAAM,CAAA,IAAK,EAAC,CAAA,EAAI;AACnC,QAAA,YAAA,CAAa,MAAM,CAAA,GAAI,QAAA,CAAS,MAAM,EAAE,GAAG,CAAA;AAAA,MAC7C;AAAA,IACF;AACA,IAAA,OAAO,EAAE,KAAK,YAAA,EAAa;AAAA,EAC7B,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,eAAe,MAAA,CAAO,aAAA;AAAA,IACtB,SAAA;AAAA,IACA;AAAA,GACF;AACF;AAIA,SAAS,QAAA,CAAS,MAAc,GAAA,EAAqB;AACnD,EAAA,OAAO,IAAA,CAAK,MAAA,GAAS,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,EAAG,GAAA,GAAM,CAAC,CAAC,CAAA,MAAA,CAAA,GAAM,IAAA;AAC5D;AAEA,SAAS,GAAA,CAAI,MAAc,KAAA,EAAuB;AAChD,EAAA,OAAO,IAAA,CAAK,UAAU,KAAA,GAAQ,IAAA,GAAO,OAAO,GAAA,CAAI,MAAA,CAAO,KAAA,GAAQ,IAAA,CAAK,MAAM,CAAA;AAC5E;AAIA,SAAS,MAAA,CAAO,EAAE,IAAA,EAAK,EAA8B;AACnD,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,MAAA,GAAS,KAAK,MAAA,CAAO,MAAA;AAEtD,EAAA,uBACEE,eAAA,CAACC,OAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EAAS,cAAc,CAAA,EACxC,QAAA,EAAA;AAAA,oBAAAD,eAAA,CAACE,QAAA,EAAA,EAAK,MAAI,IAAA,EAAC,QAAA,EAAA;AAAA,MAAA,cAAA;AAAA,sBACGC,cAAA,CAACD,QAAA,EAAA,EAAK,KAAA,EAAM,MAAA,EAAO,QAAA,EAAA,WAAA,EAAS;AAAA,KAAA,EAC1C,CAAA;AAAA,oBACAF,eAAA,CAACE,QAAA,EAAA,EAAK,KAAA,EAAM,MAAA,EACT,QAAA,EAAA;AAAA,MAAA,SAAA;AAAA,MAAU,aAAA;AAAA,MAAS,KAAK,OAAA,CAAQ,MAAA;AAAA,MAAO,eAAA;AAAA,MAAW,GAAA;AAAA,MAClD,KAAK,SAAA,CAAU,MAAA;AAAA,MAAO,kBAAA;AAAA,MAAc,KAAK,MAAA,CAAO,MAAA;AAAA,MAAO;AAAA,KAAA,EAC1D;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,UAAA,CAAW,EAAE,GAAA,EAAK,SAAA,EAAU,EAAyC;AAC5E,EAAA,IAAI,WAAW,uBAAOC,cAAA,CAACD,QAAA,EAAA,EAAK,KAAA,EAAM,QAAO,QAAA,EAAA,QAAA,EAAC,CAAA;AAC1C,EAAA,IAAI,KAAK,uBAAOC,cAAA,CAACD,QAAA,EAAA,EAAK,KAAA,EAAM,SAAQ,QAAA,EAAA,QAAA,EAAC,CAAA;AACrC,EAAA,uBAAOC,cAAA,CAACD,QAAA,EAAA,EAAK,KAAA,EAAM,KAAA,EAAM,QAAA,EAAA,QAAA,EAAC,CAAA;AAC5B;AAEA,SAAS,cAAA,CAAe,EAAE,IAAA,EAAK,EAA8B;AAC3D,EAAA,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAExC,EAAA,MAAM,WAAA,GAAc,EAAA;AACpB,EAAA,MAAM,YAAA,GAAe,EAAA;AAErB,EAAA,uBACEF,eAAA,CAACC,OAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EAAS,cAAc,CAAA,EACxC,QAAA,EAAA;AAAA,oBAAAE,cAAA,CAACD,QAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAC,KAAA,EAAM,QAAO,QAAA,EAAA,uBAAA,EAExB,CAAA;AAAA,oBACAC,cAAA,CAACF,OAAA,EAAA,EACC,QAAA,kBAAAD,eAAA,CAACE,QAAA,EAAA,EAAK,OAAM,MAAA,EACT,QAAA,EAAA;AAAA,MAAA,GAAA,CAAI,UAAU,WAAW,CAAA;AAAA,MAAE,GAAA;AAAA,MAAE,GAAA,CAAI,WAAW,YAAY,CAAA;AAAA,MAAG,GAAA;AAAA,MAC3D,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE;AAAA,KAAA,EAC7C,CAAA,EACF,CAAA;AAAA,oBACAC,cAAA,CAACD,QAAA,EAAA,EAAK,KAAA,EAAM,MAAA,EACT,QAAA,EAAA,QAAA,CAAI,MAAA,CAAO,WAAA,GAAc,YAAA,GAAe,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,CAAC,CAAA,EACtE,CAAA;AAAA,IACC,KAAK,SAAA,CAAU,GAAA,CAAI,CAAC,GAAA,qCAClBD,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAD,eAAA,CAACE,QAAA,EAAA,EAAK,OAAM,MAAA,EACT,QAAA,EAAA;AAAA,QAAA,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,MAAA,EAAQ,WAAW,GAAG,WAAW,CAAA;AAAA,QAAG;AAAA,OAAA,EACxD,CAAA;AAAA,sBACAF,eAAA,CAACE,QAAA,EAAA,EAAK,KAAA,EAAM,MAAA,EACT,QAAA,EAAA;AAAA,QAAA,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,OAAA,EAAS,YAAY,GAAG,YAAY,CAAA;AAAA,QAAG;AAAA,OAAA,EAC3D,CAAA;AAAA,MACC,IAAA,CAAK,QAAQ,GAAA,CAAI,CAAC,2BACjBC,cAAA,CAACF,OAAA,EAAA,EAAiB,OAAO,CAAA,EACvB,QAAA,kBAAAE,cAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,CAAC,CAAC,GAAA,CAAI,aAAa,MAAM,CAAA;AAAA,UAC9B,SAAA,EAAW,WAAW,IAAA,CAAK;AAAA;AAAA,OAC7B,EAAA,EAJQ,MAKV,CACD;AAAA,KAAA,EAAA,EAdO,GAAA,CAAI,EAed,CACD;AAAA,GAAA,EACH,CAAA;AAEJ;AAEA,SAAS,WAAA,CAAY,EAAE,IAAA,EAAK,EAA8B;AACxD,EAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAErC,EAAA,MAAM,QAAA,GAAW,EAAA;AAEjB,EAAA,uBACEH,eAAA,CAACC,OAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EAAS,cAAc,CAAA,EACxC,QAAA,EAAA;AAAA,oBAAAE,cAAA,CAACD,QAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAC,KAAA,EAAM,QAAO,QAAA,EAAA,aAAA,EAExB,CAAA;AAAA,oBACAC,cAAA,CAACF,OAAA,EAAA,EACC,QAAA,kBAAAD,eAAA,CAACE,QAAA,EAAA,EAAK,OAAM,MAAA,EACT,QAAA,EAAA;AAAA,MAAA,GAAA,CAAI,OAAO,QAAQ,CAAA;AAAA,MAAE,GAAA;AAAA,MAAE,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE;AAAA,KAAA,EACpE,CAAA,EACF,CAAA;AAAA,oBACAC,cAAA,CAACD,QAAA,EAAA,EAAK,KAAA,EAAM,MAAA,EACT,QAAA,EAAA,QAAA,CAAI,MAAA,CAAO,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,CAAC,CAAA,EACpD,CAAA;AAAA,IACC,KAAK,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,qCACfD,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAD,eAAA,CAACE,QAAA,EAAA,EAAK,OAAM,SAAA,EACT,QAAA,EAAA;AAAA,QAAA,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,GAAA,EAAK,QAAQ,GAAG,QAAQ,CAAA;AAAA,QAAG;AAAA,OAAA,EAC/C,CAAA;AAAA,MACC,IAAA,CAAK,QAAQ,GAAA,CAAI,CAAC,2BACjBC,cAAA,CAACF,OAAA,EAAA,EAAiB,KAAA,EAAO,CAAA,EACvB,QAAA,kBAAAE,cAAA,CAAC,UAAA,EAAA,EAAW,KAAK,CAAC,CAAC,IAAI,YAAA,CAAa,MAAM,GAAG,SAAA,EAAW,KAAA,EAAO,CAAA,EAAA,EADvD,MAEV,CACD;AAAA,KAAA,EAAA,EARO,GAAA,CAAI,GASd,CACD;AAAA,GAAA,EACH,CAAA;AAEJ;AAEA,SAAS,QAAA,CAAS,EAAE,IAAA,EAAK,EAA8B;AACrD,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,MAAA,GAAS,KAAK,MAAA,CAAO,MAAA;AACtD,EAAA,IAAI,SAAA,KAAc,GAAG,OAAO,IAAA;AAE5B,EAAA,uBACEH,eAAA,CAACC,OAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EACjB,QAAA,EAAA;AAAA,oBAAAE,cAAA,CAACD,QAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAC,KAAA,EAAM,QAAO,QAAA,EAAA,UAAA,EAExB,CAAA;AAAA,IACC,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AAC5B,MAAA,MAAM,SAAA,GAAY,WAAW,IAAA,CAAK,aAAA;AAClC,MAAA,MAAM,UAAA,GAAa,YACf,SAAA,GACA,IAAA,CAAK,UAAU,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,YAAA,CAAa,MAAM,CAAC,CAAA,CAAE,MAAA,GACrD,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,YAAA,CAAa,MAAM,CAAC,CAAA,CAAE,MAAA;AACtD,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAO,UAAA,GAAa,YAAa,GAAG,CAAA;AAErD,MAAA,MAAM,QAAA,GAAW,EAAA;AACjB,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAO,GAAA,GAAM,MAAO,QAAQ,CAAA;AAChD,MAAA,MAAM,GAAA,GAAM,SAAI,MAAA,CAAO,MAAM,IAAI,QAAA,CAAI,MAAA,CAAO,WAAW,MAAM,CAAA;AAE7D,MAAA,MAAM,QAAQ,GAAA,KAAQ,GAAA,GAAM,OAAA,GAAU,GAAA,IAAO,KAAK,QAAA,GAAW,KAAA;AAE7D,MAAA,uBACEF,eAAA,CAACC,OAAA,EAAA,EAAiB,GAAA,EAAK,CAAA,EACrB,QAAA,EAAA;AAAA,wBAAAE,cAAA,CAACD,QAAA,EAAA,EAAM,QAAA,EAAA,GAAA,CAAI,MAAA,EAAQ,CAAC,CAAA,EAAE,CAAA;AAAA,wBACtBC,cAAA,CAACD,QAAA,EAAA,EAAK,KAAA,EAAe,QAAA,EAAA,GAAA,EAAI,CAAA;AAAA,wBACzBF,eAAA,CAACE,QAAA,EAAA,EAAK,KAAA,EAAc,IAAA,EAAI,IAAA,EACrB,QAAA,EAAA;AAAA,UAAA,GAAA;AAAA,UAAI;AAAA,SAAA,EACP,CAAA;AAAA,wBACAF,eAAA,CAACE,QAAA,EAAA,EAAK,KAAA,EAAM,MAAA,EAAO,QAAA,EAAA;AAAA,UAAA,GAAA;AAAA,UACf,UAAA;AAAA,UAAW,GAAA;AAAA,UAAE,SAAA;AAAA,UAAU;AAAA,SAAA,EAC3B;AAAA,OAAA,EAAA,EARQ,MASV,CAAA;AAAA,IAEJ,CAAC;AAAA,GAAA,EACH,CAAA;AAEJ;AAEA,SAAS,GAAA,CAAI,EAAE,MAAA,EAAQ,GAAA,EAAI,EAA8C;AACvE,EAAA,MAAM,EAAE,IAAA,EAAK,GAAIE,UAAA,EAAO;AACxB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIC,eAAiC,IAAI,CAAA;AAC7D,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAAC,YAAA,CAAS,CAAC,KAAA,KAAU;AAClB,IAAA,IAAI,KAAA,KAAU,KAAK,IAAA,EAAK;AAAA,EAC1B,CAAC,CAAA;AAED,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,mBAAA,CAAoB,MAAA,EAAQ,GAAG,CAAA,CAC5B,IAAA,CAAK,OAAO,CAAA,CACZ,KAAA,CAAM,CAAC,GAAA,KAAiB,QAAA,CAAS,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AAAA,EAClD,CAAA,EAAG,CAAC,MAAA,EAAQ,GAAG,CAAC,CAAA;AAEhB,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,uBACEP,eAAA,CAACC,OAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EAAS,SAAS,CAAA,EACnC,QAAA,EAAA;AAAA,sBAAAE,cAAA,CAACD,QAAA,EAAA,EAAK,KAAA,EAAM,KAAA,EAAM,IAAA,EAAI,MAAC,QAAA,EAAA,4BAAA,EAEvB,CAAA;AAAA,sBACAC,cAAA,CAACD,QAAA,EAAA,EAAK,KAAA,EAAM,KAAA,EAAO,QAAA,EAAA,KAAA,EAAM;AAAA,KAAA,EAC3B,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,uBACEC,cAAA,CAACF,WAAI,OAAA,EAAS,CAAA,EACZ,yCAACC,QAAA,EAAA,EAAK,KAAA,EAAM,MAAA,EAAO,QAAA,EAAA,4BAAA,EAAqB,CAAA,EAC1C,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEF,eAAA,CAACC,OAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EAAS,SAAS,CAAA,EACnC,QAAA,EAAA;AAAA,oBAAAE,cAAA,CAAC,UAAO,IAAA,EAAY,CAAA;AAAA,oBACpBA,cAAA,CAAC,kBAAe,IAAA,EAAY,CAAA;AAAA,oBAC5BA,cAAA,CAAC,eAAY,IAAA,EAAY,CAAA;AAAA,oBACzBA,cAAA,CAAC,YAAS,IAAA,EAAY,CAAA;AAAA,oBACtBA,cAAA,CAACF,WAAI,SAAA,EAAW,CAAA,EACd,yCAACC,QAAA,EAAA,EAAK,QAAA,EAAQ,IAAA,EAAC,QAAA,EAAA,iBAAA,EAAe,CAAA,EAChC;AAAA,GAAA,EACF,CAAA;AAEJ;AAIA,eAAsB,UAAA,CACpB,QACA,GAAA,EACe;AACf,EAAA,MAAM,WAAWM,UAAA,iBAAOL,cAAA,CAAC,GAAA,EAAA,EAAI,MAAA,EAAgB,KAAU,CAAE,CAAA;AACzD,EAAA,MAAM,SAAS,aAAA,EAAc;AAC/B;;;ACjVA,SAAS,IAAI,GAAA,EAAa;AACxB,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA;AACxB;AAEA,SAAS,UAAU,GAAA,EAAa;AAC9B,EAAA,OAAA,CAAQ,GAAA,CAAI;AAAA,OAAA,EAAO,GAAG;AAAA,CAAI,CAAA;AAC5B;AAKA,eAAeM,aAAAA,CACb,QAAA,EACA,OAAA,EACA,GAAA,EACmB;AACnB,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,WAAA,MAAiB,SAASd,aAAAA,CAAK,OAAA,EAAS,EAAE,GAAA,EAAK,CAAA,EAAG;AAChD,MAAA,MAAM,QAAA,GAAWC,YAAAA,CAAQ,GAAA,EAAK,KAAK,CAAA;AACnC,MAAA,MAAM,GAAA,GAAMC,aAAAA,CAAS,GAAA,EAAK,QAAQ,CAAA;AAElC,MAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,IAAA,CAAK,CAAC,EAAA,KAAO;AACtC,QAAA,MAAM,QAAQ,IAAI,MAAA;AAAA,UAChB,GAAG,OAAA,CAAQ,OAAA,EAAS,IAAI,CAAA,CAAE,OAAA,CAAQ,OAAO,OAAO;AAAA,SAClD;AACA,QAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,MACvB,CAAC,CAAA;AAED,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,CAAC,GAAG,IAAI,GAAA,CAAI,KAAK,CAAC,CAAA;AAC3B;AAKA,eAAea,mBAAAA,CACb,QACA,GAAA,EAC6B;AAC7B,EAAA,MAAM,QAAQ,MAAMD,aAAAA,CAAa,OAAO,OAAA,EAAS,MAAA,CAAO,SAAS,GAAG,CAAA;AACpE,EAAA,MAAM,cAAkC,EAAC;AAEzC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,MAAA,GAAS,MAAMX,iBAAAA,CAAS,IAAA,EAAM,OAAO,CAAA;AAC3C,IAAA,MAAM,OAAA,GAAUD,aAAAA,CAAS,GAAA,EAAK,IAAI,CAAA;AAClC,IAAA,WAAA,CAAY,IAAA,CAAK,GAAGE,gBAAAA,CAAQ,MAAA,EAAQ,EAAE,QAAA,EAAU,OAAA,EAAS,CAAC,CAAA;AAAA,EAC5D;AAEA,EAAA,OAAO,WAAA;AACT;AAKA,eAAeY,gBAAAA,CACb,QACA,GAAA,EACmC;AACnC,EAAA,MAAM,WAAqC,EAAC;AAE5C,EAAA,KAAA,MAAW,MAAA,IAAU,OAAO,OAAA,EAAS;AACnC,IAAA,MAAM,WAAA,GAAcf,YAAAA;AAAA,MAClB,GAAA;AAAA,MACA,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,UAAA,EAAY,MAAM;AAAA,KAC5C;AACA,IAAA,IAAI;AACF,MAAA,QAAA,CAAS,MAAM,IAAI,IAAA,CAAK,KAAA,CAAM,MAAME,iBAAAA,CAAS,WAAA,EAAa,OAAO,CAAC,CAAA;AAAA,IACpE,CAAA,CAAA,MAAQ;AACN,MAAA,QAAA,CAAS,MAAM,IAAI,EAAC;AAAA,IACtB;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AAKA,eAAsB,cAAA,CACpB,QACA,GAAA,EACe;AACf,EAAA,SAAA,CAAU,wBAAwB,CAAA;AAElC,EAAA,MAAM,WAAA,GAAc,MAAMY,mBAAAA,CAAmB,MAAA,EAAQ,GAAG,CAAA;AACxD,EAAA,GAAA,CAAI,CAAA,UAAA,EAAa,WAAA,CAAY,MAAM,CAAA,SAAA,CAAW,CAAA;AAG9C,EAAA,KAAA,MAAW,MAAA,IAAU,OAAO,OAAA,EAAS;AACnC,IAAA,MAAM,WAAA,GAAcd,YAAAA;AAAA,MAClB,GAAA;AAAA,MACA,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,UAAA,EAAY,MAAM;AAAA,KAC5C;AAEA,IAAA,MAAMgB,eAAMC,YAAA,CAAQ,WAAW,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAErD,IAAA,IAAI,WAAqB,EAAC;AAC1B,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,KAAK,KAAA,CAAM,MAAMf,iBAAAA,CAAS,WAAA,EAAa,OAAO,CAAC,CAAA;AAAA,IAC5D,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,IAAI,MAAA,KAAW,OAAO,aAAA,EAAe;AACnC,MAAiBgB,gCAAuB,WAAW;AACnD,MAAA,MAAM,EAAE,QAAA,EAAU,KAAA,EAAO,SAAQ,GAAIC,qBAAA,CAAa,UAAU,WAAW,CAAA;AAEvE,MAAA,MAAMC,kBAAA,CAAU,aAAa,CAAA,EAAG,IAAA,CAAK,UAAU,QAAA,EAAU,IAAA,EAAM,CAAC,CAAC;AAAA,CAAI,CAAA;AACrE,MAAA,GAAA;AAAA,QACE,CAAA,EAAG,MAAM,CAAA,EAAA,EAAK,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,MAAM,CAAA,OAAA,EAAU,KAAA,CAAM,MAAM,CAAA,QAAA,EAAW,QAAQ,MAAM,CAAA,SAAA;AAAA,OAC3F;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,EAAE,QAAA,EAAU,KAAA,EAAM,GAAID,qBAAA,CAAa,UAAU,WAAW,CAAA;AAC9D,MAAA,MAAMC,kBAAA,CAAU,aAAa,CAAA,EAAG,IAAA,CAAK,UAAU,QAAA,EAAU,IAAA,EAAM,CAAC,CAAC;AAAA,CAAI,CAAA;AACrE,MAAA,GAAA;AAAA,QACE,CAAA,EAAG,MAAM,CAAA,EAAA,EAAK,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,MAAM,CAAA,OAAA,EAAU,KAAA,CAAM,MAAM,CAAA,kBAAA;AAAA,OAClE;AAAA,IACF;AAAA,EACF;AAEA,EAAA,SAAA,CAAU,OAAO,CAAA;AACnB;AAKA,eAAsB,eAAA,CACpB,QACA,GAAA,EACe;AACf,EAAA,SAAA,CAAU,wBAAwB,CAAA;AAElC,EAAA,MAAM,WAAA,GAAcpB,YAAAA;AAAA,IAClB,GAAA;AAAA,IACA,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,UAAA,EAAY,OAAO,aAAa;AAAA,GAC1D;AAEA,EAAA,IAAI,cAAA;AACJ,EAAA,IAAI;AACF,IAAA,cAAA,GAAiB,KAAK,KAAA,CAAM,MAAME,iBAAAA,CAAS,WAAA,EAAa,OAAO,CAAC,CAAA;AAAA,EAClE,CAAA,CAAA,MAAQ;AACN,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,oCAAA,EAAkC,WAAW,CAAA,CAAE,CAAA;AAC7D,IAAA,OAAA,CAAQ,MAAM,6BAA6B,CAAA;AAC3C,IAAA,OAAA,CAAQ,QAAA,GAAW,CAAA;AACnB,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,EAAA,KAAA,MAAW,MAAA,IAAU,OAAO,OAAA,EAAS;AACnC,IAAA,IAAI,MAAA,KAAW,OAAO,aAAA,EAAe;AAErC,IAAA,MAAM,WAAA,GAAcF,YAAAA;AAAA,MAClB,GAAA;AAAA,MACA,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,UAAA,EAAY,MAAM;AAAA,KAC5C;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,UAAoB,IAAA,CAAK,KAAA;AAAA,QAC7B,MAAME,iBAAAA,CAAS,WAAA,EAAa,OAAO;AAAA,OACrC;AACA,MAAA,MAAM,OAAA,GAAUmB,wBAAA,CAAgB,cAAA,EAAgB,OAAO,CAAA;AAEvD,MAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,QAAA,GAAA,CAAI,CAAA,OAAA,EAAK,MAAM,CAAA,EAAA,EAAK,OAAA,CAAQ,MAAM,CAAA,aAAA,CAAe,CAAA;AACjD,QAAA,KAAA,MAAW,GAAA,IAAO,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,EAAG;AACrC,UAAA,GAAA,CAAI,OAAO,GAAG,CAAA,GAAA,EAAM,cAAA,CAAe,GAAG,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,QAC5C;AACA,QAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,UAAA,GAAA,CAAI,CAAA,UAAA,EAAa,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,KAAA,CAAO,CAAA;AAAA,QAC5C;AACA,QAAA,SAAA,GAAY,IAAA;AAAA,MACd,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,CAAA,OAAA,EAAK,MAAM,CAAA,UAAA,CAAY,CAAA;AAAA,MAC7B;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,GAAA,CAAI,CAAA,OAAA,EAAK,MAAM,CAAA,mBAAA,CAAqB,CAAA;AACpC,MAAA,SAAA,GAAY,IAAA;AAAA,IACd;AAAA,EACF;AAEA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,OAAA,CAAQ,QAAA,GAAW,CAAA;AAAA,EACrB,CAAA,MAAO;AACL,IAAA,SAAA,CAAU,qBAAqB,CAAA;AAAA,EACjC;AACF;AAKA,eAAsB,eAAA,CACpB,QACA,GAAA,EACe;AACf,EAAA,SAAA,CAAU,sBAAsB,CAAA;AAEhC,EAAA,MAAM,WAAA,GAAc,MAAMP,mBAAAA,CAAmB,MAAA,EAAQ,GAAG,CAAA;AACxD,EAAA,MAAM,QAAA,GAAW,MAAMC,gBAAAA,CAAgB,MAAA,EAAQ,GAAG,CAAA;AAElD,EAAA,KAAA,MAAW,MAAA,IAAU,OAAO,OAAA,EAAS;AACnC,IAAA,MAAM,OAAA,GAAU,SAAS,MAAM,CAAA;AAC/B,IAAA,MAAM,IAAA,GAAOO,qBAAA,CAAa,OAAA,EAAS,WAAW,CAAA;AAE9C,IAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,MAAA,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA,EAAA,EAAK,IAAA,CAAK,MAAM,CAAA,UAAA,CAAY,CAAA;AACzC,MAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,QAAA,GAAA,CAAI,CAAA,IAAA,EAAO,GAAG,CAAA,CAAE,CAAA;AAAA,MAClB;AAAA,IACF,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA,cAAA,CAAgB,CAAA;AAAA,IAC/B;AAAA,EACF;AACF;AAKA,eAAsB,cAAA,CACpB,QACA,GAAA,EACe;AACf,EAAA,SAAA,CAAU,iCAAiC,CAAA;AAE3C,EAAA,MAAM,WAAA,GAActB,YAAAA;AAAA,IAClB,GAAA;AAAA,IACA,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,UAAA,EAAY,OAAO,aAAa;AAAA,GAC1D;AAEA,EAAA,IAAI,cAAA;AACJ,EAAA,IAAI;AACF,IAAA,cAAA,GAAiB,KAAK,KAAA,CAAM,MAAME,iBAAAA,CAAS,WAAA,EAAa,OAAO,CAAC,CAAA;AAAA,EAClE,CAAA,CAAA,MAAQ;AACN,IAAA,OAAA,CAAQ,MAAM,wDAAwD,CAAA;AACtE,IAAA,OAAA,CAAQ,QAAA,GAAW,CAAA;AACnB,IAAA;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,MAAA,IAAU,OAAO,OAAA,EAAS;AACnC,IAAA,IAAI,MAAA,KAAW,OAAO,aAAA,EAAe;AAErC,IAAA,MAAM,WAAA,GAAcF,YAAAA;AAAA,MAClB,GAAA;AAAA,MACA,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,UAAA,EAAY,MAAM;AAAA,KAC5C;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,UAAoB,IAAA,CAAK,KAAA;AAAA,QAC7B,MAAME,iBAAAA,CAAS,WAAA,EAAa,OAAO;AAAA,OACrC;AACA,MAAA,MAAM,OAAA,GAAUmB,wBAAA,CAAgB,cAAA,EAAgB,OAAO,CAAA;AACvD,MAAA,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA,EAAA,EAAK,OAAA,CAAQ,MAAM,CAAA,QAAA,CAAU,CAAA;AAAA,IAC5C,CAAA,CAAA,MAAQ;AACN,MAAA,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA,sCAAA,CAAwC,CAAA;AAAA,IACvD;AAAA,EACF;AACF;AAKA,eAAsB,cAAA,CACpB,QACA,GAAA,EACe;AACf,EAAA,SAAA,CAAU,uBAAuB,CAAA;AAEjC,EAAA,MAAM,MAAA,GAASrB,YAAAA,CAAQ,GAAA,EAAK,cAAc,CAAA;AAC1C,EAAA,MAAMgB,cAAA,CAAM,MAAA,EAAQ,EAAE,SAAA,EAAW,MAAM,CAAA;AAEvC,EAAA,KAAA,MAAW,MAAA,IAAU,OAAO,OAAA,EAAS;AACnC,IAAA,MAAM,WAAA,GAAchB,YAAAA;AAAA,MAClB,GAAA;AAAA,MACA,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,UAAA,EAAY,MAAM;AAAA,KAC5C;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,UAAoB,IAAA,CAAK,KAAA;AAAA,QAC7B,MAAME,iBAAAA,CAAS,WAAA,EAAa,OAAO;AAAA,OACrC;AAGA,MAAA,MAAM,QAAA,GAAW,CAAA,eAAA,EAAkB,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA;AAAA,CAAA;AAC1D,MAAA,MAAM,OAAA,GAAUF,YAAAA,CAAQ,MAAA,EAAQ,CAAA,EAAG,MAAM,CAAA,GAAA,CAAK,CAAA;AAC9C,MAAA,MAAMoB,kBAAA,CAAU,SAAS,QAAQ,CAAA;AACjC,MAAA,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA,EAAA,EAAK,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,MAAM,CAAA,aAAA,EAAW,OAAO,CAAA,CAAE,CAAA;AAAA,IACnE,CAAA,CAAA,MAAQ;AACN,MAAA,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA,6BAAA,CAA+B,CAAA;AAAA,IAC9C;AAAA,EACF;AAEA,EAAA,SAAA,CAAU,OAAO,CAAA;AACnB;AAKA,eAAsB,WAAA,CACpB,QACA,GAAA,EACe;AACf,EAAA,SAAA,CAAU,oBAAoB,CAAA;AAE9B,EAAA,MAAM,WAAA,GAAc,MAAMN,mBAAAA,CAAmB,MAAA,EAAQ,GAAG,CAAA;AACxD,EAAA,MAAM,QAAA,GAAW,MAAMC,gBAAAA,CAAgB,MAAA,EAAQ,GAAG,CAAA;AAElD,EAAA,MAAM,YAAA,GAAe,IAAI,GAAA,CAAI,WAAA,CAAY,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AAGzD,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,EAAA,KAAA,MAAW,QAAA,IAAY,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAA,EAAG;AAC9C,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,EAAG;AACvC,MAAA,IAAI,CAAC,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA,EAAG;AAC1B,QAAA,UAAA,CAAW,IAAI,GAAG,CAAA;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,IAAA,GAAA,CAAI,kCAAkC,CAAA;AACtC,IAAA,GAAA,CAAI,QAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA;AAElB,IAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,EAAG,EAAE,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AACxE,IAAA,GAAA;AAAA,MACE,CAAA,EAAA,EAAK,QAAA,CAAS,QAAA,EAAU,EAAE,CAAC,CAAA,CAAA,EAAI,QAAA,CAAS,SAAA,EAAW,EAAE,CAAC,CAAA,CAAA,EAAI,aAAa,CAAA;AAAA,KACzE;AACA,IAAA,GAAA,CAAI,QAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA;AAElB,IAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,MAAA,MAAM,MAAA,GAASQ,SAAAA;AAAA,QACb,CAAA,EAAG,IAAI,QAAQ,CAAA,CAAA,EAAI,IAAI,IAAI,CAAA,EAAA,EAAK,IAAI,WAAW,CAAA,CAAA,CAAA;AAAA,QAC/C;AAAA,OACF;AACA,MAAA,MAAM,WAAA,GAAcA,SAAAA,CAAS,GAAA,CAAI,cAAA,EAAgB,EAAE,CAAA;AAEnD,MAAA,MAAM,WAAA,GAAc,MAAA,CAAO,OAAA,CACxB,GAAA,CAAI,CAAC,MAAA,KAAW;AACf,QAAA,MAAM,OAAA,GAAU,QAAA,CAAS,MAAM,CAAA,IAAK,EAAC;AACrC,QAAA,IAAI,EAAE,GAAA,CAAI,EAAA,IAAM,UAAU,OAAO,QAAA,CAAS,kBAAa,EAAE,CAAA;AACzD,QAAA,IAAI,WAAW,MAAA,CAAO,aAAA,EAAe,OAAO,QAAA,CAAS,UAAK,EAAE,CAAA;AAC5D,QAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAC1B,QAAA,IAAI,QAAQ,GAAA,CAAI,cAAA,EAAgB,OAAO,QAAA,CAAS,kBAAkB,EAAE,CAAA;AACpE,QAAA,OAAO,SAAS,CAAA,OAAA,EAAKA,SAAAA,CAAS,KAAK,EAAE,CAAC,IAAI,EAAE,CAAA;AAAA,MAC9C,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AAEV,MAAA,GAAA;AAAA,QACE,CAAA,EAAA,EAAK,QAAA,CAAS,MAAA,EAAQ,EAAE,CAAC,CAAA,CAAA,EAAI,QAAA,CAAS,WAAA,EAAa,EAAE,CAAC,CAAA,CAAA,EAAI,WAAW,CAAA;AAAA,OACvE;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,QAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA;AAClB,IAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,OAAA,CAC5B,GAAA,CAAI,CAAC,MAAA,KAAW;AACf,MAAA,MAAM,OAAA,GAAU,QAAA,CAAS,MAAM,CAAA,IAAK,EAAC;AACrC,MAAA,MAAM,KAAA,GAAQ,YAAY,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,EAAA,IAAM,OAAO,CAAA,CAAE,MAAA;AACzD,MAAA,OAAO,GAAG,MAAM,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,EAAI,YAAY,MAAM,CAAA,CAAA;AAAA,IAClD,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AACZ,IAAA,GAAA,CAAI,CAAA,EAAA,EAAK,WAAA,CAAY,MAAM,CAAA,eAAA,EAAkB,eAAe,CAAA,CAAE,CAAA;AAC9D,IAAA,OAAA,CAAQ,GAAA,EAAI;AAAA,EACd;AAGA,EAAA,IAAI,UAAA,CAAW,OAAO,CAAA,EAAG;AACvB,IAAA,GAAA,CAAI,aAAa,CAAA;AACjB,IAAA,GAAA,CAAI,QAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA;AAElB,IAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,EAAG,EAAE,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AACxE,IAAA,GAAA,CAAI,KAAK,QAAA,CAAS,KAAA,EAAO,EAAE,CAAC,CAAA,CAAA,EAAI,aAAa,CAAA,CAAE,CAAA;AAC/C,IAAA,GAAA,CAAI,QAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA;AAElB,IAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,MAAA,MAAM,WAAA,GAAc,MAAA,CAAO,OAAA,CACxB,GAAA,CAAI,CAAC,MAAA,KAAW;AACf,QAAA,MAAM,OAAA,GAAU,QAAA,CAAS,MAAM,CAAA,IAAK,EAAC;AACrC,QAAA,IAAI,EAAE,GAAA,IAAO,OAAA,CAAA,EAAU,OAAO,QAAA,CAAS,kBAAa,EAAE,CAAA;AACtD,QAAA,OAAO,SAASA,SAAAA,CAAS,OAAA,CAAQ,GAAG,CAAA,EAAG,EAAE,GAAG,EAAE,CAAA;AAAA,MAChD,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AAEV,MAAA,GAAA,CAAI,KAAK,QAAA,CAAS,GAAA,EAAK,EAAE,CAAC,CAAA,CAAA,EAAI,WAAW,CAAA,CAAE,CAAA;AAAA,IAC7C;AAEA,IAAA,GAAA,CAAI,QAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA;AAClB,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,OAAA,CACzB,GAAA,CAAI,CAAC,MAAA,KAAW;AACf,MAAA,MAAM,OAAA,GAAU,QAAA,CAAS,MAAM,CAAA,IAAK,EAAC;AACrC,MAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,UAAU,CAAA,CAAE,OAAO,CAAC,CAAA,KAAM,CAAA,IAAK,OAAO,CAAA,CAAE,MAAA;AAC1D,MAAA,OAAO,GAAG,MAAM,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,EAAI,WAAW,IAAI,CAAA,CAAA;AAAA,IAC/C,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AACZ,IAAA,GAAA,CAAI,CAAA,EAAA,EAAK,UAAA,CAAW,IAAI,CAAA,YAAA,EAAe,YAAY,CAAA,CAAE,CAAA;AACrD,IAAA,OAAA,CAAQ,GAAA,EAAI;AAAA,EACd;AAEA,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,MAAA,GAAS,UAAA,CAAW,IAAA;AAC9C,EAAA,SAAA,CAAU,UAAU,KAAK,CAAA,OAAA,EAAU,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,QAAA,CAAU,CAAA;AACpE;AAOA,SAASA,SAAAA,CAAS,MAAc,MAAA,EAAwB;AACtD,EAAA,IAAI,IAAA,CAAK,MAAA,IAAU,MAAA,EAAQ,OAAO,IAAA;AAClC,EAAA,OAAO,GAAG,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,MAAA,GAAS,CAAC,CAAC,CAAA,GAAA,CAAA;AACrC;AAEA,SAAS,QAAA,CAAS,MAAc,KAAA,EAAuB;AACrD,EAAA,IAAI,KAAK,MAAA,IAAU,KAAA,SAAc,IAAA,CAAK,KAAA,CAAM,GAAG,KAAK,CAAA;AACpD,EAAA,OAAO,IAAA,GAAO,GAAA,CAAI,MAAA,CAAO,KAAA,GAAQ,KAAK,MAAM,CAAA;AAC9C;AChbA,IAAM,YAAA,GAAe;AAAA,EACnB,yBAAA;AAAA,EACA,uBAAA;AAAA,EACA;AACF,CAAA;AAEA,eAAsB,UAAA,CACpB,GAAA,GAAc,OAAA,CAAQ,GAAA,EAAI,EACC;AAC3B,EAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAC/B,IAAA,MAAMC,MAAA,GAAOxB,YAAAA,CAAQ,GAAA,EAAK,IAAI,CAAA;AAC9B,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAME,iBAAAA,CAASsB,MAAA,EAAM,OAAO,CAAA;AACxC,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,MAAA,OAAO,EAAE,GAAGC,mBAAA,EAAgB,GAAG,MAAA,EAAO;AAAA,IACxC,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAGA,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAUzB,YAAAA,CAAQ,GAAA,EAAK,cAAc,CAAA;AAC3C,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,MAAME,iBAAAA,CAAS,OAAA,EAAS,OAAO,CAAC,CAAA;AACvD,IAAA,IAAI,GAAA,CAAI,aAAa,CAAA,EAAG;AACtB,MAAA,OAAO,EAAE,GAAGuB,mBAAA,EAAgB,GAAG,GAAA,CAAI,aAAa,CAAA,EAAE;AAAA,IACpD;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,OAAOA,mBAAA;AACT","file":"index.cjs","sourcesContent":["import { glob, readFile } from \"node:fs/promises\";\nimport { relative, resolve } from \"node:path\";\nimport { extract } from \"@better-intl/compiler\";\nimport type {\n BetterIntlConfig,\n ExtractedMessage,\n Messages,\n} from \"@better-intl/core\";\nimport { Box, render, Text, useApp, useInput } from \"ink\";\nimport { useEffect, useState } from \"react\";\n\n// ── Data layer ──────────────────────────────────────────────\n\nasync function resolveFiles(\n patterns: string[],\n exclude: string[],\n cwd: string,\n): Promise<string[]> {\n const files: string[] = [];\n\n for (const pattern of patterns) {\n for await (const entry of glob(pattern, { cwd })) {\n const filePath = resolve(cwd, entry);\n const rel = relative(cwd, filePath);\n\n const isExcluded = exclude.some((ex) => {\n const regex = new RegExp(\n ex.replace(/\\*\\*/g, \".*\").replace(/\\*/g, \"[^/]*\"),\n );\n return regex.test(rel);\n });\n\n if (!isExcluded) {\n files.push(filePath);\n }\n }\n }\n\n return [...new Set(files)];\n}\n\nasync function extractAllMessages(\n config: BetterIntlConfig,\n cwd: string,\n): Promise<ExtractedMessage[]> {\n const files = await resolveFiles(config.include, config.exclude, cwd);\n const allMessages: ExtractedMessage[] = [];\n\n for (const file of files) {\n const source = await readFile(file, \"utf-8\");\n const relPath = relative(cwd, file);\n allMessages.push(...extract(source, { filePath: relPath }));\n }\n\n return allMessages;\n}\n\nasync function loadAllCatalogs(\n config: BetterIntlConfig,\n cwd: string,\n): Promise<Record<string, Messages>> {\n const catalogs: Record<string, Messages> = {};\n\n for (const locale of config.locales) {\n const catalogPath = resolve(\n cwd,\n config.catalogs.replace(\"{locale}\", locale),\n );\n try {\n catalogs[locale] = JSON.parse(await readFile(catalogPath, \"utf-8\"));\n } catch {\n catalogs[locale] = {};\n }\n }\n\n return catalogs;\n}\n\ninterface ExtractedEntry {\n id: string;\n source: string;\n default: string;\n translations: Record<string, string>;\n}\n\ninterface ManualEntry {\n key: string;\n translations: Record<string, string>;\n}\n\ninterface TranslationData {\n locales: string[];\n defaultLocale: string;\n extracted: ExtractedEntry[];\n manual: ManualEntry[];\n}\n\nasync function getTranslationsData(\n config: BetterIntlConfig,\n cwd: string,\n): Promise<TranslationData> {\n const allMessages = await extractAllMessages(config, cwd);\n const catalogs = await loadAllCatalogs(config, cwd);\n const extractedIds = new Set(allMessages.map((m) => m.id));\n\n const manualKeys = new Set<string>();\n for (const messages of Object.values(catalogs)) {\n for (const key of Object.keys(messages)) {\n if (!extractedIds.has(key)) {\n manualKeys.add(key);\n }\n }\n }\n\n const extracted = allMessages.map((msg) => {\n const translations: Record<string, string> = {};\n for (const locale of config.locales) {\n if (msg.id in (catalogs[locale] ?? {})) {\n translations[locale] = catalogs[locale][msg.id];\n }\n }\n return {\n id: msg.id,\n source: `${msg.filePath}:${msg.line} <${msg.elementType}>`,\n default: msg.defaultMessage,\n translations,\n };\n });\n\n const manual = [...manualKeys].map((key) => {\n const translations: Record<string, string> = {};\n for (const locale of config.locales) {\n if (key in (catalogs[locale] ?? {})) {\n translations[locale] = catalogs[locale][key];\n }\n }\n return { key, translations };\n });\n\n return {\n locales: config.locales,\n defaultLocale: config.defaultLocale,\n extracted,\n manual,\n };\n}\n\n// ── Helpers ─────────────────────────────────────────────────\n\nfunction truncate(text: string, max: number): string {\n return text.length > max ? `${text.slice(0, max - 1)}…` : text;\n}\n\nfunction pad(text: string, width: number): string {\n return text.length >= width ? text : text + \" \".repeat(width - text.length);\n}\n\n// ── UI Components ───────────────────────────────────────────\n\nfunction Header({ data }: { data: TranslationData }) {\n const totalKeys = data.extracted.length + data.manual.length;\n\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text bold>\n better-intl <Text color=\"gray\">dashboard</Text>\n </Text>\n <Text color=\"gray\">\n {totalKeys} keys · {data.locales.length} locales ·{\" \"}\n {data.extracted.length} extracted · {data.manual.length} manual\n </Text>\n </Box>\n );\n}\n\nfunction StatusIcon({ has, isDefault }: { has: boolean; isDefault: boolean }) {\n if (isDefault) return <Text color=\"gray\">─</Text>;\n if (has) return <Text color=\"green\">✓</Text>;\n return <Text color=\"red\">✗</Text>;\n}\n\nfunction ExtractedTable({ data }: { data: TranslationData }) {\n if (data.extracted.length === 0) return null;\n\n const sourceWidth = 28;\n const defaultWidth = 22;\n\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text bold color=\"gray\">\n EXTRACTED FROM SOURCE\n </Text>\n <Box>\n <Text color=\"gray\">\n {pad(\"Source\", sourceWidth)} {pad(\"Default\", defaultWidth)}{\" \"}\n {data.locales.map((l) => pad(l, 8)).join(\"\")}\n </Text>\n </Box>\n <Text color=\"gray\">\n {\"─\".repeat(sourceWidth + defaultWidth + data.locales.length * 8 + 2)}\n </Text>\n {data.extracted.map((msg) => (\n <Box key={msg.id}>\n <Text color=\"cyan\">\n {pad(truncate(msg.source, sourceWidth), sourceWidth)}{\" \"}\n </Text>\n <Text color=\"gray\">\n {pad(truncate(msg.default, defaultWidth), defaultWidth)}{\" \"}\n </Text>\n {data.locales.map((locale) => (\n <Box key={locale} width={8}>\n <StatusIcon\n has={!!msg.translations[locale]}\n isDefault={locale === data.defaultLocale}\n />\n </Box>\n ))}\n </Box>\n ))}\n </Box>\n );\n}\n\nfunction ManualTable({ data }: { data: TranslationData }) {\n if (data.manual.length === 0) return null;\n\n const keyWidth = 32;\n\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text bold color=\"gray\">\n MANUAL KEYS\n </Text>\n <Box>\n <Text color=\"gray\">\n {pad(\"Key\", keyWidth)} {data.locales.map((l) => pad(l, 8)).join(\"\")}\n </Text>\n </Box>\n <Text color=\"gray\">\n {\"─\".repeat(keyWidth + data.locales.length * 8 + 1)}\n </Text>\n {data.manual.map((msg) => (\n <Box key={msg.key}>\n <Text color=\"magenta\">\n {pad(truncate(msg.key, keyWidth), keyWidth)}{\" \"}\n </Text>\n {data.locales.map((locale) => (\n <Box key={locale} width={8}>\n <StatusIcon has={!!msg.translations[locale]} isDefault={false} />\n </Box>\n ))}\n </Box>\n ))}\n </Box>\n );\n}\n\nfunction Coverage({ data }: { data: TranslationData }) {\n const totalKeys = data.extracted.length + data.manual.length;\n if (totalKeys === 0) return null;\n\n return (\n <Box flexDirection=\"column\">\n <Text bold color=\"gray\">\n COVERAGE\n </Text>\n {data.locales.map((locale) => {\n const isDefault = locale === data.defaultLocale;\n const translated = isDefault\n ? totalKeys\n : data.extracted.filter((m) => m.translations[locale]).length +\n data.manual.filter((m) => m.translations[locale]).length;\n const pct = Math.round((translated / totalKeys) * 100);\n\n const barWidth = 20;\n const filled = Math.round((pct / 100) * barWidth);\n const bar = \"█\".repeat(filled) + \"░\".repeat(barWidth - filled);\n\n const color = pct === 100 ? \"green\" : pct >= 50 ? \"yellow\" : \"red\";\n\n return (\n <Box key={locale} gap={1}>\n <Text>{pad(locale, 8)}</Text>\n <Text color={color}>{bar}</Text>\n <Text color={color} bold>\n {pct}%\n </Text>\n <Text color=\"gray\">\n ({translated}/{totalKeys})\n </Text>\n </Box>\n );\n })}\n </Box>\n );\n}\n\nfunction App({ config, cwd }: { config: BetterIntlConfig; cwd: string }) {\n const { exit } = useApp();\n const [data, setData] = useState<TranslationData | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n useInput((input) => {\n if (input === \"q\") exit();\n });\n\n useEffect(() => {\n getTranslationsData(config, cwd)\n .then(setData)\n .catch((err: unknown) => setError(String(err)));\n }, [config, cwd]);\n\n if (error) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text color=\"red\" bold>\n Error loading translations\n </Text>\n <Text color=\"red\">{error}</Text>\n </Box>\n );\n }\n\n if (!data) {\n return (\n <Box padding={1}>\n <Text color=\"gray\">Loading translations…</Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header data={data} />\n <ExtractedTable data={data} />\n <ManualTable data={data} />\n <Coverage data={data} />\n <Box marginTop={1}>\n <Text dimColor>Press q to exit</Text>\n </Box>\n </Box>\n );\n}\n\n// ── Entry point ─────────────────────────────────────────────\n\nexport async function devCommand(\n config: BetterIntlConfig,\n cwd: string,\n): Promise<void> {\n const instance = render(<App config={config} cwd={cwd} />);\n await instance.waitUntilExit();\n}\n","import { glob, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, relative, resolve } from \"node:path\";\nimport {\n extract,\n findDeadKeys,\n findMissingKeys,\n generateDefaultCatalog,\n mergeCatalog,\n} from \"@better-intl/compiler\";\nimport type {\n BetterIntlConfig,\n ExtractedMessage,\n Messages,\n} from \"@better-intl/core\";\n\nfunction log(msg: string) {\n console.log(` ${msg}`);\n}\n\nfunction logHeader(msg: string) {\n console.log(`\\n✦ ${msg}\\n`);\n}\n\n/**\n * Resolve glob patterns to file paths.\n */\nasync function resolveFiles(\n patterns: string[],\n exclude: string[],\n cwd: string,\n): Promise<string[]> {\n const files: string[] = [];\n\n for (const pattern of patterns) {\n for await (const entry of glob(pattern, { cwd })) {\n const filePath = resolve(cwd, entry);\n const rel = relative(cwd, filePath);\n\n const isExcluded = exclude.some((ex) => {\n const regex = new RegExp(\n ex.replace(/\\*\\*/g, \".*\").replace(/\\*/g, \"[^/]*\"),\n );\n return regex.test(rel);\n });\n\n if (!isExcluded) {\n files.push(filePath);\n }\n }\n }\n\n return [...new Set(files)];\n}\n\n/**\n * Extract messages from all source files matching config patterns.\n */\nasync function extractAllMessages(\n config: BetterIntlConfig,\n cwd: string,\n): Promise<ExtractedMessage[]> {\n const files = await resolveFiles(config.include, config.exclude, cwd);\n const allMessages: ExtractedMessage[] = [];\n\n for (const file of files) {\n const source = await readFile(file, \"utf-8\");\n const relPath = relative(cwd, file);\n allMessages.push(...extract(source, { filePath: relPath }));\n }\n\n return allMessages;\n}\n\n/**\n * Load all locale catalogs from disk.\n */\nasync function loadAllCatalogs(\n config: BetterIntlConfig,\n cwd: string,\n): Promise<Record<string, Messages>> {\n const catalogs: Record<string, Messages> = {};\n\n for (const locale of config.locales) {\n const catalogPath = resolve(\n cwd,\n config.catalogs.replace(\"{locale}\", locale),\n );\n try {\n catalogs[locale] = JSON.parse(await readFile(catalogPath, \"utf-8\"));\n } catch {\n catalogs[locale] = {};\n }\n }\n\n return catalogs;\n}\n\n/**\n * Extract all translatable messages from source files.\n */\nexport async function extractCommand(\n config: BetterIntlConfig,\n cwd: string,\n): Promise<void> {\n logHeader(\"Extracting messages...\");\n\n const allMessages = await extractAllMessages(config, cwd);\n log(`Extracted ${allMessages.length} messages`);\n\n // Generate/update catalog for each locale\n for (const locale of config.locales) {\n const catalogPath = resolve(\n cwd,\n config.catalogs.replace(\"{locale}\", locale),\n );\n\n await mkdir(dirname(catalogPath), { recursive: true });\n\n let existing: Messages = {};\n try {\n existing = JSON.parse(await readFile(catalogPath, \"utf-8\"));\n } catch {\n // New catalog\n }\n\n if (locale === config.defaultLocale) {\n const _catalog = generateDefaultCatalog(allMessages);\n const { messages, added, removed } = mergeCatalog(existing, allMessages);\n\n await writeFile(catalogPath, `${JSON.stringify(messages, null, 2)}\\n`);\n log(\n `${locale}: ${Object.keys(messages).length} keys (${added.length} added, ${removed.length} removed)`,\n );\n } else {\n const { messages, added } = mergeCatalog(existing, allMessages);\n await writeFile(catalogPath, `${JSON.stringify(messages, null, 2)}\\n`);\n log(\n `${locale}: ${Object.keys(messages).length} keys (${added.length} need translation)`,\n );\n }\n }\n\n logHeader(\"Done!\");\n}\n\n/**\n * Validate all catalogs for completeness and consistency.\n */\nexport async function validateCommand(\n config: BetterIntlConfig,\n cwd: string,\n): Promise<void> {\n logHeader(\"Validating catalogs...\");\n\n const defaultPath = resolve(\n cwd,\n config.catalogs.replace(\"{locale}\", config.defaultLocale),\n );\n\n let defaultCatalog: Messages;\n try {\n defaultCatalog = JSON.parse(await readFile(defaultPath, \"utf-8\"));\n } catch {\n console.error(` ✗ Default catalog not found: ${defaultPath}`);\n console.error(\" Run 'i18n extract' first.\");\n process.exitCode = 1;\n return;\n }\n\n let hasErrors = false;\n\n for (const locale of config.locales) {\n if (locale === config.defaultLocale) continue;\n\n const catalogPath = resolve(\n cwd,\n config.catalogs.replace(\"{locale}\", locale),\n );\n\n try {\n const catalog: Messages = JSON.parse(\n await readFile(catalogPath, \"utf-8\"),\n );\n const missing = findMissingKeys(defaultCatalog, catalog);\n\n if (missing.length > 0) {\n log(`✗ ${locale}: ${missing.length} missing keys`);\n for (const key of missing.slice(0, 5)) {\n log(` - ${key}: \"${defaultCatalog[key]}\"`);\n }\n if (missing.length > 5) {\n log(` ... and ${missing.length - 5} more`);\n }\n hasErrors = true;\n } else {\n log(`✓ ${locale}: complete`);\n }\n } catch {\n log(`✗ ${locale}: catalog not found`);\n hasErrors = true;\n }\n }\n\n if (hasErrors) {\n process.exitCode = 1;\n } else {\n logHeader(\"All catalogs valid!\");\n }\n}\n\n/**\n * Find dead keys in catalogs (keys not present in source).\n */\nexport async function deadKeysCommand(\n config: BetterIntlConfig,\n cwd: string,\n): Promise<void> {\n logHeader(\"Finding dead keys...\");\n\n const allMessages = await extractAllMessages(config, cwd);\n const catalogs = await loadAllCatalogs(config, cwd);\n\n for (const locale of config.locales) {\n const catalog = catalogs[locale];\n const dead = findDeadKeys(catalog, allMessages);\n\n if (dead.length > 0) {\n log(`${locale}: ${dead.length} dead keys`);\n for (const key of dead) {\n log(` - ${key}`);\n }\n } else {\n log(`${locale}: no dead keys`);\n }\n }\n}\n\n/**\n * Show missing translations across locales.\n */\nexport async function missingCommand(\n config: BetterIntlConfig,\n cwd: string,\n): Promise<void> {\n logHeader(\"Finding missing translations...\");\n\n const defaultPath = resolve(\n cwd,\n config.catalogs.replace(\"{locale}\", config.defaultLocale),\n );\n\n let defaultCatalog: Messages;\n try {\n defaultCatalog = JSON.parse(await readFile(defaultPath, \"utf-8\"));\n } catch {\n console.error(\" Default catalog not found. Run 'i18n extract' first.\");\n process.exitCode = 1;\n return;\n }\n\n for (const locale of config.locales) {\n if (locale === config.defaultLocale) continue;\n\n const catalogPath = resolve(\n cwd,\n config.catalogs.replace(\"{locale}\", locale),\n );\n\n try {\n const catalog: Messages = JSON.parse(\n await readFile(catalogPath, \"utf-8\"),\n );\n const missing = findMissingKeys(defaultCatalog, catalog);\n log(`${locale}: ${missing.length} missing`);\n } catch {\n log(`${locale}: catalog not found (all keys missing)`);\n }\n }\n}\n\n/**\n * Compile catalogs into optimized runtime format.\n */\nexport async function compileCommand(\n config: BetterIntlConfig,\n cwd: string,\n): Promise<void> {\n logHeader(\"Compiling catalogs...\");\n\n const outDir = resolve(cwd, \".better-intl\");\n await mkdir(outDir, { recursive: true });\n\n for (const locale of config.locales) {\n const catalogPath = resolve(\n cwd,\n config.catalogs.replace(\"{locale}\", locale),\n );\n\n try {\n const catalog: Messages = JSON.parse(\n await readFile(catalogPath, \"utf-8\"),\n );\n\n // Compile to optimized JS module\n const compiled = `export default ${JSON.stringify(catalog)};\\n`;\n const outPath = resolve(outDir, `${locale}.js`);\n await writeFile(outPath, compiled);\n log(`${locale}: ${Object.keys(catalog).length} keys → ${outPath}`);\n } catch {\n log(`${locale}: catalog not found, skipping`);\n }\n }\n\n logHeader(\"Done!\");\n}\n\n/**\n * Display translations in a human-readable table.\n */\nexport async function showCommand(\n config: BetterIntlConfig,\n cwd: string,\n): Promise<void> {\n logHeader(\"Translation Status\");\n\n const allMessages = await extractAllMessages(config, cwd);\n const catalogs = await loadAllCatalogs(config, cwd);\n\n const extractedIds = new Set(allMessages.map((m) => m.id));\n\n // Collect all manual keys (in catalogs but not extracted)\n const manualKeys = new Set<string>();\n for (const messages of Object.values(catalogs)) {\n for (const key of Object.keys(messages)) {\n if (!extractedIds.has(key)) {\n manualKeys.add(key);\n }\n }\n }\n\n // Print extracted messages table\n if (allMessages.length > 0) {\n log(\"Extracted messages (from source)\");\n log(\"─\".repeat(76));\n\n const localeHeaders = config.locales.map((l) => padRight(l, 20)).join(\"\");\n log(\n ` ${padRight(\"Source\", 28)} ${padRight(\"Default\", 22)} ${localeHeaders}`,\n );\n log(\"─\".repeat(76));\n\n for (const msg of allMessages) {\n const source = truncate(\n `${msg.filePath}:${msg.line} <${msg.elementType}>`,\n 26,\n );\n const defaultText = truncate(msg.defaultMessage, 20);\n\n const localeCells = config.locales\n .map((locale) => {\n const catalog = catalogs[locale] ?? {};\n if (!(msg.id in catalog)) return padRight(\"✗ MISSING\", 20);\n if (locale === config.defaultLocale) return padRight(\"✓\", 20);\n const val = catalog[msg.id];\n if (val === msg.defaultMessage) return padRight(\"~ untranslated\", 20);\n return padRight(`✓ ${truncate(val, 16)}`, 20);\n })\n .join(\"\");\n\n log(\n ` ${padRight(source, 28)} ${padRight(defaultText, 22)} ${localeCells}`,\n );\n }\n\n log(\"─\".repeat(76));\n const extractedCounts = config.locales\n .map((locale) => {\n const catalog = catalogs[locale] ?? {};\n const found = allMessages.filter((m) => m.id in catalog).length;\n return `${locale}: ${found}/${allMessages.length}`;\n })\n .join(\" \");\n log(` ${allMessages.length} extracted | ${extractedCounts}`);\n console.log();\n }\n\n // Print manual keys table\n if (manualKeys.size > 0) {\n log(\"Manual keys\");\n log(\"─\".repeat(76));\n\n const localeHeaders = config.locales.map((l) => padRight(l, 24)).join(\"\");\n log(` ${padRight(\"Key\", 24)} ${localeHeaders}`);\n log(\"─\".repeat(76));\n\n for (const key of manualKeys) {\n const localeCells = config.locales\n .map((locale) => {\n const catalog = catalogs[locale] ?? {};\n if (!(key in catalog)) return padRight(\"✗ MISSING\", 24);\n return padRight(truncate(catalog[key], 22), 24);\n })\n .join(\"\");\n\n log(` ${padRight(key, 24)} ${localeCells}`);\n }\n\n log(\"─\".repeat(76));\n const manualCounts = config.locales\n .map((locale) => {\n const catalog = catalogs[locale] ?? {};\n const found = [...manualKeys].filter((k) => k in catalog).length;\n return `${locale}: ${found}/${manualKeys.size}`;\n })\n .join(\" \");\n log(` ${manualKeys.size} manual | ${manualCounts}`);\n console.log();\n }\n\n const total = allMessages.length + manualKeys.size;\n logHeader(`Total: ${total} keys, ${config.locales.length} locales`);\n}\n\n/**\n * Start the translation dashboard dev server.\n */\nexport { devCommand } from \"./dashboard.js\";\n\nfunction truncate(text: string, maxLen: number): string {\n if (text.length <= maxLen) return text;\n return `${text.slice(0, maxLen - 3)}...`;\n}\n\nfunction padRight(text: string, width: number): string {\n if (text.length >= width) return text.slice(0, width);\n return text + \" \".repeat(width - text.length);\n}\n","import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { type BetterIntlConfig, DEFAULT_CONFIG } from \"@better-intl/core\";\n\nconst CONFIG_FILES = [\n \"better-intl.config.json\",\n \"better-intl.config.js\",\n \".better-intlrc.json\",\n];\n\nexport async function loadConfig(\n cwd: string = process.cwd(),\n): Promise<BetterIntlConfig> {\n for (const file of CONFIG_FILES) {\n const path = resolve(cwd, file);\n try {\n const raw = await readFile(path, \"utf-8\");\n const parsed = JSON.parse(raw) as Partial<BetterIntlConfig>;\n return { ...DEFAULT_CONFIG, ...parsed };\n } catch {\n // Try next config file\n }\n }\n\n // Check package.json for \"better-intl\" key\n try {\n const pkgPath = resolve(cwd, \"package.json\");\n const pkg = JSON.parse(await readFile(pkgPath, \"utf-8\"));\n if (pkg[\"better-intl\"]) {\n return { ...DEFAULT_CONFIG, ...pkg[\"better-intl\"] };\n }\n } catch {\n // No config found\n }\n\n return DEFAULT_CONFIG;\n}\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { BetterIntlConfig } from '@better-intl/core';
|
|
2
|
+
|
|
3
|
+
declare function devCommand(config: BetterIntlConfig, cwd: string): Promise<void>;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Extract all translatable messages from source files.
|
|
7
|
+
*/
|
|
8
|
+
declare function extractCommand(config: BetterIntlConfig, cwd: string): Promise<void>;
|
|
9
|
+
/**
|
|
10
|
+
* Validate all catalogs for completeness and consistency.
|
|
11
|
+
*/
|
|
12
|
+
declare function validateCommand(config: BetterIntlConfig, cwd: string): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Find dead keys in catalogs (keys not present in source).
|
|
15
|
+
*/
|
|
16
|
+
declare function deadKeysCommand(config: BetterIntlConfig, cwd: string): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Show missing translations across locales.
|
|
19
|
+
*/
|
|
20
|
+
declare function missingCommand(config: BetterIntlConfig, cwd: string): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Compile catalogs into optimized runtime format.
|
|
23
|
+
*/
|
|
24
|
+
declare function compileCommand(config: BetterIntlConfig, cwd: string): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Display translations in a human-readable table.
|
|
27
|
+
*/
|
|
28
|
+
declare function showCommand(config: BetterIntlConfig, cwd: string): Promise<void>;
|
|
29
|
+
|
|
30
|
+
declare function loadConfig(cwd?: string): Promise<BetterIntlConfig>;
|
|
31
|
+
|
|
32
|
+
export { compileCommand, deadKeysCommand, devCommand, extractCommand, loadConfig, missingCommand, showCommand, validateCommand };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { BetterIntlConfig } from '@better-intl/core';
|
|
2
|
+
|
|
3
|
+
declare function devCommand(config: BetterIntlConfig, cwd: string): Promise<void>;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Extract all translatable messages from source files.
|
|
7
|
+
*/
|
|
8
|
+
declare function extractCommand(config: BetterIntlConfig, cwd: string): Promise<void>;
|
|
9
|
+
/**
|
|
10
|
+
* Validate all catalogs for completeness and consistency.
|
|
11
|
+
*/
|
|
12
|
+
declare function validateCommand(config: BetterIntlConfig, cwd: string): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Find dead keys in catalogs (keys not present in source).
|
|
15
|
+
*/
|
|
16
|
+
declare function deadKeysCommand(config: BetterIntlConfig, cwd: string): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Show missing translations across locales.
|
|
19
|
+
*/
|
|
20
|
+
declare function missingCommand(config: BetterIntlConfig, cwd: string): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Compile catalogs into optimized runtime format.
|
|
23
|
+
*/
|
|
24
|
+
declare function compileCommand(config: BetterIntlConfig, cwd: string): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Display translations in a human-readable table.
|
|
27
|
+
*/
|
|
28
|
+
declare function showCommand(config: BetterIntlConfig, cwd: string): Promise<void>;
|
|
29
|
+
|
|
30
|
+
declare function loadConfig(cwd?: string): Promise<BetterIntlConfig>;
|
|
31
|
+
|
|
32
|
+
export { compileCommand, deadKeysCommand, devCommand, extractCommand, loadConfig, missingCommand, showCommand, validateCommand };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|
package/package.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@better-intl/cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "CLI for better-intl — extract, validate, compile translations",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"better-intl": "./dist/bin.js",
|
|
8
|
+
"i18n": "./dist/bin.js"
|
|
9
|
+
},
|
|
10
|
+
"main": "./dist/index.cjs",
|
|
11
|
+
"module": "./dist/index.js",
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"exports": {
|
|
14
|
+
".": {
|
|
15
|
+
"import": "./dist/index.js",
|
|
16
|
+
"require": "./dist/index.cjs",
|
|
17
|
+
"types": "./dist/index.d.ts"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"dist"
|
|
22
|
+
],
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"ink": "^7.0.0",
|
|
25
|
+
"react": "^19.0.0",
|
|
26
|
+
"@better-intl/core": "0.1.0",
|
|
27
|
+
"@better-intl/compiler": "0.1.0"
|
|
28
|
+
},
|
|
29
|
+
"sideEffects": false,
|
|
30
|
+
"license": "MIT",
|
|
31
|
+
"scripts": {
|
|
32
|
+
"build": "tsup",
|
|
33
|
+
"dev": "tsup --watch"
|
|
34
|
+
}
|
|
35
|
+
}
|