@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.
- package/README.md +145 -387
- package/dist/analyzer/Analyzer.d.ts +17 -0
- package/dist/analyzer/Analyzer.d.ts.map +1 -0
- package/dist/analyzer/Analyzer.js +15 -0
- package/dist/analyzer/Analyzer.js.map +1 -0
- package/dist/analyzer/bindings.d.ts +26 -0
- package/dist/analyzer/bindings.d.ts.map +1 -0
- package/dist/analyzer/bindings.js +61 -0
- package/dist/analyzer/bindings.js.map +1 -0
- package/dist/analyzer/errors.d.ts +34 -0
- package/dist/analyzer/errors.d.ts.map +1 -0
- package/dist/analyzer/errors.js +20 -0
- package/dist/analyzer/errors.js.map +1 -0
- package/dist/analyzer/graph-file.d.ts +13 -0
- package/dist/analyzer/graph-file.d.ts.map +1 -0
- package/dist/analyzer/graph-file.js +22 -0
- package/dist/analyzer/graph-file.js.map +1 -0
- package/dist/analyzer/paths.d.ts +12 -0
- package/dist/analyzer/paths.d.ts.map +1 -0
- package/dist/analyzer/paths.js +26 -0
- package/dist/analyzer/paths.js.map +1 -0
- package/dist/analyzer/server-exit.d.ts +19 -0
- package/dist/analyzer/server-exit.d.ts.map +1 -0
- package/dist/analyzer/server-exit.js +70 -0
- package/dist/analyzer/server-exit.js.map +1 -0
- package/dist/analyzer/source.d.ts +29 -0
- package/dist/analyzer/source.d.ts.map +1 -0
- package/dist/analyzer/source.js +58 -0
- package/dist/analyzer/source.js.map +1 -0
- package/dist/analyzer/syntax.d.ts +29 -0
- package/dist/analyzer/syntax.d.ts.map +1 -0
- package/dist/analyzer/syntax.js +226 -0
- package/dist/analyzer/syntax.js.map +1 -0
- package/dist/analyzer/targets.d.ts +26 -0
- package/dist/analyzer/targets.d.ts.map +1 -0
- package/dist/analyzer/targets.js +84 -0
- package/dist/analyzer/targets.js.map +1 -0
- package/dist/analyzer/typescript.d.ts +5 -0
- package/dist/analyzer/typescript.d.ts.map +1 -0
- package/dist/analyzer/typescript.js +221 -0
- package/dist/analyzer/typescript.js.map +1 -0
- package/dist/analyzer/workspace.d.ts +24 -0
- package/dist/analyzer/workspace.d.ts.map +1 -0
- package/dist/analyzer/workspace.js +9 -0
- package/dist/analyzer/workspace.js.map +1 -0
- package/dist/cli/explain.d.ts +3 -0
- package/dist/cli/explain.d.ts.map +1 -0
- package/dist/cli/explain.js +21 -0
- package/dist/cli/explain.js.map +1 -0
- package/dist/cli/main.d.ts +3 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +159 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/config/input.d.ts +59 -0
- package/dist/config/input.d.ts.map +1 -0
- package/dist/config/input.js +115 -0
- package/dist/config/input.js.map +1 -0
- package/dist/config/rules.d.ts +94 -0
- package/dist/config/rules.d.ts.map +1 -0
- package/dist/config/rules.js +130 -0
- package/dist/config/rules.js.map +1 -0
- package/dist/core/baseline.d.ts +16 -0
- package/dist/core/baseline.d.ts.map +1 -0
- package/dist/core/baseline.js +25 -0
- package/dist/core/baseline.js.map +1 -0
- package/dist/core/check.d.ts +16 -0
- package/dist/core/check.d.ts.map +1 -0
- package/dist/core/check.js +271 -0
- package/dist/core/check.js.map +1 -0
- package/dist/core/config.d.ts +72 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +78 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/fingerprint.d.ts +54 -0
- package/dist/core/fingerprint.d.ts.map +1 -0
- package/dist/core/fingerprint.js +182 -0
- package/dist/core/fingerprint.js.map +1 -0
- package/dist/core/keys.d.ts +10 -0
- package/dist/core/keys.d.ts.map +1 -0
- package/dist/core/keys.js +16 -0
- package/dist/core/keys.js.map +1 -0
- package/dist/core/lower.d.ts +13 -0
- package/dist/core/lower.d.ts.map +1 -0
- package/dist/core/lower.js +82 -0
- package/dist/core/lower.js.map +1 -0
- package/dist/core/model.d.ts +155 -0
- package/dist/core/model.d.ts.map +1 -0
- package/dist/core/model.js +116 -0
- package/dist/core/model.js.map +1 -0
- package/dist/core/pattern.d.ts +13 -0
- package/dist/core/pattern.d.ts.map +1 -0
- package/dist/core/pattern.js +29 -0
- package/dist/core/pattern.js.map +1 -0
- package/dist/core/reach.d.ts +10 -0
- package/dist/core/reach.d.ts.map +1 -0
- package/dist/core/reach.js +81 -0
- package/dist/core/reach.js.map +1 -0
- package/dist/core/rule.d.ts +200 -0
- package/dist/core/rule.d.ts.map +1 -0
- package/dist/core/rule.js +162 -0
- package/dist/core/rule.js.map +1 -0
- package/dist/core/selector.d.ts +7 -0
- package/dist/core/selector.d.ts.map +1 -0
- package/dist/core/selector.js +27 -0
- package/dist/core/selector.js.map +1 -0
- package/dist/core/structural.d.ts +10 -0
- package/dist/core/structural.d.ts.map +1 -0
- package/dist/core/structural.js +24 -0
- package/dist/core/structural.js.map +1 -0
- package/dist/core/text.d.ts +26 -0
- package/dist/core/text.d.ts.map +1 -0
- package/dist/core/text.js +144 -0
- package/dist/core/text.js.map +1 -0
- package/dist/effect.d.ts +19 -0
- package/dist/effect.d.ts.map +1 -0
- package/dist/effect.js +21 -0
- package/dist/effect.js.map +1 -0
- package/dist/index.d.ts +24 -44
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +59 -52
- package/dist/index.js.map +1 -0
- package/dist/report/agent.d.ts +3 -0
- package/dist/report/agent.d.ts.map +1 -0
- package/dist/report/agent.js +35 -0
- package/dist/report/agent.js.map +1 -0
- package/dist/report/dot.d.ts +4 -0
- package/dist/report/dot.d.ts.map +1 -0
- package/dist/report/dot.js +15 -0
- package/dist/report/dot.js.map +1 -0
- package/dist/report/github.d.ts +3 -0
- package/dist/report/github.d.ts.map +1 -0
- package/dist/report/github.js +18 -0
- package/dist/report/github.js.map +1 -0
- package/dist/report/json.d.ts +3 -0
- package/dist/report/json.d.ts.map +1 -0
- package/dist/report/json.js +4 -0
- package/dist/report/json.js.map +1 -0
- package/dist/report/message.d.ts +20 -0
- package/dist/report/message.d.ts.map +1 -0
- package/dist/report/message.js +73 -0
- package/dist/report/message.js.map +1 -0
- package/dist/report/pretty.d.ts +8 -0
- package/dist/report/pretty.d.ts.map +1 -0
- package/dist/report/pretty.js +89 -0
- package/dist/report/pretty.js.map +1 -0
- package/dist/report/render.d.ts +9 -0
- package/dist/report/render.d.ts.map +1 -0
- package/dist/report/render.js +10 -0
- package/dist/report/render.js.map +1 -0
- package/dist/report/report.d.ts +44 -0
- package/dist/report/report.d.ts.map +1 -0
- package/dist/report/report.js +49 -0
- package/dist/report/report.js.map +1 -0
- package/dist/report/sarif.d.ts +3 -0
- package/dist/report/sarif.d.ts.map +1 -0
- package/dist/report/sarif.js +68 -0
- package/dist/report/sarif.js.map +1 -0
- package/dist/run.d.ts +49 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +87 -0
- package/dist/run.js.map +1 -0
- package/dist/shell/baseline-file.d.ts +20 -0
- package/dist/shell/baseline-file.d.ts.map +1 -0
- package/dist/shell/baseline-file.js +46 -0
- package/dist/shell/baseline-file.js.map +1 -0
- package/dist/shell/load-config.d.ts +19 -0
- package/dist/shell/load-config.d.ts.map +1 -0
- package/dist/shell/load-config.js +39 -0
- package/dist/shell/load-config.js.map +1 -0
- package/package.json +29 -177
- package/skills/archer/SKILL.md +127 -45
- package/skills/archer/agents/openai.yaml +2 -2
- package/skills/archer/references/rules.md +267 -54
- package/dist/bun/plugin.cjs +0 -85
- package/dist/bun/plugin.d.cts +0 -7
- package/dist/bun/plugin.d.ts +0 -7
- package/dist/bun/plugin.js +0 -11
- package/dist/bun.cjs +0 -2238
- package/dist/bun.d.cts +0 -13
- package/dist/bun.d.ts +0 -13
- package/dist/bun.js +0 -28
- package/dist/chunk-2AKMBLHG.js +0 -2165
- package/dist/chunk-67YEOTXP.js +0 -25
- package/dist/chunk-IDVLHNL2.js +0 -46
- package/dist/chunk-ZZ6TR4PO.js +0 -201
- package/dist/cli.js +0 -2643
- package/dist/index.cjs +0 -2484
- package/dist/index.d.cts +0 -45
- package/dist/jest/plugin.cjs +0 -85
- package/dist/jest/plugin.d.cts +0 -7
- package/dist/jest/plugin.d.ts +0 -7
- package/dist/jest/plugin.js +0 -11
- package/dist/jest.cjs +0 -2237
- package/dist/jest.d.cts +0 -13
- package/dist/jest.d.ts +0 -13
- package/dist/jest.js +0 -27
- package/dist/matchers-Cqnbsyxe.d.cts +0 -11
- package/dist/matchers-Cqnbsyxe.d.ts +0 -11
- package/dist/node.cjs +0 -2237
- package/dist/node.d.cts +0 -13
- package/dist/node.d.ts +0 -13
- package/dist/node.js +0 -27
- package/dist/reporters-BbAXMpuW.d.cts +0 -6
- package/dist/reporters-xh-HQneS.d.ts +0 -6
- package/dist/suite-BwnPDCvU.d.cts +0 -337
- package/dist/suite-BwnPDCvU.d.ts +0 -337
- package/dist/vitest/plugin.cjs +0 -85
- package/dist/vitest/plugin.d.cts +0 -7
- package/dist/vitest/plugin.d.ts +0 -7
- package/dist/vitest/plugin.js +0 -11
- package/dist/vitest.cjs +0 -2531
- package/dist/vitest.d.cts +0 -37
- package/dist/vitest.d.ts +0 -37
- package/dist/vitest.js +0 -139
package/dist/index.d.ts
CHANGED
|
@@ -1,45 +1,25 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
readonly
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
declare
|
|
22
|
-
|
|
23
|
-
declare
|
|
24
|
-
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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":"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"}
|
|
@@ -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"}
|