auto-lang 2.0.0 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +142 -85
- package/package.json +6 -7
- package/src/index.ts +5 -3
- package/src/utils/index.ts +2 -3
- package/src/utils/store.ts +1 -1
- package/src/utils/validation.ts +2 -2
- package/tsconfig.json +7 -5
- package/vite.config.ts +41 -0
- package/dist/interfaces/input-params.interface.js +0 -1
- package/dist/utils/index.js +0 -249
- package/dist/utils/logger.js +0 -13
- package/dist/utils/store.js +0 -20
- package/dist/utils/validation.js +0 -41
package/dist/index.js
CHANGED
@@ -1,88 +1,145 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
1
|
+
#!/usr/bin/env node
|
2
|
+
import { Command as $ } from "commander";
|
3
|
+
import c from "path";
|
4
|
+
import { existsSync as g, promises as d } from "fs";
|
5
|
+
import { createSpinner as y } from "nanospinner";
|
6
|
+
import O from "json-to-ts";
|
7
|
+
import x from "prettier";
|
8
|
+
import T from "chalk";
|
9
|
+
import F from "translate";
|
10
|
+
class p {
|
11
|
+
static error(e) {
|
12
|
+
console.log(`${T.red(e)}`);
|
13
|
+
}
|
14
|
+
static log(e) {
|
15
|
+
console.log(e);
|
16
|
+
}
|
17
|
+
}
|
18
|
+
class k {
|
19
|
+
inputParams = {
|
20
|
+
from: "",
|
21
|
+
to: [],
|
22
|
+
dir: "",
|
23
|
+
skipExisting: !1,
|
24
|
+
genType: "",
|
25
|
+
diff: ["", ""]
|
26
|
+
};
|
27
|
+
setInputParams(e) {
|
28
|
+
this.inputParams = e;
|
29
|
+
}
|
30
|
+
getInputParams() {
|
31
|
+
return this.inputParams;
|
32
|
+
}
|
33
|
+
}
|
34
|
+
const l = new k();
|
35
|
+
async function b(o, e, t) {
|
36
|
+
const { from: s, skipExisting: i } = l.getInputParams();
|
37
|
+
for (let [n, r] of Object.entries(o))
|
38
|
+
if (typeof r == "object")
|
39
|
+
e[n] = e[n] || {}, await b(r, e[n], t);
|
40
|
+
else
|
41
|
+
try {
|
42
|
+
e[n] && i || (e[n] = await F(r, {
|
43
|
+
from: s,
|
44
|
+
to: t
|
45
|
+
}));
|
46
|
+
} catch (a) {
|
47
|
+
console.log(`
|
48
|
+
`), p.error(a.message), process.exit(1);
|
49
|
+
}
|
50
|
+
}
|
51
|
+
const P = (o) => {
|
52
|
+
const { dir: e } = l.getInputParams();
|
53
|
+
return new Promise(async (t, s) => {
|
54
|
+
let i = {};
|
55
|
+
const n = await K(), r = c.join(process.cwd(), e, `${o}.json`);
|
56
|
+
g(r) && (i = await u(r)), await b(n, i, o), t(i);
|
57
|
+
});
|
9
58
|
};
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
59
|
+
async function h() {
|
60
|
+
const { dir: o, genType: e } = l.getInputParams(), t = y("Creating language type file").start(), s = u(
|
61
|
+
c.join(process.cwd(), o, `${e}.json`)
|
62
|
+
), i = O(s, {
|
63
|
+
rootName: "GlobalTranslationType"
|
64
|
+
}), n = c.join(process.cwd(), o, "types");
|
65
|
+
g(n) || await d.mkdir(n);
|
66
|
+
const r = c.join(n, "index"), a = `
|
67
|
+
type NestedKeyOf<ObjectType extends object> = {
|
68
|
+
[Key in keyof ObjectType & string]: ObjectType[Key] extends object
|
69
|
+
? // @ts-ignore
|
70
|
+
\`\${Key}.\${NestedKeyOf<ObjectType[Key]>}\`
|
71
|
+
: \`\${Key}\`
|
72
|
+
}[keyof ObjectType & string]
|
73
|
+
|
74
|
+
export type GlobalTranslation = NestedKeyOf<GlobalTranslationType>;
|
75
|
+
|
76
|
+
${i.join(`
|
77
|
+
|
78
|
+
`)}
|
79
|
+
`, f = await x.format(a, {
|
80
|
+
parser: "typescript"
|
81
|
+
});
|
82
|
+
await d.writeFile(r, f), t.success({ text: "Language type file created" });
|
83
|
+
}
|
84
|
+
async function I() {
|
85
|
+
const { to: o, dir: e } = l.getInputParams();
|
86
|
+
let t, s, i;
|
87
|
+
for (let n of o)
|
88
|
+
s = c.join(process.cwd(), e, `${n}.json`), t = y(`Translating to ${n}...`).start(), i = await P(n), await d.writeFile(s, JSON.stringify(i, null, 2)), t.success({ text: "Complete" });
|
89
|
+
}
|
90
|
+
async function u(o) {
|
91
|
+
return JSON.parse(await d.readFile(o, { encoding: "utf-8" }));
|
92
|
+
}
|
93
|
+
function K() {
|
94
|
+
const { dir: o, from: e } = l.getInputParams(), t = c.join(process.cwd(), o, `${e}.json`);
|
95
|
+
return u(t);
|
96
|
+
}
|
97
|
+
function v(o, e) {
|
98
|
+
const t = [];
|
99
|
+
function s(i, n, r = "") {
|
100
|
+
for (let [a, f] of Object.entries(i)) {
|
101
|
+
const m = r ? `${r}.${a}` : a;
|
102
|
+
typeof f == "object" ? n[a] ? s(f, n[a], m) : t.push(m) : n[a] || t.push(m);
|
35
103
|
}
|
36
|
-
}
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
_b.label = 5;
|
77
|
-
case 5:
|
78
|
-
if (!diff) return [3 /*break*/, 7];
|
79
|
-
return [4 /*yield*/, showLangDiff()];
|
80
|
-
case 6:
|
81
|
-
_b.sent();
|
82
|
-
_b.label = 7;
|
83
|
-
case 7: return [2 /*return*/];
|
84
|
-
}
|
85
|
-
});
|
86
|
-
});
|
104
|
+
}
|
105
|
+
return s(o, e), t;
|
106
|
+
}
|
107
|
+
async function C() {
|
108
|
+
const o = y("Comparing language files").start(), { dir: e, diff: t } = l.getInputParams(), s = t[0], i = t[1], n = await u(
|
109
|
+
c.join(process.cwd(), e, `${s}.json`)
|
110
|
+
), r = await u(
|
111
|
+
c.join(process.cwd(), e, `${i}.json`)
|
112
|
+
), a = v(n, r);
|
113
|
+
p.log(`
|
114
|
+
Missing keys in ${i}.json compared to ${s}.json
|
115
|
+
`), p.log(a.join(`
|
116
|
+
`) || "No missing keys"), o.success({ text: "Comparison complete" });
|
117
|
+
}
|
118
|
+
function N(o) {
|
119
|
+
Object.keys(o).length || (p.error('Invalid arguments. Use "--help" for usage'), process.exit(1));
|
120
|
+
const { to: e, from: t, dir: s, genType: i, diff: n } = o;
|
121
|
+
(t && !e || e && !t) && (p.error('"--from" and "--to" are dependent options'), process.exit(1));
|
122
|
+
const r = c.join(process.cwd(), s, `${t}.json`), a = c.join(process.cwd(), s, `${i}.json`);
|
123
|
+
if (!g(r) && t && (p.error(`File "${r}" not found`), process.exit(1)), !g(a) && i && (p.error(`File "${a}" not found`), process.exit(1)), n) {
|
124
|
+
n.length !== 2 && (p.error('"--diff" option requires two languages'), process.exit(1));
|
125
|
+
const [f, m] = n, j = c.join(process.cwd(), s, `${f}.json`), w = c.join(process.cwd(), s, `${m}.json`);
|
126
|
+
g(j) || (p.error(`File "${j}" not found`), process.exit(1)), g(w) || (p.error(`File "${w}" not found`), process.exit(1));
|
127
|
+
}
|
128
|
+
}
|
129
|
+
async function S() {
|
130
|
+
const e = (await u(c.join(process.cwd(), "package.json"))).version, t = new $();
|
131
|
+
t.name("auto-lang").description("Generate translation files for multiple languages (i18n)").version(e).option("-f, --from <lang>", "language to translate from").option(
|
132
|
+
"-t, --to <lang...>",
|
133
|
+
"languages to translate to (seperated by space)"
|
134
|
+
).option(
|
135
|
+
"-d, --dir <directory>",
|
136
|
+
"directory containing the language files",
|
137
|
+
"translations"
|
138
|
+
).option("-s, --skip-existing", "skip existing keys during translation").option("-g, --gen-type <lang>", "generate types from language file").option(
|
139
|
+
"-d, --diff <lang...>",
|
140
|
+
"show missing keys between two language files"
|
141
|
+
).parse(), N(t.opts()), l.setInputParams(t.opts());
|
142
|
+
const { from: s, to: i, genType: n, diff: r } = l.getInputParams();
|
143
|
+
s && i && await I(), n && await h(), r && await C();
|
87
144
|
}
|
88
|
-
|
145
|
+
S();
|
package/package.json
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
{
|
2
2
|
"name": "auto-lang",
|
3
|
-
"version": "2.0.
|
3
|
+
"version": "2.0.2",
|
4
4
|
"description": "Automatically create language json files for internationalization",
|
5
5
|
"main": "./src/index.js",
|
6
6
|
"type": "module",
|
7
7
|
"scripts": {
|
8
8
|
"test": "echo \"Error: no test specified\" && exit 1",
|
9
|
-
"dev": "
|
10
|
-
"build": "rm -rf dist &&
|
9
|
+
"dev": "rm -rf dist && vite build --mode watch",
|
10
|
+
"build": "rm -rf dist && vite build"
|
11
11
|
},
|
12
12
|
"keywords": [
|
13
13
|
"Internationalization",
|
@@ -30,16 +30,15 @@
|
|
30
30
|
"commander": "^9.4.0",
|
31
31
|
"json-to-ts": "^1.7.0",
|
32
32
|
"nanospinner": "^1.1.0",
|
33
|
+
"prettier": "^3.4.2",
|
33
34
|
"translate": "^1.4.1"
|
34
35
|
},
|
35
36
|
"devDependencies": {
|
36
37
|
"@types/chalk": "^2.2.4",
|
37
38
|
"@types/node": "^22.10.1",
|
38
|
-
"@webpack-cli/generators": "^3.0.7",
|
39
|
-
"prettier": "^3.4.2",
|
40
39
|
"ts-loader": "^9.5.1",
|
41
40
|
"typescript": "^5.7.2",
|
42
|
-
"
|
43
|
-
"
|
41
|
+
"vite": "^6.0.3",
|
42
|
+
"vite-plugin-checker": "^0.8.0"
|
44
43
|
}
|
45
44
|
}
|
package/src/index.ts
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
#!/usr/bin/env node
|
2
|
+
|
1
3
|
import { Command } from 'commander';
|
2
4
|
import path from 'path';
|
3
5
|
|
@@ -6,9 +8,9 @@ import {
|
|
6
8
|
parseJsonFile,
|
7
9
|
showLangDiff,
|
8
10
|
translateFile,
|
9
|
-
} from './utils
|
10
|
-
import { validateUserInput } from './utils/validation
|
11
|
-
import { store } from './utils/store
|
11
|
+
} from './utils';
|
12
|
+
import { validateUserInput } from './utils/validation';
|
13
|
+
import { store } from './utils/store';
|
12
14
|
|
13
15
|
async function main() {
|
14
16
|
const pjson = await parseJsonFile(path.join(process.cwd(), 'package.json'));
|
package/src/utils/index.ts
CHANGED
@@ -8,8 +8,8 @@ import { Logger } from './logger.js';
|
|
8
8
|
|
9
9
|
// @ts-expect-error
|
10
10
|
import translate from 'translate';
|
11
|
-
import { TranslationObject } from '../interfaces/input-params.interface
|
12
|
-
import { store } from './store
|
11
|
+
import { TranslationObject } from '../interfaces/input-params.interface';
|
12
|
+
import { store } from './store';
|
13
13
|
|
14
14
|
async function makeTranslatedCopy(
|
15
15
|
source: TranslationObject,
|
@@ -67,7 +67,6 @@ export async function createDeclarationFile() {
|
|
67
67
|
path.join(process.cwd(), dir, `${genType}.json`),
|
68
68
|
);
|
69
69
|
|
70
|
-
// @ts-expect-error
|
71
70
|
const interfaces = JsonToTS(langObject, {
|
72
71
|
rootName: 'GlobalTranslationType',
|
73
72
|
});
|
package/src/utils/store.ts
CHANGED
package/src/utils/validation.ts
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
import { existsSync } from 'fs';
|
2
2
|
import path from 'path';
|
3
3
|
|
4
|
-
import { IInputParams } from '../interfaces/input-params.interface
|
5
|
-
import { Logger } from './logger
|
4
|
+
import { IInputParams } from '../interfaces/input-params.interface';
|
5
|
+
import { Logger } from './logger';
|
6
6
|
|
7
7
|
export function validateUserInput(params: IInputParams) {
|
8
8
|
if (!Object.keys(params).length) {
|
package/tsconfig.json
CHANGED
@@ -1,15 +1,17 @@
|
|
1
1
|
{
|
2
2
|
"compilerOptions": {
|
3
|
-
"target": "
|
4
|
-
"module": "
|
3
|
+
"target": "ESNext",
|
4
|
+
"module": "ESNext",
|
5
5
|
"outDir": "./dist",
|
6
6
|
"rootDir": "./src",
|
7
7
|
"strict": true,
|
8
8
|
"esModuleInterop": true,
|
9
9
|
"forceConsistentCasingInFileNames": true,
|
10
|
-
"skipLibCheck": true
|
11
|
-
|
12
|
-
|
10
|
+
"skipLibCheck": true,
|
11
|
+
"allowJs": true,
|
12
|
+
"moduleResolution": "bundler",
|
13
|
+
"resolveJsonModule": true,
|
14
|
+
"noEmit": true
|
13
15
|
},
|
14
16
|
"exclude": ["node_modules"],
|
15
17
|
"include": ["src/**/*"]
|
package/vite.config.ts
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
import { defineConfig } from 'vite';
|
2
|
+
import { builtinModules } from 'module';
|
3
|
+
|
4
|
+
import packageJson from './package.json' assert { type: 'json' };
|
5
|
+
import Checker from 'vite-plugin-checker';
|
6
|
+
|
7
|
+
const dependencies = Object.keys(packageJson.dependencies);
|
8
|
+
const devDependencies = Object.keys(packageJson.devDependencies);
|
9
|
+
|
10
|
+
export default defineConfig(({ mode }) => {
|
11
|
+
const isWatch = mode === 'watch';
|
12
|
+
|
13
|
+
return {
|
14
|
+
build: {
|
15
|
+
minify: true,
|
16
|
+
lib: {
|
17
|
+
entry: 'src/index.ts',
|
18
|
+
formats: ['es'],
|
19
|
+
fileName: () => 'index.js',
|
20
|
+
},
|
21
|
+
rollupOptions: {
|
22
|
+
external: [
|
23
|
+
...builtinModules,
|
24
|
+
...dependencies,
|
25
|
+
...devDependencies,
|
26
|
+
/^node:/,
|
27
|
+
],
|
28
|
+
},
|
29
|
+
target: 'node16',
|
30
|
+
outDir: 'dist',
|
31
|
+
watch: isWatch
|
32
|
+
? {
|
33
|
+
include: ['src/**/*'],
|
34
|
+
exclude: ['node_modules', 'dist'],
|
35
|
+
clearScreen: true,
|
36
|
+
}
|
37
|
+
: null,
|
38
|
+
},
|
39
|
+
plugins: [Checker({ typescript: true })],
|
40
|
+
};
|
41
|
+
});
|
@@ -1 +0,0 @@
|
|
1
|
-
export {};
|
package/dist/utils/index.js
DELETED
@@ -1,249 +0,0 @@
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
8
|
-
});
|
9
|
-
};
|
10
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
11
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
12
|
-
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
13
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
14
|
-
function step(op) {
|
15
|
-
if (f) throw new TypeError("Generator is already executing.");
|
16
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
17
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
18
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
19
|
-
switch (op[0]) {
|
20
|
-
case 0: case 1: t = op; break;
|
21
|
-
case 4: _.label++; return { value: op[1], done: false };
|
22
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
23
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
24
|
-
default:
|
25
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
26
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
27
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
28
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
29
|
-
if (t[2]) _.ops.pop();
|
30
|
-
_.trys.pop(); continue;
|
31
|
-
}
|
32
|
-
op = body.call(thisArg, _);
|
33
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
34
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
35
|
-
}
|
36
|
-
};
|
37
|
-
import path from 'path';
|
38
|
-
import { existsSync, promises as fs } from 'fs';
|
39
|
-
import { createSpinner } from 'nanospinner';
|
40
|
-
import JsonToTS from 'json-to-ts';
|
41
|
-
import prettier from 'prettier';
|
42
|
-
import { Logger } from './logger.js';
|
43
|
-
// @ts-expect-error
|
44
|
-
import translate from 'translate';
|
45
|
-
import { store } from './store.js';
|
46
|
-
function makeTranslatedCopy(source, target, targetLang) {
|
47
|
-
return __awaiter(this, void 0, void 0, function () {
|
48
|
-
var _a, from, skipExisting, _i, _b, _c, key, value, _d, _e, err_1;
|
49
|
-
return __generator(this, function (_f) {
|
50
|
-
switch (_f.label) {
|
51
|
-
case 0:
|
52
|
-
_a = store.getInputParams(), from = _a.from, skipExisting = _a.skipExisting;
|
53
|
-
_i = 0, _b = Object.entries(source);
|
54
|
-
_f.label = 1;
|
55
|
-
case 1:
|
56
|
-
if (!(_i < _b.length)) return [3 /*break*/, 8];
|
57
|
-
_c = _b[_i], key = _c[0], value = _c[1];
|
58
|
-
if (!(typeof value === 'object')) return [3 /*break*/, 3];
|
59
|
-
target[key] = target[key] || {};
|
60
|
-
return [4 /*yield*/, makeTranslatedCopy(value, target[key], targetLang)];
|
61
|
-
case 2:
|
62
|
-
_f.sent();
|
63
|
-
return [3 /*break*/, 7];
|
64
|
-
case 3:
|
65
|
-
_f.trys.push([3, 6, , 7]);
|
66
|
-
if (!!(target[key] && skipExisting)) return [3 /*break*/, 5];
|
67
|
-
_d = target;
|
68
|
-
_e = key;
|
69
|
-
return [4 /*yield*/, translate(value, {
|
70
|
-
from: from,
|
71
|
-
to: targetLang,
|
72
|
-
})];
|
73
|
-
case 4:
|
74
|
-
_d[_e] = _f.sent();
|
75
|
-
_f.label = 5;
|
76
|
-
case 5: return [3 /*break*/, 7];
|
77
|
-
case 6:
|
78
|
-
err_1 = _f.sent();
|
79
|
-
console.log('\n');
|
80
|
-
Logger.error(err_1.message);
|
81
|
-
process.exit(1);
|
82
|
-
return [3 /*break*/, 7];
|
83
|
-
case 7:
|
84
|
-
_i++;
|
85
|
-
return [3 /*break*/, 1];
|
86
|
-
case 8: return [2 /*return*/];
|
87
|
-
}
|
88
|
-
});
|
89
|
-
});
|
90
|
-
}
|
91
|
-
var getTranslationObject = function (lang) {
|
92
|
-
var dir = store.getInputParams().dir;
|
93
|
-
return new Promise(function (resolve, reject) { return __awaiter(void 0, void 0, void 0, function () {
|
94
|
-
var translatedObj, inputLangObj, outputFile;
|
95
|
-
return __generator(this, function (_a) {
|
96
|
-
switch (_a.label) {
|
97
|
-
case 0:
|
98
|
-
translatedObj = {};
|
99
|
-
return [4 /*yield*/, getInputLangObject()];
|
100
|
-
case 1:
|
101
|
-
inputLangObj = _a.sent();
|
102
|
-
outputFile = path.join(process.cwd(), dir, "".concat(lang, ".json"));
|
103
|
-
if (!existsSync(outputFile)) return [3 /*break*/, 3];
|
104
|
-
return [4 /*yield*/, parseJsonFile(outputFile)];
|
105
|
-
case 2:
|
106
|
-
translatedObj = _a.sent();
|
107
|
-
_a.label = 3;
|
108
|
-
case 3: return [4 /*yield*/, makeTranslatedCopy(inputLangObj, translatedObj, lang)];
|
109
|
-
case 4:
|
110
|
-
_a.sent();
|
111
|
-
resolve(translatedObj);
|
112
|
-
return [2 /*return*/];
|
113
|
-
}
|
114
|
-
});
|
115
|
-
}); });
|
116
|
-
};
|
117
|
-
export function createDeclarationFile() {
|
118
|
-
return __awaiter(this, void 0, void 0, function () {
|
119
|
-
var _a, dir, genType, spinner, langObject, interfaces, typesDir, declarationFile, result, formattedContent;
|
120
|
-
return __generator(this, function (_b) {
|
121
|
-
switch (_b.label) {
|
122
|
-
case 0:
|
123
|
-
_a = store.getInputParams(), dir = _a.dir, genType = _a.genType;
|
124
|
-
spinner = createSpinner('Creating language type file').start();
|
125
|
-
langObject = parseJsonFile(path.join(process.cwd(), dir, "".concat(genType, ".json")));
|
126
|
-
interfaces = JsonToTS(langObject, {
|
127
|
-
rootName: 'GlobalTranslationType',
|
128
|
-
});
|
129
|
-
typesDir = path.join(process.cwd(), dir, 'types');
|
130
|
-
if (!!existsSync(typesDir)) return [3 /*break*/, 2];
|
131
|
-
return [4 /*yield*/, fs.mkdir(typesDir)];
|
132
|
-
case 1:
|
133
|
-
_b.sent();
|
134
|
-
_b.label = 2;
|
135
|
-
case 2:
|
136
|
-
declarationFile = path.join(typesDir, 'index');
|
137
|
-
result = "\n type NestedKeyOf<ObjectType extends object> = {\n [Key in keyof ObjectType & string]: ObjectType[Key] extends object\n ? // @ts-ignore\n `${Key}.${NestedKeyOf<ObjectType[Key]>}`\n : `${Key}`\n }[keyof ObjectType & string]\n\n export type GlobalTranslation = NestedKeyOf<GlobalTranslationType>;\n\n ".concat(interfaces.join('\n\n'), "\n ");
|
138
|
-
return [4 /*yield*/, prettier.format(result, {
|
139
|
-
parser: 'typescript',
|
140
|
-
})];
|
141
|
-
case 3:
|
142
|
-
formattedContent = _b.sent();
|
143
|
-
return [4 /*yield*/, fs.writeFile(declarationFile, formattedContent)];
|
144
|
-
case 4:
|
145
|
-
_b.sent();
|
146
|
-
spinner.success({ text: 'Language type file created' });
|
147
|
-
return [2 /*return*/];
|
148
|
-
}
|
149
|
-
});
|
150
|
-
});
|
151
|
-
}
|
152
|
-
export function translateFile() {
|
153
|
-
return __awaiter(this, void 0, void 0, function () {
|
154
|
-
var _a, to, dir, spinner, langFile, translationObject, _i, to_1, lang;
|
155
|
-
return __generator(this, function (_b) {
|
156
|
-
switch (_b.label) {
|
157
|
-
case 0:
|
158
|
-
_a = store.getInputParams(), to = _a.to, dir = _a.dir;
|
159
|
-
_i = 0, to_1 = to;
|
160
|
-
_b.label = 1;
|
161
|
-
case 1:
|
162
|
-
if (!(_i < to_1.length)) return [3 /*break*/, 5];
|
163
|
-
lang = to_1[_i];
|
164
|
-
langFile = path.join(process.cwd(), dir, "".concat(lang, ".json"));
|
165
|
-
spinner = createSpinner("Translating to ".concat(lang, "...")).start();
|
166
|
-
return [4 /*yield*/, getTranslationObject(lang)];
|
167
|
-
case 2:
|
168
|
-
translationObject = _b.sent();
|
169
|
-
return [4 /*yield*/, fs.writeFile(langFile, JSON.stringify(translationObject, null, 2))];
|
170
|
-
case 3:
|
171
|
-
_b.sent();
|
172
|
-
spinner.success({ text: "Complete" });
|
173
|
-
_b.label = 4;
|
174
|
-
case 4:
|
175
|
-
_i++;
|
176
|
-
return [3 /*break*/, 1];
|
177
|
-
case 5: return [2 /*return*/];
|
178
|
-
}
|
179
|
-
});
|
180
|
-
});
|
181
|
-
}
|
182
|
-
export function parseJsonFile(filePath) {
|
183
|
-
return __awaiter(this, void 0, void 0, function () {
|
184
|
-
var _a, _b;
|
185
|
-
return __generator(this, function (_c) {
|
186
|
-
switch (_c.label) {
|
187
|
-
case 0:
|
188
|
-
_b = (_a = JSON).parse;
|
189
|
-
return [4 /*yield*/, fs.readFile(filePath, { encoding: 'utf-8' })];
|
190
|
-
case 1: return [2 /*return*/, _b.apply(_a, [_c.sent()])];
|
191
|
-
}
|
192
|
-
});
|
193
|
-
});
|
194
|
-
}
|
195
|
-
function getInputLangObject() {
|
196
|
-
var _a = store.getInputParams(), dir = _a.dir, from = _a.from;
|
197
|
-
var inputFile = path.join(process.cwd(), dir, "".concat(from, ".json"));
|
198
|
-
return parseJsonFile(inputFile);
|
199
|
-
}
|
200
|
-
function getMissingKeys(source, target) {
|
201
|
-
var missingKeys = [];
|
202
|
-
function loop(source, target, path) {
|
203
|
-
if (path === void 0) { path = ''; }
|
204
|
-
for (var _i = 0, _a = Object.entries(source); _i < _a.length; _i++) {
|
205
|
-
var _b = _a[_i], key = _b[0], value = _b[1];
|
206
|
-
var currentPath = path ? "".concat(path, ".").concat(key) : key;
|
207
|
-
if (typeof value === 'object') {
|
208
|
-
if (target[key]) {
|
209
|
-
loop(value, target[key], currentPath);
|
210
|
-
}
|
211
|
-
else {
|
212
|
-
missingKeys.push(currentPath);
|
213
|
-
}
|
214
|
-
}
|
215
|
-
else {
|
216
|
-
if (!target[key]) {
|
217
|
-
missingKeys.push(currentPath);
|
218
|
-
}
|
219
|
-
}
|
220
|
-
}
|
221
|
-
}
|
222
|
-
loop(source, target);
|
223
|
-
return missingKeys;
|
224
|
-
}
|
225
|
-
export function showLangDiff() {
|
226
|
-
return __awaiter(this, void 0, void 0, function () {
|
227
|
-
var spinner, _a, dir, diff, lang1, lang2, lang1Object, lang2Object, missingKeys;
|
228
|
-
return __generator(this, function (_b) {
|
229
|
-
switch (_b.label) {
|
230
|
-
case 0:
|
231
|
-
spinner = createSpinner('Comparing language files').start();
|
232
|
-
_a = store.getInputParams(), dir = _a.dir, diff = _a.diff;
|
233
|
-
lang1 = diff[0];
|
234
|
-
lang2 = diff[1];
|
235
|
-
return [4 /*yield*/, parseJsonFile(path.join(process.cwd(), dir, "".concat(lang1, ".json")))];
|
236
|
-
case 1:
|
237
|
-
lang1Object = _b.sent();
|
238
|
-
return [4 /*yield*/, parseJsonFile(path.join(process.cwd(), dir, "".concat(lang2, ".json")))];
|
239
|
-
case 2:
|
240
|
-
lang2Object = _b.sent();
|
241
|
-
missingKeys = getMissingKeys(lang1Object, lang2Object);
|
242
|
-
Logger.log("\nMissing keys in ".concat(lang2, ".json compared to ").concat(lang1, ".json\n"));
|
243
|
-
Logger.log(missingKeys.join('\n') || 'No missing keys');
|
244
|
-
spinner.success({ text: 'Comparison complete' });
|
245
|
-
return [2 /*return*/];
|
246
|
-
}
|
247
|
-
});
|
248
|
-
});
|
249
|
-
}
|
package/dist/utils/logger.js
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
import chalk from 'chalk';
|
2
|
-
var Logger = /** @class */ (function () {
|
3
|
-
function Logger() {
|
4
|
-
}
|
5
|
-
Logger.error = function (message) {
|
6
|
-
console.log("".concat(chalk.red(message)));
|
7
|
-
};
|
8
|
-
Logger.log = function (message) {
|
9
|
-
console.log(message);
|
10
|
-
};
|
11
|
-
return Logger;
|
12
|
-
}());
|
13
|
-
export { Logger };
|
package/dist/utils/store.js
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
var Store = /** @class */ (function () {
|
2
|
-
function Store() {
|
3
|
-
this.inputParams = {
|
4
|
-
from: '',
|
5
|
-
to: [],
|
6
|
-
dir: '',
|
7
|
-
skipExisting: false,
|
8
|
-
genType: '',
|
9
|
-
diff: ['', ''],
|
10
|
-
};
|
11
|
-
}
|
12
|
-
Store.prototype.setInputParams = function (params) {
|
13
|
-
this.inputParams = params;
|
14
|
-
};
|
15
|
-
Store.prototype.getInputParams = function () {
|
16
|
-
return this.inputParams;
|
17
|
-
};
|
18
|
-
return Store;
|
19
|
-
}());
|
20
|
-
export var store = new Store();
|
package/dist/utils/validation.js
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
import { existsSync } from 'fs';
|
2
|
-
import path from 'path';
|
3
|
-
import { Logger } from './logger.js';
|
4
|
-
export function validateUserInput(params) {
|
5
|
-
if (!Object.keys(params).length) {
|
6
|
-
Logger.error("Invalid arguments. Use \"--help\" for usage");
|
7
|
-
process.exit(1);
|
8
|
-
}
|
9
|
-
var to = params.to, from = params.from, dir = params.dir, genType = params.genType, diff = params.diff;
|
10
|
-
if ((from && !to) || (to && !from)) {
|
11
|
-
Logger.error("\"--from\" and \"--to\" are dependent options");
|
12
|
-
process.exit(1);
|
13
|
-
}
|
14
|
-
var inputFilePath = path.join(process.cwd(), dir, "".concat(from, ".json"));
|
15
|
-
var genTypeFilePath = path.join(process.cwd(), dir, "".concat(genType, ".json"));
|
16
|
-
if (!existsSync(inputFilePath) && from) {
|
17
|
-
Logger.error("File \"".concat(inputFilePath, "\" not found"));
|
18
|
-
process.exit(1);
|
19
|
-
}
|
20
|
-
if (!existsSync(genTypeFilePath) && genType) {
|
21
|
-
Logger.error("File \"".concat(genTypeFilePath, "\" not found"));
|
22
|
-
process.exit(1);
|
23
|
-
}
|
24
|
-
if (diff) {
|
25
|
-
if (diff.length !== 2) {
|
26
|
-
Logger.error("\"--diff\" option requires two languages");
|
27
|
-
process.exit(1);
|
28
|
-
}
|
29
|
-
var lang1 = diff[0], lang2 = diff[1];
|
30
|
-
var lang1File = path.join(process.cwd(), dir, "".concat(lang1, ".json"));
|
31
|
-
var lang2File = path.join(process.cwd(), dir, "".concat(lang2, ".json"));
|
32
|
-
if (!existsSync(lang1File)) {
|
33
|
-
Logger.error("File \"".concat(lang1File, "\" not found"));
|
34
|
-
process.exit(1);
|
35
|
-
}
|
36
|
-
if (!existsSync(lang2File)) {
|
37
|
-
Logger.error("File \"".concat(lang2File, "\" not found"));
|
38
|
-
process.exit(1);
|
39
|
-
}
|
40
|
-
}
|
41
|
-
}
|