@better-i18n/cli 0.1.0 → 0.1.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.
- package/dist/analyzer/file-collector.d.ts.map +1 -1
- package/dist/analyzer/file-collector.js +48 -9
- package/dist/analyzer/file-collector.js.map +1 -1
- package/dist/analyzer/rules/jsx-text.d.ts.map +1 -1
- package/dist/analyzer/rules/jsx-text.js +2 -0
- package/dist/analyzer/rules/jsx-text.js.map +1 -1
- package/dist/context/detector.d.ts.map +1 -1
- package/dist/context/detector.js +48 -23
- package/dist/context/detector.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/reporters/eslint-style.d.ts +1 -1
- package/dist/reporters/eslint-style.d.ts.map +1 -1
- package/dist/reporters/eslint-style.js +15 -12
- package/dist/reporters/eslint-style.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-collector.d.ts","sourceRoot":"","sources":["../../src/analyzer/file-collector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAeD;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"file-collector.d.ts","sourceRoot":"","sources":["../../src/analyzer/file-collector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAeD;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAqC7E;AA2CD;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAmDT"}
|
|
@@ -21,20 +21,25 @@ const DEFAULT_EXTENSIONS = [".tsx", ".jsx"];
|
|
|
21
21
|
* Collect files to analyze
|
|
22
22
|
*/
|
|
23
23
|
export async function collectFiles(options) {
|
|
24
|
-
const { rootDir, include = DEFAULT_INCLUDE,
|
|
24
|
+
const { rootDir, include = DEFAULT_INCLUDE, extensions = DEFAULT_EXTENSIONS, } = options;
|
|
25
|
+
// Merge default excludes with user-provided excludes
|
|
26
|
+
const allExcludes = [...DEFAULT_EXCLUDE, ...(options.exclude || [])];
|
|
25
27
|
const files = [];
|
|
26
|
-
|
|
28
|
+
// Directory names to exclude (no glob)
|
|
29
|
+
const excludeSet = new Set(allExcludes.filter((e) => !e.includes("*")));
|
|
30
|
+
// Glob patterns to exclude
|
|
31
|
+
const globPatterns = allExcludes.filter((e) => e.includes("*"));
|
|
27
32
|
// Check which include directories exist
|
|
28
33
|
const existingDirs = include.filter((dir) => existsSync(join(rootDir, dir)));
|
|
29
34
|
// If no include dirs exist, scan root
|
|
30
35
|
const dirsToScan = existingDirs.length > 0 ? existingDirs : ["."];
|
|
31
36
|
for (const dir of dirsToScan) {
|
|
32
37
|
const fullDir = join(rootDir, dir);
|
|
33
|
-
collectFromDir(fullDir, rootDir, files, excludeSet, extensions);
|
|
38
|
+
collectFromDir(fullDir, rootDir, files, excludeSet, extensions, globPatterns);
|
|
34
39
|
}
|
|
35
40
|
return files;
|
|
36
41
|
}
|
|
37
|
-
function collectFromDir(dir, rootDir, files, excludeSet, extensions) {
|
|
42
|
+
function collectFromDir(dir, rootDir, files, excludeSet, extensions, globPatterns = []) {
|
|
38
43
|
try {
|
|
39
44
|
const entries = readdirSync(dir, { withFileTypes: true });
|
|
40
45
|
for (const entry of entries) {
|
|
@@ -42,11 +47,17 @@ function collectFromDir(dir, rootDir, files, excludeSet, extensions) {
|
|
|
42
47
|
continue;
|
|
43
48
|
const fullPath = join(dir, entry.name);
|
|
44
49
|
if (entry.isDirectory()) {
|
|
45
|
-
|
|
50
|
+
// Check if directory matches glob pattern like **/components/ui/**
|
|
51
|
+
if (shouldExcludeFile(fullPath, globPatterns))
|
|
52
|
+
continue;
|
|
53
|
+
collectFromDir(fullPath, rootDir, files, excludeSet, extensions, globPatterns);
|
|
46
54
|
}
|
|
47
55
|
else if (entry.isFile()) {
|
|
48
56
|
const ext = entry.name.slice(entry.name.lastIndexOf("."));
|
|
49
57
|
if (extensions.includes(ext)) {
|
|
58
|
+
// Check if file matches glob pattern
|
|
59
|
+
if (shouldExcludeFile(fullPath, globPatterns))
|
|
60
|
+
continue;
|
|
50
61
|
files.push(fullPath);
|
|
51
62
|
}
|
|
52
63
|
}
|
|
@@ -62,17 +73,45 @@ function collectFromDir(dir, rootDir, files, excludeSet, extensions) {
|
|
|
62
73
|
export function shouldExcludeFile(filePath, patterns) {
|
|
63
74
|
const fileName = filePath.split("/").pop() || "";
|
|
64
75
|
for (const pattern of patterns) {
|
|
65
|
-
|
|
76
|
+
// Handle **/filename.ext pattern (match filename anywhere)
|
|
77
|
+
if (pattern.startsWith("**/") && !pattern.slice(3).includes("/")) {
|
|
78
|
+
const filePattern = pattern.slice(3); // Remove **/
|
|
79
|
+
if (filePattern.includes("*")) {
|
|
80
|
+
// Convert glob to regex: *.stories.tsx -> .*\.stories\.tsx
|
|
81
|
+
const regex = new RegExp("^" + filePattern.replace(/\./g, "\\.").replace(/\*/g, ".*") + "$");
|
|
82
|
+
if (regex.test(fileName))
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
else if (fileName === filePattern) {
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// Handle **/dir/** pattern (match directory path)
|
|
90
|
+
else if (pattern.startsWith("**/") && pattern.endsWith("/**")) {
|
|
91
|
+
const dirName = pattern.slice(3, -3); // Remove **/ and /**
|
|
92
|
+
if (filePath.includes(`/${dirName}/`) ||
|
|
93
|
+
filePath.includes(`${dirName}/`)) {
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// Handle **/*.ext pattern (match extension)
|
|
98
|
+
else if (pattern.startsWith("**/*.")) {
|
|
66
99
|
const ext = pattern.slice(4);
|
|
67
100
|
if (fileName.endsWith(ext))
|
|
68
101
|
return true;
|
|
69
102
|
}
|
|
103
|
+
// Handle simple glob
|
|
70
104
|
else if (pattern.includes("*")) {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
105
|
+
const regex = new RegExp("^" +
|
|
106
|
+
pattern
|
|
107
|
+
.replace(/\./g, "\\.")
|
|
108
|
+
.replace(/\*\*/g, ".*")
|
|
109
|
+
.replace(/\*/g, "[^/]*") +
|
|
110
|
+
"$");
|
|
111
|
+
if (regex.test(filePath) || regex.test(fileName))
|
|
74
112
|
return true;
|
|
75
113
|
}
|
|
114
|
+
// Simple string match
|
|
76
115
|
else if (filePath.includes(pattern)) {
|
|
77
116
|
return true;
|
|
78
117
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-collector.js","sourceRoot":"","sources":["../../src/analyzer/file-collector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAUjC,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;AAC9D,MAAM,eAAe,GAAG;IACtB,cAAc;IACd,MAAM;IACN,OAAO;IACP,MAAM;IACN,OAAO;IACP,KAAK;IACL,WAAW;IACX,WAAW;CACZ,CAAC;AACF,MAAM,kBAAkB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE5C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAuB;IACxD,MAAM,EACJ,OAAO,EACP,OAAO,GAAG,eAAe,EACzB,
|
|
1
|
+
{"version":3,"file":"file-collector.js","sourceRoot":"","sources":["../../src/analyzer/file-collector.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsx-text.d.ts","sourceRoot":"","sources":["../../../src/analyzer/rules/jsx-text.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"jsx-text.d.ts","sourceRoot":"","sources":["../../../src/analyzer/rules/jsx-text.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAiBtD;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,WAAW,GAAG,KAAK,GAAG,IAAI,CAwB7E"}
|
|
@@ -15,6 +15,8 @@ const IGNORE_PATTERNS = [
|
|
|
15
15
|
/^https?:\/\//, // URLs
|
|
16
16
|
/^\//, // Paths
|
|
17
17
|
/^[a-z-]+$/, // CSS-like (lowercase with hyphens only)
|
|
18
|
+
/^&[a-z]+;$/, // HTML entities like " &
|
|
19
|
+
/^&#\d+;$/, // Numeric HTML entities like '
|
|
18
20
|
];
|
|
19
21
|
/**
|
|
20
22
|
* Check JSX text node for hardcoded strings
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsx-text.js","sourceRoot":"","sources":["../../../src/analyzer/rules/jsx-text.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,sBAAsB,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAGvE;;GAEG;AACH,MAAM,eAAe,GAAG;IACtB,eAAe,EAAE,kBAAkB;IACnC,oCAAoC,EAAE,eAAe;IACrD,gBAAgB,EAAE,+BAA+B;IACjD,WAAW,EAAE,iBAAiB;IAC9B,cAAc,EAAE,OAAO;IACvB,KAAK,EAAE,QAAQ;IACf,WAAW,EAAE,yCAAyC;
|
|
1
|
+
{"version":3,"file":"jsx-text.js","sourceRoot":"","sources":["../../../src/analyzer/rules/jsx-text.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,sBAAsB,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAGvE;;GAEG;AACH,MAAM,eAAe,GAAG;IACtB,eAAe,EAAE,kBAAkB;IACnC,oCAAoC,EAAE,eAAe;IACrD,gBAAgB,EAAE,+BAA+B;IACjD,WAAW,EAAE,iBAAiB;IAC9B,cAAc,EAAE,OAAO;IACvB,KAAK,EAAE,QAAQ;IACf,WAAW,EAAE,yCAAyC;IACtD,YAAY,EAAE,yCAAyC;IACvD,UAAU,EAAE,mCAAmC;CAChD,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,IAAgB,EAAE,GAAgB;IAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAE9B,2BAA2B;IAC3B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAE3C,wBAAwB;IACxB,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;QACtC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;IACtC,CAAC;IAED,eAAe;IACf,MAAM,GAAG,GAAG,GAAG,CAAC,UAAU,CAAC,6BAA6B,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAE1E,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,QAAQ;QAClB,IAAI,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC;QAClB,MAAM,EAAE,GAAG,CAAC,SAAS,GAAG,CAAC;QACzB,IAAI;QACJ,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE,SAAS;QACnB,OAAO,EAAE,oBAAoB,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG;QAClD,YAAY,EAAE,sBAAsB,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC;KACzD,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../../src/context/detector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAc,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEvE;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,GAAE,MAAsB,GAC/B,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../../src/context/detector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAc,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEvE;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,GAAE,MAAsB,GAC/B,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAqBhC"}
|
package/dist/context/detector.js
CHANGED
|
@@ -11,11 +11,18 @@ import { dirname, join } from "node:path";
|
|
|
11
11
|
*/
|
|
12
12
|
export async function detectProjectContext(startDir = process.cwd()) {
|
|
13
13
|
try {
|
|
14
|
+
// First check the startDir itself for i18n.config.ts
|
|
15
|
+
const localConfig = findConfigFile(startDir);
|
|
16
|
+
if (localConfig) {
|
|
17
|
+
return parseI18nConfig(localConfig);
|
|
18
|
+
}
|
|
19
|
+
// Then check workspace root
|
|
14
20
|
const workspaceRoot = findWorkspaceRoot(startDir);
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
21
|
+
if (workspaceRoot !== startDir) {
|
|
22
|
+
const configFile = findConfigFile(workspaceRoot);
|
|
23
|
+
if (configFile) {
|
|
24
|
+
return parseI18nConfig(configFile);
|
|
25
|
+
}
|
|
19
26
|
}
|
|
20
27
|
}
|
|
21
28
|
catch (error) {
|
|
@@ -57,14 +64,26 @@ function findWorkspaceRoot(startDir) {
|
|
|
57
64
|
/**
|
|
58
65
|
* Search for i18n config files
|
|
59
66
|
*/
|
|
60
|
-
function findConfigFile(
|
|
67
|
+
function findConfigFile(searchRoot) {
|
|
68
|
+
// First look for i18n.config.ts directly in search root
|
|
69
|
+
const directConfigs = ["i18n.config.ts", "i18n.config.js"];
|
|
70
|
+
for (const configName of directConfigs) {
|
|
71
|
+
const configPath = join(searchRoot, configName);
|
|
72
|
+
if (existsSync(configPath)) {
|
|
73
|
+
return configPath;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Then search subdirectories
|
|
61
77
|
const files = [];
|
|
78
|
+
let foundConfig = null;
|
|
62
79
|
function searchDir(dir, depth = 0) {
|
|
63
|
-
if (depth > 5)
|
|
80
|
+
if (depth > 5 || foundConfig)
|
|
64
81
|
return;
|
|
65
82
|
try {
|
|
66
83
|
const entries = readdirSync(dir);
|
|
67
84
|
for (const entry of entries) {
|
|
85
|
+
if (foundConfig)
|
|
86
|
+
return;
|
|
68
87
|
if (["node_modules", ".git", "dist", "build", ".next"].includes(entry)) {
|
|
69
88
|
continue;
|
|
70
89
|
}
|
|
@@ -74,8 +93,8 @@ function findConfigFile(workspaceRoot) {
|
|
|
74
93
|
searchDir(fullPath, depth + 1);
|
|
75
94
|
}
|
|
76
95
|
else if (/i18n\.config\.(ts|js)$/.test(entry)) {
|
|
77
|
-
|
|
78
|
-
return
|
|
96
|
+
foundConfig = fullPath;
|
|
97
|
+
return;
|
|
79
98
|
}
|
|
80
99
|
else if (/\.(ts|tsx|js|jsx)$/.test(entry)) {
|
|
81
100
|
files.push(fullPath);
|
|
@@ -86,17 +105,11 @@ function findConfigFile(workspaceRoot) {
|
|
|
86
105
|
// Ignore permission errors
|
|
87
106
|
}
|
|
88
107
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
const configPath = join(workspaceRoot, configName);
|
|
93
|
-
if (existsSync(configPath)) {
|
|
94
|
-
return configPath;
|
|
95
|
-
}
|
|
108
|
+
searchDir(searchRoot);
|
|
109
|
+
if (foundConfig) {
|
|
110
|
+
return foundConfig;
|
|
96
111
|
}
|
|
97
|
-
//
|
|
98
|
-
searchDir(workspaceRoot);
|
|
99
|
-
// Search for createI18n import
|
|
112
|
+
// Search for createI18n import as fallback
|
|
100
113
|
for (const file of files) {
|
|
101
114
|
try {
|
|
102
115
|
const content = readFileSync(file, "utf-8");
|
|
@@ -116,13 +129,27 @@ function findConfigFile(workspaceRoot) {
|
|
|
116
129
|
*/
|
|
117
130
|
function parseI18nConfig(filePath) {
|
|
118
131
|
const content = readFileSync(filePath, "utf-8");
|
|
119
|
-
// Try project
|
|
132
|
+
// Try project = "org/slug" format (exported const)
|
|
133
|
+
const projectConstMatch = content.match(/(?:export\s+)?const\s+project\s*=\s*['"]([^'"]+\/[^'"]+)['"]/);
|
|
134
|
+
if (projectConstMatch) {
|
|
135
|
+
const [workspaceId, projectSlug] = projectConstMatch[1].split("/");
|
|
136
|
+
const localeMatch = content.match(/defaultLocale[:\s]*['"]([^'"]+)['"]/);
|
|
137
|
+
const cdnMatch = content.match(/cdnBaseUrl[:\s]*['"]([^'"]+)['"]/);
|
|
138
|
+
const lint = parseLintConfig(content);
|
|
139
|
+
return {
|
|
140
|
+
workspaceId,
|
|
141
|
+
projectSlug,
|
|
142
|
+
defaultLocale: localeMatch?.[1] || "en",
|
|
143
|
+
cdnBaseUrl: cdnMatch?.[1],
|
|
144
|
+
lint,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
// Try project: "org/slug" format (object property)
|
|
120
148
|
const projectMatch = content.match(/project:\s*['"]([^'"]+\/[^'"]+)['"]/);
|
|
121
149
|
if (projectMatch) {
|
|
122
150
|
const [workspaceId, projectSlug] = projectMatch[1].split("/");
|
|
123
151
|
const localeMatch = content.match(/defaultLocale:\s*['"]([^'"]+)['"]/);
|
|
124
152
|
const cdnMatch = content.match(/cdnBaseUrl:\s*['"]([^'"]+)['"]/);
|
|
125
|
-
// Try to parse lint config
|
|
126
153
|
const lint = parseLintConfig(content);
|
|
127
154
|
return {
|
|
128
155
|
workspaceId,
|
|
@@ -153,9 +180,7 @@ function parseI18nConfig(filePath) {
|
|
|
153
180
|
* Parse optional lint config from file content
|
|
154
181
|
*/
|
|
155
182
|
function parseLintConfig(content) {
|
|
156
|
-
|
|
157
|
-
// In real implementation, could use AST parsing
|
|
158
|
-
if (!content.includes("lint:")) {
|
|
183
|
+
if (!content.includes("lint:") && !content.includes("lint =")) {
|
|
159
184
|
return undefined;
|
|
160
185
|
}
|
|
161
186
|
const config = {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detector.js","sourceRoot":"","sources":["../../src/context/detector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAG1C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,WAAmB,OAAO,CAAC,GAAG,EAAE;IAEhC,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"detector.js","sourceRoot":"","sources":["../../src/context/detector.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -10,7 +10,7 @@ import { scanCommand } from "./commands/scan.js";
|
|
|
10
10
|
program
|
|
11
11
|
.name("better-i18n")
|
|
12
12
|
.description("Detect hardcoded strings in your React/Next.js app")
|
|
13
|
-
.version("0.1.
|
|
13
|
+
.version("0.1.1");
|
|
14
14
|
program
|
|
15
15
|
.command("scan")
|
|
16
16
|
.description("Scan source files for untranslated strings")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eslint-style.d.ts","sourceRoot":"","sources":["../../src/reporters/eslint-style.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"eslint-style.d.ts","sourceRoot":"","sources":["../../src/reporters/eslint-style.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAGlD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAyDxE"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* ESLint-style terminal reporter
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* VS Code terminal auto-detects "path:line:column" format and makes it Cmd+clickable
|
|
5
5
|
*/
|
|
6
6
|
import { relative } from "node:path";
|
|
7
|
-
import { bold, dim, red,
|
|
7
|
+
import { bold, cyan, dim, red, yellow } from "../utils/colors.js";
|
|
8
8
|
/**
|
|
9
9
|
* Report issues in ESLint-style format
|
|
10
10
|
*/
|
|
@@ -19,34 +19,37 @@ export function reportEslintStyle(issues, rootDir) {
|
|
|
19
19
|
byFile.set(issue.file, existing);
|
|
20
20
|
}
|
|
21
21
|
let errorCount = 0;
|
|
22
|
-
let
|
|
23
|
-
// Print each file
|
|
22
|
+
let missingCount = 0;
|
|
23
|
+
// Print each file's issues grouped by file
|
|
24
24
|
for (const [file, fileIssues] of byFile.entries()) {
|
|
25
25
|
const relPath = relative(rootDir, file);
|
|
26
26
|
console.log();
|
|
27
|
-
|
|
27
|
+
// File header: blue filename + issue count
|
|
28
|
+
const count = dim(`(${fileIssues.length})`);
|
|
29
|
+
console.log(`${cyan(relPath)} ${count}`);
|
|
28
30
|
for (const issue of fileIssues) {
|
|
31
|
+
// Format: " line:col severity message rule"
|
|
32
|
+
// Full path clickable: relPath:line:col
|
|
29
33
|
const loc = dim(`${issue.line}:${issue.column}`);
|
|
30
|
-
const severity = issue.severity === "error" ? red("error") : yellow("
|
|
34
|
+
const severity = issue.severity === "error" ? red("error") : yellow("missing");
|
|
35
|
+
const text = truncateForDisplay(issue.text, 40);
|
|
31
36
|
const rule = dim(`i18n/${issue.type}`);
|
|
32
|
-
const text = truncateForDisplay(issue.text, 50);
|
|
33
37
|
console.log(` ${loc} ${severity} ${text} ${rule}`);
|
|
34
38
|
if (issue.severity === "error") {
|
|
35
39
|
errorCount++;
|
|
36
40
|
}
|
|
37
41
|
else {
|
|
38
|
-
|
|
42
|
+
missingCount++;
|
|
39
43
|
}
|
|
40
44
|
}
|
|
41
45
|
}
|
|
42
46
|
// Summary
|
|
43
|
-
|
|
44
|
-
const total = errorCount + warningCount;
|
|
47
|
+
const total = errorCount + missingCount;
|
|
45
48
|
const summary = [];
|
|
46
49
|
if (errorCount > 0)
|
|
47
50
|
summary.push(red(`${errorCount} error${errorCount > 1 ? "s" : ""}`));
|
|
48
|
-
if (
|
|
49
|
-
summary.push(yellow(`${
|
|
51
|
+
if (missingCount > 0)
|
|
52
|
+
summary.push(yellow(`${missingCount} missing translation${missingCount > 1 ? "s" : ""}`));
|
|
50
53
|
console.log(bold(`✖ ${total} problem${total > 1 ? "s" : ""} (${summary.join(", ")})`));
|
|
51
54
|
}
|
|
52
55
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eslint-style.js","sourceRoot":"","sources":["../../src/reporters/eslint-style.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,OAAO,
|
|
1
|
+
{"version":3,"file":"eslint-style.js","sourceRoot":"","sources":["../../src/reporters/eslint-style.ts"],"names":[],"mappings":"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"}
|