@localheroai/cli 0.0.5 → 0.0.7
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 → README.md} +28 -10
- 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 +152 -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 +355 -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/dist/utils/translation-updater/json-handler.js +123 -0
- package/dist/utils/translation-updater/json-handler.js.map +1 -0
- package/dist/utils/translation-updater/yaml-handler.d.ts +5 -0
- package/dist/utils/translation-updater/yaml-handler.js +193 -0
- 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 +334 -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 +26 -26
- 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 -267
- package/src/utils/auth.js +0 -23
- package/src/utils/config.js +0 -125
- package/src/utils/files.js +0 -381
- package/src/utils/git.js +0 -72
- package/src/utils/github.js +0 -128
- package/src/utils/import-service.js +0 -128
- package/src/utils/prompt-service.js +0 -67
- package/src/utils/sync-service.js +0 -147
- package/src/utils/translation-updater/json-handler.js +0 -111
- package/src/utils/translation-updater/yaml-handler.js +0 -207
- package/src/utils/translation-utils.js +0 -278
|
@@ -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[]>;
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import { detectJsonFormat, preserveJsonStructure } from '../files.js';
|
|
3
|
+
import { ensureDirectoryExists } from './common.js';
|
|
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) {
|
|
19
|
+
try {
|
|
20
|
+
let existingContent = {};
|
|
21
|
+
let jsonFormat = 'nested';
|
|
22
|
+
let hasLanguageWrapper = false;
|
|
23
|
+
const result = {
|
|
24
|
+
updatedKeys: Object.keys(translations),
|
|
25
|
+
created: false
|
|
26
|
+
};
|
|
27
|
+
try {
|
|
28
|
+
const content = await fs.readFile(filePath, 'utf8');
|
|
29
|
+
existingContent = JSON.parse(content);
|
|
30
|
+
if (existingContent[languageCode] && typeof existingContent[languageCode] === 'object') {
|
|
31
|
+
hasLanguageWrapper = true;
|
|
32
|
+
jsonFormat = detectJsonFormat(existingContent[languageCode]);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
jsonFormat = detectJsonFormat(existingContent);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
if (!sourceFilePath) {
|
|
40
|
+
throw new Error('Source file is required for creating new JSON translation files');
|
|
41
|
+
}
|
|
42
|
+
console.warn(`Creating new JSON file: ${filePath}`);
|
|
43
|
+
result.created = true;
|
|
44
|
+
await ensureDirectoryExists(filePath);
|
|
45
|
+
// Use source file structure
|
|
46
|
+
hasLanguageWrapper = await detectSourceFileStructure(sourceFilePath);
|
|
47
|
+
}
|
|
48
|
+
let updatedContent;
|
|
49
|
+
if (result.created) {
|
|
50
|
+
updatedContent = hasLanguageWrapper ?
|
|
51
|
+
{ [languageCode]: preserveJsonStructure({}, translations, jsonFormat) } :
|
|
52
|
+
preserveJsonStructure({}, translations, jsonFormat);
|
|
53
|
+
}
|
|
54
|
+
else if (hasLanguageWrapper) {
|
|
55
|
+
existingContent[languageCode] = existingContent[languageCode] || {};
|
|
56
|
+
updatedContent = JSON.parse(JSON.stringify(existingContent));
|
|
57
|
+
const mergedContent = preserveJsonStructure(existingContent[languageCode], translations, jsonFormat);
|
|
58
|
+
updatedContent[languageCode] = mergedContent;
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
const existingCopy = JSON.parse(JSON.stringify(existingContent));
|
|
62
|
+
updatedContent = preserveJsonStructure(existingCopy, translations, jsonFormat);
|
|
63
|
+
}
|
|
64
|
+
await fs.writeFile(filePath, JSON.stringify(updatedContent, null, 2));
|
|
65
|
+
return result;
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
throw new Error(`Failed to update JSON file ${filePath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
export async function deleteKeysFromJsonFile(filePath, keysToDelete, languageCode) {
|
|
72
|
+
try {
|
|
73
|
+
const content = await fs.readFile(filePath, 'utf8');
|
|
74
|
+
let jsonContent = JSON.parse(content);
|
|
75
|
+
let hasLanguageWrapper = false;
|
|
76
|
+
let rootContent = jsonContent;
|
|
77
|
+
if (jsonContent[languageCode] && typeof jsonContent[languageCode] === 'object') {
|
|
78
|
+
hasLanguageWrapper = true;
|
|
79
|
+
rootContent = jsonContent[languageCode];
|
|
80
|
+
}
|
|
81
|
+
const deletedKeys = [];
|
|
82
|
+
for (const keyPath of keysToDelete) {
|
|
83
|
+
const keys = keyPath.split('.');
|
|
84
|
+
const lastIndex = keys.length - 1;
|
|
85
|
+
let current = rootContent;
|
|
86
|
+
let parent = null;
|
|
87
|
+
let keyInParent = '';
|
|
88
|
+
let found = true;
|
|
89
|
+
for (let i = 0; i < lastIndex; i++) {
|
|
90
|
+
const key = keys[i];
|
|
91
|
+
if (!current[key] || typeof current[key] !== 'object') {
|
|
92
|
+
found = false;
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
parent = current;
|
|
96
|
+
keyInParent = key;
|
|
97
|
+
current = current[key];
|
|
98
|
+
}
|
|
99
|
+
if (found) {
|
|
100
|
+
const lastKey = keys[lastIndex];
|
|
101
|
+
if (current[lastKey] !== undefined) {
|
|
102
|
+
delete current[lastKey];
|
|
103
|
+
deletedKeys.push(keyPath);
|
|
104
|
+
if (parent && Object.keys(current).length === 0) {
|
|
105
|
+
delete parent[keyInParent];
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (hasLanguageWrapper) {
|
|
111
|
+
jsonContent[languageCode] = rootContent;
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
jsonContent = rootContent;
|
|
115
|
+
}
|
|
116
|
+
await fs.writeFile(filePath, JSON.stringify(jsonContent, null, 2));
|
|
117
|
+
return deletedKeys;
|
|
118
|
+
}
|
|
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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"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import yaml from 'yaml';
|
|
3
|
+
import { SPECIAL_CHARS_REGEX, INTERPOLATION, fileExists, tryParseJsonArray } from './common.js';
|
|
4
|
+
const NEEDS_QUOTES_REGEX = /[:,%{}[\]|><!&*?-]/;
|
|
5
|
+
const LINE_WIDTH = 80;
|
|
6
|
+
function detectYamlOptions(content) {
|
|
7
|
+
const lines = content
|
|
8
|
+
.split('\n')
|
|
9
|
+
.filter(line => line.trim())
|
|
10
|
+
.slice(0, 10);
|
|
11
|
+
const options = {
|
|
12
|
+
indent: 2,
|
|
13
|
+
indentSeq: true
|
|
14
|
+
};
|
|
15
|
+
const indentMatch = lines.find(line => /^\s+\S/.test(line))?.match(/^(\s+)\S/);
|
|
16
|
+
if (indentMatch) {
|
|
17
|
+
options.indent = indentMatch[1].length;
|
|
18
|
+
if (indentMatch[1].includes('\t')) {
|
|
19
|
+
options.indent = 2;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
const seqMatch = lines.find(line => /^\s*-\s+\S/.test(line));
|
|
23
|
+
if (seqMatch) {
|
|
24
|
+
options.indentSeq = /^\s+-\s+/.test(seqMatch);
|
|
25
|
+
}
|
|
26
|
+
return options;
|
|
27
|
+
}
|
|
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
|
+
}
|
|
46
|
+
function processArrayItems(array, yamlDoc) {
|
|
47
|
+
return array.map(item => {
|
|
48
|
+
const itemNode = yamlDoc.createNode(item);
|
|
49
|
+
if (shouldForceQuotes(item)) {
|
|
50
|
+
itemNode.type = 'QUOTE_DOUBLE';
|
|
51
|
+
}
|
|
52
|
+
return itemNode;
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
async function createYamlDocument(filePath) {
|
|
56
|
+
const exists = await fileExists(filePath);
|
|
57
|
+
if (!exists) {
|
|
58
|
+
console.warn(`Creating new file: ${filePath}`);
|
|
59
|
+
const doc = new yaml.Document();
|
|
60
|
+
doc.contents = doc.createNode({});
|
|
61
|
+
return { doc, created: true, options: { indent: 2, indentSeq: true, lineWidth: LINE_WIDTH } };
|
|
62
|
+
}
|
|
63
|
+
const content = await fs.readFile(filePath, 'utf8');
|
|
64
|
+
const options = detectYamlOptions(content);
|
|
65
|
+
const doc = yaml.parseDocument(content);
|
|
66
|
+
// @ts-ignore - lineWidth exists on options
|
|
67
|
+
doc.options.lineWidth = LINE_WIDTH;
|
|
68
|
+
return {
|
|
69
|
+
doc,
|
|
70
|
+
created: false,
|
|
71
|
+
options
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
async function updateYamlTranslations(yamlDoc, translations, languageCode) {
|
|
75
|
+
if (!yamlDoc.contents) {
|
|
76
|
+
yamlDoc.contents = yamlDoc.createNode({});
|
|
77
|
+
}
|
|
78
|
+
const rootNode = yamlDoc.contents;
|
|
79
|
+
if (!yaml.isMap(rootNode)) {
|
|
80
|
+
throw new Error('Invalid YAML structure: root node must be a mapping');
|
|
81
|
+
}
|
|
82
|
+
let langNode = rootNode.get(languageCode);
|
|
83
|
+
if (!langNode || !yaml.isMap(langNode)) {
|
|
84
|
+
langNode = yamlDoc.createNode({});
|
|
85
|
+
rootNode.set(languageCode, langNode);
|
|
86
|
+
}
|
|
87
|
+
for (const [keyPath, newValue] of Object.entries(translations)) {
|
|
88
|
+
const keys = keyPath.split('.');
|
|
89
|
+
let current = langNode;
|
|
90
|
+
for (let i = 0; i < keys.length - 1; i++) {
|
|
91
|
+
const key = keys[i];
|
|
92
|
+
if (!current.has(key)) {
|
|
93
|
+
current.set(key, yamlDoc.createNode({}));
|
|
94
|
+
}
|
|
95
|
+
const nextNode = current.get(key);
|
|
96
|
+
if (!yaml.isMap(nextNode)) {
|
|
97
|
+
// If the existing node is not a mapping, replace it with an empty mapping
|
|
98
|
+
const newNode = yamlDoc.createNode({});
|
|
99
|
+
current.set(key, newNode);
|
|
100
|
+
current = newNode;
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
current = nextNode;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
const lastKey = keys[keys.length - 1];
|
|
107
|
+
if (Array.isArray(newValue)) {
|
|
108
|
+
const arrayNode = new yaml.YAMLSeq();
|
|
109
|
+
processArrayItems(newValue, yamlDoc).forEach(item => arrayNode.add(item));
|
|
110
|
+
current.set(lastKey, arrayNode);
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
const array = tryParseJsonArray(newValue);
|
|
114
|
+
if (array) {
|
|
115
|
+
const arrayNode = new yaml.YAMLSeq();
|
|
116
|
+
processArrayItems(array, yamlDoc).forEach(item => arrayNode.add(item));
|
|
117
|
+
current.set(lastKey, arrayNode);
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
if (typeof newValue === 'string' && newValue.includes('\n')) {
|
|
121
|
+
const scalar = new yaml.Scalar(newValue);
|
|
122
|
+
scalar.type = 'BLOCK_LITERAL';
|
|
123
|
+
current.set(lastKey, scalar);
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
const node = yamlDoc.createNode(newValue);
|
|
127
|
+
if (needsQuotes(newValue)) {
|
|
128
|
+
node.type = 'QUOTE_DOUBLE';
|
|
129
|
+
}
|
|
130
|
+
current.set(lastKey, node);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
export async function updateYamlFile(filePath, translations, languageCode) {
|
|
134
|
+
const { doc: yamlDoc, created, options } = await createYamlDocument(filePath);
|
|
135
|
+
await updateYamlTranslations(yamlDoc, translations, languageCode);
|
|
136
|
+
// @ts-ignore - yaml options exist at runtime
|
|
137
|
+
yamlDoc.options.indent = options.indent;
|
|
138
|
+
// @ts-ignore - yaml options exist at runtime
|
|
139
|
+
yamlDoc.options.indentSeq = options.indentSeq;
|
|
140
|
+
// @ts-ignore - yaml options exist at runtime
|
|
141
|
+
yamlDoc.options.lineWidth = LINE_WIDTH;
|
|
142
|
+
await fs.writeFile(filePath, yamlDoc.toString());
|
|
143
|
+
return {
|
|
144
|
+
updatedKeys: Object.keys(translations),
|
|
145
|
+
created
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
export async function deleteKeysFromYamlFile(filePath, keysToDelete, languageCode) {
|
|
149
|
+
try {
|
|
150
|
+
const content = await fs.readFile(filePath, 'utf8');
|
|
151
|
+
const yamlDoc = yaml.parseDocument(content);
|
|
152
|
+
const contents = yamlDoc.contents;
|
|
153
|
+
if (!contents || !contents.has(languageCode)) {
|
|
154
|
+
return [];
|
|
155
|
+
}
|
|
156
|
+
const langNode = contents.get(languageCode);
|
|
157
|
+
const deletedKeys = [];
|
|
158
|
+
for (const keyPath of keysToDelete) {
|
|
159
|
+
const keys = keyPath.split('.');
|
|
160
|
+
const lastIndex = keys.length - 1;
|
|
161
|
+
let current = langNode;
|
|
162
|
+
let parent = null;
|
|
163
|
+
let keyInParent = '';
|
|
164
|
+
let found = true;
|
|
165
|
+
for (let i = 0; i < lastIndex; i++) {
|
|
166
|
+
const key = keys[i];
|
|
167
|
+
if (!current.has(key)) {
|
|
168
|
+
found = false;
|
|
169
|
+
break;
|
|
170
|
+
}
|
|
171
|
+
parent = current;
|
|
172
|
+
keyInParent = key;
|
|
173
|
+
current = current.get(key);
|
|
174
|
+
}
|
|
175
|
+
if (found) {
|
|
176
|
+
const lastKey = keys[lastIndex];
|
|
177
|
+
if (current.has(lastKey)) {
|
|
178
|
+
current.delete(lastKey);
|
|
179
|
+
deletedKeys.push(keyPath);
|
|
180
|
+
if (parent && current.items.length === 0) {
|
|
181
|
+
parent.delete(keyInParent);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
await fs.writeFile(filePath, yamlDoc.toString());
|
|
187
|
+
return deletedKeys;
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
throw new Error(`Failed to delete keys from YAML file ${filePath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
//# 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
|
+
};
|