@mozole/cli 1.4.3 → 2.0.0-b
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/LICENSE +16 -4
- package/README.md +85 -112
- package/dist/cli.d.ts +2 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +204 -184
- package/dist/cli.js.map +1 -1
- package/dist/commands/adopt.d.ts +5 -10
- package/dist/commands/adopt.d.ts.map +1 -1
- package/dist/commands/adopt.js +49 -849
- package/dist/commands/adopt.js.map +1 -1
- package/dist/commands/doctor.d.ts +1 -7
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +69 -377
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/new.d.ts +8 -10
- package/dist/commands/new.d.ts.map +1 -1
- package/dist/commands/new.js +32 -197
- package/dist/commands/new.js.map +1 -1
- package/dist/commands/phase.d.ts +11 -0
- package/dist/commands/phase.d.ts.map +1 -0
- package/dist/commands/phase.js +106 -0
- package/dist/commands/phase.js.map +1 -0
- package/dist/commands/prototype.d.ts +6 -0
- package/dist/commands/prototype.d.ts.map +1 -0
- package/dist/commands/prototype.js +28 -0
- package/dist/commands/prototype.js.map +1 -0
- package/dist/commands/repomap.d.ts +6 -0
- package/dist/commands/repomap.d.ts.map +1 -0
- package/dist/commands/repomap.js +71 -0
- package/dist/commands/repomap.js.map +1 -0
- package/dist/commands/test.d.ts +6 -0
- package/dist/commands/test.d.ts.map +1 -0
- package/dist/commands/test.js +115 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/commands/ui.d.ts +1 -42
- package/dist/commands/ui.d.ts.map +1 -1
- package/dist/commands/ui.js +74 -466
- package/dist/commands/ui.js.map +1 -1
- package/dist/commands/verify.d.ts +12 -7
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +148 -65
- package/dist/commands/verify.js.map +1 -1
- package/dist/qa/a11y.d.ts +24 -0
- package/dist/qa/a11y.d.ts.map +1 -0
- package/dist/qa/a11y.js +124 -0
- package/dist/qa/a11y.js.map +1 -0
- package/dist/qa/breakpoints.d.ts +16 -0
- package/dist/qa/breakpoints.d.ts.map +1 -0
- package/dist/qa/breakpoints.js +45 -0
- package/dist/qa/breakpoints.js.map +1 -0
- package/dist/qa/contract.d.ts +21 -0
- package/dist/qa/contract.d.ts.map +1 -0
- package/dist/qa/contract.js +116 -0
- package/dist/qa/contract.js.map +1 -0
- package/dist/qa/index.d.ts +6 -0
- package/dist/qa/index.d.ts.map +1 -0
- package/dist/qa/index.js +6 -0
- package/dist/qa/index.js.map +1 -0
- package/dist/qa/probe.d.ts +48 -0
- package/dist/qa/probe.d.ts.map +1 -0
- package/dist/qa/probe.js +206 -0
- package/dist/qa/probe.js.map +1 -0
- package/dist/qa/runner.d.ts +27 -33
- package/dist/qa/runner.d.ts.map +1 -1
- package/dist/qa/runner.js +286 -332
- package/dist/qa/runner.js.map +1 -1
- package/dist/scaffold/agents.d.ts +5 -0
- package/dist/scaffold/agents.d.ts.map +1 -0
- package/dist/scaffold/agents.js +84 -0
- package/dist/scaffold/agents.js.map +1 -0
- package/dist/scaffold/backend.d.ts +6 -8
- package/dist/scaffold/backend.d.ts.map +1 -1
- package/dist/scaffold/backend.js +318 -199
- package/dist/scaffold/backend.js.map +1 -1
- package/dist/scaffold/design.d.ts +4 -3
- package/dist/scaffold/design.d.ts.map +1 -1
- package/dist/scaffold/design.js +38 -47
- package/dist/scaffold/design.js.map +1 -1
- package/dist/scaffold/flagship.d.ts +8 -0
- package/dist/scaffold/flagship.d.ts.map +1 -0
- package/dist/scaffold/flagship.js +337 -0
- package/dist/scaffold/flagship.js.map +1 -0
- package/dist/scaffold/index.d.ts +9 -0
- package/dist/scaffold/index.d.ts.map +1 -0
- package/dist/scaffold/index.js +48 -0
- package/dist/scaffold/index.js.map +1 -0
- package/dist/scaffold/phases.d.ts +10 -0
- package/dist/scaffold/phases.d.ts.map +1 -0
- package/dist/scaffold/phases.js +165 -0
- package/dist/scaffold/phases.js.map +1 -0
- package/dist/scaffold/repomap.d.ts +6 -0
- package/dist/scaffold/repomap.d.ts.map +1 -0
- package/dist/scaffold/repomap.js +89 -0
- package/dist/scaffold/repomap.js.map +1 -0
- package/dist/scaffold/standard.d.ts +13 -0
- package/dist/scaffold/standard.d.ts.map +1 -0
- package/dist/scaffold/standard.js +371 -0
- package/dist/scaffold/standard.js.map +1 -0
- package/dist/scaffold/tokens.d.ts +3 -0
- package/dist/scaffold/tokens.d.ts.map +1 -0
- package/dist/scaffold/tokens.js +126 -0
- package/dist/scaffold/tokens.js.map +1 -0
- package/dist/server/manager.d.ts +23 -0
- package/dist/server/manager.d.ts.map +1 -0
- package/dist/server/manager.js +96 -0
- package/dist/server/manager.js.map +1 -0
- package/dist/utils/ai-trace.d.ts +8 -0
- package/dist/utils/ai-trace.d.ts.map +1 -0
- package/dist/utils/ai-trace.js +69 -0
- package/dist/utils/ai-trace.js.map +1 -0
- package/dist/utils/browser.d.ts +10 -0
- package/dist/utils/browser.d.ts.map +1 -0
- package/dist/utils/browser.js +127 -0
- package/dist/utils/browser.js.map +1 -0
- package/dist/utils/fs.d.ts +11 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +166 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/git.d.ts +9 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +69 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/process.d.ts +21 -0
- package/dist/utils/process.d.ts.map +1 -0
- package/dist/utils/process.js +120 -0
- package/dist/utils/process.js.map +1 -0
- package/dist/version.d.ts +21 -36
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +21 -44
- package/dist/version.js.map +1 -1
- package/package.json +19 -38
- package/CHANGELOG.md +0 -38
- package/dist/commands/cce.d.ts +0 -7
- package/dist/commands/cce.d.ts.map +0 -1
- package/dist/commands/cce.js +0 -37
- package/dist/commands/cce.js.map +0 -1
- package/dist/commands/logs.d.ts +0 -3
- package/dist/commands/logs.d.ts.map +0 -1
- package/dist/commands/logs.js +0 -40
- package/dist/commands/logs.js.map +0 -1
- package/dist/commands/qa.d.ts +0 -12
- package/dist/commands/qa.d.ts.map +0 -1
- package/dist/commands/qa.js +0 -143
- package/dist/commands/qa.js.map +0 -1
- package/dist/commands/stats.d.ts +0 -37
- package/dist/commands/stats.d.ts.map +0 -1
- package/dist/commands/stats.js +0 -169
- package/dist/commands/stats.js.map +0 -1
- package/dist/commands/template.d.ts +0 -8
- package/dist/commands/template.d.ts.map +0 -1
- package/dist/commands/template.js +0 -392
- package/dist/commands/template.js.map +0 -1
- package/dist/config/project.d.ts +0 -54
- package/dist/config/project.d.ts.map +0 -1
- package/dist/config/project.js +0 -100
- package/dist/config/project.js.map +0 -1
- package/dist/context/cce.d.ts +0 -39
- package/dist/context/cce.d.ts.map +0 -1
- package/dist/context/cce.js +0 -455
- package/dist/context/cce.js.map +0 -1
- package/dist/governor/fingerprint.d.ts +0 -7
- package/dist/governor/fingerprint.d.ts.map +0 -1
- package/dist/governor/fingerprint.js +0 -120
- package/dist/governor/fingerprint.js.map +0 -1
- package/dist/governor/hook.d.ts +0 -13
- package/dist/governor/hook.d.ts.map +0 -1
- package/dist/governor/hook.js +0 -389
- package/dist/governor/hook.js.map +0 -1
- package/dist/governor/state.d.ts +0 -45
- package/dist/governor/state.d.ts.map +0 -1
- package/dist/governor/state.js +0 -60
- package/dist/governor/state.js.map +0 -1
- package/dist/integrations/antigravity.d.ts +0 -20
- package/dist/integrations/antigravity.d.ts.map +0 -1
- package/dist/integrations/antigravity.js +0 -153
- package/dist/integrations/antigravity.js.map +0 -1
- package/dist/output-safety.d.ts +0 -3
- package/dist/output-safety.d.ts.map +0 -1
- package/dist/output-safety.js +0 -44
- package/dist/output-safety.js.map +0 -1
- package/dist/output.d.ts +0 -5
- package/dist/output.d.ts.map +0 -1
- package/dist/output.js +0 -2
- package/dist/output.js.map +0 -1
- package/dist/platform/executable.d.ts +0 -11
- package/dist/platform/executable.d.ts.map +0 -1
- package/dist/platform/executable.js +0 -69
- package/dist/platform/executable.js.map +0 -1
- package/dist/platform/process.d.ts +0 -27
- package/dist/platform/process.d.ts.map +0 -1
- package/dist/platform/process.js +0 -189
- package/dist/platform/process.js.map +0 -1
- package/dist/progress.d.ts +0 -44
- package/dist/progress.d.ts.map +0 -1
- package/dist/progress.js +0 -123
- package/dist/progress.js.map +0 -1
- package/dist/qa/artifacts.d.ts +0 -3
- package/dist/qa/artifacts.d.ts.map +0 -1
- package/dist/qa/artifacts.js +0 -15
- package/dist/qa/artifacts.js.map +0 -1
- package/dist/qa/diff.d.ts +0 -10
- package/dist/qa/diff.d.ts.map +0 -1
- package/dist/qa/diff.js +0 -90
- package/dist/qa/diff.js.map +0 -1
- package/dist/qa/server.d.ts +0 -10
- package/dist/qa/server.d.ts.map +0 -1
- package/dist/qa/server.js +0 -127
- package/dist/qa/server.js.map +0 -1
- package/dist/scaffold/adoption.d.ts +0 -17
- package/dist/scaffold/adoption.d.ts.map +0 -1
- package/dist/scaffold/adoption.js +0 -279
- package/dist/scaffold/adoption.js.map +0 -1
- package/dist/scaffold/legacy.d.ts +0 -4
- package/dist/scaffold/legacy.d.ts.map +0 -1
- package/dist/scaffold/legacy.js +0 -139
- package/dist/scaffold/legacy.js.map +0 -1
- package/dist/scaffold/routes.d.ts +0 -3
- package/dist/scaffold/routes.d.ts.map +0 -1
- package/dist/scaffold/routes.js +0 -37
- package/dist/scaffold/routes.js.map +0 -1
- package/dist/scaffold/standalone.d.ts +0 -7
- package/dist/scaffold/standalone.d.ts.map +0 -1
- package/dist/scaffold/standalone.js +0 -374
- package/dist/scaffold/standalone.js.map +0 -1
- package/dist/scaffold/templates.d.ts +0 -9
- package/dist/scaffold/templates.d.ts.map +0 -1
- package/dist/scaffold/templates.js +0 -317
- package/dist/scaffold/templates.js.map +0 -1
- package/dist/scaffold/write.d.ts +0 -2
- package/dist/scaffold/write.d.ts.map +0 -1
- package/dist/scaffold/write.js +0 -38
- package/dist/scaffold/write.js.map +0 -1
- package/dist/telemetry/store.d.ts +0 -33
- package/dist/telemetry/store.d.ts.map +0 -1
- package/dist/telemetry/store.js +0 -75
- package/dist/telemetry/store.js.map +0 -1
- package/dist/template/servers.d.ts +0 -21
- package/dist/template/servers.d.ts.map +0 -1
- package/dist/template/servers.js +0 -193
- package/dist/template/servers.js.map +0 -1
- package/dist/template/workspace.d.ts +0 -23
- package/dist/template/workspace.d.ts.map +0 -1
- package/dist/template/workspace.js +0 -152
- package/dist/template/workspace.js.map +0 -1
- package/dist/verify/runner.d.ts +0 -16
- package/dist/verify/runner.d.ts.map +0 -1
- package/dist/verify/runner.js +0 -112
- package/dist/verify/runner.js.map +0 -1
- package/docs/agent-audit.md +0 -24
package/dist/commands/verify.js
CHANGED
|
@@ -1,75 +1,158 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const abort = () => controller.abort();
|
|
17
|
-
process.once("SIGINT", abort);
|
|
18
|
-
process.once("SIGTERM", abort);
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import pc from "picocolors";
|
|
4
|
+
import { scanProjectForAiTraces } from "../utils/ai-trace.js";
|
|
5
|
+
import { findProjectRoot } from "../utils/fs.js";
|
|
6
|
+
import { run } from "../utils/process.js";
|
|
7
|
+
import { testCommand } from "./test.js";
|
|
8
|
+
export async function verifyCommand(options = {}) {
|
|
9
|
+
const cwd = options.cwd ?? process.cwd();
|
|
10
|
+
const projectRoot = (await findProjectRoot(cwd)) ?? cwd;
|
|
11
|
+
console.log(pc.cyan(`\n🛡️ Running Mozole Deterministic Verification in ${pc.bold(projectRoot)}`));
|
|
12
|
+
console.log(pc.gray("═".repeat(65)));
|
|
13
|
+
const stages = [];
|
|
14
|
+
// Stage 1: Synthetic Trace Scanner
|
|
15
|
+
console.log(pc.bold("\n1. Scanning for synthetic attribution markers and bot trailers..."));
|
|
19
16
|
try {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
:
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
progress.done();
|
|
33
|
-
const message = "VERIFY CURRENT\n\nNo relevant changes since the last successful verification." +
|
|
34
|
-
(config.mode === "scaffold"
|
|
35
|
-
? "\n\nSCAFFOLD MODE\nCCE, governor, telemetry, and agent instructions are intentionally absent."
|
|
36
|
-
: "");
|
|
37
|
-
output.log(message);
|
|
38
|
-
if (config.telemetry?.enabled)
|
|
39
|
-
await updateTelemetry(root, (telemetry) => {
|
|
40
|
-
telemetry.verification.avoidedRuns++;
|
|
41
|
-
telemetry.governor.modelFacingDiagnosticChars += message.length;
|
|
42
|
-
});
|
|
43
|
-
return 0;
|
|
17
|
+
const traces = await scanProjectForAiTraces(projectRoot);
|
|
18
|
+
if (traces.length > 0) {
|
|
19
|
+
stages.push({
|
|
20
|
+
name: "Synthetic Trace Scanner",
|
|
21
|
+
success: false,
|
|
22
|
+
message: `Detected ${traces.length} synthetic attribution marker(s).`,
|
|
23
|
+
evidence: traces.map((t) => ` ${t.file}:${t.line} -> "${t.match}"`).join("\n"),
|
|
24
|
+
});
|
|
25
|
+
console.log(pc.red(" ✗ Prohibited synthetic markers found:"));
|
|
26
|
+
for (const t of traces) {
|
|
27
|
+
console.log(pc.red(` - ${t.file}:${t.line} (${t.match})`));
|
|
28
|
+
}
|
|
44
29
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
30
|
+
else {
|
|
31
|
+
stages.push({ name: "Synthetic Trace Scanner", success: true });
|
|
32
|
+
console.log(pc.green(" ✓ Zero synthetic traces or bot trailers detected."));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
stages.push({
|
|
37
|
+
name: "Synthetic Trace Scanner",
|
|
38
|
+
success: false,
|
|
39
|
+
message: err instanceof Error ? err.message : String(err),
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
// Stage 2: Biome Lint & Format Check
|
|
43
|
+
console.log(pc.bold("\n2. Running Biome linter and formatter..."));
|
|
44
|
+
try {
|
|
45
|
+
const biomeRes = await run(process.execPath, [path.join(projectRoot, "node_modules/@biomejs/biome/bin/biome"), "check", "src"], { cwd: projectRoot });
|
|
46
|
+
if (biomeRes.exitCode === 0) {
|
|
47
|
+
stages.push({ name: "Biome Code Standards", success: true });
|
|
48
|
+
console.log(pc.green(" ✓ Biome lint and formatting clean."));
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
stages.push({
|
|
52
|
+
name: "Biome Code Standards",
|
|
53
|
+
success: false,
|
|
54
|
+
evidence: biomeRes.stderr + biomeRes.stdout,
|
|
55
|
+
});
|
|
56
|
+
console.log(pc.red(" ✗ Biome reported lint or formatting violations."));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
// Environmental check
|
|
61
|
+
stages.push({
|
|
62
|
+
name: "Biome Code Standards",
|
|
63
|
+
success: false,
|
|
64
|
+
message: `Biome execution failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
48
65
|
});
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
};
|
|
57
|
-
|
|
66
|
+
}
|
|
67
|
+
// Stage 3: TypeScript Compilation & Typecheck
|
|
68
|
+
console.log(pc.bold("\n3. Running TypeScript typecheck..."));
|
|
69
|
+
try {
|
|
70
|
+
const pkg = JSON.parse(await readFile(path.join(projectRoot, "package.json"), "utf8"));
|
|
71
|
+
const tscRes = pkg.scripts?.typecheck
|
|
72
|
+
? await run("npm", ["run", "typecheck"], { cwd: projectRoot })
|
|
73
|
+
: await run(process.execPath, [path.join(projectRoot, "node_modules/typescript/bin/tsc"), "--noEmit"], { cwd: projectRoot });
|
|
74
|
+
if (tscRes.exitCode === 0) {
|
|
75
|
+
stages.push({ name: "TypeScript Typecheck", success: true });
|
|
76
|
+
console.log(pc.green(" ✓ TypeScript compiled with zero type errors."));
|
|
58
77
|
}
|
|
59
|
-
else
|
|
60
|
-
|
|
61
|
-
|
|
78
|
+
else {
|
|
79
|
+
stages.push({
|
|
80
|
+
name: "TypeScript Typecheck",
|
|
81
|
+
success: false,
|
|
82
|
+
evidence: tscRes.stderr + tscRes.stdout,
|
|
83
|
+
});
|
|
84
|
+
console.log(pc.red(" ✗ TypeScript compilation reported type errors."));
|
|
62
85
|
}
|
|
63
|
-
return result.passed ? 0 : 1;
|
|
64
86
|
}
|
|
65
|
-
catch (
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
87
|
+
catch (err) {
|
|
88
|
+
stages.push({
|
|
89
|
+
name: "TypeScript Typecheck",
|
|
90
|
+
success: false,
|
|
91
|
+
message: `TypeScript execution failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
92
|
+
});
|
|
69
93
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
94
|
+
if (!options.skipBuild) {
|
|
95
|
+
console.log(pc.bold("\n4. Building production output..."));
|
|
96
|
+
try {
|
|
97
|
+
const build = await run("npm", ["run", "build"], { cwd: projectRoot });
|
|
98
|
+
stages.push({
|
|
99
|
+
name: "Production Build",
|
|
100
|
+
success: build.exitCode === 0,
|
|
101
|
+
evidence: build.stdout + build.stderr,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
stages.push({ name: "Production Build", success: false, message: String(error) });
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
console.log(pc.bold("\n5. Running Mozole Design Contract & A11y Audit..."));
|
|
109
|
+
try {
|
|
110
|
+
await testCommand({ cwd: projectRoot, type: "all" });
|
|
111
|
+
stages.push({ name: "Design Contract & A11y Audit", success: true });
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
stages.push({
|
|
115
|
+
name: "Design Contract & A11y Audit",
|
|
116
|
+
success: false,
|
|
117
|
+
message: err instanceof Error ? err.message : String(err),
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
// Stage 6: Live Headless DOM Geometry & Trace Probe (if requested)
|
|
121
|
+
if (options.withProbe) {
|
|
122
|
+
console.log(pc.bold("\n6. Running Live Headless DOM Geometry & Trace Probe..."));
|
|
123
|
+
try {
|
|
124
|
+
await testCommand({ cwd: projectRoot, type: "probe" });
|
|
125
|
+
stages.push({ name: "Live DOM Geometry Probe", success: true });
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
stages.push({
|
|
129
|
+
name: "Live DOM Geometry Probe",
|
|
130
|
+
success: false,
|
|
131
|
+
message: err instanceof Error ? err.message : String(err),
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// Summary Report
|
|
136
|
+
console.log(pc.gray(`\n${"═".repeat(65)}`));
|
|
137
|
+
const failedStages = stages.filter((s) => !s.success);
|
|
138
|
+
const allPassed = failedStages.length === 0;
|
|
139
|
+
if (allPassed) {
|
|
140
|
+
console.log(pc.green(pc.bold("\n🎉 All Mozole verification checks PASSED! Ready for deployment/commit.\n")));
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
console.log(pc.red(pc.bold(`\n❌ Verification FAILED (${failedStages.length}/${stages.length} stages failed):\n`)));
|
|
144
|
+
for (const f of failedStages) {
|
|
145
|
+
console.log(pc.red(` ✗ Stage: ${f.name}`));
|
|
146
|
+
if (f.message)
|
|
147
|
+
console.log(pc.red(` Message: ${f.message}`));
|
|
148
|
+
if (f.evidence) {
|
|
149
|
+
console.log(pc.dim(" Evidence:"));
|
|
150
|
+
const sample = f.evidence.split("\n").slice(0, 10).join("\n");
|
|
151
|
+
console.log(pc.dim(sample));
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
console.log();
|
|
73
155
|
}
|
|
156
|
+
return allPassed;
|
|
74
157
|
}
|
|
75
158
|
//# sourceMappingURL=verify.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAexC,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAAyB,EAAE;IAC7D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzC,MAAM,WAAW,GAAG,CAAC,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC;IAExD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,uDAAuD,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;IACpG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAErC,MAAM,MAAM,GAAwB,EAAE,CAAC;IAEvC,mCAAmC;IACnC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC,CAAC;IAC5F,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,WAAW,CAAC,CAAC;QACzD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,yBAAyB;gBAC/B,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,YAAY,MAAM,CAAC,MAAM,mCAAmC;gBACrE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;aAChF,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC,CAAC;YAC/D,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAChE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,yBAAyB;YAC/B,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SAC1D,CAAC,CAAC;IACL,CAAC;IAED,qCAAqC;IACrC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC,CAAC;IACnE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,GAAG,CACxB,OAAO,CAAC,QAAQ,EAChB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,uCAAuC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EACjF,EAAE,GAAG,EAAE,WAAW,EAAE,CACrB,CAAC;QACF,IAAI,QAAQ,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC,CAAC;QAChE,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,sBAAsB;gBAC5B,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM;aAC5C,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,sBAAsB;QACtB,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,sBAAsB;YAC5B,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,2BAA2B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;SACvF,CAAC,CAAC;IACL,CAAC;IAED,8CAA8C;IAC9C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC,CAAC;IAC7D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QACvF,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,SAAS;YACnC,CAAC,CAAC,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC;YAC9D,CAAC,CAAC,MAAM,GAAG,CACP,OAAO,CAAC,QAAQ,EAChB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,iCAAiC,CAAC,EAAE,UAAU,CAAC,EACvE,EAAE,GAAG,EAAE,WAAW,EAAE,CACrB,CAAC;QACN,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC,CAAC;QAC1E,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,sBAAsB;gBAC5B,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM;aACxC,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,sBAAsB;YAC5B,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,gCAAgC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;SAC5F,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;YACvE,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,kBAAkB;gBACxB,OAAO,EAAE,KAAK,CAAC,QAAQ,KAAK,CAAC;gBAC7B,QAAQ,EAAE,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM;aACtC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC,CAAC;IAC5E,IAAI,CAAC;QACH,MAAM,WAAW,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,8BAA8B,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACvE,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,8BAA8B;YACpC,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SAC1D,CAAC,CAAC;IACL,CAAC;IAED,mEAAmE;IACnE,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC,CAAC;QACjF,IAAI,CAAC;YACH,MAAM,WAAW,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACvD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,yBAAyB;gBAC/B,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aAC1D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,iBAAiB;IACjB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5C,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC;IAE5C,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CACT,EAAE,CAAC,KAAK,CACN,EAAE,CAAC,IAAI,CAAC,4EAA4E,CAAC,CACtF,CACF,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CACT,EAAE,CAAC,GAAG,CACJ,EAAE,CAAC,IAAI,CACL,4BAA4B,YAAY,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,oBAAoB,CACrF,CACF,CACF,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAC5C,IAAI,CAAC,CAAC,OAAO;gBAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAChE,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;gBACrC,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC9D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export type A11ySeverity = "error" | "warn";
|
|
2
|
+
export interface A11yFinding {
|
|
3
|
+
file: string;
|
|
4
|
+
line: number;
|
|
5
|
+
rule: string;
|
|
6
|
+
severity: A11ySeverity;
|
|
7
|
+
element: string;
|
|
8
|
+
message: string;
|
|
9
|
+
}
|
|
10
|
+
export interface A11yAuditResult {
|
|
11
|
+
errors: A11yFinding[];
|
|
12
|
+
warnings: A11yFinding[];
|
|
13
|
+
totalIssues: number;
|
|
14
|
+
}
|
|
15
|
+
export interface HtmlSource {
|
|
16
|
+
file: string;
|
|
17
|
+
html: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Static accessibility and semantic landmark audit.
|
|
21
|
+
* Enforces WCAG 2.1 AA landmark hierarchy, keyboard landmarks, and accessible forms.
|
|
22
|
+
*/
|
|
23
|
+
export declare function auditHtmlA11y(sources: HtmlSource[]): A11yAuditResult;
|
|
24
|
+
//# sourceMappingURL=a11y.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a11y.d.ts","sourceRoot":"","sources":["../../src/qa/a11y.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,MAAM,CAAC;AAE5C,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,YAAY,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAUD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,eAAe,CA+KpE"}
|
package/dist/qa/a11y.js
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
function lineOf(source, index) {
|
|
2
|
+
return source.slice(0, index).split("\n").length;
|
|
3
|
+
}
|
|
4
|
+
function isDecorativeImage(tag) {
|
|
5
|
+
return /\balt\s*=\s*["']\s*["']/i.test(tag) || /\baria-hidden\s*=\s*["']true["']/i.test(tag);
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Static accessibility and semantic landmark audit.
|
|
9
|
+
* Enforces WCAG 2.1 AA landmark hierarchy, keyboard landmarks, and accessible forms.
|
|
10
|
+
*/
|
|
11
|
+
export function auditHtmlA11y(sources) {
|
|
12
|
+
const errors = [];
|
|
13
|
+
const warnings = [];
|
|
14
|
+
for (const { file, html: source } of sources) {
|
|
15
|
+
// Ignore inert markup in comments and raw-text elements while preserving line numbers.
|
|
16
|
+
const html = source.replace(/<!--[\s\S]*?-->|<(script|style)\b[^>]*>[\s\S]*?<\/\1\s*>/gi, (match) => match.replace(/[^\n]/g, " "));
|
|
17
|
+
const addError = (rule, element, message, line = 1) => {
|
|
18
|
+
errors.push({ file, line, rule, severity: "error", element, message });
|
|
19
|
+
};
|
|
20
|
+
const addWarn = (rule, element, message, line = 1) => {
|
|
21
|
+
warnings.push({ file, line, rule, severity: "warn", element, message });
|
|
22
|
+
};
|
|
23
|
+
// 1. html lang attribute (for full pages)
|
|
24
|
+
if (/<html\b/i.test(html)) {
|
|
25
|
+
if (!/<html\s[^>]*\blang\s*=\s*["'][a-z]{2}(?:-[A-Za-z]{2,4})?["']/i.test(html)) {
|
|
26
|
+
addError("html-lang", "<html>", "Missing or invalid lang attribute on <html> element.");
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// 2. Headings & Landmarks (exempt empty SPA root shells)
|
|
30
|
+
const isSpaShell = /<div\s+id=["']root["']\s*>\s*<\/div>/i.test(html);
|
|
31
|
+
const h1s = Array.from(html.matchAll(/<h1\b[^>]*>/gi));
|
|
32
|
+
if (/<body\b|<main\b/i.test(html) && !isSpaShell) {
|
|
33
|
+
if (h1s.length === 0) {
|
|
34
|
+
addError("single-h1", "<h1>", "Page missing top-level <h1> landmark heading.");
|
|
35
|
+
}
|
|
36
|
+
else if (h1s.length > 1) {
|
|
37
|
+
addError("single-h1", "<h1>", `Page contains ${h1s.length} <h1> headings; exactly one landmark heading expected.`, lineOf(html, h1s[1].index ?? 0));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// 3. Main landmark
|
|
41
|
+
const mains = Array.from(html.matchAll(/<main\b[^>]*>/gi));
|
|
42
|
+
if (/<body\b/i.test(html) && !isSpaShell) {
|
|
43
|
+
if (mains.length === 0) {
|
|
44
|
+
addError("main-landmark", "<main>", "Page missing <main> primary content landmark.");
|
|
45
|
+
}
|
|
46
|
+
else if (mains.length > 1) {
|
|
47
|
+
addError("main-landmark", "<main>", `Page contains ${mains.length} <main> landmarks; exactly one expected.`, lineOf(html, mains[1].index ?? 0));
|
|
48
|
+
}
|
|
49
|
+
// 4. Skip-to-content link
|
|
50
|
+
const mainMatch = mains[0]?.[0];
|
|
51
|
+
const mainId = mainMatch?.match(/\bid\s*=\s*["']([^"']+)["']/i)?.[1];
|
|
52
|
+
const skipLinkMatch = Array.from(html.matchAll(/<a\b[^>]*>/gi)).find((match) => /\sclass\s*=\s*["'][^"']*\bskip-link\b[^"']*["']/i.test(match[0]));
|
|
53
|
+
if (mains.length === 1 && !skipLinkMatch) {
|
|
54
|
+
addWarn("skip-link", "<a class='skip-link'>", "Page lacks an accessible skip-to-content keyboard link before primary navigation.");
|
|
55
|
+
}
|
|
56
|
+
else if (skipLinkMatch && mainId) {
|
|
57
|
+
const skipHref = skipLinkMatch[0].match(/\shref\s*=\s*["']#([^"']+)["']/i)?.[1];
|
|
58
|
+
if (skipHref !== mainId) {
|
|
59
|
+
addError("skip-link-target", "<a class='skip-link'>", `Skip link target '#${skipHref}' does not match <main> ID '#${mainId}'.`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// 5. Unique IDs
|
|
64
|
+
const idMatches = Array.from(html.matchAll(/<[^>]+>/g)).flatMap((tag) => Array.from(tag[0].matchAll(/\sid\s*=\s*["']([^"']+)["']/gi)));
|
|
65
|
+
const seenIds = new Set();
|
|
66
|
+
const dupIds = new Set();
|
|
67
|
+
for (const match of idMatches) {
|
|
68
|
+
const id = match[1];
|
|
69
|
+
if (seenIds.has(id)) {
|
|
70
|
+
dupIds.add(id);
|
|
71
|
+
}
|
|
72
|
+
seenIds.add(id);
|
|
73
|
+
}
|
|
74
|
+
for (const dup of dupIds) {
|
|
75
|
+
addError("unique-id", `#${dup}`, `Duplicate element ID '#${dup}' violates DOM uniqueness and a11y label associations.`);
|
|
76
|
+
}
|
|
77
|
+
// 6. Image alt text
|
|
78
|
+
const imgMatches = Array.from(html.matchAll(/<img\b[^>]*>/gi));
|
|
79
|
+
for (const match of imgMatches) {
|
|
80
|
+
const tag = match[0];
|
|
81
|
+
const line = lineOf(html, match.index ?? 0);
|
|
82
|
+
if (!/\balt\s*=/i.test(tag)) {
|
|
83
|
+
addError("img-alt", tag.slice(0, 60), "Image missing alt attribute. Provide descriptive alt text or empty alt='' for decorative graphics.", line);
|
|
84
|
+
}
|
|
85
|
+
else if (!isDecorativeImage(tag)) {
|
|
86
|
+
const altText = tag.match(/\balt\s*=\s*["']([^"']*)["']/i)?.[1] ?? "";
|
|
87
|
+
if (/^(?:image|photo|picture|görsel|resim|fotoğraf)$/i.test(altText.trim())) {
|
|
88
|
+
addWarn("img-alt-quality", tag.slice(0, 60), `Uninformative alt text '${altText}'. Describe the image content or set alt='' if decorative.`, line);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// 7. Button type attribute
|
|
93
|
+
const buttonMatches = Array.from(html.matchAll(/<button\b[^>]*>/gi));
|
|
94
|
+
for (const match of buttonMatches) {
|
|
95
|
+
const tag = match[0];
|
|
96
|
+
const line = lineOf(html, match.index ?? 0);
|
|
97
|
+
if (!/\btype\s*=\s*["'](?:button|submit|reset)["']/i.test(tag)) {
|
|
98
|
+
addWarn("button-type", tag.slice(0, 60), "Button missing explicit type attribute ('button', 'submit', or 'reset'). Default is submit.", line);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// 8. New tab links target='_blank' rel='noopener'
|
|
102
|
+
const blankLinks = Array.from(html.matchAll(/<a\b[^>]*\btarget\s*=\s*["']_blank["'][^>]*>/gi));
|
|
103
|
+
for (const match of blankLinks) {
|
|
104
|
+
const tag = match[0];
|
|
105
|
+
const line = lineOf(html, match.index ?? 0);
|
|
106
|
+
if (!/\brel\s*=\s*["'][^"']*\b(?:noopener|noreferrer)\b[^"']*["']/i.test(tag)) {
|
|
107
|
+
addError("link-rel-noopener", tag.slice(0, 60), "Target='_blank' link missing rel='noopener' or rel='noreferrer'.", line);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// 9. Inline styles ban (enforcing atomic primitives)
|
|
111
|
+
const inlineStyles = Array.from(html.matchAll(/\bstyle\s*=\s*["'][^"']*["']/gi));
|
|
112
|
+
for (const match of inlineStyles) {
|
|
113
|
+
const tag = match[0];
|
|
114
|
+
const line = lineOf(html, match.index ?? 0);
|
|
115
|
+
addError("no-inline-style", tag.slice(0, 60), "Inline style attribute bypasses design token system and atomic primitives.", line);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
errors,
|
|
120
|
+
warnings,
|
|
121
|
+
totalIssues: errors.length + warnings.length,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=a11y.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a11y.js","sourceRoot":"","sources":["../../src/qa/a11y.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface ViewportDefinition {
|
|
2
|
+
name: string;
|
|
3
|
+
width: number;
|
|
4
|
+
height: number;
|
|
5
|
+
}
|
|
6
|
+
export declare const STANDARD_VIEWPORTS: ViewportDefinition[];
|
|
7
|
+
/**
|
|
8
|
+
* Extracts breakpoint boundary widths from CSS sources.
|
|
9
|
+
* For every detected min-width or max-width query, generates width - 1, width, and width + 1,
|
|
10
|
+
* ensuring boundary conditions never cause accidental horizontal overflow or control collisions.
|
|
11
|
+
*/
|
|
12
|
+
export declare function extractBreakpointBoundaries(cssSources: string[], options?: {
|
|
13
|
+
minWidth?: number;
|
|
14
|
+
maxWidth?: number;
|
|
15
|
+
}): number[];
|
|
16
|
+
//# sourceMappingURL=breakpoints.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"breakpoints.d.ts","sourceRoot":"","sources":["../../src/qa/breakpoints.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,kBAAkB,EAAE,kBAAkB,EASlD,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,MAAM,EAAE,EACpB,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GACjD,MAAM,EAAE,CAmCV"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import postcss from "postcss";
|
|
2
|
+
export const STANDARD_VIEWPORTS = [
|
|
3
|
+
{ name: "mobile-min", width: 320, height: 800 },
|
|
4
|
+
{ name: "mobile-small", width: 375, height: 812 },
|
|
5
|
+
{ name: "mobile-standard", width: 390, height: 844 },
|
|
6
|
+
{ name: "tablet-portrait", width: 768, height: 1024 },
|
|
7
|
+
{ name: "tablet-landscape", width: 1024, height: 768 },
|
|
8
|
+
{ name: "desktop-compact", width: 1280, height: 800 },
|
|
9
|
+
{ name: "desktop-standard", width: 1440, height: 900 },
|
|
10
|
+
{ name: "desktop-wide", width: 1920, height: 1080 },
|
|
11
|
+
];
|
|
12
|
+
/**
|
|
13
|
+
* Extracts breakpoint boundary widths from CSS sources.
|
|
14
|
+
* For every detected min-width or max-width query, generates width - 1, width, and width + 1,
|
|
15
|
+
* ensuring boundary conditions never cause accidental horizontal overflow or control collisions.
|
|
16
|
+
*/
|
|
17
|
+
export function extractBreakpointBoundaries(cssSources, options) {
|
|
18
|
+
const min = options?.minWidth ?? 320;
|
|
19
|
+
const max = options?.maxWidth ?? 2560;
|
|
20
|
+
const boundaries = new Set(STANDARD_VIEWPORTS.map((viewport) => viewport.width).filter((width) => width >= min && width <= max));
|
|
21
|
+
for (const css of cssSources) {
|
|
22
|
+
try {
|
|
23
|
+
const root = postcss.parse(css);
|
|
24
|
+
root.walkAtRules("media", (rule) => {
|
|
25
|
+
const matches = rule.params.matchAll(/(?:(?:min|max)-width\s*:|\bwidth\s*(?:<=?|>=?|=))\s*(\d+(?:\.\d+)?)(px|rem|em)\b|(\d+(?:\.\d+)?)(px|rem|em)\s*(?:<=?|>=?)\s*(?=width\b)/gi);
|
|
26
|
+
for (const match of matches) {
|
|
27
|
+
const rawVal = Number.parseFloat(match[1] ?? match[3]);
|
|
28
|
+
const unit = (match[2] ?? match[4]).toLowerCase();
|
|
29
|
+
const point = Math.round(rawVal * (unit === "px" ? 1 : 16));
|
|
30
|
+
for (const delta of [-1, 0, 1]) {
|
|
31
|
+
const candidate = point + delta;
|
|
32
|
+
if (candidate >= min && candidate <= max) {
|
|
33
|
+
boundaries.add(candidate);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// Ignore unparseable CSS chunks
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return Array.from(boundaries).sort((a, b) => a - b);
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=breakpoints.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"breakpoints.js","sourceRoot":"","sources":["../../src/qa/breakpoints.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type FindingSeverity = "error" | "warn";
|
|
2
|
+
export interface ContractFinding {
|
|
3
|
+
file: string;
|
|
4
|
+
line: number;
|
|
5
|
+
selector: string;
|
|
6
|
+
rule: string;
|
|
7
|
+
severity: FindingSeverity;
|
|
8
|
+
value: string;
|
|
9
|
+
message: string;
|
|
10
|
+
}
|
|
11
|
+
export interface ContractAuditResult {
|
|
12
|
+
errors: ContractFinding[];
|
|
13
|
+
warnings: ContractFinding[];
|
|
14
|
+
totalViolations: number;
|
|
15
|
+
}
|
|
16
|
+
export interface CssSource {
|
|
17
|
+
file: string;
|
|
18
|
+
css: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function auditCssContracts(sources: CssSource[]): ContractAuditResult;
|
|
21
|
+
//# sourceMappingURL=contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../src/qa/contract.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,MAAM,CAAC;AAE/C,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,eAAe,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAKD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,mBAAmB,CA2J3E"}
|