@nielspeter/eess-ts 0.10.0 → 0.11.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/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +13 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/conditions/dependency.js +4 -4
- package/dist/conditions/dependency.js.map +1 -1
- package/dist/core/diagnose.d.ts.map +1 -1
- package/dist/core/diagnose.js +23 -6
- package/dist/core/diagnose.js.map +1 -1
- package/dist/core/disk-set.d.ts +76 -27
- package/dist/core/disk-set.d.ts.map +1 -1
- package/dist/core/disk-set.js +223 -43
- package/dist/core/disk-set.js.map +1 -1
- package/dist/core/glob-diagnosis.d.ts +47 -0
- package/dist/core/glob-diagnosis.d.ts.map +1 -1
- package/dist/core/glob-diagnosis.js +80 -1
- package/dist/core/glob-diagnosis.js.map +1 -1
- package/dist/core/vacuity-diagnosis.d.ts.map +1 -1
- package/dist/core/vacuity-diagnosis.js +194 -10
- package/dist/core/vacuity-diagnosis.js.map +1 -1
- package/package.json +1 -1
package/dist/core/disk-set.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import picomatch from 'picomatch';
|
|
4
|
-
import { discoverIdentityRoot } from '@nielspeter/eess/internal';
|
|
4
|
+
import { byCodepoint, discoverIdentityRoot } from '@nielspeter/eess/internal';
|
|
5
5
|
import { readsRootRelativePath, rootFromTsConfigPath } from './project-relative.js';
|
|
6
6
|
/**
|
|
7
7
|
* Directories never worth walking.
|
|
@@ -27,6 +27,34 @@ const PRUNE = new Set([
|
|
|
27
27
|
'.gradle',
|
|
28
28
|
'.yarn',
|
|
29
29
|
'.cache',
|
|
30
|
+
// Added for bug 0359. Pruning — not repository size — is what decides whether
|
|
31
|
+
// the walk finishes: measured on this repository, the list above removes
|
|
32
|
+
// **88.9%** of entries, and unpruned this small repo would sit at 41% of the
|
|
33
|
+
// old 50,000 budget by itself (spike 0368). The list named fourteen and missed
|
|
34
|
+
// the one that mattered — an adopter's `.wrangler` was **58% of their entries**
|
|
35
|
+
// in the monorepo that measured closest to the budget.
|
|
36
|
+
//
|
|
37
|
+
// Only the FIRST of these has a measured share; the rest are the same class of
|
|
38
|
+
// thing — build, cache and framework output no rule can usefully scope to — and
|
|
39
|
+
// are cheap to prune. Named individually rather than matched by a leading dot,
|
|
40
|
+
// because `.claude/`, `.changeset/` and `.github/` are content this repo's own
|
|
41
|
+
// corpus gate reads.
|
|
42
|
+
'.wrangler',
|
|
43
|
+
'.svelte-kit',
|
|
44
|
+
'.nuxt',
|
|
45
|
+
'.output',
|
|
46
|
+
'.parcel-cache',
|
|
47
|
+
'.vite',
|
|
48
|
+
'.astro',
|
|
49
|
+
'.docusaurus',
|
|
50
|
+
'.serverless',
|
|
51
|
+
'.terraform',
|
|
52
|
+
'storybook-static',
|
|
53
|
+
'.pnpm-store',
|
|
54
|
+
'.angular',
|
|
55
|
+
'.expo',
|
|
56
|
+
'.dart_tool',
|
|
57
|
+
'.sst',
|
|
30
58
|
]);
|
|
31
59
|
/**
|
|
32
60
|
* How many directory entries the walk will read before giving up.
|
|
@@ -46,7 +74,7 @@ const PRUNE = new Set([
|
|
|
46
74
|
* was a licence to lower the budget on the belief that nothing but wording
|
|
47
75
|
* depended on it.
|
|
48
76
|
*
|
|
49
|
-
* `
|
|
77
|
+
* `contradictsAbsence` below is the policy that consumes this classification to decide
|
|
50
78
|
* whether a cardinality rule (`.notExist()` and friends) reports at all. And the
|
|
51
79
|
* degradation is **whole-set, not per-glob** — `build()` returns the single
|
|
52
80
|
* `UNDETERMINED` object, whose `classify` answers `not-determined` for every
|
|
@@ -57,19 +85,60 @@ const PRUNE = new Set([
|
|
|
57
85
|
* That is not a regression — before 0355 those rules were silent everywhere —
|
|
58
86
|
* but it is an undisclosed limit on a fix, and nothing currently reports that
|
|
59
87
|
* the walk gave up. Surfacing exhaustion is
|
|
60
|
-
* [bug 0359](../../../../work/bugs/0359-a-disk-walk-that-gave-up-reports-nothing-and-now-decides-a-verdict.md)
|
|
88
|
+
* [bug 0359](../../../../work/bugs/fixed/0359-a-disk-walk-that-gave-up-reports-nothing-and-now-decides-a-verdict.md),
|
|
89
|
+
* and it is now surfaced: `exhaustion` on the returned `DiskSet` carries the
|
|
90
|
+
* fact and what consumed the walk, and the cardinality path reports it rather
|
|
91
|
+
* than going quiet.
|
|
92
|
+
*
|
|
93
|
+
* ## Why 500,000, and why the old 50,000 was far too low
|
|
94
|
+
*
|
|
95
|
+
* The justification above is a claim about TIME — a 5s vitest timeout. Measured
|
|
96
|
+
* at **2.09 µs/entry** (spike 0367; spike 0360 got 1.55 µs/entry by a different
|
|
97
|
+
* method, which is what makes either trustworthy), 50,000 entries is about
|
|
98
|
+
* **105 ms of work**. The cutoff fired roughly **48× below its own stated
|
|
99
|
+
* reason**, and silenced a gate to do it.
|
|
100
|
+
*
|
|
101
|
+
* 500,000 is 0.8–1.5s warm (spike 0360) and puts every repository measured so
|
|
102
|
+
* far far inside it: this one at ~2,300 entries after pruning, an adopter's
|
|
103
|
+
* 15-package monorepo at 16,770. **Not unbounded** — the cold-cache cost is
|
|
104
|
+
* still unmeasured, which is exactly why 0360 declined to recommend removing the
|
|
105
|
+
* bound, and raising it is supported by measurement where removing it is not.
|
|
61
106
|
*
|
|
62
|
-
* Anyone changing this number: it is the threshold at which a shipped gate
|
|
63
|
-
*
|
|
107
|
+
* Anyone changing this number: it is the threshold at which a shipped gate stops
|
|
108
|
+
* being able to answer. It no longer does so silently, which is the fix — but a
|
|
109
|
+
* reported degradation is still a degradation. Measure before you lower it.
|
|
64
110
|
*/
|
|
65
|
-
const ENTRY_BUDGET =
|
|
111
|
+
const ENTRY_BUDGET = 500_000;
|
|
66
112
|
// `.d.ts` and its `.d.mts`/`.d.cts` siblings count. They ARE TypeScript for
|
|
67
113
|
// the question this set answers — "does this path contain TypeScript your
|
|
68
114
|
// tsconfig is keeping out" — and excluding them made a `types/` directory of
|
|
69
115
|
// pure declarations report "this path exists but contains no TypeScript",
|
|
70
116
|
// which is false.
|
|
71
117
|
const TS_FILE = /\.(m|c)?tsx?$/;
|
|
72
|
-
|
|
118
|
+
let cache = new WeakMap();
|
|
119
|
+
/**
|
|
120
|
+
* Budget override for the MEMOIZED path. Tests only.
|
|
121
|
+
*
|
|
122
|
+
* `buildDiskSet` above already takes an injectable budget and is documented
|
|
123
|
+
* "exported for tests only" — but it bypasses the memo, and the production
|
|
124
|
+
* consumer of a classification is `deadSiteRoute` in `glob-diagnosis.ts`, which goes
|
|
125
|
+
* through `diskSet(project)`. So a test could construct an exhausted set and
|
|
126
|
+
* could not make a RULE see one, which left bug 0359's defect reachable only
|
|
127
|
+
* below the public entry point. A test that drives a stand-in instead of
|
|
128
|
+
* `violations()` is how a suite stays green while the defect survives.
|
|
129
|
+
*
|
|
130
|
+
* Reaching exhaustion honestly is not an option: the budget is 500,000 entries.
|
|
131
|
+
*
|
|
132
|
+
* This overrides the constant and clears the memo, so the walk really runs, the
|
|
133
|
+
* real `classify` answers, and the finding travels the real path — only the
|
|
134
|
+
* number differs from production.
|
|
135
|
+
*/
|
|
136
|
+
// eess-exclude eess/no-unused-exports: consumed by the test suite; the build tsconfig this gate reads excludes tests, so `src` is the only usage it can see
|
|
137
|
+
export function setDiskWalkBudgetForTests(limit) {
|
|
138
|
+
budgetForTests = limit;
|
|
139
|
+
cache = new WeakMap();
|
|
140
|
+
}
|
|
141
|
+
let budgetForTests;
|
|
73
142
|
/**
|
|
74
143
|
* The project's disk set, walked at most once and only when asked.
|
|
75
144
|
*
|
|
@@ -78,36 +147,6 @@ const cache = new WeakMap();
|
|
|
78
147
|
* never touches the filesystem. An eager version would charge every `check()`
|
|
79
148
|
* a recursive walk to answer a question no fault asked.
|
|
80
149
|
*/
|
|
81
|
-
/**
|
|
82
|
-
* Does the filesystem CONTRADICT a rule's claim that nothing matching this glob exists?
|
|
83
|
-
*
|
|
84
|
-
* The one owner of a policy two tools have to share — the gate's evidence floor
|
|
85
|
-
* (`vacuity-diagnosis.ts`) and the preview (`diagnose.ts`). It is written here, beside the
|
|
86
|
-
* classification it reads, because the pair has already grown two hand-maintained copies of one
|
|
87
|
-
* rule and had them disagree: `isFaultPosition` was inverse lists in both files, differing over
|
|
88
|
-
* exactly `discovery`, so `doctor` reported a dead layer glob and the build stayed green.
|
|
89
|
-
*
|
|
90
|
-
* ## Why only `holds-typescript`
|
|
91
|
-
*
|
|
92
|
-
* A rule asserting cardinality — `.notExist()` and friends — is SATISFIED by having no
|
|
93
|
-
* subjects, so examining zero is normally the rule working. The trouble is that a holding
|
|
94
|
-
* ratchet and a selector that silently stopped matching are identical from the glob and the
|
|
95
|
-
* path universe: both match nothing. Only disk tells them apart.
|
|
96
|
-
*
|
|
97
|
-
* | classification | verdict | why |
|
|
98
|
-
* | ------------------ | ------- | ---------------------------------------------------------------- |
|
|
99
|
-
* | `holds-typescript` | **contradicted** | the code being asserted away is right there, unexamined |
|
|
100
|
-
* | `absent` | consistent | the ratchet holding — the common case, and it must stay silent |
|
|
101
|
-
* | `no-typescript` | consistent | no TypeScript means no modules, which is what the rule asserts |
|
|
102
|
-
* | `not-determined` | consistent | the walk could not answer; blaming the author for that is the confidently-wrong remedy this module exists not to give |
|
|
103
|
-
*
|
|
104
|
-
* [Bug 0355](../../../../work/bugs/fixed/0355-a-cardinality-rule-cannot-tell-none-exist-from-my-selector-broke.md)
|
|
105
|
-
* for the gate half, [0357](../../../../work/bugs/fixed/0357-doctor-reports-a-healthy-ratchet-as-a-dead-glob.md)
|
|
106
|
-
* for the preview.
|
|
107
|
-
*/
|
|
108
|
-
export function absenceClaimIsContradicted(project, glob) {
|
|
109
|
-
return contradictsAbsence(diskSet(project).classify(glob));
|
|
110
|
-
}
|
|
111
150
|
/**
|
|
112
151
|
* The policy alone, as a TOTAL function on the four classifications.
|
|
113
152
|
*
|
|
@@ -121,7 +160,6 @@ export function absenceClaimIsContradicted(project, glob) {
|
|
|
121
160
|
* Exhaustive by construction: `OnDisk` is a four-value union, so a test that enumerates it
|
|
122
161
|
* cannot silently stop covering a case when a fifth is added — it stops compiling.
|
|
123
162
|
*/
|
|
124
|
-
// eess-exclude eess/no-unused-exports: consumed by the test suite; the build tsconfig this gate reads excludes tests, so `src` is the only usage it can see
|
|
125
163
|
export function contradictsAbsence(onDisk) {
|
|
126
164
|
return onDisk === 'holds-typescript';
|
|
127
165
|
}
|
|
@@ -129,7 +167,7 @@ export function diskSet(project) {
|
|
|
129
167
|
const cached = cache.get(project);
|
|
130
168
|
if (cached)
|
|
131
169
|
return cached;
|
|
132
|
-
const built = build(project, ENTRY_BUDGET);
|
|
170
|
+
const built = build(project, budgetForTests ?? ENTRY_BUDGET);
|
|
133
171
|
cache.set(project, built);
|
|
134
172
|
return built;
|
|
135
173
|
}
|
|
@@ -161,6 +199,23 @@ function build(project, budgetLimit) {
|
|
|
161
199
|
const root = discoverIdentityRoot(path.dirname(project.tsConfigPath));
|
|
162
200
|
if (!fs.existsSync(root))
|
|
163
201
|
return UNDETERMINED;
|
|
202
|
+
// The FILESYSTEM root is never a project root, and walking it is never
|
|
203
|
+
// meaningful. `discoverIdentityRoot` falls back to its own argument when it
|
|
204
|
+
// finds no marker, so a tsconfig path with nothing above it resolves to `/`
|
|
205
|
+
// and this walked the entire disk.
|
|
206
|
+
//
|
|
207
|
+
// Found by bug 0359's own fix: that walk always happened, exhausted, and
|
|
208
|
+
// returned the silent `UNDETERMINED`, so nobody could see it. The moment
|
|
209
|
+
// exhaustion started reporting, every in-memory double in this suite surfaced a
|
|
210
|
+
// finding — 0359's thesis landing in a second place. `not-determined` was the
|
|
211
|
+
// right answer all along; it now arrives without reading the whole disk first.
|
|
212
|
+
//
|
|
213
|
+
// Narrow on purpose. A first draft refused any root without a `.git` or
|
|
214
|
+
// `package.json` and reddened two legitimate fixtures: a bare directory holding
|
|
215
|
+
// only a tsconfig IS a project, and eess must not require a manifest it never
|
|
216
|
+
// asked for. The pathology is reaching `/`, not lacking a marker.
|
|
217
|
+
if (path.dirname(root) === root)
|
|
218
|
+
return UNDETERMINED;
|
|
164
219
|
const files = [];
|
|
165
220
|
/** Every file, TypeScript or not — so `absent` means absent, not "not TypeScript". */
|
|
166
221
|
const everyFile = [];
|
|
@@ -175,8 +230,28 @@ function build(project, budgetLimit) {
|
|
|
175
230
|
* beginning "a path segment is misspelled".
|
|
176
231
|
*/
|
|
177
232
|
const pruned = [];
|
|
233
|
+
/**
|
|
234
|
+
* Entries whose KIND the walk declined to resolve — symlinks.
|
|
235
|
+
*
|
|
236
|
+
* `Dirent.isDirectory()` is false for a symlink under `withFileTypes`, so a symlinked
|
|
237
|
+
* DIRECTORY is recorded as a file. That trade is deliberate and documented below: following
|
|
238
|
+
* the link risks a walk that never terminates, and for `classify` being wrong this way only
|
|
239
|
+
* weakens a message.
|
|
240
|
+
*
|
|
241
|
+
* `matchesOnlyFiles` cannot live with it, because it asserts "and NO directory" — and a
|
|
242
|
+
* symlink's kind is precisely what was not resolved. Kept as its own list rather than
|
|
243
|
+
* changing what `everyFile` holds, so `classify`'s documented behaviour is untouched.
|
|
244
|
+
*/
|
|
245
|
+
const kindUnknown = [];
|
|
178
246
|
let budget = budgetLimit;
|
|
179
247
|
let exhausted = false;
|
|
248
|
+
/**
|
|
249
|
+
* Entries read per top-level subtree of `root`, so exhaustion can name what
|
|
250
|
+
* consumed the walk instead of blaming the repository's size (spike 0368).
|
|
251
|
+
* Attributed to the FIRST segment below `root` and no deeper: the remedy is
|
|
252
|
+
* "stop walking this tree", which is a decision about a top-level directory.
|
|
253
|
+
*/
|
|
254
|
+
const perSubtree = new Map();
|
|
180
255
|
const walk = (dir) => {
|
|
181
256
|
if (exhausted)
|
|
182
257
|
return;
|
|
@@ -188,6 +263,13 @@ function build(project, budgetLimit) {
|
|
|
188
263
|
void err; // unreadable or gone: not a finding, just not walkable
|
|
189
264
|
return;
|
|
190
265
|
}
|
|
266
|
+
// Count BEFORE the budget check, so the subtree that pushed the walk over
|
|
267
|
+
// is the one the finding names. Counting after would attribute the
|
|
268
|
+
// decisive read to nobody — the directory that exhausted the budget would
|
|
269
|
+
// be missing from the list of what exhausted it.
|
|
270
|
+
const rel = path.relative(root, dir).replaceAll('\\', '/');
|
|
271
|
+
const top = rel === '' ? '.' : (rel.split('/')[0] ?? '.');
|
|
272
|
+
perSubtree.set(top, (perSubtree.get(top) ?? 0) + entries.length);
|
|
191
273
|
budget -= entries.length;
|
|
192
274
|
if (budget < 0) {
|
|
193
275
|
exhausted = true;
|
|
@@ -226,6 +308,8 @@ function build(project, budgetLimit) {
|
|
|
226
308
|
walk(full);
|
|
227
309
|
}
|
|
228
310
|
else {
|
|
311
|
+
if (entry.isSymbolicLink())
|
|
312
|
+
kindUnknown.push(full);
|
|
229
313
|
everyFile.push(full);
|
|
230
314
|
if (TS_FILE.test(entry.name))
|
|
231
315
|
files.push(full);
|
|
@@ -233,8 +317,14 @@ function build(project, budgetLimit) {
|
|
|
233
317
|
}
|
|
234
318
|
};
|
|
235
319
|
walk(root.replaceAll('\\', '/'));
|
|
320
|
+
// NOT the shared `UNDETERMINED` constant. It is deliberately identity-free so
|
|
321
|
+
// it can be returned from the guards above, where there is nothing to say; a
|
|
322
|
+
// walk that gave up has something to say, and bug 0359 is that it said
|
|
323
|
+
// nothing. `classify` still answers `not-determined` for every glob — the
|
|
324
|
+
// classification is unchanged and still honest. What changes is that the
|
|
325
|
+
// caller can now discover WHY.
|
|
236
326
|
if (exhausted)
|
|
237
|
-
return
|
|
327
|
+
return exhaustedDiskSet(root, budgetLimit, perSubtree);
|
|
238
328
|
// Containment is TRANSITIVE, and that is load-bearing. Using each file's
|
|
239
329
|
// immediate parent instead labels `docs/` "contains no TypeScript" while
|
|
240
330
|
// `docs/.vitepress/config.ts` sits one level below it — a false statement in
|
|
@@ -275,10 +365,69 @@ function build(project, budgetLimit) {
|
|
|
275
365
|
const prefixes = [root, rootFromTsConfigPath(project.tsConfigPath)]
|
|
276
366
|
.filter((r) => r !== undefined)
|
|
277
367
|
.map((r) => (r === '/' ? '/' : `${r.replaceAll('\\', '/')}/`));
|
|
368
|
+
/**
|
|
369
|
+
* Does this glob reach ground the walk refused to enter?
|
|
370
|
+
*
|
|
371
|
+
* Shared by `classify` and `matchesOnlyFiles`, deliberately: both have to refuse to answer
|
|
372
|
+
* over a pruned path, and this module already records what happened the last time one fact
|
|
373
|
+
* grew two hand-maintained copies.
|
|
374
|
+
*/
|
|
375
|
+
const matchesPruned = (glob) => {
|
|
376
|
+
// Deliberately NOT guarded by `readsRootRelativePath`, unlike the two consumers below.
|
|
377
|
+
// Being liberal here makes this answer `true` more often, and `true` means "refuse to
|
|
378
|
+
// answer" — so the error direction is fail-closed. The guard exists to stop a liberal view
|
|
379
|
+
// manufacturing a false POSITIVE claim; this one manufactures a false abstention.
|
|
380
|
+
const isMatch = picomatch(glob);
|
|
381
|
+
return pruned.some((dir) => isMatch(dir) ||
|
|
382
|
+
namedFromARoot(dir).some((view) => isMatch(view)) ||
|
|
383
|
+
glob.includes(dir.slice(root.length + 1)));
|
|
384
|
+
};
|
|
278
385
|
const namedFromARoot = (candidate) => prefixes
|
|
279
386
|
.filter((prefix) => candidate.startsWith(prefix))
|
|
280
387
|
.map((prefix) => candidate.slice(prefix.length));
|
|
281
388
|
return {
|
|
389
|
+
/**
|
|
390
|
+
* Files yes, directories no — the kind-aware answer `classify` cannot give.
|
|
391
|
+
*
|
|
392
|
+
* Both root views, exactly as `classify` does: a single view left this answering about a
|
|
393
|
+
* monorepo package's `'src/**'` from the wrong prefix, which is bug 0339's shape in the
|
|
394
|
+
* one producer whose whole defence is that it states only facts.
|
|
395
|
+
*/
|
|
396
|
+
matchesOnlyFiles(glob) {
|
|
397
|
+
const isMatch = picomatch(glob);
|
|
398
|
+
// The SAME guard `classify` applies below, and for the same reason (bug 0339): the
|
|
399
|
+
// root-relative view is only consulted for a glob that actually reads root-relative
|
|
400
|
+
// paths. Applying it unconditionally made this predicate more liberal than `classify`
|
|
401
|
+
// about the same paths — two derivations of one question, which is the defect this whole
|
|
402
|
+
// change exists to remove. Product review flagged the asymmetry without constructing an
|
|
403
|
+
// input; mirroring the guard costs one line and removes the question.
|
|
404
|
+
const readsRootRelative = readsRootRelativePath(glob);
|
|
405
|
+
const hits = (candidates) => candidates.some((candidate) => {
|
|
406
|
+
if (isMatch(candidate))
|
|
407
|
+
return true;
|
|
408
|
+
if (!readsRootRelative)
|
|
409
|
+
return false;
|
|
410
|
+
return namedFromARoot(candidate).some((view) => isMatch(view));
|
|
411
|
+
});
|
|
412
|
+
// A directory match means the glob is usable as a `parent-dir` glob, whatever else it
|
|
413
|
+
// also matches — so this is "files and NO directory", not "more files than directories".
|
|
414
|
+
//
|
|
415
|
+
// And NOT SEEN IS NOT NOT THERE. A pruned entry is recorded before `isDirectory()` is
|
|
416
|
+
// asked, so it is in neither `dirs` nor `everyFile` — reading its absence from `dirs` as
|
|
417
|
+
// evidence of "no directory" is exactly the inference `classify` refuses ten lines below.
|
|
418
|
+
// Measured by enforcement review: a glob naming `.../dist/**`, a real directory holding
|
|
419
|
+
// real TypeScript, was told it "matches a FILE but is used where a directory is read"
|
|
420
|
+
// because `dist` is pruned. This claim is a universal negative; a bounded walk cannot
|
|
421
|
+
// earn one over ground it declined to look at.
|
|
422
|
+
// Two ways the walk cannot witness "no directory", and both must refuse rather than
|
|
423
|
+
// answer. Pruned: the entry was recorded before `isDirectory()` was asked, so it is in
|
|
424
|
+
// neither list. Symlinked: the kind was never resolved and the entry sits in `everyFile`
|
|
425
|
+
// looking like a file — measured, a symlinked directory holding TypeScript was told
|
|
426
|
+
// "this matches a FILE but is used where a directory is read".
|
|
427
|
+
if (matchesPruned(glob) || hits(kindUnknown))
|
|
428
|
+
return false;
|
|
429
|
+
return hits(everyFile) && !hits(dirs);
|
|
430
|
+
},
|
|
282
431
|
classify(glob) {
|
|
283
432
|
const isMatch = picomatch(glob);
|
|
284
433
|
// Both views of each path, as every rule-facing matcher does since bug
|
|
@@ -302,9 +451,7 @@ function build(project, budgetLimit) {
|
|
|
302
451
|
const matched = everything.filter((candidate) => hits(candidate));
|
|
303
452
|
if (matched.length === 0) {
|
|
304
453
|
// Not seen is not the same as not there.
|
|
305
|
-
return
|
|
306
|
-
? 'not-determined'
|
|
307
|
-
: 'absent';
|
|
454
|
+
return matchesPruned(glob) ? 'not-determined' : 'absent';
|
|
308
455
|
}
|
|
309
456
|
// Per GLOB, not per path: one glob routinely matches paths in both
|
|
310
457
|
// categories — `**/tests/**` matched 44 directories of mixed kind on the
|
|
@@ -318,5 +465,38 @@ function build(project, budgetLimit) {
|
|
|
318
465
|
}
|
|
319
466
|
const UNDETERMINED = {
|
|
320
467
|
classify: () => 'not-determined',
|
|
468
|
+
// Not "no files" — "no evidence". The caller must not read a confident shape out of a
|
|
469
|
+
// walk that did not happen.
|
|
470
|
+
matchesOnlyFiles: () => false,
|
|
321
471
|
};
|
|
472
|
+
/**
|
|
473
|
+
* How many consuming directories the exhaustion finding names.
|
|
474
|
+
*
|
|
475
|
+
* Four, not all of them: the finding is a sentence an agent acts on, and a list
|
|
476
|
+
* of forty directories is the ADR-009 rule 4 noise problem moved inside one
|
|
477
|
+
* message. Four was enough to cover 91% of this repository's entries when
|
|
478
|
+
* measured (spike 0368), and the total is reported alongside so the reader can
|
|
479
|
+
* tell a dominated walk from an evenly-spread one.
|
|
480
|
+
*/
|
|
481
|
+
export const NAMED_CONSUMERS = 4;
|
|
482
|
+
/**
|
|
483
|
+
* The walk gave up, and says what it read.
|
|
484
|
+
*
|
|
485
|
+
* Its own object rather than the shared `UNDETERMINED`, because the consumers
|
|
486
|
+
* differ per project and a shared constant cannot carry them.
|
|
487
|
+
*/
|
|
488
|
+
function exhaustedDiskSet(root, budget, perSubtree) {
|
|
489
|
+
const consumers = [...perSubtree]
|
|
490
|
+
.map(([dir, entries]) => ({ dir, entries }))
|
|
491
|
+
// NOT `localeCompare`: this order decides which directories the message names,
|
|
492
|
+
// the message reaches a baseline identity, and the host locale would make the
|
|
493
|
+
// same finding hash differently on a laptop and in CI. The repo's own
|
|
494
|
+
// `scan-locale-ordering` gate caught this.
|
|
495
|
+
.sort((a, b) => b.entries - a.entries || byCodepoint(a.dir, b.dir));
|
|
496
|
+
return {
|
|
497
|
+
classify: () => 'not-determined',
|
|
498
|
+
matchesOnlyFiles: () => false,
|
|
499
|
+
exhaustion: { root, budget, consumers },
|
|
500
|
+
};
|
|
501
|
+
}
|
|
322
502
|
//# sourceMappingURL=disk-set.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"disk-set.js","sourceRoot":"","sources":["../../src/core/disk-set.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,SAAS,MAAM,WAAW,CAAA;AAEjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;
|
|
1
|
+
{"version":3,"file":"disk-set.js","sourceRoot":"","sources":["../../src/core/disk-set.ts"],"names":[],"mappings":"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"}
|
|
@@ -59,6 +59,53 @@ export declare function syntacticFault(glob: string, kind: GlobSite['kind'], bas
|
|
|
59
59
|
* caller through repeated failing runs.
|
|
60
60
|
*/
|
|
61
61
|
export declare function diagnoseGlob(site: GlobSite, universe: PathUniverse, diskSet?: DiskSet): GlobDiagnosis;
|
|
62
|
+
/**
|
|
63
|
+
* WHY a dead site on a cardinality rule is a real fault — the route, not a boolean.
|
|
64
|
+
*
|
|
65
|
+
* One owner, consulted by the admission gate AND by both tools' messages, so the reason a
|
|
66
|
+
* finding was admitted and the reason its message gives cannot be two different derivations.
|
|
67
|
+
* Before this, the gate asked `classify(glob)` directly while the message read
|
|
68
|
+
* `diagnosis.onDisk`, and the two disagree for `file-not-folder`: the gate admitted the
|
|
69
|
+
* finding *because the disk contradicted the claim* and the message then offered to widen a
|
|
70
|
+
* tsconfig `include`, which can never make a glob naming a FILE match a directory read
|
|
71
|
+
* ([bug 0363](../../../../work/bugs/fixed/0363-a-remedy-that-cannot-remediate-survives-one-input-over.md)).
|
|
72
|
+
*
|
|
73
|
+
* `undefined` means "not a fault" — a holding ratchet, which is the common case and must stay
|
|
74
|
+
* green. Exhaustive over `GlobFault` **by the `never` witness in the default branch**, not by
|
|
75
|
+
* the shape of the switch — a distinction that was got wrong here and measured by architecture
|
|
76
|
+
* review. Because `undefined` is a legal return value, a switch missing a case falls off the end
|
|
77
|
+
* and **compiles**, so a fifth fault became silently "not a fault"; the module reddened at
|
|
78
|
+
* `FAULT_ADVICE` instead, a different line with a different fix. `isFaultPosition`
|
|
79
|
+
* (`packages/core/src/glob-site.ts:86`) carries the same witness for the same reason.
|
|
80
|
+
*
|
|
81
|
+
* _`contradictsAbsence` was cited here as a model and should not have been: it also compiles
|
|
82
|
+
* clean against a fifth `OnDisk`. What is exhaustive there is the TEST enumerating the union,
|
|
83
|
+
* not the function._
|
|
84
|
+
*/
|
|
85
|
+
export type DeadSiteRoute = 'syntactic' | 'names-a-file' | 'contradicted-by-disk';
|
|
86
|
+
export declare function deadSiteRoute(diagnosis: GlobDiagnosis): DeadSiteRoute | undefined;
|
|
87
|
+
/**
|
|
88
|
+
* The remedy a CARDINALITY rule gets on each route, owned once.
|
|
89
|
+
*
|
|
90
|
+
* `check` puts this in `suggestion` (the `Fix:` line) and `doctor` appends it to its own
|
|
91
|
+
* advice, so the two cannot drift — which is
|
|
92
|
+
* [bug 0364](../../../../work/bugs/fixed/0364-doctor-states-the-cause-and-never-the-remedy.md):
|
|
93
|
+
* three rounds of work on what this sentence must say reached only the tool an adopter
|
|
94
|
+
* reaches second.
|
|
95
|
+
*
|
|
96
|
+
* **None of them offers deletion.** On a finding no filter can suppress, deletion is the only
|
|
97
|
+
* achievable exit, and the rule is the thing that noticed — so an instruction to delete it is
|
|
98
|
+
* the ADR-009 rule 2 defect this family has already shipped once.
|
|
99
|
+
*/
|
|
100
|
+
export declare const CARDINALITY_REMEDY: Readonly<Record<DeadSiteRoute, string>>;
|
|
101
|
+
/**
|
|
102
|
+
* Does the route's fault hold in EVERY project, or only in this one?
|
|
103
|
+
*
|
|
104
|
+
* A property of the glob text for the syntactic and file-naming routes, and of this project's
|
|
105
|
+
* `include` for the disk route. "in this project" understates the first two by exactly the
|
|
106
|
+
* scope that invites a tsconfig reading.
|
|
107
|
+
*/
|
|
108
|
+
export declare const ROUTE_HOLDS_IN_ANY_PROJECT: Readonly<Record<DeadSiteRoute, boolean>>;
|
|
62
109
|
/**
|
|
63
110
|
* The remedy for each fault, or an honest list of causes where no remedy is
|
|
64
111
|
* verifiable.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"glob-diagnosis.d.ts","sourceRoot":"","sources":["../../src/core/glob-diagnosis.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"glob-diagnosis.d.ts","sourceRoot":"","sources":["../../src/core/glob-diagnosis.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAGpD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,YAAY,GAAG,iBAAiB,GAAG,UAAU,CAAA;AAErF,UAAU,aAAa;IACrB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAA;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,2EAA2E;AAC3E,eAAO,MAAM,SAAS,gEAAgE,CAAA;AAEtF;;;;;;;;;;GAUG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAGlD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,EACtB,IAAI,GAAE,QAAQ,CAAC,MAAM,CAAc,GAClC,aAAa,GAAG,YAAY,GAAG,SAAS,CAiB1C;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,YAAY,EACtB,OAAO,CAAC,EAAE,OAAO,GAChB,aAAa,CA0Bf;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,cAAc,GAAG,sBAAsB,CAAA;AAEjF,wBAAgB,aAAa,CAAC,SAAS,EAAE,aAAa,GAAG,aAAa,GAAG,SAAS,CAsBjF;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAgBtE,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,OAAO,CAAC,CAY/E,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAS5D,CAAA;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoC3D,CAAA"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import picomatch from 'picomatch';
|
|
2
|
+
import { contradictsAbsence } from './disk-set.js';
|
|
2
3
|
/** Where the glob conventions these messages talk about are documented. */
|
|
3
4
|
export const GLOB_DOCS = 'https://github.com/nielspeter/eess/blob/main/docs/slices.md';
|
|
4
5
|
/**
|
|
@@ -62,7 +63,14 @@ export function diagnoseGlob(site, universe, diskSet) {
|
|
|
62
63
|
// glob written at a file can never match. Verifiable, and therefore safe to
|
|
63
64
|
// assert — measured instance: '**/src/predicates/module**' matches 1 file
|
|
64
65
|
// and 0 parent directories.
|
|
65
|
-
|
|
66
|
+
// The project's own files answer this for a path inside it; the DISK answers it for a path
|
|
67
|
+
// outside, which the universe cannot see. Without the second half the fault was invisible
|
|
68
|
+
// for an out-of-project file and the author was offered a tsconfig `include` that can never
|
|
69
|
+
// make a directory read match a file — [bug 0363](../../../../work/bugs/fixed/0363-a-remedy-that-cannot-remediate-survives-one-input-over.md).
|
|
70
|
+
// `matchesOnlyFiles` answers `false` when the walk cannot say, so this never claims the
|
|
71
|
+
// fault without evidence.
|
|
72
|
+
if (site.kind === 'parent-dir' &&
|
|
73
|
+
(matchesAny(site.glob, universe.filePaths) || diskSet?.matchesOnlyFiles?.(site.glob) === true)) {
|
|
66
74
|
return { fault: 'file-not-folder' };
|
|
67
75
|
}
|
|
68
76
|
if (site.kind === 'file-path' && matchesAny(site.glob, universe.parentDirs)) {
|
|
@@ -70,6 +78,77 @@ export function diagnoseGlob(site, universe, diskSet) {
|
|
|
70
78
|
}
|
|
71
79
|
return { fault: 'no-match', onDisk: diskSet?.classify(site.glob) ?? 'not-determined' };
|
|
72
80
|
}
|
|
81
|
+
export function deadSiteRoute(diagnosis) {
|
|
82
|
+
switch (diagnosis.fault) {
|
|
83
|
+
case 'dot-segment':
|
|
84
|
+
case 'unanchored':
|
|
85
|
+
return 'syntactic';
|
|
86
|
+
case 'file-not-folder':
|
|
87
|
+
return 'names-a-file';
|
|
88
|
+
case 'no-match':
|
|
89
|
+
// The disk is the only thing that can tell a holding ratchet from a broken selector here,
|
|
90
|
+
// and `contradictsAbsence` owns WHICH classification counts — `disk-set.ts` carries the
|
|
91
|
+
// four-row table saying why `holds-typescript` is the only admitting answer.
|
|
92
|
+
return diagnosis.onDisk !== undefined && contradictsAbsence(diagnosis.onDisk)
|
|
93
|
+
? 'contradicted-by-disk'
|
|
94
|
+
: undefined;
|
|
95
|
+
default: {
|
|
96
|
+
// The witness, not a comment claiming one. Measured with the repo's own `tsc`: without
|
|
97
|
+
// this, a fifth `GlobFault` left the function at exit 0 returning `undefined` — "not a
|
|
98
|
+
// fault" — and the predecessor `isSyntacticFault(fault): boolean` could not have.
|
|
99
|
+
const exhaustive = diagnosis.fault;
|
|
100
|
+
return exhaustive;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* The remedy a CARDINALITY rule gets on each route, owned once.
|
|
106
|
+
*
|
|
107
|
+
* `check` puts this in `suggestion` (the `Fix:` line) and `doctor` appends it to its own
|
|
108
|
+
* advice, so the two cannot drift — which is
|
|
109
|
+
* [bug 0364](../../../../work/bugs/fixed/0364-doctor-states-the-cause-and-never-the-remedy.md):
|
|
110
|
+
* three rounds of work on what this sentence must say reached only the tool an adopter
|
|
111
|
+
* reaches second.
|
|
112
|
+
*
|
|
113
|
+
* **None of them offers deletion.** On a finding no filter can suppress, deletion is the only
|
|
114
|
+
* achievable exit, and the rule is the thing that noticed — so an instruction to delete it is
|
|
115
|
+
* the ADR-009 rule 2 defect this family has already shipped once.
|
|
116
|
+
*/
|
|
117
|
+
export const CARDINALITY_REMEDY = {
|
|
118
|
+
// The tsconfig cannot help: the glob matches nothing in any project.
|
|
119
|
+
syntactic: 'Correct the selector — this rule has not been enforcing anything. Do not delete it.',
|
|
120
|
+
// The tsconfig cannot help either, for a different reason: the predicate reads the
|
|
121
|
+
// directory portion and the glob names a file, so no `include` makes it match.
|
|
122
|
+
// Names `resideInFile()` verbatim, not "the file-level predicate". Review caught the vaguer
|
|
123
|
+
// phrasing: the CAUSE riding immediately before this already says `resideInFile()`, so the
|
|
124
|
+
// remedy was offering the same option under a second name that appears nowhere in the
|
|
125
|
+
// dialect's vocabulary — and offering it LAST, which is where an agent reading `Fix:` lands.
|
|
126
|
+
'names-a-file': 'Correct the selector to name the DIRECTORY you mean, or use `resideInFile()` if you meant ' +
|
|
127
|
+
'the file — this rule has not been enforcing anything. Do not delete it.',
|
|
128
|
+
// Here, and only here, the tsconfig IS the lever.
|
|
129
|
+
'contradicted-by-disk': 'Widen the tsconfig include to cover this path, or correct the selector — ' +
|
|
130
|
+
'do not delete this rule, it is what detected the gap.',
|
|
131
|
+
};
|
|
132
|
+
/**
|
|
133
|
+
* Does the route's fault hold in EVERY project, or only in this one?
|
|
134
|
+
*
|
|
135
|
+
* A property of the glob text for the syntactic and file-naming routes, and of this project's
|
|
136
|
+
* `include` for the disk route. "in this project" understates the first two by exactly the
|
|
137
|
+
* scope that invites a tsconfig reading.
|
|
138
|
+
*/
|
|
139
|
+
export const ROUTE_HOLDS_IN_ANY_PROJECT = {
|
|
140
|
+
// Decidable from the glob TEXT, with no filesystem and no project: `'./src/**'` matches
|
|
141
|
+
// nothing anywhere.
|
|
142
|
+
syntactic: true,
|
|
143
|
+
// **False, and a first draft had it true.** The fault is contingent on what is on disk: the
|
|
144
|
+
// same glob matches fine in a project where that name is a directory rather than a file. The
|
|
145
|
+
// pinning row in `doctor-and-check-agree-about-a-ratchet.test.ts` caught the error — it
|
|
146
|
+
// exists precisely because that route is the one input separating this claim from a
|
|
147
|
+
// constant, and asserting "any project" there would be confidently wrong.
|
|
148
|
+
'names-a-file': false,
|
|
149
|
+
// Contingent on this project's `include`.
|
|
150
|
+
'contradicted-by-disk': false,
|
|
151
|
+
};
|
|
73
152
|
/**
|
|
74
153
|
* The remedy for each fault, or an honest list of causes where no remedy is
|
|
75
154
|
* verifiable.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"glob-diagnosis.js","sourceRoot":"","sources":["../../src/core/glob-diagnosis.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"glob-diagnosis.js","sourceRoot":"","sources":["../../src/core/glob-diagnosis.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vacuity-diagnosis.d.ts","sourceRoot":"","sources":["../../src/core/vacuity-diagnosis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAY,eAAe,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"vacuity-diagnosis.d.ts","sourceRoot":"","sources":["../../src/core/vacuity-diagnosis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAY,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAqC3E;;;;;;;GAOG;AAKH,eAAO,MAAM,cAAc,0GAC8E,CAAA;AAEzG,MAAM,WAAW,SAAS;IACxB,iEAAiE;IACjE,QAAQ,CAAC,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IACpC,YAAY,IAAI,eAAe,CAAA;IAC/B,eAAe,IAAI,MAAM,CAAA;IACzB,sBAAsB,IAAI,MAAM,CAAA;IAChC,gBAAgB,IAAI,MAAM,CAAA;IAC1B,aAAa,IAAI,MAAM,GAAG,SAAS,CAAA;IACnC,UAAU,IAAI,WAAW,GAAG,SAAS,CAAA;IACrC,KAAK,IAAI,SAAS,QAAQ,EAAE,CAAA;IAC5B,kBAAkB,IAAI,OAAO,CAAA;IAC7B,aAAa,IAAI,OAAO,CAAA;IACxB,kBAAkB,IAAI,MAAM,CAAA;IAC5B,qBAAqB,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,GAAG,aAAa,CAAA;CACvE;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,GAAG,aAAa,EAAE,CAmCtE;AAkKD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,SAAS,EAChB,UAAU,EAAE,aAAa,EAAE,EAC3B,QAAQ,EAAE,MAAM,GACf,aAAa,EAAE,GAAG,SAAS,CA0D7B;AA0HD;;;;;;;;;;;GAWG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,aAAa,CA2C7F;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,GAAG;IACtD,QAAQ,EAAE,aAAa,EAAE,CAAA;IACzB,SAAS,EAAE,aAAa,EAAE,CAAA;CAC3B,CAsCA;AA0ED,+DAA+D;AAC/D,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAgC7D;AAED,kEAAkE;AAClE,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,WAAW,GAAG,SAAS,GAC/B,aAAa,CA4Bf"}
|