@a11yst/cli 1.0.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.
- package/LICENSE +373 -0
- package/NOTICE.md +11 -0
- package/README.md +60 -0
- package/TRADEMARKS.md +52 -0
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +9 -0
- package/dist/bin.js.map +1 -0
- package/dist/ci-policy-options.d.ts +15 -0
- package/dist/ci-policy-options.d.ts.map +1 -0
- package/dist/ci-policy-options.js +54 -0
- package/dist/ci-policy-options.js.map +1 -0
- package/dist/cli-progress.d.ts +16 -0
- package/dist/cli-progress.d.ts.map +1 -0
- package/dist/cli-progress.js +35 -0
- package/dist/cli-progress.js.map +1 -0
- package/dist/command-program.d.ts +7 -0
- package/dist/command-program.d.ts.map +1 -0
- package/dist/command-program.js +950 -0
- package/dist/command-program.js.map +1 -0
- package/dist/commands/audit-flow-output.d.ts +4 -0
- package/dist/commands/audit-flow-output.d.ts.map +1 -0
- package/dist/commands/audit-flow-output.js +119 -0
- package/dist/commands/audit-flow-output.js.map +1 -0
- package/dist/commands/audit-policy-output.d.ts +9 -0
- package/dist/commands/audit-policy-output.d.ts.map +1 -0
- package/dist/commands/audit-policy-output.js +95 -0
- package/dist/commands/audit-policy-output.js.map +1 -0
- package/dist/commands/audit.d.ts +15 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +178 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/baseline-config.d.ts +14 -0
- package/dist/commands/baseline-config.d.ts.map +1 -0
- package/dist/commands/baseline-config.js +33 -0
- package/dist/commands/baseline-config.js.map +1 -0
- package/dist/commands/baseline.d.ts +86 -0
- package/dist/commands/baseline.d.ts.map +1 -0
- package/dist/commands/baseline.js +392 -0
- package/dist/commands/baseline.js.map +1 -0
- package/dist/commands/classify.d.ts +30 -0
- package/dist/commands/classify.d.ts.map +1 -0
- package/dist/commands/classify.js +105 -0
- package/dist/commands/classify.js.map +1 -0
- package/dist/commands/detect.d.ts +12 -0
- package/dist/commands/detect.d.ts.map +1 -0
- package/dist/commands/detect.js +213 -0
- package/dist/commands/detect.js.map +1 -0
- package/dist/commands/doctor.d.ts +16 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +404 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/findings.d.ts +45 -0
- package/dist/commands/findings.d.ts.map +1 -0
- package/dist/commands/findings.js +220 -0
- package/dist/commands/findings.js.map +1 -0
- package/dist/commands/flows.d.ts +30 -0
- package/dist/commands/flows.d.ts.map +1 -0
- package/dist/commands/flows.js +108 -0
- package/dist/commands/flows.js.map +1 -0
- package/dist/commands/init.d.ts +64 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +293 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/profiles.d.ts +5 -0
- package/dist/commands/profiles.d.ts.map +1 -0
- package/dist/commands/profiles.js +39 -0
- package/dist/commands/profiles.js.map +1 -0
- package/dist/commands/report.d.ts +72 -0
- package/dist/commands/report.d.ts.map +1 -0
- package/dist/commands/report.js +284 -0
- package/dist/commands/report.js.map +1 -0
- package/dist/commands/results-loader.d.ts +15 -0
- package/dist/commands/results-loader.d.ts.map +1 -0
- package/dist/commands/results-loader.js +100 -0
- package/dist/commands/results-loader.js.map +1 -0
- package/dist/commands/routes.d.ts +35 -0
- package/dist/commands/routes.d.ts.map +1 -0
- package/dist/commands/routes.js +201 -0
- package/dist/commands/routes.js.map +1 -0
- package/dist/commands/unclassify.d.ts +22 -0
- package/dist/commands/unclassify.d.ts.map +1 -0
- package/dist/commands/unclassify.js +79 -0
- package/dist/commands/unclassify.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/output.d.ts +9 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +29 -0
- package/dist/output.js.map +1 -0
- package/dist/presentation/ansi.d.ts +12 -0
- package/dist/presentation/ansi.d.ts.map +1 -0
- package/dist/presentation/ansi.js +51 -0
- package/dist/presentation/ansi.js.map +1 -0
- package/dist/presentation/audit-presentation.d.ts +20 -0
- package/dist/presentation/audit-presentation.d.ts.map +1 -0
- package/dist/presentation/audit-presentation.js +409 -0
- package/dist/presentation/audit-presentation.js.map +1 -0
- package/dist/presentation/boundary.d.ts +5 -0
- package/dist/presentation/boundary.d.ts.map +1 -0
- package/dist/presentation/boundary.js +4 -0
- package/dist/presentation/boundary.js.map +1 -0
- package/dist/presentation/brand-header.d.ts +6 -0
- package/dist/presentation/brand-header.d.ts.map +1 -0
- package/dist/presentation/brand-header.js +18 -0
- package/dist/presentation/brand-header.js.map +1 -0
- package/dist/presentation/capabilities.d.ts +4 -0
- package/dist/presentation/capabilities.d.ts.map +1 -0
- package/dist/presentation/capabilities.js +25 -0
- package/dist/presentation/capabilities.js.map +1 -0
- package/dist/presentation/color.d.ts +13 -0
- package/dist/presentation/color.d.ts.map +1 -0
- package/dist/presentation/color.js +27 -0
- package/dist/presentation/color.js.map +1 -0
- package/dist/presentation/disclaimers.d.ts +3 -0
- package/dist/presentation/disclaimers.d.ts.map +1 -0
- package/dist/presentation/disclaimers.js +3 -0
- package/dist/presentation/disclaimers.js.map +1 -0
- package/dist/presentation/finding-groups.d.ts +14 -0
- package/dist/presentation/finding-groups.d.ts.map +1 -0
- package/dist/presentation/finding-groups.js +77 -0
- package/dist/presentation/finding-groups.js.map +1 -0
- package/dist/presentation/finding-source-report.d.ts +21 -0
- package/dist/presentation/finding-source-report.d.ts.map +1 -0
- package/dist/presentation/finding-source-report.js +134 -0
- package/dist/presentation/finding-source-report.js.map +1 -0
- package/dist/presentation/human-output.d.ts +4 -0
- package/dist/presentation/human-output.d.ts.map +1 -0
- package/dist/presentation/human-output.js +8 -0
- package/dist/presentation/human-output.js.map +1 -0
- package/dist/presentation/index.d.ts +15 -0
- package/dist/presentation/index.d.ts.map +1 -0
- package/dist/presentation/index.js +13 -0
- package/dist/presentation/index.js.map +1 -0
- package/dist/presentation/mode.d.ts +4 -0
- package/dist/presentation/mode.d.ts.map +1 -0
- package/dist/presentation/mode.js +8 -0
- package/dist/presentation/mode.js.map +1 -0
- package/dist/presentation/progress-mode.d.ts +20 -0
- package/dist/presentation/progress-mode.d.ts.map +1 -0
- package/dist/presentation/progress-mode.js +38 -0
- package/dist/presentation/progress-mode.js.map +1 -0
- package/dist/presentation/progress-reporter.d.ts +18 -0
- package/dist/presentation/progress-reporter.d.ts.map +1 -0
- package/dist/presentation/progress-reporter.js +236 -0
- package/dist/presentation/progress-reporter.js.map +1 -0
- package/dist/presentation/progress-signals.d.ts +2 -0
- package/dist/presentation/progress-signals.d.ts.map +1 -0
- package/dist/presentation/progress-signals.js +14 -0
- package/dist/presentation/progress-signals.js.map +1 -0
- package/dist/presentation/status.d.ts +11 -0
- package/dist/presentation/status.d.ts.map +1 -0
- package/dist/presentation/status.js +14 -0
- package/dist/presentation/status.js.map +1 -0
- package/dist/presentation/types.d.ts +23 -0
- package/dist/presentation/types.d.ts.map +1 -0
- package/dist/presentation/types.js +2 -0
- package/dist/presentation/types.js.map +1 -0
- package/dist/run-cli.d.ts +6 -0
- package/dist/run-cli.d.ts.map +1 -0
- package/dist/run-cli.js +15 -0
- package/dist/run-cli.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { dispositionLabel, type BaselineUpdatePreview, type CompareBaselineResult } from "@a11yst/baseline";
|
|
2
|
+
import type { BaselineComparisonArtifact, BaselineFile, BaselineSummary, AuditExecutionResult } from "@a11yst/types";
|
|
3
|
+
export interface RunBaselineCreateOptions {
|
|
4
|
+
cwd: string;
|
|
5
|
+
configPath?: string;
|
|
6
|
+
from?: string;
|
|
7
|
+
force?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface BaselineCreateResult {
|
|
10
|
+
status: "created";
|
|
11
|
+
baselinePath: string;
|
|
12
|
+
entryCount: number;
|
|
13
|
+
createdAt: string;
|
|
14
|
+
}
|
|
15
|
+
export interface RunBaselineStatusOptions {
|
|
16
|
+
cwd: string;
|
|
17
|
+
configPath?: string;
|
|
18
|
+
baselineOverride?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface BaselineStatusResult {
|
|
21
|
+
status: "ok";
|
|
22
|
+
baselinePath: string;
|
|
23
|
+
baseline: BaselineFile;
|
|
24
|
+
comparison?: CompareBaselineResult;
|
|
25
|
+
resultsPath?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface RunBaselineUpdateOptions {
|
|
28
|
+
cwd: string;
|
|
29
|
+
configPath?: string;
|
|
30
|
+
from?: string;
|
|
31
|
+
dryRun?: boolean;
|
|
32
|
+
acceptNew?: boolean;
|
|
33
|
+
removeResolved?: boolean;
|
|
34
|
+
yes?: boolean;
|
|
35
|
+
}
|
|
36
|
+
export interface BaselineUpdateResult {
|
|
37
|
+
status: "preview" | "updated" | "unchanged";
|
|
38
|
+
baselinePath: string;
|
|
39
|
+
preview: BaselineUpdatePreview;
|
|
40
|
+
resultsPath: string;
|
|
41
|
+
comparison: CompareBaselineResult;
|
|
42
|
+
updated?: BaselineFile;
|
|
43
|
+
}
|
|
44
|
+
export interface RunBaselineMigrateOptions {
|
|
45
|
+
cwd: string;
|
|
46
|
+
configPath?: string;
|
|
47
|
+
baselineOverride?: string;
|
|
48
|
+
dryRun?: boolean;
|
|
49
|
+
yes?: boolean;
|
|
50
|
+
}
|
|
51
|
+
export interface BaselineMigrateResult {
|
|
52
|
+
status: "preview" | "migrated" | "unchanged";
|
|
53
|
+
baselinePath: string;
|
|
54
|
+
migrated: boolean;
|
|
55
|
+
message: string;
|
|
56
|
+
baseline: BaselineFile;
|
|
57
|
+
}
|
|
58
|
+
export declare function runBaselineCreate(options: RunBaselineCreateOptions): Promise<BaselineCreateResult>;
|
|
59
|
+
export declare function runBaselineStatus(options: RunBaselineStatusOptions): Promise<BaselineStatusResult>;
|
|
60
|
+
export declare function runBaselineUpdate(options: RunBaselineUpdateOptions): Promise<BaselineUpdateResult>;
|
|
61
|
+
export declare function runBaselineMigrate(options: RunBaselineMigrateOptions): Promise<BaselineMigrateResult>;
|
|
62
|
+
export declare function formatBaselineCreateHuman(result: BaselineCreateResult): string;
|
|
63
|
+
export declare function formatBaselineCreateJson(result: BaselineCreateResult): unknown;
|
|
64
|
+
export declare function formatBaselineStatusHuman(result: BaselineStatusResult): string;
|
|
65
|
+
export declare function formatBaselineStatusJson(result: BaselineStatusResult): unknown;
|
|
66
|
+
export declare function formatBaselineUpdateHuman(result: BaselineUpdateResult): string;
|
|
67
|
+
export declare function formatBaselineUpdateJson(result: BaselineUpdateResult): unknown;
|
|
68
|
+
export declare function formatBaselineMigrateHuman(result: BaselineMigrateResult): string;
|
|
69
|
+
export declare function formatBaselineMigrateJson(result: BaselineMigrateResult): unknown;
|
|
70
|
+
export declare function formatBaselineComparisonArtifact(summary: BaselineSummary): string[];
|
|
71
|
+
export { dispositionLabel, type BaselineComparisonArtifact };
|
|
72
|
+
export declare function applyBaselineToAuditResult(options: {
|
|
73
|
+
cwd: string;
|
|
74
|
+
configPath?: string;
|
|
75
|
+
result: AuditExecutionResult;
|
|
76
|
+
noBaseline?: boolean;
|
|
77
|
+
baselineOverride?: string;
|
|
78
|
+
explicitBaselineRequired?: boolean;
|
|
79
|
+
}): Promise<AuditExecutionResult>;
|
|
80
|
+
export declare function createBaselineAfterAudit(options: {
|
|
81
|
+
cwd: string;
|
|
82
|
+
configPath?: string;
|
|
83
|
+
result: AuditExecutionResult;
|
|
84
|
+
force?: boolean;
|
|
85
|
+
}): Promise<BaselineCreateResult>;
|
|
86
|
+
//# sourceMappingURL=baseline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseline.d.ts","sourceRoot":"","sources":["../../src/commands/baseline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
import { access } from "node:fs/promises";
|
|
2
|
+
import { applyBaselineUpdate, compareBaselineWithAudit, createBaselineFromAudit, loadBaselineFile, migrateBaseline, previewBaselineUpdate, readBaselineFileState, writeBaselineFile, dispositionLabel, } from "@a11yst/baseline";
|
|
3
|
+
import { formatLabelValue } from "../output.js";
|
|
4
|
+
import { baselineFileExists, loadBaselineContext } from "./baseline-config.js";
|
|
5
|
+
import { loadAuditResults } from "./results-loader.js";
|
|
6
|
+
async function ensureBaselineWritable(baselinePath, force) {
|
|
7
|
+
if (force)
|
|
8
|
+
return;
|
|
9
|
+
try {
|
|
10
|
+
await access(baselinePath);
|
|
11
|
+
throw new Error(`Baseline file already exists at "${baselinePath}". Use --force to overwrite it.`);
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
if (error instanceof Error && error.message.includes("already exists")) {
|
|
15
|
+
throw error;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export async function runBaselineCreate(options) {
|
|
20
|
+
const context = await loadBaselineContext({
|
|
21
|
+
cwd: options.cwd,
|
|
22
|
+
configPath: options.configPath,
|
|
23
|
+
});
|
|
24
|
+
await ensureBaselineWritable(context.baselinePath, options.force);
|
|
25
|
+
const { result, resultsPath } = await loadAuditResults({
|
|
26
|
+
cwd: options.cwd,
|
|
27
|
+
resultsPath: options.from,
|
|
28
|
+
});
|
|
29
|
+
const baseline = createBaselineFromAudit(result, { resultPath: resultsPath });
|
|
30
|
+
await writeBaselineFile(context.baselinePath, baseline);
|
|
31
|
+
return {
|
|
32
|
+
status: "created",
|
|
33
|
+
baselinePath: context.baselinePath,
|
|
34
|
+
entryCount: baseline.entries.length,
|
|
35
|
+
createdAt: baseline.createdAt,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
async function tryLoadComparison(options) {
|
|
39
|
+
try {
|
|
40
|
+
const loaded = await loadAuditResults({ cwd: options.cwd });
|
|
41
|
+
const comparison = compareBaselineWithAudit(options.baseline, loaded.result, {
|
|
42
|
+
baselinePath: options.baselinePath,
|
|
43
|
+
applyClassifications: options.applyClassifications,
|
|
44
|
+
});
|
|
45
|
+
return { comparison, resultsPath: loaded.resultsPath };
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export async function runBaselineStatus(options) {
|
|
52
|
+
const context = await loadBaselineContext({
|
|
53
|
+
cwd: options.cwd,
|
|
54
|
+
configPath: options.configPath,
|
|
55
|
+
baselineOverride: options.baselineOverride,
|
|
56
|
+
});
|
|
57
|
+
const baseline = await loadBaselineFile(context.baselinePath);
|
|
58
|
+
const compared = await tryLoadComparison({
|
|
59
|
+
cwd: options.cwd,
|
|
60
|
+
configPath: options.configPath,
|
|
61
|
+
baselineOverride: options.baselineOverride,
|
|
62
|
+
baseline,
|
|
63
|
+
baselinePath: context.baselinePath,
|
|
64
|
+
applyClassifications: context.baseline.classifications,
|
|
65
|
+
});
|
|
66
|
+
return {
|
|
67
|
+
status: "ok",
|
|
68
|
+
baselinePath: context.baselinePath,
|
|
69
|
+
baseline,
|
|
70
|
+
...(compared
|
|
71
|
+
? { comparison: compared.comparison, resultsPath: compared.resultsPath }
|
|
72
|
+
: {}),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
export async function runBaselineUpdate(options) {
|
|
76
|
+
const context = await loadBaselineContext({
|
|
77
|
+
cwd: options.cwd,
|
|
78
|
+
configPath: options.configPath,
|
|
79
|
+
});
|
|
80
|
+
const baseline = await loadBaselineFile(context.baselinePath);
|
|
81
|
+
const fileState = await readBaselineFileState(context.baselinePath);
|
|
82
|
+
const { result, resultsPath } = await loadAuditResults({
|
|
83
|
+
cwd: options.cwd,
|
|
84
|
+
resultsPath: options.from,
|
|
85
|
+
});
|
|
86
|
+
const comparison = compareBaselineWithAudit(baseline, result, {
|
|
87
|
+
baselinePath: context.baselinePath,
|
|
88
|
+
applyClassifications: context.baseline.classifications,
|
|
89
|
+
});
|
|
90
|
+
const preview = previewBaselineUpdate(baseline, comparison);
|
|
91
|
+
const willWrite = Boolean(options.acceptNew || options.removeResolved);
|
|
92
|
+
const dryRun = options.dryRun !== false || !willWrite;
|
|
93
|
+
if (!preview.hasChanges) {
|
|
94
|
+
return {
|
|
95
|
+
status: "unchanged",
|
|
96
|
+
baselinePath: context.baselinePath,
|
|
97
|
+
preview,
|
|
98
|
+
resultsPath,
|
|
99
|
+
comparison,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
if (dryRun || !willWrite) {
|
|
103
|
+
return {
|
|
104
|
+
status: "preview",
|
|
105
|
+
baselinePath: context.baselinePath,
|
|
106
|
+
preview,
|
|
107
|
+
resultsPath,
|
|
108
|
+
comparison,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
if (!options.yes) {
|
|
112
|
+
const error = new Error("Baseline update requires confirmation. Re-run with --yes to apply.");
|
|
113
|
+
error.exitCode = 2;
|
|
114
|
+
error.preview = {
|
|
115
|
+
status: "preview",
|
|
116
|
+
baselinePath: context.baselinePath,
|
|
117
|
+
preview,
|
|
118
|
+
resultsPath,
|
|
119
|
+
comparison,
|
|
120
|
+
};
|
|
121
|
+
throw error;
|
|
122
|
+
}
|
|
123
|
+
const updated = applyBaselineUpdate(baseline, comparison, {
|
|
124
|
+
acceptNew: options.acceptNew,
|
|
125
|
+
removeResolved: options.removeResolved,
|
|
126
|
+
});
|
|
127
|
+
if (!updated) {
|
|
128
|
+
return {
|
|
129
|
+
status: "unchanged",
|
|
130
|
+
baselinePath: context.baselinePath,
|
|
131
|
+
preview,
|
|
132
|
+
resultsPath,
|
|
133
|
+
comparison,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
await writeBaselineFile(context.baselinePath, updated, {
|
|
137
|
+
expectedHash: fileState.hash,
|
|
138
|
+
expectedMtimeMs: fileState.mtimeMs,
|
|
139
|
+
});
|
|
140
|
+
return {
|
|
141
|
+
status: "updated",
|
|
142
|
+
baselinePath: context.baselinePath,
|
|
143
|
+
preview,
|
|
144
|
+
resultsPath,
|
|
145
|
+
comparison,
|
|
146
|
+
updated,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
export async function runBaselineMigrate(options) {
|
|
150
|
+
const context = await loadBaselineContext({
|
|
151
|
+
cwd: options.cwd,
|
|
152
|
+
configPath: options.configPath,
|
|
153
|
+
baselineOverride: options.baselineOverride,
|
|
154
|
+
});
|
|
155
|
+
const fileState = await readBaselineFileState(context.baselinePath);
|
|
156
|
+
const migratedResult = migrateBaseline(JSON.parse(fileState.content));
|
|
157
|
+
if (!migratedResult.migrated) {
|
|
158
|
+
return {
|
|
159
|
+
status: "unchanged",
|
|
160
|
+
baselinePath: context.baselinePath,
|
|
161
|
+
migrated: false,
|
|
162
|
+
message: migratedResult.message,
|
|
163
|
+
baseline: migratedResult.baseline,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
if (options.dryRun) {
|
|
167
|
+
return {
|
|
168
|
+
status: "preview",
|
|
169
|
+
baselinePath: context.baselinePath,
|
|
170
|
+
migrated: true,
|
|
171
|
+
message: migratedResult.message,
|
|
172
|
+
baseline: migratedResult.baseline,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
if (!options.yes) {
|
|
176
|
+
const error = new Error("Baseline migration requires confirmation. Re-run with --yes to apply.");
|
|
177
|
+
error.exitCode = 2;
|
|
178
|
+
throw error;
|
|
179
|
+
}
|
|
180
|
+
await writeBaselineFile(context.baselinePath, migratedResult.baseline, {
|
|
181
|
+
expectedHash: fileState.hash,
|
|
182
|
+
expectedMtimeMs: fileState.mtimeMs,
|
|
183
|
+
});
|
|
184
|
+
return {
|
|
185
|
+
status: "migrated",
|
|
186
|
+
baselinePath: context.baselinePath,
|
|
187
|
+
migrated: true,
|
|
188
|
+
message: migratedResult.message,
|
|
189
|
+
baseline: migratedResult.baseline,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
function formatSummaryBlock(summary) {
|
|
193
|
+
return [
|
|
194
|
+
formatLabelValue("NEW", String(summary.newFindings)),
|
|
195
|
+
formatLabelValue("KNOWN", String(summary.knownFindings)),
|
|
196
|
+
formatLabelValue("REGRESSED", String(summary.regressedFindings)),
|
|
197
|
+
formatLabelValue("RESOLVED", String(summary.resolvedFindings)),
|
|
198
|
+
formatLabelValue("NOT COMPARED", String(summary.notComparedFindings)),
|
|
199
|
+
];
|
|
200
|
+
}
|
|
201
|
+
function formatDispositionCounts(summary) {
|
|
202
|
+
const lines = ["Classifications"];
|
|
203
|
+
lines.push(formatLabelValue("False positive", String(summary.dispositions.falsePositive)));
|
|
204
|
+
lines.push(formatLabelValue("Accepted risk", String(summary.dispositions.acceptedRisk)));
|
|
205
|
+
lines.push(formatLabelValue("Third party", String(summary.dispositions.thirdParty)));
|
|
206
|
+
lines.push(formatLabelValue("Not applicable", String(summary.dispositions.notApplicable)));
|
|
207
|
+
lines.push(formatLabelValue("Manual review", String(summary.dispositions.manualReview)));
|
|
208
|
+
lines.push(formatLabelValue("Expired", String(summary.expiredClassifications)));
|
|
209
|
+
return lines;
|
|
210
|
+
}
|
|
211
|
+
function formatPreviewHuman(preview) {
|
|
212
|
+
const lines = ["Proposed baseline changes", ""];
|
|
213
|
+
lines.push(formatLabelValue("Add", String(preview.added.length)));
|
|
214
|
+
lines.push(formatLabelValue("Remove", String(preview.removed.length)));
|
|
215
|
+
lines.push(formatLabelValue("Unchanged", String(preview.unchanged.length)));
|
|
216
|
+
lines.push(formatLabelValue("Regressed", String(preview.regressed.length)));
|
|
217
|
+
if (preview.regressed.length > 0) {
|
|
218
|
+
lines.push("");
|
|
219
|
+
lines.push("Regressions are never accepted silently:");
|
|
220
|
+
for (const entry of preview.regressed) {
|
|
221
|
+
lines.push(`- ${entry.ruleId} (${entry.fingerprint.slice(0, 12)}…)`);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return lines;
|
|
225
|
+
}
|
|
226
|
+
export function formatBaselineCreateHuman(result) {
|
|
227
|
+
return [
|
|
228
|
+
"Baseline created",
|
|
229
|
+
"",
|
|
230
|
+
formatLabelValue("Path", result.baselinePath),
|
|
231
|
+
formatLabelValue("Entries", String(result.entryCount)),
|
|
232
|
+
formatLabelValue("Created", result.createdAt),
|
|
233
|
+
"",
|
|
234
|
+
"A baseline records known accessibility debt.",
|
|
235
|
+
"It does not make that debt accessible or compliant.",
|
|
236
|
+
].join("\n");
|
|
237
|
+
}
|
|
238
|
+
export function formatBaselineCreateJson(result) {
|
|
239
|
+
return result;
|
|
240
|
+
}
|
|
241
|
+
export function formatBaselineStatusHuman(result) {
|
|
242
|
+
const lines = ["Baseline status", ""];
|
|
243
|
+
lines.push(formatLabelValue("Path", result.baselinePath));
|
|
244
|
+
lines.push(formatLabelValue("Schema", result.baseline.schemaVersion));
|
|
245
|
+
lines.push(formatLabelValue("Fingerprint", result.baseline.fingerprintVersion));
|
|
246
|
+
lines.push(formatLabelValue("Created", result.baseline.createdAt));
|
|
247
|
+
lines.push(formatLabelValue("Updated", result.baseline.updatedAt));
|
|
248
|
+
lines.push(formatLabelValue("Entries", String(result.baseline.entries.length)));
|
|
249
|
+
const classified = result.baseline.entries.filter((entry) => entry.classification).length;
|
|
250
|
+
lines.push(formatLabelValue("Classified", String(classified)));
|
|
251
|
+
if (result.comparison) {
|
|
252
|
+
lines.push("");
|
|
253
|
+
lines.push("Compared with latest audit");
|
|
254
|
+
if (result.resultsPath) {
|
|
255
|
+
lines.push(formatLabelValue("Results", result.resultsPath));
|
|
256
|
+
}
|
|
257
|
+
lines.push("");
|
|
258
|
+
lines.push(...formatSummaryBlock(result.comparison.summary));
|
|
259
|
+
lines.push("");
|
|
260
|
+
lines.push(...formatDispositionCounts(result.comparison.summary));
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
lines.push("");
|
|
264
|
+
lines.push("No latest audit results found for comparison.");
|
|
265
|
+
}
|
|
266
|
+
lines.push("");
|
|
267
|
+
lines.push("A baseline records known accessibility debt.");
|
|
268
|
+
lines.push("It does not make that debt accessible or compliant.");
|
|
269
|
+
return lines.join("\n");
|
|
270
|
+
}
|
|
271
|
+
export function formatBaselineStatusJson(result) {
|
|
272
|
+
return {
|
|
273
|
+
status: result.status,
|
|
274
|
+
baselinePath: result.baselinePath,
|
|
275
|
+
baseline: result.baseline,
|
|
276
|
+
resultsPath: result.resultsPath,
|
|
277
|
+
summary: result.comparison?.summary,
|
|
278
|
+
artifact: result.comparison?.artifact,
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
export function formatBaselineUpdateHuman(result) {
|
|
282
|
+
const lines = result.status === "updated"
|
|
283
|
+
? ["Baseline updated", ""]
|
|
284
|
+
: result.status === "unchanged"
|
|
285
|
+
? ["Baseline unchanged", ""]
|
|
286
|
+
: ["Baseline update preview", ""];
|
|
287
|
+
lines.push(formatLabelValue("Path", result.baselinePath));
|
|
288
|
+
lines.push(formatLabelValue("Results", result.resultsPath));
|
|
289
|
+
lines.push("");
|
|
290
|
+
lines.push(...formatPreviewHuman(result.preview));
|
|
291
|
+
if (result.status === "preview") {
|
|
292
|
+
lines.push("");
|
|
293
|
+
lines.push("No changes were written.");
|
|
294
|
+
lines.push("Use --accept-new and/or --remove-resolved with --yes to apply.");
|
|
295
|
+
}
|
|
296
|
+
if (result.comparison.summary.baselineUsed) {
|
|
297
|
+
lines.push("");
|
|
298
|
+
lines.push(...formatSummaryBlock(result.comparison.summary));
|
|
299
|
+
}
|
|
300
|
+
return lines.join("\n");
|
|
301
|
+
}
|
|
302
|
+
export function formatBaselineUpdateJson(result) {
|
|
303
|
+
return {
|
|
304
|
+
status: result.status,
|
|
305
|
+
baselinePath: result.baselinePath,
|
|
306
|
+
resultsPath: result.resultsPath,
|
|
307
|
+
preview: result.preview,
|
|
308
|
+
summary: result.comparison.summary,
|
|
309
|
+
updated: result.updated,
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
export function formatBaselineMigrateHuman(result) {
|
|
313
|
+
const lines = result.status === "migrated"
|
|
314
|
+
? ["Baseline migrated", ""]
|
|
315
|
+
: result.status === "preview"
|
|
316
|
+
? ["Baseline migration preview", ""]
|
|
317
|
+
: ["Baseline migration", ""];
|
|
318
|
+
lines.push(formatLabelValue("Path", result.baselinePath));
|
|
319
|
+
lines.push(formatLabelValue("Migrated", result.migrated ? "yes" : "no"));
|
|
320
|
+
lines.push(formatLabelValue("Message", result.message));
|
|
321
|
+
if (result.status === "preview") {
|
|
322
|
+
lines.push("");
|
|
323
|
+
lines.push("No changes were written. Re-run without --dry-run and with --yes to apply.");
|
|
324
|
+
}
|
|
325
|
+
return lines.join("\n");
|
|
326
|
+
}
|
|
327
|
+
export function formatBaselineMigrateJson(result) {
|
|
328
|
+
return {
|
|
329
|
+
status: result.status,
|
|
330
|
+
baselinePath: result.baselinePath,
|
|
331
|
+
migrated: result.migrated,
|
|
332
|
+
message: result.message,
|
|
333
|
+
baseline: result.baseline,
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
export function formatBaselineComparisonArtifact(summary) {
|
|
337
|
+
if (!summary.baselineUsed) {
|
|
338
|
+
return [];
|
|
339
|
+
}
|
|
340
|
+
return ["", "Baseline comparison", "", ...formatSummaryBlock(summary), ""];
|
|
341
|
+
}
|
|
342
|
+
export { dispositionLabel };
|
|
343
|
+
export async function applyBaselineToAuditResult(options) {
|
|
344
|
+
if (options.noBaseline) {
|
|
345
|
+
return options.result;
|
|
346
|
+
}
|
|
347
|
+
const context = await loadBaselineContext({
|
|
348
|
+
cwd: options.cwd,
|
|
349
|
+
configPath: options.configPath,
|
|
350
|
+
baselineOverride: options.baselineOverride,
|
|
351
|
+
});
|
|
352
|
+
const exists = await baselineFileExists(context.baselinePath);
|
|
353
|
+
if (!exists) {
|
|
354
|
+
if (options.explicitBaselineRequired || options.baselineOverride) {
|
|
355
|
+
throw new Error(`Baseline file not found: ${context.baselinePath}`);
|
|
356
|
+
}
|
|
357
|
+
if (!context.baseline.compare) {
|
|
358
|
+
return options.result;
|
|
359
|
+
}
|
|
360
|
+
return options.result;
|
|
361
|
+
}
|
|
362
|
+
const baseline = await loadBaselineFile(context.baselinePath);
|
|
363
|
+
const comparison = compareBaselineWithAudit(baseline, options.result, {
|
|
364
|
+
baselinePath: context.baselinePath,
|
|
365
|
+
applyClassifications: context.baseline.classifications,
|
|
366
|
+
});
|
|
367
|
+
return {
|
|
368
|
+
...options.result,
|
|
369
|
+
findings: comparison.findings,
|
|
370
|
+
baselineSummary: comparison.summary,
|
|
371
|
+
resolvedFindings: comparison.resolvedFindings,
|
|
372
|
+
notComparedFindings: comparison.notComparedFindings,
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
export async function createBaselineAfterAudit(options) {
|
|
376
|
+
const context = await loadBaselineContext({
|
|
377
|
+
cwd: options.cwd,
|
|
378
|
+
configPath: options.configPath,
|
|
379
|
+
});
|
|
380
|
+
await ensureBaselineWritable(context.baselinePath, options.force);
|
|
381
|
+
const baseline = createBaselineFromAudit(options.result, {
|
|
382
|
+
resultPath: options.result.artifacts?.resultsPath,
|
|
383
|
+
});
|
|
384
|
+
await writeBaselineFile(context.baselinePath, baseline);
|
|
385
|
+
return {
|
|
386
|
+
status: "created",
|
|
387
|
+
baselinePath: context.baselinePath,
|
|
388
|
+
entryCount: baseline.entries.length,
|
|
389
|
+
createdAt: baseline.createdAt,
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
//# sourceMappingURL=baseline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseline.js","sourceRoot":"","sources":["../../src/commands/baseline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,uBAAuB,EACvB,gBAAgB,EAChB,eAAe,EACf,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,GAGjB,MAAM,kBAAkB,CAAC;AAO1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAiEvD,KAAK,UAAU,sBAAsB,CACnC,YAAoB,EACpB,KAA0B;IAE1B,IAAI,KAAK;QAAE,OAAO;IAClB,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;QAC3B,MAAM,IAAI,KAAK,CACb,oCAAoC,YAAY,iCAAiC,CAClF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACvE,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAiC;IAEjC,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC;QACxC,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,UAAU,EAAE,OAAO,CAAC,UAAU;KAC/B,CAAC,CAAC;IACH,MAAM,sBAAsB,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAElE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,gBAAgB,CAAC;QACrD,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,WAAW,EAAE,OAAO,CAAC,IAAI;KAC1B,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,uBAAuB,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;IAC9E,MAAM,iBAAiB,CAAC,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAExD,OAAO;QACL,MAAM,EAAE,SAAS;QACjB,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM;QACnC,SAAS,EAAE,QAAQ,CAAC,SAAS;KAC9B,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,OAOhC;IACC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAC5D,MAAM,UAAU,GAAG,wBAAwB,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE;YAC3E,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,oBAAoB,EAAE,OAAO,CAAC,oBAAoB;SACnD,CAAC,CAAC;QACH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAiC;IAEjC,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC;QACxC,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;KAC3C,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC;QACvC,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;QAC1C,QAAQ;QACR,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,oBAAoB,EAAE,OAAO,CAAC,QAAQ,CAAC,eAAe;KACvD,CAAC,CAAC;IAEH,OAAO;QACL,MAAM,EAAE,IAAI;QACZ,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,QAAQ;QACR,GAAG,CAAC,QAAQ;YACV,CAAC,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE;YACxE,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAiC;IAEjC,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC;QACxC,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,UAAU,EAAE,OAAO,CAAC,UAAU;KAC/B,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,MAAM,qBAAqB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACpE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,gBAAgB,CAAC;QACrD,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,WAAW,EAAE,OAAO,CAAC,IAAI;KAC1B,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE;QAC5D,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,oBAAoB,EAAE,OAAO,CAAC,QAAQ,CAAC,eAAe;KACvD,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,qBAAqB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAE5D,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,KAAK,IAAI,CAAC,SAAS,CAAC;IAEtD,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QACxB,OAAO;YACL,MAAM,EAAE,WAAW;YACnB,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,OAAO;YACP,WAAW;YACX,UAAU;SACX,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACzB,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,OAAO;YACP,WAAW;YACX,UAAU;SACX,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;QAC7F,KAAqE,CAAC,QAAQ,GAAG,CAAC,CAAC;QACnF,KAAmD,CAAC,OAAO,GAAG;YAC7D,MAAM,EAAE,SAAS;YACjB,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,OAAO;YACP,WAAW;YACX,UAAU;SACX,CAAC;QACF,MAAM,KAAK,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,mBAAmB,CAAC,QAAQ,EAAE,UAAU,EAAE;QACxD,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,cAAc,EAAE,OAAO,CAAC,cAAc;KACvC,CAAC,CAAC;IAEH,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;YACL,MAAM,EAAE,WAAW;YACnB,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,OAAO;YACP,WAAW;YACX,UAAU;SACX,CAAC;IACJ,CAAC;IAED,MAAM,iBAAiB,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,EAAE;QACrD,YAAY,EAAE,SAAS,CAAC,IAAI;QAC5B,eAAe,EAAE,SAAS,CAAC,OAAO;KACnC,CAAC,CAAC;IAEH,OAAO;QACL,MAAM,EAAE,SAAS;QACjB,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,OAAO;QACP,WAAW;QACX,UAAU;QACV,OAAO;KACR,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAkC;IAElC,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC;QACxC,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;KAC3C,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,MAAM,qBAAqB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACpE,MAAM,cAAc,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAEtE,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;QAC7B,OAAO;YACL,MAAM,EAAE,WAAW;YACnB,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,cAAc,CAAC,OAAO;YAC/B,QAAQ,EAAE,cAAc,CAAC,QAAQ;SAClC,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,cAAc,CAAC,OAAO;YAC/B,QAAQ,EAAE,cAAc,CAAC,QAAQ;SAClC,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;QAChG,KAAsC,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrD,MAAM,KAAK,CAAC;IACd,CAAC;IAED,MAAM,iBAAiB,CAAC,OAAO,CAAC,YAAY,EAAE,cAAc,CAAC,QAAQ,EAAE;QACrE,YAAY,EAAE,SAAS,CAAC,IAAI;QAC5B,eAAe,EAAE,SAAS,CAAC,OAAO;KACnC,CAAC,CAAC;IAEH,OAAO;QACL,MAAM,EAAE,UAAU;QAClB,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,cAAc,CAAC,OAAO;QAC/B,QAAQ,EAAE,cAAc,CAAC,QAAQ;KAClC,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAwB;IAClD,OAAO;QACL,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACpD,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACxD,gBAAgB,CAAC,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAChE,gBAAgB,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAC9D,gBAAgB,CAAC,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;KACtE,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,OAAwB;IACvD,MAAM,KAAK,GAAa,CAAC,iBAAiB,CAAC,CAAC;IAC5C,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAC3F,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACzF,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACrF,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAC3F,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACzF,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IAChF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB,CAAC,OAA8B;IACxD,MAAM,KAAK,GAAG,CAAC,2BAA2B,EAAE,EAAE,CAAC,CAAC;IAChD,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAClE,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACvE,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC5E,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC5E,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;QACvD,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,MAA4B;IACpE,OAAO;QACL,kBAAkB;QAClB,EAAE;QACF,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC;QAC7C,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACtD,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC;QAC7C,EAAE;QACF,8CAA8C;QAC9C,qDAAqD;KACtD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,MAA4B;IACnE,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,MAA4B;IACpE,MAAM,KAAK,GAAG,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;IACtC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;IAC1D,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;IACtE,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAChF,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IACnE,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IACnE,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAEhF,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC;IAC1F,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAE/D,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QACzC,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;QAC9D,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,GAAG,uBAAuB,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IACpE,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IAC3D,KAAK,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;IAClE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,MAA4B;IACnE,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,OAAO,EAAE,MAAM,CAAC,UAAU,EAAE,OAAO;QACnC,QAAQ,EAAE,MAAM,CAAC,UAAU,EAAE,QAAQ;KACtC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,MAA4B;IACpE,MAAM,KAAK,GACT,MAAM,CAAC,MAAM,KAAK,SAAS;QACzB,CAAC,CAAC,CAAC,kBAAkB,EAAE,EAAE,CAAC;QAC1B,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,WAAW;YAC7B,CAAC,CAAC,CAAC,oBAAoB,EAAE,EAAE,CAAC;YAC5B,CAAC,CAAC,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC;IAExC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;IAC1D,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;IAC5D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAElD,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;IAC/E,CAAC;IAED,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;QAC3C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,MAA4B;IACnE,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO;QAClC,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,MAA6B;IACtE,MAAM,KAAK,GACT,MAAM,CAAC,MAAM,KAAK,UAAU;QAC1B,CAAC,CAAC,CAAC,mBAAmB,EAAE,EAAE,CAAC;QAC3B,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS;YAC3B,CAAC,CAAC,CAAC,4BAA4B,EAAE,EAAE,CAAC;YACpC,CAAC,CAAC,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;IAEnC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;IAC1D,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACzE,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAExD,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,4EAA4E,CAAC,CAAC;IAC3F,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,MAA6B;IACrE,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,OAAwB;IACvE,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,CAAC,EAAE,EAAE,qBAAqB,EAAE,EAAE,EAAE,GAAG,kBAAkB,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;AAC7E,CAAC;AAED,OAAO,EAAE,gBAAgB,EAAmC,CAAC;AAE7D,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,OAOhD;IACC,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,OAAO,OAAO,CAAC,MAAM,CAAC;IACxB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC;QACxC,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;KAC3C,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC9D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,IAAI,OAAO,CAAC,wBAAwB,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;YACjE,MAAM,IAAI,KAAK,CAAC,4BAA4B,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YAC9B,OAAO,OAAO,CAAC,MAAM,CAAC;QACxB,CAAC;QACD,OAAO,OAAO,CAAC,MAAM,CAAC;IACxB,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC9D,MAAM,UAAU,GAAG,wBAAwB,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE;QACpE,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,oBAAoB,EAAE,OAAO,CAAC,QAAQ,CAAC,eAAe;KACvD,CAAC,CAAC;IAEH,OAAO;QACL,GAAG,OAAO,CAAC,MAAM;QACjB,QAAQ,EAAE,UAAU,CAAC,QAAQ;QAC7B,eAAe,EAAE,UAAU,CAAC,OAAO;QACnC,gBAAgB,EAAE,UAAU,CAAC,gBAAgB;QAC7C,mBAAmB,EAAE,UAAU,CAAC,mBAAmB;KACpD,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,OAK9C;IACC,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC;QACxC,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,UAAU,EAAE,OAAO,CAAC,UAAU;KAC/B,CAAC,CAAC;IACH,MAAM,sBAAsB,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAClE,MAAM,QAAQ,GAAG,uBAAuB,CAAC,OAAO,CAAC,MAAM,EAAE;QACvD,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,WAAW;KAClD,CAAC,CAAC;IACH,MAAM,iBAAiB,CAAC,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IACxD,OAAO;QACL,MAAM,EAAE,SAAS;QACjB,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM;QACnC,SAAS,EAAE,QAAQ,CAAC,SAAS;KAC9B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { FindingClassification, FindingDisposition } from "@a11yst/types";
|
|
2
|
+
export interface RunClassifyOptions {
|
|
3
|
+
cwd: string;
|
|
4
|
+
configPath?: string;
|
|
5
|
+
findingId: string;
|
|
6
|
+
from?: string;
|
|
7
|
+
disposition: FindingDisposition;
|
|
8
|
+
reason: string;
|
|
9
|
+
owner?: string;
|
|
10
|
+
ticket?: string;
|
|
11
|
+
expires?: string;
|
|
12
|
+
review?: string;
|
|
13
|
+
notes?: string;
|
|
14
|
+
yes?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface ClassifyResult {
|
|
17
|
+
status: "preview" | "classified";
|
|
18
|
+
baselinePath: string;
|
|
19
|
+
findingId: string;
|
|
20
|
+
fingerprint: string;
|
|
21
|
+
disposition: FindingDisposition;
|
|
22
|
+
classification: FindingClassification;
|
|
23
|
+
}
|
|
24
|
+
export declare function runClassify(options: RunClassifyOptions): Promise<ClassifyResult>;
|
|
25
|
+
export declare function formatClassifyHuman(result: ClassifyResult): string;
|
|
26
|
+
export declare function formatClassifyJson(result: ClassifyResult): unknown;
|
|
27
|
+
export declare function formatClassifyPreviewFromError(error: Error & {
|
|
28
|
+
preview?: ClassifyResult;
|
|
29
|
+
}): ClassifyResult | undefined;
|
|
30
|
+
//# sourceMappingURL=classify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.d.ts","sourceRoot":"","sources":["../../src/commands/classify.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAK/E,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,kBAAkB,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,SAAS,GAAG,YAAY,CAAC;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,kBAAkB,CAAC;IAChC,cAAc,EAAE,qBAAqB,CAAC;CACvC;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,cAAc,CAAC,CAsFtF;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CA4BlE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAElE;AAED,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,KAAK,GAAG;IAAE,OAAO,CAAC,EAAE,cAAc,CAAA;CAAE,GAAG,cAAc,GAAG,SAAS,CAEtH"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { applyClassificationToEntry, entryFromFinding, loadBaselineFile, readBaselineFileState, rejectResolvedDisposition, resolveFindingIdentifier, validateClassification, writeBaselineFile, dispositionLabel, } from "@a11yst/baseline";
|
|
2
|
+
import { formatLabelValue } from "../output.js";
|
|
3
|
+
import { loadBaselineContext } from "./baseline-config.js";
|
|
4
|
+
import { loadAuditResults } from "./results-loader.js";
|
|
5
|
+
export async function runClassify(options) {
|
|
6
|
+
rejectResolvedDisposition(options.disposition);
|
|
7
|
+
const context = await loadBaselineContext({
|
|
8
|
+
cwd: options.cwd,
|
|
9
|
+
configPath: options.configPath,
|
|
10
|
+
});
|
|
11
|
+
const { result } = await loadAuditResults({
|
|
12
|
+
cwd: options.cwd,
|
|
13
|
+
resultsPath: options.from,
|
|
14
|
+
});
|
|
15
|
+
const match = resolveFindingIdentifier(result, options.findingId);
|
|
16
|
+
const finding = match.finding;
|
|
17
|
+
const classification = {
|
|
18
|
+
disposition: options.disposition,
|
|
19
|
+
reason: options.reason,
|
|
20
|
+
createdAt: new Date().toISOString(),
|
|
21
|
+
scope: {
|
|
22
|
+
type: "finding",
|
|
23
|
+
fingerprint: finding.fingerprint,
|
|
24
|
+
},
|
|
25
|
+
...(options.owner ? { owner: options.owner } : {}),
|
|
26
|
+
...(options.ticket ? { ticket: options.ticket } : {}),
|
|
27
|
+
...(options.expires ? { expiresAt: options.expires } : {}),
|
|
28
|
+
...(options.review ? { reviewAt: options.review } : {}),
|
|
29
|
+
...(options.notes ? { notes: options.notes } : {}),
|
|
30
|
+
};
|
|
31
|
+
validateClassification(classification);
|
|
32
|
+
const baseline = await loadBaselineFile(context.baselinePath);
|
|
33
|
+
const existing = baseline.entries.find((entry) => entry.fingerprint === finding.fingerprint);
|
|
34
|
+
const now = new Date().toISOString();
|
|
35
|
+
const entry = existing ??
|
|
36
|
+
entryFromFinding(finding, result.runs.find((run) => run.findings.some((item) => item.fingerprint === finding.fingerprint)), now);
|
|
37
|
+
const updatedEntry = applyClassificationToEntry(entry, classification, now, Boolean(existing?.classification));
|
|
38
|
+
if (!options.yes) {
|
|
39
|
+
const error = new Error("Classification requires confirmation. Re-run with --yes to apply.");
|
|
40
|
+
error.exitCode = 2;
|
|
41
|
+
error.preview = {
|
|
42
|
+
status: "preview",
|
|
43
|
+
baselinePath: context.baselinePath,
|
|
44
|
+
findingId: finding.id,
|
|
45
|
+
fingerprint: finding.fingerprint,
|
|
46
|
+
disposition: options.disposition,
|
|
47
|
+
classification,
|
|
48
|
+
};
|
|
49
|
+
throw error;
|
|
50
|
+
}
|
|
51
|
+
const fileState = await readBaselineFileState(context.baselinePath);
|
|
52
|
+
const nextEntries = existing
|
|
53
|
+
? baseline.entries.map((item) => item.fingerprint === finding.fingerprint ? updatedEntry : item)
|
|
54
|
+
: [...baseline.entries, updatedEntry];
|
|
55
|
+
await writeBaselineFile(context.baselinePath, {
|
|
56
|
+
...baseline,
|
|
57
|
+
updatedAt: now,
|
|
58
|
+
entries: nextEntries,
|
|
59
|
+
}, {
|
|
60
|
+
expectedHash: fileState.hash,
|
|
61
|
+
expectedMtimeMs: fileState.mtimeMs,
|
|
62
|
+
});
|
|
63
|
+
return {
|
|
64
|
+
status: "classified",
|
|
65
|
+
baselinePath: context.baselinePath,
|
|
66
|
+
findingId: finding.id,
|
|
67
|
+
fingerprint: finding.fingerprint,
|
|
68
|
+
disposition: options.disposition,
|
|
69
|
+
classification,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
export function formatClassifyHuman(result) {
|
|
73
|
+
const lines = result.status === "classified"
|
|
74
|
+
? ["Classification saved", ""]
|
|
75
|
+
: ["Classification preview", ""];
|
|
76
|
+
lines.push(formatLabelValue("Baseline", result.baselinePath));
|
|
77
|
+
lines.push(formatLabelValue("Finding", result.findingId));
|
|
78
|
+
lines.push(formatLabelValue("Fingerprint", result.fingerprint));
|
|
79
|
+
lines.push(formatLabelValue("Disposition", dispositionLabel(result.disposition)));
|
|
80
|
+
lines.push(formatLabelValue("Reason", result.classification.reason));
|
|
81
|
+
if (result.classification.owner) {
|
|
82
|
+
lines.push(formatLabelValue("Owner", result.classification.owner));
|
|
83
|
+
}
|
|
84
|
+
if (result.classification.ticket) {
|
|
85
|
+
lines.push(formatLabelValue("Ticket", result.classification.ticket));
|
|
86
|
+
}
|
|
87
|
+
if (result.classification.expiresAt) {
|
|
88
|
+
lines.push(formatLabelValue("Expires", result.classification.expiresAt));
|
|
89
|
+
}
|
|
90
|
+
if (result.classification.reviewAt) {
|
|
91
|
+
lines.push(formatLabelValue("Review", result.classification.reviewAt));
|
|
92
|
+
}
|
|
93
|
+
if (result.status === "preview") {
|
|
94
|
+
lines.push("");
|
|
95
|
+
lines.push("No changes were written. Re-run with --yes to apply.");
|
|
96
|
+
}
|
|
97
|
+
return lines.join("\n");
|
|
98
|
+
}
|
|
99
|
+
export function formatClassifyJson(result) {
|
|
100
|
+
return result;
|
|
101
|
+
}
|
|
102
|
+
export function formatClassifyPreviewFromError(error) {
|
|
103
|
+
return error.preview;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=classify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.js","sourceRoot":"","sources":["../../src/commands/classify.ts"],"names":[],"mappings":"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"}
|