enterprise-ui-architect-cli 2.1.0 → 2.2.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.
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface AuditOptions {
|
|
2
|
+
baseUrl: string;
|
|
3
|
+
routes: string[];
|
|
4
|
+
outputDir: string;
|
|
5
|
+
viewport: {
|
|
6
|
+
width: number;
|
|
7
|
+
height: number;
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
export declare function parseAuditArgs(args: string[]): AuditOptions;
|
|
11
|
+
export declare function auditUiCommand(options: AuditOptions): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=audit-ui.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-ui.d.ts","sourceRoot":"","sources":["../../src/commands/audit-ui.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7C;AAuCD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,YAAY,CAuB3D;AAwFD,wBAAsB,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAqJzE"}
|
|
@@ -0,0 +1,274 @@
|
|
|
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
|
+
export function parseAuditArgs(args) {
|
|
6
|
+
const result = {
|
|
7
|
+
baseUrl: "http://localhost:3000",
|
|
8
|
+
routes: ["/"],
|
|
9
|
+
outputDir: "./ui-audit",
|
|
10
|
+
viewport: { ...DEFAULT_VIEWPORT },
|
|
11
|
+
};
|
|
12
|
+
for (let i = 0; i < args.length; i++) {
|
|
13
|
+
const arg = args[i];
|
|
14
|
+
if (arg === "--url" && i + 1 < args.length) {
|
|
15
|
+
result.baseUrl = args[++i];
|
|
16
|
+
}
|
|
17
|
+
else if (arg === "--routes" && i + 1 < args.length) {
|
|
18
|
+
result.routes = args[++i].split(",").map((r) => r.trim());
|
|
19
|
+
}
|
|
20
|
+
else if (arg === "--output" && i + 1 < args.length) {
|
|
21
|
+
result.outputDir = args[++i];
|
|
22
|
+
}
|
|
23
|
+
else if (arg === "--viewport" && i + 1 < args.length) {
|
|
24
|
+
const [w, h] = args[++i].split("x").map(Number);
|
|
25
|
+
if (w && h)
|
|
26
|
+
result.viewport = { width: w, height: h };
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return result;
|
|
30
|
+
}
|
|
31
|
+
async function runChecks(page) {
|
|
32
|
+
const checks = [];
|
|
33
|
+
// 1. Title present
|
|
34
|
+
const title = await page.title();
|
|
35
|
+
checks.push({
|
|
36
|
+
name: "Page title present",
|
|
37
|
+
pass: title.length > 0 && title.toLowerCase() !== "document",
|
|
38
|
+
detail: title,
|
|
39
|
+
});
|
|
40
|
+
// 2. Viewport meta tag
|
|
41
|
+
const viewport = await page.$('meta[name="viewport"]');
|
|
42
|
+
checks.push({
|
|
43
|
+
name: "Viewport meta tag",
|
|
44
|
+
pass: !!viewport,
|
|
45
|
+
detail: viewport ? "Found" : "Missing",
|
|
46
|
+
});
|
|
47
|
+
// 3. Images without alt
|
|
48
|
+
const imagesWithoutAlt = await page.$$eval("img", (imgs) => imgs.filter((img) => !img.hasAttribute("alt") && !img.hasAttribute("aria-hidden")).length);
|
|
49
|
+
checks.push({
|
|
50
|
+
name: "Images have alt or aria-hidden",
|
|
51
|
+
pass: imagesWithoutAlt === 0,
|
|
52
|
+
detail: imagesWithoutAlt > 0 ? `${imagesWithoutAlt} images missing alt` : "All images OK",
|
|
53
|
+
});
|
|
54
|
+
// 4. Buttons without accessible name
|
|
55
|
+
const buttonsWithoutName = await page.$$eval("button:not([aria-label]):not([aria-labelledby])", (btns) => btns.filter((b) => !b.textContent?.trim()).length);
|
|
56
|
+
checks.push({
|
|
57
|
+
name: "Buttons have accessible names",
|
|
58
|
+
pass: buttonsWithoutName === 0,
|
|
59
|
+
detail: buttonsWithoutName > 0 ? `${buttonsWithoutName} buttons missing name` : "All buttons OK",
|
|
60
|
+
});
|
|
61
|
+
// 5. Links without href or accessible name
|
|
62
|
+
const badLinks = await page.$$eval("a", (links) => links.filter((a) => !a.getAttribute("href") || (!a.textContent?.trim() && !a.getAttribute("aria-label"))).length);
|
|
63
|
+
checks.push({
|
|
64
|
+
name: "Links have href and accessible name",
|
|
65
|
+
pass: badLinks === 0,
|
|
66
|
+
detail: badLinks > 0 ? `${badLinks} links missing href or text` : "All links OK",
|
|
67
|
+
});
|
|
68
|
+
// 6. Form inputs without labels
|
|
69
|
+
const unlabeledInputs = await page.$$eval('input:not([type="hidden"]), textarea, select', (inputs) => inputs.filter((el) => {
|
|
70
|
+
const id = el.id;
|
|
71
|
+
const ariaLabel = el.getAttribute("aria-label");
|
|
72
|
+
const ariaLabelledBy = el.getAttribute("aria-labelledby");
|
|
73
|
+
const hasLabel = id && !!document.querySelector(`label[for="${id}"]`);
|
|
74
|
+
const parentLabel = el.closest("label");
|
|
75
|
+
return !hasLabel && !parentLabel && !ariaLabel && !ariaLabelledBy;
|
|
76
|
+
}).length);
|
|
77
|
+
checks.push({
|
|
78
|
+
name: "Form inputs have labels",
|
|
79
|
+
pass: unlabeledInputs === 0,
|
|
80
|
+
detail: unlabeledInputs > 0 ? `${unlabeledInputs} inputs missing labels` : "All inputs OK",
|
|
81
|
+
});
|
|
82
|
+
// 7. Focus outlines not globally disabled
|
|
83
|
+
const outlineNone = await page.$$eval("*", (els) => els.some((el) => {
|
|
84
|
+
const s = window.getComputedStyle(el);
|
|
85
|
+
return s.outline === "none" && s.outlineWidth === "0px";
|
|
86
|
+
}));
|
|
87
|
+
// This is a weak heuristic; just warn if we see global outline:none
|
|
88
|
+
checks.push({
|
|
89
|
+
name: "Focus outlines not globally removed",
|
|
90
|
+
pass: true, // informational
|
|
91
|
+
detail: outlineNone ? "Some elements have outline:none; verify focus-visible is used" : "No global outline removal detected",
|
|
92
|
+
});
|
|
93
|
+
return checks;
|
|
94
|
+
}
|
|
95
|
+
export async function auditUiCommand(options) {
|
|
96
|
+
const outputDir = resolve(options.outputDir);
|
|
97
|
+
const screenshotDir = join(outputDir, "screenshots");
|
|
98
|
+
if (!existsSync(screenshotDir)) {
|
|
99
|
+
mkdirSync(screenshotDir, { recursive: true });
|
|
100
|
+
}
|
|
101
|
+
console.log(`🔍 Starting UI audit...`);
|
|
102
|
+
console.log(` Base URL: ${options.baseUrl}`);
|
|
103
|
+
console.log(` Routes: ${options.routes.join(", ")}`);
|
|
104
|
+
console.log(` Viewport: ${options.viewport.width}x${options.viewport.height}`);
|
|
105
|
+
console.log(` Output: ${outputDir}\n`);
|
|
106
|
+
const browser = await chromium.launch({ headless: true });
|
|
107
|
+
const context = await browser.newContext({ viewport: options.viewport });
|
|
108
|
+
const page = await context.newPage();
|
|
109
|
+
const report = {
|
|
110
|
+
summary: {
|
|
111
|
+
totalRoutes: options.routes.length,
|
|
112
|
+
passedRoutes: 0,
|
|
113
|
+
failedRoutes: 0,
|
|
114
|
+
totalErrors: 0,
|
|
115
|
+
totalWarnings: 0,
|
|
116
|
+
screenshotDir,
|
|
117
|
+
},
|
|
118
|
+
routes: [],
|
|
119
|
+
};
|
|
120
|
+
for (const route of options.routes) {
|
|
121
|
+
const url = new URL(route, options.baseUrl).toString();
|
|
122
|
+
const startTime = Date.now();
|
|
123
|
+
const consoleEntries = [];
|
|
124
|
+
const onConsole = (msg) => {
|
|
125
|
+
consoleEntries.push({
|
|
126
|
+
type: msg.type(),
|
|
127
|
+
text: msg.text(),
|
|
128
|
+
location: msg.location().url || "",
|
|
129
|
+
});
|
|
130
|
+
};
|
|
131
|
+
page.on("console", onConsole);
|
|
132
|
+
let status = null;
|
|
133
|
+
try {
|
|
134
|
+
const response = await page.goto(url, { waitUntil: "networkidle" });
|
|
135
|
+
status = response?.status() ?? null;
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
console.error(` ❌ Failed to load ${url}: ${err.message}`);
|
|
139
|
+
report.routes.push({
|
|
140
|
+
route,
|
|
141
|
+
url,
|
|
142
|
+
title: "",
|
|
143
|
+
status: null,
|
|
144
|
+
screenshotPath: "",
|
|
145
|
+
consoleEntries,
|
|
146
|
+
checks: [{ name: "Page load", pass: false, detail: err.message }],
|
|
147
|
+
durationMs: Date.now() - startTime,
|
|
148
|
+
});
|
|
149
|
+
page.off("console", onConsole);
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
const title = await page.title();
|
|
153
|
+
const checks = await runChecks(page);
|
|
154
|
+
// Add page-load check
|
|
155
|
+
checks.unshift({
|
|
156
|
+
name: "Page load (HTTP 200)",
|
|
157
|
+
pass: status === 200,
|
|
158
|
+
detail: status ? `HTTP ${status}` : "No response",
|
|
159
|
+
});
|
|
160
|
+
const errors = consoleEntries.filter((e) => e.type === "error");
|
|
161
|
+
const warnings = consoleEntries.filter((e) => e.type === "warning");
|
|
162
|
+
checks.push({
|
|
163
|
+
name: "No console errors",
|
|
164
|
+
pass: errors.length === 0,
|
|
165
|
+
detail: errors.length > 0 ? `${errors.length} console error(s)` : "Clean",
|
|
166
|
+
});
|
|
167
|
+
checks.push({
|
|
168
|
+
name: "No console warnings",
|
|
169
|
+
pass: warnings.length === 0,
|
|
170
|
+
detail: warnings.length > 0 ? `${warnings.length} console warning(s)` : "Clean",
|
|
171
|
+
});
|
|
172
|
+
const screenshotName = `${route.replace(/[^a-zA-Z0-9]/g, "_") || "root"}.png`;
|
|
173
|
+
const screenshotPath = join(screenshotDir, screenshotName);
|
|
174
|
+
await page.screenshot({ path: screenshotPath, fullPage: true });
|
|
175
|
+
const durationMs = Date.now() - startTime;
|
|
176
|
+
const allPassed = checks.every((c) => c.pass);
|
|
177
|
+
if (allPassed)
|
|
178
|
+
report.summary.passedRoutes++;
|
|
179
|
+
else
|
|
180
|
+
report.summary.failedRoutes++;
|
|
181
|
+
report.summary.totalErrors += errors.length;
|
|
182
|
+
report.summary.totalWarnings += warnings.length;
|
|
183
|
+
report.routes.push({
|
|
184
|
+
route,
|
|
185
|
+
url,
|
|
186
|
+
title,
|
|
187
|
+
status,
|
|
188
|
+
screenshotPath,
|
|
189
|
+
consoleEntries,
|
|
190
|
+
checks,
|
|
191
|
+
durationMs,
|
|
192
|
+
});
|
|
193
|
+
page.off("console", onConsole);
|
|
194
|
+
const icon = allPassed ? "✅" : "⚠️";
|
|
195
|
+
console.log(`${icon} ${route} (${durationMs}ms)`);
|
|
196
|
+
for (const check of checks) {
|
|
197
|
+
const cIcon = check.pass ? " ✓" : " ✗";
|
|
198
|
+
console.log(`${cIcon} ${check.name}${check.detail ? ` — ${check.detail}` : ""}`);
|
|
199
|
+
}
|
|
200
|
+
if (errors.length > 0) {
|
|
201
|
+
for (const err of errors.slice(0, 5)) {
|
|
202
|
+
console.log(` ! [error] ${err.text.slice(0, 120)}`);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
console.log("");
|
|
206
|
+
}
|
|
207
|
+
await browser.close();
|
|
208
|
+
// Write markdown report
|
|
209
|
+
const reportPath = join(outputDir, "audit-report.md");
|
|
210
|
+
const md = generateMarkdownReport(report);
|
|
211
|
+
writeFileSync(reportPath, md, "utf-8");
|
|
212
|
+
console.log(`────────────────────────────────────────`);
|
|
213
|
+
console.log(`📊 Audit Summary`);
|
|
214
|
+
console.log(` Routes: ${report.summary.totalRoutes}`);
|
|
215
|
+
console.log(` Passed: ${report.summary.passedRoutes}`);
|
|
216
|
+
console.log(` Failed: ${report.summary.failedRoutes}`);
|
|
217
|
+
console.log(` Errors: ${report.summary.totalErrors}`);
|
|
218
|
+
console.log(` Warnings: ${report.summary.totalWarnings}`);
|
|
219
|
+
console.log(` Screenshots: ${report.summary.screenshotDir}`);
|
|
220
|
+
console.log(` Report: ${reportPath}`);
|
|
221
|
+
console.log(`────────────────────────────────────────`);
|
|
222
|
+
if (report.summary.failedRoutes > 0) {
|
|
223
|
+
process.exit(1);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
function generateMarkdownReport(report) {
|
|
227
|
+
const lines = [
|
|
228
|
+
"# UI Audit Report",
|
|
229
|
+
"",
|
|
230
|
+
`Generated: ${new Date().toISOString()}`,
|
|
231
|
+
"",
|
|
232
|
+
"## Summary",
|
|
233
|
+
"",
|
|
234
|
+
`| Metric | Value |`,
|
|
235
|
+
`|---|---|`,
|
|
236
|
+
`| Total Routes | ${report.summary.totalRoutes} |`,
|
|
237
|
+
`| Passed | ${report.summary.passedRoutes} |`,
|
|
238
|
+
`| Failed | ${report.summary.failedRoutes} |`,
|
|
239
|
+
`| Console Errors | ${report.summary.totalErrors} |`,
|
|
240
|
+
`| Console Warnings | ${report.summary.totalWarnings} |`,
|
|
241
|
+
`| Screenshots | ${report.summary.screenshotDir} |`,
|
|
242
|
+
"",
|
|
243
|
+
];
|
|
244
|
+
for (const r of report.routes) {
|
|
245
|
+
const allPassed = r.checks.every((c) => c.pass);
|
|
246
|
+
lines.push(`## ${r.route} ${allPassed ? "✅" : "⚠️"}`);
|
|
247
|
+
lines.push("");
|
|
248
|
+
lines.push(`- **URL:** ${r.url}`);
|
|
249
|
+
lines.push(`- **Title:** ${r.title}`);
|
|
250
|
+
lines.push(`- **Status:** ${r.status ?? "N/A"}`);
|
|
251
|
+
lines.push(`- **Duration:** ${r.durationMs}ms`);
|
|
252
|
+
lines.push(`- **Screenshot:** \`${r.screenshotPath}\``);
|
|
253
|
+
lines.push("");
|
|
254
|
+
lines.push("### Checks");
|
|
255
|
+
lines.push("");
|
|
256
|
+
lines.push(`| Check | Result | Detail |`);
|
|
257
|
+
lines.push(`|---|---|---|`);
|
|
258
|
+
for (const c of r.checks) {
|
|
259
|
+
lines.push(`| ${c.name} | ${c.pass ? "PASS" : "FAIL"} | ${c.detail ?? ""} |`);
|
|
260
|
+
}
|
|
261
|
+
lines.push("");
|
|
262
|
+
const errors = r.consoleEntries.filter((e) => e.type === "error");
|
|
263
|
+
if (errors.length > 0) {
|
|
264
|
+
lines.push("### Console Errors");
|
|
265
|
+
lines.push("");
|
|
266
|
+
for (const e of errors) {
|
|
267
|
+
lines.push(`- \`[${e.type}]\` ${e.text}`);
|
|
268
|
+
}
|
|
269
|
+
lines.push("");
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
return lines.join("\n");
|
|
273
|
+
}
|
|
274
|
+
//# 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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"}
|
package/dist/index.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { initCommand } from "./commands/init.js";
|
|
3
3
|
import { verifyImportsCommand } from "./commands/verify-imports.js";
|
|
4
4
|
import { verifyI18nCommand } from "./commands/verify-i18n.js";
|
|
5
|
+
import { auditUiCommand, parseAuditArgs } from "./commands/audit-ui.js";
|
|
5
6
|
function showHelp() {
|
|
6
7
|
console.log(`
|
|
7
8
|
Enterprise UI Architect CLI
|
|
@@ -10,16 +11,22 @@ Usage:
|
|
|
10
11
|
enterprise-ui init [options]
|
|
11
12
|
enterprise-ui verify-imports [options]
|
|
12
13
|
enterprise-ui verify-i18n [options]
|
|
14
|
+
enterprise-ui audit-ui [options]
|
|
13
15
|
|
|
14
16
|
Commands:
|
|
15
17
|
init Install skill into AI coding assistants
|
|
16
18
|
verify-imports Scan source files and report missing npm packages
|
|
17
19
|
verify-i18n Scan source files and report missing translation keys
|
|
20
|
+
audit-ui Open a headless browser, take screenshots, and audit UI
|
|
18
21
|
|
|
19
22
|
Options:
|
|
20
23
|
--ai <assistant> Target AI assistant: cursor, claude, windsurf, copilot, codex, all (default: all)
|
|
21
24
|
--offline Use local assets without network (default: false)
|
|
22
25
|
--src <dir> Source directory to scan (default: current directory)
|
|
26
|
+
--url <url> Base URL to audit (default: http://localhost:3000)
|
|
27
|
+
--routes <list> Comma-separated routes (default: /)
|
|
28
|
+
--output <dir> Audit output directory (default: ./ui-audit)
|
|
29
|
+
--viewport <WxH> Browser viewport (default: 1280x720)
|
|
23
30
|
--help Show this help
|
|
24
31
|
--version Show version
|
|
25
32
|
|
|
@@ -30,6 +37,8 @@ Examples:
|
|
|
30
37
|
enterprise-ui verify-imports --src ./src
|
|
31
38
|
enterprise-ui verify-i18n
|
|
32
39
|
enterprise-ui verify-i18n --src ./src
|
|
40
|
+
enterprise-ui audit-ui
|
|
41
|
+
enterprise-ui audit-ui --url http://localhost:3000 --routes /,/az/login --output ./audit
|
|
33
42
|
`);
|
|
34
43
|
}
|
|
35
44
|
function parseArgs(args) {
|
|
@@ -37,7 +46,7 @@ function parseArgs(args) {
|
|
|
37
46
|
let command;
|
|
38
47
|
for (let i = 0; i < args.length; i++) {
|
|
39
48
|
const arg = args[i];
|
|
40
|
-
if (arg === "init" || arg === "verify-imports" || arg === "verify-i18n") {
|
|
49
|
+
if (arg === "init" || arg === "verify-imports" || arg === "verify-i18n" || arg === "audit-ui") {
|
|
41
50
|
command = arg;
|
|
42
51
|
}
|
|
43
52
|
else if (arg === "--ai" && i + 1 < args.length) {
|
|
@@ -58,11 +67,11 @@ function parseArgs(args) {
|
|
|
58
67
|
}
|
|
59
68
|
return { command, ...result };
|
|
60
69
|
}
|
|
61
|
-
function main() {
|
|
70
|
+
async function main() {
|
|
62
71
|
const args = process.argv.slice(2);
|
|
63
72
|
const parsed = parseArgs(args);
|
|
64
73
|
if (parsed.version) {
|
|
65
|
-
console.log("2.
|
|
74
|
+
console.log("2.2.0");
|
|
66
75
|
return 0;
|
|
67
76
|
}
|
|
68
77
|
if (parsed.help || args.length === 0) {
|
|
@@ -99,8 +108,21 @@ function main() {
|
|
|
99
108
|
return 1;
|
|
100
109
|
}
|
|
101
110
|
}
|
|
111
|
+
if (parsed.command === "audit-ui") {
|
|
112
|
+
try {
|
|
113
|
+
const auditOptions = parseAuditArgs(args);
|
|
114
|
+
await auditUiCommand(auditOptions);
|
|
115
|
+
return 0;
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
console.error(`Error: ${err.message}`);
|
|
119
|
+
return 1;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
102
122
|
console.error(`Unknown command. Run --help for usage.`);
|
|
103
123
|
return 1;
|
|
104
124
|
}
|
|
105
|
-
|
|
125
|
+
(async () => {
|
|
126
|
+
process.exit(await main());
|
|
127
|
+
})();
|
|
106
128
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "enterprise-ui-architect-cli",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"description": "CLI for installing Enterprise UI Architect skill into AI coding assistants",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -30,6 +30,9 @@
|
|
|
30
30
|
"@types/node": "^20.0.0",
|
|
31
31
|
"typescript": "^5.3.0"
|
|
32
32
|
},
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"playwright": "^1.49.0"
|
|
35
|
+
},
|
|
33
36
|
"engines": {
|
|
34
37
|
"node": ">=18.0.0"
|
|
35
38
|
}
|