@lepid-labs/weft-core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/anchors/__tests__/markdown.test.d.ts +2 -0
- package/dist/anchors/__tests__/markdown.test.d.ts.map +1 -0
- package/dist/anchors/__tests__/markdown.test.js +130 -0
- package/dist/anchors/__tests__/markdown.test.js.map +1 -0
- package/dist/anchors/__tests__/openapi.test.d.ts +2 -0
- package/dist/anchors/__tests__/openapi.test.d.ts.map +1 -0
- package/dist/anchors/__tests__/openapi.test.js +115 -0
- package/dist/anchors/__tests__/openapi.test.js.map +1 -0
- package/dist/anchors/index.d.ts +35 -0
- package/dist/anchors/index.d.ts.map +1 -0
- package/dist/anchors/index.js +68 -0
- package/dist/anchors/index.js.map +1 -0
- package/dist/anchors/markdown.d.ts +15 -0
- package/dist/anchors/markdown.d.ts.map +1 -0
- package/dist/anchors/markdown.js +71 -0
- package/dist/anchors/markdown.js.map +1 -0
- package/dist/anchors/openapi.d.ts +24 -0
- package/dist/anchors/openapi.d.ts.map +1 -0
- package/dist/anchors/openapi.js +75 -0
- package/dist/anchors/openapi.js.map +1 -0
- package/dist/browser.d.ts +10 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +8 -0
- package/dist/browser.js.map +1 -0
- package/dist/config.d.ts +47 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +393 -0
- package/dist/config.js.map +1 -0
- package/dist/config.test.d.ts +2 -0
- package/dist/config.test.d.ts.map +1 -0
- package/dist/config.test.js +454 -0
- package/dist/config.test.js.map +1 -0
- package/dist/content.d.ts +37 -0
- package/dist/content.d.ts.map +1 -0
- package/dist/content.js +57 -0
- package/dist/content.js.map +1 -0
- package/dist/content.test.d.ts +2 -0
- package/dist/content.test.d.ts.map +1 -0
- package/dist/content.test.js +100 -0
- package/dist/content.test.js.map +1 -0
- package/dist/contributions.d.ts +64 -0
- package/dist/contributions.d.ts.map +1 -0
- package/dist/contributions.js +184 -0
- package/dist/contributions.js.map +1 -0
- package/dist/contributions.test.d.ts +2 -0
- package/dist/contributions.test.d.ts.map +1 -0
- package/dist/contributions.test.js +202 -0
- package/dist/contributions.test.js.map +1 -0
- package/dist/fetch/auth.d.ts +15 -0
- package/dist/fetch/auth.d.ts.map +1 -0
- package/dist/fetch/auth.js +38 -0
- package/dist/fetch/auth.js.map +1 -0
- package/dist/fetch/cache.d.ts +25 -0
- package/dist/fetch/cache.d.ts.map +1 -0
- package/dist/fetch/cache.js +68 -0
- package/dist/fetch/cache.js.map +1 -0
- package/dist/fetch/cache.test.d.ts +2 -0
- package/dist/fetch/cache.test.d.ts.map +1 -0
- package/dist/fetch/cache.test.js +73 -0
- package/dist/fetch/cache.test.js.map +1 -0
- package/dist/fetch/clone.d.ts +26 -0
- package/dist/fetch/clone.d.ts.map +1 -0
- package/dist/fetch/clone.js +105 -0
- package/dist/fetch/clone.js.map +1 -0
- package/dist/fetch/fetch.test.d.ts +2 -0
- package/dist/fetch/fetch.test.d.ts.map +1 -0
- package/dist/fetch/fetch.test.js +167 -0
- package/dist/fetch/fetch.test.js.map +1 -0
- package/dist/fetch/resolve.d.ts +34 -0
- package/dist/fetch/resolve.d.ts.map +1 -0
- package/dist/fetch/resolve.js +59 -0
- package/dist/fetch/resolve.js.map +1 -0
- package/dist/freshness.d.ts +29 -0
- package/dist/freshness.d.ts.map +1 -0
- package/dist/freshness.js +170 -0
- package/dist/freshness.js.map +1 -0
- package/dist/freshness.test.d.ts +2 -0
- package/dist/freshness.test.d.ts.map +1 -0
- package/dist/freshness.test.js +209 -0
- package/dist/freshness.test.js.map +1 -0
- package/dist/frontmatter.d.ts +15 -0
- package/dist/frontmatter.d.ts.map +1 -0
- package/dist/frontmatter.js +24 -0
- package/dist/frontmatter.js.map +1 -0
- package/dist/frontmatter.test.d.ts +2 -0
- package/dist/frontmatter.test.d.ts.map +1 -0
- package/dist/frontmatter.test.js +54 -0
- package/dist/frontmatter.test.js.map +1 -0
- package/dist/git.d.ts +55 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +127 -0
- package/dist/git.js.map +1 -0
- package/dist/git.test.d.ts +2 -0
- package/dist/git.test.d.ts.map +1 -0
- package/dist/git.test.js +198 -0
- package/dist/git.test.js.map +1 -0
- package/dist/includes.d.ts +53 -0
- package/dist/includes.d.ts.map +1 -0
- package/dist/includes.js +73 -0
- package/dist/includes.js.map +1 -0
- package/dist/includes.test.d.ts +2 -0
- package/dist/includes.test.d.ts.map +1 -0
- package/dist/includes.test.js +106 -0
- package/dist/includes.test.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/links/__tests__/markdown.test.d.ts +2 -0
- package/dist/links/__tests__/markdown.test.d.ts.map +1 -0
- package/dist/links/__tests__/markdown.test.js +173 -0
- package/dist/links/__tests__/markdown.test.js.map +1 -0
- package/dist/links/__tests__/sidecar.test.d.ts +2 -0
- package/dist/links/__tests__/sidecar.test.d.ts.map +1 -0
- package/dist/links/__tests__/sidecar.test.js +238 -0
- package/dist/links/__tests__/sidecar.test.js.map +1 -0
- package/dist/links/index.d.ts +3 -0
- package/dist/links/index.d.ts.map +1 -0
- package/dist/links/index.js +3 -0
- package/dist/links/index.js.map +1 -0
- package/dist/links/markdown.d.ts +13 -0
- package/dist/links/markdown.d.ts.map +1 -0
- package/dist/links/markdown.js +93 -0
- package/dist/links/markdown.js.map +1 -0
- package/dist/links/sidecar.d.ts +12 -0
- package/dist/links/sidecar.d.ts.map +1 -0
- package/dist/links/sidecar.js +88 -0
- package/dist/links/sidecar.js.map +1 -0
- package/dist/manifest.d.ts +45 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +269 -0
- package/dist/manifest.js.map +1 -0
- package/dist/manifest.test.d.ts +2 -0
- package/dist/manifest.test.d.ts.map +1 -0
- package/dist/manifest.test.js +625 -0
- package/dist/manifest.test.js.map +1 -0
- package/dist/multi-repo.test.d.ts +2 -0
- package/dist/multi-repo.test.d.ts.map +1 -0
- package/dist/multi-repo.test.js +179 -0
- package/dist/multi-repo.test.js.map +1 -0
- package/dist/node-path.d.ts +13 -0
- package/dist/node-path.d.ts.map +1 -0
- package/dist/node-path.js +21 -0
- package/dist/node-path.js.map +1 -0
- package/dist/node-path.test.d.ts +2 -0
- package/dist/node-path.test.d.ts.map +1 -0
- package/dist/node-path.test.js +29 -0
- package/dist/node-path.test.js.map +1 -0
- package/dist/published-links.d.ts +16 -0
- package/dist/published-links.d.ts.map +1 -0
- package/dist/published-links.js +59 -0
- package/dist/published-links.js.map +1 -0
- package/dist/published-links.test.d.ts +2 -0
- package/dist/published-links.test.d.ts.map +1 -0
- package/dist/published-links.test.js +82 -0
- package/dist/published-links.test.js.map +1 -0
- package/dist/repos.d.ts +32 -0
- package/dist/repos.d.ts.map +1 -0
- package/dist/repos.js +46 -0
- package/dist/repos.js.map +1 -0
- package/dist/repos.test.d.ts +2 -0
- package/dist/repos.test.d.ts.map +1 -0
- package/dist/repos.test.js +61 -0
- package/dist/repos.test.js.map +1 -0
- package/dist/scalar-source.d.ts +15 -0
- package/dist/scalar-source.d.ts.map +1 -0
- package/dist/scalar-source.js +21 -0
- package/dist/scalar-source.js.map +1 -0
- package/dist/search.d.ts +14 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +59 -0
- package/dist/search.js.map +1 -0
- package/dist/service-concurrency.test.d.ts +2 -0
- package/dist/service-concurrency.test.d.ts.map +1 -0
- package/dist/service-concurrency.test.js +89 -0
- package/dist/service-concurrency.test.js.map +1 -0
- package/dist/service-history.test.d.ts +2 -0
- package/dist/service-history.test.d.ts.map +1 -0
- package/dist/service-history.test.js +76 -0
- package/dist/service-history.test.js.map +1 -0
- package/dist/service.d.ts +118 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +347 -0
- package/dist/service.js.map +1 -0
- package/dist/service.test.d.ts +2 -0
- package/dist/service.test.d.ts.map +1 -0
- package/dist/service.test.js +313 -0
- package/dist/service.test.js.map +1 -0
- package/dist/types.d.ts +403 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/validate/__tests__/artifacts.test.d.ts +2 -0
- package/dist/validate/__tests__/artifacts.test.d.ts.map +1 -0
- package/dist/validate/__tests__/artifacts.test.js +167 -0
- package/dist/validate/__tests__/artifacts.test.js.map +1 -0
- package/dist/validate/__tests__/assertions.test.d.ts +2 -0
- package/dist/validate/__tests__/assertions.test.d.ts.map +1 -0
- package/dist/validate/__tests__/assertions.test.js +254 -0
- package/dist/validate/__tests__/assertions.test.js.map +1 -0
- package/dist/validate/__tests__/duplicates.test.d.ts +2 -0
- package/dist/validate/__tests__/duplicates.test.d.ts.map +1 -0
- package/dist/validate/__tests__/duplicates.test.js +130 -0
- package/dist/validate/__tests__/duplicates.test.js.map +1 -0
- package/dist/validate/__tests__/edge-resolution.test.d.ts +2 -0
- package/dist/validate/__tests__/edge-resolution.test.d.ts.map +1 -0
- package/dist/validate/__tests__/edge-resolution.test.js +279 -0
- package/dist/validate/__tests__/edge-resolution.test.js.map +1 -0
- package/dist/validate/__tests__/history.test.d.ts +2 -0
- package/dist/validate/__tests__/history.test.d.ts.map +1 -0
- package/dist/validate/__tests__/history.test.js +93 -0
- package/dist/validate/__tests__/history.test.js.map +1 -0
- package/dist/validate/__tests__/includes.test.d.ts +2 -0
- package/dist/validate/__tests__/includes.test.d.ts.map +1 -0
- package/dist/validate/__tests__/includes.test.js +93 -0
- package/dist/validate/__tests__/includes.test.js.map +1 -0
- package/dist/validate/__tests__/registry.test.d.ts +2 -0
- package/dist/validate/__tests__/registry.test.d.ts.map +1 -0
- package/dist/validate/__tests__/registry.test.js +78 -0
- package/dist/validate/__tests__/registry.test.js.map +1 -0
- package/dist/validate/__tests__/run.test.d.ts +2 -0
- package/dist/validate/__tests__/run.test.d.ts.map +1 -0
- package/dist/validate/__tests__/run.test.js +215 -0
- package/dist/validate/__tests__/run.test.js.map +1 -0
- package/dist/validate/history.d.ts +23 -0
- package/dist/validate/history.d.ts.map +1 -0
- package/dist/validate/history.js +45 -0
- package/dist/validate/history.js.map +1 -0
- package/dist/validate/index.d.ts +10 -0
- package/dist/validate/index.d.ts.map +1 -0
- package/dist/validate/index.js +9 -0
- package/dist/validate/index.js.map +1 -0
- package/dist/validate/registry.d.ts +27 -0
- package/dist/validate/registry.d.ts.map +1 -0
- package/dist/validate/registry.js +67 -0
- package/dist/validate/registry.js.map +1 -0
- package/dist/validate/rules/artifacts.d.ts +25 -0
- package/dist/validate/rules/artifacts.d.ts.map +1 -0
- package/dist/validate/rules/artifacts.js +87 -0
- package/dist/validate/rules/artifacts.js.map +1 -0
- package/dist/validate/rules/assertions.d.ts +19 -0
- package/dist/validate/rules/assertions.d.ts.map +1 -0
- package/dist/validate/rules/assertions.js +149 -0
- package/dist/validate/rules/assertions.js.map +1 -0
- package/dist/validate/rules/duplicates.d.ts +20 -0
- package/dist/validate/rules/duplicates.d.ts.map +1 -0
- package/dist/validate/rules/duplicates.js +0 -0
- package/dist/validate/rules/duplicates.js.map +1 -0
- package/dist/validate/rules/edge-resolution.d.ts +15 -0
- package/dist/validate/rules/edge-resolution.d.ts.map +1 -0
- package/dist/validate/rules/edge-resolution.js +185 -0
- package/dist/validate/rules/edge-resolution.js.map +1 -0
- package/dist/validate/rules/includes.d.ts +21 -0
- package/dist/validate/rules/includes.d.ts.map +1 -0
- package/dist/validate/rules/includes.js +112 -0
- package/dist/validate/rules/includes.js.map +1 -0
- package/dist/validate/run.d.ts +20 -0
- package/dist/validate/run.d.ts.map +1 -0
- package/dist/validate/run.js +90 -0
- package/dist/validate/run.js.map +1 -0
- package/dist/validate/types.d.ts +101 -0
- package/dist/validate/types.d.ts.map +1 -0
- package/dist/validate/types.js +2 -0
- package/dist/validate/types.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.test.js","sourceRoot":"","sources":["../../../src/validate/__tests__/registry.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.test.d.ts","sourceRoot":"","sources":["../../../src/validate/__tests__/run.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { VALIDATOR_ERROR_RULE, ValidatorRegistry } from "../registry.js";
|
|
3
|
+
import { validateManifest } from "../run.js";
|
|
4
|
+
const RULE_A = { id: "rule-a", description: "Checks a", defaultSeverity: "error" };
|
|
5
|
+
const RULE_B = { id: "rule-b", description: "Checks b", defaultSeverity: "warn" };
|
|
6
|
+
const MANIFEST = {
|
|
7
|
+
version: 1,
|
|
8
|
+
nodes: [
|
|
9
|
+
{
|
|
10
|
+
id: "README.md",
|
|
11
|
+
type: "markdown",
|
|
12
|
+
title: "Readme",
|
|
13
|
+
anchors: [{ slug: "#intro", text: "Intro", line: 3, level: 2 }],
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
id: "api.yaml",
|
|
17
|
+
type: "openapi",
|
|
18
|
+
title: "API",
|
|
19
|
+
anchors: [{ slug: "#listUsers", text: "listUsers" }],
|
|
20
|
+
},
|
|
21
|
+
],
|
|
22
|
+
edges: [{ from: { node: "README.md" }, to: { node: "api.yaml" }, type: "references" }],
|
|
23
|
+
};
|
|
24
|
+
function config(overrides = {}) {
|
|
25
|
+
return {
|
|
26
|
+
rootDir: "/project",
|
|
27
|
+
docsDir: "docs",
|
|
28
|
+
entryPoint: "docs/README.md",
|
|
29
|
+
ignore: [],
|
|
30
|
+
...overrides,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/** A validator that reports one finding per declared rule. */
|
|
34
|
+
function reporting(rules, run) {
|
|
35
|
+
return {
|
|
36
|
+
rules,
|
|
37
|
+
run: run ??
|
|
38
|
+
(() => rules.map((rule) => ({
|
|
39
|
+
rule: rule.id,
|
|
40
|
+
message: `${rule.id} fired`,
|
|
41
|
+
target: { kind: "graph" },
|
|
42
|
+
}))),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
describe("validateManifest", () => {
|
|
46
|
+
it("collects findings from every registered validator", async () => {
|
|
47
|
+
const registry = new ValidatorRegistry()
|
|
48
|
+
.register(reporting([RULE_A]))
|
|
49
|
+
.register(reporting([RULE_B]));
|
|
50
|
+
const result = await validateManifest(MANIFEST, config(), registry);
|
|
51
|
+
expect(result.diagnostics.map((d) => d.rule)).toEqual(["rule-a", "rule-b"]);
|
|
52
|
+
});
|
|
53
|
+
it("stamps each diagnostic with the rule's default severity", async () => {
|
|
54
|
+
const registry = new ValidatorRegistry().register(reporting([RULE_A, RULE_B]));
|
|
55
|
+
const result = await validateManifest(MANIFEST, config(), registry);
|
|
56
|
+
expect(result.diagnostics.map((d) => [d.rule, d.severity])).toEqual([
|
|
57
|
+
["rule-a", "error"],
|
|
58
|
+
["rule-b", "warn"],
|
|
59
|
+
]);
|
|
60
|
+
});
|
|
61
|
+
it("carries a finding's message, target, hint and data through unchanged", async () => {
|
|
62
|
+
const finding = {
|
|
63
|
+
rule: RULE_A.id,
|
|
64
|
+
message: "something is wrong",
|
|
65
|
+
target: { kind: "node", node: "README.md", anchor: "#intro" },
|
|
66
|
+
hint: "try this instead",
|
|
67
|
+
data: { expected: 3 },
|
|
68
|
+
};
|
|
69
|
+
const registry = new ValidatorRegistry().register(reporting([RULE_A], () => [finding]));
|
|
70
|
+
const result = await validateManifest(MANIFEST, config(), registry);
|
|
71
|
+
expect(result.diagnostics[0]).toEqual({ ...finding, severity: "error" });
|
|
72
|
+
});
|
|
73
|
+
it("lets config override a rule's severity", async () => {
|
|
74
|
+
const registry = new ValidatorRegistry().register(reporting([RULE_A]));
|
|
75
|
+
const result = await validateManifest(MANIFEST, config({ rules: { "rule-a": "info" } }), registry);
|
|
76
|
+
expect(result.diagnostics[0].severity).toBe("info");
|
|
77
|
+
expect(result.rulesRun).toContain("rule-a");
|
|
78
|
+
});
|
|
79
|
+
it("drops the diagnostics of a rule configured off", async () => {
|
|
80
|
+
const registry = new ValidatorRegistry().register(reporting([RULE_A, RULE_B]));
|
|
81
|
+
const result = await validateManifest(MANIFEST, config({ rules: { "rule-a": "off" } }), registry);
|
|
82
|
+
expect(result.diagnostics.map((d) => d.rule)).toEqual(["rule-b"]);
|
|
83
|
+
expect(result.rulesSkipped).toEqual(["rule-a"]);
|
|
84
|
+
expect(result.rulesRun).toEqual([VALIDATOR_ERROR_RULE.id, "rule-b"]);
|
|
85
|
+
});
|
|
86
|
+
it("reports isEnabled as false for a rule configured off", async () => {
|
|
87
|
+
let seen;
|
|
88
|
+
const registry = new ValidatorRegistry().register(reporting([RULE_A, RULE_B], (context) => {
|
|
89
|
+
seen = context;
|
|
90
|
+
return [];
|
|
91
|
+
}));
|
|
92
|
+
await validateManifest(MANIFEST, config({ rules: { "rule-a": "off" } }), registry);
|
|
93
|
+
expect(seen?.isEnabled("rule-a")).toBe(false);
|
|
94
|
+
expect(seen?.isEnabled("rule-b")).toBe(true);
|
|
95
|
+
});
|
|
96
|
+
it("does not run a validator whose every rule is off", async () => {
|
|
97
|
+
let ran = false;
|
|
98
|
+
const registry = new ValidatorRegistry().register(reporting([RULE_A], () => {
|
|
99
|
+
ran = true;
|
|
100
|
+
return [];
|
|
101
|
+
}));
|
|
102
|
+
await validateManifest(MANIFEST, config({ rules: { "rule-a": "off" } }), registry);
|
|
103
|
+
expect(ran).toBe(false);
|
|
104
|
+
});
|
|
105
|
+
it("awaits an async validator", async () => {
|
|
106
|
+
const registry = new ValidatorRegistry().register(reporting([RULE_A], async () => [
|
|
107
|
+
{ rule: RULE_A.id, message: "async finding", target: { kind: "graph" } },
|
|
108
|
+
]));
|
|
109
|
+
const result = await validateManifest(MANIFEST, config(), registry);
|
|
110
|
+
expect(result.diagnostics.map((d) => d.message)).toEqual(["async finding"]);
|
|
111
|
+
});
|
|
112
|
+
it("tallies counts per severity", async () => {
|
|
113
|
+
const registry = new ValidatorRegistry().register(reporting([RULE_A, RULE_B], () => [
|
|
114
|
+
{ rule: RULE_A.id, message: "one", target: { kind: "graph" } },
|
|
115
|
+
{ rule: RULE_A.id, message: "two", target: { kind: "graph" } },
|
|
116
|
+
{ rule: RULE_B.id, message: "three", target: { kind: "graph" } },
|
|
117
|
+
]));
|
|
118
|
+
const result = await validateManifest(MANIFEST, config(), registry);
|
|
119
|
+
expect(result.counts).toEqual({ error: 2, warn: 1, info: 0 });
|
|
120
|
+
});
|
|
121
|
+
it("reports a throwing validator as a diagnostic and keeps going", async () => {
|
|
122
|
+
const registry = new ValidatorRegistry()
|
|
123
|
+
.register(reporting([RULE_A], () => {
|
|
124
|
+
throw new Error("boom");
|
|
125
|
+
}))
|
|
126
|
+
.register(reporting([RULE_B]));
|
|
127
|
+
const result = await validateManifest(MANIFEST, config(), registry);
|
|
128
|
+
expect(result.diagnostics.map((d) => d.rule)).toEqual([VALIDATOR_ERROR_RULE.id, "rule-b"]);
|
|
129
|
+
expect(result.diagnostics[0].severity).toBe("error");
|
|
130
|
+
expect(result.diagnostics[0].message).toContain("boom");
|
|
131
|
+
expect(result.diagnostics[0].message).toContain("rule-a");
|
|
132
|
+
});
|
|
133
|
+
it("honours validator-error being configured off", async () => {
|
|
134
|
+
const registry = new ValidatorRegistry().register(reporting([RULE_A], () => {
|
|
135
|
+
throw new Error("boom");
|
|
136
|
+
}));
|
|
137
|
+
const result = await validateManifest(MANIFEST, config({ rules: { "validator-error": "off" } }), registry);
|
|
138
|
+
expect(result.diagnostics).toEqual([]);
|
|
139
|
+
expect(result.rulesSkipped).toEqual([VALIDATOR_ERROR_RULE.id]);
|
|
140
|
+
});
|
|
141
|
+
it("throws when a validator reports a rule it does not declare", async () => {
|
|
142
|
+
const registry = new ValidatorRegistry().register(reporting([RULE_A], () => [{ rule: "rule-b", message: "stray", target: { kind: "graph" } }]));
|
|
143
|
+
await expect(validateManifest(MANIFEST, config(), registry)).rejects.toThrow(/reported rule "rule-b", which it does not declare/);
|
|
144
|
+
});
|
|
145
|
+
it("exposes the manifest's nodes by id in the context", async () => {
|
|
146
|
+
let seen;
|
|
147
|
+
const registry = new ValidatorRegistry().register(reporting([RULE_A], (context) => {
|
|
148
|
+
seen = context;
|
|
149
|
+
return [];
|
|
150
|
+
}));
|
|
151
|
+
await validateManifest(MANIFEST, config(), registry);
|
|
152
|
+
expect([...(seen?.nodes.keys() ?? [])]).toEqual(["README.md", "api.yaml"]);
|
|
153
|
+
expect(seen?.nodes.get("api.yaml")?.title).toBe("API");
|
|
154
|
+
expect(seen?.manifest).toBe(MANIFEST);
|
|
155
|
+
});
|
|
156
|
+
it("reports config rule ids that no validator declares", async () => {
|
|
157
|
+
const registry = new ValidatorRegistry().register(reporting([RULE_A]));
|
|
158
|
+
const result = await validateManifest(MANIFEST, config({ rules: { "rule-a": "warn", "not-a-rule": "off" } }), registry);
|
|
159
|
+
expect(result.unknownRules).toEqual(["not-a-rule"]);
|
|
160
|
+
expect(result.diagnostics.map((d) => d.severity)).toEqual(["warn"]);
|
|
161
|
+
});
|
|
162
|
+
it("finds nothing with the default registry, which has no checks yet", async () => {
|
|
163
|
+
const result = await validateManifest(MANIFEST, config());
|
|
164
|
+
expect(result.diagnostics).toEqual([]);
|
|
165
|
+
expect(result.counts).toEqual({ error: 0, warn: 0, info: 0 });
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
describe("validateManifest (git history)", () => {
|
|
169
|
+
/** Capture the history a validator was handed. */
|
|
170
|
+
function watching(rules, needsHistory) {
|
|
171
|
+
const seen = [];
|
|
172
|
+
const validator = {
|
|
173
|
+
rules,
|
|
174
|
+
needsHistory,
|
|
175
|
+
run: (context) => {
|
|
176
|
+
seen.push(context.history);
|
|
177
|
+
return [];
|
|
178
|
+
},
|
|
179
|
+
};
|
|
180
|
+
return { validator, seen };
|
|
181
|
+
}
|
|
182
|
+
it("hands a validator that wants history an object it can read", async () => {
|
|
183
|
+
const { validator, seen } = watching([RULE_A], true);
|
|
184
|
+
await validateManifest(MANIFEST, config(), new ValidatorRegistry().register(validator));
|
|
185
|
+
// /project is not a repository, so it is empty — but never absent, since a
|
|
186
|
+
// check must be able to read it without guarding first.
|
|
187
|
+
expect(seen[0].blobs.size).toBe(0);
|
|
188
|
+
expect(seen[0].renames.size).toBe(0);
|
|
189
|
+
});
|
|
190
|
+
it("hands the same empty history to a validator that does not want it", async () => {
|
|
191
|
+
const { validator, seen } = watching([RULE_A], false);
|
|
192
|
+
await validateManifest(MANIFEST, config(), new ValidatorRegistry().register(validator));
|
|
193
|
+
expect(seen[0].blobs.size).toBe(0);
|
|
194
|
+
});
|
|
195
|
+
it("hands a validator a precomputed history instead of walking git", async () => {
|
|
196
|
+
const { validator, seen } = watching([RULE_A], true);
|
|
197
|
+
const precomputed = {
|
|
198
|
+
blobs: new Map([["README.md", new Set(["a".repeat(40)])]]),
|
|
199
|
+
renames: new Map([["old.md", "README.md"]]),
|
|
200
|
+
};
|
|
201
|
+
await validateManifest(MANIFEST, config(), new ValidatorRegistry().register(validator), precomputed);
|
|
202
|
+
expect(seen[0]).toBe(precomputed);
|
|
203
|
+
});
|
|
204
|
+
it("does not gather history when every rule that wants it is off", async () => {
|
|
205
|
+
// Reading git is the only IO validation does, so a project running without
|
|
206
|
+
// the history-based checks should pay for no subprocess at all.
|
|
207
|
+
const { validator, seen } = watching([RULE_A], true);
|
|
208
|
+
const plain = watching([RULE_B], false);
|
|
209
|
+
const result = await validateManifest(MANIFEST, config({ rules: { "rule-a": "off" } }), new ValidatorRegistry().register(validator).register(plain.validator));
|
|
210
|
+
expect(seen).toHaveLength(0);
|
|
211
|
+
expect(result.rulesSkipped).toEqual(["rule-a"]);
|
|
212
|
+
expect(plain.seen[0].blobs.size).toBe(0);
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
//# sourceMappingURL=run.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.test.js","sourceRoot":"","sources":["../../../src/validate/__tests__/run.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type DocsRoot } from "../config.js";
|
|
2
|
+
import { type FileHistory } from "../git.js";
|
|
3
|
+
import type { WeftConfig } from "../types.js";
|
|
4
|
+
import type { GraphHistory } from "./types.js";
|
|
5
|
+
/** A history that knows nothing, for when git cannot answer or nothing asked. */
|
|
6
|
+
export declare const NO_HISTORY: GraphHistory;
|
|
7
|
+
/**
|
|
8
|
+
* Combine per-root walks into one graph-wide history, translated into node ids.
|
|
9
|
+
*
|
|
10
|
+
* Namespacing happens here, once, rather than in each check: git reports paths
|
|
11
|
+
* relative to the root it was run in, and a multi-project graph identifies the
|
|
12
|
+
* same file as `alpha/guide.md`. A check comparing raw paths would silently
|
|
13
|
+
* conflate two projects' identically named documents.
|
|
14
|
+
*/
|
|
15
|
+
export declare function graphHistoryFrom(walks: Iterable<[DocsRoot, FileHistory]>): GraphHistory;
|
|
16
|
+
/**
|
|
17
|
+
* Gather what git knows about every docs root, walking each root's history.
|
|
18
|
+
*
|
|
19
|
+
* The service shares an already-paid walk via {@link graphHistoryFrom}
|
|
20
|
+
* instead; this stands alone for callers that have nothing to share.
|
|
21
|
+
*/
|
|
22
|
+
export declare function graphHistory(config: WeftConfig): Promise<GraphHistory>;
|
|
23
|
+
//# sourceMappingURL=history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/validate/history.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAA+B,MAAM,cAAc,CAAC;AAC1E,OAAO,EAAE,KAAK,WAAW,EAAe,MAAM,WAAW,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,iFAAiF;AACjF,eAAO,MAAM,UAAU,EAAE,YAAuD,CAAC;AAEjF;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,GAAG,YAAY,CAkBvF;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CAM5E"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { nodeIdFor, resolveDocsRoots } from "../config.js";
|
|
2
|
+
import { fileHistory } from "../git.js";
|
|
3
|
+
/** A history that knows nothing, for when git cannot answer or nothing asked. */
|
|
4
|
+
export const NO_HISTORY = { blobs: new Map(), renames: new Map() };
|
|
5
|
+
/**
|
|
6
|
+
* Combine per-root walks into one graph-wide history, translated into node ids.
|
|
7
|
+
*
|
|
8
|
+
* Namespacing happens here, once, rather than in each check: git reports paths
|
|
9
|
+
* relative to the root it was run in, and a multi-project graph identifies the
|
|
10
|
+
* same file as `alpha/guide.md`. A check comparing raw paths would silently
|
|
11
|
+
* conflate two projects' identically named documents.
|
|
12
|
+
*/
|
|
13
|
+
export function graphHistoryFrom(walks) {
|
|
14
|
+
const blobs = new Map();
|
|
15
|
+
const renames = new Map();
|
|
16
|
+
for (const [root, history] of walks) {
|
|
17
|
+
for (const [path, held] of history.blobs) {
|
|
18
|
+
const id = nodeIdFor(root, path);
|
|
19
|
+
const existing = blobs.get(id);
|
|
20
|
+
if (existing)
|
|
21
|
+
for (const blob of held)
|
|
22
|
+
existing.add(blob);
|
|
23
|
+
else
|
|
24
|
+
blobs.set(id, new Set(held));
|
|
25
|
+
}
|
|
26
|
+
for (const [from, to] of history.renames) {
|
|
27
|
+
renames.set(nodeIdFor(root, from), nodeIdFor(root, to));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return { blobs, renames };
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Gather what git knows about every docs root, walking each root's history.
|
|
34
|
+
*
|
|
35
|
+
* The service shares an already-paid walk via {@link graphHistoryFrom}
|
|
36
|
+
* instead; this stands alone for callers that have nothing to share.
|
|
37
|
+
*/
|
|
38
|
+
export async function graphHistory(config) {
|
|
39
|
+
const walks = [];
|
|
40
|
+
for (const root of resolveDocsRoots(config)) {
|
|
41
|
+
walks.push([root, await fileHistory(root.absDir)]);
|
|
42
|
+
}
|
|
43
|
+
return graphHistoryFrom(walks);
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/validate/history.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,SAAS,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,EAAoB,WAAW,EAAE,MAAM,WAAW,CAAC;AAI1D,iFAAiF;AACjF,MAAM,CAAC,MAAM,UAAU,GAAiB,EAAE,KAAK,EAAE,IAAI,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;AAEjF;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAwC;IACxE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC7C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE1C,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,KAAK,EAAE,CAAC;QACrC,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAC1C,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACjC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC/B,IAAI,QAAQ;gBAAE,KAAK,MAAM,IAAI,IAAI,IAAI;oBAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;;gBACrD,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QACnC,CAAC;QAED,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;QACzD,CAAC;IACF,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC3B,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAkB;IACpD,MAAM,KAAK,GAA8B,EAAE,CAAC;IAC5C,KAAK,MAAM,IAAI,IAAI,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,MAAM,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { VALIDATOR_ERROR_RULE, ValidatorRegistry, defaultRegistry } from "./registry.js";
|
|
2
|
+
export { ARTIFACT_SOURCE_UNRECORDED, ARTIFACT_STALE, DERIVES_FROM, artifactValidator, } from "./rules/artifacts.js";
|
|
3
|
+
export { NODE_DIVERGED, NODE_DUPLICATE, duplicateValidator } from "./rules/duplicates.js";
|
|
4
|
+
export { INCLUDE_CYCLE, includeValidator } from "./rules/includes.js";
|
|
5
|
+
export { NO_HISTORY, graphHistory, graphHistoryFrom } from "./history.js";
|
|
6
|
+
export { ASSERT_LINE_COUNT_MISMATCH, ASSERT_MODIFIED_MISMATCH, ASSERT_UNVERIFIABLE, ASSERT_VERSION_MISMATCH, assertionValidator, } from "./rules/assertions.js";
|
|
7
|
+
export { EDGE_ANCHOR_MISSING, EDGE_PENDING, EDGE_PENDING_RESOLVED, EDGE_SOURCE_ANCHOR_MISSING, EDGE_TARGET_MISSING, edgeResolutionValidator, } from "./rules/edge-resolution.js";
|
|
8
|
+
export { registryWantsHistory, validateManifest } from "./run.js";
|
|
9
|
+
export type { Diagnostic, DiagnosticTarget, Finding, GraphHistory, Rule, ValidationContext, ValidationResult, Validator, } from "./types.js";
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validate/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACzF,OAAO,EACN,0BAA0B,EAC1B,cAAc,EACd,YAAY,EACZ,iBAAiB,GACjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,EACN,0BAA0B,EAC1B,wBAAwB,EACxB,mBAAmB,EACnB,uBAAuB,EACvB,kBAAkB,GAClB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACN,mBAAmB,EACnB,YAAY,EACZ,qBAAqB,EACrB,0BAA0B,EAC1B,mBAAmB,EACnB,uBAAuB,GACvB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAClE,YAAY,EACX,UAAU,EACV,gBAAgB,EAChB,OAAO,EACP,YAAY,EACZ,IAAI,EACJ,iBAAiB,EACjB,gBAAgB,EAChB,SAAS,GACT,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { VALIDATOR_ERROR_RULE, ValidatorRegistry, defaultRegistry } from "./registry.js";
|
|
2
|
+
export { ARTIFACT_SOURCE_UNRECORDED, ARTIFACT_STALE, DERIVES_FROM, artifactValidator, } from "./rules/artifacts.js";
|
|
3
|
+
export { NODE_DIVERGED, NODE_DUPLICATE, duplicateValidator } from "./rules/duplicates.js";
|
|
4
|
+
export { INCLUDE_CYCLE, includeValidator } from "./rules/includes.js";
|
|
5
|
+
export { NO_HISTORY, graphHistory, graphHistoryFrom } from "./history.js";
|
|
6
|
+
export { ASSERT_LINE_COUNT_MISMATCH, ASSERT_MODIFIED_MISMATCH, ASSERT_UNVERIFIABLE, ASSERT_VERSION_MISMATCH, assertionValidator, } from "./rules/assertions.js";
|
|
7
|
+
export { EDGE_ANCHOR_MISSING, EDGE_PENDING, EDGE_PENDING_RESOLVED, EDGE_SOURCE_ANCHOR_MISSING, EDGE_TARGET_MISSING, edgeResolutionValidator, } from "./rules/edge-resolution.js";
|
|
8
|
+
export { registryWantsHistory, validateManifest } from "./run.js";
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/validate/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACzF,OAAO,EACN,0BAA0B,EAC1B,cAAc,EACd,YAAY,EACZ,iBAAiB,GACjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,EACN,0BAA0B,EAC1B,wBAAwB,EACxB,mBAAmB,EACnB,uBAAuB,EACvB,kBAAkB,GAClB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACN,mBAAmB,EACnB,YAAY,EACZ,qBAAqB,EACrB,0BAA0B,EAC1B,mBAAmB,EACnB,uBAAuB,GACvB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Rule, Validator } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Reported when a validator throws. Owned by the runner rather than any
|
|
4
|
+
* validator, so it is always present and always configurable — a project that
|
|
5
|
+
* knowingly runs a flaky third-party check can set it to "warn".
|
|
6
|
+
*/
|
|
7
|
+
export declare const VALIDATOR_ERROR_RULE: Rule;
|
|
8
|
+
/**
|
|
9
|
+
* The set of checks a validation run executes. Checks are registered rather
|
|
10
|
+
* than hardcoded so they can be added by later features and by external tools
|
|
11
|
+
* without editing the runner.
|
|
12
|
+
*/
|
|
13
|
+
export declare class ValidatorRegistry {
|
|
14
|
+
private readonly registered;
|
|
15
|
+
private readonly byRuleId;
|
|
16
|
+
/** Register a validator. Throws if it declares no rules, or a rule id already taken. */
|
|
17
|
+
register(validator: Validator): this;
|
|
18
|
+
/** Every registered validator, in registration order. */
|
|
19
|
+
get validators(): Validator[];
|
|
20
|
+
/** Every known rule, including the reserved ones the runner emits. */
|
|
21
|
+
get rules(): Rule[];
|
|
22
|
+
/** Look up a rule by id, or undefined if no validator declares it. */
|
|
23
|
+
rule(id: string): Rule | undefined;
|
|
24
|
+
}
|
|
25
|
+
/** A fresh registry holding the built-in checks. */
|
|
26
|
+
export declare function defaultRegistry(): ValidatorRegistry;
|
|
27
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/validate/registry.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAElD;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,IAIlC,CAAC;AAKF;;;;GAIG;AACH,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAmB;IAC9C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwE;IAEjG,wFAAwF;IACxF,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAkBpC,yDAAyD;IACzD,IAAI,UAAU,IAAI,SAAS,EAAE,CAE5B;IAED,sEAAsE;IACtE,IAAI,KAAK,IAAI,IAAI,EAAE,CAElB;IAED,sEAAsE;IACtE,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;CAGlC;AAED,oDAAoD;AACpD,wBAAgB,eAAe,IAAI,iBAAiB,CAOnD"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { artifactValidator } from "./rules/artifacts.js";
|
|
2
|
+
import { assertionValidator } from "./rules/assertions.js";
|
|
3
|
+
import { duplicateValidator } from "./rules/duplicates.js";
|
|
4
|
+
import { edgeResolutionValidator } from "./rules/edge-resolution.js";
|
|
5
|
+
import { includeValidator } from "./rules/includes.js";
|
|
6
|
+
/**
|
|
7
|
+
* Reported when a validator throws. Owned by the runner rather than any
|
|
8
|
+
* validator, so it is always present and always configurable — a project that
|
|
9
|
+
* knowingly runs a flaky third-party check can set it to "warn".
|
|
10
|
+
*/
|
|
11
|
+
export const VALIDATOR_ERROR_RULE = {
|
|
12
|
+
id: "validator-error",
|
|
13
|
+
description: "A validator threw while running",
|
|
14
|
+
defaultSeverity: "error",
|
|
15
|
+
};
|
|
16
|
+
/** Rules the runner itself emits. Always registered, cannot be redeclared. */
|
|
17
|
+
const RESERVED_RULES = [VALIDATOR_ERROR_RULE];
|
|
18
|
+
/**
|
|
19
|
+
* The set of checks a validation run executes. Checks are registered rather
|
|
20
|
+
* than hardcoded so they can be added by later features and by external tools
|
|
21
|
+
* without editing the runner.
|
|
22
|
+
*/
|
|
23
|
+
export class ValidatorRegistry {
|
|
24
|
+
registered = [];
|
|
25
|
+
byRuleId = new Map(RESERVED_RULES.map((rule) => [rule.id, rule]));
|
|
26
|
+
/** Register a validator. Throws if it declares no rules, or a rule id already taken. */
|
|
27
|
+
register(validator) {
|
|
28
|
+
if (!validator.rules.length) {
|
|
29
|
+
throw new Error("weft validate: a validator must declare at least one rule");
|
|
30
|
+
}
|
|
31
|
+
// Check every id before committing any, so a rejected validator leaves no
|
|
32
|
+
// half-registered rules behind.
|
|
33
|
+
const incoming = new Set();
|
|
34
|
+
for (const rule of validator.rules) {
|
|
35
|
+
if (this.byRuleId.has(rule.id) || incoming.has(rule.id)) {
|
|
36
|
+
throw new Error(`weft validate: duplicate rule id "${rule.id}"`);
|
|
37
|
+
}
|
|
38
|
+
incoming.add(rule.id);
|
|
39
|
+
}
|
|
40
|
+
for (const rule of validator.rules)
|
|
41
|
+
this.byRuleId.set(rule.id, rule);
|
|
42
|
+
this.registered.push(validator);
|
|
43
|
+
return this;
|
|
44
|
+
}
|
|
45
|
+
/** Every registered validator, in registration order. */
|
|
46
|
+
get validators() {
|
|
47
|
+
return [...this.registered];
|
|
48
|
+
}
|
|
49
|
+
/** Every known rule, including the reserved ones the runner emits. */
|
|
50
|
+
get rules() {
|
|
51
|
+
return [...this.byRuleId.values()];
|
|
52
|
+
}
|
|
53
|
+
/** Look up a rule by id, or undefined if no validator declares it. */
|
|
54
|
+
rule(id) {
|
|
55
|
+
return this.byRuleId.get(id);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/** A fresh registry holding the built-in checks. */
|
|
59
|
+
export function defaultRegistry() {
|
|
60
|
+
return new ValidatorRegistry()
|
|
61
|
+
.register(edgeResolutionValidator)
|
|
62
|
+
.register(assertionValidator)
|
|
63
|
+
.register(artifactValidator)
|
|
64
|
+
.register(duplicateValidator)
|
|
65
|
+
.register(includeValidator);
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/validate/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGvD;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAS;IACzC,EAAE,EAAE,iBAAiB;IACrB,WAAW,EAAE,iCAAiC;IAC9C,eAAe,EAAE,OAAO;CACxB,CAAC;AAEF,8EAA8E;AAC9E,MAAM,cAAc,GAAW,CAAC,oBAAoB,CAAC,CAAC;AAEtD;;;;GAIG;AACH,MAAM,OAAO,iBAAiB;IACZ,UAAU,GAAgB,EAAE,CAAC;IAC7B,QAAQ,GAAG,IAAI,GAAG,CAAe,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAEjG,wFAAwF;IACxF,QAAQ,CAAC,SAAoB;QAC5B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC9E,CAAC;QACD,0EAA0E;QAC1E,gCAAgC;QAChC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;QACnC,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;YACpC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;gBACzD,MAAM,IAAI,KAAK,CAAC,qCAAqC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;YAClE,CAAC;YACD,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvB,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,KAAK;YAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACrE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC;IACb,CAAC;IAED,yDAAyD;IACzD,IAAI,UAAU;QACb,OAAO,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;IAC7B,CAAC;IAED,sEAAsE;IACtE,IAAI,KAAK;QACR,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,sEAAsE;IACtE,IAAI,CAAC,EAAU;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;CACD;AAED,oDAAoD;AACpD,MAAM,UAAU,eAAe;IAC9B,OAAO,IAAI,iBAAiB,EAAE;SAC5B,QAAQ,CAAC,uBAAuB,CAAC;SACjC,QAAQ,CAAC,kBAAkB,CAAC;SAC5B,QAAQ,CAAC,iBAAiB,CAAC;SAC3B,QAAQ,CAAC,kBAAkB,CAAC;SAC5B,QAAQ,CAAC,gBAAgB,CAAC,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Rule, Validator } from "../types.js";
|
|
2
|
+
export declare const ARTIFACT_STALE: Rule;
|
|
3
|
+
export declare const ARTIFACT_SOURCE_UNRECORDED: Rule;
|
|
4
|
+
/**
|
|
5
|
+
* The edge type that means "this was generated from that".
|
|
6
|
+
*
|
|
7
|
+
* A convention rather than a new mechanism — any string has always been a valid
|
|
8
|
+
* edge type. What it gains here is defined semantics: an edge of this type is
|
|
9
|
+
* the thing staleness is checked over.
|
|
10
|
+
*/
|
|
11
|
+
export declare const DERIVES_FROM = "derives-from";
|
|
12
|
+
/**
|
|
13
|
+
* Report generated outputs that have fallen behind their sources.
|
|
14
|
+
*
|
|
15
|
+
* The comparison is against the source hash recorded when the artifact was
|
|
16
|
+
* built, never against a modification time. Git preserves no mtimes, so a fresh
|
|
17
|
+
* clone or a CI checkout makes every file look simultaneously modified — the
|
|
18
|
+
* check would be meaningless in exactly the environment it should run in.
|
|
19
|
+
*
|
|
20
|
+
* An artifact with several sources has several `derives-from` edges and each is
|
|
21
|
+
* checked on its own, because a stylesheet or a template change invalidates an
|
|
22
|
+
* output just as surely as an edit to its document does.
|
|
23
|
+
*/
|
|
24
|
+
export declare const artifactValidator: Validator;
|
|
25
|
+
//# sourceMappingURL=artifacts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifacts.d.ts","sourceRoot":"","sources":["../../../src/validate/rules/artifacts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,IAAI,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE5D,eAAO,MAAM,cAAc,EAAE,IAM5B,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,IAOxC,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,iBAAiB,CAAC;AAE3C;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,iBAAiB,EAAE,SAuD/B,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
export const ARTIFACT_STALE = {
|
|
2
|
+
id: "artifact-stale",
|
|
3
|
+
description: "A generated output no longer reflects the source it was built from",
|
|
4
|
+
// The artifact is usually the copy that reaches the reader who matters most,
|
|
5
|
+
// and the one nobody looks at again after building it.
|
|
6
|
+
defaultSeverity: "error",
|
|
7
|
+
};
|
|
8
|
+
export const ARTIFACT_SOURCE_UNRECORDED = {
|
|
9
|
+
id: "artifact-source-unrecorded",
|
|
10
|
+
description: "A derives-from edge records no source hash, so staleness cannot be checked",
|
|
11
|
+
// Info rather than warn: `derives-from` is also a reasonable way to express a
|
|
12
|
+
// relationship without asking for it to be checked, and warning on every such
|
|
13
|
+
// edge would punish plain modelling.
|
|
14
|
+
defaultSeverity: "info",
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* The edge type that means "this was generated from that".
|
|
18
|
+
*
|
|
19
|
+
* A convention rather than a new mechanism — any string has always been a valid
|
|
20
|
+
* edge type. What it gains here is defined semantics: an edge of this type is
|
|
21
|
+
* the thing staleness is checked over.
|
|
22
|
+
*/
|
|
23
|
+
export const DERIVES_FROM = "derives-from";
|
|
24
|
+
/**
|
|
25
|
+
* Report generated outputs that have fallen behind their sources.
|
|
26
|
+
*
|
|
27
|
+
* The comparison is against the source hash recorded when the artifact was
|
|
28
|
+
* built, never against a modification time. Git preserves no mtimes, so a fresh
|
|
29
|
+
* clone or a CI checkout makes every file look simultaneously modified — the
|
|
30
|
+
* check would be meaningless in exactly the environment it should run in.
|
|
31
|
+
*
|
|
32
|
+
* An artifact with several sources has several `derives-from` edges and each is
|
|
33
|
+
* checked on its own, because a stylesheet or a template change invalidates an
|
|
34
|
+
* output just as surely as an edit to its document does.
|
|
35
|
+
*/
|
|
36
|
+
export const artifactValidator = {
|
|
37
|
+
rules: [ARTIFACT_STALE, ARTIFACT_SOURCE_UNRECORDED],
|
|
38
|
+
run({ manifest, nodes }) {
|
|
39
|
+
const findings = [];
|
|
40
|
+
for (const edge of manifest.edges) {
|
|
41
|
+
if (edge.type !== DERIVES_FROM || edge.pending)
|
|
42
|
+
continue;
|
|
43
|
+
const source = nodes.get(edge.to.node);
|
|
44
|
+
// Whether the source exists at all is edge-resolution's finding.
|
|
45
|
+
if (!source)
|
|
46
|
+
continue;
|
|
47
|
+
if (!edge.sourceHash) {
|
|
48
|
+
findings.push({
|
|
49
|
+
rule: ARTIFACT_SOURCE_UNRECORDED.id,
|
|
50
|
+
message: `No source hash recorded for ${edge.from.node}, so it cannot be told from ${edge.to.node}`,
|
|
51
|
+
target: { kind: "edge", edge },
|
|
52
|
+
hint: "Have whatever generates it record the source's contentHash as `sourceHash` on the edge.",
|
|
53
|
+
data: { artifact: edge.from.node, source: edge.to.node },
|
|
54
|
+
});
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
// A source Weft never read has no hash to compare against — a node an
|
|
58
|
+
// external tool declared without one, most likely.
|
|
59
|
+
if (!source.contentHash) {
|
|
60
|
+
findings.push({
|
|
61
|
+
rule: ARTIFACT_SOURCE_UNRECORDED.id,
|
|
62
|
+
message: `${edge.to.node} has no content hash, so ${edge.from.node} cannot be checked against it`,
|
|
63
|
+
target: { kind: "edge", edge },
|
|
64
|
+
hint: "Only a document Weft read from disk has one; a node an external tool declared may not.",
|
|
65
|
+
data: { artifact: edge.from.node, source: edge.to.node },
|
|
66
|
+
});
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
if (source.contentHash === edge.sourceHash)
|
|
70
|
+
continue;
|
|
71
|
+
findings.push({
|
|
72
|
+
rule: ARTIFACT_STALE.id,
|
|
73
|
+
message: `${edge.from.node} was generated from an older ${edge.to.node}`,
|
|
74
|
+
target: { kind: "edge", edge },
|
|
75
|
+
hint: `Regenerate ${edge.from.node}, or record the current hash if it is already up to date.`,
|
|
76
|
+
data: {
|
|
77
|
+
artifact: edge.from.node,
|
|
78
|
+
source: edge.to.node,
|
|
79
|
+
generatedFrom: edge.sourceHash,
|
|
80
|
+
current: source.contentHash,
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
return findings;
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
//# sourceMappingURL=artifacts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../../src/validate/rules/artifacts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Rule, Validator } from "../types.js";
|
|
2
|
+
export declare const ASSERT_VERSION_MISMATCH: Rule;
|
|
3
|
+
export declare const ASSERT_LINE_COUNT_MISMATCH: Rule;
|
|
4
|
+
export declare const ASSERT_MODIFIED_MISMATCH: Rule;
|
|
5
|
+
export declare const ASSERT_UNVERIFIABLE: Rule;
|
|
6
|
+
/**
|
|
7
|
+
* Check the claims links make about the documents they point at.
|
|
8
|
+
*
|
|
9
|
+
* A version cited across several documents is the most expensive thing in a
|
|
10
|
+
* documentation set to maintain by hand, because nothing signals when one goes
|
|
11
|
+
* stale: the claim was true when written, the prose still reads as current, and
|
|
12
|
+
* the discovery is accidental. This turns that into a build failure.
|
|
13
|
+
*
|
|
14
|
+
* Only assertions are checked here. Whether the link resolves at all belongs to
|
|
15
|
+
* the edge-resolution rules, so an edge whose target is missing or still pending
|
|
16
|
+
* is left to them rather than reported twice.
|
|
17
|
+
*/
|
|
18
|
+
export declare const assertionValidator: Validator;
|
|
19
|
+
//# sourceMappingURL=assertions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assertions.d.ts","sourceRoot":"","sources":["../../../src/validate/rules/assertions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAW,IAAI,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE5D,eAAO,MAAM,uBAAuB,EAAE,IAMrC,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,IAMxC,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,IAItC,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,IAMjC,CAAC;AA0JF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,kBAAkB,EAAE,SA+ChC,CAAC"}
|