smartloc 2.0.2 → 2.0.4

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.
Files changed (100) hide show
  1. package/adapters/adapter-base.d.ts +12 -0
  2. package/adapters/adapter-base.js +56 -0
  3. package/adapters/adapter-base.js.map +1 -0
  4. package/adapters/index.d.ts +4 -0
  5. package/adapters/index.js +32 -0
  6. package/adapters/index.js.map +1 -0
  7. package/adapters/json.d.ts +6 -0
  8. package/adapters/json.js +23 -0
  9. package/adapters/json.js.map +1 -0
  10. package/adapters/xliff.d.ts +6 -0
  11. package/adapters/xliff.js +35 -0
  12. package/adapters/xliff.js.map +1 -0
  13. package/cli/cli.d.ts +2 -0
  14. package/cli/cli.js +129 -0
  15. package/cli/cli.js.map +1 -0
  16. package/cli/collect.d.ts +14 -0
  17. package/{src/cli/collect.ts → cli/collect.js} +59 -75
  18. package/cli/collect.js.map +1 -0
  19. package/cli/interfaces.js +3 -0
  20. package/cli/interfaces.js.map +1 -0
  21. package/cli/reconciliate.d.ts +6 -0
  22. package/{src/cli/reconciliate.ts → cli/reconciliate.js} +35 -40
  23. package/cli/reconciliate.js.map +1 -0
  24. package/cli/utils.d.ts +6 -0
  25. package/{src/cli/utils.ts → cli/utils.js} +16 -12
  26. package/cli/utils.js.map +1 -0
  27. package/core/default-locale.d.ts +10 -0
  28. package/{src/core/default-locale.tsx → core/default-locale.js} +23 -28
  29. package/core/default-locale.js.map +1 -0
  30. package/{src/core/interfaces.ts → core/interfaces.d.ts} +15 -20
  31. package/core/interfaces.js +3 -0
  32. package/core/interfaces.js.map +1 -0
  33. package/core/json-utils.d.ts +19 -0
  34. package/{src/core/json-utils.ts → core/json-utils.js} +27 -33
  35. package/core/json-utils.js.map +1 -0
  36. package/core/literal.d.ts +13 -0
  37. package/{src/core/literal.ts → core/literal.js} +20 -19
  38. package/core/literal.js.map +1 -0
  39. package/core/load.d.ts +32 -0
  40. package/core/load.js +50 -0
  41. package/core/load.js.map +1 -0
  42. package/core/locale-list.d.ts +27 -0
  43. package/{src/core/locale-list.ts → core/locale-list.js} +35 -38
  44. package/core/locale-list.js.map +1 -0
  45. package/core/locale.d.ts +15 -0
  46. package/{src/core/locale.tsx → core/locale.js} +29 -28
  47. package/core/locale.js.map +1 -0
  48. package/core/smartloc.d.ts +39 -0
  49. package/{src/core/smartloc.tsx → core/smartloc.js} +104 -122
  50. package/core/smartloc.js.map +1 -0
  51. package/core/tag.d.ts +13 -0
  52. package/core/tag.js +26 -0
  53. package/core/tag.js.map +1 -0
  54. package/core/utils.d.ts +4 -0
  55. package/core/utils.js +30 -0
  56. package/core/utils.js.map +1 -0
  57. package/express.d.ts +12 -0
  58. package/{src/express.ts → express.js} +33 -41
  59. package/express.js.map +1 -0
  60. package/graphql.d.ts +13 -0
  61. package/{src/graphql.ts → graphql.js} +62 -74
  62. package/graphql.js.map +1 -0
  63. package/index.js +30 -1
  64. package/index.js.map +1 -0
  65. package/node/index.d.ts +1 -0
  66. package/node/index.js +18 -0
  67. package/node/index.js.map +1 -0
  68. package/node/load.d.ts +12 -0
  69. package/node/load.js +37 -0
  70. package/node/load.js.map +1 -0
  71. package/package.json +3 -22
  72. package/.cursor/rules/use-bun-instead-of-node-vite-npm-pnpm.mdc +0 -111
  73. package/.vscode/launch.json +0 -65
  74. package/.vscode/settings.json +0 -14
  75. package/.vscode/tasks.json +0 -27
  76. package/build/README.md +0 -225
  77. package/build/package.json +0 -60
  78. package/bun.lock +0 -310
  79. package/samples/express/main.ts +0 -37
  80. package/samples/express/package.json +0 -10
  81. package/samples/graphql/main.ts +0 -73
  82. package/samples/graphql/package.json +0 -15
  83. package/src/adapters/adapter-base.ts +0 -58
  84. package/src/adapters/index.ts +0 -31
  85. package/src/adapters/json.ts +0 -18
  86. package/src/adapters/xliff.ts +0 -30
  87. package/src/cli/cli.ts +0 -137
  88. package/src/core/load.ts +0 -82
  89. package/src/core/tag.ts +0 -48
  90. package/src/core/utils.tsx +0 -24
  91. package/src/node/index.ts +0 -1
  92. package/src/node/load.ts +0 -32
  93. package/test/collect.spec.ts +0 -45
  94. package/test/reconciliation.spec.ts +0 -132
  95. package/test/serialization.spec.ts +0 -162
  96. package/test/translation.spec.ts +0 -61
  97. package/tsconfig.json +0 -37
  98. package/tslint.json +0 -103
  99. /package/{src/cli/interfaces.ts → cli/interfaces.d.ts} +0 -0
  100. /package/{src/index.ts → index.d.ts} +0 -0
@@ -0,0 +1,12 @@
1
+ import { IFormatAdapter } from '../cli/interfaces';
2
+ import type { Translation } from '../core/load';
3
+ export declare abstract class AdapterBase implements IFormatAdapter {
4
+ private target;
5
+ constructor(target: string | null);
6
+ loadFile(filePath: string): Promise<Translation>;
7
+ loadLocale(locale: string): Promise<Translation>;
8
+ protected abstract doLoadFile(content: string): Promise<Translation>;
9
+ loadLocales(locales: string[]): Promise<Translation[]>;
10
+ write(translation: Translation): Promise<void>;
11
+ protected abstract contentFor(translation: Translation): Promise<string>;
12
+ }
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.AdapterBase = void 0;
7
+ const fs_extra_1 = __importDefault(require("fs-extra"));
8
+ const path_1 = __importDefault(require("path"));
9
+ class AdapterBase {
10
+ target;
11
+ constructor(target) {
12
+ this.target = target;
13
+ }
14
+ async loadFile(filePath) {
15
+ if (!await fs_extra_1.default.pathExists(filePath)) {
16
+ throw new Error(`File ${filePath} does not exist`);
17
+ }
18
+ const content = await fs_extra_1.default.readFile(filePath, 'utf8');
19
+ return await this.doLoadFile(content);
20
+ }
21
+ async loadLocale(locale) {
22
+ if (!this.target || !await fs_extra_1.default.pathExists(this.target)) {
23
+ return {
24
+ resources: {},
25
+ targetLanguage: locale,
26
+ };
27
+ }
28
+ return await this.loadFile(path_1.default.join(this.target, `${locale}.json`));
29
+ }
30
+ async loadLocales(locales) {
31
+ if (!this.target || !await fs_extra_1.default.pathExists(this.target)) {
32
+ return locales.map(x => ({
33
+ resources: {},
34
+ targetLanguage: x,
35
+ }));
36
+ }
37
+ const ret = [];
38
+ for (const f of locales) {
39
+ const t = await this.loadFile(path_1.default.join(this.target, `${f}.json`));
40
+ t.targetLanguage = f;
41
+ ret.push(t);
42
+ }
43
+ return ret;
44
+ }
45
+ async write(translation) {
46
+ if (!this.target) {
47
+ throw new Error('Target directory not set');
48
+ }
49
+ await fs_extra_1.default.ensureDir(this.target);
50
+ const content = await this.contentFor(translation);
51
+ const toFile = path_1.default.join(this.target, translation.targetLanguage + '.json');
52
+ await fs_extra_1.default.writeFile(toFile, content, 'utf8');
53
+ }
54
+ }
55
+ exports.AdapterBase = AdapterBase;
56
+ //# sourceMappingURL=adapter-base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter-base.js","sourceRoot":"","sources":["../../src/adapters/adapter-base.ts"],"names":[],"mappings":";;;;;;AACA,wDAA0B;AAC1B,gDAAwB;AAGxB,MAAsB,WAAW;IAET;IAApB,YAAoB,MAAqB;QAArB,WAAM,GAAN,MAAM,CAAe;IACzC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,QAAgB;QAC3B,IAAI,CAAC,MAAM,kBAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,iBAAiB,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACpD,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAc;QAC3B,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,kBAAE,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACpD,OAAO;gBACH,SAAS,EAAE,EAAE;gBACb,cAAc,EAAE,MAAM;aACzB,CAAC;QACN,CAAC;QACD,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,CAAC,CAAC;IACzE,CAAC;IAID,KAAK,CAAC,WAAW,CAAC,OAAiB;QAC/B,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,kBAAE,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACpD,OAAO,OAAO,CAAC,GAAG,CAAc,CAAC,CAAC,EAAE,CAAC,CAAC;gBAClC,SAAS,EAAE,EAAE;gBACb,cAAc,EAAE,CAAC;aACpB,CAAC,CAAC,CAAC;QACR,CAAC;QACD,MAAM,GAAG,GAAkB,EAAE,CAAC;QAC9B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YACnE,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC;YACrB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,CAAC;QACD,OAAO,GAAG,CAAC;IACf,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,WAAwB;QAChC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,kBAAE,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,cAAc,GAAG,OAAO,CAAC,CAAC;QAC5E,MAAM,kBAAE,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC;CAGJ;AApDD,kCAoDC"}
@@ -0,0 +1,4 @@
1
+ import type { IFormatAdapter } from '../cli/interfaces';
2
+ import type { Translation } from '../core/load';
3
+ export declare function getAdapter(format: string, dir: string): IFormatAdapter;
4
+ export declare function loadLocaleFrom(path: string): Promise<Translation | null>;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getAdapter = getAdapter;
4
+ exports.loadLocaleFrom = loadLocaleFrom;
5
+ const xliff_1 = require("./xliff");
6
+ const json_1 = require("./json");
7
+ function getAdapter(format, dir) {
8
+ switch (format) {
9
+ case 'xliff':
10
+ return new xliff_1.XliffAdapter(dir);
11
+ case 'json':
12
+ return new json_1.JsonAdapter(dir);
13
+ default:
14
+ throw new Error('Unknown translation format: ' + format);
15
+ }
16
+ }
17
+ async function loadLocaleFrom(path) {
18
+ const [ext] = /\.[a-z]+$/.exec(path.toLowerCase()) || [null];
19
+ let adapter;
20
+ switch (ext) {
21
+ case '.json':
22
+ adapter = new json_1.JsonAdapter(null);
23
+ break;
24
+ case '.xlf':
25
+ adapter = new xliff_1.XliffAdapter(null);
26
+ break;
27
+ default:
28
+ return null;
29
+ }
30
+ return await adapter.loadFile(path);
31
+ }
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":";;AAKA,gCASC;AAED,wCAcC;AA7BD,mCAAuC;AACvC,iCAAqC;AAGrC,SAAgB,UAAU,CAAC,MAAc,EAAE,GAAW;IAClD,QAAQ,MAAM,EAAE,CAAC;QACb,KAAK,OAAO;YACR,OAAO,IAAI,oBAAY,CAAC,GAAG,CAAC,CAAC;QACjC,KAAK,MAAM;YACP,OAAO,IAAI,kBAAW,CAAC,GAAG,CAAC,CAAC;QAChC;YACI,MAAM,IAAI,KAAK,CAAC,8BAA8B,GAAG,MAAM,CAAC,CAAC;IACjE,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,cAAc,CAAC,IAAY;IAC7C,MAAM,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,IAAI,OAAuB,CAAC;IAC5B,QAAQ,GAAG,EAAE,CAAC;QACV,KAAK,OAAO;YACR,OAAO,GAAG,IAAI,kBAAW,CAAC,IAAI,CAAC,CAAC;YAChC,MAAM;QACV,KAAK,MAAM;YACP,OAAO,GAAG,IAAI,oBAAY,CAAC,IAAI,CAAC,CAAC;YACjC,MAAM;QACV;YACI,OAAO,IAAI,CAAC;IACpB,CAAC;IACD,OAAO,MAAM,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { type Translation } from '../core/load';
2
+ import { AdapterBase } from './adapter-base';
3
+ export declare class JsonAdapter extends AdapterBase {
4
+ protected doLoadFile(content: string): Promise<Translation>;
5
+ protected contentFor(translation: Translation): Promise<string>;
6
+ }
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.JsonAdapter = void 0;
7
+ const load_1 = require("../core/load");
8
+ const json_stable_stringify_1 = __importDefault(require("json-stable-stringify"));
9
+ const adapter_base_1 = require("./adapter-base");
10
+ const utils_1 = require("../cli/utils");
11
+ class JsonAdapter extends adapter_base_1.AdapterBase {
12
+ async doLoadFile(content) {
13
+ const parsed = JSON.parse(content);
14
+ return (0, load_1.ungroupTranslation)(parsed);
15
+ }
16
+ async contentFor(translation) {
17
+ const data = (0, utils_1.toGroupedTranslation)(translation);
18
+ const content = (0, json_stable_stringify_1.default)(data, { space: ' ' });
19
+ return content;
20
+ }
21
+ }
22
+ exports.JsonAdapter = JsonAdapter;
23
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/adapters/json.ts"],"names":[],"mappings":";;;;;;AAAA,uCAA6F;AAC7F,kFAA+C;AAC/C,iDAA6C;AAC7C,wCAAoD;AAEpD,MAAa,WAAY,SAAQ,0BAAW;IAE9B,KAAK,CAAC,UAAU,CAAC,OAAe;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAuB,CAAC;QACzD,OAAO,IAAA,yBAAkB,EAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAES,KAAK,CAAC,UAAU,CAAC,WAAwB;QAC/C,MAAM,IAAI,GAAG,IAAA,4BAAoB,EAAC,WAAW,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,IAAA,+BAAU,EAAC,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACpD,OAAO,OAAQ,CAAC;IACpB,CAAC;CACJ;AAZD,kCAYC"}
@@ -0,0 +1,6 @@
1
+ import type { Translation } from '../core/load';
2
+ import { AdapterBase } from './adapter-base';
3
+ export declare class XliffAdapter extends AdapterBase {
4
+ protected doLoadFile(content: string): Promise<Translation>;
5
+ protected contentFor(translation: Translation): Promise<string>;
6
+ }
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.XliffAdapter = void 0;
7
+ // @ts-ignore
8
+ const js2xliff_1 = __importDefault(require("xliff/js2xliff"));
9
+ // @ts-ignore
10
+ const xliff2js_1 = __importDefault(require("xliff/xliff2js"));
11
+ const utils_1 = require("../cli/utils");
12
+ const load_1 = require("../core/load");
13
+ const adapter_base_1 = require("./adapter-base");
14
+ class XliffAdapter extends adapter_base_1.AdapterBase {
15
+ async doLoadFile(content) {
16
+ const parsed = await new Promise((res, rej) => (0, xliff2js_1.default)(content, (err, val) => err ? rej(err) : res(val)));
17
+ return (0, load_1.ungroupTranslation)(parsed);
18
+ }
19
+ async contentFor(translation) {
20
+ const data = (0, utils_1.toGroupedTranslation)(translation);
21
+ return await new Promise((res, rej) => (0, js2xliff_1.default)(data, async (err, result) => {
22
+ if (err) {
23
+ return rej(err);
24
+ }
25
+ try {
26
+ res(result);
27
+ }
28
+ catch (e) {
29
+ rej(e);
30
+ }
31
+ }));
32
+ }
33
+ }
34
+ exports.XliffAdapter = XliffAdapter;
35
+ //# sourceMappingURL=xliff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xliff.js","sourceRoot":"","sources":["../../src/adapters/xliff.ts"],"names":[],"mappings":";;;;;;AAAA,aAAa;AACb,8DAAsC;AACtC,aAAa;AACb,8DAAsC;AAEtC,wCAAoD;AACpD,uCAAkD;AAClD,iDAA6C;AAE7C,MAAa,YAAa,SAAQ,0BAAW;IAE/B,KAAK,CAAC,UAAU,CAAC,OAAe;QACtC,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,CAAqB,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,IAAA,kBAAQ,EAAC,OAAO,EAAE,CAAC,GAAQ,EAAE,GAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACzI,OAAO,IAAA,yBAAkB,EAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAES,KAAK,CAAC,UAAU,CAAC,WAAwB;QAC/C,MAAM,IAAI,GAAG,IAAA,4BAAoB,EAAC,WAAW,CAAC,CAAC;QAC/C,OAAO,MAAM,IAAI,OAAO,CAAS,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,IAAA,kBAAQ,EAAC,IAAI,EAAE,KAAK,EAAE,GAAQ,EAAE,MAAW,EAAE,EAAE;YAC1F,IAAI,GAAG,EAAE,CAAC;gBACN,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC;YACD,IAAI,CAAC;gBACD,GAAG,CAAC,MAAM,CAAC,CAAC;YAChB,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,GAAG,CAAC,CAAC,CAAC,CAAC;YACX,CAAC;QACL,CAAC,CAAC,CAAC,CAAC;IACR,CAAC;CACJ;AApBD,oCAoBC"}
package/cli/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env bun
2
+ export {};
package/cli/cli.js ADDED
@@ -0,0 +1,129 @@
1
+ #!/usr/bin/env bun
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const yargs_1 = __importDefault(require("yargs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const collect_1 = require("./collect");
10
+ const reconciliate_1 = require("./reconciliate");
11
+ const adapters_1 = require("../adapters");
12
+ // === arguments parsing ===
13
+ function isValidLocale(x) {
14
+ return typeof x === 'string' && !!x && /^[a-zA-Z]+(\-[a-zA-Z]+)?$/.test(x);
15
+ }
16
+ function defaultArgs(b) {
17
+ return b.positional('format', {
18
+ describe: 'The output format',
19
+ choices: ['json', 'xliff'],
20
+ default: 'xliff',
21
+ })
22
+ .positional('outDir', {
23
+ describe: 'The translation output directory',
24
+ default: 'i18n',
25
+ normalize: true,
26
+ });
27
+ }
28
+ yargs_1.default
29
+ .scriptName('smartloc')
30
+ .command('add', 'Add a new locale', b => defaultArgs(b).demandCommand(), args => {
31
+ console.log(args);
32
+ })
33
+ .command('collect', 'Collects all strings to translate', b => defaultArgs(b)
34
+ .positional('source', {
35
+ describe: 'The source directory where to look for translations (defaults to current working directory)',
36
+ type: 'string',
37
+ normalize: true,
38
+ })
39
+ .positional('defaultLocale', {
40
+ description: 'Sets the default locale (the locale used in code for your strings)',
41
+ type: 'string',
42
+ coerce: x => {
43
+ if (!isValidLocale(x)) {
44
+ console.error('Invalid locale ' + x);
45
+ process.exit(1);
46
+ }
47
+ return x;
48
+ },
49
+ })
50
+ .positional('generateDefault', {
51
+ description: 'Also generates a translation file for the default locale',
52
+ type: 'boolean',
53
+ })
54
+ .positional('generateDefault', {
55
+ description: 'Also generates the default locale translation file (which does not need to be translated)',
56
+ type: 'boolean',
57
+ })
58
+ .positional('locales', {
59
+ description: 'Comma separated list of locales to generate (others than the default one)',
60
+ type: 'string',
61
+ coerce: x => {
62
+ if (typeof x !== 'string' || !x || !/^[a-zA-Z]+(\-[a-zA-Z]+)?$/.test(x)) {
63
+ console.error('Invalid locale ' + x);
64
+ process.exit(1);
65
+ }
66
+ return x;
67
+ },
68
+ }), async (args) => {
69
+ try {
70
+ const locales = args.locales?.split(',')
71
+ .map(x => x.trim())
72
+ .filter(x => x !== args.defaultLocale);
73
+ if (!locales?.length) {
74
+ console.error('You must provide at least one locale thats different from your default locale');
75
+ process.exit(1);
76
+ }
77
+ if (locales.some(x => !isValidLocale(x))) {
78
+ console.error('--locales argument is invalid');
79
+ process.exit(1);
80
+ }
81
+ // create adapter
82
+ const outdir = path_1.default.join(process.cwd(), args.outDir);
83
+ const adapter = (0, adapters_1.getAdapter)(args.format, outdir);
84
+ // collect from sources
85
+ console.log('Collecting from sources...');
86
+ const { collected, files } = await (0, collect_1.collect)(args.source || '.', adapter, args.defaultLocale);
87
+ console.log(`...found ${Object.keys(collected.resources).length} translatable items over ${files} files with default language ${collected.targetLanguage}`);
88
+ // load other locales
89
+ const others = (await adapter.loadLocales(locales))
90
+ .filter(x => x.targetLanguage !== collected.targetLanguage);
91
+ console.log(`Updating ${others.length} other translations...`);
92
+ // reconciliate existing
93
+ for (const l of others) {
94
+ const collectedCopy = JSON.parse(JSON.stringify(collected));
95
+ const { dirty, missing, same } = (0, reconciliate_1.reconciliate)(l, collectedCopy);
96
+ const feats = [];
97
+ if (dirty) {
98
+ feats.push(`${dirty} dirty translations (source changed)`);
99
+ }
100
+ if (missing) {
101
+ feats.push(`${missing} missing translations`);
102
+ }
103
+ if (same.length) {
104
+ feats.push(`${same.length} translations matching original (ex: ${same[0]})`);
105
+ }
106
+ if (!feats.length) {
107
+ console.log(`${l.targetLanguage} is OK ♥`);
108
+ }
109
+ else {
110
+ console.log(`${l.targetLanguage} has ${feats.join(', ')}`);
111
+ }
112
+ }
113
+ // write others
114
+ console.log(`Writing results...`);
115
+ for (const l of others) {
116
+ await adapter.write(l);
117
+ }
118
+ if (args.defaultLocale) {
119
+ await adapter.write(collected);
120
+ }
121
+ console.log(`I'm done ♥`);
122
+ }
123
+ catch (e) {
124
+ console.error('Command failed', e);
125
+ process.exit(1);
126
+ }
127
+ })
128
+ .argv;
129
+ //# sourceMappingURL=cli.js.map
package/cli/cli.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { Translation } from '../core/load';
2
+ import type { IFormatAdapter } from './interfaces';
3
+ export interface Loc {
4
+ id: string;
5
+ file: string | undefined;
6
+ line: number;
7
+ source: string;
8
+ plural?: boolean;
9
+ }
10
+ export declare function collect(source: string, adapter: IFormatAdapter, forceLocale?: string): Promise<{
11
+ collected: Translation;
12
+ files: number;
13
+ }>;
14
+ export declare function collectFromSource(content: string, ids: Map<string, Loc>, all: Loc[], f?: string): void;
@@ -1,60 +1,57 @@
1
- import fs from 'fs-extra';
2
- import path from 'path';
3
- import giparser from 'gitignore-parser';
4
- import type { CollectResult, Translation } from '../core/load';
5
- import type { IFormatAdapter } from './interfaces';
6
- import { autoGenerateId } from '../core/utils';
7
- import util from 'util';
8
- export interface Loc {
9
- id: string;
10
- file: string | undefined;
11
- line: number;
12
- source: string;
13
- plural?: boolean;
14
- }
15
-
16
- export async function collect(source: string, adapter: IFormatAdapter, forceLocale?: string): Promise<{ collected: Translation; files: number }> {
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.collect = collect;
7
+ exports.collectFromSource = collectFromSource;
8
+ const fs_extra_1 = __importDefault(require("fs-extra"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const gitignore_parser_1 = __importDefault(require("gitignore-parser"));
11
+ const utils_1 = require("../core/utils");
12
+ const util_1 = __importDefault(require("util"));
13
+ async function collect(source, adapter, forceLocale) {
17
14
  source = source
18
- ? path.join(process.cwd(), source)
15
+ ? path_1.default.join(process.cwd(), source)
19
16
  : process.cwd();
20
17
  // parse gitignore
21
18
  // todo: parse .gitignore files in nested directories.
22
- let ignore: { accepts(path: string): boolean; denies(path: string): boolean; };
23
- const gitIgnorePath = path.join(source, '.gitignore');
24
- if (await fs.pathExists(gitIgnorePath)) {
25
- const content = await fs.readFile(gitIgnorePath, 'utf8');
26
- ignore = giparser.compile(content);
27
- } else {
28
- ignore = giparser.compile('');
19
+ let ignore;
20
+ const gitIgnorePath = path_1.default.join(source, '.gitignore');
21
+ if (await fs_extra_1.default.pathExists(gitIgnorePath)) {
22
+ const content = await fs_extra_1.default.readFile(gitIgnorePath, 'utf8');
23
+ ignore = gitignore_parser_1.default.compile(content);
24
+ }
25
+ else {
26
+ ignore = gitignore_parser_1.default.compile('');
29
27
  }
30
-
31
-
32
- async function* walk(dirRelative: string): AsyncIterableIterator<string> {
28
+ async function* walk(dirRelative) {
33
29
  try {
34
- const files = await fs.readdir(path.join(source, dirRelative));
30
+ const files = await fs_extra_1.default.readdir(path_1.default.join(source, dirRelative));
35
31
  for (const file of files) {
36
- const filepath = path.join(source, dirRelative, file);
37
- const fileRelative = path.join(dirRelative, file);
32
+ const filepath = path_1.default.join(source, dirRelative, file);
33
+ const fileRelative = path_1.default.join(dirRelative, file);
38
34
  if (ignore.denies(fileRelative)) {
39
35
  continue;
40
36
  }
41
- const stats = await fs.stat(filepath);
37
+ const stats = await fs_extra_1.default.stat(filepath);
42
38
  if (stats.isDirectory()) {
43
39
  yield* walk(fileRelative);
44
- } else {
40
+ }
41
+ else {
45
42
  if (ignore.accepts(fileRelative)) {
46
43
  yield fileRelative;
47
44
  }
48
45
  }
49
46
  }
50
- } catch (e) {
47
+ }
48
+ catch (e) {
51
49
  console.error('Failed to read directory ' + dirRelative);
52
50
  }
53
51
  }
54
-
55
- const ids = new Map<string, Loc>();
56
- const all: Loc[] = [];
57
- let defaultLocale: { val: string; file: string; } | undefined = undefined;
52
+ const ids = new Map();
53
+ const all = [];
54
+ let defaultLocale = undefined;
58
55
  let fcount = 0;
59
56
  for await (const f of walk('')) {
60
57
  const ext = f.toLowerCase();
@@ -63,15 +60,14 @@ export async function collect(source: string, adapter: IFormatAdapter, forceLoca
63
60
  }
64
61
  fcount++;
65
62
  try {
66
- const content = await fs.readFile(path.join(source, f), 'utf8');
67
-
63
+ const content = await fs_extra_1.default.readFile(path_1.default.join(source, f), 'utf8');
68
64
  // === try to find setDefaultLocale()
69
65
  if (!forceLocale) {
70
66
  const defLoc = /\bsetDefaultLocale\s*\(\s*('|")([a-zA-Z\-]+)('|")\s*\)/.exec(content);
71
67
  const newDefLoc = defLoc?.[2];
72
68
  if (newDefLoc) {
73
69
  if (defaultLocale && defaultLocale.val !== newDefLoc) {
74
- console.error(`Ambiguous default locale. Found '${newDefLoc}' in ${f}, but was defined already defined as '${defaultLocale.val}' in ${defaultLocale.file}. Please use --locale:${defaultLocale.val}`)
70
+ console.error(`Ambiguous default locale. Found '${newDefLoc}' in ${f}, but was defined already defined as '${defaultLocale.val}' in ${defaultLocale.file}. Please use --locale:${defaultLocale.val}`);
75
71
  }
76
72
  defaultLocale = {
77
73
  file: f,
@@ -79,29 +75,25 @@ export async function collect(source: string, adapter: IFormatAdapter, forceLoca
79
75
  };
80
76
  }
81
77
  }
82
-
83
78
  collectFromSource(content, ids, all, f);
84
-
85
- } catch (e) {
86
- console.error('Failed to read file ' + f + ': ' + util.inspect(e));
79
+ }
80
+ catch (e) {
81
+ console.error('Failed to read file ' + f + ': ' + util_1.default.inspect(e));
87
82
  }
88
83
  }
89
-
90
84
  // === load default locale ===
91
85
  const targetLanguage = defaultLocale?.val || forceLocale;
92
86
  const origFile = targetLanguage ? await adapter.loadLocale(targetLanguage) : null;
93
-
94
87
  // === WRITE RESULT ===
95
- const result: CollectResult = {};
88
+ const result = {};
96
89
  for (const v of all) {
97
90
  if (v.plural) {
98
-
99
91
  // Pluralizable strings must also be "transalted" in source language,
100
92
  // since the code will only contain the pluralized form
101
93
  // => they must be marked as dirty if need be.
102
94
  const orig = origFile?.resources?.[v.id];
103
- let singular: string | null = null;
104
- let dirty: boolean | undefined = undefined;
95
+ let singular = null;
96
+ let dirty = undefined;
105
97
  if (orig?.target && typeof orig.target !== 'string') {
106
98
  // if the plural has changed, or if there is no singlar in orig file,
107
99
  // then it must be fixed
@@ -110,7 +102,6 @@ export async function collect(source: string, adapter: IFormatAdapter, forceLoca
110
102
  }
111
103
  singular = orig.target?.singular ?? null;
112
104
  }
113
-
114
105
  result[v.id] = {
115
106
  target: {
116
107
  singular,
@@ -118,14 +109,14 @@ export async function collect(source: string, adapter: IFormatAdapter, forceLoca
118
109
  },
119
110
  dirty,
120
111
  };
121
- } else {
112
+ }
113
+ else {
122
114
  // simple translations are never dirty: code is law
123
115
  result[v.id] = {
124
116
  target: v.source,
125
117
  };
126
118
  }
127
119
  }
128
-
129
120
  if (!targetLanguage) {
130
121
  console.error('Cannot infer the default locale. Either call setDefaultLocale() in analyzed sources, or set the --defaultLocale argument');
131
122
  process.exit(1);
@@ -136,28 +127,23 @@ export async function collect(source: string, adapter: IFormatAdapter, forceLoca
136
127
  };
137
128
  return { collected, files: fcount };
138
129
  }
139
-
140
-
141
- export function collectFromSource(content: string, ids: Map<string, Loc>, all: Loc[], f?: string) {
142
-
143
-
130
+ function collectFromSource(content, ids, all, f) {
144
131
  // === parse loc() calls
145
132
  const re = /\bloc(\.plural\([^\)]+\))?\s*(\(\s*('|")([^'"\n]+)('|")\s*(?:,\s*)?\))?\s*`([^`]*)`/g;
146
- let m: RegExpExecArray | null;
133
+ let m;
147
134
  while (m = re.exec(content)) {
148
135
  const plural = m[1];
149
136
  let id = m[4];
150
137
  const val = m[6];
151
-
152
138
  // parse format
153
139
  const reFormat = /\$\{([^\}]+)\}/g;
154
- let fm: RegExpExecArray | null;
140
+ let fm;
155
141
  let index = 0;
156
142
  let cnt = 0;
157
- const parts: string[] = [];
158
- const idParts: string[] | null = id ? null : [];
159
- while (fm = reFormat.exec(val!)) {
160
- const literal = val!.substr(index, fm.index - index);
143
+ const parts = [];
144
+ const idParts = id ? null : [];
145
+ while (fm = reFormat.exec(val)) {
146
+ const literal = val.substr(index, fm.index - index);
161
147
  parts.push(literal);
162
148
  idParts?.push(literal);
163
149
  index = fm.index + fm[0].length;
@@ -165,25 +151,22 @@ export function collectFromSource(content: string, ids: Map<string, Loc>, all: L
165
151
  cnt++;
166
152
  }
167
153
  // add trailing
168
- idParts?.push(val!.substr(index));
169
- parts.push(val!.substr(index));
170
-
171
-
154
+ idParts?.push(val.substr(index));
155
+ parts.push(val.substr(index));
172
156
  const raw = parts.join('');
173
- id = id || autoGenerateId(idParts!);
157
+ id = id || (0, utils_1.autoGenerateId)(idParts);
174
158
  const exists = ids.get(id);
175
159
  // check no dupplicate
176
160
  if (exists && exists.source !== raw) {
177
161
  if (f === exists.file) {
178
162
  console.error(`Duplicate translation id '${id}' found in ${f} but was already defined in ${exists.file}`);
179
- } else {
163
+ }
164
+ else {
180
165
  console.error(`Duplicate translation id '${id}' found in ${f}`);
181
166
  }
182
167
  continue;
183
168
  }
184
-
185
-
186
- const found: Loc = {
169
+ const found = {
187
170
  file: f,
188
171
  id,
189
172
  line: 0, // todo
@@ -193,4 +176,5 @@ export function collectFromSource(content: string, ids: Map<string, Loc>, all: L
193
176
  all.push(found);
194
177
  ids.set(id, found);
195
178
  }
196
- }
179
+ }
180
+ //# sourceMappingURL=collect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collect.js","sourceRoot":"","sources":["../../src/cli/collect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=interfaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../src/cli/interfaces.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ import type { Translation } from '../core/load';
2
+ export declare function reconciliate(translations: Translation, source: Translation): {
3
+ missing: number;
4
+ same: string[];
5
+ dirty: number;
6
+ };