@lucasacoutinho/archer 0.2.0 → 0.3.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 (214) hide show
  1. package/README.md +145 -387
  2. package/dist/analyzer/Analyzer.d.ts +17 -0
  3. package/dist/analyzer/Analyzer.d.ts.map +1 -0
  4. package/dist/analyzer/Analyzer.js +15 -0
  5. package/dist/analyzer/Analyzer.js.map +1 -0
  6. package/dist/analyzer/bindings.d.ts +26 -0
  7. package/dist/analyzer/bindings.d.ts.map +1 -0
  8. package/dist/analyzer/bindings.js +61 -0
  9. package/dist/analyzer/bindings.js.map +1 -0
  10. package/dist/analyzer/errors.d.ts +34 -0
  11. package/dist/analyzer/errors.d.ts.map +1 -0
  12. package/dist/analyzer/errors.js +20 -0
  13. package/dist/analyzer/errors.js.map +1 -0
  14. package/dist/analyzer/graph-file.d.ts +13 -0
  15. package/dist/analyzer/graph-file.d.ts.map +1 -0
  16. package/dist/analyzer/graph-file.js +22 -0
  17. package/dist/analyzer/graph-file.js.map +1 -0
  18. package/dist/analyzer/paths.d.ts +12 -0
  19. package/dist/analyzer/paths.d.ts.map +1 -0
  20. package/dist/analyzer/paths.js +26 -0
  21. package/dist/analyzer/paths.js.map +1 -0
  22. package/dist/analyzer/server-exit.d.ts +19 -0
  23. package/dist/analyzer/server-exit.d.ts.map +1 -0
  24. package/dist/analyzer/server-exit.js +70 -0
  25. package/dist/analyzer/server-exit.js.map +1 -0
  26. package/dist/analyzer/source.d.ts +29 -0
  27. package/dist/analyzer/source.d.ts.map +1 -0
  28. package/dist/analyzer/source.js +58 -0
  29. package/dist/analyzer/source.js.map +1 -0
  30. package/dist/analyzer/syntax.d.ts +29 -0
  31. package/dist/analyzer/syntax.d.ts.map +1 -0
  32. package/dist/analyzer/syntax.js +226 -0
  33. package/dist/analyzer/syntax.js.map +1 -0
  34. package/dist/analyzer/targets.d.ts +26 -0
  35. package/dist/analyzer/targets.d.ts.map +1 -0
  36. package/dist/analyzer/targets.js +84 -0
  37. package/dist/analyzer/targets.js.map +1 -0
  38. package/dist/analyzer/typescript.d.ts +5 -0
  39. package/dist/analyzer/typescript.d.ts.map +1 -0
  40. package/dist/analyzer/typescript.js +221 -0
  41. package/dist/analyzer/typescript.js.map +1 -0
  42. package/dist/analyzer/workspace.d.ts +24 -0
  43. package/dist/analyzer/workspace.d.ts.map +1 -0
  44. package/dist/analyzer/workspace.js +9 -0
  45. package/dist/analyzer/workspace.js.map +1 -0
  46. package/dist/cli/explain.d.ts +3 -0
  47. package/dist/cli/explain.d.ts.map +1 -0
  48. package/dist/cli/explain.js +21 -0
  49. package/dist/cli/explain.js.map +1 -0
  50. package/dist/cli/main.d.ts +3 -0
  51. package/dist/cli/main.d.ts.map +1 -0
  52. package/dist/cli/main.js +159 -0
  53. package/dist/cli/main.js.map +1 -0
  54. package/dist/config/input.d.ts +59 -0
  55. package/dist/config/input.d.ts.map +1 -0
  56. package/dist/config/input.js +115 -0
  57. package/dist/config/input.js.map +1 -0
  58. package/dist/config/rules.d.ts +94 -0
  59. package/dist/config/rules.d.ts.map +1 -0
  60. package/dist/config/rules.js +130 -0
  61. package/dist/config/rules.js.map +1 -0
  62. package/dist/core/baseline.d.ts +16 -0
  63. package/dist/core/baseline.d.ts.map +1 -0
  64. package/dist/core/baseline.js +25 -0
  65. package/dist/core/baseline.js.map +1 -0
  66. package/dist/core/check.d.ts +16 -0
  67. package/dist/core/check.d.ts.map +1 -0
  68. package/dist/core/check.js +271 -0
  69. package/dist/core/check.js.map +1 -0
  70. package/dist/core/config.d.ts +72 -0
  71. package/dist/core/config.d.ts.map +1 -0
  72. package/dist/core/config.js +78 -0
  73. package/dist/core/config.js.map +1 -0
  74. package/dist/core/fingerprint.d.ts +54 -0
  75. package/dist/core/fingerprint.d.ts.map +1 -0
  76. package/dist/core/fingerprint.js +182 -0
  77. package/dist/core/fingerprint.js.map +1 -0
  78. package/dist/core/keys.d.ts +10 -0
  79. package/dist/core/keys.d.ts.map +1 -0
  80. package/dist/core/keys.js +16 -0
  81. package/dist/core/keys.js.map +1 -0
  82. package/dist/core/lower.d.ts +13 -0
  83. package/dist/core/lower.d.ts.map +1 -0
  84. package/dist/core/lower.js +82 -0
  85. package/dist/core/lower.js.map +1 -0
  86. package/dist/core/model.d.ts +155 -0
  87. package/dist/core/model.d.ts.map +1 -0
  88. package/dist/core/model.js +116 -0
  89. package/dist/core/model.js.map +1 -0
  90. package/dist/core/pattern.d.ts +13 -0
  91. package/dist/core/pattern.d.ts.map +1 -0
  92. package/dist/core/pattern.js +29 -0
  93. package/dist/core/pattern.js.map +1 -0
  94. package/dist/core/reach.d.ts +10 -0
  95. package/dist/core/reach.d.ts.map +1 -0
  96. package/dist/core/reach.js +81 -0
  97. package/dist/core/reach.js.map +1 -0
  98. package/dist/core/rule.d.ts +200 -0
  99. package/dist/core/rule.d.ts.map +1 -0
  100. package/dist/core/rule.js +162 -0
  101. package/dist/core/rule.js.map +1 -0
  102. package/dist/core/selector.d.ts +7 -0
  103. package/dist/core/selector.d.ts.map +1 -0
  104. package/dist/core/selector.js +27 -0
  105. package/dist/core/selector.js.map +1 -0
  106. package/dist/core/structural.d.ts +10 -0
  107. package/dist/core/structural.d.ts.map +1 -0
  108. package/dist/core/structural.js +24 -0
  109. package/dist/core/structural.js.map +1 -0
  110. package/dist/core/text.d.ts +26 -0
  111. package/dist/core/text.d.ts.map +1 -0
  112. package/dist/core/text.js +144 -0
  113. package/dist/core/text.js.map +1 -0
  114. package/dist/effect.d.ts +19 -0
  115. package/dist/effect.d.ts.map +1 -0
  116. package/dist/effect.js +21 -0
  117. package/dist/effect.js.map +1 -0
  118. package/dist/index.d.ts +24 -44
  119. package/dist/index.d.ts.map +1 -0
  120. package/dist/index.js +59 -52
  121. package/dist/index.js.map +1 -0
  122. package/dist/report/agent.d.ts +3 -0
  123. package/dist/report/agent.d.ts.map +1 -0
  124. package/dist/report/agent.js +35 -0
  125. package/dist/report/agent.js.map +1 -0
  126. package/dist/report/dot.d.ts +4 -0
  127. package/dist/report/dot.d.ts.map +1 -0
  128. package/dist/report/dot.js +15 -0
  129. package/dist/report/dot.js.map +1 -0
  130. package/dist/report/github.d.ts +3 -0
  131. package/dist/report/github.d.ts.map +1 -0
  132. package/dist/report/github.js +18 -0
  133. package/dist/report/github.js.map +1 -0
  134. package/dist/report/json.d.ts +3 -0
  135. package/dist/report/json.d.ts.map +1 -0
  136. package/dist/report/json.js +4 -0
  137. package/dist/report/json.js.map +1 -0
  138. package/dist/report/message.d.ts +20 -0
  139. package/dist/report/message.d.ts.map +1 -0
  140. package/dist/report/message.js +73 -0
  141. package/dist/report/message.js.map +1 -0
  142. package/dist/report/pretty.d.ts +8 -0
  143. package/dist/report/pretty.d.ts.map +1 -0
  144. package/dist/report/pretty.js +89 -0
  145. package/dist/report/pretty.js.map +1 -0
  146. package/dist/report/render.d.ts +9 -0
  147. package/dist/report/render.d.ts.map +1 -0
  148. package/dist/report/render.js +10 -0
  149. package/dist/report/render.js.map +1 -0
  150. package/dist/report/report.d.ts +44 -0
  151. package/dist/report/report.d.ts.map +1 -0
  152. package/dist/report/report.js +49 -0
  153. package/dist/report/report.js.map +1 -0
  154. package/dist/report/sarif.d.ts +3 -0
  155. package/dist/report/sarif.d.ts.map +1 -0
  156. package/dist/report/sarif.js +68 -0
  157. package/dist/report/sarif.js.map +1 -0
  158. package/dist/run.d.ts +49 -0
  159. package/dist/run.d.ts.map +1 -0
  160. package/dist/run.js +87 -0
  161. package/dist/run.js.map +1 -0
  162. package/dist/shell/baseline-file.d.ts +20 -0
  163. package/dist/shell/baseline-file.d.ts.map +1 -0
  164. package/dist/shell/baseline-file.js +46 -0
  165. package/dist/shell/baseline-file.js.map +1 -0
  166. package/dist/shell/load-config.d.ts +19 -0
  167. package/dist/shell/load-config.d.ts.map +1 -0
  168. package/dist/shell/load-config.js +39 -0
  169. package/dist/shell/load-config.js.map +1 -0
  170. package/package.json +29 -177
  171. package/skills/archer/SKILL.md +127 -45
  172. package/skills/archer/agents/openai.yaml +2 -2
  173. package/skills/archer/references/rules.md +267 -54
  174. package/dist/bun/plugin.cjs +0 -85
  175. package/dist/bun/plugin.d.cts +0 -7
  176. package/dist/bun/plugin.d.ts +0 -7
  177. package/dist/bun/plugin.js +0 -11
  178. package/dist/bun.cjs +0 -2238
  179. package/dist/bun.d.cts +0 -13
  180. package/dist/bun.d.ts +0 -13
  181. package/dist/bun.js +0 -28
  182. package/dist/chunk-2AKMBLHG.js +0 -2165
  183. package/dist/chunk-67YEOTXP.js +0 -25
  184. package/dist/chunk-IDVLHNL2.js +0 -46
  185. package/dist/chunk-ZZ6TR4PO.js +0 -201
  186. package/dist/cli.js +0 -2643
  187. package/dist/index.cjs +0 -2484
  188. package/dist/index.d.cts +0 -45
  189. package/dist/jest/plugin.cjs +0 -85
  190. package/dist/jest/plugin.d.cts +0 -7
  191. package/dist/jest/plugin.d.ts +0 -7
  192. package/dist/jest/plugin.js +0 -11
  193. package/dist/jest.cjs +0 -2237
  194. package/dist/jest.d.cts +0 -13
  195. package/dist/jest.d.ts +0 -13
  196. package/dist/jest.js +0 -27
  197. package/dist/matchers-Cqnbsyxe.d.cts +0 -11
  198. package/dist/matchers-Cqnbsyxe.d.ts +0 -11
  199. package/dist/node.cjs +0 -2237
  200. package/dist/node.d.cts +0 -13
  201. package/dist/node.d.ts +0 -13
  202. package/dist/node.js +0 -27
  203. package/dist/reporters-BbAXMpuW.d.cts +0 -6
  204. package/dist/reporters-xh-HQneS.d.ts +0 -6
  205. package/dist/suite-BwnPDCvU.d.cts +0 -337
  206. package/dist/suite-BwnPDCvU.d.ts +0 -337
  207. package/dist/vitest/plugin.cjs +0 -85
  208. package/dist/vitest/plugin.d.cts +0 -7
  209. package/dist/vitest/plugin.d.ts +0 -7
  210. package/dist/vitest/plugin.js +0 -11
  211. package/dist/vitest.cjs +0 -2531
  212. package/dist/vitest.d.cts +0 -37
  213. package/dist/vitest.d.ts +0 -37
  214. package/dist/vitest.js +0 -139
package/dist/index.d.ts CHANGED
@@ -1,45 +1,25 @@
1
- import { A as ArcherOptions, b as ArchitectureGraph, c as ArchitectureResult, d as ArchitectureViolation, a as ArchitectureSuite } from './suite-BwnPDCvU.js';
2
- export { e as ArchExpectation, f as ArcherPreset, g as ArcherProjectOptions, h as ArchitectureLayers, C as CustomRule, i as CustomRuleContext, j as CustomRuleResult, k as CycleOptions, D as DeclarationInfo, l as DeclarationKind, m as Dependency, n as DependencyKind, o as DependencyResolution, L as LayerExpectation, M as MethodInfo, P as ProjectInfo, R as ResolutionOptions, p as RuleMetadata, q as RuleSeverity, S as Selector, r as SourceLocation, s as SourceModule, t as SourceUse, u as applyPreset, v as availablePresets, w as createArcher, x as registerPreset } from './suite-BwnPDCvU.js';
3
- import { R as ReporterName } from './reporters-xh-HQneS.js';
4
- export { r as report } from './reporters-xh-HQneS.js';
5
- export { a as archerMatchers } from './matchers-Cqnbsyxe.js';
6
-
7
- declare function clearAnalysisCache(): void;
8
- declare function analyze(options?: ArcherOptions): Promise<ArchitectureGraph>;
9
-
10
- interface BaselineEntry {
11
- readonly file?: string;
12
- readonly fingerprint: string;
13
- readonly message: string;
14
- readonly rule: string;
1
+ import { type ArcherConfig, defineConfig } from "./config/input.ts";
2
+ import type { Graph } from "./core/model.ts";
3
+ import { type Format } from "./report/render.ts";
4
+ import type { Report } from "./report/report.ts";
5
+ import { type RunOptions, type RunResult } from "./run.ts";
6
+ export { defineConfig, type ArcherConfig };
7
+ export { p, presets, r, use, type CustomCheck, type CustomContext, type RuleSpec, type SelectorInput } from "./config/rules.ts";
8
+ export type { Format, Graph, Report, RunOptions, RunResult };
9
+ export type { BaselineMode } from "./run.ts";
10
+ /** Loads the configuration, analyzes the workspace, and applies the baseline. */
11
+ export declare const run: (options?: RunOptions) => Promise<RunResult>;
12
+ export declare const renderReport: (result: RunResult, format?: Format) => Promise<string>;
13
+ export declare class ArchitectureError extends Error {
14
+ readonly report: Report;
15
+ constructor(report: Report, message: string);
15
16
  }
16
- interface ArchitectureBaseline {
17
- readonly generatedAt: string;
18
- readonly version: 1;
19
- readonly violations: readonly BaselineEntry[];
20
- }
21
- declare function violationFingerprint(violation: ArchitectureViolation): string;
22
- declare function createBaseline(result: ArchitectureResult): ArchitectureBaseline;
23
- declare function readBaseline(fileName: string): Promise<ArchitectureBaseline>;
24
- declare function writeBaseline(fileName: string, baseline: ArchitectureBaseline): Promise<void>;
25
- declare function applyBaseline(result: ArchitectureResult, baseline: ArchitectureBaseline): ArchitectureResult;
26
-
27
- interface ArcherConfig extends ArcherOptions {
28
- /** Existing violations to suppress while preventing new violations. */
29
- readonly baseline?: string;
30
- /** Default report file. Standard output is used when omitted. */
31
- readonly output?: string;
32
- /** Configure the architecture suite. */
33
- readonly rules: (suite: ArchitectureSuite) => Promise<void> | void;
34
- /** Default CLI reporter. */
35
- readonly reporter?: ReporterName;
36
- }
37
- declare function defineConfig<const T extends ArcherConfig>(config: T): T;
38
-
39
- declare function formatResult(result: ArchitectureResult): string;
40
- declare class ArchitectureError extends Error {
41
- readonly result: ArchitectureResult;
42
- constructor(result: ArchitectureResult);
43
- }
44
-
45
- export { type ArcherConfig, ArcherOptions, type ArchitectureBaseline, ArchitectureError, ArchitectureGraph, ArchitectureResult, ArchitectureSuite, ArchitectureViolation, type BaselineEntry, ReporterName, analyze, applyBaseline, clearAnalysisCache, createBaseline, defineConfig, formatResult, readBaseline, violationFingerprint, writeBaseline };
17
+ /** Rejects with an `ArchitectureError`, whose message is the pretty report, when the verdict is fail. */
18
+ export declare const assertArchitecture: (options?: RunOptions) => Promise<Report>;
19
+ /** Checks a configuration against a graph built in memory: no TypeScript and no files. Throws on an invalid configuration. */
20
+ export declare const check: (config: ArcherConfig, graph: Graph) => Report;
21
+ /** A graph from an adjacency table of root-relative paths, for testing a policy. */
22
+ export declare const graphOf: (adjacency: Readonly<Record<string, ReadonlyArray<string>>>) => Graph;
23
+ /** Stops the TypeScript server that `run` started. */
24
+ export declare const dispose: () => Promise<void>;
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACnE,OAAO,KAAK,EAAE,KAAK,EAAc,MAAM,iBAAiB,CAAA;AAExD,OAAO,EAAE,KAAK,MAAM,EAAU,MAAM,oBAAoB,CAAA;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAgC,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAA;AAExF,OAAO,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,CAAA;AAC1C,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,KAAK,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAC/H,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,CAAA;AAC5D,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAkB5C,iFAAiF;AACjF,eAAO,MAAM,GAAG,aAAmB,UAAU,KAAQ,OAAO,CAAC,SAAS,CACX,CAAA;AAE3D,eAAO,MAAM,YAAY,WAAkB,SAAS,WAAU,MAAM,KAAc,OAAO,CAAC,MAAM,CACP,CAAA;AAEzF,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IAEvB,YAAY,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAI1C;CACF;AAED,yGAAyG;AACzG,eAAO,MAAM,kBAAkB,aAAmB,UAAU,KAAQ,OAAO,CAAC,MAAM,CAMjF,CAAA;AAED,8HAA8H;AAC9H,eAAO,MAAM,KAAK,WAAY,YAAY,SAAS,KAAK,KAAG,MAAsD,CAAA;AAEjH,oFAAoF;AACpF,eAAO,MAAM,OAAO,cAAe,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,KAAG,KAgBnF,CAAA;AAEF,sDAAsD;AACtD,eAAO,MAAM,OAAO,QAAa,OAAO,CAAC,IAAI,CAI5C,CAAA"}
package/dist/index.js CHANGED
@@ -1,54 +1,61 @@
1
- import {
2
- applyBaseline,
3
- createBaseline,
4
- readBaseline,
5
- report,
6
- violationFingerprint,
7
- writeBaseline
8
- } from "./chunk-ZZ6TR4PO.js";
9
- import {
10
- ArchExpectation,
11
- ArchitectureLayers,
12
- ArchitectureSuite,
13
- LayerExpectation,
14
- analyze,
15
- applyPreset,
16
- availablePresets,
17
- clearAnalysisCache,
18
- createArcher,
19
- registerPreset
20
- } from "./chunk-2AKMBLHG.js";
21
- import {
22
- archerMatchers
23
- } from "./chunk-67YEOTXP.js";
24
- import {
25
- ArchitectureError,
26
- formatResult
27
- } from "./chunk-IDVLHNL2.js";
28
-
29
- // src/config/index.ts
30
- function defineConfig(config) {
31
- return config;
1
+ import { Cause, Exit, ManagedRuntime, Result } from "effect";
2
+ import { defineConfig } from "./config/input.js";
3
+ import { ArcherLive } from "./effect.js";
4
+ import { render } from "./report/render.js";
5
+ import { checkGraph, run as runEffect } from "./run.js";
6
+ export { defineConfig };
7
+ export { p, presets, r, use } from "./config/rules.js";
8
+ const makeRuntime = () => ManagedRuntime.make(ArcherLive);
9
+ let runtime;
10
+ const shared = () => (runtime ??= makeRuntime());
11
+ /** Errors keep their `_tag` (`ConfigNotFound`, `ConfigInvalid`, `ProjectParseFailed`, …) and `instanceof Error`. */
12
+ const settle = async (exit) => {
13
+ if (Exit.isSuccess(exit)) {
14
+ return exit.value;
15
+ }
16
+ throw Cause.squash(exit.cause);
17
+ };
18
+ /** Loads the configuration, analyzes the workspace, and applies the baseline. */
19
+ export const run = async (options = {}) => settle(await shared().runPromiseExit(runEffect(options)));
20
+ export const renderReport = async (result, format = "pretty") => shared().runPromise(render(format, result.report, result.graph, { root: result.root }));
21
+ export class ArchitectureError extends Error {
22
+ report;
23
+ constructor(report, message) {
24
+ super(message);
25
+ this.name = "ArchitectureError";
26
+ this.report = report;
27
+ }
32
28
  }
33
- export {
34
- ArchExpectation,
35
- ArchitectureError,
36
- ArchitectureLayers,
37
- ArchitectureSuite,
38
- LayerExpectation,
39
- analyze,
40
- applyBaseline,
41
- applyPreset,
42
- archerMatchers,
43
- availablePresets,
44
- clearAnalysisCache,
45
- createArcher,
46
- createBaseline,
47
- defineConfig,
48
- formatResult,
49
- readBaseline,
50
- registerPreset,
51
- report,
52
- violationFingerprint,
53
- writeBaseline
29
+ /** Rejects with an `ArchitectureError`, whose message is the pretty report, when the verdict is fail. */
30
+ export const assertArchitecture = async (options = {}) => {
31
+ const result = await run(options);
32
+ if (result.report.verdict === "fail") {
33
+ throw new ArchitectureError(result.report, await renderReport(result));
34
+ }
35
+ return result.report;
36
+ };
37
+ /** Checks a configuration against a graph built in memory: no TypeScript and no files. Throws on an invalid configuration. */
38
+ export const check = (config, graph) => Result.getOrThrow(checkGraph(config, graph));
39
+ /** A graph from an adjacency table of root-relative paths, for testing a policy. */
40
+ export const graphOf = (adjacency) => ({
41
+ files: Object.entries(adjacency).map(([path, imports]) => ({
42
+ path: path.split("/"),
43
+ dependencies: imports.map((target, index) => ({
44
+ target: { _tag: "File", path: target.split("/") },
45
+ kind: "static",
46
+ specifier: target,
47
+ location: { line: index + 1, column: 1 },
48
+ })),
49
+ declarations: [],
50
+ exports: [],
51
+ uses: [],
52
+ lines: 0,
53
+ })),
54
+ });
55
+ /** Stops the TypeScript server that `run` started. */
56
+ export const dispose = async () => {
57
+ const current = runtime;
58
+ runtime = undefined;
59
+ await current?.dispose();
54
60
  };
61
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Report } from "./report.ts";
2
+ export declare const agent: (report: Report) => string;
3
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/report/agent.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAQzC,eAAO,MAAM,KAAK,WAAY,MAAM,KAAG,MA4BtC,CAAA"}
@@ -0,0 +1,35 @@
1
+ import { encode, fingerprint } from "../core/fingerprint.js";
2
+ import { describe, pathText } from "./message.js";
3
+ /** JSON escapes control characters but not the Unicode line separators that line splitters honour. */
4
+ const quote = (text) => JSON.stringify(text).replaceAll("\u0085", "\\u0085").replaceAll("\u2028", "\\u2028").replaceAll("\u2029", "\\u2029");
5
+ const at = ({ path, line, column }) => `${path}:${line}:${column}`;
6
+ export const agent = (report) => {
7
+ const findings = report.violations.map((violation) => {
8
+ const { message, reason, location } = describe(violation, report.rules);
9
+ return [
10
+ "finding",
11
+ `id=${quote(encode(fingerprint(violation)))}`,
12
+ `severity=${violation.severity}`,
13
+ `rule=${quote(violation.ruleId)}`,
14
+ `subject=${quote(pathText(violation.subject))}`,
15
+ ...(location === undefined ? [] : [`at=${quote(at(location))}`]),
16
+ `message=${quote(message)}`,
17
+ ...(reason === undefined ? [] : [`reason=${quote(reason)}`]),
18
+ ].join(" ");
19
+ });
20
+ const summary = [
21
+ "summary",
22
+ `verdict=${report.verdict}`,
23
+ `errors=${report.counts.error}`,
24
+ `warnings=${report.counts.warning}`,
25
+ `infos=${report.counts.info}`,
26
+ `suppressed=${report.suppressed}`,
27
+ `stale=${report.stale.length}`,
28
+ `files=${report.stats.files}`,
29
+ `dependencies=${report.stats.dependencies}`,
30
+ `emptySubjects=[${report.emptySubjects.map(quote).join(",")}]`,
31
+ `emptyObjects=[${report.emptyObjects.map(quote).join(",")}]`,
32
+ ].join(" ");
33
+ return [...findings, summary].join("\n");
34
+ };
35
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/report/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAC5D,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAiB,MAAM,cAAc,CAAA;AAGhE,sGAAsG;AACtG,MAAM,KAAK,GAAG,CAAC,IAAY,EAAU,EAAE,CACrC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;AAEtH,MAAM,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAY,EAAU,EAAE,CAAC,GAAG,IAAI,IAAI,IAAI,IAAI,MAAM,EAAE,CAAA;AAEpF,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,MAAc,EAAU,EAAE;IAC9C,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;QACnD,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;QACvE,OAAO;YACL,SAAS;YACT,MAAM,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;YAC7C,YAAY,SAAS,CAAC,QAAQ,EAAE;YAChC,QAAQ,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE;YACjC,WAAW,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE;YAC/C,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;YAChE,WAAW,KAAK,CAAC,OAAO,CAAC,EAAE;YAC3B,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SAC7D,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACb,CAAC,CAAC,CAAA;IACF,MAAM,OAAO,GAAG;QACd,SAAS;QACT,WAAW,MAAM,CAAC,OAAO,EAAE;QAC3B,UAAU,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;QAC/B,YAAY,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE;QACnC,SAAS,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;QAC7B,cAAc,MAAM,CAAC,UAAU,EAAE;QACjC,SAAS,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE;QAC9B,SAAS,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE;QAC7B,gBAAgB,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE;QAC3C,kBAAkB,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG;QAC9D,iBAAiB,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG;KAC7D,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACX,OAAO,CAAC,GAAG,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC1C,CAAC,CAAA"}
@@ -0,0 +1,4 @@
1
+ import type { Graph } from "../core/model.ts";
2
+ /** Nodes and edges are sorted and deduplicated, so the output does not depend on the graph's file order. */
3
+ export declare const dot: (graph: Graph) => string;
4
+ //# sourceMappingURL=dot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dot.d.ts","sourceRoot":"","sources":["../../src/report/dot.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAkB,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAe7D,4GAA4G;AAC5G,eAAO,MAAM,GAAG,UAAW,KAAK,KAAG,MAelC,CAAA"}
@@ -0,0 +1,15 @@
1
+ import { Match } from "effect";
2
+ import { pathText } from "./message.js";
3
+ const quoted = (text) => `"${text.replaceAll("\\", "\\\\").replaceAll('"', '\\"').replaceAll("\n", "\\n")}"`;
4
+ const attributes = (kind) => Match.value(kind).pipe(Match.when("static", () => ""), Match.when("type", () => ' [label="type", style=dashed]'), Match.when("require", () => ' [label="require"]'), Match.when("dynamic", () => ' [label="dynamic", style=dotted]'), Match.exhaustive);
5
+ /** Nodes and edges are sorted and deduplicated, so the output does not depend on the graph's file order. */
6
+ export const dot = (graph) => {
7
+ const nodes = graph.files.map((file) => ` ${quoted(pathText(file.path))};`);
8
+ const edges = graph.files.flatMap((file) => file.dependencies.flatMap(({ target, kind }) => Match.value(target).pipe(Match.tag("File", ({ path }) => [
9
+ ` ${quoted(pathText(file.path))} -> ${quoted(pathText(path))}${attributes(kind)};`,
10
+ ]), Match.orElse(() => []))));
11
+ const sorted = (lines) => Array.from(new Set(lines)).sort();
12
+ const header = ["digraph archer {", " rankdir=LR;", " node [shape=box];"];
13
+ return [...header, ...sorted(nodes), ...sorted(edges), "}"].join("\n");
14
+ };
15
+ //# sourceMappingURL=dot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dot.js","sourceRoot":"","sources":["../../src/report/dot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAE9B,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAEvC,MAAM,MAAM,GAAG,CAAC,IAAY,EAAU,EAAE,CACtC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAA;AAErF,MAAM,UAAU,GAAG,CAAC,IAAoB,EAAU,EAAE,CAClD,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CACpB,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAC9B,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,+BAA+B,CAAC,EACzD,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,EACjD,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,kCAAkC,CAAC,EAC/D,KAAK,CAAC,UAAU,CACjB,CAAA;AAEH,4GAA4G;AAC5G,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,KAAY,EAAU,EAAE;IAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;IAC5E,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CACzC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAC7C,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CACtB,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QAC9B,KAAK,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG;KACpF,CAAC,EACF,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CACvB,CACF,CACF,CAAA;IACD,MAAM,MAAM,GAAG,CAAC,KAA4B,EAAiB,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IACjG,MAAM,MAAM,GAAG,CAAC,kBAAkB,EAAE,eAAe,EAAE,qBAAqB,CAAC,CAAA;IAC3E,OAAO,CAAC,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACxE,CAAC,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { Report } from "./report.ts";
2
+ export declare const github: (report: Report) => string;
3
+ //# sourceMappingURL=github.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/report/github.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAezC,eAAO,MAAM,MAAM,WAAY,MAAM,KAAG,MAYzB,CAAA"}
@@ -0,0 +1,18 @@
1
+ import { Match } from "effect";
2
+ import { describe, pathText, standalone } from "./message.js";
3
+ // GitHub workflow commands: % \r \n are escaped everywhere, and properties also escape : and ,
4
+ const data = (text) => text.replaceAll("%", "%25").replaceAll("\r", "%0D").replaceAll("\n", "%0A");
5
+ const property = (text) => data(text).replaceAll(":", "%3A").replaceAll(",", "%2C");
6
+ const command = (severity) => Match.value(severity).pipe(Match.when("error", () => "error"), Match.when("warning", () => "warning"), Match.when("info", () => "notice"), Match.exhaustive);
7
+ export const github = (report) => report.violations
8
+ .map((violation) => {
9
+ const description = describe(violation, report.rules);
10
+ const { location } = description;
11
+ const properties = location === undefined
12
+ ? [`file=${property(pathText(violation.subject))}`]
13
+ : [`file=${property(location.path)}`, `line=${location.line}`, `col=${location.column}`];
14
+ const attributes = [...properties, `title=${property(violation.ruleId)}`].join(",");
15
+ return `::${command(violation.severity)} ${attributes}::${data(standalone(violation, description))}`;
16
+ })
17
+ .join("\n");
18
+ //# sourceMappingURL=github.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/report/github.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAE9B,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAG7D,+FAA+F;AAC/F,MAAM,IAAI,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;AAElH,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;AAEnG,MAAM,OAAO,GAAG,CAAC,QAAkB,EAAU,EAAE,CAC7C,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CACxB,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,EAClC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,EACtC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,EAClC,KAAK,CAAC,UAAU,CACjB,CAAA;AAEH,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,MAAc,EAAU,EAAE,CAC/C,MAAM,CAAC,UAAU;KACd,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;IACjB,MAAM,WAAW,GAAG,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;IACrD,MAAM,EAAE,QAAQ,EAAE,GAAG,WAAW,CAAA;IAChC,MAAM,UAAU,GACd,QAAQ,KAAK,SAAS;QACpB,CAAC,CAAC,CAAC,QAAQ,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACnD,CAAC,CAAC,CAAC,QAAQ,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,QAAQ,CAAC,IAAI,EAAE,EAAE,OAAO,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;IAC5F,MAAM,UAAU,GAAG,CAAC,GAAG,UAAU,EAAE,SAAS,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACnF,OAAO,KAAK,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,UAAU,KAAK,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,EAAE,CAAA;AACtG,CAAC,CAAC;KACD,IAAI,CAAC,IAAI,CAAC,CAAA"}
@@ -0,0 +1,3 @@
1
+ import { Report } from "./report.ts";
2
+ export declare const json: (report: Report) => string;
3
+ //# sourceMappingURL=json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/report/json.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,eAAO,MAAM,IAAI,WAAY,MAAM,KAAG,MAAyE,CAAA"}
@@ -0,0 +1,4 @@
1
+ import { Schema } from "effect";
2
+ import { Report } from "./report.js";
3
+ export const json = (report) => JSON.stringify(Schema.encodeSync(Report)(report), undefined, 2);
4
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/report/json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,MAAc,EAAU,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAA"}
@@ -0,0 +1,20 @@
1
+ import type { FilePath, Target } from "../core/model.ts";
2
+ import type { Edge, Violation } from "../core/rule.ts";
3
+ import type { RuleInfo } from "./report.ts";
4
+ export interface Position {
5
+ readonly path: string;
6
+ readonly line: number;
7
+ readonly column: number;
8
+ }
9
+ export interface Description {
10
+ readonly message: string;
11
+ readonly reason?: string;
12
+ readonly location?: Position;
13
+ }
14
+ export declare const pathText: (path: FilePath) => string;
15
+ export declare const targetLabel: (target: Target) => string;
16
+ export declare const importText: ({ dependency }: Edge) => string;
17
+ export declare const describe: (violation: Violation, rules: ReadonlyArray<RuleInfo>) => Description;
18
+ /** The message with its subject in front when the location is in another file, for output without a file header. */
19
+ export declare const standalone: (violation: Violation, { message, location }: Description) => string;
20
+ //# sourceMappingURL=message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../src/report/message.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAkB,QAAQ,EAAE,MAAM,EAAO,MAAM,kBAAkB,CAAA;AAC7E,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAE3C,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAA;CAC7B;AAED,eAAO,MAAM,QAAQ,SAAU,QAAQ,KAAG,MAAwB,CAAA;AAElE,eAAO,MAAM,WAAW,WAAY,MAAM,KAAG,MAOzC,CAAA;AAaJ,eAAO,MAAM,UAAU,mBAAoB,IAAI,KAAG,MAC0D,CAAA;AAmE5G,eAAO,MAAM,QAAQ,cAAe,SAAS,SAAS,aAAa,CAAC,QAAQ,CAAC,KAAG,WAI/E,CAAA;AAED,oHAAoH;AACpH,eAAO,MAAM,UAAU,cAAe,SAAS,yBAAyB,WAAW,KAAG,MAGrF,CAAA"}
@@ -0,0 +1,73 @@
1
+ import { Match } from "effect";
2
+ export const pathText = (path) => path.join("/");
3
+ export const targetLabel = (target) => Match.valueTags(target, {
4
+ File: ({ path }) => pathText(path),
5
+ Package: ({ name, subpath }) => `npm:${[name, ...subpath].join("/")}`,
6
+ Builtin: ({ runtime, name }) => `${runtime}:${name}`,
7
+ Unresolved: ({ specifier }) => `unresolved:${specifier}`,
8
+ Computed: () => "computed:*",
9
+ });
10
+ const verbs = (kind) => Match.value(kind).pipe(Match.when("static", () => ({ active: "imports", passive: "is imported by" })), Match.when("type", () => ({ active: "imports the types of", passive: "has its types imported by" })), Match.when("require", () => ({ active: "requires", passive: "is required by" })), Match.when("dynamic", () => ({ active: "dynamically imports", passive: "is dynamically imported by" })), Match.exhaustive);
11
+ const specifierText = (specifier) => (specifier === "" ? "" : ` ('${specifier}')`);
12
+ export const importText = ({ dependency }) => `${verbs(dependency.kind).active} ${targetLabel(dependency.target)}${specifierText(dependency.specifier)}`;
13
+ const importedByText = ({ source, dependency }) => `${verbs(dependency.kind).passive} ${pathText(source)}${specifierText(dependency.specifier)}`;
14
+ const positionOf = (edge) => ({ path: pathText(edge.source), ...edge.dependency.location });
15
+ const locatedAt = (edge) => edge === undefined ? {} : { location: positionOf(edge) };
16
+ const chainOf = (edges) => {
17
+ const [first] = edges;
18
+ return first === undefined
19
+ ? ""
20
+ : [pathText(first.source), ...edges.map(({ dependency }) => targetLabel(dependency.target))].join(" → ");
21
+ };
22
+ const useText = (use) => Match.value(use.kind).pipe(Match.when("looseEquality", () => `uses loose equality (${use.name})`), Match.when("call", () => Match.valueTags(use.binding, {
23
+ Global: () => `calls ${use.name}`,
24
+ Local: () => `calls ${use.name}`,
25
+ Imported: ({ name }) => `calls ${use.name} (${name.name} from '${name.source}')`,
26
+ })), Match.exhaustive);
27
+ const evidenceDescription = ({ subject: subjectPath, evidence }) => {
28
+ const subject = pathText(subjectPath);
29
+ return Match.valueTags(evidence, {
30
+ Walk: ({ target, edges }) => {
31
+ const [first] = edges;
32
+ const incoming = first !== undefined && pathText(first.source) !== subject;
33
+ const chain = chainOf(edges);
34
+ const through = chain === "" ? "" : ` through ${chain}`;
35
+ return {
36
+ message: `${incoming ? "is depended on by" : "depends on"} ${targetLabel(target)}${through}`,
37
+ ...locatedAt(first),
38
+ };
39
+ },
40
+ Missing: () => ({ message: "does not satisfy the rule's requirement" }),
41
+ Cycle: ({ edges }) => {
42
+ const chain = chainOf(edges);
43
+ return {
44
+ message: chain === "" ? "is part of a dependency cycle" : `is part of a dependency cycle: ${chain}`,
45
+ ...locatedAt(edges[0]),
46
+ };
47
+ },
48
+ Dependency: ({ edge }) => ({
49
+ message: pathText(edge.source) === subject ? importText(edge) : importedByText(edge),
50
+ location: positionOf(edge),
51
+ }),
52
+ Declaration: ({ name, location }) => ({
53
+ message: `declares ${name}, which the rule does not allow`,
54
+ location: { path: subject, ...location },
55
+ }),
56
+ Export: ({ name }) => ({ message: `exports ${name}, which the rule does not allow` }),
57
+ Use: ({ use }) => ({ message: useText(use), location: { path: subject, ...use.location } }),
58
+ Name: ({ basename }) => ({ message: `has the file name ${basename}, which breaks the naming rule` }),
59
+ Lines: ({ count }) => ({ message: `has ${count} lines, more than the rule allows` }),
60
+ Custom: ({ message }) => ({ message }),
61
+ });
62
+ };
63
+ export const describe = (violation, rules) => {
64
+ const description = evidenceDescription(violation);
65
+ const reason = rules.find((rule) => rule.id === violation.ruleId)?.reason;
66
+ return reason === undefined ? description : { ...description, reason };
67
+ };
68
+ /** The message with its subject in front when the location is in another file, for output without a file header. */
69
+ export const standalone = (violation, { message, location }) => {
70
+ const subject = pathText(violation.subject);
71
+ return location === undefined || location.path === subject ? message : `${subject} ${message}`;
72
+ };
73
+ //# sourceMappingURL=message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.js","sourceRoot":"","sources":["../../src/report/message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAiB9B,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAAc,EAAU,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAElE,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,MAAc,EAAU,EAAE,CACpD,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE;IACtB,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;IAClC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;IACrE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,GAAG,OAAO,IAAI,IAAI,EAAE;IACpD,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,cAAc,SAAS,EAAE;IACxD,QAAQ,EAAE,GAAG,EAAE,CAAC,YAAY;CAC7B,CAAC,CAAA;AAEJ,MAAM,KAAK,GAAG,CAAC,IAAoB,EAAyD,EAAE,CAC5F,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CACpB,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC,EAC9E,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,sBAAsB,EAAE,OAAO,EAAE,2BAA2B,EAAE,CAAC,CAAC,EACpG,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC,EAChF,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,qBAAqB,EAAE,OAAO,EAAE,4BAA4B,EAAE,CAAC,CAAC,EACvG,KAAK,CAAC,UAAU,CACjB,CAAA;AAEH,MAAM,aAAa,GAAG,CAAC,SAAiB,EAAU,EAAE,CAAC,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,SAAS,IAAI,CAAC,CAAA;AAElG,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,EAAE,UAAU,EAAQ,EAAU,EAAE,CACzD,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,aAAa,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAA;AAE5G,MAAM,cAAc,GAAG,CAAC,EAAE,MAAM,EAAE,UAAU,EAAQ,EAAU,EAAE,CAC9D,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC,GAAG,aAAa,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAA;AAE/F,MAAM,UAAU,GAAG,CAAC,IAAU,EAAY,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAA;AAE3G,MAAM,SAAS,GAAG,CAAC,IAAsB,EAAoC,EAAE,CAC7E,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAA;AAE1D,MAAM,OAAO,GAAG,CAAC,KAA0B,EAAU,EAAE;IACrD,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAA;IACrB,OAAO,KAAK,KAAK,SAAS;QACxB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAC5G,CAAC,CAAA;AAED,MAAM,OAAO,GAAG,CAAC,GAAQ,EAAU,EAAE,CACnC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CACxB,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,wBAAwB,GAAG,CAAC,IAAI,GAAG,CAAC,EACtE,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CACtB,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE;IAC3B,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,GAAG,CAAC,IAAI,EAAE;IACjC,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS,GAAG,CAAC,IAAI,EAAE;IAChC,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,SAAS,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,UAAU,IAAI,CAAC,MAAM,IAAI;CACjF,CAAC,CACH,EACD,KAAK,CAAC,UAAU,CACjB,CAAA;AAEH,MAAM,mBAAmB,GAAG,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAa,EAAe,EAAE;IACzF,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAA;IACrC,OAAO,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE;QAC/B,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAe,EAAE;YACvC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAA;YACrB,MAAM,QAAQ,GAAG,KAAK,KAAK,SAAS,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,OAAO,CAAA;YAC1E,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;YAC5B,MAAM,OAAO,GAAG,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,EAAE,CAAA;YACvD,OAAO;gBACL,OAAO,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,YAAY,IAAI,WAAW,CAAC,MAAM,CAAC,GAAG,OAAO,EAAE;gBAC5F,GAAG,SAAS,CAAC,KAAK,CAAC;aACpB,CAAA;QACH,CAAC;QACD,OAAO,EAAE,GAAgB,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,yCAAyC,EAAE,CAAC;QACpF,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,EAAe,EAAE;YAChC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;YAC5B,OAAO;gBACL,OAAO,EAAE,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,kCAAkC,KAAK,EAAE;gBACnG,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;aACvB,CAAA;QACH,CAAC;QACD,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,EAAe,EAAE,CAAC,CAAC;YACtC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC;YACpF,QAAQ,EAAE,UAAU,CAAC,IAAI,CAAC;SAC3B,CAAC;QACF,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAe,EAAE,CAAC,CAAC;YACjD,OAAO,EAAE,YAAY,IAAI,iCAAiC;YAC1D,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,QAAQ,EAAE;SACzC,CAAC;QACF,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,EAAe,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,WAAW,IAAI,iCAAiC,EAAE,CAAC;QAClG,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAe,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC;QACxG,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAe,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,qBAAqB,QAAQ,gCAAgC,EAAE,CAAC;QACjH,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,EAAe,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,KAAK,mCAAmC,EAAE,CAAC;QACjG,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,EAAe,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;KACpD,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,SAAoB,EAAE,KAA8B,EAAe,EAAE;IAC5F,MAAM,WAAW,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAA;IAClD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACzE,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,WAAW,EAAE,MAAM,EAAE,CAAA;AACxE,CAAC,CAAA;AAED,oHAAoH;AACpH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,SAAoB,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAe,EAAU,EAAE;IAC7F,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;IAC3C,OAAO,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,OAAO,EAAE,CAAA;AAChG,CAAC,CAAA"}
@@ -0,0 +1,8 @@
1
+ import { Effect, FileSystem, Path } from "effect";
2
+ import type { Report } from "./report.ts";
3
+ export interface PrettyOptions {
4
+ readonly root: string;
5
+ readonly color?: boolean;
6
+ }
7
+ export declare const pretty: (report: Report, options: PrettyOptions) => Effect.Effect<string, never, FileSystem.FileSystem | Path.Path>;
8
+ //# sourceMappingURL=pretty.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pretty.d.ts","sourceRoot":"","sources":["../../src/report/pretty.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAS,IAAI,EAAE,MAAM,QAAQ,CAAA;AAGxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CACzB;AAkHD,eAAO,MAAM,MAAM,EAAE,CACnB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,aAAa,KACnB,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAuBjE,CAAA"}
@@ -0,0 +1,89 @@
1
+ import { Effect, FileSystem, Match, Path } from "effect";
2
+ import { describe, pathText } from "./message.js";
3
+ const styles = (color) => {
4
+ const wrap = (code) => (text) => (color ? `\u001b[${code}m${text}\u001b[0m` : text);
5
+ return {
6
+ bold: wrap("1"),
7
+ dim: wrap("2"),
8
+ error: wrap("31"),
9
+ warning: wrap("33"),
10
+ info: wrap("36"),
11
+ pass: wrap("32"),
12
+ fail: wrap("31"),
13
+ };
14
+ };
15
+ const severityStyle = (style, severity) => Match.value(severity).pipe(Match.when("error", () => style.error), Match.when("warning", () => style.warning), Match.when("info", () => style.info), Match.exhaustive);
16
+ const count = (n, one, many) => `${n} ${n === 1 ? one : many}`;
17
+ const lineBreaks = (text) => text.replaceAll("\r\n", "\n").split("\n");
18
+ const indent = " ";
19
+ const snippet = (style, severity, line, column, source) => {
20
+ const number = String(line);
21
+ const text = source.replaceAll("\t", " ").trimEnd();
22
+ const gutter = style.dim(`${" ".repeat(number.length)} |`);
23
+ const caret = severityStyle(style, severity)("^");
24
+ return [
25
+ `${indent}${style.dim(`${number} |`)} ${text}`,
26
+ `${indent}${gutter} ${" ".repeat(Math.max(0, column - 1))}${caret}`,
27
+ ];
28
+ };
29
+ const entry = (style, { violation, description }, sources) => {
30
+ const { location, reason } = description;
31
+ const [first = "", ...rest] = lineBreaks(description.message);
32
+ const place = location === undefined
33
+ ? []
34
+ : [
35
+ location.path === pathText(violation.subject)
36
+ ? `${location.line}:${location.column}`
37
+ : `${location.path}:${location.line}:${location.column}`,
38
+ ];
39
+ const source = location === undefined ? undefined : sources.get(location.path)?.[location.line - 1];
40
+ const severity = severityStyle(style, violation.severity)(violation.severity);
41
+ return [
42
+ ` ${[...place, severity, style.dim(violation.ruleId), first].join(" ")}`,
43
+ ...rest.map((line) => `${indent}${line}`),
44
+ ...(location === undefined || source === undefined
45
+ ? []
46
+ : snippet(style, violation.severity, location.line, location.column, source)),
47
+ ...(reason === undefined ? [] : [`${indent}reason: ${reason}`]),
48
+ ];
49
+ };
50
+ /** Groups by subject in order of first appearance; findings keep their check order inside each group. */
51
+ const grouped = (findings) => {
52
+ const groups = new Map();
53
+ for (const finding of findings) {
54
+ const subject = pathText(finding.violation.subject);
55
+ groups.set(subject, [...(groups.get(subject) ?? []), finding]);
56
+ }
57
+ return Array.from(groups);
58
+ };
59
+ const summary = (style, report) => {
60
+ const { error, warning, info } = report.counts;
61
+ const total = report.violations.length;
62
+ const files = count(report.stats.files, "file", "files");
63
+ const dependencies = count(report.stats.dependencies, "dependency", "dependencies");
64
+ const verdict = Match.value(report.verdict).pipe(Match.when("pass", () => style.pass("pass")), Match.when("fail", () => style.fail("fail")), Match.exhaustive);
65
+ const breakdown = `${count(error, "error", "errors")}, ${count(warning, "warning", "warnings")}, ${info} info`;
66
+ const findings = total === 0 ? "No findings" : `${count(total, "finding", "findings")} (${breakdown})`;
67
+ return `${style.bold("Archer")}: ${verdict}. ${findings} in ${files} and ${dependencies}.`;
68
+ };
69
+ const notes = (style, report) => [
70
+ ...report.emptySubjects.map((id) => `${style.info("info")} rule ${id} selects no source files`),
71
+ ...report.emptyObjects.map((id) => `${style.info("info")} rule ${id} names files that do not exist`),
72
+ ...(report.suppressed === 0 ? [] : [`${count(report.suppressed, "finding", "findings")} accepted by the baseline`]),
73
+ ...(report.stale.length === 0
74
+ ? []
75
+ : [`${count(report.stale.length, "stale baseline entry matches", "stale baseline entries match")} no finding`]),
76
+ ];
77
+ export const pretty = Effect.fn("archer.pretty")(function* (report, options) {
78
+ const fileSystem = yield* FileSystem.FileSystem;
79
+ const path = yield* Path.Path;
80
+ const style = styles(options.color ?? false);
81
+ const findings = report.violations.map((violation) => ({ violation, description: describe(violation, report.rules) }));
82
+ const locations = Array.from(new Set(findings.flatMap(({ description }) => description.location?.path ?? [])));
83
+ const read = yield* Effect.forEach(locations, (location) => fileSystem.readFileString(path.join(options.root, location)).pipe(Effect.map((text) => [[location, lineBreaks(text)]]), Effect.orElseSucceed(() => [])), { concurrency: 8 });
84
+ const sources = new Map(read.flat());
85
+ const groups = grouped(findings).map(([subject, members]) => [style.bold(subject), ...members.flatMap((finding) => entry(style, finding, sources))].join("\n"));
86
+ const footer = [...notes(style, report), summary(style, report)].join("\n");
87
+ return [...groups, footer].join("\n\n");
88
+ });
89
+ //# sourceMappingURL=pretty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pretty.js","sourceRoot":"","sources":["../../src/report/pretty.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { Effect, type FileSystem, type Path, Schema } from "effect";
2
+ import type { Graph } from "../core/model.ts";
3
+ import { type PrettyOptions } from "./pretty.ts";
4
+ import type { Report } from "./report.ts";
5
+ export type Format = "pretty" | "agent" | "json" | "sarif" | "github" | "dot";
6
+ export declare const Format: Schema.Codec<Format>;
7
+ export type RenderOptions = PrettyOptions;
8
+ export declare const render: (format: Format, report: Report, graph: Graph, options: RenderOptions) => Effect.Effect<string, never, FileSystem.FileSystem | Path.Path>;
9
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/report/render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,UAAU,EAAS,KAAK,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC1E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAK7C,OAAO,EAAU,KAAK,aAAa,EAAE,MAAM,aAAa,CAAA;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAGzC,MAAM,MAAM,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAA;AAC7E,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAA0E,CAAA;AAElH,MAAM,MAAM,aAAa,GAAG,aAAa,CAAA;AAEzC,eAAO,MAAM,MAAM,WACT,MAAM,UACN,MAAM,SACP,KAAK,WACH,aAAa,KACrB,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAS9D,CAAA"}
@@ -0,0 +1,10 @@
1
+ import { Effect, Match, Schema } from "effect";
2
+ import { agent } from "./agent.js";
3
+ import { dot } from "./dot.js";
4
+ import { github } from "./github.js";
5
+ import { json } from "./json.js";
6
+ import { pretty } from "./pretty.js";
7
+ import { sarif } from "./sarif.js";
8
+ export const Format = Schema.Literals(["pretty", "agent", "json", "sarif", "github", "dot"]);
9
+ export const render = (format, report, graph, options) => Match.value(format).pipe(Match.when("pretty", () => pretty(report, options)), Match.when("agent", () => Effect.succeed(agent(report))), Match.when("json", () => Effect.succeed(json(report))), Match.when("sarif", () => Effect.succeed(sarif(report))), Match.when("github", () => Effect.succeed(github(report))), Match.when("dot", () => Effect.succeed(dot(graph))), Match.exhaustive);
10
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/report/render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAmB,KAAK,EAAa,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE1E,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,MAAM,EAAsB,MAAM,aAAa,CAAA;AAExD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAGlC,MAAM,CAAC,MAAM,MAAM,GAAyB,MAAM,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAA;AAIlH,MAAM,CAAC,MAAM,MAAM,GAAG,CACpB,MAAc,EACd,MAAc,EACd,KAAY,EACZ,OAAsB,EAC2C,EAAE,CACnE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CACtB,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACnD,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EACxD,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EACtD,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EACxD,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAC1D,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EACnD,KAAK,CAAC,UAAU,CACjB,CAAA"}