@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 +21 -0
- package/README.md +52 -0
- package/dist/async.d.ts +32 -0
- package/dist/async.d.ts.map +1 -0
- package/dist/async.js +132 -0
- package/dist/async.js.map +1 -0
- package/dist/lifecycle.d.ts +26 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +82 -0
- package/dist/lifecycle.js.map +1 -0
- package/dist/when.d.ts +36 -0
- package/dist/when.d.ts.map +1 -0
- package/dist/when.js +231 -0
- package/dist/when.js.map +1 -0
- package/package.json +70 -0
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.
|
package/dist/async.d.ts
ADDED
|
@@ -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
|
package/dist/when.js.map
ADDED
|
@@ -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
|
+
}
|