@localheroai/cli 0.0.3 → 0.0.6
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/README +1 -1
- package/dist/api/auth.d.ts +2 -0
- package/dist/api/auth.js +28 -0
- package/dist/api/auth.js.map +1 -0
- package/dist/api/client.d.ts +3 -0
- package/dist/api/client.js +80 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/imports.d.ts +5 -0
- package/dist/api/imports.js +43 -0
- package/dist/api/imports.js.map +1 -0
- package/dist/api/projects.d.ts +2 -0
- package/dist/api/projects.js +42 -0
- package/dist/api/projects.js.map +1 -0
- package/dist/api/translations.d.ts +15 -0
- package/dist/api/translations.js +71 -0
- package/dist/api/translations.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +79 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/_sync.js +22 -0
- package/dist/commands/_sync.js.map +1 -0
- package/dist/commands/_translate.js +3 -0
- package/dist/commands/_translate.js.map +1 -0
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.js +439 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/login.d.ts +16 -0
- package/dist/commands/login.js +58 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/pull.js +22 -0
- package/dist/commands/pull.js.map +1 -0
- package/dist/commands/push.js +56 -0
- package/dist/commands/push.js.map +1 -0
- package/dist/commands/sync.d.ts +20 -0
- package/dist/commands/sync.js +22 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/translate.d.ts +14 -0
- package/dist/commands/translate.js +145 -0
- package/dist/commands/translate.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +75 -0
- package/dist/types/index.js +17 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/translate/index.js +2 -0
- package/dist/types/translate/index.js.map +1 -0
- package/dist/utils/auth.d.ts +2 -0
- package/dist/utils/auth.js +29 -0
- package/dist/utils/auth.js.map +1 -0
- package/dist/utils/common.js +9 -0
- package/dist/utils/common.js.map +1 -0
- package/dist/utils/config.d.ts +23 -0
- package/dist/utils/config.js +137 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/errors.js +37 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/files.d.ts +32 -0
- package/dist/utils/files.js +347 -0
- package/dist/utils/files.js.map +1 -0
- package/dist/utils/git.d.ts +21 -0
- package/dist/utils/git.js +87 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/github.d.ts +241 -0
- package/dist/utils/github.js +161 -0
- package/dist/utils/github.js.map +1 -0
- package/dist/utils/import-service.d.ts +4 -0
- package/dist/utils/import-service.js +218 -0
- package/dist/utils/import-service.js.map +1 -0
- package/dist/utils/prompt-service.d.ts +44 -0
- package/dist/utils/prompt-service.js +104 -0
- package/dist/utils/prompt-service.js.map +1 -0
- package/dist/utils/sync-service.d.ts +58 -0
- package/dist/utils/sync-service.js +159 -0
- package/dist/utils/sync-service.js.map +1 -0
- package/dist/utils/translation-processor.js +197 -0
- package/dist/utils/translation-processor.js.map +1 -0
- package/dist/utils/translation-updater/common.d.ts +6 -0
- package/{src → dist}/utils/translation-updater/common.js +16 -10
- package/dist/utils/translation-updater/common.js.map +1 -0
- package/dist/utils/translation-updater/index.d.ts +5 -0
- package/{src → dist}/utils/translation-updater/index.js +21 -9
- package/dist/utils/translation-updater/index.js.map +1 -0
- package/dist/utils/translation-updater/json-handler.d.ts +5 -0
- package/{src → dist}/utils/translation-updater/json-handler.js +42 -31
- package/dist/utils/translation-updater/json-handler.js.map +1 -0
- package/dist/utils/translation-updater/yaml-handler.d.ts +5 -0
- package/{src → dist}/utils/translation-updater/yaml-handler.js +40 -41
- package/dist/utils/translation-updater/yaml-handler.js.map +1 -0
- package/dist/utils/translation-utils.d.ts +30 -0
- package/dist/utils/translation-utils.js +324 -0
- package/dist/utils/translation-utils.js.map +1 -0
- package/dist/utils/updater.js +38 -0
- package/dist/utils/updater.js.map +1 -0
- package/package.json +33 -28
- package/src/api/auth.js +0 -24
- package/src/api/client.js +0 -83
- package/src/api/imports.js +0 -22
- package/src/api/projects.js +0 -24
- package/src/api/translations.js +0 -58
- package/src/cli.js +0 -78
- package/src/commands/init.js +0 -485
- package/src/commands/login.js +0 -80
- package/src/commands/sync.js +0 -28
- package/src/commands/translate.js +0 -262
- package/src/utils/auth.js +0 -23
- package/src/utils/config.js +0 -125
- package/src/utils/files.js +0 -361
- package/src/utils/git.js +0 -72
- package/src/utils/github.js +0 -122
- package/src/utils/import-service.js +0 -129
- package/src/utils/prompt-service.js +0 -67
- package/src/utils/sync-service.js +0 -147
- package/src/utils/translation-utils.js +0 -237
|
@@ -2,35 +2,47 @@ import path from 'path';
|
|
|
2
2
|
import { fileExists, ensureDirectoryExists } from './common.js';
|
|
3
3
|
import { updateYamlFile, deleteKeysFromYamlFile } from './yaml-handler.js';
|
|
4
4
|
import { updateJsonFile, deleteKeysFromJsonFile } from './json-handler.js';
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
/**
|
|
6
|
+
* Updates a translation file with new translations
|
|
7
|
+
*
|
|
8
|
+
* @param filePath Path to the file to update
|
|
9
|
+
* @param translations Dictionary of translations to add/update
|
|
10
|
+
* @param languageCode The language code (default: 'en')
|
|
11
|
+
* @param sourceFilePath Optional path to source file (needed for new files)
|
|
12
|
+
* @returns Information about the update operation
|
|
13
|
+
*/
|
|
14
|
+
export async function updateTranslationFile(filePath, translations, languageCode = 'en', sourceFilePath = null) {
|
|
7
15
|
const fileExt = path.extname(filePath).slice(1).toLowerCase();
|
|
8
16
|
const result = {
|
|
9
17
|
updatedKeys: Object.keys(translations),
|
|
10
18
|
created: false
|
|
11
19
|
};
|
|
12
|
-
|
|
13
20
|
await ensureDirectoryExists(filePath);
|
|
14
|
-
|
|
15
21
|
if (fileExt === 'json') {
|
|
16
|
-
const jsonResult = await updateJsonFile(filePath, translations, languageCode);
|
|
22
|
+
const jsonResult = await updateJsonFile(filePath, translations, languageCode, sourceFilePath);
|
|
17
23
|
return {
|
|
18
24
|
updatedKeys: result.updatedKeys,
|
|
19
25
|
created: jsonResult.created
|
|
20
26
|
};
|
|
21
27
|
}
|
|
22
|
-
|
|
23
28
|
return updateYamlFile(filePath, translations, languageCode);
|
|
24
29
|
}
|
|
25
|
-
|
|
30
|
+
/**
|
|
31
|
+
* Deletes keys from a translation file
|
|
32
|
+
*
|
|
33
|
+
* @param filePath Path to the file to update
|
|
34
|
+
* @param keysToDelete Array of dot-notation keys to delete
|
|
35
|
+
* @param languageCode The language code (default: 'en')
|
|
36
|
+
* @returns Array of keys that were successfully deleted
|
|
37
|
+
*/
|
|
26
38
|
export async function deleteKeysFromTranslationFile(filePath, keysToDelete, languageCode = 'en') {
|
|
27
39
|
const exists = await fileExists(filePath);
|
|
28
40
|
if (!exists) {
|
|
29
41
|
return [];
|
|
30
42
|
}
|
|
31
|
-
|
|
32
43
|
const fileExt = path.extname(filePath).slice(1).toLowerCase();
|
|
33
44
|
return fileExt === 'json'
|
|
34
45
|
? deleteKeysFromJsonFile(filePath, keysToDelete, languageCode)
|
|
35
46
|
: deleteKeysFromYamlFile(filePath, keysToDelete, languageCode);
|
|
36
|
-
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/translation-updater/index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAU3E;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,QAAgB,EAChB,YAAqC,EACrC,eAAuB,IAAI,EAC3B,iBAAgC,IAAI;IAEpC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAC9D,MAAM,MAAM,GAAiB;QAC3B,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;QACtC,OAAO,EAAE,KAAK;KACf,CAAC;IAEF,MAAM,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAEtC,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,CAAC,CAAC;QAC9F,OAAO;YACL,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,OAAO,EAAE,UAAU,CAAC,OAAO;SAC5B,CAAC;IACJ,CAAC;IAED,OAAO,cAAc,CAAC,QAAQ,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;AAC9D,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,QAAgB,EAChB,YAAsB,EACtB,eAAuB,IAAI;IAE3B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAC9D,OAAO,OAAO,KAAK,MAAM;QACvB,CAAC,CAAC,sBAAsB,CAAC,QAAQ,EAAE,YAAY,EAAE,YAAY,CAAC;QAC9D,CAAC,CAAC,sBAAsB,CAAC,QAAQ,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;AACnE,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export function updateJsonFile(filePath: any, translations: any, languageCode: any, sourceFilePath?: null): Promise<{
|
|
2
|
+
updatedKeys: string[];
|
|
3
|
+
created: boolean;
|
|
4
|
+
}>;
|
|
5
|
+
export function deleteKeysFromJsonFile(filePath: any, keysToDelete: any, languageCode: any): Promise<any[]>;
|
|
@@ -1,9 +1,21 @@
|
|
|
1
1
|
import { promises as fs } from 'fs';
|
|
2
|
-
import path from 'path';
|
|
3
2
|
import { detectJsonFormat, preserveJsonStructure } from '../files.js';
|
|
4
3
|
import { ensureDirectoryExists } from './common.js';
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
async function detectSourceFileStructure(sourceFilePath) {
|
|
5
|
+
try {
|
|
6
|
+
const content = await fs.readFile(sourceFilePath, 'utf8');
|
|
7
|
+
const sourceContent = JSON.parse(content);
|
|
8
|
+
const hasLanguageWrapper = Object.entries(sourceContent).some(([key, value]) => {
|
|
9
|
+
// Check if any top-level key is a language code with an object value
|
|
10
|
+
return typeof value === 'object' && value !== null && /^[a-zA-Z]{2}(-[a-zA-Z]{2})?$/.test(key);
|
|
11
|
+
});
|
|
12
|
+
return hasLanguageWrapper;
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
throw new Error(`Failed to read source file ${sourceFilePath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export async function updateJsonFile(filePath, translations, languageCode, sourceFilePath = null) {
|
|
7
19
|
try {
|
|
8
20
|
let existingContent = {};
|
|
9
21
|
let jsonFormat = 'nested';
|
|
@@ -12,49 +24,50 @@ export async function updateJsonFile(filePath, translations, languageCode) {
|
|
|
12
24
|
updatedKeys: Object.keys(translations),
|
|
13
25
|
created: false
|
|
14
26
|
};
|
|
15
|
-
|
|
16
27
|
try {
|
|
17
28
|
const content = await fs.readFile(filePath, 'utf8');
|
|
18
29
|
existingContent = JSON.parse(content);
|
|
19
30
|
if (existingContent[languageCode] && typeof existingContent[languageCode] === 'object') {
|
|
20
31
|
hasLanguageWrapper = true;
|
|
21
32
|
jsonFormat = detectJsonFormat(existingContent[languageCode]);
|
|
22
|
-
}
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
23
35
|
jsonFormat = detectJsonFormat(existingContent);
|
|
24
36
|
}
|
|
25
|
-
}
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
if (!sourceFilePath) {
|
|
40
|
+
throw new Error('Source file is required for creating new JSON translation files');
|
|
41
|
+
}
|
|
26
42
|
console.warn(`Creating new JSON file: ${filePath}`);
|
|
27
43
|
result.created = true;
|
|
28
44
|
await ensureDirectoryExists(filePath);
|
|
45
|
+
// Use source file structure
|
|
46
|
+
hasLanguageWrapper = await detectSourceFileStructure(sourceFilePath);
|
|
29
47
|
}
|
|
30
|
-
|
|
31
48
|
let updatedContent;
|
|
32
|
-
|
|
33
49
|
if (result.created) {
|
|
34
|
-
updatedContent =
|
|
35
|
-
[languageCode]: preserveJsonStructure({}, translations, jsonFormat)
|
|
36
|
-
|
|
37
|
-
}
|
|
50
|
+
updatedContent = hasLanguageWrapper ?
|
|
51
|
+
{ [languageCode]: preserveJsonStructure({}, translations, jsonFormat) } :
|
|
52
|
+
preserveJsonStructure({}, translations, jsonFormat);
|
|
53
|
+
}
|
|
54
|
+
else if (hasLanguageWrapper) {
|
|
38
55
|
existingContent[languageCode] = existingContent[languageCode] || {};
|
|
39
56
|
updatedContent = JSON.parse(JSON.stringify(existingContent));
|
|
40
|
-
const mergedContent = preserveJsonStructure(
|
|
41
|
-
existingContent[languageCode],
|
|
42
|
-
translations,
|
|
43
|
-
jsonFormat
|
|
44
|
-
);
|
|
57
|
+
const mergedContent = preserveJsonStructure(existingContent[languageCode], translations, jsonFormat);
|
|
45
58
|
updatedContent[languageCode] = mergedContent;
|
|
46
|
-
}
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
47
61
|
const existingCopy = JSON.parse(JSON.stringify(existingContent));
|
|
48
62
|
updatedContent = preserveJsonStructure(existingCopy, translations, jsonFormat);
|
|
49
63
|
}
|
|
50
|
-
|
|
51
64
|
await fs.writeFile(filePath, JSON.stringify(updatedContent, null, 2));
|
|
52
65
|
return result;
|
|
53
|
-
}
|
|
54
|
-
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
throw new Error(`Failed to update JSON file ${filePath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
55
69
|
}
|
|
56
70
|
}
|
|
57
|
-
|
|
58
71
|
export async function deleteKeysFromJsonFile(filePath, keysToDelete, languageCode) {
|
|
59
72
|
try {
|
|
60
73
|
const content = await fs.readFile(filePath, 'utf8');
|
|
@@ -65,9 +78,7 @@ export async function deleteKeysFromJsonFile(filePath, keysToDelete, languageCod
|
|
|
65
78
|
hasLanguageWrapper = true;
|
|
66
79
|
rootContent = jsonContent[languageCode];
|
|
67
80
|
}
|
|
68
|
-
|
|
69
81
|
const deletedKeys = [];
|
|
70
|
-
|
|
71
82
|
for (const keyPath of keysToDelete) {
|
|
72
83
|
const keys = keyPath.split('.');
|
|
73
84
|
const lastIndex = keys.length - 1;
|
|
@@ -75,7 +86,6 @@ export async function deleteKeysFromJsonFile(filePath, keysToDelete, languageCod
|
|
|
75
86
|
let parent = null;
|
|
76
87
|
let keyInParent = '';
|
|
77
88
|
let found = true;
|
|
78
|
-
|
|
79
89
|
for (let i = 0; i < lastIndex; i++) {
|
|
80
90
|
const key = keys[i];
|
|
81
91
|
if (!current[key] || typeof current[key] !== 'object') {
|
|
@@ -86,7 +96,6 @@ export async function deleteKeysFromJsonFile(filePath, keysToDelete, languageCod
|
|
|
86
96
|
keyInParent = key;
|
|
87
97
|
current = current[key];
|
|
88
98
|
}
|
|
89
|
-
|
|
90
99
|
if (found) {
|
|
91
100
|
const lastKey = keys[lastIndex];
|
|
92
101
|
if (current[lastKey] !== undefined) {
|
|
@@ -100,13 +109,15 @@ export async function deleteKeysFromJsonFile(filePath, keysToDelete, languageCod
|
|
|
100
109
|
}
|
|
101
110
|
if (hasLanguageWrapper) {
|
|
102
111
|
jsonContent[languageCode] = rootContent;
|
|
103
|
-
}
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
104
114
|
jsonContent = rootContent;
|
|
105
115
|
}
|
|
106
116
|
await fs.writeFile(filePath, JSON.stringify(jsonContent, null, 2));
|
|
107
|
-
|
|
108
117
|
return deletedKeys;
|
|
109
|
-
} catch (error) {
|
|
110
|
-
throw new Error(`Failed to delete keys from JSON file ${filePath}: ${error.message}`);
|
|
111
118
|
}
|
|
112
|
-
|
|
119
|
+
catch (error) {
|
|
120
|
+
throw new Error(`Failed to delete keys from JSON file ${filePath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=json-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-handler.js","sourceRoot":"","sources":["../../../src/utils/translation-updater/json-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
import { promises as fs } from 'fs';
|
|
2
2
|
import yaml from 'yaml';
|
|
3
3
|
import { SPECIAL_CHARS_REGEX, INTERPOLATION, fileExists, tryParseJsonArray } from './common.js';
|
|
4
|
-
|
|
4
|
+
const NEEDS_QUOTES_REGEX = /[:,%{}[\]|><!&*?-]/;
|
|
5
|
+
const LINE_WIDTH = 80;
|
|
5
6
|
function detectYamlOptions(content) {
|
|
6
7
|
const lines = content
|
|
7
8
|
.split('\n')
|
|
8
9
|
.filter(line => line.trim())
|
|
9
10
|
.slice(0, 10);
|
|
10
|
-
|
|
11
11
|
const options = {
|
|
12
12
|
indent: 2,
|
|
13
13
|
indentSeq: true
|
|
14
14
|
};
|
|
15
|
-
|
|
16
15
|
const indentMatch = lines.find(line => /^\s+\S/.test(line))?.match(/^(\s+)\S/);
|
|
17
16
|
if (indentMatch) {
|
|
18
17
|
options.indent = indentMatch[1].length;
|
|
@@ -20,62 +19,70 @@ function detectYamlOptions(content) {
|
|
|
20
19
|
options.indent = 2;
|
|
21
20
|
}
|
|
22
21
|
}
|
|
23
|
-
|
|
24
22
|
const seqMatch = lines.find(line => /^\s*-\s+\S/.test(line));
|
|
25
23
|
if (seqMatch) {
|
|
26
24
|
options.indentSeq = /^\s+-\s+/.test(seqMatch);
|
|
27
25
|
}
|
|
28
|
-
|
|
29
26
|
return options;
|
|
30
27
|
}
|
|
31
|
-
|
|
28
|
+
function needsQuotes(str) {
|
|
29
|
+
if (typeof str !== 'string')
|
|
30
|
+
return false;
|
|
31
|
+
return (SPECIAL_CHARS_REGEX.test(str) ||
|
|
32
|
+
str.includes(INTERPOLATION) ||
|
|
33
|
+
NEEDS_QUOTES_REGEX.test(str) ||
|
|
34
|
+
(str.includes(' ') && /[:"']/g.test(str)));
|
|
35
|
+
}
|
|
36
|
+
function shouldForceQuotes(str) {
|
|
37
|
+
if (typeof str !== 'string')
|
|
38
|
+
return false;
|
|
39
|
+
// Special case: strings containing quotes but no interpolation
|
|
40
|
+
// don't need outer quotes
|
|
41
|
+
if (str.includes('"') && !str.includes(INTERPOLATION)) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
return needsQuotes(str);
|
|
45
|
+
}
|
|
32
46
|
function processArrayItems(array, yamlDoc) {
|
|
33
47
|
return array.map(item => {
|
|
34
48
|
const itemNode = yamlDoc.createNode(item);
|
|
35
|
-
if (
|
|
36
|
-
|
|
37
|
-
if (needsQuotes) {
|
|
38
|
-
itemNode.type = 'QUOTE_DOUBLE';
|
|
39
|
-
}
|
|
49
|
+
if (shouldForceQuotes(item)) {
|
|
50
|
+
itemNode.type = 'QUOTE_DOUBLE';
|
|
40
51
|
}
|
|
41
52
|
return itemNode;
|
|
42
53
|
});
|
|
43
54
|
}
|
|
44
|
-
|
|
45
55
|
async function createYamlDocument(filePath) {
|
|
46
56
|
const exists = await fileExists(filePath);
|
|
47
57
|
if (!exists) {
|
|
48
58
|
console.warn(`Creating new file: ${filePath}`);
|
|
49
59
|
const doc = new yaml.Document();
|
|
50
60
|
doc.contents = doc.createNode({});
|
|
51
|
-
return { doc, created: true, options: { indent: 2, indentSeq: true } };
|
|
61
|
+
return { doc, created: true, options: { indent: 2, indentSeq: true, lineWidth: LINE_WIDTH } };
|
|
52
62
|
}
|
|
53
|
-
|
|
54
63
|
const content = await fs.readFile(filePath, 'utf8');
|
|
55
64
|
const options = detectYamlOptions(content);
|
|
65
|
+
const doc = yaml.parseDocument(content);
|
|
66
|
+
// @ts-ignore - lineWidth exists on options
|
|
67
|
+
doc.options.lineWidth = LINE_WIDTH;
|
|
56
68
|
return {
|
|
57
|
-
doc
|
|
69
|
+
doc,
|
|
58
70
|
created: false,
|
|
59
71
|
options
|
|
60
72
|
};
|
|
61
73
|
}
|
|
62
|
-
|
|
63
74
|
async function updateYamlTranslations(yamlDoc, translations, languageCode) {
|
|
64
75
|
if (!yamlDoc.contents) {
|
|
65
76
|
yamlDoc.contents = yamlDoc.createNode({});
|
|
66
77
|
}
|
|
67
|
-
|
|
68
78
|
const rootNode = yamlDoc.contents;
|
|
69
79
|
if (!rootNode.has(languageCode)) {
|
|
70
80
|
rootNode.set(languageCode, yamlDoc.createNode({}));
|
|
71
81
|
}
|
|
72
|
-
|
|
73
82
|
const langNode = rootNode.get(languageCode);
|
|
74
|
-
|
|
75
83
|
for (const [keyPath, newValue] of Object.entries(translations)) {
|
|
76
84
|
const keys = keyPath.split('.');
|
|
77
85
|
let current = langNode;
|
|
78
|
-
|
|
79
86
|
for (let i = 0; i < keys.length - 1; i++) {
|
|
80
87
|
const key = keys[i];
|
|
81
88
|
if (!current.has(key)) {
|
|
@@ -83,16 +90,13 @@ async function updateYamlTranslations(yamlDoc, translations, languageCode) {
|
|
|
83
90
|
}
|
|
84
91
|
current = current.get(key);
|
|
85
92
|
}
|
|
86
|
-
|
|
87
93
|
const lastKey = keys[keys.length - 1];
|
|
88
|
-
|
|
89
94
|
if (Array.isArray(newValue)) {
|
|
90
95
|
const arrayNode = new yaml.YAMLSeq();
|
|
91
96
|
processArrayItems(newValue, yamlDoc).forEach(item => arrayNode.add(item));
|
|
92
97
|
current.set(lastKey, arrayNode);
|
|
93
98
|
continue;
|
|
94
99
|
}
|
|
95
|
-
|
|
96
100
|
const array = tryParseJsonArray(newValue);
|
|
97
101
|
if (array) {
|
|
98
102
|
const arrayNode = new yaml.YAMLSeq();
|
|
@@ -100,48 +104,44 @@ async function updateYamlTranslations(yamlDoc, translations, languageCode) {
|
|
|
100
104
|
current.set(lastKey, arrayNode);
|
|
101
105
|
continue;
|
|
102
106
|
}
|
|
103
|
-
|
|
104
107
|
if (typeof newValue === 'string' && newValue.includes('\n')) {
|
|
105
108
|
const scalar = new yaml.Scalar(newValue);
|
|
106
109
|
scalar.type = 'BLOCK_LITERAL';
|
|
107
110
|
current.set(lastKey, scalar);
|
|
108
111
|
continue;
|
|
109
112
|
}
|
|
110
|
-
|
|
111
113
|
const node = yamlDoc.createNode(newValue);
|
|
112
|
-
if (
|
|
114
|
+
if (needsQuotes(newValue)) {
|
|
113
115
|
node.type = 'QUOTE_DOUBLE';
|
|
114
116
|
}
|
|
115
117
|
current.set(lastKey, node);
|
|
116
118
|
}
|
|
117
119
|
}
|
|
118
|
-
|
|
119
120
|
export async function updateYamlFile(filePath, translations, languageCode) {
|
|
120
121
|
const { doc: yamlDoc, created, options } = await createYamlDocument(filePath);
|
|
121
|
-
|
|
122
122
|
await updateYamlTranslations(yamlDoc, translations, languageCode);
|
|
123
|
-
|
|
123
|
+
// @ts-ignore - yaml options exist at runtime
|
|
124
124
|
yamlDoc.options.indent = options.indent;
|
|
125
|
+
// @ts-ignore - yaml options exist at runtime
|
|
125
126
|
yamlDoc.options.indentSeq = options.indentSeq;
|
|
126
|
-
|
|
127
|
+
// @ts-ignore - yaml options exist at runtime
|
|
128
|
+
yamlDoc.options.lineWidth = LINE_WIDTH;
|
|
127
129
|
await fs.writeFile(filePath, yamlDoc.toString());
|
|
128
130
|
return {
|
|
129
131
|
updatedKeys: Object.keys(translations),
|
|
130
132
|
created
|
|
131
133
|
};
|
|
132
134
|
}
|
|
133
|
-
|
|
134
135
|
export async function deleteKeysFromYamlFile(filePath, keysToDelete, languageCode) {
|
|
135
136
|
try {
|
|
136
137
|
const content = await fs.readFile(filePath, 'utf8');
|
|
137
138
|
const yamlDoc = yaml.parseDocument(content);
|
|
138
|
-
|
|
139
|
+
const contents = yamlDoc.contents;
|
|
140
|
+
if (!contents || !contents.has(languageCode)) {
|
|
139
141
|
return [];
|
|
140
142
|
}
|
|
141
|
-
|
|
142
|
-
const langNode = yamlDoc.contents.get(languageCode);
|
|
143
|
+
const langNode = contents.get(languageCode);
|
|
143
144
|
const deletedKeys = [];
|
|
144
|
-
|
|
145
145
|
for (const keyPath of keysToDelete) {
|
|
146
146
|
const keys = keyPath.split('.');
|
|
147
147
|
const lastIndex = keys.length - 1;
|
|
@@ -149,7 +149,6 @@ export async function deleteKeysFromYamlFile(filePath, keysToDelete, languageCod
|
|
|
149
149
|
let parent = null;
|
|
150
150
|
let keyInParent = '';
|
|
151
151
|
let found = true;
|
|
152
|
-
|
|
153
152
|
for (let i = 0; i < lastIndex; i++) {
|
|
154
153
|
const key = keys[i];
|
|
155
154
|
if (!current.has(key)) {
|
|
@@ -160,7 +159,6 @@ export async function deleteKeysFromYamlFile(filePath, keysToDelete, languageCod
|
|
|
160
159
|
keyInParent = key;
|
|
161
160
|
current = current.get(key);
|
|
162
161
|
}
|
|
163
|
-
|
|
164
162
|
if (found) {
|
|
165
163
|
const lastKey = keys[lastIndex];
|
|
166
164
|
if (current.has(lastKey)) {
|
|
@@ -172,10 +170,11 @@ export async function deleteKeysFromYamlFile(filePath, keysToDelete, languageCod
|
|
|
172
170
|
}
|
|
173
171
|
}
|
|
174
172
|
}
|
|
175
|
-
|
|
176
173
|
await fs.writeFile(filePath, yamlDoc.toString());
|
|
177
174
|
return deletedKeys;
|
|
178
|
-
} catch (error) {
|
|
179
|
-
throw new Error(`Failed to delete keys from YAML file ${filePath}: ${error.message}`);
|
|
180
175
|
}
|
|
181
|
-
|
|
176
|
+
catch (error) {
|
|
177
|
+
throw new Error(`Failed to delete keys from YAML file ${filePath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=yaml-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yaml-handler.js","sourceRoot":"","sources":["../../../src/utils/translation-updater/yaml-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export function findMissingTranslations(sourceKeys: any, targetKeys: any): {
|
|
2
|
+
missingKeys: {};
|
|
3
|
+
skippedKeys: {};
|
|
4
|
+
};
|
|
5
|
+
export function batchKeysWithMissing(sourceFiles: any, missingByLocale: any, batchSize?: number): {
|
|
6
|
+
batches: {
|
|
7
|
+
sourceFilePath: string;
|
|
8
|
+
sourceFile: {
|
|
9
|
+
path: any;
|
|
10
|
+
format: any;
|
|
11
|
+
content: string;
|
|
12
|
+
};
|
|
13
|
+
localeEntries: any;
|
|
14
|
+
locales: any[];
|
|
15
|
+
}[];
|
|
16
|
+
errors: {
|
|
17
|
+
type: string;
|
|
18
|
+
message: string;
|
|
19
|
+
path: string;
|
|
20
|
+
}[];
|
|
21
|
+
};
|
|
22
|
+
export function findTargetFile(targetFiles: any, targetLocale: any, sourceFile: any, sourceLocale: any): any;
|
|
23
|
+
export function generateTargetPath(sourceFile: any, targetLocale: any, sourceLocale: any): string;
|
|
24
|
+
export function processTargetContent(targetContent: any, targetLocale: any): {};
|
|
25
|
+
export function processLocaleTranslations(sourceKeys: any, targetLocale: any, targetFiles: any, sourceFile: any, sourceLocale: any): {
|
|
26
|
+
targetPath: string;
|
|
27
|
+
missingKeys: {};
|
|
28
|
+
skippedKeys: {};
|
|
29
|
+
targetFile: any;
|
|
30
|
+
};
|