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.
- package/README.md +576 -0
- package/dist/cli/generate.d.ts +2 -0
- package/dist/cli/generate.d.ts.map +1 -0
- package/dist/cli/generate.js +416 -0
- package/dist/cli/generate.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +43 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +2 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +81 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/report.d.ts +2 -0
- package/dist/cli/report.d.ts.map +1 -0
- package/dist/cli/report.js +137 -0
- package/dist/cli/report.js.map +1 -0
- package/dist/cli/scan.d.ts +2 -0
- package/dist/cli/scan.d.ts.map +1 -0
- package/dist/cli/scan.js +62 -0
- package/dist/cli/scan.js.map +1 -0
- package/dist/cli/watch-i18n.d.ts +2 -0
- package/dist/cli/watch-i18n.d.ts.map +1 -0
- package/dist/cli/watch-i18n.js +73 -0
- package/dist/cli/watch-i18n.js.map +1 -0
- package/dist/cli/watch.d.ts +2 -0
- package/dist/cli/watch.d.ts.map +1 -0
- package/dist/cli/watch.js +147 -0
- package/dist/cli/watch.js.map +1 -0
- package/dist/core/i18nGenerator.d.ts +16 -0
- package/dist/core/i18nGenerator.d.ts.map +1 -0
- package/dist/core/i18nGenerator.js +139 -0
- package/dist/core/i18nGenerator.js.map +1 -0
- package/dist/core/projectScanner.d.ts +12 -0
- package/dist/core/projectScanner.d.ts.map +1 -0
- package/dist/core/projectScanner.js +53 -0
- package/dist/core/projectScanner.js.map +1 -0
- package/dist/core/stringExtractor.d.ts +21 -0
- package/dist/core/stringExtractor.d.ts.map +1 -0
- package/dist/core/stringExtractor.js +268 -0
- package/dist/core/stringExtractor.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/package.json +44 -0
- package/src/cli/generate.ts +422 -0
- package/src/cli/index.ts +50 -0
- package/src/cli/init.ts +96 -0
- package/src/cli/report.ts +160 -0
- package/src/cli/scan.ts +69 -0
- package/src/cli/watch-i18n.ts +77 -0
- package/src/cli/watch.ts +129 -0
- package/src/core/i18nGenerator.ts +127 -0
- package/src/core/projectScanner.ts +62 -0
- package/src/core/stringExtractor.ts +276 -0
- package/src/index.ts +7 -0
- package/tsconfig.json +20 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface FileInfo {
|
|
2
|
+
path: string;
|
|
3
|
+
content: string;
|
|
4
|
+
size: number;
|
|
5
|
+
}
|
|
6
|
+
export declare class ProjectScanner {
|
|
7
|
+
private readonly extensions;
|
|
8
|
+
private readonly excludePatterns;
|
|
9
|
+
scanProject(rootPath?: string): Promise<FileInfo[]>;
|
|
10
|
+
getProjectStructure(rootPath?: string): Promise<string[]>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=projectScanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projectScanner.d.ts","sourceRoot":"","sources":["../../src/core/projectScanner.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA2C;IACtE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAM9B;IAEI,WAAW,CAAC,QAAQ,GAAE,MAAsB,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IA6BlE,mBAAmB,CAAC,QAAQ,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAY/E"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ProjectScanner = void 0;
|
|
4
|
+
const glob_1 = require("glob");
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
class ProjectScanner {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.extensions = ['.ts', '.tsx', '.js', '.jsx', '.html'];
|
|
9
|
+
this.excludePatterns = [
|
|
10
|
+
'**/node_modules/**',
|
|
11
|
+
'**/dist/**',
|
|
12
|
+
'**/build/**',
|
|
13
|
+
'**/.git/**',
|
|
14
|
+
'**/coverage/**'
|
|
15
|
+
];
|
|
16
|
+
}
|
|
17
|
+
async scanProject(rootPath = process.cwd()) {
|
|
18
|
+
const pattern = `**/*.{${this.extensions.map(ext => ext.slice(1)).join(',')}}`;
|
|
19
|
+
const files = await (0, glob_1.glob)(pattern, {
|
|
20
|
+
cwd: rootPath,
|
|
21
|
+
ignore: this.excludePatterns,
|
|
22
|
+
absolute: true
|
|
23
|
+
});
|
|
24
|
+
const fileInfos = [];
|
|
25
|
+
for (const filePath of files) {
|
|
26
|
+
try {
|
|
27
|
+
const content = await fs_1.promises.readFile(filePath, 'utf-8');
|
|
28
|
+
const stats = await fs_1.promises.stat(filePath);
|
|
29
|
+
fileInfos.push({
|
|
30
|
+
path: filePath,
|
|
31
|
+
content,
|
|
32
|
+
size: stats.size
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
console.warn(`Warning: Could not read file ${filePath}:`, error);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return fileInfos;
|
|
40
|
+
}
|
|
41
|
+
async getProjectStructure(rootPath = process.cwd()) {
|
|
42
|
+
const pattern = '**/*';
|
|
43
|
+
const files = await (0, glob_1.glob)(pattern, {
|
|
44
|
+
cwd: rootPath,
|
|
45
|
+
ignore: this.excludePatterns,
|
|
46
|
+
absolute: false,
|
|
47
|
+
nodir: true
|
|
48
|
+
});
|
|
49
|
+
return files.sort();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
exports.ProjectScanner = ProjectScanner;
|
|
53
|
+
//# sourceMappingURL=projectScanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projectScanner.js","sourceRoot":"","sources":["../../src/core/projectScanner.ts"],"names":[],"mappings":";;;AAAA,+BAA4B;AAC5B,2BAAoC;AASpC,MAAa,cAAc;IAA3B;QACmB,eAAU,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACrD,oBAAe,GAAG;YACjC,oBAAoB;YACpB,YAAY;YACZ,aAAa;YACb,YAAY;YACZ,gBAAgB;SACjB,CAAC;IA2CJ,CAAC;IAzCC,KAAK,CAAC,WAAW,CAAC,WAAmB,OAAO,CAAC,GAAG,EAAE;QAChD,MAAM,OAAO,GAAG,SAAS,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;QAE/E,MAAM,KAAK,GAAG,MAAM,IAAA,WAAI,EAAC,OAAO,EAAE;YAChC,GAAG,EAAE,QAAQ;YACb,MAAM,EAAE,IAAI,CAAC,eAAe;YAC5B,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;QAEH,MAAM,SAAS,GAAe,EAAE,CAAC;QAEjC,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,aAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACrD,MAAM,KAAK,GAAG,MAAM,aAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAEtC,SAAS,CAAC,IAAI,CAAC;oBACb,IAAI,EAAE,QAAQ;oBACd,OAAO;oBACP,IAAI,EAAE,KAAK,CAAC,IAAI;iBACjB,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,gCAAgC,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,WAAmB,OAAO,CAAC,GAAG,EAAE;QACxD,MAAM,OAAO,GAAG,MAAM,CAAC;QAEvB,MAAM,KAAK,GAAG,MAAM,IAAA,WAAI,EAAC,OAAO,EAAE;YAChC,GAAG,EAAE,QAAQ;YACb,MAAM,EAAE,IAAI,CAAC,eAAe;YAC5B,QAAQ,EAAE,KAAK;YACf,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;QAEH,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;CACF;AAnDD,wCAmDC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { FileInfo } from './projectScanner';
|
|
2
|
+
export interface ExtractedString {
|
|
3
|
+
text: string;
|
|
4
|
+
key: string;
|
|
5
|
+
filePath: string;
|
|
6
|
+
line: number;
|
|
7
|
+
column: number;
|
|
8
|
+
type: 'jsx' | 'string' | 'template';
|
|
9
|
+
}
|
|
10
|
+
export declare class StringExtractor {
|
|
11
|
+
private readonly minStringLength;
|
|
12
|
+
private readonly excludePatterns;
|
|
13
|
+
extractStrings(files: FileInfo[]): Promise<ExtractedString[]>;
|
|
14
|
+
private extractFromFile;
|
|
15
|
+
private isValidString;
|
|
16
|
+
private isUIText;
|
|
17
|
+
private isTechnicalString;
|
|
18
|
+
private generateKey;
|
|
19
|
+
private deduplicateStrings;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=stringExtractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stringExtractor.d.ts","sourceRoot":"","sources":["../../src/core/stringExtractor.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,UAAU,CAAC;CACrC;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAK;IACrC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAK9B;IAEI,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;YAWrD,eAAe;IAyF7B,OAAO,CAAC,aAAa;IA8BrB,OAAO,CAAC,QAAQ;IA2DhB,OAAO,CAAC,iBAAiB;IA0CzB,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,kBAAkB;CAY3B"}
|
|
@@ -0,0 +1,268 @@
|
|
|
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.StringExtractor = void 0;
|
|
40
|
+
const parser_1 = require("@babel/parser");
|
|
41
|
+
const traverse_1 = __importDefault(require("@babel/traverse"));
|
|
42
|
+
const t = __importStar(require("@babel/types"));
|
|
43
|
+
class StringExtractor {
|
|
44
|
+
constructor() {
|
|
45
|
+
this.minStringLength = 2;
|
|
46
|
+
this.excludePatterns = [
|
|
47
|
+
/^[a-zA-Z]+\.[a-zA-Z]+$/, // property access
|
|
48
|
+
/^[{}()\[\]]$/, // single brackets
|
|
49
|
+
/^\d+$/, // numbers only
|
|
50
|
+
/^[a-zA-Z]$/, // single letters
|
|
51
|
+
];
|
|
52
|
+
}
|
|
53
|
+
async extractStrings(files) {
|
|
54
|
+
const extractedStrings = [];
|
|
55
|
+
for (const file of files) {
|
|
56
|
+
const strings = await this.extractFromFile(file);
|
|
57
|
+
extractedStrings.push(...strings);
|
|
58
|
+
}
|
|
59
|
+
return this.deduplicateStrings(extractedStrings);
|
|
60
|
+
}
|
|
61
|
+
async extractFromFile(file) {
|
|
62
|
+
const strings = [];
|
|
63
|
+
try {
|
|
64
|
+
const ast = (0, parser_1.parse)(file.content, {
|
|
65
|
+
sourceType: 'module',
|
|
66
|
+
plugins: [
|
|
67
|
+
'jsx',
|
|
68
|
+
'typescript',
|
|
69
|
+
'decorators-legacy',
|
|
70
|
+
'classProperties',
|
|
71
|
+
'objectRestSpread',
|
|
72
|
+
'asyncGenerators',
|
|
73
|
+
'functionBind',
|
|
74
|
+
'exportDefaultFrom',
|
|
75
|
+
'exportNamespaceFrom',
|
|
76
|
+
'dynamicImport',
|
|
77
|
+
'nullishCoalescingOperator',
|
|
78
|
+
'optionalChaining'
|
|
79
|
+
]
|
|
80
|
+
});
|
|
81
|
+
const lines = file.content.split('\n');
|
|
82
|
+
(0, traverse_1.default)(ast, {
|
|
83
|
+
// JSX text content
|
|
84
|
+
JSXText: (path) => {
|
|
85
|
+
const text = path.node.value.trim();
|
|
86
|
+
if (this.isValidString(text)) {
|
|
87
|
+
const loc = path.node.loc;
|
|
88
|
+
if (loc) {
|
|
89
|
+
strings.push({
|
|
90
|
+
text,
|
|
91
|
+
key: this.generateKey(text),
|
|
92
|
+
filePath: file.path,
|
|
93
|
+
line: loc.start.line,
|
|
94
|
+
column: loc.start.column,
|
|
95
|
+
type: 'jsx'
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
// String literals
|
|
101
|
+
StringLiteral: (path) => {
|
|
102
|
+
const text = path.node.value;
|
|
103
|
+
if (this.isValidString(text) && this.isUIText(path)) {
|
|
104
|
+
const loc = path.node.loc;
|
|
105
|
+
if (loc) {
|
|
106
|
+
strings.push({
|
|
107
|
+
text,
|
|
108
|
+
key: this.generateKey(text),
|
|
109
|
+
filePath: file.path,
|
|
110
|
+
line: loc.start.line,
|
|
111
|
+
column: loc.start.column,
|
|
112
|
+
type: 'string'
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
// Template literals
|
|
118
|
+
TemplateLiteral: (path) => {
|
|
119
|
+
if (path.node.expressions.length === 0) {
|
|
120
|
+
const text = path.node.quasis[0]?.value.raw;
|
|
121
|
+
if (text && this.isValidString(text)) {
|
|
122
|
+
const loc = path.node.loc;
|
|
123
|
+
if (loc) {
|
|
124
|
+
strings.push({
|
|
125
|
+
text,
|
|
126
|
+
key: this.generateKey(text),
|
|
127
|
+
filePath: file.path,
|
|
128
|
+
line: loc.start.line,
|
|
129
|
+
column: loc.start.column,
|
|
130
|
+
type: 'template'
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
console.warn(`Warning: Could not parse file ${file.path}:`, error);
|
|
140
|
+
}
|
|
141
|
+
return strings;
|
|
142
|
+
}
|
|
143
|
+
isValidString(text) {
|
|
144
|
+
if (!text || text.length < this.minStringLength) {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
// Check if it's likely UI text (contains letters and spaces)
|
|
148
|
+
const hasLetters = /[a-zA-Z]/.test(text);
|
|
149
|
+
const hasSpaces = /\s/.test(text);
|
|
150
|
+
const isSentence = /[.!?]$/.test(text);
|
|
151
|
+
const isPhrase = text.split(' ').length >= 2;
|
|
152
|
+
// Must have letters and either spaces or be a complete sentence
|
|
153
|
+
if (!hasLetters) {
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
// Accept if it has spaces (likely a phrase) or is a complete sentence
|
|
157
|
+
if (hasSpaces || isSentence || isPhrase) {
|
|
158
|
+
return true;
|
|
159
|
+
}
|
|
160
|
+
// For single words, only accept if they're longer and look like UI text
|
|
161
|
+
if (text.length >= 4 && /^[A-Z][a-z]+$/.test(text)) {
|
|
162
|
+
return true;
|
|
163
|
+
}
|
|
164
|
+
// Reject technical strings, single words, or very short strings
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
isUIText(path) {
|
|
168
|
+
const parent = path.parent;
|
|
169
|
+
const text = path.node.value;
|
|
170
|
+
// Exclude technical strings that should never be localized
|
|
171
|
+
if (this.isTechnicalString(text)) {
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
// Exclude keys in objects
|
|
175
|
+
if (t.isObjectProperty(parent) && parent.key === path.node) {
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
// Exclude import statements
|
|
179
|
+
if (t.isImportDeclaration(parent)) {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
// Exclude import() calls (dynamic imports)
|
|
183
|
+
if (t.isCallExpression(parent) &&
|
|
184
|
+
parent.callee.type === 'Import') {
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
// Exclude require calls
|
|
188
|
+
if (t.isCallExpression(parent) &&
|
|
189
|
+
t.isIdentifier(parent.callee) &&
|
|
190
|
+
parent.callee.name === 'require') {
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
// Exclude document.getElementById calls
|
|
194
|
+
if (t.isCallExpression(parent) &&
|
|
195
|
+
t.isMemberExpression(parent.callee) &&
|
|
196
|
+
t.isIdentifier(parent.callee.object) &&
|
|
197
|
+
parent.callee.object.name === 'document' &&
|
|
198
|
+
t.isIdentifier(parent.callee.property) &&
|
|
199
|
+
parent.callee.property.name === 'getElementById') {
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
// Exclude variable declarations that look like constants
|
|
203
|
+
if (t.isVariableDeclarator(parent) &&
|
|
204
|
+
t.isIdentifier(parent.id) &&
|
|
205
|
+
/^[A-Z_]+$/.test(parent.id.name)) {
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
// Exclude test function names
|
|
209
|
+
if (t.isCallExpression(parent) &&
|
|
210
|
+
t.isIdentifier(parent.callee) &&
|
|
211
|
+
parent.callee.name === 'test') {
|
|
212
|
+
return false;
|
|
213
|
+
}
|
|
214
|
+
return true;
|
|
215
|
+
}
|
|
216
|
+
isTechnicalString(text) {
|
|
217
|
+
// DOM IDs that should never be localized
|
|
218
|
+
const domIds = ['root', 'app', 'main', 'header', 'footer', 'nav', 'sidebar', 'content'];
|
|
219
|
+
// Package names that should never be localized
|
|
220
|
+
const packageNames = ['web-vitals', 'react', 'react-dom', 'react-scripts'];
|
|
221
|
+
// File extensions and paths
|
|
222
|
+
const filePatterns = /\.(js|ts|tsx|jsx|json|css|html|svg|png|jpg|jpeg|gif|ico)$/;
|
|
223
|
+
// URLs and protocols
|
|
224
|
+
const urlPatterns = /^(https?:\/\/|ftp:\/\/|mailto:|tel:)/;
|
|
225
|
+
// Environment variables and config keys
|
|
226
|
+
const envPatterns = /^[A-Z_]+$/;
|
|
227
|
+
// Technical identifiers (short, lowercase with underscores/hyphens)
|
|
228
|
+
const technicalPatterns = /^[a-z][a-z0-9_-]*$/;
|
|
229
|
+
// Additional patterns for React-specific technical strings
|
|
230
|
+
const reactPatterns = /^(app|src|component|element|container|wrapper|header|footer|nav|sidebar|content|main|root)([A-Z][a-z0-9]*)*$/;
|
|
231
|
+
// Check if it's a CSS class or ID pattern
|
|
232
|
+
const cssPatterns = /^[a-z][a-z0-9-]*-[a-z][a-z0-9-]*$/;
|
|
233
|
+
// Check if it's a file path or component name
|
|
234
|
+
const filePathPatterns = /^[a-z][a-z0-9]*\.[a-z]+$/;
|
|
235
|
+
// Check against all patterns
|
|
236
|
+
return domIds.includes(text) ||
|
|
237
|
+
packageNames.includes(text) ||
|
|
238
|
+
filePatterns.test(text) ||
|
|
239
|
+
urlPatterns.test(text) ||
|
|
240
|
+
envPatterns.test(text) ||
|
|
241
|
+
(technicalPatterns.test(text) && text.length < 20) ||
|
|
242
|
+
reactPatterns.test(text) ||
|
|
243
|
+
cssPatterns.test(text) ||
|
|
244
|
+
filePathPatterns.test(text) ||
|
|
245
|
+
text.includes('.') && text.includes('/') ||
|
|
246
|
+
text.includes('_') && text.length < 15;
|
|
247
|
+
}
|
|
248
|
+
generateKey(text) {
|
|
249
|
+
return text
|
|
250
|
+
.toLowerCase()
|
|
251
|
+
.replace(/[^a-z0-9\s]/g, '')
|
|
252
|
+
.replace(/\s+/g, '_')
|
|
253
|
+
.replace(/^[^a-z]/, '')
|
|
254
|
+
.substring(0, 50);
|
|
255
|
+
}
|
|
256
|
+
deduplicateStrings(strings) {
|
|
257
|
+
const seen = new Map();
|
|
258
|
+
for (const str of strings) {
|
|
259
|
+
const existing = seen.get(str.text);
|
|
260
|
+
if (!existing || str.type === 'jsx') {
|
|
261
|
+
seen.set(str.text, str);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
return Array.from(seen.values());
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
exports.StringExtractor = StringExtractor;
|
|
268
|
+
//# sourceMappingURL=stringExtractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stringExtractor.js","sourceRoot":"","sources":["../../src/core/stringExtractor.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { ProjectScanner } from './core/projectScanner';
|
|
2
|
+
export { StringExtractor } from './core/stringExtractor';
|
|
3
|
+
export { I18nGenerator } from './core/i18nGenerator';
|
|
4
|
+
export type { FileInfo } from './core/projectScanner';
|
|
5
|
+
export type { ExtractedString } from './core/stringExtractor';
|
|
6
|
+
export type { I18nConfig } from './core/i18nGenerator';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,YAAY,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,YAAY,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.I18nGenerator = exports.StringExtractor = exports.ProjectScanner = void 0;
|
|
4
|
+
var projectScanner_1 = require("./core/projectScanner");
|
|
5
|
+
Object.defineProperty(exports, "ProjectScanner", { enumerable: true, get: function () { return projectScanner_1.ProjectScanner; } });
|
|
6
|
+
var stringExtractor_1 = require("./core/stringExtractor");
|
|
7
|
+
Object.defineProperty(exports, "StringExtractor", { enumerable: true, get: function () { return stringExtractor_1.StringExtractor; } });
|
|
8
|
+
var i18nGenerator_1 = require("./core/i18nGenerator");
|
|
9
|
+
Object.defineProperty(exports, "I18nGenerator", { enumerable: true, get: function () { return i18nGenerator_1.I18nGenerator; } });
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,wDAAuD;AAA9C,gHAAA,cAAc,OAAA;AACvB,0DAAyD;AAAhD,kHAAA,eAAe,OAAA;AACxB,sDAAqD;AAA5C,8GAAA,aAAa,OAAA"}
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "transcripto-cli",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Enhanced Transcripto CLI - Interactive localization with automatic lingo.dev integration and language dropdown generation",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"transcripto": "dist/cli/index.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "tsc",
|
|
11
|
+
"dev": "ts-node src/cli/index.ts",
|
|
12
|
+
"start": "node dist/cli/index.js"
|
|
13
|
+
},
|
|
14
|
+
"keywords": [
|
|
15
|
+
"i18n",
|
|
16
|
+
"localization",
|
|
17
|
+
"automation",
|
|
18
|
+
"cli",
|
|
19
|
+
"lingo.dev"
|
|
20
|
+
],
|
|
21
|
+
"author": "rashmi-b-r",
|
|
22
|
+
"license": "MIT",
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"@babel/generator": "^7.23.0",
|
|
25
|
+
"@babel/parser": "^7.23.0",
|
|
26
|
+
"@babel/traverse": "^7.23.0",
|
|
27
|
+
"@babel/types": "^7.23.0",
|
|
28
|
+
"chalk": "^4.1.2",
|
|
29
|
+
"chokidar": "^3.5.3",
|
|
30
|
+
"commander": "^11.0.0",
|
|
31
|
+
"fs-extra": "^11.1.1",
|
|
32
|
+
"glob": "^10.3.0",
|
|
33
|
+
"inquirer": "^8.2.6"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@types/babel__generator": "^7.27.0",
|
|
37
|
+
"@types/babel__traverse": "^7.28.0",
|
|
38
|
+
"@types/fs-extra": "^11.0.1",
|
|
39
|
+
"@types/inquirer": "^9.0.3",
|
|
40
|
+
"@types/node": "^20.0.0",
|
|
41
|
+
"ts-node": "^10.9.0",
|
|
42
|
+
"typescript": "^5.0.0"
|
|
43
|
+
}
|
|
44
|
+
}
|