smartloc 2.0.1 → 2.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/adapters/adapter-base.d.ts +12 -0
- package/adapters/adapter-base.js +56 -0
- package/adapters/adapter-base.js.map +1 -0
- package/adapters/index.d.ts +4 -0
- package/adapters/index.js +32 -0
- package/adapters/index.js.map +1 -0
- package/adapters/json.d.ts +6 -0
- package/adapters/json.js +23 -0
- package/adapters/json.js.map +1 -0
- package/adapters/xliff.d.ts +6 -0
- package/adapters/xliff.js +35 -0
- package/adapters/xliff.js.map +1 -0
- package/cli/cli.d.ts +2 -0
- package/cli/cli.js +129 -0
- package/cli/cli.js.map +1 -0
- package/cli/collect.d.ts +14 -0
- package/{src/cli/collect.ts → cli/collect.js} +59 -75
- package/cli/collect.js.map +1 -0
- package/cli/interfaces.js +3 -0
- package/cli/interfaces.js.map +1 -0
- package/cli/reconciliate.d.ts +6 -0
- package/{src/cli/reconciliate.ts → cli/reconciliate.js} +35 -40
- package/cli/reconciliate.js.map +1 -0
- package/cli/utils.d.ts +6 -0
- package/{src/cli/utils.ts → cli/utils.js} +16 -12
- package/cli/utils.js.map +1 -0
- package/core/default-locale.d.ts +10 -0
- package/{src/core/default-locale.tsx → core/default-locale.js} +23 -28
- package/core/default-locale.js.map +1 -0
- package/{src/core/interfaces.ts → core/interfaces.d.ts} +15 -20
- package/core/interfaces.js +3 -0
- package/core/interfaces.js.map +1 -0
- package/core/json-utils.d.ts +19 -0
- package/{src/core/json-utils.ts → core/json-utils.js} +27 -33
- package/core/json-utils.js.map +1 -0
- package/core/literal.d.ts +13 -0
- package/{src/core/literal.ts → core/literal.js} +20 -19
- package/core/literal.js.map +1 -0
- package/core/load.d.ts +32 -0
- package/core/load.js +50 -0
- package/core/load.js.map +1 -0
- package/core/locale-list.d.ts +27 -0
- package/{src/core/locale-list.ts → core/locale-list.js} +36 -37
- package/core/locale-list.js.map +1 -0
- package/core/locale.d.ts +15 -0
- package/{src/core/locale.tsx → core/locale.js} +29 -28
- package/core/locale.js.map +1 -0
- package/core/smartloc.d.ts +39 -0
- package/{src/core/smartloc.tsx → core/smartloc.js} +113 -120
- package/core/smartloc.js.map +1 -0
- package/core/tag.d.ts +13 -0
- package/core/tag.js +28 -0
- package/core/tag.js.map +1 -0
- package/core/utils.d.ts +4 -0
- package/core/utils.js +30 -0
- package/core/utils.js.map +1 -0
- package/express.d.ts +12 -0
- package/{src/express.ts → express.js} +33 -41
- package/express.js.map +1 -0
- package/graphql.d.ts +13 -0
- package/{src/graphql.ts → graphql.js} +62 -74
- package/graphql.js.map +1 -0
- package/index.js +30 -1
- package/index.js.map +1 -0
- package/node/index.d.ts +1 -0
- package/node/index.js +18 -0
- package/node/index.js.map +1 -0
- package/node/load.d.ts +12 -0
- package/node/load.js +37 -0
- package/node/load.js.map +1 -0
- package/package.json +3 -22
- package/.cursor/rules/use-bun-instead-of-node-vite-npm-pnpm.mdc +0 -111
- package/.vscode/launch.json +0 -65
- package/.vscode/settings.json +0 -14
- package/.vscode/tasks.json +0 -27
- package/build/README.md +0 -225
- package/build/package.json +0 -60
- package/bun.lock +0 -310
- package/samples/express/main.ts +0 -37
- package/samples/express/package.json +0 -10
- package/samples/graphql/main.ts +0 -73
- package/samples/graphql/package.json +0 -15
- package/src/adapters/adapter-base.ts +0 -58
- package/src/adapters/index.ts +0 -31
- package/src/adapters/json.ts +0 -18
- package/src/adapters/xliff.ts +0 -30
- package/src/cli/cli.ts +0 -137
- package/src/core/load.ts +0 -82
- package/src/core/tag.ts +0 -40
- package/src/core/utils.tsx +0 -24
- package/src/node/index.ts +0 -1
- package/src/node/load.ts +0 -32
- package/test/collect.spec.ts +0 -45
- package/test/reconciliation.spec.ts +0 -132
- package/test/serialization.spec.ts +0 -162
- package/test/translation.spec.ts +0 -61
- package/tsconfig.json +0 -37
- package/tslint.json +0 -103
- /package/{src/cli/interfaces.ts → cli/interfaces.d.ts} +0 -0
- /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
|
+
}
|
package/adapters/json.js
ADDED
|
@@ -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
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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"}
|
package/cli/collect.d.ts
ADDED
|
@@ -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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
?
|
|
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
|
|
23
|
-
const gitIgnorePath =
|
|
24
|
-
if (await
|
|
25
|
-
const content = await
|
|
26
|
-
ignore =
|
|
27
|
-
}
|
|
28
|
-
|
|
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
|
|
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 =
|
|
37
|
-
const fileRelative =
|
|
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
|
|
37
|
+
const stats = await fs_extra_1.default.stat(filepath);
|
|
42
38
|
if (stats.isDirectory()) {
|
|
43
39
|
yield* walk(fileRelative);
|
|
44
|
-
}
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
45
42
|
if (ignore.accepts(fileRelative)) {
|
|
46
43
|
yield fileRelative;
|
|
47
44
|
}
|
|
48
45
|
}
|
|
49
46
|
}
|
|
50
|
-
}
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
51
49
|
console.error('Failed to read directory ' + dirRelative);
|
|
52
50
|
}
|
|
53
51
|
}
|
|
54
|
-
|
|
55
|
-
const
|
|
56
|
-
|
|
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
|
|
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
|
-
|
|
86
|
-
console.error('Failed to read file ' + f + ': ' +
|
|
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
|
|
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
|
|
104
|
-
let dirty
|
|
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
|
-
}
|
|
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
|
|
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
|
|
140
|
+
let fm;
|
|
155
141
|
let index = 0;
|
|
156
142
|
let cnt = 0;
|
|
157
|
-
const parts
|
|
158
|
-
const idParts
|
|
159
|
-
while (fm = reFormat.exec(val
|
|
160
|
-
const literal = val
|
|
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
|
|
169
|
-
parts.push(val
|
|
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
|
-
}
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../src/cli/interfaces.ts"],"names":[],"mappings":""}
|