@descent-vtt/spec-guard 0.11.0 → 0.12.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.
Files changed (157) hide show
  1. package/CHANGELOG.md +354 -3
  2. package/README.md +377 -22
  3. package/dist/cites.d.ts +192 -0
  4. package/dist/cites.d.ts.map +1 -0
  5. package/dist/cites.js +599 -0
  6. package/dist/cites.js.map +1 -0
  7. package/dist/cli.d.ts +14 -6
  8. package/dist/cli.d.ts.map +1 -1
  9. package/dist/cli.js +315 -22
  10. package/dist/cli.js.map +1 -1
  11. package/dist/comments.d.ts +1 -1
  12. package/dist/comments.js +1 -1
  13. package/dist/config.d.ts +3 -0
  14. package/dist/config.d.ts.map +1 -1
  15. package/dist/config.js +46 -5
  16. package/dist/config.js.map +1 -1
  17. package/dist/engine.d.ts.map +1 -1
  18. package/dist/engine.js +38 -14
  19. package/dist/engine.js.map +1 -1
  20. package/dist/glob.d.ts +128 -24
  21. package/dist/glob.d.ts.map +1 -1
  22. package/dist/glob.js +304 -61
  23. package/dist/glob.js.map +1 -1
  24. package/dist/impact.d.ts +179 -0
  25. package/dist/impact.d.ts.map +1 -0
  26. package/dist/impact.js +360 -0
  27. package/dist/impact.js.map +1 -0
  28. package/dist/index.d.ts +13 -5
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +7 -3
  31. package/dist/index.js.map +1 -1
  32. package/dist/mcp.d.ts +16 -75
  33. package/dist/mcp.d.ts.map +1 -1
  34. package/dist/mcp.js +198 -370
  35. package/dist/mcp.js.map +1 -1
  36. package/dist/overlay.d.ts +39 -0
  37. package/dist/overlay.d.ts.map +1 -0
  38. package/dist/overlay.js +133 -0
  39. package/dist/overlay.js.map +1 -0
  40. package/dist/parser.d.ts +41 -24
  41. package/dist/parser.d.ts.map +1 -1
  42. package/dist/parser.js +217 -160
  43. package/dist/parser.js.map +1 -1
  44. package/dist/prove.d.ts +46 -0
  45. package/dist/prove.d.ts.map +1 -0
  46. package/dist/prove.js +549 -0
  47. package/dist/prove.js.map +1 -0
  48. package/dist/query.d.ts +11 -0
  49. package/dist/query.d.ts.map +1 -1
  50. package/dist/query.js +9 -3
  51. package/dist/query.js.map +1 -1
  52. package/dist/reporter.d.ts +139 -1
  53. package/dist/reporter.d.ts.map +1 -1
  54. package/dist/reporter.js +593 -21
  55. package/dist/reporter.js.map +1 -1
  56. package/dist/rules.js +3 -3
  57. package/dist/rules.js.map +1 -1
  58. package/dist/runner.d.ts +24 -1
  59. package/dist/runner.d.ts.map +1 -1
  60. package/dist/runner.js +84 -21
  61. package/dist/runner.js.map +1 -1
  62. package/dist/specs.d.ts +5 -1
  63. package/dist/specs.d.ts.map +1 -1
  64. package/dist/specs.js +5 -1
  65. package/dist/specs.js.map +1 -1
  66. package/dist/structure.d.ts.map +1 -1
  67. package/dist/structure.js +7 -6
  68. package/dist/structure.js.map +1 -1
  69. package/dist/types.d.ts +193 -0
  70. package/dist/types.d.ts.map +1 -1
  71. package/dist/vendor/spec-core/jsonrpc/index.d.ts +3 -0
  72. package/dist/vendor/spec-core/jsonrpc/index.d.ts.map +1 -0
  73. package/dist/vendor/spec-core/jsonrpc/index.js +2 -0
  74. package/dist/vendor/spec-core/jsonrpc/index.js.map +1 -0
  75. package/dist/vendor/spec-core/jsonrpc/mcp.d.ts +158 -0
  76. package/dist/vendor/spec-core/jsonrpc/mcp.d.ts.map +1 -0
  77. package/dist/vendor/spec-core/jsonrpc/mcp.js +353 -0
  78. package/dist/vendor/spec-core/jsonrpc/mcp.js.map +1 -0
  79. package/dist/vendor/spec-core/markdown/frontmatter.d.ts +104 -0
  80. package/dist/vendor/spec-core/markdown/frontmatter.d.ts.map +1 -0
  81. package/dist/vendor/spec-core/markdown/frontmatter.js +459 -0
  82. package/dist/vendor/spec-core/markdown/frontmatter.js.map +1 -0
  83. package/dist/vendor/spec-core/markdown/headings.d.ts +46 -0
  84. package/dist/vendor/spec-core/markdown/headings.d.ts.map +1 -0
  85. package/dist/vendor/spec-core/markdown/headings.js +199 -0
  86. package/dist/vendor/spec-core/markdown/headings.js.map +1 -0
  87. package/dist/vendor/spec-core/markdown/index.d.ts +6 -0
  88. package/dist/vendor/spec-core/markdown/index.d.ts.map +1 -0
  89. package/dist/vendor/spec-core/markdown/index.js +4 -0
  90. package/dist/vendor/spec-core/markdown/index.js.map +1 -0
  91. package/dist/vendor/spec-core/markdown/layout.d.ts +40 -0
  92. package/dist/vendor/spec-core/markdown/layout.d.ts.map +1 -0
  93. package/dist/vendor/spec-core/markdown/layout.js +28 -0
  94. package/dist/vendor/spec-core/markdown/layout.js.map +1 -0
  95. package/dist/vendor/spec-core/markdown/links.d.ts +23 -0
  96. package/dist/vendor/spec-core/markdown/links.d.ts.map +1 -0
  97. package/dist/vendor/spec-core/markdown/links.js +364 -0
  98. package/dist/vendor/spec-core/markdown/links.js.map +1 -0
  99. package/dist/vendor/spec-core/markdown/lists.d.ts +23 -0
  100. package/dist/vendor/spec-core/markdown/lists.d.ts.map +1 -0
  101. package/dist/vendor/spec-core/markdown/lists.js +127 -0
  102. package/dist/vendor/spec-core/markdown/lists.js.map +1 -0
  103. package/dist/vendor/spec-core/markdown/scan.d.ts +37 -0
  104. package/dist/vendor/spec-core/markdown/scan.d.ts.map +1 -0
  105. package/dist/vendor/spec-core/markdown/scan.js +439 -0
  106. package/dist/vendor/spec-core/markdown/scan.js.map +1 -0
  107. package/dist/vendor/spec-core/markdown/syntax.d.ts +76 -0
  108. package/dist/vendor/spec-core/markdown/syntax.d.ts.map +1 -0
  109. package/dist/vendor/spec-core/markdown/syntax.js +181 -0
  110. package/dist/vendor/spec-core/markdown/syntax.js.map +1 -0
  111. package/dist/vendor/spec-core/markdown/tables.d.ts +19 -0
  112. package/dist/vendor/spec-core/markdown/tables.d.ts.map +1 -0
  113. package/dist/vendor/spec-core/markdown/tables.js +86 -0
  114. package/dist/vendor/spec-core/markdown/tables.js.map +1 -0
  115. package/dist/vendor/spec-core/markdown/types.d.ts +288 -0
  116. package/dist/vendor/spec-core/markdown/types.d.ts.map +1 -0
  117. package/dist/vendor/spec-core/markdown/types.js +9 -0
  118. package/dist/vendor/spec-core/markdown/types.js.map +1 -0
  119. package/dist/vendor/spec-core/path/index.d.ts +2 -0
  120. package/dist/vendor/spec-core/path/index.d.ts.map +1 -0
  121. package/dist/vendor/spec-core/path/index.js +2 -0
  122. package/dist/vendor/spec-core/path/index.js.map +1 -0
  123. package/dist/vendor/spec-core/path/posix.d.ts +84 -0
  124. package/dist/vendor/spec-core/path/posix.d.ts.map +1 -0
  125. package/dist/vendor/spec-core/path/posix.js +150 -0
  126. package/dist/vendor/spec-core/path/posix.js.map +1 -0
  127. package/dist/vendor/spec-core/pattern/automaton.d.ts +130 -0
  128. package/dist/vendor/spec-core/pattern/automaton.d.ts.map +1 -0
  129. package/dist/vendor/spec-core/pattern/automaton.js +340 -0
  130. package/dist/vendor/spec-core/pattern/automaton.js.map +1 -0
  131. package/dist/vendor/spec-core/pattern/charset.d.ts +59 -0
  132. package/dist/vendor/spec-core/pattern/charset.d.ts.map +1 -0
  133. package/dist/vendor/spec-core/pattern/charset.js +116 -0
  134. package/dist/vendor/spec-core/pattern/charset.js.map +1 -0
  135. package/dist/vendor/spec-core/pattern/glob.d.ts +122 -0
  136. package/dist/vendor/spec-core/pattern/glob.d.ts.map +1 -0
  137. package/dist/vendor/spec-core/pattern/glob.js +481 -0
  138. package/dist/vendor/spec-core/pattern/glob.js.map +1 -0
  139. package/dist/vendor/spec-core/pattern/index.d.ts +7 -0
  140. package/dist/vendor/spec-core/pattern/index.d.ts.map +1 -0
  141. package/dist/vendor/spec-core/pattern/index.js +4 -0
  142. package/dist/vendor/spec-core/pattern/index.js.map +1 -0
  143. package/dist/vendor/spec-core/pattern/regex.d.ts +68 -0
  144. package/dist/vendor/spec-core/pattern/regex.d.ts.map +1 -0
  145. package/dist/vendor/spec-core/pattern/regex.js +813 -0
  146. package/dist/vendor/spec-core/pattern/regex.js.map +1 -0
  147. package/dist/vendor/spec-core/text/index.d.ts +3 -0
  148. package/dist/vendor/spec-core/text/index.d.ts.map +1 -0
  149. package/dist/vendor/spec-core/text/index.js +2 -0
  150. package/dist/vendor/spec-core/text/index.js.map +1 -0
  151. package/dist/vendor/spec-core/text/lines.d.ts +73 -0
  152. package/dist/vendor/spec-core/text/lines.d.ts.map +1 -0
  153. package/dist/vendor/spec-core/text/lines.js +156 -0
  154. package/dist/vendor/spec-core/text/lines.js.map +1 -0
  155. package/package.json +8 -1
  156. package/src/vendor/spec-core/LICENSE +21 -0
  157. 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
@@ -22,6 +22,11 @@ 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;
25
30
  }
26
31
  /** Every rule the specs state, resolved, with the document that states it. */
27
32
  export interface RuleSet {
@@ -127,6 +132,12 @@ export declare function answerQuery(ruleSet: RuleSet, paths: ReadonlyArray<Query
127
132
  export declare function queryRules(options: QueryOptions): Promise<QueryReport>;
128
133
  /** The human-readable form of a query. */
129
134
  export declare function formatQuery(report: QueryReport): string;
135
+ /**
136
+ * The version of `query --json`'s document, which moves when a field is removed
137
+ * or renamed and not when one is added. It came late, at 1, since nothing had
138
+ * been removed or renamed before it did.
139
+ */
140
+ export declare const QUERY_FORMAT_VERSION = 1;
130
141
  /** The JSON form of a query, stable enough for a script to depend on. */
131
142
  export declare function formatQueryJson(report: QueryReport): string;
132
143
  /** Whether a location lies in any of the queried paths. */
@@ -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;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEvE,MAAM,WAAW,cAAc;IAC7B,4CAA4C;IAC5C,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,iFAAiF;IACjF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,+EAA+E;IAC/E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,wFAAwF;IACxF,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7B;AAED,8EAA8E;AAC9E,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,KAAK,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,SAAS,CAAC;QAAC,QAAQ,EAAE,YAAY,CAAA;KAAE,CAAC,CAAC;IAC/D,iFAAiF;IACjF,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,6DAA6D;IAC7D,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,YAAY,GAAG,YAAY,CAQjE;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAmC3E;AAED,kDAAkD;AAClD,qBAAa,cAAe,SAAQ,KAAK;CAAG;AAE5C;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAE,EAAW,GAAG,OAAO,CAAC,SAAS,GAAG;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAa7H;AAID,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,yDAAyD;IACzD,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB;;;;;;;OAOG;IACH,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IACjD;;;;;;;OAOG;IACH,QAAQ,EAAE;QACR,oGAAoG;QACpG,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB;;;WAGG;QACH,KAAK,EAAE,QAAQ,EAAE,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,qGAAqG;IACrG,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,kGAAkG;IAClG,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/D,UAAU,EAAE,MAAM,CAAC;IACnB,0FAA0F;IAC1F,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB;AAED,MAAM,WAAW,YAAa,SAAQ,cAAc;IAClD,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,kFAAkF;IAClF,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,qCAAqC;AACrC,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,CAAC,SAAS,GAAG;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,EAAE,eAAe,EAAE,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAwC9J;AAED,uDAAuD;AACvD,wBAAsB,UAAU,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAK5E;AAqCD,0CAA0C;AAC1C,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAoEvD;AAED,yEAAyE;AACzE,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAE3D;AAED,2DAA2D;AAC3D,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,SAAS,EAAE,GAAG,OAAO,CAEjF"}
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}