@nielspeter/eess 0.4.0 → 0.5.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/README.md +94 -1
- package/dist/baseline-generator.d.ts +9 -0
- package/dist/baseline-generator.d.ts.map +1 -1
- package/dist/baseline-generator.js +9 -0
- package/dist/baseline-generator.js.map +1 -1
- package/dist/baseline.d.ts +1 -1
- package/dist/cardinality.d.ts.map +1 -1
- package/dist/cardinality.js +20 -5
- package/dist/cardinality.js.map +1 -1
- package/dist/cli-config.d.ts +106 -0
- package/dist/cli-config.d.ts.map +1 -0
- package/dist/cli-config.js +231 -0
- package/dist/cli-config.js.map +1 -0
- package/dist/collect-result.d.ts +94 -0
- package/dist/collect-result.d.ts.map +1 -0
- package/dist/collect-result.js +142 -0
- package/dist/collect-result.js.map +1 -0
- package/dist/combinators.d.ts +14 -0
- package/dist/combinators.d.ts.map +1 -1
- package/dist/combinators.js +53 -16
- package/dist/combinators.js.map +1 -1
- package/dist/condition.d.ts +37 -0
- package/dist/condition.d.ts.map +1 -1
- package/dist/condition.js +48 -1
- package/dist/condition.js.map +1 -1
- package/dist/correspondence.d.ts +30 -0
- package/dist/correspondence.d.ts.map +1 -1
- package/dist/correspondence.js +36 -1
- package/dist/correspondence.js.map +1 -1
- package/dist/dedupe-config-findings.d.ts.map +1 -1
- package/dist/dedupe-config-findings.js +27 -0
- package/dist/dedupe-config-findings.js.map +1 -1
- package/dist/diff-aware.d.ts +8 -9
- package/dist/diff-aware.d.ts.map +1 -1
- package/dist/diff-aware.js +38 -17
- package/dist/diff-aware.js.map +1 -1
- package/dist/emitter-findings.d.ts +167 -0
- package/dist/emitter-findings.d.ts.map +1 -0
- package/dist/emitter-findings.js +237 -0
- package/dist/emitter-findings.js.map +1 -0
- package/dist/errors.d.ts +48 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +61 -0
- package/dist/errors.js.map +1 -1
- package/dist/exclusion-comments.d.ts +36 -1
- package/dist/exclusion-comments.d.ts.map +1 -1
- package/dist/exclusion-comments.js +185 -37
- package/dist/exclusion-comments.js.map +1 -1
- package/dist/execute-rule.d.ts +12 -3
- package/dist/execute-rule.d.ts.map +1 -1
- package/dist/execute-rule.js +184 -7
- package/dist/execute-rule.js.map +1 -1
- package/dist/file-walk.d.ts +22 -0
- package/dist/file-walk.d.ts.map +1 -0
- package/dist/file-walk.js +51 -0
- package/dist/file-walk.js.map +1 -0
- package/dist/format-json.d.ts +13 -0
- package/dist/format-json.d.ts.map +1 -1
- package/dist/format-json.js +24 -0
- package/dist/format-json.js.map +1 -1
- package/dist/index.d.ts +14 -46
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -41
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +55 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +92 -0
- package/dist/internal.js.map +1 -0
- package/dist/mask-non-comment.d.ts +49 -0
- package/dist/mask-non-comment.d.ts.map +1 -0
- package/dist/mask-non-comment.js +261 -0
- package/dist/mask-non-comment.js.map +1 -0
- package/dist/owns-empty-discovery.d.ts.map +1 -1
- package/dist/owns-empty-discovery.js +12 -4
- package/dist/owns-empty-discovery.js.map +1 -1
- package/dist/path-suffix.d.ts +57 -0
- package/dist/path-suffix.d.ts.map +1 -0
- package/dist/path-suffix.js +73 -0
- package/dist/path-suffix.js.map +1 -0
- package/dist/predicate.d.ts +12 -0
- package/dist/predicate.d.ts.map +1 -1
- package/dist/predicate.js +20 -1
- package/dist/predicate.js.map +1 -1
- package/dist/preset-dispatch.d.ts +6 -34
- package/dist/preset-dispatch.d.ts.map +1 -1
- package/dist/preset-dispatch.js +30 -52
- package/dist/preset-dispatch.js.map +1 -1
- package/dist/report.d.ts +31 -7
- package/dist/report.d.ts.map +1 -1
- package/dist/report.js +174 -15
- package/dist/report.js.map +1 -1
- package/dist/rule-builder-like.d.ts +8 -2
- package/dist/rule-builder-like.d.ts.map +1 -1
- package/dist/rule-builder.d.ts +15 -0
- package/dist/rule-builder.d.ts.map +1 -1
- package/dist/rule-builder.js +41 -36
- package/dist/rule-builder.js.map +1 -1
- package/dist/rule-description.d.ts +50 -0
- package/dist/rule-description.d.ts.map +1 -1
- package/dist/rule-description.js +58 -0
- package/dist/rule-description.js.map +1 -1
- package/dist/selection-memo.d.ts +1 -3
- package/dist/selection-memo.d.ts.map +1 -1
- package/dist/selection-memo.js +1 -3
- package/dist/selection-memo.js.map +1 -1
- package/dist/silent-exclusion.d.ts +12 -0
- package/dist/silent-exclusion.d.ts.map +1 -1
- package/dist/silent-exclusion.js +22 -0
- package/dist/silent-exclusion.js.map +1 -1
- package/dist/terminal-builder.d.ts +29 -15
- package/dist/terminal-builder.d.ts.map +1 -1
- package/dist/terminal-builder.js +97 -51
- package/dist/terminal-builder.js.map +1 -1
- package/dist/vacuity-findings.d.ts +0 -6
- package/dist/vacuity-findings.d.ts.map +1 -1
- package/dist/vacuity-findings.js +27 -57
- package/dist/vacuity-findings.js.map +1 -1
- package/dist/violation.d.ts +22 -1
- package/dist/violation.d.ts.map +1 -1
- package/dist/violation.js.map +1 -1
- package/dist/watch.d.ts +71 -0
- package/dist/watch.d.ts.map +1 -0
- package/dist/watch.js +129 -0
- package/dist/watch.js.map +1 -0
- package/package.json +6 -1
package/dist/violation.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"violation.js","sourceRoot":"","sources":["../src/violation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"violation.js","sourceRoot":"","sources":["../src/violation.ts"],"names":[],"mappings":"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"}
|
package/dist/watch.d.ts
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Watch-mode scheduling and the watch loop, shared by every dialect CLI.
|
|
3
|
+
*
|
|
4
|
+
* **Why this is in the kernel.** It was copied, and the copies drifted. Measured
|
|
5
|
+
* on 2026-08-31: `watchAndRerun` scored 98% between `eess-ts` and `eess-mermaid`,
|
|
6
|
+
* `RunScheduler.schedule` 100%, `RunScheduler.executeRun` 98% — and the drift was
|
|
7
|
+
* not cosmetic. Two fixes had landed on the ts copy alone:
|
|
8
|
+
*
|
|
9
|
+
* - `isArchRuleError` instead of `err instanceof ArchRuleError`. The structural
|
|
10
|
+
* check exists because a rule file does not load through the same module
|
|
11
|
+
* registry as the CLI loading it, so `instanceof` is FALSE for an error that is
|
|
12
|
+
* an `ArchRuleError` in every way that matters. With the `instanceof` form,
|
|
13
|
+
* `eess-mermaid --watch` printed an ordinary rule failure as an unexpected
|
|
14
|
+
* crash.
|
|
15
|
+
* - `isNullaryCallable(w.return)` instead of a `typeof` test plus
|
|
16
|
+
* `w.return.call(w)`, which the copy's own comment noted yields `any`.
|
|
17
|
+
*
|
|
18
|
+
* Nothing here needs a project or a tokenizer, so this unification is not
|
|
19
|
+
* waiting on either decision plan 0188 turns on — see that plan's inventory.
|
|
20
|
+
*
|
|
21
|
+
* Kernel-safe: node builtins and this package only.
|
|
22
|
+
*/
|
|
23
|
+
export interface WatchOptions {
|
|
24
|
+
/** Directories to watch, recursively. */
|
|
25
|
+
watchDirs: string[];
|
|
26
|
+
/** Additional individual files to watch (e.g. rule files). */
|
|
27
|
+
watchFiles: string[];
|
|
28
|
+
/** Which filenames inside `watchDirs` count as a change. */
|
|
29
|
+
watchedFileRe: RegExp;
|
|
30
|
+
/** Runs on a debounced change. */
|
|
31
|
+
onChangeDetected: () => Promise<void>;
|
|
32
|
+
/** Debounce window in ms. Default: 250. */
|
|
33
|
+
debounceMs?: number;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Scheduling logic for watch mode — separate from the loop so it is testable
|
|
37
|
+
* without a filesystem.
|
|
38
|
+
*
|
|
39
|
+
* Debounces rapid triggers. A trigger arriving mid-run is remembered and
|
|
40
|
+
* replayed once the run finishes, so a save during a run is never dropped and
|
|
41
|
+
* never starts a second concurrent run.
|
|
42
|
+
*/
|
|
43
|
+
export declare class RunScheduler {
|
|
44
|
+
#private;
|
|
45
|
+
private debounceTimer;
|
|
46
|
+
private running;
|
|
47
|
+
private _pendingRerun;
|
|
48
|
+
private readonly debounceMs;
|
|
49
|
+
private readonly onRun;
|
|
50
|
+
constructor(onRun: (trigger: string) => Promise<void>, debounceMs?: number);
|
|
51
|
+
/**
|
|
52
|
+
* Completed runs.
|
|
53
|
+
*
|
|
54
|
+
* Hard-private with a getter: the counter is this class's own bookkeeping, and
|
|
55
|
+
* a caller that could reassign it would make the number mean nothing.
|
|
56
|
+
*/
|
|
57
|
+
get runCount(): number;
|
|
58
|
+
get pendingRerun(): boolean;
|
|
59
|
+
get isRunning(): boolean;
|
|
60
|
+
/** Debounce a change on `trigger`, coalescing bursts into a single re-run. */
|
|
61
|
+
schedule(trigger: string): void;
|
|
62
|
+
private executeRun;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Watch for file changes and re-run the callback.
|
|
66
|
+
*
|
|
67
|
+
* Uses `fs.watch` with `recursive: true` (Node 24+). Debounces rapid events; a
|
|
68
|
+
* change during a run is queued and executed after it completes.
|
|
69
|
+
*/
|
|
70
|
+
export declare function watchAndRerun(options: WatchOptions): void;
|
|
71
|
+
//# sourceMappingURL=watch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,WAAW,YAAY;IAC3B,yCAAyC;IACzC,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,8DAA8D;IAC9D,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,4DAA4D;IAC5D,aAAa,EAAE,MAAM,CAAA;IACrB,kCAAkC;IAClC,gBAAgB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IACrC,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAOD;;;;;;;GAOG;AACH,qBAAa,YAAY;;IACvB,OAAO,CAAC,aAAa,CAA2C;IAChE,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoC;gBAG9C,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,EAAE,UAAU,SAAsB;IAKvF;;;;;OAKG;IACH,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,IAAI,YAAY,IAAI,OAAO,CAE1B;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAW/B,OAAO,CAAC,UAAU;CAuBnB;AAmBD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAsCzD"}
|
package/dist/watch.js
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { watch } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { isArchRuleError } from './errors.js';
|
|
4
|
+
import { isNullaryCallable } from './type-guards.js';
|
|
5
|
+
const DEFAULT_DEBOUNCE_MS = 250;
|
|
6
|
+
/** `fs.watch` reports this when a watcher is closed; it is not a fault. */
|
|
7
|
+
const ABORTED = 'The operation was aborted';
|
|
8
|
+
/**
|
|
9
|
+
* Scheduling logic for watch mode — separate from the loop so it is testable
|
|
10
|
+
* without a filesystem.
|
|
11
|
+
*
|
|
12
|
+
* Debounces rapid triggers. A trigger arriving mid-run is remembered and
|
|
13
|
+
* replayed once the run finishes, so a save during a run is never dropped and
|
|
14
|
+
* never starts a second concurrent run.
|
|
15
|
+
*/
|
|
16
|
+
export class RunScheduler {
|
|
17
|
+
debounceTimer;
|
|
18
|
+
running = false;
|
|
19
|
+
_pendingRerun = false;
|
|
20
|
+
debounceMs;
|
|
21
|
+
onRun;
|
|
22
|
+
#runCount = 0;
|
|
23
|
+
constructor(onRun, debounceMs = DEFAULT_DEBOUNCE_MS) {
|
|
24
|
+
this.onRun = onRun;
|
|
25
|
+
this.debounceMs = debounceMs;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Completed runs.
|
|
29
|
+
*
|
|
30
|
+
* Hard-private with a getter: the counter is this class's own bookkeeping, and
|
|
31
|
+
* a caller that could reassign it would make the number mean nothing.
|
|
32
|
+
*/
|
|
33
|
+
get runCount() {
|
|
34
|
+
return this.#runCount;
|
|
35
|
+
}
|
|
36
|
+
get pendingRerun() {
|
|
37
|
+
return this._pendingRerun;
|
|
38
|
+
}
|
|
39
|
+
get isRunning() {
|
|
40
|
+
return this.running;
|
|
41
|
+
}
|
|
42
|
+
/** Debounce a change on `trigger`, coalescing bursts into a single re-run. */
|
|
43
|
+
schedule(trigger) {
|
|
44
|
+
if (this.debounceTimer)
|
|
45
|
+
clearTimeout(this.debounceTimer);
|
|
46
|
+
this.debounceTimer = setTimeout(() => {
|
|
47
|
+
if (this.running) {
|
|
48
|
+
this._pendingRerun = true;
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
this.executeRun(trigger);
|
|
52
|
+
}, this.debounceMs);
|
|
53
|
+
}
|
|
54
|
+
executeRun(trigger) {
|
|
55
|
+
this.running = true;
|
|
56
|
+
this._pendingRerun = false;
|
|
57
|
+
this.#runCount++;
|
|
58
|
+
process.stdout.write('\x1B[2J\x1B[H'); // clear screen, preserve scrollback
|
|
59
|
+
process.stdout.write(`Change detected: ${trigger}\n\n`);
|
|
60
|
+
this.onRun(trigger)
|
|
61
|
+
.catch((err) => {
|
|
62
|
+
// A rule failure is the expected outcome of a watch run — swallow it and
|
|
63
|
+
// let the reporter's own output stand. Anything else is a real fault.
|
|
64
|
+
if (!isArchRuleError(err) && err instanceof Error) {
|
|
65
|
+
console.error(err.message);
|
|
66
|
+
}
|
|
67
|
+
})
|
|
68
|
+
.finally(() => {
|
|
69
|
+
this.running = false;
|
|
70
|
+
if (this._pendingRerun) {
|
|
71
|
+
this.executeRun('(queued change)');
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
process.stdout.write('\nWatching for changes...\n');
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/** Consume one watcher, scheduling on each qualifying event. */
|
|
80
|
+
function consume(watcher, label, onEvent) {
|
|
81
|
+
void (async () => {
|
|
82
|
+
try {
|
|
83
|
+
for await (const event of watcher)
|
|
84
|
+
onEvent(event);
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
if (err instanceof Error && err.message !== ABORTED) {
|
|
88
|
+
console.error(`Watcher error on ${label}: ${err.message}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
})();
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Watch for file changes and re-run the callback.
|
|
95
|
+
*
|
|
96
|
+
* Uses `fs.watch` with `recursive: true` (Node 24+). Debounces rapid events; a
|
|
97
|
+
* change during a run is queued and executed after it completes.
|
|
98
|
+
*/
|
|
99
|
+
export function watchAndRerun(options) {
|
|
100
|
+
const { watchDirs, watchFiles, watchedFileRe, onChangeDetected, debounceMs = DEFAULT_DEBOUNCE_MS, } = options;
|
|
101
|
+
const scheduler = new RunScheduler(onChangeDetected, debounceMs);
|
|
102
|
+
const watchers = [];
|
|
103
|
+
for (const dir of watchDirs) {
|
|
104
|
+
const watcher = watch(path.resolve(dir), { recursive: true });
|
|
105
|
+
watchers.push(watcher);
|
|
106
|
+
consume(watcher, dir, (event) => {
|
|
107
|
+
if (event.filename && watchedFileRe.test(event.filename)) {
|
|
108
|
+
scheduler.schedule(event.filename);
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
for (const file of watchFiles) {
|
|
113
|
+
const watcher = watch(path.resolve(file));
|
|
114
|
+
watchers.push(watcher);
|
|
115
|
+
consume(watcher, file, () => {
|
|
116
|
+
scheduler.schedule(path.basename(file));
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
// Graceful shutdown — close all watchers on SIGINT.
|
|
120
|
+
process.on('SIGINT', () => {
|
|
121
|
+
for (const w of watchers) {
|
|
122
|
+
if ('return' in w && isNullaryCallable(w.return)) {
|
|
123
|
+
void w.return();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
process.exit(0);
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=watch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nielspeter/eess",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.1",
|
|
4
4
|
"description": "eess kernel — the dialect-independent rule engine (RuleBuilder, Predicate, Condition, baseline, formatters). Specifications you can run.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
7
7
|
".": {
|
|
8
8
|
"types": "./dist/index.d.ts",
|
|
9
9
|
"import": "./dist/index.js"
|
|
10
|
+
},
|
|
11
|
+
"./internal": {
|
|
12
|
+
"types": "./dist/internal.d.ts",
|
|
13
|
+
"import": "./dist/internal.js"
|
|
10
14
|
}
|
|
11
15
|
},
|
|
12
16
|
"files": [
|
|
@@ -26,6 +30,7 @@
|
|
|
26
30
|
"license": "MIT",
|
|
27
31
|
"scripts": {
|
|
28
32
|
"prepublishOnly": "npm run build",
|
|
33
|
+
"prebuild": "rm -rf dist",
|
|
29
34
|
"build": "tsc -p tsconfig.build.json",
|
|
30
35
|
"typecheck": "tsc --noEmit",
|
|
31
36
|
"test": "vitest run",
|