@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,254 @@
|
|
|
1
|
+
import { resolve } from "node:path";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
import { describe, expect, it } from "vitest";
|
|
4
|
+
import { buildManifest } from "../../manifest.js";
|
|
5
|
+
import { ValidatorRegistry } from "../registry.js";
|
|
6
|
+
import { assertionValidator } from "../rules/assertions.js";
|
|
7
|
+
import { validateManifest } from "../run.js";
|
|
8
|
+
const CONFIG = {
|
|
9
|
+
rootDir: "/project",
|
|
10
|
+
docsDir: "docs",
|
|
11
|
+
entryPoint: "docs/README.md",
|
|
12
|
+
ignore: [],
|
|
13
|
+
};
|
|
14
|
+
function node(id, extra = {}) {
|
|
15
|
+
return { id, type: "markdown", title: id, anchors: [], ...extra };
|
|
16
|
+
}
|
|
17
|
+
function asserting(asserts, extra = {}) {
|
|
18
|
+
return {
|
|
19
|
+
from: { node: "README.md" },
|
|
20
|
+
to: { node: "spec.md" },
|
|
21
|
+
type: "references",
|
|
22
|
+
asserts,
|
|
23
|
+
...extra,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/** Run only this validator, so the assertions are about it alone. */
|
|
27
|
+
async function check(manifest, config = CONFIG) {
|
|
28
|
+
const registry = new ValidatorRegistry().register(assertionValidator);
|
|
29
|
+
return validateManifest(manifest, config, registry);
|
|
30
|
+
}
|
|
31
|
+
/** A graph of README.md plus one target, with README asserting something about it. */
|
|
32
|
+
function claim(asserts, target, extra = {}) {
|
|
33
|
+
const manifest = {
|
|
34
|
+
version: 2,
|
|
35
|
+
nodes: [node("README.md"), node("spec.md", target)],
|
|
36
|
+
edges: [asserting(asserts, extra)],
|
|
37
|
+
};
|
|
38
|
+
return check(manifest);
|
|
39
|
+
}
|
|
40
|
+
describe("assertions (version)", () => {
|
|
41
|
+
it("reports nothing when the asserted version is current", async () => {
|
|
42
|
+
expect((await claim({ version: "2.42" }, { version: "2.42" })).diagnostics).toEqual([]);
|
|
43
|
+
});
|
|
44
|
+
it("reports a version that has moved on", async () => {
|
|
45
|
+
const [diagnostic] = (await claim({ version: "2.41" }, { version: "2.42" })).diagnostics;
|
|
46
|
+
expect(diagnostic.rule).toBe("assert-version-mismatch");
|
|
47
|
+
expect(diagnostic.message).toBe("spec.md is version 2.42, not 2.41");
|
|
48
|
+
expect(diagnostic.data).toMatchObject({ asserted: "2.41", actual: "2.42" });
|
|
49
|
+
});
|
|
50
|
+
it("fails a build by default, because a stale version pointer reads as current", async () => {
|
|
51
|
+
expect((await claim({ version: "2.41" }, { version: "2.42" })).counts.error).toBe(1);
|
|
52
|
+
});
|
|
53
|
+
it("names the edge, so the reporter can say which document made the claim", async () => {
|
|
54
|
+
const [diagnostic] = (await claim({ version: "2.41" }, { version: "2.42" })).diagnostics;
|
|
55
|
+
expect(diagnostic.target).toMatchObject({
|
|
56
|
+
kind: "edge",
|
|
57
|
+
edge: { from: { node: "README.md" }, to: { node: "spec.md" } },
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
it("suggests the version the assertion should now carry", async () => {
|
|
61
|
+
const [diagnostic] = (await claim({ version: "2.41" }, { version: "2.42" })).diagnostics;
|
|
62
|
+
expect(diagnostic.hint).toContain("2.42");
|
|
63
|
+
});
|
|
64
|
+
it("compares as written, so 2.40 and 2.4 are different versions", async () => {
|
|
65
|
+
expect((await claim({ version: "2.4" }, { version: "2.40" })).counts.error).toBe(1);
|
|
66
|
+
});
|
|
67
|
+
it("reports an assertion against a document that declares no version as unverifiable", async () => {
|
|
68
|
+
const [diagnostic] = (await claim({ version: "1.0" }, {})).diagnostics;
|
|
69
|
+
// Nothing is known to be wrong — but the author believes they have a
|
|
70
|
+
// check here, and they do not.
|
|
71
|
+
expect(diagnostic.rule).toBe("assert-unverifiable");
|
|
72
|
+
expect(diagnostic.severity).toBe("warn");
|
|
73
|
+
expect(diagnostic.message).toContain("declares no version");
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
describe("assertions (line count)", () => {
|
|
77
|
+
it("accepts an exact count that still holds", async () => {
|
|
78
|
+
expect((await claim({ lineCount: 4082 }, { lineCount: 4082 })).diagnostics).toEqual([]);
|
|
79
|
+
});
|
|
80
|
+
it("reports an exact count that has drifted by a single line", async () => {
|
|
81
|
+
const [diagnostic] = (await claim({ lineCount: 4082 }, { lineCount: 4083 })).diagnostics;
|
|
82
|
+
expect(diagnostic.rule).toBe("assert-line-count-mismatch");
|
|
83
|
+
expect(diagnostic.message).toBe("spec.md has 4083 lines, not 4082");
|
|
84
|
+
});
|
|
85
|
+
it("warns rather than failing, since length drifts with every ordinary edit", async () => {
|
|
86
|
+
const { counts } = await claim({ lineCount: 4082 }, { lineCount: 4083 });
|
|
87
|
+
expect(counts).toMatchObject({ error: 0, warn: 1 });
|
|
88
|
+
});
|
|
89
|
+
it("accepts an approximate count that is within ten percent", async () => {
|
|
90
|
+
// "roughly 3,500 lines" is what prose actually claims, and an exact match
|
|
91
|
+
// would make the tolerance the author intended unexpressible.
|
|
92
|
+
expect((await claim({ lineCount: "~3500" }, { lineCount: 3675 })).diagnostics).toEqual([]);
|
|
93
|
+
});
|
|
94
|
+
it("accepts an approximate count that is short by the same margin", async () => {
|
|
95
|
+
expect((await claim({ lineCount: "~3500" }, { lineCount: 3325 })).diagnostics).toEqual([]);
|
|
96
|
+
});
|
|
97
|
+
it("reports an approximate count once the drift exceeds the tolerance", async () => {
|
|
98
|
+
const [diagnostic] = (await claim({ lineCount: "~3500" }, { lineCount: 4060 })).diagnostics;
|
|
99
|
+
expect(diagnostic.rule).toBe("assert-line-count-mismatch");
|
|
100
|
+
expect(diagnostic.message).toBe("spec.md has 4060 lines, not ~3500");
|
|
101
|
+
});
|
|
102
|
+
it("reports the real case the issue was filed over", async () => {
|
|
103
|
+
// A document told external readers to expect roughly 3,500 lines in a
|
|
104
|
+
// companion document. The actual count was 4,082.
|
|
105
|
+
expect((await claim({ lineCount: "~3500" }, { lineCount: 4082 })).counts.warn).toBe(1);
|
|
106
|
+
});
|
|
107
|
+
it("offers a wider tolerance when the assertion was approximate", async () => {
|
|
108
|
+
const [diagnostic] = (await claim({ lineCount: "~3500" }, { lineCount: 4082 })).diagnostics;
|
|
109
|
+
expect(diagnostic.hint).toContain("~4082");
|
|
110
|
+
});
|
|
111
|
+
it("accepts a count written as a string", async () => {
|
|
112
|
+
expect((await claim({ lineCount: "4082" }, { lineCount: 4082 })).diagnostics).toEqual([]);
|
|
113
|
+
});
|
|
114
|
+
it("reports a count that is not a number as unverifiable", async () => {
|
|
115
|
+
const [diagnostic] = (await claim({ lineCount: "about 3500" }, { lineCount: 4082 }))
|
|
116
|
+
.diagnostics;
|
|
117
|
+
expect(diagnostic.rule).toBe("assert-unverifiable");
|
|
118
|
+
expect(diagnostic.hint).toContain("~3500");
|
|
119
|
+
});
|
|
120
|
+
it("reports a count asserted against a node that has none", async () => {
|
|
121
|
+
const [diagnostic] = (await claim({ lineCount: 100 }, {})).diagnostics;
|
|
122
|
+
expect(diagnostic.rule).toBe("assert-unverifiable");
|
|
123
|
+
expect(diagnostic.message).toContain("no line count");
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
describe("assertions (modified date)", () => {
|
|
127
|
+
const modified = "2026-07-30T15:04:55+01:00";
|
|
128
|
+
it("accepts a month that matches", async () => {
|
|
129
|
+
expect((await claim({ modified: "2026-07" }, { modified })).diagnostics).toEqual([]);
|
|
130
|
+
});
|
|
131
|
+
it("accepts a full day that matches", async () => {
|
|
132
|
+
expect((await claim({ modified: "2026-07-30" }, { modified })).diagnostics).toEqual([]);
|
|
133
|
+
});
|
|
134
|
+
it("accepts the exact timestamp", async () => {
|
|
135
|
+
expect((await claim({ modified }, { modified })).diagnostics).toEqual([]);
|
|
136
|
+
});
|
|
137
|
+
it("reports a month that no longer matches", async () => {
|
|
138
|
+
const [diagnostic] = (await claim({ modified: "2026-06" }, { modified })).diagnostics;
|
|
139
|
+
expect(diagnostic.rule).toBe("assert-modified-mismatch");
|
|
140
|
+
expect(diagnostic.message).toContain("2026-07-30");
|
|
141
|
+
expect(diagnostic.data).toMatchObject({ asserted: "2026-06", actual: modified });
|
|
142
|
+
});
|
|
143
|
+
it("reports a day within a matching month", async () => {
|
|
144
|
+
expect((await claim({ modified: "2026-07-29" }, { modified })).counts.warn).toBe(1);
|
|
145
|
+
});
|
|
146
|
+
it("reports an assertion against an uncommitted document as unverifiable", async () => {
|
|
147
|
+
const [diagnostic] = (await claim({ modified: "2026-07" }, {})).diagnostics;
|
|
148
|
+
expect(diagnostic.rule).toBe("assert-unverifiable");
|
|
149
|
+
expect(diagnostic.message).toContain("no modification date");
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
describe("assertions (scope and configuration)", () => {
|
|
153
|
+
it("reports a property no node has as unverifiable", async () => {
|
|
154
|
+
const [diagnostic] = (await claim({ author: "someone" }, { version: "2.42" })).diagnostics;
|
|
155
|
+
expect(diagnostic.rule).toBe("assert-unverifiable");
|
|
156
|
+
expect(diagnostic.message).toContain("no node property is called author");
|
|
157
|
+
});
|
|
158
|
+
it("checks every property a single link asserts", async () => {
|
|
159
|
+
const { diagnostics } = await claim({ version: "2.41", lineCount: 100 }, { version: "2.42", lineCount: 200 });
|
|
160
|
+
expect(diagnostics.map((d) => d.rule).sort()).toEqual([
|
|
161
|
+
"assert-line-count-mismatch",
|
|
162
|
+
"assert-version-mismatch",
|
|
163
|
+
]);
|
|
164
|
+
});
|
|
165
|
+
it("leaves an edge that asserts nothing alone", async () => {
|
|
166
|
+
const manifest = {
|
|
167
|
+
version: 2,
|
|
168
|
+
nodes: [node("README.md"), node("spec.md", { version: "2.42" })],
|
|
169
|
+
edges: [{ from: { node: "README.md" }, to: { node: "spec.md" }, type: "references" }],
|
|
170
|
+
};
|
|
171
|
+
expect((await check(manifest)).diagnostics).toEqual([]);
|
|
172
|
+
});
|
|
173
|
+
it("says nothing about an assertion whose target is not in the graph", async () => {
|
|
174
|
+
// Whether the link resolves at all is edge-resolution's finding, and
|
|
175
|
+
// reporting it twice says nothing new.
|
|
176
|
+
const manifest = {
|
|
177
|
+
version: 2,
|
|
178
|
+
nodes: [node("README.md")],
|
|
179
|
+
edges: [asserting({ version: "2.41" })],
|
|
180
|
+
};
|
|
181
|
+
expect((await check(manifest)).diagnostics).toEqual([]);
|
|
182
|
+
});
|
|
183
|
+
it("says nothing about an assertion on a pending link", async () => {
|
|
184
|
+
// The target is known not to exist yet, so its version cannot have moved.
|
|
185
|
+
const { diagnostics } = await claim({ version: "2.41" }, { version: "2.42" }, { pending: true });
|
|
186
|
+
expect(diagnostics).toEqual([]);
|
|
187
|
+
});
|
|
188
|
+
it("lets a project drop length claims while keeping version checking", async () => {
|
|
189
|
+
const manifest = {
|
|
190
|
+
version: 2,
|
|
191
|
+
nodes: [node("README.md"), node("spec.md", { version: "2.42", lineCount: 200 })],
|
|
192
|
+
edges: [asserting({ version: "2.41", lineCount: 100 })],
|
|
193
|
+
};
|
|
194
|
+
const result = await check(manifest, {
|
|
195
|
+
...CONFIG,
|
|
196
|
+
rules: { "assert-line-count-mismatch": "off" },
|
|
197
|
+
});
|
|
198
|
+
expect(result.diagnostics.map((d) => d.rule)).toEqual(["assert-version-mismatch"]);
|
|
199
|
+
});
|
|
200
|
+
it("lets a project promote a length claim to a build failure", async () => {
|
|
201
|
+
const result = await check({
|
|
202
|
+
version: 2,
|
|
203
|
+
nodes: [node("README.md"), node("spec.md", { lineCount: 200 })],
|
|
204
|
+
edges: [asserting({ lineCount: 100 })],
|
|
205
|
+
}, { ...CONFIG, rules: { "assert-line-count-mismatch": "error" } });
|
|
206
|
+
expect(result.counts.error).toBe(1);
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
// Extraction and checking exercised together over real files, since the check is
|
|
210
|
+
// only as good as the assertions the indexer hands it.
|
|
211
|
+
describe("assertions (over a real docs tree)", () => {
|
|
212
|
+
const FIXTURE = resolve(fileURLToPath(import.meta.url), "../../../__fixtures__/assertions");
|
|
213
|
+
const config = {
|
|
214
|
+
rootDir: FIXTURE,
|
|
215
|
+
docsDir: "docs",
|
|
216
|
+
entryPoint: "docs/README.md",
|
|
217
|
+
ignore: [],
|
|
218
|
+
};
|
|
219
|
+
async function checkFixture() {
|
|
220
|
+
return check(await buildManifest(config), config);
|
|
221
|
+
}
|
|
222
|
+
it("captures the version a document declares in its frontmatter", async () => {
|
|
223
|
+
const manifest = await buildManifest(config);
|
|
224
|
+
expect(manifest.nodes.find((n) => n.id === "spec.md")?.version).toBe("2.42");
|
|
225
|
+
});
|
|
226
|
+
it("leaves a document that declares no version without one", async () => {
|
|
227
|
+
const manifest = await buildManifest(config);
|
|
228
|
+
expect(manifest.nodes.find((n) => n.id === "registry.md")?.version).toBeUndefined();
|
|
229
|
+
});
|
|
230
|
+
it("reports each stale claim once, by rule", async () => {
|
|
231
|
+
const { diagnostics } = await checkFixture();
|
|
232
|
+
expect(diagnostics.map((d) => d.rule).sort()).toEqual([
|
|
233
|
+
"assert-line-count-mismatch",
|
|
234
|
+
"assert-unverifiable",
|
|
235
|
+
"assert-version-mismatch",
|
|
236
|
+
]);
|
|
237
|
+
});
|
|
238
|
+
it("fails the build on the stale version but not on the length claim", async () => {
|
|
239
|
+
expect((await checkFixture()).counts).toEqual({ error: 1, warn: 2, info: 0 });
|
|
240
|
+
});
|
|
241
|
+
it("reports the length the document actually has", async () => {
|
|
242
|
+
const manifest = await buildManifest(config);
|
|
243
|
+
const spec = manifest.nodes.find((n) => n.id === "spec.md");
|
|
244
|
+
const diagnostic = (await check(manifest, config)).diagnostics.find((d) => d.rule === "assert-line-count-mismatch");
|
|
245
|
+
expect(diagnostic?.data?.actual).toBe(spec?.lineCount);
|
|
246
|
+
});
|
|
247
|
+
it("leaves the claim that is still true alone", async () => {
|
|
248
|
+
const { diagnostics } = await checkFixture();
|
|
249
|
+
const anchors = diagnostics.map((d) => d.target.kind === "edge" ? d.target.edge.to.anchor : undefined);
|
|
250
|
+
// The link asserting the current version points at #errors.
|
|
251
|
+
expect(anchors).not.toContain("#errors");
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
//# sourceMappingURL=assertions.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assertions.test.js","sourceRoot":"","sources":["../../../src/validate/__tests__/assertions.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duplicates.test.d.ts","sourceRoot":"","sources":["../../../src/validate/__tests__/duplicates.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { ValidatorRegistry } from "../registry.js";
|
|
3
|
+
import { duplicateValidator } from "../rules/duplicates.js";
|
|
4
|
+
import { validateManifest } from "../run.js";
|
|
5
|
+
const CONFIG = {
|
|
6
|
+
rootDir: "/project",
|
|
7
|
+
docsDir: "docs",
|
|
8
|
+
entryPoint: "docs/README.md",
|
|
9
|
+
ignore: [],
|
|
10
|
+
};
|
|
11
|
+
function node(id, contentHash) {
|
|
12
|
+
return { id, type: "markdown", title: id, anchors: [], ...(contentHash ? { contentHash } : {}) };
|
|
13
|
+
}
|
|
14
|
+
function history(blobs = {}) {
|
|
15
|
+
return {
|
|
16
|
+
blobs: new Map(Object.entries(blobs).map(([id, held]) => [id, new Set(held)])),
|
|
17
|
+
renames: new Map(),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Run only this validator against a fixed history.
|
|
22
|
+
*
|
|
23
|
+
* The runner would otherwise shell out to git for the real one, which would make
|
|
24
|
+
* every case here depend on the checkout it runs in.
|
|
25
|
+
*/
|
|
26
|
+
async function check(nodes, blobs = {}, config = CONFIG) {
|
|
27
|
+
const manifest = { version: 2, nodes, edges: [] };
|
|
28
|
+
const registry = new ValidatorRegistry().register({
|
|
29
|
+
...duplicateValidator,
|
|
30
|
+
run: (context) => duplicateValidator.run({ ...context, history: history(blobs) }),
|
|
31
|
+
});
|
|
32
|
+
return validateManifest(manifest, config, registry);
|
|
33
|
+
}
|
|
34
|
+
describe("duplicates", () => {
|
|
35
|
+
it("reports two documents holding identical content", async () => {
|
|
36
|
+
const { diagnostics } = await check([node("a.md", "same"), node("outbound/a.md", "same")]);
|
|
37
|
+
expect(diagnostics).toHaveLength(1);
|
|
38
|
+
expect(diagnostics[0].rule).toBe("node-duplicate");
|
|
39
|
+
expect(diagnostics[0].data?.nodes).toEqual(["a.md", "outbound/a.md"]);
|
|
40
|
+
});
|
|
41
|
+
it("stays advisory, since copies that agree are not yet wrong", async () => {
|
|
42
|
+
// This is the cheapest moment the problem will ever be visible, but it is
|
|
43
|
+
// not itself a failure.
|
|
44
|
+
const { counts } = await check([node("a.md", "same"), node("outbound/a.md", "same")]);
|
|
45
|
+
expect(counts).toEqual({ error: 0, warn: 0, info: 1 });
|
|
46
|
+
});
|
|
47
|
+
it("reports a group of three copies once, not once per pair", async () => {
|
|
48
|
+
const { diagnostics } = await check([
|
|
49
|
+
node("a.md", "same"),
|
|
50
|
+
node("b.md", "same"),
|
|
51
|
+
node("c.md", "same"),
|
|
52
|
+
]);
|
|
53
|
+
expect(diagnostics).toHaveLength(1);
|
|
54
|
+
expect(diagnostics[0].data?.nodes).toEqual(["a.md", "b.md", "c.md"]);
|
|
55
|
+
});
|
|
56
|
+
it("says nothing about documents that differ", async () => {
|
|
57
|
+
const { diagnostics } = await check([node("a.md", "one"), node("b.md", "two")]);
|
|
58
|
+
expect(diagnostics).toEqual([]);
|
|
59
|
+
});
|
|
60
|
+
it("says nothing about a lone document", async () => {
|
|
61
|
+
expect((await check([node("a.md", "one")])).diagnostics).toEqual([]);
|
|
62
|
+
});
|
|
63
|
+
it("ignores nodes carrying no hash at all", async () => {
|
|
64
|
+
// A node an external tool declared may have none, and two unknowns are
|
|
65
|
+
// not evidence of anything.
|
|
66
|
+
const { diagnostics } = await check([node("a.md"), node("b.md")]);
|
|
67
|
+
expect(diagnostics).toEqual([]);
|
|
68
|
+
});
|
|
69
|
+
it("names the graph rather than one of the copies", async () => {
|
|
70
|
+
// Naming one would imply it is the original, and nothing here knows which
|
|
71
|
+
// came first.
|
|
72
|
+
const [diagnostic] = (await check([node("a.md", "same"), node("b.md", "same")])).diagnostics;
|
|
73
|
+
expect(diagnostic.target).toEqual({ kind: "graph" });
|
|
74
|
+
});
|
|
75
|
+
it("can be switched off without touching the divergence check", async () => {
|
|
76
|
+
const result = await check([node("a.md", "same"), node("b.md", "same")], {}, { ...CONFIG, rules: { "node-duplicate": "off" } });
|
|
77
|
+
expect(result.diagnostics).toEqual([]);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
describe("divergence", () => {
|
|
81
|
+
it("reports two documents that once held the same content", async () => {
|
|
82
|
+
const { diagnostics } = await check([node("a.md", "now-one"), node("outbound/a.md", "now-two")], {
|
|
83
|
+
"a.md": ["shared"],
|
|
84
|
+
"outbound/a.md": ["shared"],
|
|
85
|
+
});
|
|
86
|
+
expect(diagnostics).toHaveLength(1);
|
|
87
|
+
expect(diagnostics[0].rule).toBe("node-diverged");
|
|
88
|
+
expect(diagnostics[0].data).toMatchObject({ blob: "shared" });
|
|
89
|
+
});
|
|
90
|
+
it("outranks the duplicate notice, because this is the half that costs", async () => {
|
|
91
|
+
// Exact-match detection goes quiet at precisely the moment drift begins.
|
|
92
|
+
const { counts } = await check([node("a.md", "now-one"), node("b.md", "now-two")], {
|
|
93
|
+
"a.md": ["shared"],
|
|
94
|
+
"b.md": ["shared"],
|
|
95
|
+
});
|
|
96
|
+
expect(counts).toEqual({ error: 0, warn: 1, info: 0 });
|
|
97
|
+
});
|
|
98
|
+
it("reports copies that still agree as duplicates and not as diverged", async () => {
|
|
99
|
+
const { diagnostics } = await check([node("a.md", "same"), node("b.md", "same")], {
|
|
100
|
+
"a.md": ["shared"],
|
|
101
|
+
"b.md": ["shared"],
|
|
102
|
+
});
|
|
103
|
+
expect(diagnostics.map((d) => d.rule)).toEqual(["node-duplicate"]);
|
|
104
|
+
});
|
|
105
|
+
it("says nothing about documents that never shared history", async () => {
|
|
106
|
+
const { diagnostics } = await check([node("a.md", "one"), node("b.md", "two")], {
|
|
107
|
+
"a.md": ["blob-a"],
|
|
108
|
+
"b.md": ["blob-b"],
|
|
109
|
+
});
|
|
110
|
+
expect(diagnostics).toEqual([]);
|
|
111
|
+
});
|
|
112
|
+
it("reports a diverged group once when several blobs were shared", async () => {
|
|
113
|
+
const { diagnostics } = await check([node("a.md", "one"), node("b.md", "two")], {
|
|
114
|
+
"a.md": ["first", "second"],
|
|
115
|
+
"b.md": ["first", "second"],
|
|
116
|
+
});
|
|
117
|
+
expect(diagnostics).toHaveLength(1);
|
|
118
|
+
});
|
|
119
|
+
it("finds nothing without history, rather than guessing", async () => {
|
|
120
|
+
// Outside a git repository the check has nothing to say — which must not
|
|
121
|
+
// read as "these files are fine".
|
|
122
|
+
const { diagnostics } = await check([node("a.md", "one"), node("b.md", "two")]);
|
|
123
|
+
expect(diagnostics).toEqual([]);
|
|
124
|
+
});
|
|
125
|
+
it("can be switched off without losing the duplicate notice", async () => {
|
|
126
|
+
const result = await check([node("a.md", "one"), node("b.md", "two"), node("c.md", "dup"), node("d.md", "dup")], { "a.md": ["shared"], "b.md": ["shared"] }, { ...CONFIG, rules: { "node-diverged": "off" } });
|
|
127
|
+
expect(result.diagnostics.map((d) => d.rule)).toEqual(["node-duplicate"]);
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
//# sourceMappingURL=duplicates.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duplicates.test.js","sourceRoot":"","sources":["../../../src/validate/__tests__/duplicates.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edge-resolution.test.d.ts","sourceRoot":"","sources":["../../../src/validate/__tests__/edge-resolution.test.ts"],"names":[],"mappings":""}
|