@better-i18n/cli 0.1.3 → 0.1.5

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO;KACJ,IAAI,CAAC,aAAa,CAAC;KACnB,WAAW,CACV,iFAAiF,CAClF;KACA,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,4CAA4C,CAAC;KACzD,MAAM,CAAC,kBAAkB,EAAE,gDAAgD,CAAC;KAC5E,MAAM,CAAC,qBAAqB,EAAE,6BAA6B,EAAE,QAAQ,CAAC;KACtE,MAAM,CACL,uBAAuB,EACvB,oDAAoD,EACpD,QAAQ,CACT;KACA,MAAM,CAAC,OAAO,EAAE,wCAAwC,CAAC;KACzD,MAAM,CAAC,MAAM,EAAE,+CAA+C,CAAC;KAC/D,MAAM,CAAC,UAAU,EAAE,4BAA4B,CAAC;KAChD,MAAM,CAAC,WAAW,EAAE,sBAAsB,CAAC;KAC3C,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,cAAc,CAAC;KACvB,KAAK,CAAC,SAAS,CAAC;KAChB,WAAW,CAAC,wDAAwD,CAAC;KACrE,MAAM,CAAC,kBAAkB,EAAE,gDAAgD,CAAC;KAC5E,MAAM,CAAC,qBAAqB,EAAE,6BAA6B,EAAE,QAAQ,CAAC;KACtE,MAAM,CAAC,WAAW,EAAE,mCAAmC,CAAC;KACxD,MAAM,CAAC,iBAAiB,EAAE,wCAAwC,CAAC;KACnE,MAAM,CAAC,WAAW,EAAE,sBAAsB,CAAC;KAC3C,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAE9B,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO;KACJ,IAAI,CAAC,aAAa,CAAC;KACnB,WAAW,CACV,sEAAsE,CACvE;KACA,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,4CAA4C,CAAC;KACzD,MAAM,CAAC,kBAAkB,EAAE,gDAAgD,CAAC;KAC5E,MAAM,CAAC,qBAAqB,EAAE,6BAA6B,EAAE,QAAQ,CAAC;KACtE,MAAM,CACL,uBAAuB,EACvB,oDAAoD,EACpD,QAAQ,CACT;KACA,MAAM,CAAC,OAAO,EAAE,wCAAwC,CAAC;KACzD,MAAM,CAAC,MAAM,EAAE,+CAA+C,CAAC;KAC/D,MAAM,CAAC,UAAU,EAAE,4BAA4B,CAAC;KAChD,MAAM,CAAC,WAAW,EAAE,sBAAsB,CAAC;KAC3C,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,uDAAuD,CAAC;KACpE,MAAM,CAAC,kBAAkB,EAAE,gDAAgD,CAAC;KAC5E,MAAM,CAAC,qBAAqB,EAAE,6BAA6B,EAAE,QAAQ,CAAC;KACtE,MAAM,CAAC,WAAW,EAAE,0CAA0C,CAAC;KAC/D,MAAM,CAAC,WAAW,EAAE,sBAAsB,CAAC;KAC3C,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO,CAAC,KAAK,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@better-i18n/cli",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "CLI tool for detecting hardcoded strings in React/Next.js apps",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -1,13 +0,0 @@
1
- /**
2
- * Extract translation keys command
3
- *
4
- * Extracts all t() function calls and organizes by namespace
5
- */
6
- import type { ScanOptions } from "../analyzer/types.js";
7
- export interface ExtractKeysOptions extends ScanOptions {
8
- compare?: boolean;
9
- locale?: string;
10
- format: "eslint" | "json";
11
- }
12
- export declare function extractKeysCommand(options: ExtractKeysOptions): Promise<void>;
13
- //# sourceMappingURL=extract-keys.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extract-keys.d.ts","sourceRoot":"","sources":["../../src/commands/extract-keys.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAS,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAI/D,MAAM,WAAW,kBAAmB,SAAQ,WAAW;IACrD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,QAAQ,GAAG,MAAM,CAAC;CAC3B;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,kBAAkB,iBA6InE"}
@@ -1,347 +0,0 @@
1
- /**
2
- * Extract translation keys command
3
- *
4
- * Extracts all t() function calls and organizes by namespace
5
- */
6
- import ora from "ora";
7
- import { collectFiles } from "../analyzer/file-collector.js";
8
- import { analyzeFile } from "../analyzer/index.js";
9
- import { detectProjectContext } from "../context/detector.js";
10
- import { bold, dim, green, red, yellow } from "../utils/colors.js";
11
- export async function extractKeysCommand(options) {
12
- const startTime = Date.now();
13
- const isJson = options.format === "json";
14
- const spinner = isJson
15
- ? {
16
- start: () => { },
17
- stop: () => { },
18
- clear: () => { },
19
- succeed: () => { },
20
- fail: () => { },
21
- warn: () => { },
22
- }
23
- : ora({ text: "Detecting project...", color: "cyan" }).start();
24
- // Step 1: Detect project context
25
- const rootDir = options.dir || process.cwd();
26
- const context = await detectProjectContext(rootDir);
27
- if (context) {
28
- spinner.succeed(`Project: ${bold(context.workspaceId + "/" + context.projectSlug)}`);
29
- }
30
- else {
31
- spinner.warn("No i18n.config.ts found, using defaults");
32
- }
33
- // Step 2: Collect files
34
- spinner.start("Collecting files...");
35
- const files = await collectFiles({
36
- rootDir,
37
- include: context?.lint?.include,
38
- exclude: context?.lint?.exclude,
39
- });
40
- if (files.length === 0) {
41
- spinner.fail("No .tsx or .jsx files found");
42
- return;
43
- }
44
- spinner.succeed(`Found ${files.length} files`);
45
- // Step 3: Analyze files for t() calls
46
- spinner.start("Extracting translation keys...");
47
- const allIssues = [];
48
- for (const file of files) {
49
- try {
50
- const issues = await analyzeFile(file, context?.lint);
51
- // Filter only translation function calls
52
- const translationKeys = issues.filter((i) => i.type === "string-variable");
53
- allIssues.push(...translationKeys);
54
- }
55
- catch (error) {
56
- if (options.verbose) {
57
- console.error(`Error analyzing ${file}:`, error);
58
- }
59
- }
60
- }
61
- spinner.clear();
62
- // Step 4: Organize keys by namespace
63
- const keysByNamespace = groupKeysByNamespace(allIssues);
64
- const localKeys = {
65
- project: context
66
- ? `${context.workspaceId}/${context.projectSlug}`
67
- : "unknown",
68
- namespaces: keysByNamespace,
69
- totalCount: allIssues.length,
70
- filesScanned: files.length,
71
- };
72
- // Step 5: Compare with CDN if requested
73
- if (options.compare && context?.cdnBaseUrl) {
74
- const locale = options.locale || context.defaultLocale || "en";
75
- spinner.start(`Comparing with CDN (${locale})...`);
76
- try {
77
- const remoteKeys = await fetchRemoteKeys(context.cdnBaseUrl, context.workspaceId, context.projectSlug, locale);
78
- spinner.succeed(`Fetched ${Object.keys(remoteKeys).length} namespaces from CDN`);
79
- // Compare
80
- const comparison = compareKeys(localKeys.namespaces, remoteKeys);
81
- const duration = Date.now() - startTime;
82
- // Report comparison
83
- if (options.format === "json") {
84
- const output = {
85
- comparison: {
86
- localKeys,
87
- remoteKeys: {
88
- namespaces: remoteKeys,
89
- totalCount: countTotalKeys(remoteKeys),
90
- },
91
- missingKeys: comparison.missing,
92
- unusedKeys: comparison.unused,
93
- coverage: {
94
- local: calculateCoverage(localKeys.totalCount, comparison.missing),
95
- remote: calculateRemoteCoverage(localKeys.namespaces, remoteKeys),
96
- },
97
- },
98
- files: files.length,
99
- duration,
100
- };
101
- console.log(JSON.stringify(output, null, 2));
102
- }
103
- else {
104
- reportComparisonReport(localKeys, remoteKeys, comparison, duration);
105
- }
106
- }
107
- catch (error) {
108
- spinner.fail(`Failed to fetch remote keys: ${error instanceof Error ? error.message : String(error)}`);
109
- reportLocalKeys(localKeys, allIssues.length, Date.now() - startTime);
110
- }
111
- }
112
- else {
113
- // Just report local keys
114
- const duration = Date.now() - startTime;
115
- if (options.format === "json") {
116
- const output = {
117
- localKeys,
118
- files: files.length,
119
- duration,
120
- };
121
- console.log(JSON.stringify(output, null, 2));
122
- }
123
- else {
124
- reportLocalKeys(localKeys, allIssues.length, duration);
125
- }
126
- }
127
- }
128
- /**
129
- * Group keys by namespace
130
- */
131
- function groupKeysByNamespace(issues) {
132
- const result = {};
133
- for (const issue of issues) {
134
- if (!issue.key)
135
- continue;
136
- const parts = issue.key.split(".");
137
- const namespace = parts.length > 1 ? parts[0] : "default";
138
- const fullKey = issue.key;
139
- if (!result[namespace]) {
140
- result[namespace] = new Set();
141
- }
142
- result[namespace].add(fullKey);
143
- }
144
- // Convert Sets to arrays
145
- const output = {};
146
- for (const [namespace, keys] of Object.entries(result)) {
147
- output[namespace] = Array.from(keys).sort();
148
- }
149
- return output;
150
- }
151
- /**
152
- * Fetch remote keys from CDN
153
- */
154
- async function fetchRemoteKeys(cdnBaseUrl, workspaceId, projectSlug, locale) {
155
- const url = `${cdnBaseUrl}/${workspaceId}/${projectSlug}/${locale}/translations.json`;
156
- const response = await fetch(url);
157
- if (!response.ok) {
158
- throw new Error(`CDN fetch failed (${response.status})`);
159
- }
160
- return response.json();
161
- }
162
- /**
163
- * Compare local and remote keys
164
- */
165
- function compareKeys(localKeys, remoteKeys) {
166
- const missing = {};
167
- const unused = {};
168
- const allNamespaces = new Set([
169
- ...Object.keys(localKeys),
170
- ...Object.keys(flattenKeys(remoteKeys)),
171
- ]);
172
- for (const namespace of allNamespaces) {
173
- const local = new Set(localKeys[namespace] || []);
174
- const remote = new Set(getNamespaceKeys(remoteKeys, namespace));
175
- // Missing in remote (need to add)
176
- const missingInRemote = Array.from(local).filter((k) => !remote.has(k));
177
- if (missingInRemote.length > 0) {
178
- missing[namespace] = missingInRemote;
179
- }
180
- // Unused in local (in remote but not used)
181
- const unusedInLocal = Array.from(remote).filter((k) => !local.has(k));
182
- if (unusedInLocal.length > 0) {
183
- unused[namespace] = unusedInLocal;
184
- }
185
- }
186
- return { missing, unused };
187
- }
188
- /**
189
- * Flatten remote keys to get all namespaces
190
- */
191
- function flattenKeys(remoteKeys) {
192
- const result = {};
193
- function traverse(obj, prefix = "") {
194
- for (const [key, value] of Object.entries(obj)) {
195
- const fullKey = prefix ? `${prefix}.${key}` : key;
196
- if (typeof value === "string") {
197
- const namespace = fullKey.split(".")[0] || "default";
198
- if (!result[namespace])
199
- result[namespace] = [];
200
- result[namespace].push(fullKey);
201
- }
202
- else if (typeof value === "object" && value !== null) {
203
- traverse(value, fullKey);
204
- }
205
- }
206
- }
207
- traverse(remoteKeys);
208
- return result;
209
- }
210
- /**
211
- * Get keys for a specific namespace from remote
212
- */
213
- function getNamespaceKeys(remoteKeys, namespace) {
214
- const result = [];
215
- const prefix = namespace + ".";
216
- function traverse(obj, currentKey = "") {
217
- for (const [key, value] of Object.entries(obj)) {
218
- const fullKey = currentKey ? `${currentKey}.${key}` : key;
219
- if (typeof value === "string") {
220
- if (fullKey.startsWith(prefix)) {
221
- result.push(fullKey);
222
- }
223
- }
224
- else if (typeof value === "object" && value !== null) {
225
- traverse(value, fullKey);
226
- }
227
- }
228
- }
229
- traverse(remoteKeys);
230
- return result;
231
- }
232
- /**
233
- * Count total keys in nested structure
234
- */
235
- function countTotalKeys(remoteKeys) {
236
- let count = 0;
237
- function traverse(obj) {
238
- for (const value of Object.values(obj)) {
239
- if (typeof value === "string") {
240
- count++;
241
- }
242
- else if (typeof value === "object" && value !== null) {
243
- traverse(value);
244
- }
245
- }
246
- }
247
- traverse(remoteKeys);
248
- return count;
249
- }
250
- /**
251
- * Calculate local coverage (what % of local keys exist in remote)
252
- */
253
- function calculateCoverage(localCount, missing) {
254
- const missingCount = Object.values(missing).reduce((sum, arr) => sum + arr.length, 0);
255
- if (localCount === 0)
256
- return 100;
257
- return Math.round(((localCount - missingCount) / localCount) * 100);
258
- }
259
- /**
260
- * Calculate remote coverage (what % of remote keys are used)
261
- */
262
- function calculateRemoteCoverage(localKeys, remoteKeys) {
263
- const remoteFlattened = flattenKeys(remoteKeys);
264
- let remoteUsedCount = 0;
265
- let remoteTotalCount = 0;
266
- for (const [namespace, keys] of Object.entries(remoteFlattened)) {
267
- const local = new Set(localKeys[namespace] || []);
268
- const used = keys.filter((k) => local.has(k));
269
- remoteUsedCount += used.length;
270
- remoteTotalCount += keys.length;
271
- }
272
- if (remoteTotalCount === 0)
273
- return 0;
274
- return Math.round((remoteUsedCount / remoteTotalCount) * 100);
275
- }
276
- /**
277
- * Report local keys (human-readable)
278
- */
279
- function reportLocalKeys(localKeys, _issueCount, duration) {
280
- console.log();
281
- console.log(bold("📦 Local Translation Keys"));
282
- console.log();
283
- const sortedNamespaces = Object.keys(localKeys.namespaces).sort();
284
- for (const namespace of sortedNamespaces) {
285
- const keys = localKeys.namespaces[namespace];
286
- console.log(`${dim(`${namespace}:`)} ${keys.length} keys`);
287
- for (const key of keys) {
288
- console.log(` ${dim("•")} ${key}`);
289
- }
290
- console.log();
291
- }
292
- console.log(green(bold(`✓ Found ${localKeys.totalCount} translation keys`)));
293
- console.log(dim(`Scanned ${localKeys.filesScanned} files in ${(duration / 1000).toFixed(2)}s`));
294
- }
295
- /**
296
- * Report comparison (human-readable)
297
- */
298
- function reportComparisonReport(localKeys, remoteKeys, comparison, duration) {
299
- console.log();
300
- console.log(bold("📊 Translation Keys Comparison"));
301
- console.log();
302
- // Coverage
303
- const localCoverage = calculateCoverage(localKeys.totalCount, comparison.missing);
304
- const remoteCoverage = calculateRemoteCoverage(localKeys.namespaces, remoteKeys);
305
- console.log(`${dim("Coverage:")}`);
306
- console.log(` Local → Remote: ${localCoverage}%`);
307
- console.log(` Remote Used: ${remoteCoverage}%`);
308
- console.log();
309
- // Missing keys
310
- const totalMissing = Object.values(comparison.missing).reduce((sum, arr) => sum + arr.length, 0);
311
- if (totalMissing > 0) {
312
- console.log(`${red(bold(`❌ Missing in Remote (${totalMissing} keys):`))}`);
313
- console.log();
314
- for (const [namespace, keys] of Object.entries(comparison.missing)) {
315
- console.log(`${dim(`${namespace}:`)} ${keys.length} keys`);
316
- for (const key of keys) {
317
- console.log(` ${dim("•")} ${key}`);
318
- }
319
- console.log();
320
- }
321
- }
322
- else {
323
- console.log(green(bold("✓ No missing keys!")));
324
- console.log();
325
- }
326
- // Unused keys
327
- const totalUnused = Object.values(comparison.unused).reduce((sum, arr) => sum + arr.length, 0);
328
- if (totalUnused > 0) {
329
- console.log(`${yellow(bold(`⚠️ Unused in Code (${totalUnused} keys):`))}`);
330
- console.log();
331
- for (const [namespace, keys] of Object.entries(comparison.unused).slice(0, 5)) {
332
- console.log(`${dim(`${namespace}:`)} ${keys.length} keys`);
333
- for (const key of keys.slice(0, 3)) {
334
- console.log(` ${dim("•")} ${key}`);
335
- }
336
- if (keys.length > 3) {
337
- console.log(` ${dim(` ... and ${keys.length - 3} more`)}`);
338
- }
339
- console.log();
340
- }
341
- }
342
- // Summary
343
- console.log();
344
- console.log(dim(`Scanned ${localKeys.filesScanned} files in ${(duration / 1000).toFixed(2)}s`));
345
- console.log(green(bold(`✓ Comparison complete`)));
346
- }
347
- //# sourceMappingURL=extract-keys.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extract-keys.js","sourceRoot":"","sources":["../../src/commands/extract-keys.ts"],"names":[],"mappings":"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"}