enterprise-ui-architect-cli 2.1.0 → 2.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.
- package/assets/SKILL.md +231 -25
- package/assets/data/anti-patterns.csv +5 -0
- package/assets/data/industries.csv +16 -16
- package/assets/data/pre-delivery-checklist.csv +8 -0
- package/assets/data/styles.csv +16 -16
- package/assets/templates/base/skill-content.md +4 -4
- package/assets/templates/platforms/copilot.json +4 -1
- package/assets/templates/platforms/cursor.json +4 -1
- package/assets/templates/platforms/windsurf.json +4 -1
- package/dist/commands/audit-ui.d.ts +14 -0
- package/dist/commands/audit-ui.d.ts.map +1 -0
- package/dist/commands/audit-ui.js +306 -0
- package/dist/commands/audit-ui.js.map +1 -0
- package/dist/commands/verify-i18n.d.ts +1 -1
- package/dist/commands/verify-i18n.d.ts.map +1 -1
- package/dist/commands/verify-i18n.js +61 -17
- package/dist/commands/verify-i18n.js.map +1 -1
- package/dist/commands/verify-imports.d.ts +1 -1
- package/dist/commands/verify-imports.d.ts.map +1 -1
- package/dist/commands/verify-imports.js +20 -13
- package/dist/commands/verify-imports.js.map +1 -1
- package/dist/index.js +61 -10
- package/dist/index.js.map +1 -1
- package/package.json +4 -1
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
import { chromium } from "playwright";
|
|
2
|
+
import { existsSync, mkdirSync, writeFileSync } from "fs";
|
|
3
|
+
import { join, resolve } from "path";
|
|
4
|
+
const DEFAULT_VIEWPORT = { width: 1280, height: 720 };
|
|
5
|
+
const DEFAULT_TIMEOUT = 30_000;
|
|
6
|
+
export function parseAuditArgs(args) {
|
|
7
|
+
const result = {
|
|
8
|
+
baseUrl: "http://localhost:3000",
|
|
9
|
+
routes: ["/"],
|
|
10
|
+
outputDir: "./ui-audit",
|
|
11
|
+
viewport: { ...DEFAULT_VIEWPORT },
|
|
12
|
+
timeout: DEFAULT_TIMEOUT,
|
|
13
|
+
waitUntil: "networkidle",
|
|
14
|
+
};
|
|
15
|
+
for (let i = 0; i < args.length; i++) {
|
|
16
|
+
const arg = args[i];
|
|
17
|
+
if (arg === "--url" && i + 1 < args.length) {
|
|
18
|
+
const url = args[++i];
|
|
19
|
+
if (url.startsWith("file://")) {
|
|
20
|
+
throw new Error("audit-ui: file:// URLs are not allowed for security reasons.");
|
|
21
|
+
}
|
|
22
|
+
result.baseUrl = url;
|
|
23
|
+
}
|
|
24
|
+
else if (arg === "--routes" && i + 1 < args.length) {
|
|
25
|
+
result.routes = args[++i].split(",").map((r) => r.trim());
|
|
26
|
+
}
|
|
27
|
+
else if (arg === "--output" && i + 1 < args.length) {
|
|
28
|
+
result.outputDir = args[++i];
|
|
29
|
+
}
|
|
30
|
+
else if (arg === "--viewport" && i + 1 < args.length) {
|
|
31
|
+
const [w, h] = args[++i].split("x").map(Number);
|
|
32
|
+
if (w && h)
|
|
33
|
+
result.viewport = { width: w, height: h };
|
|
34
|
+
}
|
|
35
|
+
else if (arg === "--timeout" && i + 1 < args.length) {
|
|
36
|
+
const t = Number(args[++i]);
|
|
37
|
+
if (t > 0)
|
|
38
|
+
result.timeout = t;
|
|
39
|
+
}
|
|
40
|
+
else if (arg === "--wait-until" && i + 1 < args.length) {
|
|
41
|
+
const w = args[++i];
|
|
42
|
+
if (["load", "domcontentloaded", "networkidle"].includes(w)) {
|
|
43
|
+
result.waitUntil = w;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return result;
|
|
48
|
+
}
|
|
49
|
+
async function runChecks(page) {
|
|
50
|
+
const checks = [];
|
|
51
|
+
// 1. Title present
|
|
52
|
+
const title = await page.title();
|
|
53
|
+
checks.push({
|
|
54
|
+
name: "Page title present",
|
|
55
|
+
pass: title.length > 0 && title.toLowerCase() !== "document",
|
|
56
|
+
detail: title,
|
|
57
|
+
});
|
|
58
|
+
// 2. Viewport meta tag
|
|
59
|
+
const viewport = await page.$('meta[name="viewport"]');
|
|
60
|
+
checks.push({
|
|
61
|
+
name: "Viewport meta tag",
|
|
62
|
+
pass: !!viewport,
|
|
63
|
+
detail: viewport ? "Found" : "Missing",
|
|
64
|
+
});
|
|
65
|
+
// 3. Images without alt
|
|
66
|
+
const imagesWithoutAlt = await page.$$eval("img", (imgs) => imgs.filter((img) => !img.hasAttribute("alt") && !img.hasAttribute("aria-hidden")).length);
|
|
67
|
+
checks.push({
|
|
68
|
+
name: "Images have alt or aria-hidden",
|
|
69
|
+
pass: imagesWithoutAlt === 0,
|
|
70
|
+
detail: imagesWithoutAlt > 0 ? `${imagesWithoutAlt} images missing alt` : "All images OK",
|
|
71
|
+
});
|
|
72
|
+
// 4. Buttons without accessible name
|
|
73
|
+
const buttonsWithoutName = await page.$$eval("button:not([aria-label]):not([aria-labelledby])", (btns) => btns.filter((b) => !b.textContent?.trim()).length);
|
|
74
|
+
checks.push({
|
|
75
|
+
name: "Buttons have accessible names",
|
|
76
|
+
pass: buttonsWithoutName === 0,
|
|
77
|
+
detail: buttonsWithoutName > 0 ? `${buttonsWithoutName} buttons missing name` : "All buttons OK",
|
|
78
|
+
});
|
|
79
|
+
// 5. Links without href or accessible name
|
|
80
|
+
const badLinks = await page.$$eval("a", (links) => links.filter((a) => !a.getAttribute("href") || (!a.textContent?.trim() && !a.getAttribute("aria-label"))).length);
|
|
81
|
+
checks.push({
|
|
82
|
+
name: "Links have href and accessible name",
|
|
83
|
+
pass: badLinks === 0,
|
|
84
|
+
detail: badLinks > 0 ? `${badLinks} links missing href or text` : "All links OK",
|
|
85
|
+
});
|
|
86
|
+
// 6. Form inputs without labels
|
|
87
|
+
const unlabeledInputs = await page.$$eval('input:not([type="hidden"]), textarea, select', (inputs) => inputs.filter((el) => {
|
|
88
|
+
const id = el.id;
|
|
89
|
+
const ariaLabel = el.getAttribute("aria-label");
|
|
90
|
+
const ariaLabelledBy = el.getAttribute("aria-labelledby");
|
|
91
|
+
const hasLabel = id && !!document.querySelector(`label[for="${id}"]`);
|
|
92
|
+
const parentLabel = el.closest("label");
|
|
93
|
+
return !hasLabel && !parentLabel && !ariaLabel && !ariaLabelledBy;
|
|
94
|
+
}).length);
|
|
95
|
+
checks.push({
|
|
96
|
+
name: "Form inputs have labels",
|
|
97
|
+
pass: unlabeledInputs === 0,
|
|
98
|
+
detail: unlabeledInputs > 0 ? `${unlabeledInputs} inputs missing labels` : "All inputs OK",
|
|
99
|
+
});
|
|
100
|
+
// 7. Focus outlines not globally disabled — scoped to interactive elements
|
|
101
|
+
const outlineNone = await page.$$eval("body, button, a, input, textarea, select, [tabindex]:not([tabindex='-1'])", (els) => els.some((el) => {
|
|
102
|
+
const s = window.getComputedStyle(el);
|
|
103
|
+
return s.outline === "none" && s.outlineWidth === "0px";
|
|
104
|
+
}));
|
|
105
|
+
checks.push({
|
|
106
|
+
name: "Focus outlines not globally removed",
|
|
107
|
+
pass: true, // informational
|
|
108
|
+
detail: outlineNone
|
|
109
|
+
? "Some interactive elements have outline:none; verify focus-visible is used"
|
|
110
|
+
: "No global outline removal detected",
|
|
111
|
+
});
|
|
112
|
+
return checks;
|
|
113
|
+
}
|
|
114
|
+
export async function auditUiCommand(options) {
|
|
115
|
+
const outputDir = resolve(options.outputDir);
|
|
116
|
+
const screenshotDir = join(outputDir, "screenshots");
|
|
117
|
+
if (!existsSync(screenshotDir)) {
|
|
118
|
+
mkdirSync(screenshotDir, { recursive: true });
|
|
119
|
+
}
|
|
120
|
+
console.log(`🔍 Starting UI audit...`);
|
|
121
|
+
console.log(` Base URL: ${options.baseUrl}`);
|
|
122
|
+
console.log(` Routes: ${options.routes.join(", ")}`);
|
|
123
|
+
console.log(` Viewport: ${options.viewport.width}x${options.viewport.height}`);
|
|
124
|
+
console.log(` Wait until: ${options.waitUntil}`);
|
|
125
|
+
console.log(` Timeout: ${options.timeout}ms`);
|
|
126
|
+
console.log(` Output: ${outputDir}\n`);
|
|
127
|
+
const browser = await chromium.launch({ headless: true });
|
|
128
|
+
let exitCode = 0;
|
|
129
|
+
try {
|
|
130
|
+
const context = await browser.newContext({ viewport: options.viewport });
|
|
131
|
+
const page = await context.newPage();
|
|
132
|
+
page.setDefaultTimeout(options.timeout);
|
|
133
|
+
page.setDefaultNavigationTimeout(options.timeout);
|
|
134
|
+
const report = {
|
|
135
|
+
summary: {
|
|
136
|
+
totalRoutes: options.routes.length,
|
|
137
|
+
passedRoutes: 0,
|
|
138
|
+
failedRoutes: 0,
|
|
139
|
+
totalErrors: 0,
|
|
140
|
+
totalWarnings: 0,
|
|
141
|
+
screenshotDir,
|
|
142
|
+
},
|
|
143
|
+
routes: [],
|
|
144
|
+
};
|
|
145
|
+
for (const route of options.routes) {
|
|
146
|
+
const url = new URL(route, options.baseUrl).toString();
|
|
147
|
+
const startTime = Date.now();
|
|
148
|
+
const consoleEntries = [];
|
|
149
|
+
const onConsole = (msg) => {
|
|
150
|
+
consoleEntries.push({
|
|
151
|
+
type: msg.type(),
|
|
152
|
+
text: msg.text(),
|
|
153
|
+
location: msg.location().url || "",
|
|
154
|
+
});
|
|
155
|
+
};
|
|
156
|
+
page.on("console", onConsole);
|
|
157
|
+
let status = null;
|
|
158
|
+
try {
|
|
159
|
+
const response = await page.goto(url, { waitUntil: options.waitUntil });
|
|
160
|
+
status = response?.status() ?? null;
|
|
161
|
+
}
|
|
162
|
+
catch (err) {
|
|
163
|
+
console.error(` ❌ Failed to load ${url}: ${err.message}`);
|
|
164
|
+
report.routes.push({
|
|
165
|
+
route,
|
|
166
|
+
url,
|
|
167
|
+
title: "",
|
|
168
|
+
status: null,
|
|
169
|
+
screenshotPath: "",
|
|
170
|
+
consoleEntries,
|
|
171
|
+
checks: [{ name: "Page load", pass: false, detail: err.message }],
|
|
172
|
+
durationMs: Date.now() - startTime,
|
|
173
|
+
});
|
|
174
|
+
report.summary.failedRoutes++;
|
|
175
|
+
exitCode = 1;
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
finally {
|
|
179
|
+
page.off("console", onConsole);
|
|
180
|
+
}
|
|
181
|
+
const title = await page.title();
|
|
182
|
+
const checks = await runChecks(page);
|
|
183
|
+
// Add page-load check
|
|
184
|
+
checks.unshift({
|
|
185
|
+
name: "Page load (HTTP 200)",
|
|
186
|
+
pass: status === 200,
|
|
187
|
+
detail: status ? `HTTP ${status}` : "No response",
|
|
188
|
+
});
|
|
189
|
+
const errors = consoleEntries.filter((e) => e.type === "error");
|
|
190
|
+
const warnings = consoleEntries.filter((e) => e.type === "warning");
|
|
191
|
+
checks.push({
|
|
192
|
+
name: "No console errors",
|
|
193
|
+
pass: errors.length === 0,
|
|
194
|
+
detail: errors.length > 0 ? `${errors.length} console error(s)` : "Clean",
|
|
195
|
+
});
|
|
196
|
+
checks.push({
|
|
197
|
+
name: "No console warnings",
|
|
198
|
+
pass: warnings.length === 0,
|
|
199
|
+
detail: warnings.length > 0 ? `${warnings.length} console warning(s)` : "Clean",
|
|
200
|
+
});
|
|
201
|
+
const screenshotName = `${route.replace(/[^a-zA-Z0-9]/g, "_") || "root"}.png`;
|
|
202
|
+
const screenshotPath = join(screenshotDir, screenshotName);
|
|
203
|
+
await page.screenshot({ path: screenshotPath, fullPage: true });
|
|
204
|
+
const durationMs = Date.now() - startTime;
|
|
205
|
+
const allPassed = checks.every((c) => c.pass);
|
|
206
|
+
if (allPassed)
|
|
207
|
+
report.summary.passedRoutes++;
|
|
208
|
+
else
|
|
209
|
+
report.summary.failedRoutes++;
|
|
210
|
+
report.summary.totalErrors += errors.length;
|
|
211
|
+
report.summary.totalWarnings += warnings.length;
|
|
212
|
+
report.routes.push({
|
|
213
|
+
route,
|
|
214
|
+
url,
|
|
215
|
+
title,
|
|
216
|
+
status,
|
|
217
|
+
screenshotPath,
|
|
218
|
+
consoleEntries,
|
|
219
|
+
checks,
|
|
220
|
+
durationMs,
|
|
221
|
+
});
|
|
222
|
+
const icon = allPassed ? "✅" : "⚠️";
|
|
223
|
+
console.log(`${icon} ${route} (${durationMs}ms)`);
|
|
224
|
+
for (const check of checks) {
|
|
225
|
+
const cIcon = check.pass ? " ✓" : " ✗";
|
|
226
|
+
console.log(`${cIcon} ${check.name}${check.detail ? ` — ${check.detail}` : ""}`);
|
|
227
|
+
}
|
|
228
|
+
if (errors.length > 0) {
|
|
229
|
+
for (const err of errors.slice(0, 5)) {
|
|
230
|
+
console.log(` ! [error] ${err.text.slice(0, 120)}`);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
console.log("");
|
|
234
|
+
}
|
|
235
|
+
// Write markdown report
|
|
236
|
+
const reportPath = join(outputDir, "audit-report.md");
|
|
237
|
+
const md = generateMarkdownReport(report);
|
|
238
|
+
writeFileSync(reportPath, md, "utf-8");
|
|
239
|
+
console.log(`────────────────────────────────────────`);
|
|
240
|
+
console.log(`📊 Audit Summary`);
|
|
241
|
+
console.log(` Routes: ${report.summary.totalRoutes}`);
|
|
242
|
+
console.log(` Passed: ${report.summary.passedRoutes}`);
|
|
243
|
+
console.log(` Failed: ${report.summary.failedRoutes}`);
|
|
244
|
+
console.log(` Errors: ${report.summary.totalErrors}`);
|
|
245
|
+
console.log(` Warnings: ${report.summary.totalWarnings}`);
|
|
246
|
+
console.log(` Screenshots: ${report.summary.screenshotDir}`);
|
|
247
|
+
console.log(` Report: ${reportPath}`);
|
|
248
|
+
console.log(`────────────────────────────────────────`);
|
|
249
|
+
if (report.summary.failedRoutes > 0) {
|
|
250
|
+
exitCode = 1;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
finally {
|
|
254
|
+
await browser.close();
|
|
255
|
+
}
|
|
256
|
+
return exitCode;
|
|
257
|
+
}
|
|
258
|
+
function generateMarkdownReport(report) {
|
|
259
|
+
const lines = [
|
|
260
|
+
"# UI Audit Report",
|
|
261
|
+
"",
|
|
262
|
+
`Generated: ${new Date().toISOString()}`,
|
|
263
|
+
"",
|
|
264
|
+
"## Summary",
|
|
265
|
+
"",
|
|
266
|
+
`| Metric | Value |`,
|
|
267
|
+
`|---|---|`,
|
|
268
|
+
`| Total Routes | ${report.summary.totalRoutes} |`,
|
|
269
|
+
`| Passed | ${report.summary.passedRoutes} |`,
|
|
270
|
+
`| Failed | ${report.summary.failedRoutes} |`,
|
|
271
|
+
`| Console Errors | ${report.summary.totalErrors} |`,
|
|
272
|
+
`| Console Warnings | ${report.summary.totalWarnings} |`,
|
|
273
|
+
`| Screenshots | ${report.summary.screenshotDir} |`,
|
|
274
|
+
"",
|
|
275
|
+
];
|
|
276
|
+
for (const r of report.routes) {
|
|
277
|
+
const allPassed = r.checks.every((c) => c.pass);
|
|
278
|
+
lines.push(`## ${r.route} ${allPassed ? "✅" : "⚠️"}`);
|
|
279
|
+
lines.push("");
|
|
280
|
+
lines.push(`- **URL:** ${r.url}`);
|
|
281
|
+
lines.push(`- **Title:** ${r.title}`);
|
|
282
|
+
lines.push(`- **Status:** ${r.status ?? "N/A"}`);
|
|
283
|
+
lines.push(`- **Duration:** ${r.durationMs}ms`);
|
|
284
|
+
lines.push(`- **Screenshot:** \`${r.screenshotPath}\``);
|
|
285
|
+
lines.push("");
|
|
286
|
+
lines.push("### Checks");
|
|
287
|
+
lines.push("");
|
|
288
|
+
lines.push(`| Check | Result | Detail |`);
|
|
289
|
+
lines.push(`|---|---|---|`);
|
|
290
|
+
for (const c of r.checks) {
|
|
291
|
+
lines.push(`| ${c.name} | ${c.pass ? "PASS" : "FAIL"} | ${c.detail ?? ""} |`);
|
|
292
|
+
}
|
|
293
|
+
lines.push("");
|
|
294
|
+
const errors = r.consoleEntries.filter((e) => e.type === "error");
|
|
295
|
+
if (errors.length > 0) {
|
|
296
|
+
lines.push("### Console Errors");
|
|
297
|
+
lines.push("");
|
|
298
|
+
for (const e of errors) {
|
|
299
|
+
lines.push(`- \`[${e.type}]\` ${e.text}`);
|
|
300
|
+
}
|
|
301
|
+
lines.push("");
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
return lines.join("\n");
|
|
305
|
+
}
|
|
306
|
+
//# sourceMappingURL=audit-ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-ui.js","sourceRoot":"","sources":["../../src/commands/audit-ui.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,6 @@ interface VerifyOptions {
|
|
|
2
2
|
srcDir: string;
|
|
3
3
|
messagesDir: string;
|
|
4
4
|
}
|
|
5
|
-
export declare function verifyI18nCommand(options?: Partial<VerifyOptions>):
|
|
5
|
+
export declare function verifyI18nCommand(options?: Partial<VerifyOptions>): number;
|
|
6
6
|
export {};
|
|
7
7
|
//# sourceMappingURL=verify-i18n.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify-i18n.d.ts","sourceRoot":"","sources":["../../src/commands/verify-i18n.ts"],"names":[],"mappings":"AAGA,UAAU,aAAa;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;
|
|
1
|
+
{"version":3,"file":"verify-i18n.d.ts","sourceRoot":"","sources":["../../src/commands/verify-i18n.ts"],"names":[],"mappings":"AAGA,UAAU,aAAa;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAgLD,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,OAAO,CAAC,aAAa,CAAM,GAAG,MAAM,CA0E9E"}
|
|
@@ -10,7 +10,11 @@ function findMessagesDir(startDir) {
|
|
|
10
10
|
}
|
|
11
11
|
return null;
|
|
12
12
|
}
|
|
13
|
-
function getSourceFiles(dir) {
|
|
13
|
+
function getSourceFiles(dir, visited = new Set()) {
|
|
14
|
+
const realDir = resolve(dir);
|
|
15
|
+
if (visited.has(realDir))
|
|
16
|
+
return [];
|
|
17
|
+
visited.add(realDir);
|
|
14
18
|
const results = [];
|
|
15
19
|
const entries = readdirSync(dir, { withFileTypes: true });
|
|
16
20
|
for (const entry of entries) {
|
|
@@ -23,7 +27,7 @@ function getSourceFiles(dir) {
|
|
|
23
27
|
entry.name.startsWith(".")) {
|
|
24
28
|
continue;
|
|
25
29
|
}
|
|
26
|
-
results.push(...getSourceFiles(fullPath));
|
|
30
|
+
results.push(...getSourceFiles(fullPath, visited));
|
|
27
31
|
}
|
|
28
32
|
else if (entry.isFile()) {
|
|
29
33
|
const ext = extname(entry.name);
|
|
@@ -61,12 +65,13 @@ function extractNamespace(content) {
|
|
|
61
65
|
return match ? match[1] : null;
|
|
62
66
|
}
|
|
63
67
|
function isInsideStringLiteral(line, matchIndex) {
|
|
64
|
-
// Check if the character before t( is inside a string literal
|
|
65
68
|
const before = line.slice(0, matchIndex);
|
|
66
69
|
let inSingle = false;
|
|
67
70
|
let inDouble = false;
|
|
71
|
+
let inTemplate = false;
|
|
68
72
|
let escaped = false;
|
|
69
|
-
for (
|
|
73
|
+
for (let i = 0; i < before.length; i++) {
|
|
74
|
+
const ch = before[i];
|
|
70
75
|
if (escaped) {
|
|
71
76
|
escaped = false;
|
|
72
77
|
continue;
|
|
@@ -75,29 +80,68 @@ function isInsideStringLiteral(line, matchIndex) {
|
|
|
75
80
|
escaped = true;
|
|
76
81
|
continue;
|
|
77
82
|
}
|
|
78
|
-
if (ch ===
|
|
83
|
+
if (ch === "`" && !inSingle && !inDouble) {
|
|
84
|
+
inTemplate = !inTemplate;
|
|
85
|
+
}
|
|
86
|
+
else if (ch === '"' && !inSingle && !inTemplate) {
|
|
87
|
+
inDouble = !inDouble;
|
|
88
|
+
}
|
|
89
|
+
else if (ch === "'" && !inDouble && !inTemplate) {
|
|
90
|
+
inSingle = !inSingle;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return inSingle || inDouble || inTemplate;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Strip end-of-line comments from a line, but only when the `//` is
|
|
97
|
+
* outside of string literals. URLs like `https://...` inside strings
|
|
98
|
+
* are preserved.
|
|
99
|
+
*/
|
|
100
|
+
function stripComments(line) {
|
|
101
|
+
let inSingle = false;
|
|
102
|
+
let inDouble = false;
|
|
103
|
+
let inTemplate = false;
|
|
104
|
+
let escaped = false;
|
|
105
|
+
for (let i = 0; i < line.length - 1; i++) {
|
|
106
|
+
const ch = line[i];
|
|
107
|
+
const next = line[i + 1];
|
|
108
|
+
if (escaped) {
|
|
109
|
+
escaped = false;
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
if (ch === "\\") {
|
|
113
|
+
escaped = true;
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
if (ch === "`" && !inSingle && !inDouble) {
|
|
117
|
+
inTemplate = !inTemplate;
|
|
118
|
+
}
|
|
119
|
+
else if (ch === '"' && !inSingle && !inTemplate) {
|
|
79
120
|
inDouble = !inDouble;
|
|
80
121
|
}
|
|
81
|
-
else if (ch === "'" && !inDouble) {
|
|
122
|
+
else if (ch === "'" && !inDouble && !inTemplate) {
|
|
82
123
|
inSingle = !inSingle;
|
|
83
124
|
}
|
|
125
|
+
else if (ch === "/" && next === "/" && !inSingle && !inDouble && !inTemplate) {
|
|
126
|
+
return line.slice(0, i);
|
|
127
|
+
}
|
|
84
128
|
}
|
|
85
|
-
return
|
|
129
|
+
return line;
|
|
86
130
|
}
|
|
87
131
|
function extractTranslationKeys(content, namespace) {
|
|
88
132
|
const lines = content.split("\n");
|
|
89
133
|
const keys = [];
|
|
90
134
|
const seen = new Set();
|
|
91
|
-
const regex = /\bt\s*\(\s*["'`]([a-zA-Z0-9_.-]+)["'`]/g;
|
|
92
135
|
for (let i = 0; i < lines.length; i++) {
|
|
93
136
|
const line = lines[i];
|
|
94
|
-
|
|
95
|
-
const codePart = line.split("//")[0];
|
|
137
|
+
const codePart = stripComments(line);
|
|
96
138
|
if (!codePart.includes("t("))
|
|
97
139
|
continue;
|
|
140
|
+
// Create a fresh regex per line to avoid lastIndex bugs
|
|
141
|
+
const regex = /\bt\s*\(\s*["'`]([a-zA-Z0-9_.-]+)["'`]/g;
|
|
98
142
|
let match;
|
|
99
|
-
while ((match = regex.exec(
|
|
100
|
-
if (isInsideStringLiteral(
|
|
143
|
+
while ((match = regex.exec(codePart)) !== null) {
|
|
144
|
+
if (isInsideStringLiteral(codePart, match.index))
|
|
101
145
|
continue;
|
|
102
146
|
const rawKey = match[1];
|
|
103
147
|
const key = namespace ? `${namespace}.${rawKey}` : rawKey;
|
|
@@ -114,13 +158,13 @@ export function verifyI18nCommand(options = {}) {
|
|
|
114
158
|
const messagesDir = options.messagesDir || findMessagesDir(srcDir);
|
|
115
159
|
if (!messagesDir) {
|
|
116
160
|
console.error("❌ messages/ directory not found. Run this from a project root.");
|
|
117
|
-
|
|
161
|
+
return 1;
|
|
118
162
|
}
|
|
119
163
|
const translations = loadTranslations(messagesDir);
|
|
120
164
|
const locales = Object.keys(translations);
|
|
121
165
|
if (locales.length === 0) {
|
|
122
166
|
console.error("❌ No translation files found in messages/ directory.");
|
|
123
|
-
|
|
167
|
+
return 1;
|
|
124
168
|
}
|
|
125
169
|
const files = getSourceFiles(srcDir);
|
|
126
170
|
const allKeys = new Map();
|
|
@@ -136,7 +180,7 @@ export function verifyI18nCommand(options = {}) {
|
|
|
136
180
|
}
|
|
137
181
|
if (allKeys.size === 0) {
|
|
138
182
|
console.log("ℹ️ No translation keys found in source files.");
|
|
139
|
-
return;
|
|
183
|
+
return 0;
|
|
140
184
|
}
|
|
141
185
|
const missingByLocale = new Map();
|
|
142
186
|
for (const [key, locations] of allKeys) {
|
|
@@ -152,7 +196,7 @@ export function verifyI18nCommand(options = {}) {
|
|
|
152
196
|
const totalMissing = Array.from(missingByLocale.values()).reduce((sum, list) => sum + list.length, 0);
|
|
153
197
|
if (totalMissing === 0) {
|
|
154
198
|
console.log(`✅ All ${allKeys.size} translation key(s) exist in every locale (${locales.join(", ")}).`);
|
|
155
|
-
return;
|
|
199
|
+
return 0;
|
|
156
200
|
}
|
|
157
201
|
console.log(`⚠️ Found ${totalMissing} missing translation key(s):\n`);
|
|
158
202
|
for (const [locale, missing] of missingByLocale) {
|
|
@@ -170,6 +214,6 @@ export function verifyI18nCommand(options = {}) {
|
|
|
170
214
|
console.log("");
|
|
171
215
|
}
|
|
172
216
|
console.log(`Add the missing keys to all ${locales.length} locale files.\n`);
|
|
173
|
-
|
|
217
|
+
return 1;
|
|
174
218
|
}
|
|
175
219
|
//# sourceMappingURL=verify-i18n.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify-i18n.js","sourceRoot":"","sources":["../../src/commands/verify-i18n.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAa5D,SAAS,eAAe,CAAC,QAAgB;IACvC,IAAI,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC5B,OAAO,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAC3C,IAAI,UAAU,CAAC,YAAY,CAAC;YAAE,OAAO,YAAY,CAAC;QAClD,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,cAAc,CAAC,GAAW;
|
|
1
|
+
{"version":3,"file":"verify-i18n.js","sourceRoot":"","sources":["../../src/commands/verify-i18n.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,6 @@ interface VerifyOptions {
|
|
|
2
2
|
srcDir: string;
|
|
3
3
|
packageJsonPath: string;
|
|
4
4
|
}
|
|
5
|
-
export declare function verifyImportsCommand(options?: Partial<VerifyOptions>):
|
|
5
|
+
export declare function verifyImportsCommand(options?: Partial<VerifyOptions>): number;
|
|
6
6
|
export {};
|
|
7
7
|
//# sourceMappingURL=verify-imports.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify-imports.d.ts","sourceRoot":"","sources":["../../src/commands/verify-imports.ts"],"names":[],"mappings":"AAGA,UAAU,aAAa;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;CACzB;
|
|
1
|
+
{"version":3,"file":"verify-imports.d.ts","sourceRoot":"","sources":["../../src/commands/verify-imports.ts"],"names":[],"mappings":"AAGA,UAAU,aAAa;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;CACzB;AAuLD,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,OAAO,CAAC,aAAa,CAAM,GAAG,MAAM,CA2EjF"}
|