@translated/lara-cli 0.2.1

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.
Files changed (68) hide show
  1. package/README.md +212 -0
  2. package/build/cli/cmd/glossary/glossary.js +55 -0
  3. package/build/cli/cmd/glossary/glossary.js.map +1 -0
  4. package/build/cli/cmd/init/init.input.js +177 -0
  5. package/build/cli/cmd/init/init.input.js.map +1 -0
  6. package/build/cli/cmd/init/init.js +158 -0
  7. package/build/cli/cmd/init/init.js.map +1 -0
  8. package/build/cli/cmd/init/init.types.js +2 -0
  9. package/build/cli/cmd/init/init.types.js.map +1 -0
  10. package/build/cli/cmd/init/init.utils.js +99 -0
  11. package/build/cli/cmd/init/init.utils.js.map +1 -0
  12. package/build/cli/cmd/memory/memory.js +55 -0
  13. package/build/cli/cmd/memory/memory.js.map +1 -0
  14. package/build/cli/cmd/translate/translate.js +149 -0
  15. package/build/cli/cmd/translate/translate.js.map +1 -0
  16. package/build/index.js +25 -0
  17. package/build/index.js.map +1 -0
  18. package/build/interface/parser.js +2 -0
  19. package/build/interface/parser.js.map +1 -0
  20. package/build/messages/messages.js +120 -0
  21. package/build/messages/messages.js.map +1 -0
  22. package/build/modules/common/common.const.js +424 -0
  23. package/build/modules/common/common.const.js.map +1 -0
  24. package/build/modules/common/common.types.js +15 -0
  25. package/build/modules/common/common.types.js.map +1 -0
  26. package/build/modules/config/config.provider.js +47 -0
  27. package/build/modules/config/config.provider.js.map +1 -0
  28. package/build/modules/config/config.types.js +95 -0
  29. package/build/modules/config/config.types.js.map +1 -0
  30. package/build/modules/translation/translation.engine.js +165 -0
  31. package/build/modules/translation/translation.engine.js.map +1 -0
  32. package/build/modules/translation/translation.service.js +45 -0
  33. package/build/modules/translation/translation.service.js.map +1 -0
  34. package/build/parsers/android-xml.parser.js +308 -0
  35. package/build/parsers/android-xml.parser.js.map +1 -0
  36. package/build/parsers/json.parser.js +18 -0
  37. package/build/parsers/json.parser.js.map +1 -0
  38. package/build/parsers/markdown.parser.js +74 -0
  39. package/build/parsers/markdown.parser.js.map +1 -0
  40. package/build/parsers/parser.factory.js +52 -0
  41. package/build/parsers/parser.factory.js.map +1 -0
  42. package/build/parsers/parser.types.js +2 -0
  43. package/build/parsers/parser.types.js.map +1 -0
  44. package/build/parsers/po.parser.js +175 -0
  45. package/build/parsers/po.parser.js.map +1 -0
  46. package/build/parsers/ts.parser.js +176 -0
  47. package/build/parsers/ts.parser.js.map +1 -0
  48. package/build/parsers/vue.parser.js +156 -0
  49. package/build/parsers/vue.parser.js.map +1 -0
  50. package/build/utils/checksum.js +80 -0
  51. package/build/utils/checksum.js.map +1 -0
  52. package/build/utils/cli.js +4 -0
  53. package/build/utils/cli.js.map +1 -0
  54. package/build/utils/display.js +60 -0
  55. package/build/utils/display.js.map +1 -0
  56. package/build/utils/error.js +18 -0
  57. package/build/utils/error.js.map +1 -0
  58. package/build/utils/locale.js +108 -0
  59. package/build/utils/locale.js.map +1 -0
  60. package/build/utils/parser.js +25 -0
  61. package/build/utils/parser.js.map +1 -0
  62. package/build/utils/path.js +173 -0
  63. package/build/utils/path.js.map +1 -0
  64. package/build/utils/progressWithOra.js +72 -0
  65. package/build/utils/progressWithOra.js.map +1 -0
  66. package/build/utils/prompt.js +205 -0
  67. package/build/utils/prompt.js.map +1 -0
  68. package/package.json +89 -0
@@ -0,0 +1,80 @@
1
+ import path from 'path';
2
+ import fs from 'fs';
3
+ import crypto from 'crypto';
4
+ import yaml from 'yaml';
5
+ import { ParserFactory } from '../parsers/parser.factory.js';
6
+ var ChecksumState;
7
+ (function (ChecksumState) {
8
+ ChecksumState["NEW"] = "new";
9
+ ChecksumState["UPDATED"] = "updated";
10
+ ChecksumState["UNCHANGED"] = "unchanged";
11
+ })(ChecksumState || (ChecksumState = {}));
12
+ const CHECKSUM_FILE = 'lara.lock';
13
+ const checksumFilePath = path.join(process.cwd(), CHECKSUM_FILE);
14
+ let cachedChecksumFile = null;
15
+ function calculateChecksum(fileName, parser, locale) {
16
+ const checksumFile = getChecksumFile();
17
+ const checksum = checksumFile.files[getHash(fileName)] || {};
18
+ const changelog = {};
19
+ const fileParser = parser || new ParserFactory(fileName);
20
+ const fileContent = fileParser.parse(fs.readFileSync(fileName, 'utf8'), { targetLocale: locale });
21
+ let changed = false;
22
+ for (const key in fileContent) {
23
+ if (!checksum[key]) {
24
+ changelog[key] = {
25
+ value: fileContent[key],
26
+ state: ChecksumState.NEW,
27
+ };
28
+ changed = true;
29
+ continue;
30
+ }
31
+ const newHash = getHash(fileContent[key]);
32
+ const oldHash = checksum[key];
33
+ if (newHash === oldHash) {
34
+ changelog[key] = {
35
+ value: fileContent[key],
36
+ state: ChecksumState.UNCHANGED,
37
+ };
38
+ continue;
39
+ }
40
+ changelog[key] = {
41
+ value: fileContent[key],
42
+ state: ChecksumState.UPDATED,
43
+ };
44
+ changed = true;
45
+ continue;
46
+ }
47
+ if (changed) {
48
+ updateChecksum(fileName, fileContent);
49
+ }
50
+ return changelog;
51
+ }
52
+ function updateChecksum(fileName, values) {
53
+ const checksumFile = getChecksumFile();
54
+ const fileNameHash = getHash(fileName);
55
+ const hashedValues = Object.fromEntries(Object.entries(values).map(([key, value]) => [key, getHash(value)]));
56
+ checksumFile.files[fileNameHash] = hashedValues;
57
+ cachedChecksumFile = checksumFile;
58
+ fs.writeFileSync(checksumFilePath, yaml.stringify(checksumFile));
59
+ }
60
+ function getChecksumFile() {
61
+ if (cachedChecksumFile) {
62
+ return cachedChecksumFile;
63
+ }
64
+ if (!fs.existsSync(checksumFilePath)) {
65
+ cachedChecksumFile = {
66
+ version: '1.0.0',
67
+ files: {},
68
+ };
69
+ fs.writeFileSync(checksumFilePath, yaml.stringify(cachedChecksumFile));
70
+ return cachedChecksumFile;
71
+ }
72
+ cachedChecksumFile = yaml.parse(fs.readFileSync(checksumFilePath, 'utf8'));
73
+ return cachedChecksumFile;
74
+ }
75
+ function getHash(s) {
76
+ const data = typeof s === 'string' ? s : JSON.stringify(s);
77
+ return crypto.createHash('md5').update(data).digest('hex');
78
+ }
79
+ export { calculateChecksum };
80
+ //# sourceMappingURL=checksum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checksum.js","sourceRoot":"/","sources":["utils/checksum.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export function isRunningInInteractiveMode(command) {
2
+ return command.parent?.opts().nonInteractive === false;
3
+ }
4
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"/","sources":["utils/cli.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,0BAA0B,CAAC,OAAgB;IACzD,OAAO,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,cAAc,KAAK,KAAK,CAAC;AACzD,CAAC"}
@@ -0,0 +1,60 @@
1
+ import Ora from 'ora';
2
+ import stringWidth from 'string-width';
3
+ export function formatLocaleList(locales, maxDisplay = 5) {
4
+ if (locales.length === 0) {
5
+ return '';
6
+ }
7
+ if (locales.length <= maxDisplay) {
8
+ return locales.join(', ');
9
+ }
10
+ const displayed = locales.slice(0, maxDisplay);
11
+ const remaining = locales.length - maxDisplay;
12
+ return `${displayed.join(', ')} (+${remaining} more)`;
13
+ }
14
+ export function displayLocaleTable({ locales, title, columns = 4, spinner, type = 'info', }) {
15
+ const rows = [];
16
+ for (let i = 0; i < locales.length; i += columns) {
17
+ rows.push(locales.slice(i, i + columns));
18
+ }
19
+ const formattedRows = rows.map((row) => ` ${row.map((locale) => locale.padEnd(8)).join('')}`);
20
+ const tableOutput = `${title}:\n${formattedRows.join('\n')}`;
21
+ if (spinner) {
22
+ spinner[type](tableOutput);
23
+ }
24
+ else {
25
+ Ora()[type](tableOutput);
26
+ }
27
+ }
28
+ export function displaySummaryBox({ title, items, footer }) {
29
+ const boxWidth = 50;
30
+ const topBorder = `╔${'═'.repeat(boxWidth - 1)}╗`;
31
+ const bottomBorder = `╚${'═'.repeat(boxWidth - 1)}╝`;
32
+ const separator = `╠${'═'.repeat(boxWidth - 1)}╣`;
33
+ const centerText = (text) => {
34
+ const visualLength = stringWidth(text);
35
+ const padding = boxWidth - 4 - visualLength;
36
+ const leftPad = Math.floor(padding / 2);
37
+ const rightPad = padding - leftPad;
38
+ return `║ ${' '.repeat(leftPad)}${text}${' '.repeat(rightPad + 1)} ║`;
39
+ };
40
+ const alignText = (label, value) => {
41
+ const content = `${label}: ${value}`;
42
+ const visualLength = stringWidth(content);
43
+ const padding = boxWidth - 4 - visualLength;
44
+ return `║ ${content}${' '.repeat(padding)} ║`;
45
+ };
46
+ const lines = [
47
+ '',
48
+ topBorder,
49
+ centerText(title),
50
+ separator,
51
+ ...items.map(([label, value]) => alignText(label, value)),
52
+ separator,
53
+ centerText(footer),
54
+ bottomBorder,
55
+ '',
56
+ ];
57
+ const summaryBox = lines.join('\n');
58
+ console.log(summaryBox);
59
+ }
60
+ //# sourceMappingURL=display.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"display.js","sourceRoot":"/","sources":["utils/display.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { Messages } from '#messages/messages.js';
2
+ export function handleLaraApiError(error, context, spinner) {
3
+ if (error.statusCode === 401) {
4
+ displayErrorAndExit(Messages.errors.apiAuthFailed(context), spinner);
5
+ }
6
+ if (error.statusCode >= 500) {
7
+ displayErrorAndExit(Messages.errors.serviceUnavailable(context, error.statusCode), spinner);
8
+ }
9
+ displayError(Messages.errors.translationFailed(context, error.message || ''), spinner);
10
+ }
11
+ function displayErrorAndExit(message, spinner) {
12
+ spinner.fail(message);
13
+ process.exit(1);
14
+ }
15
+ function displayError(message, spinner) {
16
+ spinner.fail(message);
17
+ }
18
+ //# sourceMappingURL=error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.js","sourceRoot":"/","sources":["utils/error.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAUjD,MAAM,UAAU,kBAAkB,CAAC,KAAmB,EAAE,OAAe,EAAE,OAAY;IAEnF,IAAI,KAAK,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;QAC7B,mBAAmB,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IACvE,CAAC;IAGD,IAAI,KAAK,CAAC,UAAU,IAAI,GAAG,EAAE,CAAC;QAC5B,mBAAmB,CAAC,QAAQ,CAAC,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;IAC9F,CAAC;IAGD,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;AACzF,CAAC;AAQD,SAAS,mBAAmB,CAAC,OAAe,EAAE,OAAY;IACxD,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,YAAY,CAAC,OAAe,EAAE,OAAY;IACjD,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACxB,CAAC"}
@@ -0,0 +1,108 @@
1
+ import { AVAILABLE_LOCALES } from '#modules/common/common.const.js';
2
+ import { extractLocaleFromFilename, searchPaths, readSafe } from './path.js';
3
+ import path from 'path';
4
+ import { ParserFactory } from '../parsers/parser.factory.js';
5
+ import { SupportedExtensionEnum } from '#modules/common/common.types.js';
6
+ const availableLocales = new Set(AVAILABLE_LOCALES);
7
+ async function extractLocalesFromFile(filePath, filterOutLocale) {
8
+ try {
9
+ const content = await readSafe(filePath);
10
+ const parser = new ParserFactory(filePath);
11
+ const parsed = parser.parse(content);
12
+ const locales = new Set();
13
+ for (const key of Object.keys(parsed)) {
14
+ const root = key.split('/')[0];
15
+ if (root && availableLocales.has(root) && (!filterOutLocale || root !== filterOutLocale)) {
16
+ locales.add(root);
17
+ }
18
+ }
19
+ return Array.from(locales);
20
+ }
21
+ catch {
22
+ return [];
23
+ }
24
+ }
25
+ async function extractLocaleFromPath(source) {
26
+ const paths = await searchPaths();
27
+ const targetLocales = new Set();
28
+ for (const filePath of paths) {
29
+ if (filePath.endsWith(SupportedExtensionEnum.TS)) {
30
+ const locales = await extractLocalesFromFile(filePath, source);
31
+ for (const locale of locales) {
32
+ targetLocales.add(locale);
33
+ }
34
+ continue;
35
+ }
36
+ if (filePath.endsWith(SupportedExtensionEnum.VUE)) {
37
+ const locales = await extractLocalesFromFile(filePath, source);
38
+ for (const locale of locales) {
39
+ targetLocales.add(locale);
40
+ }
41
+ continue;
42
+ }
43
+ const relativeFilePath = path.relative(process.cwd(), filePath);
44
+ const parts = relativeFilePath.split('/');
45
+ for (let i = 0; i < parts.length; i++) {
46
+ const part = parts[i];
47
+ if (!part) {
48
+ continue;
49
+ }
50
+ if (i === parts.length - 1) {
51
+ const locale = extractLocaleFromFilename(part);
52
+ if (!locale) {
53
+ continue;
54
+ }
55
+ if (availableLocales.has(locale) && locale !== source) {
56
+ targetLocales.add(locale);
57
+ }
58
+ }
59
+ if (availableLocales.has(part) && part !== source) {
60
+ targetLocales.add(part);
61
+ }
62
+ }
63
+ }
64
+ return Array.from(targetLocales);
65
+ }
66
+ async function extractAllLocalesFromProject() {
67
+ const paths = await searchPaths();
68
+ const foundLocales = new Set();
69
+ for (const filePath of paths) {
70
+ if (filePath.endsWith(SupportedExtensionEnum.TS)) {
71
+ const locales = await extractLocalesFromFile(filePath);
72
+ for (const locale of locales) {
73
+ foundLocales.add(locale);
74
+ }
75
+ continue;
76
+ }
77
+ if (filePath.endsWith(SupportedExtensionEnum.VUE)) {
78
+ const locales = await extractLocalesFromFile(filePath);
79
+ for (const locale of locales) {
80
+ foundLocales.add(locale);
81
+ }
82
+ continue;
83
+ }
84
+ const relativeFilePath = path.relative(process.cwd(), filePath);
85
+ const parts = relativeFilePath.split('/');
86
+ for (let i = 0; i < parts.length; i++) {
87
+ const part = parts[i];
88
+ if (!part) {
89
+ continue;
90
+ }
91
+ if (i === parts.length - 1) {
92
+ const locale = extractLocaleFromFilename(part);
93
+ if (!locale) {
94
+ continue;
95
+ }
96
+ if (availableLocales.has(locale)) {
97
+ foundLocales.add(locale);
98
+ }
99
+ }
100
+ if (availableLocales.has(part)) {
101
+ foundLocales.add(part);
102
+ }
103
+ }
104
+ }
105
+ return Array.from(foundLocales);
106
+ }
107
+ export { extractLocaleFromPath, extractAllLocalesFromProject };
108
+ //# sourceMappingURL=locale.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locale.js","sourceRoot":"/","sources":["utils/locale.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ function isPlainObject(value) {
2
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
3
+ }
4
+ export function deepMerge(target, source) {
5
+ if (typeof target !== 'object' || target === null)
6
+ return source;
7
+ if (typeof source !== 'object' || source === null)
8
+ return source;
9
+ const output = { ...target };
10
+ for (const key in source) {
11
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
12
+ if (Array.isArray(target[key]) && Array.isArray(source[key])) {
13
+ output[key] = [...target[key], ...source[key]];
14
+ continue;
15
+ }
16
+ if (key in target && isPlainObject(target[key]) && isPlainObject(source[key])) {
17
+ output[key] = deepMerge(target[key], source[key]);
18
+ continue;
19
+ }
20
+ output[key] = source[key];
21
+ }
22
+ }
23
+ return output;
24
+ }
25
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"/","sources":["utils/parser.ts"],"names":[],"mappings":"AAMA,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AASD,MAAM,UAAU,SAAS,CACvB,MAA+B,EAC/B,MAA+B;IAE/B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IACjE,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAEjE,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;IAC7B,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;YAEtD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBAC7D,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAI,MAAM,CAAC,GAAG,CAAe,EAAE,GAAI,MAAM,CAAC,GAAG,CAAe,CAAC,CAAC;gBAC7E,SAAS;YACX,CAAC;YAED,IAAI,GAAG,IAAI,MAAM,IAAI,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBAC9E,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CACrB,MAAM,CAAC,GAAG,CAA4B,EACtC,MAAM,CAAC,GAAG,CAA4B,CACvC,CAAC;gBACF,SAAS;YACX,CAAC;YAED,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,173 @@
1
+ import * as fs from 'fs/promises';
2
+ import path from 'path';
3
+ import { glob } from 'glob';
4
+ import { AVAILABLE_LOCALES, DEFAULT_EXCLUDED_DIRECTORIES, SUPPORTED_FILE_TYPES, } from '#modules/common/common.const.js';
5
+ import { Messages } from '#messages/messages.js';
6
+ import { SupportedExtensionEnum } from '#modules/common/common.types.js';
7
+ import { VueParser } from '../parsers/vue.parser.js';
8
+ const availableLocales = new Set(AVAILABLE_LOCALES);
9
+ function isRelative(path) {
10
+ return !path.startsWith('/') && !path.startsWith('./') && !path.startsWith('../');
11
+ }
12
+ function getFileExtension(path) {
13
+ return path.split('.').pop() ?? '';
14
+ }
15
+ async function readSafe(filePath, fallback = '') {
16
+ try {
17
+ return await fs.readFile(filePath, 'utf8');
18
+ }
19
+ catch {
20
+ return fallback;
21
+ }
22
+ }
23
+ async function ensureDirectoryExists(filePath) {
24
+ const directory = path.dirname(filePath);
25
+ try {
26
+ await fs.access(directory);
27
+ }
28
+ catch {
29
+ await fs.mkdir(directory, { recursive: true });
30
+ }
31
+ }
32
+ function buildLocalePath(filePath, locale) {
33
+ return filePath.replaceAll('[locale]', locale);
34
+ }
35
+ async function searchLocalePathsByPattern(pattern) {
36
+ const localePattern = pattern.replaceAll('[locale]', `{${AVAILABLE_LOCALES.join(',')}}`);
37
+ const paths = await glob(localePattern, {
38
+ cwd: process.cwd(),
39
+ ignore: DEFAULT_EXCLUDED_DIRECTORIES.map((dir) => `${dir}/**`),
40
+ });
41
+ const localePaths = [];
42
+ for (const path of paths) {
43
+ const normalizedPath = normalizePath(path);
44
+ if (normalizedPath !== null) {
45
+ localePaths.push(normalizedPath);
46
+ }
47
+ }
48
+ return Array.from(new Set(localePaths));
49
+ }
50
+ async function searchLocalePaths(options) {
51
+ const { source } = options;
52
+ const allPaths = await searchPaths();
53
+ const initiallyFilteredPaths = allPaths.filter((path) => {
54
+ if (path.endsWith(`i18n.${SupportedExtensionEnum.TS}`)) {
55
+ return true;
56
+ }
57
+ if (path.endsWith(SupportedExtensionEnum.VUE)) {
58
+ return true;
59
+ }
60
+ if (path.endsWith(SupportedExtensionEnum.MD) || path.endsWith(SupportedExtensionEnum.MDX)) {
61
+ return true;
62
+ }
63
+ if (path.endsWith(SupportedExtensionEnum.XML)) {
64
+ return true;
65
+ }
66
+ return path.match(buildLocaleRegex([source]));
67
+ });
68
+ const filteredPaths = [];
69
+ const fileChecks = initiallyFilteredPaths.map(async (filePath) => {
70
+ if (filePath.endsWith(SupportedExtensionEnum.VUE)) {
71
+ const content = await readSafe(filePath);
72
+ if (VueParser.hasI18nTag(content)) {
73
+ return filePath;
74
+ }
75
+ return null;
76
+ }
77
+ if (filePath.endsWith(SupportedExtensionEnum.MD) ||
78
+ filePath.endsWith(SupportedExtensionEnum.MDX)) {
79
+ return filePath;
80
+ }
81
+ if (filePath.endsWith(SupportedExtensionEnum.XML)) {
82
+ return filePath;
83
+ }
84
+ if (filePath.endsWith(`i18n.${SupportedExtensionEnum.TS}`) ||
85
+ filePath.match(buildLocaleRegex([source]))) {
86
+ return filePath;
87
+ }
88
+ return null;
89
+ });
90
+ const checkedPaths = await Promise.all(fileChecks);
91
+ for (const p of checkedPaths) {
92
+ if (p)
93
+ filteredPaths.push(p);
94
+ }
95
+ const pathsWithLocales = [];
96
+ for (const jsonPath of filteredPaths) {
97
+ const normalizedPath = normalizePath(jsonPath);
98
+ if (!normalizedPath) {
99
+ continue;
100
+ }
101
+ pathsWithLocales.push(normalizedPath);
102
+ }
103
+ return Array.from(new Set(pathsWithLocales));
104
+ }
105
+ function normalizePath(filePath) {
106
+ const relativeFilePath = path.relative(process.cwd(), filePath);
107
+ if (relativeFilePath.endsWith(`i18n.${SupportedExtensionEnum.TS}`)) {
108
+ return relativeFilePath;
109
+ }
110
+ const parts = relativeFilePath.split('/');
111
+ let currentLocale = '';
112
+ let normalizedPath = '';
113
+ for (let i = 0; i < parts.length; i++) {
114
+ const part = parts[i];
115
+ if (!part) {
116
+ continue;
117
+ }
118
+ if (i === parts.length - 1) {
119
+ const locale = extractLocaleFromFilename(part);
120
+ if (!currentLocale && locale && availableLocales.has(locale)) {
121
+ currentLocale = locale;
122
+ normalizedPath += part.replace(locale, '[locale]');
123
+ continue;
124
+ }
125
+ normalizedPath += part;
126
+ continue;
127
+ }
128
+ if (!currentLocale && availableLocales.has(part)) {
129
+ currentLocale = part;
130
+ }
131
+ if (part === currentLocale) {
132
+ normalizedPath += '[locale]/';
133
+ continue;
134
+ }
135
+ normalizedPath += part + '/';
136
+ }
137
+ if (!currentLocale) {
138
+ if (normalizedPath.includes(`i18n.${SupportedExtensionEnum.TS}`) ||
139
+ normalizedPath.endsWith(SupportedExtensionEnum.VUE) ||
140
+ normalizedPath.endsWith(SupportedExtensionEnum.MD) ||
141
+ normalizedPath.endsWith(SupportedExtensionEnum.MDX) ||
142
+ normalizedPath.endsWith(SupportedExtensionEnum.XML)) {
143
+ return normalizedPath;
144
+ }
145
+ return null;
146
+ }
147
+ return normalizedPath;
148
+ }
149
+ async function searchPaths() {
150
+ if (SUPPORTED_FILE_TYPES.length === 0) {
151
+ throw new Error(Messages.errors.noSupportedFileTypes);
152
+ }
153
+ const pattern = SUPPORTED_FILE_TYPES.length === 1
154
+ ? `**/*.${SUPPORTED_FILE_TYPES[0]}`
155
+ : `**/*.{${SUPPORTED_FILE_TYPES.join(',')}}`;
156
+ return glob(pattern, {
157
+ cwd: process.cwd(),
158
+ ignore: DEFAULT_EXCLUDED_DIRECTORIES.map((dir) => `${dir}/**`),
159
+ });
160
+ }
161
+ function extractLocaleFromFilename(filename) {
162
+ const sortedLocales = [...AVAILABLE_LOCALES].sort((a, b) => b.length - a.length);
163
+ const match = filename.match(buildLocaleRegex(sortedLocales));
164
+ if (!match || !match[2]) {
165
+ return null;
166
+ }
167
+ return match[2];
168
+ }
169
+ function buildLocaleRegex(locales = AVAILABLE_LOCALES) {
170
+ return new RegExp(`(^|[^a-zA-Z])(${locales.join('|')})(?=[^a-zA-Z]|$)`, 'i');
171
+ }
172
+ export { getFileExtension, isRelative, readSafe, ensureDirectoryExists, buildLocalePath, searchLocalePathsByPattern, searchLocalePaths, searchPaths, extractLocaleFromFilename, };
173
+ //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.js","sourceRoot":"/","sources":["utils/path.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ import Ora from 'ora';
2
+ import { Messages } from '#messages/messages.js';
3
+ class ProgressWithOra {
4
+ spinner;
5
+ done = 0;
6
+ total = 0;
7
+ width = 40;
8
+ init({ message, spinner }) {
9
+ if (spinner) {
10
+ this.spinner = spinner;
11
+ return;
12
+ }
13
+ this.spinner = Ora({ text: message ?? Messages.errors.processing, color: 'yellow' }).start();
14
+ }
15
+ start({ message, total }) {
16
+ if (!this.spinner) {
17
+ this.init({ message });
18
+ }
19
+ if (total <= 0) {
20
+ throw new Error(Messages.errors.progressTotalInvalid);
21
+ }
22
+ this.total = total;
23
+ this.done = 0;
24
+ this.setText(message);
25
+ process.stdout.write('\n');
26
+ this.renderProgress();
27
+ }
28
+ tick(count = 1) {
29
+ this.done = Math.min(this.done + count, this.total);
30
+ this.renderProgress();
31
+ }
32
+ setText(text) {
33
+ this.spinner.text = text;
34
+ }
35
+ reset({ total, done }) {
36
+ if (total <= 0) {
37
+ throw new Error(Messages.errors.progressTotalInvalid);
38
+ }
39
+ this.total = total;
40
+ this.done = done ?? 0;
41
+ this.renderProgress();
42
+ }
43
+ renderProgress() {
44
+ const ratio = this.done / this.total;
45
+ const filled = Math.round(ratio * this.width);
46
+ const empty = this.width - filled;
47
+ const percent = (ratio * 100).toFixed(1);
48
+ const progress = `${this.done}/${this.total}`;
49
+ const bar = `|${'█'.repeat(filled)}${'-'.repeat(empty)}| ${percent}% (${progress})`;
50
+ process.stdout.write('\x1b[1B');
51
+ process.stdout.write('\x1b[2K\r');
52
+ process.stdout.write(`Progress: ${bar}`);
53
+ process.stdout.write('\x1b[1A');
54
+ }
55
+ stop(message = Messages.success.completed, type = 'succeed') {
56
+ this.done = this.total;
57
+ this.renderProgress();
58
+ process.stdout.write('\x1b[1B');
59
+ process.stdout.write('\x1b[2K\r');
60
+ process.stdout.write('\x1b[1A');
61
+ if (Array.isArray(message)) {
62
+ for (const msg of message) {
63
+ this.spinner[type](msg);
64
+ }
65
+ }
66
+ else {
67
+ this.spinner[type](message);
68
+ }
69
+ }
70
+ }
71
+ export const progressWithOra = new ProgressWithOra();
72
+ //# sourceMappingURL=progressWithOra.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progressWithOra.js","sourceRoot":"/","sources":["utils/progressWithOra.ts"],"names":[],"mappings":"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"}