@localheroai/cli 0.0.5 → 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/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 +180 -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 +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 +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
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { glob } from 'glob';
|
|
3
|
+
import { readFile } from 'fs/promises';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import yaml from 'yaml';
|
|
6
|
+
import { promises as fs } from 'fs';
|
|
7
|
+
/**
|
|
8
|
+
* Parse file content based on format
|
|
9
|
+
*/
|
|
10
|
+
export function parseFile(content, format, filePath = '') {
|
|
11
|
+
try {
|
|
12
|
+
if (format === 'json') {
|
|
13
|
+
try {
|
|
14
|
+
return JSON.parse(content);
|
|
15
|
+
}
|
|
16
|
+
catch (jsonError) {
|
|
17
|
+
const errorInfo = jsonError.message.match(/at position (\d+)/)
|
|
18
|
+
? jsonError.message
|
|
19
|
+
: `${jsonError.message} (check for missing commas, quotes, or brackets)`;
|
|
20
|
+
throw new Error(errorInfo);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return yaml.parse(content);
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
const location = filePath ? ` in ${filePath}` : '';
|
|
27
|
+
throw new Error(`Failed to parse ${format} file${location}: ${error.message}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Extract locale from file path
|
|
32
|
+
*/
|
|
33
|
+
function extractLocaleFromPath(filePath, localeRegex, knownLocales = []) {
|
|
34
|
+
if (knownLocales && knownLocales.length > 0) {
|
|
35
|
+
const basename = path.basename(filePath, path.extname(filePath));
|
|
36
|
+
const foundLocaleInFilename = knownLocales.find(locale => locale && basename.toLowerCase() === locale.toLowerCase());
|
|
37
|
+
if (foundLocaleInFilename) {
|
|
38
|
+
return foundLocaleInFilename.toLowerCase();
|
|
39
|
+
}
|
|
40
|
+
// Then try to match in the path
|
|
41
|
+
const pathParts = filePath.toLowerCase().split(path.sep);
|
|
42
|
+
const foundLocaleInPath = knownLocales.find(locale => locale && pathParts.includes(locale.toLowerCase()));
|
|
43
|
+
if (foundLocaleInPath) {
|
|
44
|
+
return foundLocaleInPath.toLowerCase();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const dirName = path.basename(path.dirname(filePath));
|
|
48
|
+
if (dirName && isValidLocale(dirName)) {
|
|
49
|
+
return dirName.toLowerCase();
|
|
50
|
+
}
|
|
51
|
+
if (localeRegex) {
|
|
52
|
+
const filename = path.basename(filePath);
|
|
53
|
+
const regexPattern = new RegExp(localeRegex);
|
|
54
|
+
const regexMatch = filename.match(regexPattern);
|
|
55
|
+
if (regexMatch && regexMatch[1]) {
|
|
56
|
+
const locale = regexMatch[1].toLowerCase();
|
|
57
|
+
if (isValidLocale(locale)) {
|
|
58
|
+
return locale;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
throw new Error(`Could not extract locale from path: ${filePath}`);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Check if locale is valid
|
|
66
|
+
*/
|
|
67
|
+
export function isValidLocale(locale) {
|
|
68
|
+
// Basic validation for language code (2 letters) or language-region code (e.g., en-US or en-us)
|
|
69
|
+
// Case insensitive for better compatibility with existing code
|
|
70
|
+
return /^[a-zA-Z]{2}(?:-[a-zA-Z]{2})?$/.test(locale);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Flatten a nested object into dot notation
|
|
74
|
+
*/
|
|
75
|
+
export function flattenTranslations(obj, parentKey = '') {
|
|
76
|
+
const result = {};
|
|
77
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
78
|
+
const newKey = parentKey ? `${parentKey}.${key}` : key;
|
|
79
|
+
if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
80
|
+
Object.assign(result, flattenTranslations(value, newKey));
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
result[newKey] = value;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return result;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Detect the format of a JSON translation file
|
|
90
|
+
*/
|
|
91
|
+
export function detectJsonFormat(obj) {
|
|
92
|
+
let hasNested = false;
|
|
93
|
+
let hasDotNotation = false;
|
|
94
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
95
|
+
if (key.includes('.')) {
|
|
96
|
+
hasDotNotation = true;
|
|
97
|
+
}
|
|
98
|
+
if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
99
|
+
hasNested = true;
|
|
100
|
+
for (const [, nestedValue] of Object.entries(value)) {
|
|
101
|
+
if (nestedValue && typeof nestedValue === 'object' && !Array.isArray(nestedValue)) {
|
|
102
|
+
return 'nested';
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (hasNested && hasDotNotation) {
|
|
108
|
+
return 'mixed';
|
|
109
|
+
}
|
|
110
|
+
else if (hasNested) {
|
|
111
|
+
return 'nested';
|
|
112
|
+
}
|
|
113
|
+
else if (hasDotNotation) {
|
|
114
|
+
return 'flat';
|
|
115
|
+
}
|
|
116
|
+
return 'flat';
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Convert a flattened object back to nested structure
|
|
120
|
+
*/
|
|
121
|
+
export function unflattenTranslations(flatObj) {
|
|
122
|
+
const result = {};
|
|
123
|
+
for (const [key, value] of Object.entries(flatObj)) {
|
|
124
|
+
const keys = key.split('.');
|
|
125
|
+
let current = result;
|
|
126
|
+
for (let i = 0; i < keys.length - 1; i++) {
|
|
127
|
+
const k = keys[i];
|
|
128
|
+
current[k] = current[k] || {};
|
|
129
|
+
current = current[k];
|
|
130
|
+
}
|
|
131
|
+
current[keys[keys.length - 1]] = value;
|
|
132
|
+
}
|
|
133
|
+
return result;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Preserve the original structure of a JSON object when adding new translations
|
|
137
|
+
*/
|
|
138
|
+
export function preserveJsonStructure(originalObj, newTranslations, format) {
|
|
139
|
+
if (format === 'flat') {
|
|
140
|
+
return { ...originalObj, ...newTranslations };
|
|
141
|
+
}
|
|
142
|
+
if (format === 'nested') {
|
|
143
|
+
const merged = { ...originalObj };
|
|
144
|
+
const unflattenedNew = unflattenTranslations(newTranslations);
|
|
145
|
+
return deepMerge(merged, unflattenedNew);
|
|
146
|
+
}
|
|
147
|
+
const result = { ...originalObj };
|
|
148
|
+
for (const [key, value] of Object.entries(newTranslations)) {
|
|
149
|
+
if (key.includes('.')) {
|
|
150
|
+
const keys = key.split('.');
|
|
151
|
+
if (originalObj[key] !== undefined) {
|
|
152
|
+
result[key] = value;
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
let current = result;
|
|
156
|
+
for (let i = 0; i < keys.length - 1; i++) {
|
|
157
|
+
const k = keys[i];
|
|
158
|
+
current[k] = current[k] || {};
|
|
159
|
+
if (typeof current[k] !== 'object' || Array.isArray(current[k])) {
|
|
160
|
+
current[k] = {};
|
|
161
|
+
}
|
|
162
|
+
current = current[k];
|
|
163
|
+
}
|
|
164
|
+
current[keys[keys.length - 1]] = value;
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
result[key] = value;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return result;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Deep merge two objects
|
|
174
|
+
*/
|
|
175
|
+
function deepMerge(target, source) {
|
|
176
|
+
const result = { ...target };
|
|
177
|
+
for (const [key, value] of Object.entries(source)) {
|
|
178
|
+
if (value && typeof value === 'object' &&
|
|
179
|
+
result[key] && typeof result[key] === 'object' &&
|
|
180
|
+
!Array.isArray(value) && !Array.isArray(result[key])) {
|
|
181
|
+
result[key] = deepMerge(result[key], value);
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
result[key] = value;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return result;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Extract namespace from file path
|
|
191
|
+
*/
|
|
192
|
+
function extractNamespace(filePath) {
|
|
193
|
+
const fileName = path.basename(filePath, path.extname(filePath));
|
|
194
|
+
const dirName = path.basename(path.dirname(filePath));
|
|
195
|
+
// Pattern 1: /path/to/en/common.json -> namespace = common
|
|
196
|
+
if (/^[a-z]{2}(-[A-Z]{2})?$/.test(dirName)) {
|
|
197
|
+
return fileName;
|
|
198
|
+
}
|
|
199
|
+
// Pattern 2: /path/to/messages.en.json -> namespace = messages
|
|
200
|
+
const dotMatch = fileName.match(/^(.+)\.([a-z]{2}(?:-[A-Z]{2})?)$/);
|
|
201
|
+
if (dotMatch) {
|
|
202
|
+
return dotMatch[1];
|
|
203
|
+
}
|
|
204
|
+
// Pattern 3: /path/to/common-en.json -> namespace = common
|
|
205
|
+
const dashMatch = fileName.match(/^(.+)-([a-z]{2}(?:-[A-Z]{2})?)$/);
|
|
206
|
+
if (dashMatch) {
|
|
207
|
+
return dashMatch[1];
|
|
208
|
+
}
|
|
209
|
+
return '';
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Find and process translation files based on configuration
|
|
213
|
+
*/
|
|
214
|
+
export async function findTranslationFiles(config, options = {}) {
|
|
215
|
+
const { parseContent = true, includeContent = true, extractKeys = true, basePath = process.cwd(), sourceLocale = config.sourceLocale, targetLocales = config.outputLocales || [], includeNamespace = false, verbose = false, returnFullResult = false } = options;
|
|
216
|
+
const knownLocales = [sourceLocale, ...targetLocales];
|
|
217
|
+
const { translationFiles } = config;
|
|
218
|
+
const { paths = [], pattern = '**/*.{json,yml,yaml}', ignore = [], localeRegex = '.*?([a-z]{2}(?:-[A-Z]{2})?)\\.(?:yml|yaml|json)$' } = translationFiles || {};
|
|
219
|
+
const processedFiles = [];
|
|
220
|
+
for (const translationPath of paths) {
|
|
221
|
+
const fullPath = path.join(basePath, translationPath);
|
|
222
|
+
const globPattern = path.join(fullPath, pattern);
|
|
223
|
+
if (verbose) {
|
|
224
|
+
console.log(chalk.blue(`Searching for translation files in ${globPattern}`));
|
|
225
|
+
}
|
|
226
|
+
let files;
|
|
227
|
+
try {
|
|
228
|
+
files = await glob(globPattern, {
|
|
229
|
+
ignore: ignore.map(i => path.join(basePath, i)),
|
|
230
|
+
absolute: false
|
|
231
|
+
});
|
|
232
|
+
if (verbose) {
|
|
233
|
+
console.log(chalk.blue(`Found ${files.length} files in ${translationPath}`));
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
catch (error) {
|
|
237
|
+
if (verbose) {
|
|
238
|
+
console.error(chalk.red(`Error searching for files in ${translationPath}: ${error.message}`));
|
|
239
|
+
}
|
|
240
|
+
files = [];
|
|
241
|
+
}
|
|
242
|
+
for (const file of files) {
|
|
243
|
+
try {
|
|
244
|
+
const filePath = file;
|
|
245
|
+
const format = path.extname(file).slice(1);
|
|
246
|
+
const locale = extractLocaleFromPath(file, localeRegex, knownLocales);
|
|
247
|
+
const result = {
|
|
248
|
+
path: filePath,
|
|
249
|
+
format,
|
|
250
|
+
locale
|
|
251
|
+
};
|
|
252
|
+
if (parseContent) {
|
|
253
|
+
const content = await readFile(filePath, 'utf8');
|
|
254
|
+
const parsedContent = parseFile(content, format, filePath);
|
|
255
|
+
if (includeContent) {
|
|
256
|
+
result.content = Buffer.from(content).toString('base64');
|
|
257
|
+
}
|
|
258
|
+
if (extractKeys) {
|
|
259
|
+
const hasLanguageWrapper = parsedContent[locale] !== undefined;
|
|
260
|
+
result.hasLanguageWrapper = hasLanguageWrapper;
|
|
261
|
+
const translationData = hasLanguageWrapper ? parsedContent[locale] : parsedContent;
|
|
262
|
+
result.translations = translationData;
|
|
263
|
+
const flattened = flattenTranslations(translationData);
|
|
264
|
+
// @ts-expect-error - Keep original behavior for test compatibility
|
|
265
|
+
result.keys = flattened;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
if (includeNamespace) {
|
|
269
|
+
result.namespace = extractNamespace(filePath);
|
|
270
|
+
}
|
|
271
|
+
processedFiles.push(result);
|
|
272
|
+
}
|
|
273
|
+
catch (error) {
|
|
274
|
+
if (error.message.includes('Failed to parse') ||
|
|
275
|
+
error.message.includes('JSON') ||
|
|
276
|
+
error.message.includes('Unexpected token') ||
|
|
277
|
+
error.message.includes('Missing closing')) {
|
|
278
|
+
console.warn(chalk.yellow(`\nWarning: ${error.message}`));
|
|
279
|
+
const format = path.extname(file).slice(1);
|
|
280
|
+
if (format === 'json') {
|
|
281
|
+
console.warn(chalk.gray(' Tip: Check for missing commas, quotes, or brackets in your JSON file.'));
|
|
282
|
+
}
|
|
283
|
+
else if (format === 'yml' || format === 'yaml') {
|
|
284
|
+
console.warn(chalk.gray(' Tip: Check for proper indentation and quote matching in your YAML file.'));
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
else if (verbose) {
|
|
288
|
+
console.warn(chalk.yellow(`Warning: ${error.message}`));
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
if (!returnFullResult) {
|
|
294
|
+
return processedFiles;
|
|
295
|
+
}
|
|
296
|
+
const allFiles = processedFiles;
|
|
297
|
+
const sourceFiles = allFiles.filter(file => file.locale === sourceLocale);
|
|
298
|
+
const targetFilesByLocale = {};
|
|
299
|
+
for (const locale of targetLocales) {
|
|
300
|
+
targetFilesByLocale[locale] = allFiles.filter(file => file.locale === locale);
|
|
301
|
+
}
|
|
302
|
+
return {
|
|
303
|
+
allFiles,
|
|
304
|
+
sourceFiles,
|
|
305
|
+
targetFilesByLocale
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Check if a directory exists
|
|
310
|
+
*/
|
|
311
|
+
export async function directoryExists(dirPath, fsModule = fs) {
|
|
312
|
+
try {
|
|
313
|
+
const stats = await fsModule.stat(dirPath);
|
|
314
|
+
return stats.isDirectory();
|
|
315
|
+
}
|
|
316
|
+
catch (error) {
|
|
317
|
+
if (error.code === 'ENOENT') {
|
|
318
|
+
return false;
|
|
319
|
+
}
|
|
320
|
+
throw error;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Find the first existing path from a list of paths
|
|
325
|
+
*/
|
|
326
|
+
export async function findFirstExistingPath(paths, fsModule = fs) {
|
|
327
|
+
for (const path of paths) {
|
|
328
|
+
if (await directoryExists(path, fsModule)) {
|
|
329
|
+
return path;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
return null;
|
|
333
|
+
}
|
|
334
|
+
export async function getDirectoryContents(dir, fsModule = fs) {
|
|
335
|
+
try {
|
|
336
|
+
const files = await fsModule.readdir(dir);
|
|
337
|
+
return {
|
|
338
|
+
files,
|
|
339
|
+
jsonFiles: files.filter(f => f.endsWith('.json')),
|
|
340
|
+
yamlFiles: files.filter(f => f.endsWith('.yml') || f.endsWith('.yaml'))
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
catch {
|
|
344
|
+
return null;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
//# sourceMappingURL=files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/utils/files.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
interface ExecResult {
|
|
4
|
+
stdout: string;
|
|
5
|
+
stderr: string;
|
|
6
|
+
}
|
|
7
|
+
interface GitDependencies {
|
|
8
|
+
fs: typeof fs;
|
|
9
|
+
path: typeof path;
|
|
10
|
+
exec: (file: string, args: string[]) => Promise<ExecResult>;
|
|
11
|
+
}
|
|
12
|
+
interface GitService {
|
|
13
|
+
deps: GitDependencies;
|
|
14
|
+
setDependencies: (customDeps?: Partial<GitDependencies>) => GitService;
|
|
15
|
+
updateGitignore: (basePath: string) => Promise<boolean>;
|
|
16
|
+
getCurrentBranch: () => Promise<string | null>;
|
|
17
|
+
}
|
|
18
|
+
export declare const gitService: GitService;
|
|
19
|
+
export declare function updateGitignore(basePath: string): Promise<boolean>;
|
|
20
|
+
export declare function getCurrentBranch(): Promise<string | null>;
|
|
21
|
+
export {};
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { promisify } from 'util';
|
|
4
|
+
import { execFile } from 'child_process';
|
|
5
|
+
const execFileAsync = promisify(execFile);
|
|
6
|
+
const defaultDeps = {
|
|
7
|
+
fs,
|
|
8
|
+
path,
|
|
9
|
+
exec: execFileAsync,
|
|
10
|
+
};
|
|
11
|
+
export const gitService = {
|
|
12
|
+
deps: { ...defaultDeps },
|
|
13
|
+
/**
|
|
14
|
+
* Set custom dependencies for testing
|
|
15
|
+
*/
|
|
16
|
+
setDependencies(customDeps = {}) {
|
|
17
|
+
this.deps = { ...defaultDeps, ...customDeps };
|
|
18
|
+
return this;
|
|
19
|
+
},
|
|
20
|
+
/**
|
|
21
|
+
* Add .localhero_key to .gitignore file
|
|
22
|
+
* @param basePath Base path to project
|
|
23
|
+
* @returns Boolean indicating if the file was updated
|
|
24
|
+
*/
|
|
25
|
+
async updateGitignore(basePath) {
|
|
26
|
+
const { fs, path } = this.deps;
|
|
27
|
+
const gitignorePath = path.join(basePath, '.gitignore');
|
|
28
|
+
let content = '';
|
|
29
|
+
try {
|
|
30
|
+
content = await fs.readFile(gitignorePath, 'utf8');
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
if (error.code !== 'ENOENT') {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (content.includes('.localhero_key')) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
await fs.appendFile(gitignorePath, '\n.localhero_key\n');
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
if (error.code === 'ENOENT') {
|
|
46
|
+
try {
|
|
47
|
+
await fs.writeFile(gitignorePath, '.localhero_key\n');
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
/**
|
|
58
|
+
* Get the current git branch name
|
|
59
|
+
* @returns Current branch name or null if not in a git repository
|
|
60
|
+
*/
|
|
61
|
+
async getCurrentBranch() {
|
|
62
|
+
try {
|
|
63
|
+
const { exec } = this.deps;
|
|
64
|
+
const { stdout } = await exec('git', ['rev-parse', '--abbrev-ref', 'HEAD']);
|
|
65
|
+
return stdout.trim();
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Add .localhero_key to .gitignore file
|
|
74
|
+
* @param basePath Base path to project
|
|
75
|
+
* @returns Boolean indicating if the file was updated
|
|
76
|
+
*/
|
|
77
|
+
export async function updateGitignore(basePath) {
|
|
78
|
+
return gitService.updateGitignore(basePath);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Get the current git branch name
|
|
82
|
+
* @returns Current branch name or null if not in a git repository
|
|
83
|
+
*/
|
|
84
|
+
export async function getCurrentBranch() {
|
|
85
|
+
return gitService.getCurrentBranch();
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAYzC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,MAAM,WAAW,GAAoB;IACnC,EAAE;IACF,IAAI;IACJ,IAAI,EAAE,aAAa;CACpB,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,IAAI,EAAE,EAAE,GAAG,WAAW,EAAE;IAExB;;OAEG;IACH,eAAe,CAAC,aAAuC,EAAE;QACvD,IAAI,CAAC,IAAI,GAAG,EAAE,GAAG,WAAW,EAAE,GAAG,UAAU,EAAE,CAAC;QAC9C,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,eAAe,CAAC,QAAgB;QACpC,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;QAC/B,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACxD,IAAI,OAAO,GAAG,EAAE,CAAC;QAEjB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC5B,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACvC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,UAAU,CAAC,aAAa,EAAE,oBAAoB,CAAC,CAAC;YACzD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC5B,IAAI,CAAC;oBACH,MAAM,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;oBACtD,OAAO,IAAI,CAAC;gBACd,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,gBAAgB;QACpB,IAAI,CAAC;YACH,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;YAC3B,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC;YAC5E,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgB;IACpD,OAAO,UAAU,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,OAAO,UAAU,CAAC,gBAAgB,EAAE,CAAC;AACvC,CAAC"}
|