transcripto-cli 1.0.0

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 (58) hide show
  1. package/README.md +576 -0
  2. package/dist/cli/generate.d.ts +2 -0
  3. package/dist/cli/generate.d.ts.map +1 -0
  4. package/dist/cli/generate.js +416 -0
  5. package/dist/cli/generate.js.map +1 -0
  6. package/dist/cli/index.d.ts +3 -0
  7. package/dist/cli/index.d.ts.map +1 -0
  8. package/dist/cli/index.js +43 -0
  9. package/dist/cli/index.js.map +1 -0
  10. package/dist/cli/init.d.ts +2 -0
  11. package/dist/cli/init.d.ts.map +1 -0
  12. package/dist/cli/init.js +81 -0
  13. package/dist/cli/init.js.map +1 -0
  14. package/dist/cli/report.d.ts +2 -0
  15. package/dist/cli/report.d.ts.map +1 -0
  16. package/dist/cli/report.js +137 -0
  17. package/dist/cli/report.js.map +1 -0
  18. package/dist/cli/scan.d.ts +2 -0
  19. package/dist/cli/scan.d.ts.map +1 -0
  20. package/dist/cli/scan.js +62 -0
  21. package/dist/cli/scan.js.map +1 -0
  22. package/dist/cli/watch-i18n.d.ts +2 -0
  23. package/dist/cli/watch-i18n.d.ts.map +1 -0
  24. package/dist/cli/watch-i18n.js +73 -0
  25. package/dist/cli/watch-i18n.js.map +1 -0
  26. package/dist/cli/watch.d.ts +2 -0
  27. package/dist/cli/watch.d.ts.map +1 -0
  28. package/dist/cli/watch.js +147 -0
  29. package/dist/cli/watch.js.map +1 -0
  30. package/dist/core/i18nGenerator.d.ts +16 -0
  31. package/dist/core/i18nGenerator.d.ts.map +1 -0
  32. package/dist/core/i18nGenerator.js +139 -0
  33. package/dist/core/i18nGenerator.js.map +1 -0
  34. package/dist/core/projectScanner.d.ts +12 -0
  35. package/dist/core/projectScanner.d.ts.map +1 -0
  36. package/dist/core/projectScanner.js +53 -0
  37. package/dist/core/projectScanner.js.map +1 -0
  38. package/dist/core/stringExtractor.d.ts +21 -0
  39. package/dist/core/stringExtractor.d.ts.map +1 -0
  40. package/dist/core/stringExtractor.js +268 -0
  41. package/dist/core/stringExtractor.js.map +1 -0
  42. package/dist/index.d.ts +7 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +10 -0
  45. package/dist/index.js.map +1 -0
  46. package/package.json +44 -0
  47. package/src/cli/generate.ts +422 -0
  48. package/src/cli/index.ts +50 -0
  49. package/src/cli/init.ts +96 -0
  50. package/src/cli/report.ts +160 -0
  51. package/src/cli/scan.ts +69 -0
  52. package/src/cli/watch-i18n.ts +77 -0
  53. package/src/cli/watch.ts +129 -0
  54. package/src/core/i18nGenerator.ts +127 -0
  55. package/src/core/projectScanner.ts +62 -0
  56. package/src/core/stringExtractor.ts +276 -0
  57. package/src/index.ts +7 -0
  58. package/tsconfig.json +20 -0
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.reportCommand = reportCommand;
7
+ const fs_1 = require("fs");
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ async function reportCommand() {
10
+ console.log(chalk_1.default.blue('📊 Generating localization report...'));
11
+ try {
12
+ const report = await generateReport();
13
+ displayReport(report);
14
+ }
15
+ catch (error) {
16
+ console.error(chalk_1.default.red('❌ Report generation failed:'), error);
17
+ process.exit(1);
18
+ }
19
+ }
20
+ async function generateReport() {
21
+ // Load extracted strings
22
+ const strings = await loadExtractedStrings();
23
+ // Load config
24
+ const config = await loadConfig();
25
+ // Load existing translations
26
+ const translations = await loadTranslations(config.i18n.languages);
27
+ // Calculate metrics
28
+ const filesScanned = new Set(strings.map(s => s.filePath)).size;
29
+ const stringsByFile = {};
30
+ strings.forEach(str => {
31
+ const fileName = str.filePath.split('/').pop() || str.filePath;
32
+ stringsByFile[fileName] = (stringsByFile[fileName] || 0) + 1;
33
+ });
34
+ // Check missing translations
35
+ const missingTranslations = [];
36
+ for (const lang of config.i18n.languages) {
37
+ if (lang !== 'en' && (!translations[lang] || Object.keys(translations[lang]).length < strings.length)) {
38
+ missingTranslations.push(lang);
39
+ }
40
+ }
41
+ const coverage = strings.length > 0
42
+ ? Math.round((translations.en ? Object.keys(translations.en).length : 0) / strings.length * 100)
43
+ : 0;
44
+ return {
45
+ totalStrings: strings.length,
46
+ filesScanned,
47
+ languages: config.i18n.languages,
48
+ coverage,
49
+ missingTranslations,
50
+ stringsByFile
51
+ };
52
+ }
53
+ function displayReport(report) {
54
+ console.log(chalk_1.default.green('\n📈 Transcripto Localization Report'));
55
+ console.log(chalk_1.default.gray('='.repeat(40)));
56
+ console.log(chalk_1.default.white(`\n📝 Total Strings: ${report.totalStrings}`));
57
+ console.log(chalk_1.default.white(`📁 Files Scanned: ${report.filesScanned}`));
58
+ console.log(chalk_1.default.white(`🌐 Languages: ${report.languages.join(', ')}`));
59
+ // Coverage with color coding
60
+ let coverageColor = chalk_1.default.red;
61
+ if (report.coverage >= 80)
62
+ coverageColor = chalk_1.default.green;
63
+ else if (report.coverage >= 50)
64
+ coverageColor = chalk_1.default.yellow;
65
+ console.log(coverageColor(`📊 Coverage: ${report.coverage}%`));
66
+ // Missing translations
67
+ if (report.missingTranslations.length > 0) {
68
+ console.log(chalk_1.default.red(`\n⚠️ Missing Translations: ${report.missingTranslations.join(', ')}`));
69
+ }
70
+ else {
71
+ console.log(chalk_1.default.green('\n✅ All languages have complete translations'));
72
+ }
73
+ // Strings by file
74
+ if (Object.keys(report.stringsByFile).length > 0) {
75
+ console.log(chalk_1.default.white('\n📋 Strings by File:'));
76
+ const sortedFiles = Object.entries(report.stringsByFile)
77
+ .sort(([, a], [, b]) => b - a)
78
+ .slice(0, 10);
79
+ sortedFiles.forEach(([file, count]) => {
80
+ console.log(chalk_1.default.gray(` ${file}: ${count} strings`));
81
+ });
82
+ if (Object.keys(report.stringsByFile).length > 10) {
83
+ console.log(chalk_1.default.gray(` ... and ${Object.keys(report.stringsByFile).length - 10} more files`));
84
+ }
85
+ }
86
+ // Recommendations
87
+ console.log(chalk_1.default.white('\n💡 Recommendations:'));
88
+ if (report.totalStrings === 0) {
89
+ console.log(chalk_1.default.yellow(' • Run "transcripto scan" to extract UI strings'));
90
+ }
91
+ else if (report.coverage < 100) {
92
+ console.log(chalk_1.default.yellow(' • Run "transcripto generate" to update translation files'));
93
+ }
94
+ if (report.missingTranslations.length > 0) {
95
+ console.log(chalk_1.default.yellow(' • Run "npx lingo.dev@latest run" to generate missing translations'));
96
+ }
97
+ if (report.totalStrings > 0 && report.coverage === 100) {
98
+ console.log(chalk_1.default.green(' • Localization is complete! 🎉'));
99
+ }
100
+ }
101
+ async function loadExtractedStrings() {
102
+ try {
103
+ const content = await fs_1.promises.readFile('.transcripto/extracted-strings.json', 'utf-8');
104
+ return JSON.parse(content);
105
+ }
106
+ catch (error) {
107
+ return [];
108
+ }
109
+ }
110
+ async function loadConfig() {
111
+ try {
112
+ const configContent = await fs_1.promises.readFile('.transcripto/config.json', 'utf-8');
113
+ return JSON.parse(configContent);
114
+ }
115
+ catch (error) {
116
+ return {
117
+ i18n: {
118
+ languages: ['en', 'hi', 'kn'],
119
+ outputDir: './src/i18n'
120
+ }
121
+ };
122
+ }
123
+ }
124
+ async function loadTranslations(languages) {
125
+ const translations = {};
126
+ for (const lang of languages) {
127
+ try {
128
+ const content = await fs_1.promises.readFile(`./src/i18n/${lang}.json`, 'utf-8');
129
+ translations[lang] = JSON.parse(content);
130
+ }
131
+ catch (error) {
132
+ translations[lang] = {};
133
+ }
134
+ }
135
+ return translations;
136
+ }
137
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/cli/report.ts"],"names":[],"mappings":";;;;;AAaA,sCAWC;AAxBD,2BAAoC;AACpC,kDAA0B;AAYnB,KAAK,UAAU,aAAa;IACjC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC,CAAC;IAEhE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;QACtC,aAAa,CAAC,MAAM,CAAC,CAAC;IAExB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,EAAE,KAAK,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc;IAC3B,yBAAyB;IACzB,MAAM,OAAO,GAAG,MAAM,oBAAoB,EAAE,CAAC;IAE7C,cAAc;IACd,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAElC,6BAA6B;IAC7B,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAEnE,oBAAoB;IACpB,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;IAChE,MAAM,aAAa,GAA2B,EAAE,CAAC;IAEjD,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QACpB,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC,QAAQ,CAAC;QAC/D,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,6BAA6B;IAC7B,MAAM,mBAAmB,GAAa,EAAE,CAAC;IACzC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACzC,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACtG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC;QACjC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC;QAChG,CAAC,CAAC,CAAC,CAAC;IAEN,OAAO;QACL,YAAY,EAAE,OAAO,CAAC,MAAM;QAC5B,YAAY;QACZ,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS;QAChC,QAAQ;QACR,mBAAmB;QACnB,aAAa;KACd,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,MAAkB;IACvC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAExC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,uBAAuB,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,qBAAqB,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,iBAAiB,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAEzE,6BAA6B;IAC7B,IAAI,aAAa,GAAG,eAAK,CAAC,GAAG,CAAC;IAC9B,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE;QAAE,aAAa,GAAG,eAAK,CAAC,KAAK,CAAC;SAClD,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE;QAAE,aAAa,GAAG,eAAK,CAAC,MAAM,CAAC;IAE7D,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,gBAAgB,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;IAE/D,uBAAuB;IACvB,IAAI,MAAM,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,+BAA+B,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IACjG,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC,CAAC;IAC3E,CAAC;IAED,kBAAkB;IAClB,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;QAClD,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC;aACrD,IAAI,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;aAC3B,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAEhB,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;YACpC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,MAAM,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC;QACnG,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAElD,IAAI,MAAM,CAAC,YAAY,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,kDAAkD,CAAC,CAAC,CAAC;IAChF,CAAC;SAAM,IAAI,MAAM,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,4DAA4D,CAAC,CAAC,CAAC;IAC1F,CAAC;IAED,IAAI,MAAM,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,qEAAqE,CAAC,CAAC,CAAC;IACnG,CAAC;IAED,IAAI,MAAM,CAAC,YAAY,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAED,KAAK,UAAU,oBAAoB;IACjC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,aAAE,CAAC,QAAQ,CAAC,qCAAqC,EAAE,OAAO,CAAC,CAAC;QAClF,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU;IACvB,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,MAAM,aAAE,CAAC,QAAQ,CAAC,0BAA0B,EAAE,OAAO,CAAC,CAAC;QAC7E,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,IAAI,EAAE;gBACJ,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;gBAC7B,SAAS,EAAE,YAAY;aACxB;SACF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,SAAmB;IACjD,MAAM,YAAY,GAA2C,EAAE,CAAC;IAEhE,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,aAAE,CAAC,QAAQ,CAAC,cAAc,IAAI,OAAO,EAAE,OAAO,CAAC,CAAC;YACtE,YAAY,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function scanCommand(): Promise<void>;
2
+ //# sourceMappingURL=scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/cli/scan.ts"],"names":[],"mappings":"AAKA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CA+CjD"}
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.scanCommand = scanCommand;
7
+ const fs_1 = require("fs");
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ const projectScanner_1 = require("../core/projectScanner");
10
+ const stringExtractor_1 = require("../core/stringExtractor");
11
+ async function scanCommand() {
12
+ console.log(chalk_1.default.blue('🔍 Scanning project for UI text strings...'));
13
+ try {
14
+ // Load config
15
+ const config = await loadConfig();
16
+ // Initialize scanner and extractor
17
+ const scanner = new projectScanner_1.ProjectScanner();
18
+ const extractor = new stringExtractor_1.StringExtractor();
19
+ // Scan project
20
+ const files = await scanner.scanProject();
21
+ console.log(chalk_1.default.gray(`📁 Found ${files.length} files to scan`));
22
+ // Extract strings
23
+ const strings = await extractor.extractStrings(files);
24
+ // Save results
25
+ await fs_1.promises.writeFile('.transcripto/extracted-strings.json', JSON.stringify(strings, null, 2), 'utf-8');
26
+ console.log(chalk_1.default.green(`✅ Extracted ${strings.length} UI text strings`));
27
+ if (strings.length > 0) {
28
+ console.log(chalk_1.default.yellow('\n📝 Sample extracted strings:'));
29
+ strings.slice(0, 5).forEach((str, index) => {
30
+ console.log(chalk_1.default.white(` ${index + 1}. "${str.text}" → ${str.key}`));
31
+ console.log(chalk_1.default.gray(` from ${str.filePath}:${str.line}`));
32
+ });
33
+ if (strings.length > 5) {
34
+ console.log(chalk_1.default.gray(` ... and ${strings.length - 5} more`));
35
+ }
36
+ }
37
+ console.log(chalk_1.default.yellow('\n🎯 Next steps:'));
38
+ console.log(chalk_1.default.white(' transcripto generate - Generate i18n files from extracted strings'));
39
+ console.log(chalk_1.default.white(' transcripto replace - Replace inline text with constants'));
40
+ }
41
+ catch (error) {
42
+ console.error(chalk_1.default.red('❌ Scan failed:'), error);
43
+ process.exit(1);
44
+ }
45
+ }
46
+ async function loadConfig() {
47
+ try {
48
+ const configContent = await fs_1.promises.readFile('.transcripto/config.json', 'utf-8');
49
+ return JSON.parse(configContent);
50
+ }
51
+ catch (error) {
52
+ console.warn(chalk_1.default.yellow('⚠️ No .transcripto/config.json found, using defaults'));
53
+ return {
54
+ scan: {
55
+ extensions: ['.ts', '.tsx', '.js', '.jsx', '.html'],
56
+ exclude: ['node_modules', 'dist', 'build', '.git', 'coverage'],
57
+ minStringLength: 2
58
+ }
59
+ };
60
+ }
61
+ }
62
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/cli/scan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function watchI18nCommand(): Promise<void>;
2
+ //# sourceMappingURL=watch-i18n.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch-i18n.d.ts","sourceRoot":"","sources":["../../src/cli/watch-i18n.ts"],"names":[],"mappings":"AAOA,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CA2DtD"}
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.watchI18nCommand = watchI18nCommand;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const fs_1 = require("fs");
9
+ const chokidar_1 = __importDefault(require("chokidar"));
10
+ const i18nGenerator_1 = require("../core/i18nGenerator");
11
+ async function watchI18nCommand() {
12
+ console.log(chalk_1.default.cyan('👁️ Starting i18n file watcher...'));
13
+ console.log(chalk_1.default.gray('📁 Monitoring: ./i18n/en.json'));
14
+ console.log(chalk_1.default.gray('🔄 Auto-translating on changes...\n'));
15
+ // Ensure i18n directory exists
16
+ try {
17
+ await fs_1.promises.mkdir('./i18n', { recursive: true });
18
+ }
19
+ catch {
20
+ // Directory already exists
21
+ }
22
+ // Initial translation if en.json exists
23
+ try {
24
+ const enContent = await fs_1.promises.readFile('./i18n/en.json', 'utf-8');
25
+ const translations = JSON.parse(enContent);
26
+ const keys = Object.keys(translations);
27
+ if (keys.length > 0) {
28
+ console.log(chalk_1.default.yellow('📝 Found existing translations, running initial translation...'));
29
+ await runTranslation();
30
+ }
31
+ }
32
+ catch {
33
+ console.log(chalk_1.default.yellow('📝 No existing en.json found, waiting for file creation...'));
34
+ }
35
+ // Watch for changes in en.json
36
+ const watcher = chokidar_1.default.watch('./i18n/en.json', {
37
+ persistent: true,
38
+ ignoreInitial: true
39
+ });
40
+ watcher.on('change', async () => {
41
+ console.log(chalk_1.default.cyan('\n🔄 File changed: ./i18n/en.json'));
42
+ console.log(chalk_1.default.yellow('🌐 Running auto-translation...'));
43
+ try {
44
+ await runTranslation();
45
+ console.log(chalk_1.default.green('✅ Auto-translation completed!'));
46
+ }
47
+ catch (error) {
48
+ console.error(chalk_1.default.red('❌ Auto-translation failed:'), error);
49
+ }
50
+ });
51
+ watcher.on('add', async () => {
52
+ console.log(chalk_1.default.cyan('\n📁 File created: ./i18n/en.json'));
53
+ console.log(chalk_1.default.yellow('🌐 Running initial translation...'));
54
+ try {
55
+ await runTranslation();
56
+ console.log(chalk_1.default.green('✅ Initial translation completed!'));
57
+ }
58
+ catch (error) {
59
+ console.error(chalk_1.default.red('❌ Initial translation failed:'), error);
60
+ }
61
+ });
62
+ console.log(chalk_1.default.green('🎉 Watcher started successfully!'));
63
+ console.log(chalk_1.default.gray('💡 Add new keys to ./i18n/en.json and they will be auto-translated'));
64
+ console.log(chalk_1.default.gray('⏹️ Press Ctrl+C to stop watching\n'));
65
+ }
66
+ async function runTranslation() {
67
+ const generator = new i18nGenerator_1.I18nGenerator();
68
+ // Generate lingo.dev config for root/i18n
69
+ await generator.generateLingoDevConfig();
70
+ // Run lingo.dev translation
71
+ await generator.runLingoDev();
72
+ }
73
+ //# sourceMappingURL=watch-i18n.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch-i18n.js","sourceRoot":"","sources":["../../src/cli/watch-i18n.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function watchCommand(options: any): Promise<void>;
2
+ //# sourceMappingURL=watch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/cli/watch.ts"],"names":[],"mappings":"AASA,wBAAsB,YAAY,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CA2C9D"}
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.watchCommand = watchCommand;
40
+ const fs_1 = require("fs");
41
+ const chalk_1 = __importDefault(require("chalk"));
42
+ const chokidar = __importStar(require("chokidar"));
43
+ const i18nGenerator_1 = require("../core/i18nGenerator");
44
+ const projectScanner_1 = require("../core/projectScanner");
45
+ const stringExtractor_1 = require("../core/stringExtractor");
46
+ async function watchCommand(options) {
47
+ console.log(chalk_1.default.blue('👁️ Starting Transcripto file watcher...'));
48
+ const yes = options.yes || false;
49
+ if (yes) {
50
+ console.log(chalk_1.default.yellow('🤖 Running in non-interactive mode (--yes)'));
51
+ }
52
+ // Initial setup
53
+ await setupProject(yes);
54
+ // Watch for file changes
55
+ const watcher = chokidar.watch([
56
+ 'src/**/*.{ts,tsx,js,jsx}',
57
+ '!src/i18n/**/*',
58
+ '!dist/**/*',
59
+ '!node_modules/**/*'
60
+ ], {
61
+ ignored: /node_modules/,
62
+ persistent: true,
63
+ ignoreInitial: true
64
+ });
65
+ console.log(chalk_1.default.green('📁 Watching for changes in src/ directory...'));
66
+ console.log(chalk_1.default.gray('💡 Press Ctrl+C to stop watching'));
67
+ watcher.on('change', async (filePath) => {
68
+ console.log(chalk_1.default.yellow(`\n📝 File changed: ${filePath}`));
69
+ await handleFileChange(filePath, yes);
70
+ });
71
+ watcher.on('add', async (filePath) => {
72
+ console.log(chalk_1.default.yellow(`\n➕ File added: ${filePath}`));
73
+ await handleFileChange(filePath, yes);
74
+ });
75
+ // Handle process termination
76
+ process.on('SIGINT', () => {
77
+ console.log(chalk_1.default.cyan('\n👋 Stopping Transcripto watcher...'));
78
+ watcher.close();
79
+ process.exit(0);
80
+ });
81
+ }
82
+ async function setupProject(yes) {
83
+ try {
84
+ // Check if project is initialized
85
+ try {
86
+ await fs_1.promises.access('.transcripto');
87
+ console.log(chalk_1.default.green('✅ Transcripto project already initialized'));
88
+ }
89
+ catch {
90
+ console.log(chalk_1.default.yellow('🔧 Initializing Transcripto project...'));
91
+ const { initCommand } = await Promise.resolve().then(() => __importStar(require('./init')));
92
+ await initCommand();
93
+ }
94
+ // Initial scan and generation
95
+ console.log(chalk_1.default.blue('🔍 Performing initial scan...'));
96
+ await performFullWorkflow(yes);
97
+ }
98
+ catch (error) {
99
+ console.error(chalk_1.default.red('❌ Setup failed:'), error);
100
+ process.exit(1);
101
+ }
102
+ }
103
+ async function handleFileChange(filePath, yes) {
104
+ try {
105
+ console.log(chalk_1.default.cyan('🔄 Updating translations...'));
106
+ // Perform full workflow
107
+ await performFullWorkflow(yes);
108
+ console.log(chalk_1.default.green('✅ Translations updated successfully!'));
109
+ }
110
+ catch (error) {
111
+ console.error(chalk_1.default.red('❌ Update failed:'), error);
112
+ }
113
+ }
114
+ async function performFullWorkflow(yes) {
115
+ // Scan for strings
116
+ const scanner = new projectScanner_1.ProjectScanner();
117
+ const files = await scanner.scanProject('./src');
118
+ const extractor = new stringExtractor_1.StringExtractor();
119
+ const strings = await extractor.extractStrings(files);
120
+ if (strings.length === 0) {
121
+ console.log(chalk_1.default.yellow('⚠️ No strings found'));
122
+ return;
123
+ }
124
+ // Generate i18n files using same config as generate command
125
+ const generator = new i18nGenerator_1.I18nGenerator();
126
+ const config = {
127
+ outputDir: './i18n', // Changed to root folder
128
+ languages: ['en'], // Start with just English, lingo.dev will add more
129
+ constantsFile: '', // No constants file needed
130
+ keyPrefix: ''
131
+ };
132
+ await generator.generateI18nFiles(strings, config);
133
+ await generator.generateLingoDevConfig(); // Let lingo.dev decide target languages
134
+ // Run lingo.dev automatically
135
+ try {
136
+ await generator.runLingoDev();
137
+ console.log(chalk_1.default.green('🌐 lingo.dev translations completed!'));
138
+ }
139
+ catch (error) {
140
+ console.log(chalk_1.default.yellow('⚠️ lingo.dev failed, continuing...'));
141
+ }
142
+ // Replace strings with constants
143
+ // const replacer = new TextReplacer();
144
+ // await replacer.replaceInFiles(strings);
145
+ console.log(chalk_1.default.green(`✅ Processed ${strings.length} strings`));
146
+ }
147
+ //# sourceMappingURL=watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/cli/watch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { ExtractedString } from './stringExtractor';
2
+ export interface I18nConfig {
3
+ outputDir: string;
4
+ languages: string[];
5
+ constantsFile: string;
6
+ keyPrefix: string;
7
+ }
8
+ export declare class I18nGenerator {
9
+ private readonly defaultConfig;
10
+ generateI18nFiles(strings: ExtractedString[], config?: Partial<I18nConfig>): Promise<void>;
11
+ private generateTranslationFile;
12
+ generateLingoDevConfig(): Promise<void>;
13
+ runLingoDev(): Promise<void>;
14
+ private initializeLingoDev;
15
+ }
16
+ //# sourceMappingURL=i18nGenerator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18nGenerator.d.ts","sourceRoot":"","sources":["../../src/core/i18nGenerator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAK5B;IAEI,iBAAiB,CACrB,OAAO,EAAE,eAAe,EAAE,EAC1B,MAAM,GAAE,OAAO,CAAC,UAAU,CAAM,GAC/B,OAAO,CAAC,IAAI,CAAC;YAYF,uBAAuB;IAiB/B,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBvC,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;YAgCpB,kBAAkB;CAqBjC"}
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.I18nGenerator = void 0;
40
+ const fs_1 = require("fs");
41
+ const path_1 = __importDefault(require("path"));
42
+ class I18nGenerator {
43
+ constructor() {
44
+ this.defaultConfig = {
45
+ outputDir: './i18n', // Changed to root folder
46
+ languages: ['en', 'hi', 'kn'],
47
+ constantsFile: './src/i18n/constants.ts',
48
+ keyPrefix: ''
49
+ };
50
+ }
51
+ async generateI18nFiles(strings, config = {}) {
52
+ const finalConfig = { ...this.defaultConfig, ...config };
53
+ // Create output directory
54
+ await fs_1.promises.mkdir(finalConfig.outputDir, { recursive: true });
55
+ // Generate translation files only (no constants file)
56
+ for (const language of finalConfig.languages) {
57
+ await this.generateTranslationFile(strings, language, finalConfig);
58
+ }
59
+ }
60
+ async generateTranslationFile(strings, language, config) {
61
+ const translations = {};
62
+ for (const str of strings) {
63
+ translations[str.key] = str.text;
64
+ }
65
+ const filePath = path_1.default.join(config.outputDir, `${language}.json`);
66
+ const content = JSON.stringify(translations, null, 2);
67
+ await fs_1.promises.writeFile(filePath, content, 'utf-8');
68
+ }
69
+ async generateLingoDevConfig() {
70
+ // First, delete any existing lingo.dev config to ensure clean setup
71
+ try {
72
+ await fs_1.promises.unlink('.lingodev.json');
73
+ console.log('🗑️ Removed existing lingo.dev config');
74
+ }
75
+ catch {
76
+ // Config doesn't exist, that's fine
77
+ }
78
+ // Let lingo.dev handle target languages automatically - don't specify any
79
+ const config = {
80
+ source: './i18n/en.json', // Changed to root folder
81
+ // target: [] - Let lingo.dev decide automatically
82
+ output: './i18n', // Changed to root folder
83
+ format: 'json'
84
+ };
85
+ const content = JSON.stringify(config, null, 2);
86
+ await fs_1.promises.writeFile('.lingodev.json', content, 'utf-8');
87
+ console.log('📁 Created lingo.dev config with automatic language selection');
88
+ }
89
+ async runLingoDev() {
90
+ const { spawn } = await Promise.resolve().then(() => __importStar(require('child_process')));
91
+ // First, initialize lingo.dev if not already done
92
+ try {
93
+ await fs_1.promises.access('i18n.json');
94
+ console.log('📁 lingo.dev already initialized');
95
+ }
96
+ catch {
97
+ console.log('🔧 Initializing lingo.dev...');
98
+ await this.initializeLingoDev();
99
+ }
100
+ // Then run lingo.dev
101
+ return new Promise((resolve, reject) => {
102
+ const process = spawn('npx', ['lingo.dev@latest', 'run'], {
103
+ stdio: 'inherit',
104
+ shell: true
105
+ });
106
+ process.on('close', (code) => {
107
+ if (code === 0) {
108
+ console.log('✅ lingo.dev translations completed successfully!');
109
+ resolve();
110
+ }
111
+ else {
112
+ reject(new Error(`lingo.dev process exited with code ${code}`));
113
+ }
114
+ });
115
+ process.on('error', reject);
116
+ });
117
+ }
118
+ async initializeLingoDev() {
119
+ const { spawn } = await Promise.resolve().then(() => __importStar(require('child_process')));
120
+ return new Promise((resolve, reject) => {
121
+ const process = spawn('npx', ['lingo.dev@latest', 'init'], {
122
+ stdio: 'inherit',
123
+ shell: true
124
+ });
125
+ process.on('close', (code) => {
126
+ if (code === 0) {
127
+ console.log('✅ lingo.dev initialized successfully');
128
+ resolve();
129
+ }
130
+ else {
131
+ reject(new Error(`lingo.dev init failed with code ${code}`));
132
+ }
133
+ });
134
+ process.on('error', reject);
135
+ });
136
+ }
137
+ }
138
+ exports.I18nGenerator = I18nGenerator;
139
+ //# sourceMappingURL=i18nGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18nGenerator.js","sourceRoot":"","sources":["../../src/core/i18nGenerator.ts"],"names":[],"mappings":"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"}