@intentic/base 1.176.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Artur Kurowski
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,52 @@
1
+ # @intentic/base
2
+
3
+ The runtime primitives every tier shares: the `when` condition language, disposal, and the async schedulers.
4
+
5
+ Nothing in here knows what this product is. That is the point — each of the three modules replaced a decision
6
+ that had been made independently, and differently, in the daemon and in the web app, where the copies could
7
+ only ever drift apart. There is no barrel export: a consumer imports the module it needs
8
+ (`@intentic/base/when`), because these three have nothing to do with each other and a package that offers them
9
+ as one thing invites being treated as a junk drawer.
10
+
11
+ ## Responsibilities
12
+
13
+ - **`when`** — parse and evaluate a condition written as a string, against a bag of named values the caller
14
+ supplies. This is what lets a condition live in a JSON manifest an extension ships, and be evaluated the same
15
+ way on both sides of the wire. Deliberately not a general expression language: no arithmetic, no calls, no
16
+ reaching past the context object, because these strings arrive from installed extensions.
17
+ - **`lifecycle`** — teardown as structure rather than as a list somebody maintains. A store is registered into
18
+ where things are created and disposed once; it keeps going past a member that throws and reports the failures
19
+ together, so one bad stop cannot strand the ports and child processes queued behind it.
20
+ - **`async`** — the four shapes of "don't do that again yet", named so the choice between them is visible:
21
+ `Delayer` restarts its clock on every call, `Coalescer` opens a window on the first call and lets later ones
22
+ join it, `SingleFlight` shares one run per key among concurrent callers, and `retry` is the loop with the
23
+ delay in it.
24
+
25
+ ## Delayer or Coalescer
26
+
27
+ The two debouncers differ by one character when they are written by hand (`timer = setTimeout(…)` versus
28
+ `timer ??= setTimeout(…)`) and by everything in behaviour. Choosing wrong is not a style mistake: a source that
29
+ never goes quiet starves a `Delayer` forever.
30
+
31
+ ```mermaid
32
+ flowchart LR
33
+ subgraph D["Delayer — clock restarts"]
34
+ d1["call"] --> d2["call"] --> d3["call"] --> d4["quiet for N ms"] --> d5["run once"]
35
+ end
36
+ subgraph C["Coalescer — window from the first"]
37
+ c1["first call<br/>opens the window"] --> c2["calls join it"] --> c3["N ms after the FIRST"] --> c4["flush the batch"]
38
+ end
39
+ ```
40
+
41
+ A search box wants the Delayer: the user stops typing, and stopping is the signal. A file watcher under a
42
+ working agent wants the Coalescer: the agent never stops, and a batch that only arrives once it does arrives
43
+ when nobody needs it any more.
44
+
45
+ ## Key files
46
+
47
+ - [src/when.ts](src/when.ts) — the grammar, the parser, and what a condition means against a context.
48
+ - [src/lifecycle.ts](src/lifecycle.ts) — `DisposableStore` and the two things built on it.
49
+ - [src/async.ts](src/async.ts) — the schedulers, each with the case that made it a separate name.
50
+ - [src/when.test.ts](src/when.test.ts) — the evaluation rules that are decisions rather than syntax: an absent
51
+ key is false, ordering refuses anything but numbers, comparison crosses the type boundary by string form.
52
+ - [src/async.test.ts](src/async.test.ts) — the Delayer/Coalescer distinction pinned as behaviour.
@@ -0,0 +1,32 @@
1
+ import { type IDisposable } from "./lifecycle.js";
2
+ export declare class Delayer<T> implements IDisposable {
3
+ private readonly delay;
4
+ private handle;
5
+ private pending;
6
+ private task;
7
+ constructor(delay: number);
8
+ trigger(task: () => T | Promise<T>): Promise<T>;
9
+ get isPending(): boolean;
10
+ cancel(): void;
11
+ dispose(): void;
12
+ }
13
+ export declare class Coalescer<T> implements IDisposable {
14
+ private readonly window;
15
+ private readonly flush;
16
+ private handle;
17
+ private batch;
18
+ constructor(window: number, flush: (batch: readonly T[]) => void);
19
+ readonly add: (...items: readonly T[]) => void;
20
+ get isPending(): boolean;
21
+ flushNow(): void;
22
+ dispose(): void;
23
+ }
24
+ export declare class SingleFlight<K, T> implements IDisposable {
25
+ private readonly running;
26
+ run(key: K, task: () => Promise<T>): Promise<T>;
27
+ joined(key: K): Promise<T> | undefined;
28
+ get size(): number;
29
+ dispose(): void;
30
+ }
31
+ export declare const retry: <T>(task: () => Promise<T>, delay: number, attempts: number) => Promise<T>;
32
+ //# sourceMappingURL=async.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async.d.ts","sourceRoot":"","sources":["../src/async.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AA6BlD,qBAAa,OAAO,CAAC,CAAC,CAAE,YAAW,WAAW;IAO9B,OAAO,CAAC,QAAQ,CAAC,KAAK;IANlC,OAAO,CAAC,MAAM,CAA4C;IAC1D,OAAO,CAAC,OAAO,CAEC;IAChB,OAAO,CAAC,IAAI,CAAqC;IAEjD,YAA6B,KAAK,EAAE,MAAM,EAAI;IAE9C,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAyB9C;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;IAMD,MAAM,IAAI,IAAI,CAOb;IAED,OAAO,IAAI,IAAI,CAEd;CACJ;AAMD,qBAAa,SAAS,CAAC,CAAC,CAAE,YAAW,WAAW;IAKxC,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAL1B,OAAO,CAAC,MAAM,CAA4C;IAC1D,OAAO,CAAC,KAAK,CAAW;IAExB,YACqB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,KAAK,IAAI,EACrD;IAKJ,QAAQ,CAAC,GAAG,aAAc,SAAS,CAAC,EAAE,KAAG,IAAI,CAU3C;IAEF,IAAI,SAAS,IAAI,OAAO,CAEvB;IAID,QAAQ,IAAI,IAAI,CAWf;IAED,OAAO,IAAI,IAAI,CAMd;CACJ;AAUD,qBAAa,YAAY,CAAC,CAAC,EAAE,CAAC,CAAE,YAAW,WAAW;IAClD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;IAEpD,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAU9C;IAMD,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,CAErC;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAID,OAAO,IAAI,IAAI,CAEd;CACJ;AAID,eAAO,MAAM,KAAK,GAAU,CAAC,QAAQ,MAAM,OAAO,CAAC,CAAC,CAAC,SAAS,MAAM,YAAY,MAAM,KAAG,OAAO,CAAC,CAAC,CAejG,CAAC"}
package/dist/async.js ADDED
@@ -0,0 +1,132 @@
1
+ export class Delayer {
2
+ delay;
3
+ handle;
4
+ pending;
5
+ task;
6
+ constructor(delay) {
7
+ this.delay = delay;
8
+ }
9
+ trigger(task) {
10
+ this.task = task;
11
+ if (this.handle !== undefined) {
12
+ clearTimeout(this.handle);
13
+ }
14
+ if (this.pending === undefined) {
15
+ const { promise, resolve, reject } = Promise.withResolvers();
16
+ this.pending = { promise, resolve, reject };
17
+ }
18
+ const pending = this.pending;
19
+ this.handle = setTimeout(() => {
20
+ this.handle = undefined;
21
+ this.pending = undefined;
22
+ const run = this.task;
23
+ this.task = undefined;
24
+ if (run === undefined) {
25
+ return;
26
+ }
27
+ try {
28
+ pending.resolve(run());
29
+ }
30
+ catch (error) {
31
+ pending.reject(error);
32
+ }
33
+ }, this.delay);
34
+ return pending.promise;
35
+ }
36
+ get isPending() {
37
+ return this.handle !== undefined;
38
+ }
39
+ cancel() {
40
+ if (this.handle !== undefined) {
41
+ clearTimeout(this.handle);
42
+ this.handle = undefined;
43
+ }
44
+ this.pending = undefined;
45
+ this.task = undefined;
46
+ }
47
+ dispose() {
48
+ this.cancel();
49
+ }
50
+ }
51
+ export class Coalescer {
52
+ window;
53
+ flush;
54
+ handle;
55
+ batch = [];
56
+ constructor(window, flush) {
57
+ this.window = window;
58
+ this.flush = flush;
59
+ }
60
+ add = (...items) => {
61
+ this.batch.push(...items);
62
+ this.handle ??= setTimeout(() => {
63
+ this.handle = undefined;
64
+ const batch = this.batch;
65
+ this.batch = [];
66
+ if (batch.length > 0) {
67
+ this.flush(batch);
68
+ }
69
+ }, this.window);
70
+ };
71
+ get isPending() {
72
+ return this.handle !== undefined;
73
+ }
74
+ flushNow() {
75
+ if (this.handle === undefined) {
76
+ return;
77
+ }
78
+ clearTimeout(this.handle);
79
+ this.handle = undefined;
80
+ const batch = this.batch;
81
+ this.batch = [];
82
+ if (batch.length > 0) {
83
+ this.flush(batch);
84
+ }
85
+ }
86
+ dispose() {
87
+ if (this.handle !== undefined) {
88
+ clearTimeout(this.handle);
89
+ this.handle = undefined;
90
+ }
91
+ this.batch = [];
92
+ }
93
+ }
94
+ export class SingleFlight {
95
+ running = new Map();
96
+ run(key, task) {
97
+ const existing = this.running.get(key);
98
+ if (existing !== undefined) {
99
+ return existing;
100
+ }
101
+ const started = task().finally(() => {
102
+ this.running.delete(key);
103
+ });
104
+ this.running.set(key, started);
105
+ return started;
106
+ }
107
+ joined(key) {
108
+ return this.running.get(key);
109
+ }
110
+ get size() {
111
+ return this.running.size;
112
+ }
113
+ dispose() {
114
+ this.running.clear();
115
+ }
116
+ }
117
+ export const retry = async (task, delay, attempts) => {
118
+ let last;
119
+ for (let attempt = 0; attempt < attempts; attempt += 1) {
120
+ try {
121
+ return await task();
122
+ }
123
+ catch (error) {
124
+ last = error;
125
+ if (attempt < attempts - 1) {
126
+ await new Promise((resolve) => setTimeout(resolve, delay));
127
+ }
128
+ }
129
+ }
130
+ throw last;
131
+ };
132
+ //# sourceMappingURL=async.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async.js","sourceRoot":"","sources":["../src/async.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export interface IDisposable {
2
+ dispose(): void;
3
+ }
4
+ export declare const toDisposable: (fn: () => void) => IDisposable;
5
+ export declare class DisposableStore implements IDisposable {
6
+ private readonly members;
7
+ private disposed;
8
+ add<T extends IDisposable>(disposable: T): T;
9
+ push(fn: () => void): void;
10
+ deleteAndDispose(disposable: IDisposable): void;
11
+ get size(): number;
12
+ dispose(): void;
13
+ }
14
+ export declare abstract class Disposable implements IDisposable {
15
+ protected readonly store: DisposableStore;
16
+ protected register<T extends IDisposable>(disposable: T): T;
17
+ dispose(): void;
18
+ }
19
+ export declare class MutableDisposable<T extends IDisposable> implements IDisposable {
20
+ private current;
21
+ private disposed;
22
+ get value(): T | undefined;
23
+ set value(next: T | undefined);
24
+ dispose(): void;
25
+ }
26
+ //# sourceMappingURL=lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,WAAW;IACxB,OAAO,IAAI,IAAI,CAAC;CACnB;AAKD,eAAO,MAAM,YAAY,OAAQ,MAAM,IAAI,KAAG,WAAgC,CAAC;AAmB/E,qBAAa,eAAgB,YAAW,WAAW;IAC/C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;IAClD,OAAO,CAAC,QAAQ,CAAS;IAMzB,GAAG,CAAC,CAAC,SAAS,WAAW,EAAE,UAAU,EAAE,CAAC,GAAG,CAAC,CAO3C;IAID,IAAI,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI,CAEzB;IAID,gBAAgB,CAAC,UAAU,EAAE,WAAW,GAAG,IAAI,CAI9C;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAKD,OAAO,IAAI,IAAI,CAQd;CACJ;AAKD,8BAAsB,UAAW,YAAW,WAAW;IACnD,SAAS,CAAC,QAAQ,CAAC,KAAK,kBAAyB;IAEjD,SAAS,CAAC,QAAQ,CAAC,CAAC,SAAS,WAAW,EAAE,UAAU,EAAE,CAAC,GAAG,CAAC,CAE1D;IAED,OAAO,IAAI,IAAI,CAEd;CACJ;AAMD,qBAAa,iBAAiB,CAAC,CAAC,SAAS,WAAW,CAAE,YAAW,WAAW;IACxE,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,QAAQ,CAAS;IAEzB,IAAI,KAAK,IAAI,CAAC,GAAG,SAAS,CAEzB;IAED,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,SAAS,EAS5B;IAED,OAAO,IAAI,IAAI,CAId;CACJ"}
@@ -0,0 +1,82 @@
1
+ export const toDisposable = (fn) => ({ dispose: fn });
2
+ const disposeAll = (disposables) => {
3
+ const errors = [];
4
+ for (const disposable of disposables) {
5
+ try {
6
+ disposable.dispose();
7
+ }
8
+ catch (error) {
9
+ errors.push(error);
10
+ }
11
+ }
12
+ if (errors.length === 1) {
13
+ throw errors[0];
14
+ }
15
+ if (errors.length > 1) {
16
+ throw new AggregateError(errors, `${errors.length} disposables failed to dispose`);
17
+ }
18
+ };
19
+ export class DisposableStore {
20
+ members = new Set();
21
+ disposed = false;
22
+ add(disposable) {
23
+ if (this.disposed) {
24
+ disposable.dispose();
25
+ return disposable;
26
+ }
27
+ this.members.add(disposable);
28
+ return disposable;
29
+ }
30
+ push(fn) {
31
+ this.add(toDisposable(fn));
32
+ }
33
+ deleteAndDispose(disposable) {
34
+ if (this.members.delete(disposable)) {
35
+ disposable.dispose();
36
+ }
37
+ }
38
+ get size() {
39
+ return this.members.size;
40
+ }
41
+ dispose() {
42
+ if (this.disposed) {
43
+ return;
44
+ }
45
+ this.disposed = true;
46
+ const members = [...this.members];
47
+ this.members.clear();
48
+ disposeAll(members);
49
+ }
50
+ }
51
+ export class Disposable {
52
+ store = new DisposableStore();
53
+ register(disposable) {
54
+ return this.store.add(disposable);
55
+ }
56
+ dispose() {
57
+ this.store.dispose();
58
+ }
59
+ }
60
+ export class MutableDisposable {
61
+ current;
62
+ disposed = false;
63
+ get value() {
64
+ return this.current;
65
+ }
66
+ set value(next) {
67
+ if (next === this.current) {
68
+ return;
69
+ }
70
+ this.current?.dispose();
71
+ this.current = this.disposed ? undefined : next;
72
+ if (this.disposed) {
73
+ next?.dispose();
74
+ }
75
+ }
76
+ dispose() {
77
+ this.disposed = true;
78
+ this.current?.dispose();
79
+ this.current = undefined;
80
+ }
81
+ }
82
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"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"}
package/dist/when.d.ts ADDED
@@ -0,0 +1,36 @@
1
+ export type WhenValue = string | number | boolean;
2
+ export type WhenExpression = {
3
+ readonly kind: "has";
4
+ readonly key: string;
5
+ } | {
6
+ readonly kind: "not";
7
+ readonly operand: WhenExpression;
8
+ } | {
9
+ readonly kind: "compare";
10
+ readonly key: string;
11
+ readonly op: CompareOp;
12
+ readonly value: WhenValue;
13
+ } | {
14
+ readonly kind: "member";
15
+ readonly key: string;
16
+ readonly values: readonly WhenValue[];
17
+ readonly negated: boolean;
18
+ } | {
19
+ readonly kind: "and";
20
+ readonly operands: readonly WhenExpression[];
21
+ } | {
22
+ readonly kind: "or";
23
+ readonly operands: readonly WhenExpression[];
24
+ };
25
+ export type CompareOp = "==" | "!=" | ">" | ">=" | "<" | "<=";
26
+ export declare class WhenSyntaxError extends Error {
27
+ readonly source: string;
28
+ readonly offset: number;
29
+ constructor(message: string, source: string, offset: number);
30
+ }
31
+ export declare const parseWhen: (source: string) => WhenExpression;
32
+ export type WhenContext = Readonly<Record<string, unknown>>;
33
+ export declare const evaluateWhen: (expression: WhenExpression, context: WhenContext) => boolean;
34
+ export declare const isWhenExpression: (source: string) => boolean;
35
+ export declare const whenKeys: (expression: WhenExpression) => readonly string[];
36
+ //# sourceMappingURL=when.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"when.d.ts","sourceRoot":"","sources":["../src/when.ts"],"names":[],"mappings":"AAoCA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAElD,MAAM,MAAM,cAAc,GACpB;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC9C;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAA;CAAE,GAC1D;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAA;CAAE,GACrG;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GACnH;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAA;CAAE,GACtE;IAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAA;CAAE,CAAC;AAE5E,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC;AAM9D,qBAAa,eAAgB,SAAQ,KAAK;IAGlC,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM;IAH3B,YACI,OAAO,EAAE,MAAM,EACN,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EAI1B;CACJ;AA2LD,eAAO,MAAM,SAAS,WAAY,MAAM,KAAG,cAA0D,CAAC;AAoCtG,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAE5D,eAAO,MAAM,YAAY,eAAgB,cAAc,WAAW,WAAW,KAAG,OAwB/E,CAAC;AAKF,eAAO,MAAM,gBAAgB,WAAY,MAAM,KAAG,OAOjD,CAAC;AAKF,eAAO,MAAM,QAAQ,eAAgB,cAAc,KAAG,SAAS,MAAM,EAQpE,CAAC"}
package/dist/when.js ADDED
@@ -0,0 +1,231 @@
1
+ export class WhenSyntaxError extends Error {
2
+ source;
3
+ offset;
4
+ constructor(message, source, offset) {
5
+ super(`${message} (in \`${source}\` at ${offset})`);
6
+ this.source = source;
7
+ this.offset = offset;
8
+ this.name = "WhenSyntaxError";
9
+ }
10
+ }
11
+ const OPERATORS = ["&&", "||", "==", "!=", ">=", "<=", ">", "<", "(", ")", "[", "]", ",", "!"];
12
+ const KEY_START = /[A-Za-z_]/;
13
+ const KEY_BODY = /[A-Za-z0-9_.-]/;
14
+ const scan = (source) => {
15
+ const tokens = [];
16
+ let at = 0;
17
+ while (at < source.length) {
18
+ const char = source[at] ?? "";
19
+ if (char.trim() === "") {
20
+ at += 1;
21
+ continue;
22
+ }
23
+ if (char === "'" || char === `"`) {
24
+ const close = source.indexOf(char, at + 1);
25
+ if (close === -1) {
26
+ throw new WhenSyntaxError("unterminated string", source, at);
27
+ }
28
+ tokens.push({ kind: "literal", value: source.slice(at + 1, close), at });
29
+ at = close + 1;
30
+ continue;
31
+ }
32
+ const operator = OPERATORS.find((candidate) => source.startsWith(candidate, at));
33
+ if (operator !== undefined) {
34
+ tokens.push({ kind: "punct", text: operator, at });
35
+ at += operator.length;
36
+ continue;
37
+ }
38
+ if (/[0-9]/.test(char)) {
39
+ const digits = /^[0-9]+(\.[0-9]+)?/.exec(source.slice(at))?.[0] ?? "";
40
+ tokens.push({ kind: "literal", value: Number(digits), at });
41
+ at += digits.length;
42
+ continue;
43
+ }
44
+ if (KEY_START.test(char)) {
45
+ let end = at + 1;
46
+ while (end < source.length && KEY_BODY.test(source[end] ?? "")) {
47
+ end += 1;
48
+ }
49
+ const word = source.slice(at, end);
50
+ if (word === "true" || word === "false") {
51
+ tokens.push({ kind: "literal", value: word === "true", at });
52
+ }
53
+ else if (word === "in" || word === "not") {
54
+ tokens.push({ kind: "punct", text: word, at });
55
+ }
56
+ else {
57
+ tokens.push({ kind: "key", text: word, at });
58
+ }
59
+ at = end;
60
+ continue;
61
+ }
62
+ throw new WhenSyntaxError(`unexpected character ${JSON.stringify(char)}`, source, at);
63
+ }
64
+ return tokens;
65
+ };
66
+ class Parser {
67
+ tokens;
68
+ source;
69
+ index = 0;
70
+ constructor(tokens, source) {
71
+ this.tokens = tokens;
72
+ this.source = source;
73
+ }
74
+ parse() {
75
+ const expression = this.or();
76
+ const trailing = this.tokens[this.index];
77
+ if (trailing !== undefined) {
78
+ throw new WhenSyntaxError("unexpected trailing input", this.source, trailing.at);
79
+ }
80
+ return expression;
81
+ }
82
+ or() {
83
+ const first = this.and();
84
+ if (!this.at("||")) {
85
+ return first;
86
+ }
87
+ const operands = [first];
88
+ while (this.eat("||")) {
89
+ operands.push(this.and());
90
+ }
91
+ return { kind: "or", operands };
92
+ }
93
+ and() {
94
+ const first = this.unary();
95
+ if (!this.at("&&")) {
96
+ return first;
97
+ }
98
+ const operands = [first];
99
+ while (this.eat("&&")) {
100
+ operands.push(this.unary());
101
+ }
102
+ return { kind: "and", operands };
103
+ }
104
+ unary() {
105
+ if (this.eat("!")) {
106
+ return { kind: "not", operand: this.unary() };
107
+ }
108
+ if (this.eat("(")) {
109
+ const inner = this.or();
110
+ this.expect(")");
111
+ return inner;
112
+ }
113
+ const token = this.tokens[this.index];
114
+ if (token?.kind !== "key") {
115
+ throw new WhenSyntaxError("expected a context key", this.source, token?.at ?? this.source.length);
116
+ }
117
+ this.index += 1;
118
+ return this.tail(token.text);
119
+ }
120
+ tail(key) {
121
+ for (const op of ["==", "!=", ">=", "<=", ">", "<"]) {
122
+ if (this.eat(op)) {
123
+ return { kind: "compare", key, op, value: this.literal() };
124
+ }
125
+ }
126
+ if (this.eat("in")) {
127
+ return { kind: "member", key, values: this.list(), negated: false };
128
+ }
129
+ if (this.at("not")) {
130
+ this.index += 1;
131
+ this.expect("in");
132
+ return { kind: "member", key, values: this.list(), negated: true };
133
+ }
134
+ return { kind: "has", key };
135
+ }
136
+ list() {
137
+ this.expect("[");
138
+ const values = [this.literal()];
139
+ while (this.eat(",")) {
140
+ values.push(this.literal());
141
+ }
142
+ this.expect("]");
143
+ return values;
144
+ }
145
+ literal() {
146
+ const token = this.tokens[this.index];
147
+ if (token?.kind !== "literal") {
148
+ throw new WhenSyntaxError("expected a literal value", this.source, token?.at ?? this.source.length);
149
+ }
150
+ this.index += 1;
151
+ return token.value;
152
+ }
153
+ at(punct) {
154
+ const token = this.tokens[this.index];
155
+ return token?.kind === "punct" && token.text === punct;
156
+ }
157
+ eat(punct) {
158
+ if (!this.at(punct)) {
159
+ return false;
160
+ }
161
+ this.index += 1;
162
+ return true;
163
+ }
164
+ expect(punct) {
165
+ if (!this.eat(punct)) {
166
+ throw new WhenSyntaxError(`expected \`${punct}\``, this.source, this.tokens[this.index]?.at ?? this.source.length);
167
+ }
168
+ }
169
+ }
170
+ export const parseWhen = (source) => new Parser(scan(source), source).parse();
171
+ const truthy = (value) => value !== undefined && value !== null && value !== false && value !== "" && value !== 0;
172
+ const equal = (actual, expected) => typeof actual === typeof expected ? actual === expected : String(actual) === String(expected);
173
+ const ordered = (actual, expected, op) => {
174
+ if (typeof actual !== "number" || typeof expected !== "number") {
175
+ return false;
176
+ }
177
+ if (op === ">") {
178
+ return actual > expected;
179
+ }
180
+ if (op === ">=") {
181
+ return actual >= expected;
182
+ }
183
+ if (op === "<") {
184
+ return actual < expected;
185
+ }
186
+ return actual <= expected;
187
+ };
188
+ export const evaluateWhen = (expression, context) => {
189
+ if (expression.kind === "has") {
190
+ return truthy(context[expression.key]);
191
+ }
192
+ if (expression.kind === "not") {
193
+ return !evaluateWhen(expression.operand, context);
194
+ }
195
+ if (expression.kind === "and") {
196
+ return expression.operands.every((operand) => evaluateWhen(operand, context));
197
+ }
198
+ if (expression.kind === "or") {
199
+ return expression.operands.some((operand) => evaluateWhen(operand, context));
200
+ }
201
+ if (expression.kind === "member") {
202
+ const hit = expression.values.some((value) => equal(context[expression.key], value));
203
+ return expression.negated ? !hit : hit;
204
+ }
205
+ if (expression.op === "==") {
206
+ return equal(context[expression.key], expression.value);
207
+ }
208
+ if (expression.op === "!=") {
209
+ return !equal(context[expression.key], expression.value);
210
+ }
211
+ return ordered(context[expression.key], expression.value, expression.op);
212
+ };
213
+ export const isWhenExpression = (source) => {
214
+ try {
215
+ parseWhen(source);
216
+ return true;
217
+ }
218
+ catch {
219
+ return false;
220
+ }
221
+ };
222
+ export const whenKeys = (expression) => {
223
+ if (expression.kind === "has" || expression.kind === "compare" || expression.kind === "member") {
224
+ return [expression.key];
225
+ }
226
+ if (expression.kind === "not") {
227
+ return whenKeys(expression.operand);
228
+ }
229
+ return [...new Set(expression.operands.flatMap((operand) => whenKeys(operand)))];
230
+ };
231
+ //# sourceMappingURL=when.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"when.js","sourceRoot":"","sources":["../src/when.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,70 @@
1
+ {
2
+ "name": "@intentic/base",
3
+ "version": "1.176.3",
4
+ "description": "Runtime primitives every tier shares — when-expressions, disposal, and the async schedulers",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/intentic/intentic.git",
10
+ "directory": "_tools/base"
11
+ },
12
+ "files": [
13
+ "dist"
14
+ ],
15
+ "publishConfig": {
16
+ "access": "public",
17
+ "registry": "https://registry.npmjs.org/"
18
+ },
19
+ "exports": {
20
+ "./when": {
21
+ "types": "./dist/when.d.ts",
22
+ "import": {
23
+ "@intentic/src": "./src/when.ts",
24
+ "default": "./dist/when.js"
25
+ },
26
+ "require": {
27
+ "@intentic/src": "./src/when.ts",
28
+ "default": "./dist/when.js"
29
+ }
30
+ },
31
+ "./lifecycle": {
32
+ "types": "./dist/lifecycle.d.ts",
33
+ "import": {
34
+ "@intentic/src": "./src/lifecycle.ts",
35
+ "default": "./dist/lifecycle.js"
36
+ },
37
+ "require": {
38
+ "@intentic/src": "./src/lifecycle.ts",
39
+ "default": "./dist/lifecycle.js"
40
+ }
41
+ },
42
+ "./async": {
43
+ "types": "./dist/async.d.ts",
44
+ "import": {
45
+ "@intentic/src": "./src/async.ts",
46
+ "default": "./dist/async.js"
47
+ },
48
+ "require": {
49
+ "@intentic/src": "./src/async.ts",
50
+ "default": "./dist/async.js"
51
+ }
52
+ }
53
+ },
54
+ "dependencies": {
55
+ "tslib": "2.8.1"
56
+ },
57
+ "devDependencies": {
58
+ "@types/node": "24.13.2",
59
+ "@typescript/native-preview": "7.0.0-dev.20260707.2",
60
+ "vitest": "4.1.10",
61
+ "@intentic/tsconfig": "0.0.0"
62
+ },
63
+ "scripts": {
64
+ "build": "tsgo",
65
+ "typecheck": "tsgo --noEmit -p tsconfig.test.json",
66
+ "watch": "tsgo --build --watch",
67
+ "test": "vitest run",
68
+ "test:watch": "vitest"
69
+ }
70
+ }