@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.
Files changed (165) hide show
  1. package/LICENSE +373 -0
  2. package/NOTICE.md +11 -0
  3. package/README.md +60 -0
  4. package/TRADEMARKS.md +52 -0
  5. package/dist/bin.d.ts +3 -0
  6. package/dist/bin.d.ts.map +1 -0
  7. package/dist/bin.js +9 -0
  8. package/dist/bin.js.map +1 -0
  9. package/dist/ci-policy-options.d.ts +15 -0
  10. package/dist/ci-policy-options.d.ts.map +1 -0
  11. package/dist/ci-policy-options.js +54 -0
  12. package/dist/ci-policy-options.js.map +1 -0
  13. package/dist/cli-progress.d.ts +16 -0
  14. package/dist/cli-progress.d.ts.map +1 -0
  15. package/dist/cli-progress.js +35 -0
  16. package/dist/cli-progress.js.map +1 -0
  17. package/dist/command-program.d.ts +7 -0
  18. package/dist/command-program.d.ts.map +1 -0
  19. package/dist/command-program.js +950 -0
  20. package/dist/command-program.js.map +1 -0
  21. package/dist/commands/audit-flow-output.d.ts +4 -0
  22. package/dist/commands/audit-flow-output.d.ts.map +1 -0
  23. package/dist/commands/audit-flow-output.js +119 -0
  24. package/dist/commands/audit-flow-output.js.map +1 -0
  25. package/dist/commands/audit-policy-output.d.ts +9 -0
  26. package/dist/commands/audit-policy-output.d.ts.map +1 -0
  27. package/dist/commands/audit-policy-output.js +95 -0
  28. package/dist/commands/audit-policy-output.js.map +1 -0
  29. package/dist/commands/audit.d.ts +15 -0
  30. package/dist/commands/audit.d.ts.map +1 -0
  31. package/dist/commands/audit.js +178 -0
  32. package/dist/commands/audit.js.map +1 -0
  33. package/dist/commands/baseline-config.d.ts +14 -0
  34. package/dist/commands/baseline-config.d.ts.map +1 -0
  35. package/dist/commands/baseline-config.js +33 -0
  36. package/dist/commands/baseline-config.js.map +1 -0
  37. package/dist/commands/baseline.d.ts +86 -0
  38. package/dist/commands/baseline.d.ts.map +1 -0
  39. package/dist/commands/baseline.js +392 -0
  40. package/dist/commands/baseline.js.map +1 -0
  41. package/dist/commands/classify.d.ts +30 -0
  42. package/dist/commands/classify.d.ts.map +1 -0
  43. package/dist/commands/classify.js +105 -0
  44. package/dist/commands/classify.js.map +1 -0
  45. package/dist/commands/detect.d.ts +12 -0
  46. package/dist/commands/detect.d.ts.map +1 -0
  47. package/dist/commands/detect.js +213 -0
  48. package/dist/commands/detect.js.map +1 -0
  49. package/dist/commands/doctor.d.ts +16 -0
  50. package/dist/commands/doctor.d.ts.map +1 -0
  51. package/dist/commands/doctor.js +404 -0
  52. package/dist/commands/doctor.js.map +1 -0
  53. package/dist/commands/findings.d.ts +45 -0
  54. package/dist/commands/findings.d.ts.map +1 -0
  55. package/dist/commands/findings.js +220 -0
  56. package/dist/commands/findings.js.map +1 -0
  57. package/dist/commands/flows.d.ts +30 -0
  58. package/dist/commands/flows.d.ts.map +1 -0
  59. package/dist/commands/flows.js +108 -0
  60. package/dist/commands/flows.js.map +1 -0
  61. package/dist/commands/init.d.ts +64 -0
  62. package/dist/commands/init.d.ts.map +1 -0
  63. package/dist/commands/init.js +293 -0
  64. package/dist/commands/init.js.map +1 -0
  65. package/dist/commands/profiles.d.ts +5 -0
  66. package/dist/commands/profiles.d.ts.map +1 -0
  67. package/dist/commands/profiles.js +39 -0
  68. package/dist/commands/profiles.js.map +1 -0
  69. package/dist/commands/report.d.ts +72 -0
  70. package/dist/commands/report.d.ts.map +1 -0
  71. package/dist/commands/report.js +284 -0
  72. package/dist/commands/report.js.map +1 -0
  73. package/dist/commands/results-loader.d.ts +15 -0
  74. package/dist/commands/results-loader.d.ts.map +1 -0
  75. package/dist/commands/results-loader.js +100 -0
  76. package/dist/commands/results-loader.js.map +1 -0
  77. package/dist/commands/routes.d.ts +35 -0
  78. package/dist/commands/routes.d.ts.map +1 -0
  79. package/dist/commands/routes.js +201 -0
  80. package/dist/commands/routes.js.map +1 -0
  81. package/dist/commands/unclassify.d.ts +22 -0
  82. package/dist/commands/unclassify.d.ts.map +1 -0
  83. package/dist/commands/unclassify.js +79 -0
  84. package/dist/commands/unclassify.js.map +1 -0
  85. package/dist/index.d.ts +11 -0
  86. package/dist/index.d.ts.map +1 -0
  87. package/dist/index.js +10 -0
  88. package/dist/index.js.map +1 -0
  89. package/dist/output.d.ts +9 -0
  90. package/dist/output.d.ts.map +1 -0
  91. package/dist/output.js +29 -0
  92. package/dist/output.js.map +1 -0
  93. package/dist/presentation/ansi.d.ts +12 -0
  94. package/dist/presentation/ansi.d.ts.map +1 -0
  95. package/dist/presentation/ansi.js +51 -0
  96. package/dist/presentation/ansi.js.map +1 -0
  97. package/dist/presentation/audit-presentation.d.ts +20 -0
  98. package/dist/presentation/audit-presentation.d.ts.map +1 -0
  99. package/dist/presentation/audit-presentation.js +409 -0
  100. package/dist/presentation/audit-presentation.js.map +1 -0
  101. package/dist/presentation/boundary.d.ts +5 -0
  102. package/dist/presentation/boundary.d.ts.map +1 -0
  103. package/dist/presentation/boundary.js +4 -0
  104. package/dist/presentation/boundary.js.map +1 -0
  105. package/dist/presentation/brand-header.d.ts +6 -0
  106. package/dist/presentation/brand-header.d.ts.map +1 -0
  107. package/dist/presentation/brand-header.js +18 -0
  108. package/dist/presentation/brand-header.js.map +1 -0
  109. package/dist/presentation/capabilities.d.ts +4 -0
  110. package/dist/presentation/capabilities.d.ts.map +1 -0
  111. package/dist/presentation/capabilities.js +25 -0
  112. package/dist/presentation/capabilities.js.map +1 -0
  113. package/dist/presentation/color.d.ts +13 -0
  114. package/dist/presentation/color.d.ts.map +1 -0
  115. package/dist/presentation/color.js +27 -0
  116. package/dist/presentation/color.js.map +1 -0
  117. package/dist/presentation/disclaimers.d.ts +3 -0
  118. package/dist/presentation/disclaimers.d.ts.map +1 -0
  119. package/dist/presentation/disclaimers.js +3 -0
  120. package/dist/presentation/disclaimers.js.map +1 -0
  121. package/dist/presentation/finding-groups.d.ts +14 -0
  122. package/dist/presentation/finding-groups.d.ts.map +1 -0
  123. package/dist/presentation/finding-groups.js +77 -0
  124. package/dist/presentation/finding-groups.js.map +1 -0
  125. package/dist/presentation/finding-source-report.d.ts +21 -0
  126. package/dist/presentation/finding-source-report.d.ts.map +1 -0
  127. package/dist/presentation/finding-source-report.js +134 -0
  128. package/dist/presentation/finding-source-report.js.map +1 -0
  129. package/dist/presentation/human-output.d.ts +4 -0
  130. package/dist/presentation/human-output.d.ts.map +1 -0
  131. package/dist/presentation/human-output.js +8 -0
  132. package/dist/presentation/human-output.js.map +1 -0
  133. package/dist/presentation/index.d.ts +15 -0
  134. package/dist/presentation/index.d.ts.map +1 -0
  135. package/dist/presentation/index.js +13 -0
  136. package/dist/presentation/index.js.map +1 -0
  137. package/dist/presentation/mode.d.ts +4 -0
  138. package/dist/presentation/mode.d.ts.map +1 -0
  139. package/dist/presentation/mode.js +8 -0
  140. package/dist/presentation/mode.js.map +1 -0
  141. package/dist/presentation/progress-mode.d.ts +20 -0
  142. package/dist/presentation/progress-mode.d.ts.map +1 -0
  143. package/dist/presentation/progress-mode.js +38 -0
  144. package/dist/presentation/progress-mode.js.map +1 -0
  145. package/dist/presentation/progress-reporter.d.ts +18 -0
  146. package/dist/presentation/progress-reporter.d.ts.map +1 -0
  147. package/dist/presentation/progress-reporter.js +236 -0
  148. package/dist/presentation/progress-reporter.js.map +1 -0
  149. package/dist/presentation/progress-signals.d.ts +2 -0
  150. package/dist/presentation/progress-signals.d.ts.map +1 -0
  151. package/dist/presentation/progress-signals.js +14 -0
  152. package/dist/presentation/progress-signals.js.map +1 -0
  153. package/dist/presentation/status.d.ts +11 -0
  154. package/dist/presentation/status.d.ts.map +1 -0
  155. package/dist/presentation/status.js +14 -0
  156. package/dist/presentation/status.js.map +1 -0
  157. package/dist/presentation/types.d.ts +23 -0
  158. package/dist/presentation/types.d.ts.map +1 -0
  159. package/dist/presentation/types.js +2 -0
  160. package/dist/presentation/types.js.map +1 -0
  161. package/dist/run-cli.d.ts +6 -0
  162. package/dist/run-cli.d.ts.map +1 -0
  163. package/dist/run-cli.js +15 -0
  164. package/dist/run-cli.js.map +1 -0
  165. package/package.json +69 -0
@@ -0,0 +1,77 @@
1
+ import { resolveFindingRecommendationSummary, } from "./finding-source-report.js";
2
+ const SEVERITY_ORDER = ["critical", "high", "medium", "minor"];
3
+ function severityRank(severity) {
4
+ return SEVERITY_ORDER.indexOf(severity);
5
+ }
6
+ function compareFindingsStable(left, right) {
7
+ const routeOrder = (left.route ?? "").localeCompare(right.route ?? "");
8
+ if (routeOrder !== 0) {
9
+ return routeOrder;
10
+ }
11
+ const targetLeft = left.target.join(" ");
12
+ const targetRight = right.target.join(" ");
13
+ const targetOrder = targetLeft.localeCompare(targetRight);
14
+ if (targetOrder !== 0) {
15
+ return targetOrder;
16
+ }
17
+ return left.fingerprint.localeCompare(right.fingerprint);
18
+ }
19
+ function recommendationKey(finding) {
20
+ const summary = resolveFindingRecommendationSummary(finding);
21
+ if (!summary) {
22
+ return "";
23
+ }
24
+ return [summary.title ?? "", summary.summary ?? "", summary.applicability ?? ""].join("\0");
25
+ }
26
+ export function buildFindingGroupKey(finding) {
27
+ return [
28
+ finding.severity,
29
+ finding.ruleId,
30
+ recommendationKey(finding),
31
+ finding.route ?? "",
32
+ finding.profile ?? "",
33
+ finding.flowId ?? "",
34
+ finding.title,
35
+ ].join("\0");
36
+ }
37
+ export function groupFindings(findings) {
38
+ const groups = new Map();
39
+ for (const finding of findings) {
40
+ const key = buildFindingGroupKey(finding);
41
+ const existing = groups.get(key);
42
+ if (existing) {
43
+ existing.findings.push(finding);
44
+ continue;
45
+ }
46
+ groups.set(key, {
47
+ key,
48
+ severity: finding.severity,
49
+ ruleId: finding.ruleId,
50
+ title: finding.title,
51
+ findings: [finding],
52
+ recommendation: resolveFindingRecommendationSummary(finding),
53
+ });
54
+ }
55
+ return [...groups.values()]
56
+ .map((group) => ({
57
+ ...group,
58
+ findings: [...group.findings].sort(compareFindingsStable),
59
+ }))
60
+ .sort((left, right) => {
61
+ const severityOrder = severityRank(left.severity) - severityRank(right.severity);
62
+ if (severityOrder !== 0) {
63
+ return severityOrder;
64
+ }
65
+ const ruleOrder = left.ruleId.localeCompare(right.ruleId);
66
+ if (ruleOrder !== 0) {
67
+ return ruleOrder;
68
+ }
69
+ const routeLeft = left.findings[0]?.route ?? "";
70
+ const routeRight = right.findings[0]?.route ?? "";
71
+ return routeLeft.localeCompare(routeRight);
72
+ });
73
+ }
74
+ export function countUniqueIssues(findings) {
75
+ return groupFindings(findings).length;
76
+ }
77
+ //# sourceMappingURL=finding-groups.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-groups.js","sourceRoot":"","sources":["../../src/presentation/finding-groups.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { Finding, SourceLocation, SourceMappingConfidence, SourceMappingProvenance } from "@a11yst/types";
2
+ export type FindingReportSource = {
3
+ status: "mapped" | "ambiguous" | "unmapped" | "invalid";
4
+ location?: SourceLocation;
5
+ confidence?: SourceMappingConfidence;
6
+ provenance?: SourceMappingProvenance;
7
+ alternatives?: SourceLocation[];
8
+ };
9
+ export type FindingRecommendationSummary = {
10
+ status: string;
11
+ applicability?: string;
12
+ title?: string;
13
+ summary?: string;
14
+ };
15
+ export declare function resolveFindingReportSource(finding: Finding): FindingReportSource;
16
+ export declare function formatReportSourceLocation(location: SourceLocation): string;
17
+ /** Strip absolute or home-like paths from source URIs for human-facing reports. */
18
+ export declare function sanitizeSourceUriForReport(uri: string): string;
19
+ export declare function formatSafeReportSourceLocation(location: SourceLocation): string;
20
+ export declare function resolveFindingRecommendationSummary(finding: Finding): FindingRecommendationSummary | undefined;
21
+ //# sourceMappingURL=finding-source-report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-source-report.d.ts","sourceRoot":"","sources":["../../src/presentation/finding-source-report.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,cAAc,EACd,uBAAuB,EACvB,uBAAuB,EACxB,MAAM,eAAe,CAAC;AAEvB,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,QAAQ,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,CAAC;IACxD,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,UAAU,CAAC,EAAE,uBAAuB,CAAC;IACrC,UAAU,CAAC,EAAE,uBAAuB,CAAC;IACrC,YAAY,CAAC,EAAE,cAAc,EAAE,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AA8EF,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,mBAAmB,CAqChF;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAI3E;AAKD,mFAAmF;AACnF,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAU9D;AAED,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAK/E;AAED,wBAAgB,mCAAmC,CACjD,OAAO,EAAE,OAAO,GACf,4BAA4B,GAAG,SAAS,CAe1C"}
@@ -0,0 +1,134 @@
1
+ const MAX_ALTERNATIVES = 5;
2
+ function flatRegion(region) {
3
+ return {
4
+ startLine: region.start.line,
5
+ ...(region.start.column !== undefined ? { startColumn: region.start.column } : {}),
6
+ };
7
+ }
8
+ function candidateLocationKey(location) {
9
+ const flat = flatRegion(location.region);
10
+ return `${location.uri}\0${flat.startLine}\0${flat.startColumn ?? ""}`;
11
+ }
12
+ function readLegacySourceLocation(finding) {
13
+ const extension = finding;
14
+ const legacy = extension.sourceLocation;
15
+ if (!legacy?.uri || !legacy.startLine) {
16
+ return undefined;
17
+ }
18
+ return {
19
+ uri: legacy.uri,
20
+ region: {
21
+ start: {
22
+ line: legacy.startLine,
23
+ ...(legacy.startColumn !== undefined ? { column: legacy.startColumn } : {}),
24
+ },
25
+ ...(legacy.endLine !== undefined
26
+ ? {
27
+ end: {
28
+ line: legacy.endLine,
29
+ ...(legacy.endColumn !== undefined ? { column: legacy.endColumn } : {}),
30
+ },
31
+ }
32
+ : {}),
33
+ },
34
+ };
35
+ }
36
+ function compareLocations(left, right) {
37
+ const uriOrder = left.uri.localeCompare(right.uri);
38
+ if (uriOrder !== 0) {
39
+ return uriOrder;
40
+ }
41
+ const leftFlat = flatRegion(left.region);
42
+ const rightFlat = flatRegion(right.region);
43
+ if (leftFlat.startLine !== rightFlat.startLine) {
44
+ return leftFlat.startLine - rightFlat.startLine;
45
+ }
46
+ return (leftFlat.startColumn ?? 0) - (rightFlat.startColumn ?? 0);
47
+ }
48
+ function dedupeAlternatives(locations) {
49
+ const seen = new Set();
50
+ const result = [];
51
+ for (const location of [...locations].sort(compareLocations)) {
52
+ const key = candidateLocationKey(location);
53
+ if (!seen.has(key)) {
54
+ seen.add(key);
55
+ result.push(location);
56
+ }
57
+ }
58
+ return result.slice(0, MAX_ALTERNATIVES);
59
+ }
60
+ export function resolveFindingReportSource(finding) {
61
+ const mapping = finding.sourceMapping;
62
+ if (mapping?.status === "mapped" && mapping.selected) {
63
+ return {
64
+ status: "mapped",
65
+ location: mapping.selected.location,
66
+ confidence: mapping.selected.confidence,
67
+ provenance: mapping.selected.provenance,
68
+ };
69
+ }
70
+ if (mapping?.status === "invalid") {
71
+ return { status: "invalid" };
72
+ }
73
+ if (mapping?.status === "ambiguous") {
74
+ return {
75
+ status: "ambiguous",
76
+ alternatives: dedupeAlternatives(mapping.candidates.map((candidate) => candidate.location)),
77
+ };
78
+ }
79
+ const legacy = readLegacySourceLocation(finding);
80
+ if (legacy) {
81
+ return {
82
+ status: "mapped",
83
+ location: legacy,
84
+ confidence: "exact",
85
+ provenance: "existing-source-location",
86
+ };
87
+ }
88
+ if (mapping?.status === "unmapped") {
89
+ return { status: "unmapped" };
90
+ }
91
+ return { status: "unmapped" };
92
+ }
93
+ export function formatReportSourceLocation(location) {
94
+ const flat = flatRegion(location.region);
95
+ const column = flat.startColumn !== undefined ? `:${flat.startColumn}` : "";
96
+ return `${location.uri}:${flat.startLine}${column}`;
97
+ }
98
+ const UNIX_ABSOLUTE = /^\//;
99
+ const WINDOWS_ABSOLUTE = /^[A-Za-z]:[\\/]/;
100
+ /** Strip absolute or home-like paths from source URIs for human-facing reports. */
101
+ export function sanitizeSourceUriForReport(uri) {
102
+ const normalized = uri.replace(/\\/g, "/");
103
+ if (!UNIX_ABSOLUTE.test(normalized) && !WINDOWS_ABSOLUTE.test(normalized)) {
104
+ return normalized;
105
+ }
106
+ const segments = normalized.split("/").filter(Boolean);
107
+ if (segments.length >= 2) {
108
+ return segments.slice(-2).join("/");
109
+ }
110
+ return segments[segments.length - 1] ?? "source";
111
+ }
112
+ export function formatSafeReportSourceLocation(location) {
113
+ return formatReportSourceLocation({
114
+ ...location,
115
+ uri: sanitizeSourceUriForReport(location.uri),
116
+ });
117
+ }
118
+ export function resolveFindingRecommendationSummary(finding) {
119
+ const recommendations = finding.recommendations;
120
+ if (!recommendations || recommendations.recommendations.length === 0) {
121
+ return undefined;
122
+ }
123
+ const primary = recommendations.recommendations[0];
124
+ if (!primary) {
125
+ return undefined;
126
+ }
127
+ return {
128
+ status: recommendations.status,
129
+ applicability: primary.applicability,
130
+ title: primary.title,
131
+ summary: primary.summary,
132
+ };
133
+ }
134
+ //# sourceMappingURL=finding-source-report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-source-report.js","sourceRoot":"","sources":["../../src/presentation/finding-source-report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { TerminalCapabilities } from "./types.js";
2
+ /** Prefix human command output with a brand header. */
3
+ export declare function prependHumanBrandHeader(body: string, _capabilities?: TerminalCapabilities): string;
4
+ //# sourceMappingURL=human-output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"human-output.d.ts","sourceRoot":"","sources":["../../src/presentation/human-output.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD,uDAAuD;AACvD,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,aAAa,GAAE,oBAAoD,GAClE,MAAM,CAGR"}
@@ -0,0 +1,8 @@
1
+ import { createBrandHeader } from "./brand-header.js";
2
+ import { resolveTerminalCapabilities } from "./capabilities.js";
3
+ /** Prefix human command output with a brand header. */
4
+ export function prependHumanBrandHeader(body, _capabilities = resolveTerminalCapabilities()) {
5
+ const header = createBrandHeader({ tagline: true });
6
+ return `${header}\n\n${body}`;
7
+ }
8
+ //# sourceMappingURL=human-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"human-output.js","sourceRoot":"","sources":["../../src/presentation/human-output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAGhE,uDAAuD;AACvD,MAAM,UAAU,uBAAuB,CACrC,IAAY,EACZ,gBAAsC,2BAA2B,EAAE;IAEnE,MAAM,MAAM,GAAG,iBAAiB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,OAAO,GAAG,MAAM,OAAO,IAAI,EAAE,CAAC;AAChC,CAAC"}
@@ -0,0 +1,15 @@
1
+ export { createBrandHeader, createPlainBrandHeader } from "./brand-header.js";
2
+ export { resolveTerminalCapabilities } from "./capabilities.js";
3
+ export { shouldRenderBranding } from "./boundary.js";
4
+ export { AUDIT_HELP_DISCLAIMER } from "./disclaimers.js";
5
+ export { prependHumanBrandHeader } from "./human-output.js";
6
+ export { resolveTerminalPresentationMode } from "./mode.js";
7
+ export { formatHumanHint, formatHumanStatus, HUMAN_STATUS_LABELS, type HumanStatusKind, } from "./status.js";
8
+ export type { ColorMode } from "./color.js";
9
+ export { parseColorMode, resolveColorEnabled } from "./color.js";
10
+ export { parseProgressMode, resolveProgressAnimationEnabled, resolveProgressModeFromCli, resolveProgressStaticEnabled, type ProgressMode, } from "./progress-mode.js";
11
+ export { createProgressReporter, stopActiveProgressReporter } from "./progress-reporter.js";
12
+ export { registerProgressSignalHandlers } from "./progress-signals.js";
13
+ export { buildFindingGroupKey, countUniqueIssues, formatAuditExecutionHeader, formatAuditFindingsPresentation, formatAuditFooterSummary, formatAuditRunSummaries, formatProfileReviewSections, groupFindings, type AuditPresentationOptions, type FindingGroup, } from "./audit-presentation.js";
14
+ export type { BrandHeaderOptions, OutputKind, TerminalCapabilities, TerminalCapabilitiesInput, TerminalPresentationMode, } from "./types.js";
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/presentation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,+BAA+B,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,KAAK,eAAe,GACrB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EACL,iBAAiB,EACjB,+BAA+B,EAC/B,0BAA0B,EAC1B,4BAA4B,EAC5B,KAAK,YAAY,GAClB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAC5F,OAAO,EAAE,8BAA8B,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,0BAA0B,EAC1B,+BAA+B,EAC/B,wBAAwB,EACxB,uBAAuB,EACvB,2BAA2B,EAC3B,aAAa,EACb,KAAK,wBAAwB,EAC7B,KAAK,YAAY,GAClB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,kBAAkB,EAClB,UAAU,EACV,oBAAoB,EACpB,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,13 @@
1
+ export { createBrandHeader, createPlainBrandHeader } from "./brand-header.js";
2
+ export { resolveTerminalCapabilities } from "./capabilities.js";
3
+ export { shouldRenderBranding } from "./boundary.js";
4
+ export { AUDIT_HELP_DISCLAIMER } from "./disclaimers.js";
5
+ export { prependHumanBrandHeader } from "./human-output.js";
6
+ export { resolveTerminalPresentationMode } from "./mode.js";
7
+ export { formatHumanHint, formatHumanStatus, HUMAN_STATUS_LABELS, } from "./status.js";
8
+ export { parseColorMode, resolveColorEnabled } from "./color.js";
9
+ export { parseProgressMode, resolveProgressAnimationEnabled, resolveProgressModeFromCli, resolveProgressStaticEnabled, } from "./progress-mode.js";
10
+ export { createProgressReporter, stopActiveProgressReporter } from "./progress-reporter.js";
11
+ export { registerProgressSignalHandlers } from "./progress-signals.js";
12
+ export { buildFindingGroupKey, countUniqueIssues, formatAuditExecutionHeader, formatAuditFindingsPresentation, formatAuditFooterSummary, formatAuditRunSummaries, formatProfileReviewSections, groupFindings, } from "./audit-presentation.js";
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/presentation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,+BAA+B,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,mBAAmB,GAEpB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EACL,iBAAiB,EACjB,+BAA+B,EAC/B,0BAA0B,EAC1B,4BAA4B,GAE7B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAC5F,OAAO,EAAE,8BAA8B,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,0BAA0B,EAC1B,+BAA+B,EAC/B,wBAAwB,EACxB,uBAAuB,EACvB,2BAA2B,EAC3B,aAAa,GAGd,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { TerminalCapabilities, TerminalPresentationMode } from "./types.js";
2
+ /** Conservative interactive detection: TTY, not CI, not a dumb terminal. */
3
+ export declare function resolveTerminalPresentationMode(capabilities: TerminalCapabilities): TerminalPresentationMode;
4
+ //# sourceMappingURL=mode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mode.d.ts","sourceRoot":"","sources":["../../src/presentation/mode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAEjF,4EAA4E;AAC5E,wBAAgB,+BAA+B,CAC7C,YAAY,EAAE,oBAAoB,GACjC,wBAAwB,CAK1B"}
@@ -0,0 +1,8 @@
1
+ /** Conservative interactive detection: TTY, not CI, not a dumb terminal. */
2
+ export function resolveTerminalPresentationMode(capabilities) {
3
+ if (!capabilities.isTTY || capabilities.isCI || capabilities.isDumbTerminal) {
4
+ return "plain";
5
+ }
6
+ return "interactive";
7
+ }
8
+ //# sourceMappingURL=mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mode.js","sourceRoot":"","sources":["../../src/presentation/mode.ts"],"names":[],"mappings":"AAEA,4EAA4E;AAC5E,MAAM,UAAU,+BAA+B,CAC7C,YAAkC;IAElC,IAAI,CAAC,YAAY,CAAC,KAAK,IAAI,YAAY,CAAC,IAAI,IAAI,YAAY,CAAC,cAAc,EAAE,CAAC;QAC5E,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { TerminalCapabilities } from "./types.js";
2
+ export type ProgressMode = "auto" | "always" | "never";
3
+ export declare function parseProgressMode(value: string | undefined): ProgressMode;
4
+ export interface ResolveProgressEnabledInput {
5
+ mode: ProgressMode;
6
+ machineOutput: boolean;
7
+ capabilities: TerminalCapabilities;
8
+ }
9
+ /**
10
+ * Whether transient spinner/progress animation should run.
11
+ * Distinct from `--color`: progress may animate without ANSI color.
12
+ */
13
+ export declare function resolveProgressAnimationEnabled(input: ResolveProgressEnabledInput): boolean;
14
+ /** Whether static textual milestones may be printed (always mode, non-interactive). */
15
+ export declare function resolveProgressStaticEnabled(input: ResolveProgressEnabledInput): boolean;
16
+ export declare function resolveProgressModeFromCli(input: {
17
+ progress?: string;
18
+ noProgress?: boolean;
19
+ }): ProgressMode;
20
+ //# sourceMappingURL=progress-mode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress-mode.d.ts","sourceRoot":"","sources":["../../src/presentation/progress-mode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEvD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,YAAY,CAKzE;AAED,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,YAAY,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,oBAAoB,CAAC;CACpC;AAED;;;GAGG;AACH,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,2BAA2B,GAAG,OAAO,CAY3F;AAED,uFAAuF;AACvF,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,2BAA2B,GAAG,OAAO,CAQxF;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG,YAAY,CAKf"}
@@ -0,0 +1,38 @@
1
+ export function parseProgressMode(value) {
2
+ if (value === "always" || value === "never") {
3
+ return value;
4
+ }
5
+ return "auto";
6
+ }
7
+ /**
8
+ * Whether transient spinner/progress animation should run.
9
+ * Distinct from `--color`: progress may animate without ANSI color.
10
+ */
11
+ export function resolveProgressAnimationEnabled(input) {
12
+ if (input.mode === "never" || input.machineOutput) {
13
+ return false;
14
+ }
15
+ if (input.mode === "always") {
16
+ return input.capabilities.isStderrTTY && !input.capabilities.isDumbTerminal;
17
+ }
18
+ return (input.capabilities.isStderrTTY &&
19
+ !input.capabilities.isCI &&
20
+ !input.capabilities.isDumbTerminal);
21
+ }
22
+ /** Whether static textual milestones may be printed (always mode, non-interactive). */
23
+ export function resolveProgressStaticEnabled(input) {
24
+ if (input.mode === "never" || input.machineOutput) {
25
+ return false;
26
+ }
27
+ if (input.mode === "always") {
28
+ return !resolveProgressAnimationEnabled(input);
29
+ }
30
+ return false;
31
+ }
32
+ export function resolveProgressModeFromCli(input) {
33
+ if (input.noProgress) {
34
+ return "never";
35
+ }
36
+ return parseProgressMode(input.progress);
37
+ }
38
+ //# sourceMappingURL=progress-mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress-mode.js","sourceRoot":"","sources":["../../src/presentation/progress-mode.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,iBAAiB,CAAC,KAAyB;IACzD,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAQD;;;GAGG;AACH,MAAM,UAAU,+BAA+B,CAAC,KAAkC;IAChF,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;QAClD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC,YAAY,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,cAAc,CAAC;IAC9E,CAAC;IACD,OAAO,CACL,KAAK,CAAC,YAAY,CAAC,WAAW;QAC9B,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI;QACxB,CAAC,KAAK,CAAC,YAAY,CAAC,cAAc,CACnC,CAAC;AACJ,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,4BAA4B,CAAC,KAAkC;IAC7E,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;QAClD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,CAAC,+BAA+B,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,KAG1C;IACC,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACrB,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { ProgressReporter } from "@a11yst/types";
2
+ import type { ColorMode } from "./color.js";
3
+ import { type ProgressMode } from "./progress-mode.js";
4
+ import type { TerminalCapabilities } from "./types.js";
5
+ export interface CreateProgressReporterOptions {
6
+ mode: ProgressMode;
7
+ machineOutput: boolean;
8
+ capabilities: TerminalCapabilities;
9
+ colorMode?: ColorMode;
10
+ stream?: NodeJS.WriteStream;
11
+ setIntervalFn?: typeof setInterval;
12
+ clearIntervalFn?: typeof clearInterval;
13
+ setTimeoutFn?: typeof setTimeout;
14
+ clearTimeoutFn?: typeof clearTimeout;
15
+ }
16
+ export declare function stopActiveProgressReporter(): void;
17
+ export declare function createProgressReporter(options: CreateProgressReporterOptions): ProgressReporter;
18
+ //# sourceMappingURL=progress-reporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress-reporter.d.ts","sourceRoot":"","sources":["../../src/presentation/progress-reporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AASvD,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,YAAY,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,oBAAoB,CAAC;IACnC,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC;IAC5B,aAAa,CAAC,EAAE,OAAO,WAAW,CAAC;IACnC,eAAe,CAAC,EAAE,OAAO,aAAa,CAAC;IACvC,YAAY,CAAC,EAAE,OAAO,UAAU,CAAC;IACjC,cAAc,CAAC,EAAE,OAAO,YAAY,CAAC;CACtC;AAID,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD;AA6ND,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,6BAA6B,GACrC,gBAAgB,CA4BlB"}