@descent-vtt/spec-guard 0.11.0 → 0.12.1
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/CHANGELOG.md +443 -31
- package/README.md +403 -41
- package/dist/cites.d.ts +192 -0
- package/dist/cites.d.ts.map +1 -0
- package/dist/cites.js +599 -0
- package/dist/cites.js.map +1 -0
- package/dist/cli.d.ts +14 -6
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +315 -22
- package/dist/cli.js.map +1 -1
- package/dist/comments.d.ts +1 -1
- package/dist/comments.js +1 -1
- package/dist/config.d.ts +3 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +46 -5
- package/dist/config.js.map +1 -1
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +38 -14
- package/dist/engine.js.map +1 -1
- package/dist/glob.d.ts +128 -24
- package/dist/glob.d.ts.map +1 -1
- package/dist/glob.js +304 -61
- package/dist/glob.js.map +1 -1
- package/dist/impact.d.ts +179 -0
- package/dist/impact.d.ts.map +1 -0
- package/dist/impact.js +360 -0
- package/dist/impact.js.map +1 -0
- package/dist/index.d.ts +15 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -4
- package/dist/index.js.map +1 -1
- package/dist/mcp.d.ts +22 -75
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +206 -370
- package/dist/mcp.js.map +1 -1
- package/dist/overlay.d.ts +39 -0
- package/dist/overlay.d.ts.map +1 -0
- package/dist/overlay.js +133 -0
- package/dist/overlay.js.map +1 -0
- package/dist/parser.d.ts +41 -24
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +217 -160
- package/dist/parser.js.map +1 -1
- package/dist/prove.d.ts +46 -0
- package/dist/prove.d.ts.map +1 -0
- package/dist/prove.js +549 -0
- package/dist/prove.js.map +1 -0
- package/dist/query.d.ts +18 -1
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +9 -3
- package/dist/query.js.map +1 -1
- package/dist/reporter.d.ts +139 -1
- package/dist/reporter.d.ts.map +1 -1
- package/dist/reporter.js +593 -21
- package/dist/reporter.js.map +1 -1
- package/dist/rules.js +3 -3
- package/dist/rules.js.map +1 -1
- package/dist/runner.d.ts +31 -2
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +85 -21
- package/dist/runner.js.map +1 -1
- package/dist/specs.d.ts +27 -1
- package/dist/specs.d.ts.map +1 -1
- package/dist/specs.js +45 -10
- package/dist/specs.js.map +1 -1
- package/dist/structure.d.ts.map +1 -1
- package/dist/structure.js +7 -6
- package/dist/structure.js.map +1 -1
- package/dist/types.d.ts +193 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/vendor/spec-core/jsonrpc/index.d.ts +3 -0
- package/dist/vendor/spec-core/jsonrpc/index.d.ts.map +1 -0
- package/dist/vendor/spec-core/jsonrpc/index.js +2 -0
- package/dist/vendor/spec-core/jsonrpc/index.js.map +1 -0
- package/dist/vendor/spec-core/jsonrpc/mcp.d.ts +158 -0
- package/dist/vendor/spec-core/jsonrpc/mcp.d.ts.map +1 -0
- package/dist/vendor/spec-core/jsonrpc/mcp.js +353 -0
- package/dist/vendor/spec-core/jsonrpc/mcp.js.map +1 -0
- package/dist/vendor/spec-core/markdown/frontmatter.d.ts +104 -0
- package/dist/vendor/spec-core/markdown/frontmatter.d.ts.map +1 -0
- package/dist/vendor/spec-core/markdown/frontmatter.js +459 -0
- package/dist/vendor/spec-core/markdown/frontmatter.js.map +1 -0
- package/dist/vendor/spec-core/markdown/headings.d.ts +46 -0
- package/dist/vendor/spec-core/markdown/headings.d.ts.map +1 -0
- package/dist/vendor/spec-core/markdown/headings.js +199 -0
- package/dist/vendor/spec-core/markdown/headings.js.map +1 -0
- package/dist/vendor/spec-core/markdown/index.d.ts +6 -0
- package/dist/vendor/spec-core/markdown/index.d.ts.map +1 -0
- package/dist/vendor/spec-core/markdown/index.js +4 -0
- package/dist/vendor/spec-core/markdown/index.js.map +1 -0
- package/dist/vendor/spec-core/markdown/layout.d.ts +40 -0
- package/dist/vendor/spec-core/markdown/layout.d.ts.map +1 -0
- package/dist/vendor/spec-core/markdown/layout.js +28 -0
- package/dist/vendor/spec-core/markdown/layout.js.map +1 -0
- package/dist/vendor/spec-core/markdown/links.d.ts +26 -0
- package/dist/vendor/spec-core/markdown/links.d.ts.map +1 -0
- package/dist/vendor/spec-core/markdown/links.js +394 -0
- package/dist/vendor/spec-core/markdown/links.js.map +1 -0
- package/dist/vendor/spec-core/markdown/lists.d.ts +23 -0
- package/dist/vendor/spec-core/markdown/lists.d.ts.map +1 -0
- package/dist/vendor/spec-core/markdown/lists.js +127 -0
- package/dist/vendor/spec-core/markdown/lists.js.map +1 -0
- package/dist/vendor/spec-core/markdown/scan.d.ts +37 -0
- package/dist/vendor/spec-core/markdown/scan.d.ts.map +1 -0
- package/dist/vendor/spec-core/markdown/scan.js +463 -0
- package/dist/vendor/spec-core/markdown/scan.js.map +1 -0
- package/dist/vendor/spec-core/markdown/syntax.d.ts +76 -0
- package/dist/vendor/spec-core/markdown/syntax.d.ts.map +1 -0
- package/dist/vendor/spec-core/markdown/syntax.js +181 -0
- package/dist/vendor/spec-core/markdown/syntax.js.map +1 -0
- package/dist/vendor/spec-core/markdown/tables.d.ts +19 -0
- package/dist/vendor/spec-core/markdown/tables.d.ts.map +1 -0
- package/dist/vendor/spec-core/markdown/tables.js +86 -0
- package/dist/vendor/spec-core/markdown/tables.js.map +1 -0
- package/dist/vendor/spec-core/markdown/types.d.ts +291 -0
- package/dist/vendor/spec-core/markdown/types.d.ts.map +1 -0
- package/dist/vendor/spec-core/markdown/types.js +9 -0
- package/dist/vendor/spec-core/markdown/types.js.map +1 -0
- package/dist/vendor/spec-core/path/index.d.ts +2 -0
- package/dist/vendor/spec-core/path/index.d.ts.map +1 -0
- package/dist/vendor/spec-core/path/index.js +2 -0
- package/dist/vendor/spec-core/path/index.js.map +1 -0
- package/dist/vendor/spec-core/path/posix.d.ts +84 -0
- package/dist/vendor/spec-core/path/posix.d.ts.map +1 -0
- package/dist/vendor/spec-core/path/posix.js +150 -0
- package/dist/vendor/spec-core/path/posix.js.map +1 -0
- package/dist/vendor/spec-core/pattern/automaton.d.ts +130 -0
- package/dist/vendor/spec-core/pattern/automaton.d.ts.map +1 -0
- package/dist/vendor/spec-core/pattern/automaton.js +340 -0
- package/dist/vendor/spec-core/pattern/automaton.js.map +1 -0
- package/dist/vendor/spec-core/pattern/charset.d.ts +59 -0
- package/dist/vendor/spec-core/pattern/charset.d.ts.map +1 -0
- package/dist/vendor/spec-core/pattern/charset.js +116 -0
- package/dist/vendor/spec-core/pattern/charset.js.map +1 -0
- package/dist/vendor/spec-core/pattern/glob.d.ts +122 -0
- package/dist/vendor/spec-core/pattern/glob.d.ts.map +1 -0
- package/dist/vendor/spec-core/pattern/glob.js +481 -0
- package/dist/vendor/spec-core/pattern/glob.js.map +1 -0
- package/dist/vendor/spec-core/pattern/index.d.ts +7 -0
- package/dist/vendor/spec-core/pattern/index.d.ts.map +1 -0
- package/dist/vendor/spec-core/pattern/index.js +4 -0
- package/dist/vendor/spec-core/pattern/index.js.map +1 -0
- package/dist/vendor/spec-core/pattern/regex.d.ts +68 -0
- package/dist/vendor/spec-core/pattern/regex.d.ts.map +1 -0
- package/dist/vendor/spec-core/pattern/regex.js +813 -0
- package/dist/vendor/spec-core/pattern/regex.js.map +1 -0
- package/dist/vendor/spec-core/text/index.d.ts +3 -0
- package/dist/vendor/spec-core/text/index.d.ts.map +1 -0
- package/dist/vendor/spec-core/text/index.js +2 -0
- package/dist/vendor/spec-core/text/index.js.map +1 -0
- package/dist/vendor/spec-core/text/lines.d.ts +73 -0
- package/dist/vendor/spec-core/text/lines.d.ts.map +1 -0
- package/dist/vendor/spec-core/text/lines.js +156 -0
- package/dist/vendor/spec-core/text/lines.js.map +1 -0
- package/package.json +9 -2
- package/src/vendor/spec-core/LICENSE +21 -0
- package/src/vendor/spec-core/README.md +8 -0
package/dist/prove.js
ADDED
|
@@ -0,0 +1,549 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `spec-guard prove`: can each rule actually fail? ADR-0016.
|
|
3
|
+
*
|
|
4
|
+
* A rule that cannot fail is a green light that proves nothing. A directory
|
|
5
|
+
* renamed under a target, a `glob` that misses the extension the code is
|
|
6
|
+
* written in, a module name nothing imports by that name: each leaves a rule
|
|
7
|
+
* that passes today and would pass whatever the code did. A run cannot tell
|
|
8
|
+
* that rule from one that holds, because both pass.
|
|
9
|
+
*
|
|
10
|
+
* So each rule in force is shown a violation of itself and has to fail. The
|
|
11
|
+
* violation is made in memory - a file added, a line put at the top of one, a
|
|
12
|
+
* file emptied or removed - through an overlay on the door every read goes
|
|
13
|
+
* through, and the rule is executed over that tree exactly as a run executes
|
|
14
|
+
* it. Nothing is written to disk and nothing touches git. A rule the violation
|
|
15
|
+
* fails is `killed`; one that still passes `survived`, and the violation is
|
|
16
|
+
* reported, because that is the finding; one no violation could be made for is
|
|
17
|
+
* `unprovable`, with the reason.
|
|
18
|
+
*/
|
|
19
|
+
import path from 'node:path';
|
|
20
|
+
import { buildJsRegExp, createJavaScriptEngine, enumerateCandidates } from './engine.js';
|
|
21
|
+
import { createExcludeMatcher, createPathMatcher, moduleWitness } from './glob.js';
|
|
22
|
+
import { isGraphFile } from './graph.js';
|
|
23
|
+
import { ANALYSABLE_EXTENSIONS, createImportIndex, JS_EXTENSIONS } from './imports.js';
|
|
24
|
+
import { nodeIo, readText } from './io.js';
|
|
25
|
+
import { layerMatcher } from './layers.js';
|
|
26
|
+
import { overlayIo, readOnce } from './overlay.js';
|
|
27
|
+
import { governs, within } from './rules.js';
|
|
28
|
+
import { createScopeProbe, DEFAULT_MAX_SNIPPETS, elapsed, executeAssertion, planRun } from './runner.js';
|
|
29
|
+
import { readSpecs, specPath } from './specs.js';
|
|
30
|
+
import { createTreeIndex, expandPartner } from './structure.js';
|
|
31
|
+
/** The name every file `prove` adds starts with, so a reader can tell which ones it made. */
|
|
32
|
+
export const PROVE_NAME = 'spec-guard-prove';
|
|
33
|
+
/** Executes one assertion over a tree, sharing nothing with any other execution. */
|
|
34
|
+
function execute(assertion, io, context) {
|
|
35
|
+
const { options, root } = context;
|
|
36
|
+
return executeAssertion(assertion, {
|
|
37
|
+
root,
|
|
38
|
+
io,
|
|
39
|
+
engine: createJavaScriptEngine(io),
|
|
40
|
+
allowMissingTargets: options.allowMissingTargets ?? false,
|
|
41
|
+
strictTargets: options.strictTargets ?? false,
|
|
42
|
+
allowEmptyScope: options.allowEmptyScope ?? false,
|
|
43
|
+
maxSnippets: DEFAULT_MAX_SNIPPETS,
|
|
44
|
+
imports: createImportIndex(io),
|
|
45
|
+
hasFiles: createScopeProbe(io),
|
|
46
|
+
tree: createTreeIndex(root, io),
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
const edit = (write, remove = []) => ({ write, remove: new Set(remove) });
|
|
50
|
+
async function placesFor(assertion, context, accepts, suits = () => true) {
|
|
51
|
+
const targets = [];
|
|
52
|
+
for (const target of assertion.targets) {
|
|
53
|
+
if ((await context.io.stat(path.resolve(context.root, target))) !== null)
|
|
54
|
+
targets.push(target);
|
|
55
|
+
}
|
|
56
|
+
if (targets.length === 0)
|
|
57
|
+
return `none of its targets exists (${assertion.targets.join(', ')})`;
|
|
58
|
+
const search = assertion.search;
|
|
59
|
+
const list = async (options) => (await enumerateCandidates({ root: context.root, targets, options }, undefined, context.io)).files
|
|
60
|
+
.map((file) => file.relativePath)
|
|
61
|
+
.filter(accepts);
|
|
62
|
+
const read = { files: await list(search), read: true };
|
|
63
|
+
if (read.files.length > 0 && suits(read))
|
|
64
|
+
return read;
|
|
65
|
+
// Every file under its targets: the rule's own glob and exclude both set
|
|
66
|
+
// aside, by one empty list that stands for no filter in either.
|
|
67
|
+
const none = [];
|
|
68
|
+
const under = { files: await list({ ...search, globs: none, excludeGlobs: none }), read: false };
|
|
69
|
+
if (under.files.length > 0)
|
|
70
|
+
return under;
|
|
71
|
+
return `nothing under ${targets.join(', ')} is a file a violation could be put beside`;
|
|
72
|
+
}
|
|
73
|
+
/** `dir/spec-guard-prove.ext`, numbered from the second: where an added file goes. */
|
|
74
|
+
function provePath(directory, extension, index, suffix) {
|
|
75
|
+
const name = `${PROVE_NAME}${index === 0 ? '' : `-${index + 1}`}${suffix}${extension}`;
|
|
76
|
+
return directory === '.' ? name : `${directory}/${name}`;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Each extension the files have, with the directory of the first file that has
|
|
80
|
+
* it: one kind of file a violation can be written as, and where it goes.
|
|
81
|
+
*/
|
|
82
|
+
function kinds(files) {
|
|
83
|
+
const directories = new Map();
|
|
84
|
+
for (const file of files) {
|
|
85
|
+
const extension = path.posix.extname(file);
|
|
86
|
+
if (!directories.has(extension))
|
|
87
|
+
directories.set(extension, path.posix.dirname(file));
|
|
88
|
+
}
|
|
89
|
+
return directories;
|
|
90
|
+
}
|
|
91
|
+
/** Whether a rule's scope would reach a file at this path. */
|
|
92
|
+
function reaches(assertion, relativePath, context) {
|
|
93
|
+
return governs(assertion, { path: relativePath, shape: 'file', absolutePath: path.resolve(context.root, relativePath) });
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* New files beside the ones in `places`, `count` of each kind they hold, for
|
|
97
|
+
* each kind in turn. Beside files the rule reads, only paths it would read
|
|
98
|
+
* too, since a violation a rule cannot see shows nothing about it; and never
|
|
99
|
+
* a path one of those files already has.
|
|
100
|
+
*/
|
|
101
|
+
function besides(assertion, places, context, count, contents, suffix) {
|
|
102
|
+
return [...kinds(places.files)].flatMap(([extension, directory]) => {
|
|
103
|
+
const paths = Array.from({ length: count }, (_, index) => provePath(directory, extension, index, suffix));
|
|
104
|
+
const usable = paths.every((file) => !places.files.includes(file) && (!places.read || reaches(assertion, file, context)));
|
|
105
|
+
return usable ? [new Map(paths.map((file) => [file, contents(file)]))] : [];
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
/** What a report adds to a violation made beside code the rule does not read. */
|
|
109
|
+
function unread(assertion, places) {
|
|
110
|
+
return places.read ? '' : `, beside the code under ${assertion.targets.join(', ')}, none of which the rule reads`;
|
|
111
|
+
}
|
|
112
|
+
/** How many more violations the rule's maximum takes to exceed. */
|
|
113
|
+
function excess(assertion, now) {
|
|
114
|
+
return assertion.bounds.max - now.actual + 1;
|
|
115
|
+
}
|
|
116
|
+
/* -------------------------------------------------------------------- text */
|
|
117
|
+
/**
|
|
118
|
+
* Text a regular expression matches, or null.
|
|
119
|
+
*
|
|
120
|
+
* Built for what a rule is written with - literals, escapes, classes, groups,
|
|
121
|
+
* alternatives, counted repetition - and held to the rule's own matcher before
|
|
122
|
+
* it is used, so a wrong guess is never reported as a violation: it makes the
|
|
123
|
+
* rule `unprovable`, with the reason. Lookaround and backreferences are not
|
|
124
|
+
* guessed at.
|
|
125
|
+
*/
|
|
126
|
+
export function regexWitness(source) {
|
|
127
|
+
const ESCAPES = { d: '0', D: 'a', w: 'a', W: '-', s: ' ', S: 'a', b: '', B: '', n: '\n', t: '\t' };
|
|
128
|
+
let at = 0;
|
|
129
|
+
const alternation = () => {
|
|
130
|
+
const options = [sequence()];
|
|
131
|
+
while (source.charAt(at) === '|') {
|
|
132
|
+
at += 1;
|
|
133
|
+
options.push(sequence());
|
|
134
|
+
}
|
|
135
|
+
return options.find((option) => option !== null) ?? null;
|
|
136
|
+
};
|
|
137
|
+
const sequence = () => {
|
|
138
|
+
let text = '';
|
|
139
|
+
while (at < source.length && source.charAt(at) !== '|' && source.charAt(at) !== ')') {
|
|
140
|
+
const piece = atom();
|
|
141
|
+
const times = repetition();
|
|
142
|
+
text = text === null || piece === null ? null : text + piece.repeat(times);
|
|
143
|
+
}
|
|
144
|
+
return text;
|
|
145
|
+
};
|
|
146
|
+
const repetition = () => {
|
|
147
|
+
const counted = /^(?:([*?])|(\+)|\{(\d+)(?:,\d*)?\})\??/.exec(source.slice(at));
|
|
148
|
+
if (counted === null)
|
|
149
|
+
return 1;
|
|
150
|
+
at += counted[0].length;
|
|
151
|
+
return counted[3] !== undefined ? Number(counted[3]) : counted[2] !== undefined ? 1 : 0;
|
|
152
|
+
};
|
|
153
|
+
const atom = () => {
|
|
154
|
+
const char = source.charAt(at);
|
|
155
|
+
at += 1;
|
|
156
|
+
if (char === '(') {
|
|
157
|
+
const group = /^(?:\?(?::|<[A-Za-z_]\w*>|(<?[=!])))?/.exec(source.slice(at));
|
|
158
|
+
at += group[0].length;
|
|
159
|
+
const inner = alternation();
|
|
160
|
+
at += 1;
|
|
161
|
+
return group[1] === undefined ? inner : null;
|
|
162
|
+
}
|
|
163
|
+
if (char === '[') {
|
|
164
|
+
// Up to the first `]` that is not escaped, even straight after the `[`:
|
|
165
|
+
// in JavaScript `[]` is a class that matches nothing.
|
|
166
|
+
const body = /^(?:\\.|[^\\\]])*/.exec(source.slice(at))[0];
|
|
167
|
+
at += body.length + 1;
|
|
168
|
+
const member = new RegExp(`^[${body}]$`);
|
|
169
|
+
return ['a', '0', ...body].find((candidate) => member.test(candidate)) ?? null;
|
|
170
|
+
}
|
|
171
|
+
if (char === '\\') {
|
|
172
|
+
const next = source.charAt(at);
|
|
173
|
+
at += 1;
|
|
174
|
+
return /[1-9kpPcxu]/.test(next) ? null : (ESCAPES[next] ?? next);
|
|
175
|
+
}
|
|
176
|
+
if (char === '.')
|
|
177
|
+
return 'a';
|
|
178
|
+
return char === '^' || char === '$' ? '' : char;
|
|
179
|
+
};
|
|
180
|
+
const text = alternation();
|
|
181
|
+
return at === source.length && text !== '' ? text : null;
|
|
182
|
+
}
|
|
183
|
+
/** The text a text rule forbids, or why none could be made. */
|
|
184
|
+
function forbidden(assertion) {
|
|
185
|
+
const symbol = assertion.symbol;
|
|
186
|
+
const options = assertion.search;
|
|
187
|
+
const text = options.regex ? regexWitness(symbol) : symbol;
|
|
188
|
+
if (text !== null && text.search(buildJsRegExp(symbol, options)) !== -1)
|
|
189
|
+
return { text };
|
|
190
|
+
return {
|
|
191
|
+
reason: `no text could be made that the regular expression ${symbol} matches: prove writes text for literals, classes, groups, alternatives and counted repetition, not for lookaround or backreferences`,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
async function textViolations(assertion, claim, now, context) {
|
|
195
|
+
const symbol = assertion.symbol;
|
|
196
|
+
if (claim === 'min') {
|
|
197
|
+
// Every line holding a match goes, from every file that holds one, which
|
|
198
|
+
// leaves none: fewer than any minimum a passing rule can have. A match that
|
|
199
|
+
// spans lines survives that, and empties its file. Nothing is removed, since
|
|
200
|
+
// a file the rule names as its target would then fail it for being missing.
|
|
201
|
+
const matcher = buildJsRegExp(symbol, assertion.search);
|
|
202
|
+
const write = new Map();
|
|
203
|
+
const trimmed = [];
|
|
204
|
+
const emptied = [];
|
|
205
|
+
let taken = 0;
|
|
206
|
+
for (const { file } of now.fileMatches) {
|
|
207
|
+
const lines = (await readText(context.io, path.resolve(context.root, file))).split('\n');
|
|
208
|
+
const kept = lines.filter((line) => line.search(matcher) === -1);
|
|
209
|
+
const text = kept.join('\n');
|
|
210
|
+
const spans = text.search(matcher) !== -1;
|
|
211
|
+
write.set(file, spans ? '' : text);
|
|
212
|
+
(spans ? emptied : trimmed).push(file);
|
|
213
|
+
taken += spans ? 0 : lines.length - kept.length;
|
|
214
|
+
}
|
|
215
|
+
const parts = [
|
|
216
|
+
...(trimmed.length > 0 ? [`removed ${taken} line${taken === 1 ? '' : 's'} holding "${symbol}" from ${trimmed.join(', ')}`] : []),
|
|
217
|
+
...(emptied.length > 0 ? [`emptied ${emptied.join(', ')}, where a match spans lines`] : []),
|
|
218
|
+
];
|
|
219
|
+
return [{ violation: parts.join(', and '), edit: edit(write) }];
|
|
220
|
+
}
|
|
221
|
+
const text = forbidden(assertion);
|
|
222
|
+
if ('reason' in text)
|
|
223
|
+
return text.reason;
|
|
224
|
+
const places = await placesFor(assertion, context, () => true);
|
|
225
|
+
if (typeof places === 'string')
|
|
226
|
+
return places;
|
|
227
|
+
const need = excess(assertion, now);
|
|
228
|
+
const lines = Array.from({ length: need }, () => text.text).join('\n');
|
|
229
|
+
const times = need === 1 ? '' : ` ${need} times`;
|
|
230
|
+
const violations = besides(assertion, places, context, 1, () => lines, '').map((write) => ({
|
|
231
|
+
violation: `added ${[...write.keys()][0]} holding "${text.text}"${times}${unread(assertion, places)}`,
|
|
232
|
+
edit: edit(write),
|
|
233
|
+
}));
|
|
234
|
+
if (!places.read)
|
|
235
|
+
return violations;
|
|
236
|
+
// A rule whose glob names files rather than kinds reaches no new file, and
|
|
237
|
+
// the text goes at the top of one it already reads: before anything a file
|
|
238
|
+
// could open, so it is read as code.
|
|
239
|
+
const first = places.files[0];
|
|
240
|
+
const source = await readText(context.io, path.resolve(context.root, first));
|
|
241
|
+
return [...violations, { violation: `put "${text.text}"${times} at the top of ${first}`, edit: edit(new Map([[first, `${lines}\n${source}`]])) }];
|
|
242
|
+
}
|
|
243
|
+
/* ----------------------------------------------------------------- imports */
|
|
244
|
+
/** A line that depends on `module`, in the language of a file with this extension. */
|
|
245
|
+
export function importLine(extension, module) {
|
|
246
|
+
if (JS_EXTENSIONS.has(extension))
|
|
247
|
+
return `import '${module}';\n`;
|
|
248
|
+
if (extension === '.py' || extension === '.pyi')
|
|
249
|
+
return `import ${module.replaceAll('/', '.')}\n`;
|
|
250
|
+
if (extension === '.go')
|
|
251
|
+
return `package prove\n\nimport "${module}"\n`;
|
|
252
|
+
if (extension === '.rs')
|
|
253
|
+
return `use ${module.replaceAll('/', '::')};\n`;
|
|
254
|
+
return `using ${module.replaceAll('/', '.')};\n`;
|
|
255
|
+
}
|
|
256
|
+
const analysable = (file) => ANALYSABLE_EXTENSIONS.has(path.posix.extname(file));
|
|
257
|
+
async function importViolations(assertion, claim, now, context) {
|
|
258
|
+
if (claim === 'min') {
|
|
259
|
+
// Emptied rather than removed: a file the rule names as its target would
|
|
260
|
+
// otherwise fail it for being missing, which is not the claim.
|
|
261
|
+
const files = now.fileMatches.map(({ file }) => file);
|
|
262
|
+
const which = files.length === 1 ? 'the file' : 'the files';
|
|
263
|
+
return [{ violation: `emptied ${files.join(', ')}, ${which} importing it`, edit: edit(new Map(files.map((file) => [file, '']))) }];
|
|
264
|
+
}
|
|
265
|
+
const modules = assertion.imports.modules;
|
|
266
|
+
const module = modules.map(moduleWitness).find((name) => name !== null);
|
|
267
|
+
if (module === undefined)
|
|
268
|
+
return `no module name matches ${modules.join(', ')}`;
|
|
269
|
+
const places = await placesFor(assertion, context, analysable);
|
|
270
|
+
if (typeof places === 'string')
|
|
271
|
+
return places;
|
|
272
|
+
const need = excess(assertion, now);
|
|
273
|
+
const violations = besides(assertion, places, context, need, (file) => importLine(path.posix.extname(file), module), '').map((write) => ({
|
|
274
|
+
violation: `added ${[...write.keys()].join(', ')} importing ${module}${unread(assertion, places)}`,
|
|
275
|
+
edit: edit(write),
|
|
276
|
+
}));
|
|
277
|
+
// A rule whose exclude names files reaches no new one, and the import goes at
|
|
278
|
+
// the top of the first file it reads. The unit is files, so that crosses a
|
|
279
|
+
// maximum only when one more file is enough.
|
|
280
|
+
if (!places.read || need > 1)
|
|
281
|
+
return violations;
|
|
282
|
+
const first = places.files[0];
|
|
283
|
+
const source = await readText(context.io, path.resolve(context.root, first));
|
|
284
|
+
return [...violations, { violation: `made ${first} import ${module}`, edit: edit(new Map([[first, `${importLine(path.posix.extname(first), module)}${source}`]])) }];
|
|
285
|
+
}
|
|
286
|
+
async function cycleViolations(assertion, now, context) {
|
|
287
|
+
const places = await placesFor(assertion, context, isGraphFile);
|
|
288
|
+
if (typeof places === 'string')
|
|
289
|
+
return places;
|
|
290
|
+
const need = excess(assertion, now);
|
|
291
|
+
// Extensionless, which the resolver reads as the path with each extension it knows.
|
|
292
|
+
const specifier = (file) => `./${path.posix.basename(file, path.posix.extname(file))}`;
|
|
293
|
+
// `spec-guard-prove-a.ts` and `spec-guard-prove-b.ts`, beside each other.
|
|
294
|
+
const partner = (first) => {
|
|
295
|
+
const extension = path.posix.extname(first);
|
|
296
|
+
return `${first.slice(0, first.length - extension.length - 1)}b${extension}`;
|
|
297
|
+
};
|
|
298
|
+
const pairs = besides(assertion, places, context, need, (first) => `import '${specifier(partner(first))}';\n`, '-a');
|
|
299
|
+
return pairs.map((firsts) => {
|
|
300
|
+
const write = new Map();
|
|
301
|
+
for (const [first, text] of firsts) {
|
|
302
|
+
write.set(first, text);
|
|
303
|
+
write.set(partner(first), `import '${specifier(first)}';\n`);
|
|
304
|
+
}
|
|
305
|
+
return { violation: `added ${[...write.keys()].join(' and ')}, which import each other${unread(assertion, places)}`, edit: edit(write) };
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
async function layerViolations(assertion, now, context) {
|
|
309
|
+
const order = assertion.layers;
|
|
310
|
+
const layersOf = layerMatcher(order);
|
|
311
|
+
// A file in a layer another is listed after. No file of a rule that passes is
|
|
312
|
+
// claimed by two layers: the rule fails on it.
|
|
313
|
+
const below = (file) => layersOf(file).some((layer) => layer < order.length - 1);
|
|
314
|
+
const places = await placesFor(assertion, context, analysable, (read) => read.files.some(below));
|
|
315
|
+
if (typeof places === 'string')
|
|
316
|
+
return places;
|
|
317
|
+
const lower = places.files.find(below);
|
|
318
|
+
if (lower === undefined)
|
|
319
|
+
return 'no file under its targets belongs to exactly one layer that another layer is listed after';
|
|
320
|
+
const layer = layersOf(lower)[0];
|
|
321
|
+
const upper = moduleWitness(order[layer + 1]);
|
|
322
|
+
if (upper === null)
|
|
323
|
+
return `no module name matches the layer ${order[layer + 1]}`;
|
|
324
|
+
const need = excess(assertion, now);
|
|
325
|
+
const line = importLine(path.posix.extname(lower), upper);
|
|
326
|
+
const from = `from the layer ${order[layer + 1]} above it`;
|
|
327
|
+
// The new files sit beside the lower file, so they share its layer unless
|
|
328
|
+
// the layers are the files themselves, and then they are in none.
|
|
329
|
+
const violations = besides(assertion, { files: [lower], read: places.read }, context, need, () => line, '')
|
|
330
|
+
.filter((write) => layersOf(write.keys().next().value).join() === String(layer))
|
|
331
|
+
.map((write) => ({
|
|
332
|
+
violation: `added ${[...write.keys()].join(', ')} in the layer ${order[layer]}, importing ${upper} ${from}${unread(assertion, places)}`,
|
|
333
|
+
edit: edit(write),
|
|
334
|
+
}));
|
|
335
|
+
// One file made to import across is one violating file, as above.
|
|
336
|
+
if (!places.read || need > 1)
|
|
337
|
+
return violations;
|
|
338
|
+
const source = await readText(context.io, path.resolve(context.root, lower));
|
|
339
|
+
return [...violations, { violation: `made ${lower}, in the layer ${order[layer]}, import ${upper} ${from}`, edit: edit(new Map([[lower, `${line}${source}`]])) }];
|
|
340
|
+
}
|
|
341
|
+
/* --------------------------------------------------------------- structure */
|
|
342
|
+
async function structureViolations(assertion, now, context) {
|
|
343
|
+
const structure = assertion.structure;
|
|
344
|
+
const need = excess(assertion, now);
|
|
345
|
+
if (structure.claim === 'required') {
|
|
346
|
+
// The first entry, out of the first directories the rule selects.
|
|
347
|
+
const directories = await selected(assertion, context);
|
|
348
|
+
if (directories.length === 0)
|
|
349
|
+
return 'it selects no directory, so there is no entry to take away';
|
|
350
|
+
const [entry] = structure.values;
|
|
351
|
+
const named = createPathMatcher(path.posix.basename(entry));
|
|
352
|
+
const remove = [];
|
|
353
|
+
for (const directory of directories.slice(0, need)) {
|
|
354
|
+
const holder = path.posix.join(directory, path.posix.dirname(entry));
|
|
355
|
+
const listing = await context.io.readDirectory(path.resolve(context.root, holder));
|
|
356
|
+
remove.push(...listing.filter((item) => named(item.name)).map((item) => path.posix.join(holder, item.name)).sort());
|
|
357
|
+
}
|
|
358
|
+
return [{ violation: `removed ${remove.join(', ')}, which ${entry} names`, edit: edit(new Map(), remove) }];
|
|
359
|
+
}
|
|
360
|
+
const places = await placesFor(assertion, context, () => true);
|
|
361
|
+
if (typeof places === 'string')
|
|
362
|
+
return places;
|
|
363
|
+
if (structure.claim === 'partner' && places.read) {
|
|
364
|
+
// Every partner of the first files the rule reads, taken away.
|
|
365
|
+
const remove = [];
|
|
366
|
+
const orphans = places.files.slice(0, need);
|
|
367
|
+
for (const file of orphans) {
|
|
368
|
+
const target = assertion.targets.find((candidate) => within(file, candidate));
|
|
369
|
+
for (const template of structure.values) {
|
|
370
|
+
const partner = expandPartner(template, file, target);
|
|
371
|
+
if ((await context.io.stat(path.resolve(context.root, partner)))?.isFile())
|
|
372
|
+
remove.push(partner);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
return [{ violation: `removed ${remove.join(', ')}, the partner of ${orphans.join(', ')}`, edit: edit(new Map(), remove) }];
|
|
376
|
+
}
|
|
377
|
+
// A file no pattern names, or one with no partner, beside the files the rule reads.
|
|
378
|
+
const says = structure.claim === 'pattern' ? `named by none of ${structure.values.join(', ')}` : 'with no partner';
|
|
379
|
+
return besides(assertion, places, context, need, () => '', '').map((write) => ({
|
|
380
|
+
violation: `added ${[...write.keys()].join(', ')}, ${says}${unread(assertion, places)}`,
|
|
381
|
+
edit: edit(write),
|
|
382
|
+
}));
|
|
383
|
+
}
|
|
384
|
+
/** The directories a required-entries rule holds to its entries, in walk order. */
|
|
385
|
+
async function selected(assertion, context) {
|
|
386
|
+
const structure = assertion.structure;
|
|
387
|
+
const search = assertion.search;
|
|
388
|
+
const excluded = createExcludeMatcher(search.excludeGlobs);
|
|
389
|
+
const tree = createTreeIndex(context.root, context.io);
|
|
390
|
+
const directories = [];
|
|
391
|
+
for (const target of assertion.targets) {
|
|
392
|
+
if (!(await context.io.stat(path.resolve(context.root, target)))?.isDirectory())
|
|
393
|
+
continue;
|
|
394
|
+
if (structure.dirs === undefined) {
|
|
395
|
+
if (!excluded(target))
|
|
396
|
+
directories.push(target);
|
|
397
|
+
continue;
|
|
398
|
+
}
|
|
399
|
+
const selects = createPathMatcher(structure.dirs);
|
|
400
|
+
const walked = await tree.walk(target, search.scope);
|
|
401
|
+
directories.push(...walked.directories.filter((directory) => !excluded(directory) && selects(path.posix.relative(target, directory))));
|
|
402
|
+
}
|
|
403
|
+
return directories;
|
|
404
|
+
}
|
|
405
|
+
/* ------------------------------------------------------------------- rules */
|
|
406
|
+
/** The claims of a rule a violation can cross: its maximum, and a minimum above zero. */
|
|
407
|
+
function claimsOf(assertion) {
|
|
408
|
+
if (assertion.kind === 'assert-present')
|
|
409
|
+
return ['present'];
|
|
410
|
+
const claims = [];
|
|
411
|
+
if (assertion.bounds.max !== undefined)
|
|
412
|
+
claims.push('max');
|
|
413
|
+
if ((assertion.bounds.min ?? 0) > 0)
|
|
414
|
+
claims.push('min');
|
|
415
|
+
return claims;
|
|
416
|
+
}
|
|
417
|
+
function violationsFor(assertion, claim, now, context) {
|
|
418
|
+
switch (assertion.kind) {
|
|
419
|
+
case 'assert-present': {
|
|
420
|
+
const [file] = assertion.files;
|
|
421
|
+
return Promise.resolve([{ violation: `removed ${file}`, edit: edit(new Map(), [file]) }]);
|
|
422
|
+
}
|
|
423
|
+
case 'assert-import-absence':
|
|
424
|
+
case 'assert-import-count':
|
|
425
|
+
return importViolations(assertion, claim, now, context);
|
|
426
|
+
case 'assert-import-cycle':
|
|
427
|
+
return cycleViolations(assertion, now, context);
|
|
428
|
+
case 'assert-layers':
|
|
429
|
+
return layerViolations(assertion, now, context);
|
|
430
|
+
case 'assert-structure':
|
|
431
|
+
return structureViolations(assertion, now, context);
|
|
432
|
+
default:
|
|
433
|
+
return textViolations(assertion, claim, now, context);
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
/** Each change an edit made, named against the tree as it is. */
|
|
437
|
+
async function changesOf(change, context) {
|
|
438
|
+
const changes = [];
|
|
439
|
+
for (const [file, text] of change.write) {
|
|
440
|
+
const exists = (await context.io.stat(path.resolve(context.root, file))) !== null;
|
|
441
|
+
changes.push({ path: file, change: exists ? 'replaced' : 'added', bytes: Buffer.byteLength(text) });
|
|
442
|
+
}
|
|
443
|
+
for (const file of change.remove)
|
|
444
|
+
changes.push({ path: file, change: 'removed' });
|
|
445
|
+
return changes;
|
|
446
|
+
}
|
|
447
|
+
/**
|
|
448
|
+
* Tries each violation made for a claim until one fails the rule on it.
|
|
449
|
+
*
|
|
450
|
+
* The first that does is the probe. When none does, the first is: it is the
|
|
451
|
+
* most direct violation of the claim, and the one a reader should look at.
|
|
452
|
+
*/
|
|
453
|
+
async function probe(assertion, claim, now, context) {
|
|
454
|
+
const violations = await violationsFor(assertion, claim, now, context);
|
|
455
|
+
if (typeof violations === 'string')
|
|
456
|
+
return violations;
|
|
457
|
+
if (violations.length === 0)
|
|
458
|
+
return 'every place a violation could go is one the rule does not read, or holds a file already';
|
|
459
|
+
let first;
|
|
460
|
+
for (const { violation, edit: change } of violations) {
|
|
461
|
+
const result = await execute(assertion, overlayIo(context.io, context.root, change), context);
|
|
462
|
+
const tried = {
|
|
463
|
+
claim,
|
|
464
|
+
outcome: result.ok ? 'survived' : 'killed',
|
|
465
|
+
violation,
|
|
466
|
+
changes: await changesOf(change, context),
|
|
467
|
+
message: result.message,
|
|
468
|
+
actual: result.actual,
|
|
469
|
+
};
|
|
470
|
+
if (tried.outcome === 'killed')
|
|
471
|
+
return tried;
|
|
472
|
+
first ??= tried;
|
|
473
|
+
}
|
|
474
|
+
return first;
|
|
475
|
+
}
|
|
476
|
+
async function proveAssertion(assertion, context) {
|
|
477
|
+
const startedAt = performance.now();
|
|
478
|
+
const base = { kind: assertion.kind, location: assertion.location, description: assertion.description, reason: assertion.reason };
|
|
479
|
+
const now = await execute(assertion, context.io, context);
|
|
480
|
+
if (!now.ok) {
|
|
481
|
+
return {
|
|
482
|
+
...base,
|
|
483
|
+
outcome: 'unprovable',
|
|
484
|
+
unprovable: `it fails on the tree as it stands (${now.message}), so no change can be shown to be what fails it`,
|
|
485
|
+
probes: [],
|
|
486
|
+
durationMs: elapsed(startedAt),
|
|
487
|
+
};
|
|
488
|
+
}
|
|
489
|
+
// Only a maximum can be a claim no violation is made for: a minimum a passing
|
|
490
|
+
// rule holds has matches to take away, and a presence rule a file to remove.
|
|
491
|
+
const probes = [];
|
|
492
|
+
let unprovable;
|
|
493
|
+
for (const claim of claimsOf(assertion)) {
|
|
494
|
+
const found = await probe(assertion, claim, now, context);
|
|
495
|
+
if (typeof found === 'string')
|
|
496
|
+
unprovable = found;
|
|
497
|
+
else
|
|
498
|
+
probes.push(found);
|
|
499
|
+
}
|
|
500
|
+
const outcome = probes.some((found) => found.outcome === 'survived') ? 'survived' : unprovable === undefined ? 'killed' : 'unprovable';
|
|
501
|
+
return {
|
|
502
|
+
...base,
|
|
503
|
+
outcome,
|
|
504
|
+
...(unprovable === undefined ? {} : { unprovable }),
|
|
505
|
+
probes,
|
|
506
|
+
durationMs: elapsed(startedAt),
|
|
507
|
+
};
|
|
508
|
+
}
|
|
509
|
+
/**
|
|
510
|
+
* Shows each rule in force a violation of itself, in memory, and reports which
|
|
511
|
+
* ones failed.
|
|
512
|
+
*
|
|
513
|
+
* Reads through `options.io` as a run does, and through the filesystem when it
|
|
514
|
+
* is given none, and writes nothing. Rules are proved one at a time, each over
|
|
515
|
+
* its own tree, in the order the specs state them, so the report is the same
|
|
516
|
+
* every time the tree is.
|
|
517
|
+
*/
|
|
518
|
+
export async function proveSpecGuard(options) {
|
|
519
|
+
const startedAt = performance.now();
|
|
520
|
+
const root = path.resolve(options.root ?? process.cwd());
|
|
521
|
+
const io = readOnce(options.io ?? nodeIo);
|
|
522
|
+
const plan = planRun(await readSpecs(options.patterns, root, io), root, options);
|
|
523
|
+
const context = { root, io, options };
|
|
524
|
+
const results = [];
|
|
525
|
+
for (const assertion of plan.assertions)
|
|
526
|
+
results.push(await proveAssertion(assertion, context));
|
|
527
|
+
const count = (outcome) => results.filter((result) => result.outcome === outcome).length;
|
|
528
|
+
return {
|
|
529
|
+
ok: count('survived') === 0 && plan.errors.length === 0,
|
|
530
|
+
root,
|
|
531
|
+
durationMs: elapsed(startedAt),
|
|
532
|
+
summary: {
|
|
533
|
+
specs: plan.specFiles.length,
|
|
534
|
+
total: results.length,
|
|
535
|
+
killed: count('killed'),
|
|
536
|
+
survived: count('survived'),
|
|
537
|
+
unprovable: count('unprovable'),
|
|
538
|
+
inactive: plan.withheld,
|
|
539
|
+
},
|
|
540
|
+
results,
|
|
541
|
+
errors: plan.errors,
|
|
542
|
+
inactiveSpecs: plan.inactiveSpecs,
|
|
543
|
+
specWarnings: plan.warnings,
|
|
544
|
+
maskedDirectives: plan.masked,
|
|
545
|
+
exclude: plan.exclude,
|
|
546
|
+
specFiles: plan.specFiles.map((file) => specPath(root, file)),
|
|
547
|
+
};
|
|
548
|
+
}
|
|
549
|
+
//# sourceMappingURL=prove.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prove.js","sourceRoot":"","sources":["../src/prove.ts"],"names":[],"mappings":"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"}
|
package/dist/query.d.ts
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { type Io } from './io.js';
|
|
11
11
|
import { type DocumentView, type QueryPath, type RuleView } from './rules.js';
|
|
12
|
-
import { type SpecDocument } from './specs.js';
|
|
12
|
+
import { type DocumentMemo, type SpecDocument } from './specs.js';
|
|
13
13
|
import type { Assertion, ConfigUse, DirectiveError } from './types.js';
|
|
14
14
|
export interface RuleSetOptions {
|
|
15
15
|
/** Globs or paths of the Markdown specs. */
|
|
@@ -22,6 +22,17 @@ export interface RuleSetOptions {
|
|
|
22
22
|
defaultSkips?: boolean;
|
|
23
23
|
/** The project's exclusions, which govern what each rule covers as they do in a run. */
|
|
24
24
|
exclude?: readonly string[];
|
|
25
|
+
/**
|
|
26
|
+
* The door the specs are found and read through, as a run's `io` is
|
|
27
|
+
* (ADR-0014). The filesystem when none is given.
|
|
28
|
+
*/
|
|
29
|
+
io?: Io;
|
|
30
|
+
/**
|
|
31
|
+
* Documents parsed by an earlier read, for a caller that reads the specs on
|
|
32
|
+
* every request, as the MCP server does. Every document is parsed when none
|
|
33
|
+
* is given.
|
|
34
|
+
*/
|
|
35
|
+
documents?: DocumentMemo;
|
|
25
36
|
}
|
|
26
37
|
/** Every rule the specs state, resolved, with the document that states it. */
|
|
27
38
|
export interface RuleSet {
|
|
@@ -127,6 +138,12 @@ export declare function answerQuery(ruleSet: RuleSet, paths: ReadonlyArray<Query
|
|
|
127
138
|
export declare function queryRules(options: QueryOptions): Promise<QueryReport>;
|
|
128
139
|
/** The human-readable form of a query. */
|
|
129
140
|
export declare function formatQuery(report: QueryReport): string;
|
|
141
|
+
/**
|
|
142
|
+
* The version of `query --json`'s document, which moves when a field is removed
|
|
143
|
+
* or renamed and not when one is added. It came late, at 1, since nothing had
|
|
144
|
+
* been removed or renamed before it did.
|
|
145
|
+
*/
|
|
146
|
+
export declare const QUERY_FORMAT_VERSION = 1;
|
|
130
147
|
/** The JSON form of a query, stable enough for a script to depend on. */
|
|
131
148
|
export declare function formatQueryJson(report: QueryReport): string;
|
|
132
149
|
/** Whether a location lies in any of the queried paths. */
|
package/dist/query.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,EAAU,KAAK,EAAE,EAAE,MAAM,SAAS,CAAC;AAI1C,OAAO,EAAkD,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC9H,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}
|