@scoutello/i18n-magic 0.19.0 → 0.20.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.
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":";;;;;;AA6BA,8DAEC;AA/BD,0DAA4B;AAC5B,qDAAwC;AACxC,sDAAwB;AACxB,0DAA4B;AAE5B,sDAA6B;AAC7B,yCAAsC;AAG/B,MAAM,UAAU,GAAG,CAAC,EACzB,UAAU,GAAG,eAAe,GACL,EAAE,EAAE;IAC3B,MAAM,QAAQ,GAAG,mBAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAA;IAErD,IAAI,CAAC,iBAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,QAAQ,CAAC,CAAA;QACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;QAChC,4BAA4B;QAC5B,OAAO,MAAM,CAAA;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAA;QACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC,CAAA;AAlBY,QAAA,UAAU,cAkBtB;AAED,SAAgB,yBAAyB,CAAI,GAAQ;IACnD,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,CAAA;AACjE,CAAC;AAEM,MAAM,YAAY,GAAG,KAAK,EAAE,EACjC,aAAa,EACb,OAAO,EACP,MAAM,EACN,MAAM,EACN,cAAc,EACd,KAAK,GAQN,EAAE,EAAE;IACH,uCAAuC;IACvC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IACtC,MAAM,MAAM,GAA8B,EAAE,CAAA;IAE5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAA;IACxC,CAAC;IAED,IAAI,MAAM,GAA2B,EAAE,CAAA;IAEvC,MAAM,aAAa,GAAG,oBAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,aAAa,CAAC,CAAA;IACtE,MAAM,cAAc,GAAG,oBAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,cAAc,CAAC,CAAA;IAExE,MAAM,KAAK,GAAG,aAAa,EAAE,KAAK,IAAI,aAAa,CAAA;IACnD,MAAM,MAAM,GAAG,cAAc,EAAE,KAAK,IAAI,cAAc,CAAA;IAEtD,uBAAuB;IACvB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;QAC7C,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;YAC1D,KAAK;YACL,QAAQ,EAAE;gBACR;oBACE,OAAO,EAAE,+DACP,OAAO;wBACL,CAAC,CAAC,+FAA+F,OAAO,MAAM;wBAC9G,CAAC,CAAC,EACN,8oBAA8oB;oBAC9oB,IAAI,EAAE,QAAQ;iBACf;gBACD;oBACE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;wBACtB,aAAa,EAAE,KAAK;wBACpB,cAAc,EAAE,MAAM;wBACtB,IAAI,EAAE,WAAW;qBAClB,CAAC;oBACF,IAAI,EAAE,MAAM;iBACb;aACF;YACD,eAAe,EAAE;gBACf,IAAI,EAAE,aAAa;aACpB;SACF,CAAC,CAAA;QAEF,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAChC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACZ,CAAA;QAE3B,qCAAqC;QACrC,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,GAAG,eAAe,EAAE,CAAA;QAE1C,oEAAoE;QACpE,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;IAC1D,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAvEY,QAAA,YAAY,gBAuExB;AAEM,MAAM,eAAe,GAAG,KAAK,EAClC,QAE4E,EAC5E,MAAc,EACd,SAAiB,EACjB,EAAE;IACF,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,YAAY,GAAG,QAAQ;aAC1B,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;aAC1B,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;QAE/B,MAAM,OAAO,GAAG,iBAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;QACtD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YAChC,OAAO,IAA8B,CAAA;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,gBAAgB,CACxB,mCAAmC,MAAM,IAAI,SAAS,WAAW,YAAY,EAAE,EAC/E,MAAM,EACN,SAAS,EACT,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAC3C,CAAA;QACH,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;AACpC,CAAC,CAAA;AA3BY,QAAA,eAAe,mBA2B3B;AAEM,MAAM,gBAAgB,GAAG,KAAK,EACnC,QAMuB,EACvB,MAAc,EACd,SAAiB,EACjB,IAA4B,EAC5B,EAAE;IACF,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,gBAAgB,GAAG,QAAQ;aAC9B,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;aAC1B,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;QAE/B,iBAAE,CAAC,aAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QAEjE,OAAM;IACR,CAAC;IAED,MAAM,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,CAAA;AACzC,CAAC,CAAA;AAvBY,QAAA,gBAAgB,oBAuB5B;AAEM,MAAM,UAAU,GAAG,CACxB,GAAW,EACX,SAAkB,EAClB,SAAmB,EACnB,EAAE;IACF,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAE/B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,GAAG,CAAA;QACZ,CAAC;QAED,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAA;IACpB,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AApBY,QAAA,UAAU,cAoBtB;AAED;;GAEG;AACI,MAAM,mBAAmB,GAAG,CACjC,YAA4C,EAClC,EAAE;IACZ,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAClC,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACxD,CAAA;AACH,CAAC,CAAA;AANY,QAAA,mBAAmB,uBAM/B;AAED;;GAEG;AACI,MAAM,oBAAoB,GAAG,CAClC,QAAgB,EAChB,YAAoE,EACpE,gBAAwB,EACd,EAAE;IACZ,MAAM,kBAAkB,GAAa,EAAE,CAAA;IAEvC,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;QACnC,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,kEAAkE;YAClE,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAA;YACnC,yFAAyF;YACzF,IAAI,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;gBACxE,kBAAkB,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;YAChD,CAAC;QACH,CAAC;IACH,CAAC;IAED,yDAAyD;IACzD,OAAO,kBAAkB,CAAC,MAAM,GAAG,CAAC;QAClC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAA;AACxB,CAAC,CAAA;AAtBY,QAAA,oBAAoB,wBAsBhC;AAED;;GAEG;AACI,MAAM,2BAA2B,GAAG,CACzC,SAAiB,EACjB,YAAoE,EAC1D,EAAE;IACZ,MAAM,QAAQ,GAAa,EAAE,CAAA;IAE7B,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;QACnC,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,0CAA0C;YAC1C,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACxB,CAAC;aAAM,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAClD,qDAAqD;YACrD,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QAChC,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAjBY,QAAA,2BAA2B,+BAiBvC;AAED;;GAEG;AACI,MAAM,qBAAqB,GAAG,KAAK,EAAE,EAC1C,YAAY,EACZ,gBAAgB,GACyC,EAAE,EAAE;IAC7D,MAAM,MAAM,GAAG,IAAI,wBAAM,CAAC;QACxB,WAAW,EAAE,KAAK;QAClB,YAAY,EAAE,KAAK;KACpB,CAAC,CAAA;IAEF,MAAM,WAAW,GAAG,IAAA,2BAAmB,EAAC,YAAY,CAAC,CAAA;IACrD,MAAM,KAAK,GAAG,MAAM,IAAA,mBAAI,EAAC,CAAC,GAAG,WAAW,EAAE,qBAAqB,CAAC,CAAC,CAAA;IAEjE,MAAM,kBAAkB,GAInB,EAAE,CAAA;IAEP,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,iBAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAC9C,MAAM,QAAQ,GAAa,EAAE,CAAA;QAE7B,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAW,EAAE,EAAE;YACnE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACpB,CAAC,CAAC,CAAA;QAEF,+BAA+B;QAC/B,MAAM,cAAc,GAAG,IAAA,4BAAoB,EACzC,IAAI,EACJ,YAAY,EACZ,gBAAgB,CACjB,CAAA;QAED,8CAA8C;QAC9C,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,kBAAkB,CAAC,IAAI,CAAC;gBACtB,GAAG;gBACH,UAAU,EAAE,cAAc;gBAC1B,IAAI;aACL,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,OAAO,kBAAkB,CAAA;AAC3B,CAAC,CAAA;AA5CY,QAAA,qBAAqB,yBA4CjC;AAEM,MAAM,cAAc,GAAG,KAAK,EAAE,EACnC,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,QAAQ,GACM,EAAE,EAAE;IAClB,MAAM,kBAAkB,GAAG,MAAM,IAAA,6BAAqB,EAAC;QACrD,YAAY;QACZ,gBAAgB;KACjB,CAAC,CAAA;IACF,MAAM,OAAO,GAAG,EAAE,CAAA;IAElB,0BAA0B;IAC1B,MAAM,eAAe,GAAgC,EAAE,CAAA;IAEvD,KAAK,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,aAAa,EAAE,IAAI,kBAAkB,EAAE,CAAC;QACpE,KAAK,MAAM,SAAS,IAAI,aAAa,EAAE,CAAC;YACtC,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE,CAAC;gBAChC,eAAe,CAAC,SAAS,CAAC,GAAG,IAAI,GAAG,EAAE,CAAA;YACxC,CAAC;YAED,MAAM,OAAO,GAAG,IAAA,kBAAU,EAAC,GAAG,EAAE,SAAS,EAAE,SAAS,KAAK,gBAAgB,CAAC,CAAA;YAC1E,IAAI,OAAO,EAAE,CAAC;gBACZ,eAAe,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YACzC,CAAC;QACH,CAAC;IACH,CAAC;IAED,2CAA2C;IAC3C,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,YAAY,GAAG,MAAM,IAAA,uBAAe,EACxC,QAAQ,EACR,aAAa,EACb,SAAS,CACV,CAAA;QAED,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,kBAAkB,EAAE,SAAS,CAAC,CAAA;QAE5E,MAAM,gBAAgB,GAAG,eAAe,CAAC,SAAS,CAAC,IAAI,IAAI,GAAG,EAAE,CAAA;QAEhE,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;YACnC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvB,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAA;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAjDY,QAAA,cAAc,kBAiD1B;AAEM,MAAM,YAAY,GAAG,KAAK,EAAE,MAAc,EAAE,EAAE;IACnD,MAAM,KAAK,GAAG,MAAM,IAAA,iBAAO,EAAC;QAC1B,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,MAAM;QACf,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjB,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAClB,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE;oBACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBACjB,CAAC,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;KACF,CAAC,CAAA;IAEF,OAAO,KAAK,CAAC,KAAe,CAAA;AAC9B,CAAC,CAAA;AAfY,QAAA,YAAY,gBAexB;AAEM,MAAM,iBAAiB,GAAG,KAAK,EAAE,EACtC,UAAU,EACV,aAAa,EACb,QAAQ,EACR,OAAO,EACP,OAAO,EACP,MAAM,EACN,QAAQ,EACR,kBAAkB,EAClB,KAAK,GACS,EAAE,EAAE;IAClB,IAAI,kBAAkB,EAAE,CAAC;QACvB,OAAM;IACR,CAAC;IAED,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,iBAAiB,GAAG,MAAM,IAAA,uBAAe,EAC7C,QAAQ,EACR,aAAa,EACb,SAAS,CACV,CAAA;QAED,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,MAAM,KAAK,aAAa;gBAAE,SAAQ;YAEtC,MAAM,UAAU,GAAG,MAAM,IAAA,uBAAe,EAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,CAAA;YACrE,MAAM,WAAW,GAA2B,EAAE,CAAA;YAE9C,qEAAqE;YACrE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBAC7D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBACrB,WAAW,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;gBAC1B,CAAC;YACH,CAAC;YAED,4CAA4C;YAC5C,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxC,OAAO,CAAC,GAAG,CACT,SAAS,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,oBAAoB,MAAM,gBAAgB,SAAS,GAAG,CAC/F,CAAA;gBAED,MAAM,gBAAgB,GAAG,MAAM,IAAA,oBAAY,EAAC;oBAC1C,aAAa,EAAE,aAAa;oBAC5B,cAAc,EAAE,MAAM;oBACtB,OAAO;oBACP,MAAM,EAAE,WAAW;oBACnB,MAAM;oBACN,KAAK;iBACN,CAAC,CAAA;gBAEF,6CAA6C;gBAC7C,MAAM,iBAAiB,GAAG;oBACxB,GAAG,UAAU;oBACb,GAAG,gBAAgB;iBACpB,CAAA;gBAED,gCAAgC;gBAChC,IAAA,wBAAgB,EAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAAA;gBAChE,OAAO,CAAC,GAAG,CACT,2CAA2C,MAAM,gBAAgB,SAAS,GAAG,CAC9E,CAAA;YACH,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC,CAAA;AAhEY,QAAA,iBAAiB,qBAgE7B;AAED,MAAa,gBAAiB,SAAQ,KAAK;IACzC,YACE,OAAe,EACR,MAAe,EACf,SAAkB,EAClB,KAAa;QAEpB,KAAK,CAAC,OAAO,CAAC,CAAA;QAJP,WAAM,GAAN,MAAM,CAAS;QACf,cAAS,GAAT,SAAS,CAAS;QAClB,UAAK,GAAL,KAAK,CAAQ;QAGpB,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAA;IAChC,CAAC;CACF;AAVD,4CAUC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scoutello/i18n-magic",
3
- "version": "0.19.0",
3
+ "version": "0.20.0",
4
4
  "private": false,
5
5
  "license": "MIT",
6
6
  "description": "Intelligent CLI toolkit that automates internationalization workflows with AI-powered translations for JavaScript/TypeScript projects",
package/src/cli.ts CHANGED
@@ -3,7 +3,7 @@ import dotenv from "dotenv"
3
3
  import OpenAI from "openai"
4
4
  import { checkMissing } from "./commands/check-missing"
5
5
  import { removeUnusedKeys } from "./commands/clean"
6
- import { createPrunedNamespace } from "./commands/create-pruned-namespace"
6
+
7
7
  import { replaceTranslation } from "./commands/replace"
8
8
  import { translateMissing } from "./commands/scan"
9
9
  import { syncLocales } from "./commands/sync-locales"
@@ -52,11 +52,6 @@ const commands: CommandType[] = [
52
52
  "Remove unused translations from all locales. Useful for a CI/CD pipeline or husky hook.",
53
53
  action: removeUnusedKeys,
54
54
  },
55
- {
56
- name: "prune",
57
- description: "Create a pruned namespace from the other namespaces.",
58
- action: createPrunedNamespace,
59
- },
60
55
  ]
61
56
 
62
57
  for (const command of commands) {
@@ -1,11 +1,8 @@
1
- import glob from "fast-glob"
2
- import { Parser } from "i18next-scanner"
3
- import fs from "node:fs"
4
1
  import type { Configuration } from "../lib/types"
5
2
  import {
3
+ getKeysWithNamespaces,
6
4
  getPureKey,
7
5
  loadLocalesFile,
8
- removeDuplicatesFromArray,
9
6
  writeLocalesFile,
10
7
  } from "../lib/utils"
11
8
 
@@ -19,47 +16,37 @@ export const removeUnusedKeys = async (config: Configuration) => {
19
16
  savePath,
20
17
  } = config
21
18
 
22
- // Set up the parser
23
- const parser = new Parser({
24
- nsSeparator: false,
25
- keySeparator: false,
19
+ // Get all keys with their associated namespaces from the codebase
20
+ const keysWithNamespaces = await getKeysWithNamespaces({
21
+ globPatterns,
22
+ defaultNamespace,
26
23
  })
27
24
 
28
- // Find all files to scan
29
- const allPatterns = globPatterns.map((pattern) =>
30
- typeof pattern === "string" ? pattern : pattern.pattern,
31
- )
32
- const files = await glob([...allPatterns, "!**/node_modules/**"])
33
-
34
- // Extract all translation keys from the codebase
35
- const extractedKeys = []
36
- for (const file of files) {
37
- const content = fs.readFileSync(file, "utf-8")
38
- parser.parseFuncFromString(content, { list: ["t"] }, (key: string) => {
39
- extractedKeys.push(key)
40
- })
41
- }
42
-
43
- // Remove duplicates
44
- const uniqueExtractedKeys = removeDuplicatesFromArray(extractedKeys)
45
-
46
25
  // Track stats for reporting
47
26
  const stats = {
48
27
  total: 0,
49
28
  removed: 0,
50
29
  }
51
30
 
52
- // Process each namespace and locale
53
- for (const namespace of namespaces) {
54
- // Build a set of pure keys that are actually used in the codebase for this namespace
55
- const usedKeysSet = new Set<string>()
31
+ // Group keys by namespace
32
+ const keysByNamespace: Record<string, Set<string>> = {}
33
+
34
+ for (const { key, namespaces: keyNamespaces } of keysWithNamespaces) {
35
+ for (const namespace of keyNamespaces) {
36
+ if (!keysByNamespace[namespace]) {
37
+ keysByNamespace[namespace] = new Set()
38
+ }
56
39
 
57
- for (const key of uniqueExtractedKeys) {
58
40
  const pureKey = getPureKey(key, namespace, namespace === defaultNamespace)
59
41
  if (pureKey) {
60
- usedKeysSet.add(pureKey)
42
+ keysByNamespace[namespace].add(pureKey)
61
43
  }
62
44
  }
45
+ }
46
+
47
+ // Process each namespace and locale
48
+ for (const namespace of namespaces) {
49
+ const usedKeysSet = keysByNamespace[namespace] || new Set()
63
50
 
64
51
  // Process each locale
65
52
  for (const locale of locales) {
@@ -1,23 +1,30 @@
1
1
  import type { Configuration } from "../lib/types"
2
2
  import {
3
+ getKeysWithNamespaces,
4
+ getPureKey,
3
5
  getTextInput,
4
6
  loadLocalesFile,
5
7
  translateKey,
6
8
  writeLocalesFile,
7
9
  } from "../lib/utils"
8
10
 
9
- const getKeyToReplace = async (keys: Record<string, string>) => {
11
+ const getKeyToReplace = async (
12
+ allAvailableKeys: Record<string, { namespace: string; value: string }[]>,
13
+ ): Promise<{ key: string; namespaces: string[] }> => {
10
14
  const keyToReplace = await getTextInput(
11
15
  "Enter the key to replace the translation for: ",
12
16
  )
13
17
 
14
- if (!keys[keyToReplace]) {
18
+ if (!allAvailableKeys[keyToReplace]) {
15
19
  console.log(`The key "${keyToReplace}" does not exist.`)
16
- return await getKeyToReplace(keys)
20
+ return await getKeyToReplace(allAvailableKeys)
17
21
  }
18
22
 
19
- console.log(`The key "${keyToReplace}" exists.`)
20
- return keyToReplace
23
+ const namespaces = allAvailableKeys[keyToReplace].map((k) => k.namespace)
24
+ console.log(
25
+ `The key "${keyToReplace}" exists in namespaces: ${namespaces.join(", ")}.`,
26
+ )
27
+ return { key: keyToReplace, namespaces }
21
28
  }
22
29
 
23
30
  export const replaceTranslation = async (
@@ -36,63 +43,107 @@ export const replaceTranslation = async (
36
43
  openai,
37
44
  } = config
38
45
 
39
- const keys = await loadLocalesFile(
40
- config.loadPath,
41
- config.defaultLocale,
42
- config.defaultNamespace,
43
- )
46
+ // Find all keys with their namespaces from the codebase
47
+ const keysWithNamespaces = await getKeysWithNamespaces({
48
+ globPatterns,
49
+ defaultNamespace,
50
+ })
51
+
52
+ // Build a map of all available keys across all namespaces
53
+ const allAvailableKeys: Record<
54
+ string,
55
+ { namespace: string; value: string }[]
56
+ > = {}
57
+
58
+ for (const namespace of namespaces) {
59
+ const keys = await loadLocalesFile(loadPath, defaultLocale, namespace)
60
+ for (const [keyName, value] of Object.entries(keys)) {
61
+ if (!allAvailableKeys[keyName]) {
62
+ allAvailableKeys[keyName] = []
63
+ }
64
+ allAvailableKeys[keyName].push({ namespace, value })
65
+ }
66
+ }
44
67
 
45
68
  let keyToReplace: string
69
+ let targetNamespaces: string[] = []
46
70
 
47
71
  if (key) {
48
- if (keys[key]) {
72
+ if (allAvailableKeys[key]) {
49
73
  keyToReplace = key
50
- console.log(`The key "${keyToReplace}" exists.`)
74
+ // Determine which namespaces this key should be updated in based on usage
75
+ const keyUsage = keysWithNamespaces.filter((k) => {
76
+ const pureKey = getPureKey(k.key, defaultNamespace, true)
77
+ return pureKey === key || k.key === key
78
+ })
79
+
80
+ if (keyUsage.length > 0) {
81
+ // Use namespaces from actual usage
82
+ const allNamespaces: string[] = []
83
+ for (const k of keyUsage) {
84
+ allNamespaces.push(...k.namespaces)
85
+ }
86
+ targetNamespaces = [...new Set(allNamespaces)]
87
+ } else {
88
+ // Fallback to all namespaces where the key exists
89
+ targetNamespaces = allAvailableKeys[key].map((k) => k.namespace)
90
+ }
91
+
92
+ console.log(
93
+ `The key "${keyToReplace}" exists in namespaces: ${targetNamespaces.join(", ")}.`,
94
+ )
51
95
  } else {
52
96
  console.log(`The key "${key}" does not exist.`)
53
- keyToReplace = await getKeyToReplace(keys)
97
+ const result = await getKeyToReplace(allAvailableKeys)
98
+ keyToReplace = result.key
99
+ targetNamespaces = result.namespaces
54
100
  }
55
101
  } else {
56
- keyToReplace = await getKeyToReplace(keys)
102
+ const result = await getKeyToReplace(allAvailableKeys)
103
+ keyToReplace = result.key
104
+ targetNamespaces = result.namespaces
57
105
  }
58
106
 
59
- console.log(
60
- `The current translation in ${defaultLocale} for "${keyToReplace}" is "${keys[keyToReplace]}".`,
61
- )
107
+ // Show current translations across namespaces
108
+ for (const namespace of targetNamespaces) {
109
+ const keys = await loadLocalesFile(loadPath, defaultLocale, namespace)
110
+ if (keys[keyToReplace]) {
111
+ console.log(
112
+ `Current translation in ${defaultLocale} (${namespace}): "${keys[keyToReplace]}"`,
113
+ )
114
+ }
115
+ }
62
116
 
63
117
  const newTranslation = await getTextInput("Enter the new translation: ")
64
118
 
65
- for (const locale of locales) {
66
- let newValue = ""
67
- if (locale === defaultLocale) {
68
- newValue = newTranslation
69
- } else {
70
- const translation = await translateKey({
71
- context,
72
- inputLanguage: defaultLocale,
73
- outputLanguage: locale,
74
- object: {
75
- [keyToReplace]: newTranslation,
76
- },
77
- openai,
78
- model: config.model,
79
- })
80
-
81
- newValue = translation[keyToReplace]
82
- }
119
+ // Update the key in all relevant namespaces and locales
120
+ for (const namespace of targetNamespaces) {
121
+ for (const locale of locales) {
122
+ let newValue = ""
123
+ if (locale === defaultLocale) {
124
+ newValue = newTranslation
125
+ } else {
126
+ const translation = await translateKey({
127
+ context,
128
+ inputLanguage: defaultLocale,
129
+ outputLanguage: locale,
130
+ object: {
131
+ [keyToReplace]: newTranslation,
132
+ },
133
+ openai,
134
+ model: config.model,
135
+ })
83
136
 
84
- const existingKeys = await loadLocalesFile(
85
- loadPath,
86
- locale,
87
- defaultNamespace,
88
- )
137
+ newValue = translation[keyToReplace]
138
+ }
89
139
 
90
- existingKeys[keyToReplace] = newValue
140
+ const existingKeys = await loadLocalesFile(loadPath, locale, namespace)
141
+ existingKeys[keyToReplace] = newValue
142
+ await writeLocalesFile(savePath, locale, namespace, existingKeys)
91
143
 
92
- writeLocalesFile(savePath, locale, defaultNamespace, existingKeys)
93
-
94
- console.log(
95
- `The new translation for "${keyToReplace}" in ${locale} is "${newValue}".`,
96
- )
144
+ console.log(
145
+ `Updated "${keyToReplace}" in ${locale} (${namespace}): "${newValue}"`,
146
+ )
147
+ }
97
148
  }
98
149
  }
package/src/index.ts CHANGED
@@ -1,8 +1,7 @@
1
1
  // Export command functions for programmatic usage
2
2
  export { checkMissing } from "./commands/check-missing"
3
3
  export { removeUnusedKeys } from "./commands/clean"
4
- export { createPrunedNamespace } from "./commands/create-pruned-namespace"
5
- export { createPrunedNamespaceAutomated } from "./commands/create-pruned-namespace-automated"
4
+
6
5
  export { replaceTranslation } from "./commands/replace"
7
6
  export { translateMissing } from "./commands/scan"
8
7
  export { syncLocales } from "./commands/sync-locales"
@@ -11,11 +10,7 @@ export { syncLocales } from "./commands/sync-locales"
11
10
  export { loadConfig } from "./lib/utils"
12
11
 
13
12
  // Export types
14
- export type {
15
- PruneOptions,
16
- PruneResponse,
17
- PruneResult,
18
- } from "./commands/create-pruned-namespace-automated"
13
+
19
14
  export type {
20
15
  CommandType,
21
16
  Configuration,
package/src/lib/utils.ts CHANGED
@@ -5,7 +5,7 @@ import path from "node:path"
5
5
  import type OpenAI from "openai"
6
6
  import prompts from "prompts"
7
7
  import { languages } from "./languges"
8
- import type { GlobPatternConfig, Configuration } from "./types"
8
+ import type { Configuration, GlobPatternConfig } from "./types"
9
9
 
10
10
  export const loadConfig = ({
11
11
  configPath = "i18n-magic.js",
@@ -197,6 +197,7 @@ export const extractGlobPatterns = (
197
197
  export const getNamespacesForFile = (
198
198
  filePath: string,
199
199
  globPatterns: (string | { pattern: string; namespaces: string[] })[],
200
+ defaultNamespace: string,
200
201
  ): string[] => {
201
202
  const matchingNamespaces: string[] = []
202
203
 
@@ -211,7 +212,10 @@ export const getNamespacesForFile = (
211
212
  }
212
213
  }
213
214
 
214
- return [...new Set(matchingNamespaces)] // Remove duplicates
215
+ // If no specific namespaces found, use default namespace
216
+ return matchingNamespaces.length > 0
217
+ ? [...new Set(matchingNamespaces)]
218
+ : [defaultNamespace]
215
219
  }
216
220
 
217
221
  /**
@@ -236,13 +240,13 @@ export const getGlobPatternsForNamespace = (
236
240
  return patterns
237
241
  }
238
242
 
239
- export const getMissingKeys = async ({
243
+ /**
244
+ * Extracts keys with their associated namespaces based on the files they're found in
245
+ */
246
+ export const getKeysWithNamespaces = async ({
240
247
  globPatterns,
241
- namespaces,
242
248
  defaultNamespace,
243
- defaultLocale,
244
- loadPath,
245
- }: Configuration) => {
249
+ }: Pick<Configuration, "globPatterns" | "defaultNamespace">) => {
246
250
  const parser = new Parser({
247
251
  nsSeparator: false,
248
252
  keySeparator: false,
@@ -251,19 +255,70 @@ export const getMissingKeys = async ({
251
255
  const allPatterns = extractGlobPatterns(globPatterns)
252
256
  const files = await glob([...allPatterns, "!**/node_modules/**"])
253
257
 
254
- const keys = []
258
+ const keysWithNamespaces: Array<{
259
+ key: string
260
+ namespaces: string[]
261
+ file: string
262
+ }> = []
255
263
 
256
264
  for (const file of files) {
257
265
  const content = fs.readFileSync(file, "utf-8")
266
+ const fileKeys: string[] = []
267
+
258
268
  parser.parseFuncFromString(content, { list: ["t"] }, (key: string) => {
259
- keys.push(key)
269
+ fileKeys.push(key)
260
270
  })
271
+
272
+ // Get namespaces for this file
273
+ const fileNamespaces = getNamespacesForFile(
274
+ file,
275
+ globPatterns,
276
+ defaultNamespace,
277
+ )
278
+
279
+ // Add each key with its associated namespaces
280
+ for (const key of fileKeys) {
281
+ keysWithNamespaces.push({
282
+ key,
283
+ namespaces: fileNamespaces,
284
+ file,
285
+ })
286
+ }
261
287
  }
262
288
 
263
- const uniqueKeys = removeDuplicatesFromArray(keys)
289
+ return keysWithNamespaces
290
+ }
264
291
 
292
+ export const getMissingKeys = async ({
293
+ globPatterns,
294
+ namespaces,
295
+ defaultNamespace,
296
+ defaultLocale,
297
+ loadPath,
298
+ }: Configuration) => {
299
+ const keysWithNamespaces = await getKeysWithNamespaces({
300
+ globPatterns,
301
+ defaultNamespace,
302
+ })
265
303
  const newKeys = []
266
304
 
305
+ // Group keys by namespace
306
+ const keysByNamespace: Record<string, Set<string>> = {}
307
+
308
+ for (const { key, namespaces: keyNamespaces } of keysWithNamespaces) {
309
+ for (const namespace of keyNamespaces) {
310
+ if (!keysByNamespace[namespace]) {
311
+ keysByNamespace[namespace] = new Set()
312
+ }
313
+
314
+ const pureKey = getPureKey(key, namespace, namespace === defaultNamespace)
315
+ if (pureKey) {
316
+ keysByNamespace[namespace].add(pureKey)
317
+ }
318
+ }
319
+ }
320
+
321
+ // Check for missing keys in each namespace
267
322
  for (const namespace of namespaces) {
268
323
  const existingKeys = await loadLocalesFile(
269
324
  loadPath,
@@ -271,17 +326,13 @@ export const getMissingKeys = async ({
271
326
  namespace,
272
327
  )
273
328
 
274
- console.log(Object.keys(existingKeys).length, "existing keys")
275
-
276
- for (const key of uniqueKeys) {
277
- const pureKey = getPureKey(key, namespace, namespace === defaultNamespace)
329
+ console.log(Object.keys(existingKeys).length, "existing keys in", namespace)
278
330
 
279
- if (!pureKey) {
280
- continue
281
- }
331
+ const keysForNamespace = keysByNamespace[namespace] || new Set()
282
332
 
283
- if (!existingKeys[pureKey]) {
284
- newKeys.push({ key: pureKey, namespace })
333
+ for (const key of keysForNamespace) {
334
+ if (!existingKeys[key]) {
335
+ newKeys.push({ key, namespace })
285
336
  }
286
337
  }
287
338
  }
@@ -1,165 +0,0 @@
1
- import glob from "fast-glob"
2
- import { Parser } from "i18next-scanner"
3
- import fs from "node:fs"
4
- import type { Configuration } from "../lib/types"
5
- import {
6
- getPureKey,
7
- loadLocalesFile,
8
- removeDuplicatesFromArray,
9
- writeLocalesFile,
10
- } from "../lib/utils"
11
-
12
- export interface PruneOptions {
13
- sourceNamespace: string
14
- newNamespace: string
15
- globPatterns: string[]
16
- }
17
-
18
- export interface PruneResult {
19
- locale: string
20
- keyCount: number
21
- success: boolean
22
- error?: string
23
- }
24
-
25
- export interface PruneResponse {
26
- success: boolean
27
- message: string
28
- keysCount: number
29
- results?: PruneResult[]
30
- }
31
-
32
- export const createPrunedNamespaceAutomated = async (
33
- config: Configuration,
34
- options: PruneOptions,
35
- ): Promise<PruneResponse> => {
36
- const { namespaces, loadPath, savePath, locales, defaultNamespace } = config
37
- const { sourceNamespace, newNamespace, globPatterns } = options
38
-
39
- // Validate inputs
40
- if (!namespaces.includes(sourceNamespace)) {
41
- throw new Error(
42
- `Source namespace '${sourceNamespace}' not found in configuration`,
43
- )
44
- }
45
-
46
- if (namespaces.includes(newNamespace)) {
47
- throw new Error(`Namespace '${newNamespace}' already exists`)
48
- }
49
-
50
- console.log(
51
- `Creating pruned namespace '${newNamespace}' from '${sourceNamespace}'`,
52
- )
53
- console.log(`Using glob patterns: ${globPatterns.join(", ")}`)
54
-
55
- // Extract keys from files matching the glob patterns
56
- const parser = new Parser({
57
- nsSeparator: false,
58
- keySeparator: false,
59
- })
60
-
61
- const files = await glob([...globPatterns, "!**/node_modules/**"])
62
- console.log(`Found ${files.length} files to scan`)
63
-
64
- const extractedKeys = []
65
-
66
- for (const file of files) {
67
- const content = fs.readFileSync(file, "utf-8")
68
- parser.parseFuncFromString(content, { list: ["t"] }, (key: string) => {
69
- extractedKeys.push(key)
70
- })
71
- }
72
-
73
- const uniqueExtractedKeys = removeDuplicatesFromArray(extractedKeys)
74
- console.log(`Found ${uniqueExtractedKeys.length} unique translation keys`)
75
-
76
- // Filter keys that belong to the source namespace
77
- const relevantKeys = []
78
-
79
- for (const key of uniqueExtractedKeys) {
80
- const pureKey = getPureKey(
81
- key,
82
- sourceNamespace,
83
- sourceNamespace === defaultNamespace,
84
- )
85
-
86
- if (pureKey) {
87
- relevantKeys.push(pureKey)
88
- }
89
- }
90
-
91
- console.log(
92
- `Found ${relevantKeys.length} keys from namespace '${sourceNamespace}'`,
93
- )
94
-
95
- if (relevantKeys.length === 0) {
96
- console.log("No relevant keys found. Exiting...")
97
- return {
98
- success: false,
99
- message: "No relevant keys found",
100
- keysCount: 0,
101
- }
102
- }
103
-
104
- // Get translations from source namespace and create new namespace files
105
- const results: PruneResult[] = []
106
-
107
- for (const locale of locales) {
108
- try {
109
- // Load source namespace translations
110
- const sourceTranslations = await loadLocalesFile(
111
- loadPath,
112
- locale,
113
- sourceNamespace,
114
- )
115
-
116
- // Create new namespace with only the keys used in the glob pattern files
117
- const newNamespaceTranslations: Record<string, string> = {}
118
-
119
- for (const key of relevantKeys) {
120
- if (sourceTranslations[key]) {
121
- newNamespaceTranslations[key] = sourceTranslations[key]
122
- }
123
- }
124
-
125
- // Write the new namespace file
126
- await writeLocalesFile(
127
- savePath,
128
- locale,
129
- newNamespace,
130
- newNamespaceTranslations,
131
- )
132
-
133
- const keyCount = Object.keys(newNamespaceTranslations).length
134
- console.log(
135
- `Created pruned namespace '${newNamespace}' for locale '${locale}' with ${keyCount} keys`,
136
- )
137
-
138
- results.push({
139
- locale,
140
- keyCount,
141
- success: true,
142
- })
143
- } catch (error) {
144
- console.error(
145
- `Error creating pruned namespace for locale '${locale}':`,
146
- error,
147
- )
148
- results.push({
149
- locale,
150
- keyCount: 0,
151
- success: false,
152
- error: error instanceof Error ? error.message : String(error),
153
- })
154
- }
155
- }
156
-
157
- console.log(`✅ Successfully created pruned namespace '${newNamespace}'`)
158
-
159
- return {
160
- success: true,
161
- message: `Created pruned namespace '${newNamespace}' with ${relevantKeys.length} keys`,
162
- keysCount: relevantKeys.length,
163
- results,
164
- }
165
- }