@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,90 @@
|
|
|
1
|
+
import { NO_HISTORY, graphHistory } from "./history.js";
|
|
2
|
+
import { VALIDATOR_ERROR_RULE, defaultRegistry } from "./registry.js";
|
|
3
|
+
/** Resolve a rule's severity: the user's config wins over the rule's own default. */
|
|
4
|
+
function severityFor(rule, config) {
|
|
5
|
+
return config.rules?.[rule.id] ?? rule.defaultSeverity;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Whether running this registry under this config will read git history.
|
|
9
|
+
*
|
|
10
|
+
* Exported so a caller that builds the graph itself — the service — can pay
|
|
11
|
+
* for one full history walk up front and hand the result to both the indexer
|
|
12
|
+
* and {@link validateManifest}, instead of each walking on its own.
|
|
13
|
+
*/
|
|
14
|
+
export function registryWantsHistory(registry, config) {
|
|
15
|
+
return registry.validators.some((validator) => validator.needsHistory && validator.rules.some((rule) => severityFor(rule, config) !== "off"));
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Run every registered check over a built manifest.
|
|
19
|
+
*
|
|
20
|
+
* Validation is a separate stage from extraction on purpose: it reads the
|
|
21
|
+
* finished graph and never mutates it, so a check can be added without touching
|
|
22
|
+
* the indexer.
|
|
23
|
+
*/
|
|
24
|
+
export async function validateManifest(manifest, config, registry = defaultRegistry(), precomputedHistory) {
|
|
25
|
+
const nodes = new Map(manifest.nodes.map((node) => [node.id, node]));
|
|
26
|
+
const enabled = new Map();
|
|
27
|
+
const rulesRun = [];
|
|
28
|
+
const rulesSkipped = [];
|
|
29
|
+
for (const rule of registry.rules) {
|
|
30
|
+
const severity = severityFor(rule, config);
|
|
31
|
+
if (severity === "off") {
|
|
32
|
+
rulesSkipped.push(rule.id);
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
enabled.set(rule.id, severity);
|
|
36
|
+
rulesRun.push(rule.id);
|
|
37
|
+
}
|
|
38
|
+
const unknownRules = Object.keys(config.rules ?? {}).filter((id) => !registry.rule(id));
|
|
39
|
+
// Gathered once for every check that wants it, and skipped outright when
|
|
40
|
+
// none is enabled — reading git history is the only IO validation does.
|
|
41
|
+
// A caller who already walked history passes it in instead.
|
|
42
|
+
const wantsHistory = registryWantsHistory(registry, config);
|
|
43
|
+
const history = wantsHistory ? (precomputedHistory ?? (await graphHistory(config))) : NO_HISTORY;
|
|
44
|
+
const context = {
|
|
45
|
+
manifest,
|
|
46
|
+
config,
|
|
47
|
+
nodes,
|
|
48
|
+
history,
|
|
49
|
+
isEnabled: (ruleId) => enabled.has(ruleId),
|
|
50
|
+
};
|
|
51
|
+
const diagnostics = [];
|
|
52
|
+
// A rule turned off still reaches here if a validator ran for its other
|
|
53
|
+
// rules, so drop findings whose rule is not enabled.
|
|
54
|
+
const record = (finding) => {
|
|
55
|
+
const severity = enabled.get(finding.rule);
|
|
56
|
+
if (severity)
|
|
57
|
+
diagnostics.push({ ...finding, severity });
|
|
58
|
+
};
|
|
59
|
+
for (const validator of registry.validators) {
|
|
60
|
+
// Skip a validator whose every rule is off rather than running work it
|
|
61
|
+
// would only throw away.
|
|
62
|
+
if (!validator.rules.some((rule) => enabled.has(rule.id)))
|
|
63
|
+
continue;
|
|
64
|
+
let findings;
|
|
65
|
+
try {
|
|
66
|
+
findings = await validator.run(context);
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
// One bad validator must not take down the run — report it as a
|
|
70
|
+
// diagnostic and let the remaining checks finish.
|
|
71
|
+
record({
|
|
72
|
+
rule: VALIDATOR_ERROR_RULE.id,
|
|
73
|
+
message: `Validator for ${validator.rules.map((rule) => rule.id).join(", ")} threw: ${err.message}`,
|
|
74
|
+
target: { kind: "graph" },
|
|
75
|
+
});
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
for (const finding of findings) {
|
|
79
|
+
if (!validator.rules.some((rule) => rule.id === finding.rule)) {
|
|
80
|
+
throw new Error(`weft validate: a validator reported rule "${finding.rule}", which it does not declare`);
|
|
81
|
+
}
|
|
82
|
+
record(finding);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
const counts = { error: 0, warn: 0, info: 0 };
|
|
86
|
+
for (const diagnostic of diagnostics)
|
|
87
|
+
counts[diagnostic.severity]++;
|
|
88
|
+
return { diagnostics, counts, rulesRun, rulesSkipped, unknownRules };
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/validate/run.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAA0B,eAAe,EAAE,MAAM,eAAe,CAAC;AAU9F,qFAAqF;AACrF,SAAS,WAAW,CAAC,IAAU,EAAE,MAAkB;IAClD,OAAO,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC;AACxD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAA2B,EAAE,MAAkB;IACnF,OAAO,QAAQ,CAAC,UAAU,CAAC,IAAI,CAC9B,CAAC,SAAS,EAAE,EAAE,CACb,SAAS,CAAC,YAAY,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,KAAK,CAAC,CAC9F,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACrC,QAAkB,EAClB,MAAkB,EAClB,WAA8B,eAAe,EAAE,EAC/C,kBAAiC;IAEjC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAmB,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACvF,MAAM,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC5C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC3C,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;YACxB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC3B,SAAS;QACV,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC/B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAExF,yEAAyE;IACzE,wEAAwE;IACxE,4DAA4D;IAC5D,MAAM,YAAY,GAAG,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,kBAAkB,IAAI,CAAC,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IAEjG,MAAM,OAAO,GAAsB;QAClC,QAAQ;QACR,MAAM;QACN,KAAK;QACL,OAAO;QACP,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;KAC1C,CAAC;IAEF,MAAM,WAAW,GAAiB,EAAE,CAAC;IACrC,wEAAwE;IACxE,qDAAqD;IACrD,MAAM,MAAM,GAAG,CAAC,OAAgB,EAAE,EAAE;QACnC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,QAAQ;YAAE,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC1D,CAAC,CAAC;IAEF,KAAK,MAAM,SAAS,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC7C,uEAAuE;QACvE,yBAAyB;QACzB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAAE,SAAS;QAEpE,IAAI,QAAmB,CAAC;QACxB,IAAI,CAAC;YACJ,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,gEAAgE;YAChE,kDAAkD;YAClD,MAAM,CAAC;gBACN,IAAI,EAAE,oBAAoB,CAAC,EAAE;gBAC7B,OAAO,EAAE,iBAAiB,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,WAAY,GAAa,CAAC,OAAO,EAAE;gBAC9G,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;aACzB,CAAC,CAAC;YACH,SAAS;QACV,CAAC;QAED,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAChC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/D,MAAM,IAAI,KAAK,CACd,6CAA6C,OAAO,CAAC,IAAI,8BAA8B,CACvF,CAAC;YACH,CAAC;YACD,MAAM,CAAC,OAAO,CAAC,CAAC;QACjB,CAAC;IACF,CAAC;IAED,MAAM,MAAM,GAA6B,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IACxE,KAAK,MAAM,UAAU,IAAI,WAAW;QAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;IAEpE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;AACtE,CAAC"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import type { Manifest, Severity, WeftConfig, WeftEdge, WeftNode } from "../types.js";
|
|
2
|
+
/** What a diagnostic concerns: a document (optionally one anchor in it), an edge, or the graph itself. */
|
|
3
|
+
export type DiagnosticTarget = {
|
|
4
|
+
kind: "node";
|
|
5
|
+
node: string;
|
|
6
|
+
anchor?: string;
|
|
7
|
+
} | {
|
|
8
|
+
kind: "edge";
|
|
9
|
+
edge: WeftEdge;
|
|
10
|
+
} | {
|
|
11
|
+
kind: "graph";
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* A validator's output. Deliberately carries no severity — that is resolved by
|
|
15
|
+
* the runner from the rule's default and the user's config, so the same finding
|
|
16
|
+
* can be an error in one project and a warning in another. A rule that needs two
|
|
17
|
+
* severities (a hard failure and a softer "known pending" variant) declares two
|
|
18
|
+
* rule ids, which also makes each independently configurable.
|
|
19
|
+
*/
|
|
20
|
+
export interface Finding {
|
|
21
|
+
/** Id of the rule reporting this, which must be one the validator declares. */
|
|
22
|
+
rule: string;
|
|
23
|
+
/** Human-readable description of what is wrong. */
|
|
24
|
+
message: string;
|
|
25
|
+
target: DiagnosticTarget;
|
|
26
|
+
/** Optional suggestion for how to fix it. */
|
|
27
|
+
hint?: string;
|
|
28
|
+
/** Optional rule-specific payload, carried through to JSON output. */
|
|
29
|
+
data?: Record<string, unknown>;
|
|
30
|
+
}
|
|
31
|
+
/** A finding with its severity resolved. This is what consumers report on. */
|
|
32
|
+
export interface Diagnostic extends Finding {
|
|
33
|
+
severity: Severity;
|
|
34
|
+
}
|
|
35
|
+
/** A single check a validator can report. Declared up front so config and `--list-rules` can see it without running anything. */
|
|
36
|
+
export interface Rule {
|
|
37
|
+
/** Stable id used in config and in output, e.g. "edge-target-missing". */
|
|
38
|
+
id: string;
|
|
39
|
+
/** One-line description of what the rule checks. */
|
|
40
|
+
description: string;
|
|
41
|
+
/** Severity used when config does not override it. */
|
|
42
|
+
defaultSeverity: Severity;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* What git knows about the indexed files, keyed by node id rather than by path
|
|
46
|
+
* so a validator never repeats the project-namespacing the runner already did.
|
|
47
|
+
*
|
|
48
|
+
* Empty when no rule needed it, when the project is not a git repository, or
|
|
49
|
+
* when git could not answer. A check reading this must treat empty as "nothing
|
|
50
|
+
* to say" rather than as evidence.
|
|
51
|
+
*/
|
|
52
|
+
export interface GraphHistory {
|
|
53
|
+
/**
|
|
54
|
+
* Every blob each node has ever held, following renames. Two nodes whose
|
|
55
|
+
* sets intersect held identical content at some point.
|
|
56
|
+
*/
|
|
57
|
+
blobs: ReadonlyMap<string, ReadonlySet<string>>;
|
|
58
|
+
/** Node id a path moved to, for ids that are no longer in the graph. */
|
|
59
|
+
renames: ReadonlyMap<string, string>;
|
|
60
|
+
}
|
|
61
|
+
/** Everything a validator gets to work with. Read-only — validation never mutates the graph. */
|
|
62
|
+
export interface ValidationContext {
|
|
63
|
+
manifest: Manifest;
|
|
64
|
+
config: WeftConfig;
|
|
65
|
+
/** Nodes by id, prebuilt so every validator does not rescan the node list. */
|
|
66
|
+
nodes: ReadonlyMap<string, WeftNode>;
|
|
67
|
+
/**
|
|
68
|
+
* What git knows about these files. Gathered once by the runner, and only
|
|
69
|
+
* when a rule that declared a need for it is enabled — a project running
|
|
70
|
+
* without the history-based checks pays for no subprocess.
|
|
71
|
+
*/
|
|
72
|
+
history: GraphHistory;
|
|
73
|
+
/** False when the rule is configured "off". Lets an expensive validator skip work it would only throw away. */
|
|
74
|
+
isEnabled(ruleId: string): boolean;
|
|
75
|
+
}
|
|
76
|
+
/** A registered check. `rules` declares every rule id `run` may emit. */
|
|
77
|
+
export interface Validator {
|
|
78
|
+
rules: Rule[];
|
|
79
|
+
/**
|
|
80
|
+
* True when the check reads `context.history`. Declared rather than inferred
|
|
81
|
+
* so the runner can skip the git walk entirely when nothing enabled wants it.
|
|
82
|
+
*/
|
|
83
|
+
needsHistory?: boolean;
|
|
84
|
+
run(context: ValidationContext): Finding[] | Promise<Finding[]>;
|
|
85
|
+
}
|
|
86
|
+
export interface ValidationResult {
|
|
87
|
+
diagnostics: Diagnostic[];
|
|
88
|
+
/** How many diagnostics of each severity. `counts.error` drives the `weft check` exit code. */
|
|
89
|
+
counts: Record<Severity, number>;
|
|
90
|
+
/** Rule ids that ran. */
|
|
91
|
+
rulesRun: string[];
|
|
92
|
+
/** Rule ids skipped because config set them to "off". */
|
|
93
|
+
rulesSkipped: string[];
|
|
94
|
+
/**
|
|
95
|
+
* Rule ids named in config that no validator declares. Reported rather than
|
|
96
|
+
* rejected: a config written against a newer Weft, or against a check that is
|
|
97
|
+
* installed elsewhere, should not stop the run.
|
|
98
|
+
*/
|
|
99
|
+
unknownRules: string[];
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/validate/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEtF,0GAA0G;AAC1G,MAAM,MAAM,gBAAgB,GACzB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAErB;;;;;;GAMG;AACH,MAAM,WAAW,OAAO;IACvB,+EAA+E;IAC/E,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,gBAAgB,CAAC;IACzB,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,8EAA8E;AAC9E,MAAM,WAAW,UAAW,SAAQ,OAAO;IAC1C,QAAQ,EAAE,QAAQ,CAAC;CACnB;AAED,iIAAiI;AACjI,MAAM,WAAW,IAAI;IACpB,0EAA0E;IAC1E,EAAE,EAAE,MAAM,CAAC;IACX,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,eAAe,EAAE,QAAQ,CAAC;CAC1B;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC5B;;;OAGG;IACH,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;IAChD,wEAAwE;IACxE,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,gGAAgG;AAChG,MAAM,WAAW,iBAAiB;IACjC,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,UAAU,CAAC;IACnB,8EAA8E;IAC9E,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACrC;;;;OAIG;IACH,OAAO,EAAE,YAAY,CAAC;IACtB,+GAA+G;IAC/G,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;CACnC;AAED,yEAAyE;AACzE,MAAM,WAAW,SAAS;IACzB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,GAAG,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;CAChE;AAED,MAAM,WAAW,gBAAgB;IAChC,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,+FAA+F;IAC/F,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACjC,yBAAyB;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,yDAAyD;IACzD,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB;;;;OAIG;IACH,YAAY,EAAE,MAAM,EAAE,CAAC;CACvB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/validate/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@lepid-labs/weft-core",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Weft's document graph: indexing, links, validation and search over a docs tree",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/Lepid-Labs/weft.git",
|
|
9
|
+
"directory": "packages/core"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/Lepid-Labs/weft#readme",
|
|
12
|
+
"type": "module",
|
|
13
|
+
"files": [
|
|
14
|
+
"dist"
|
|
15
|
+
],
|
|
16
|
+
"main": "dist/index.js",
|
|
17
|
+
"types": "dist/index.d.ts",
|
|
18
|
+
"exports": {
|
|
19
|
+
".": {
|
|
20
|
+
"types": "./dist/index.d.ts",
|
|
21
|
+
"default": "./dist/index.js"
|
|
22
|
+
},
|
|
23
|
+
"./browser": {
|
|
24
|
+
"types": "./dist/browser.d.ts",
|
|
25
|
+
"import": "./dist/browser.js"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"chokidar": "^4.0.0",
|
|
30
|
+
"github-slugger": "^2.0.0",
|
|
31
|
+
"glob": "^11.0.0",
|
|
32
|
+
"mdast-util-to-string": "^4.0.0",
|
|
33
|
+
"minisearch": "^7.0.0",
|
|
34
|
+
"remark-parse": "^11.0.0",
|
|
35
|
+
"unified": "^11.0.0",
|
|
36
|
+
"unist-util-visit": "^5.0.0",
|
|
37
|
+
"yaml": "^2.6.0"
|
|
38
|
+
},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"@types/mdast": "^4.0.0",
|
|
41
|
+
"@types/node": "^22.0.0",
|
|
42
|
+
"typescript": "^5.7.0",
|
|
43
|
+
"vitest": "^3.2.6"
|
|
44
|
+
},
|
|
45
|
+
"publishConfig": {
|
|
46
|
+
"access": "public"
|
|
47
|
+
},
|
|
48
|
+
"scripts": {
|
|
49
|
+
"build": "tsc",
|
|
50
|
+
"typecheck": "tsc --noEmit",
|
|
51
|
+
"test": "vitest run",
|
|
52
|
+
"test:watch": "vitest"
|
|
53
|
+
}
|
|
54
|
+
}
|