@praxisjs/core 2.2.0 → 2.3.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/CHANGELOG.md +18 -0
- package/dist/component/internals.d.ts +12 -2
- package/dist/component/internals.d.ts.map +1 -1
- package/dist/component/internals.js +25 -7
- package/dist/component/internals.js.map +1 -1
- package/dist/internal.d.ts +3 -2
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +3 -2
- package/dist/internal.js.map +1 -1
- package/dist/signal/batch.d.ts +1 -3
- package/dist/signal/batch.d.ts.map +1 -1
- package/dist/signal/batch.js +4 -30
- package/dist/signal/batch.js.map +1 -1
- package/dist/signal/computed.d.ts.map +1 -1
- package/dist/signal/computed.js +13 -66
- package/dist/signal/computed.js.map +1 -1
- package/dist/signal/effect.d.ts +6 -14
- package/dist/signal/effect.d.ts.map +1 -1
- package/dist/signal/effect.js +11 -83
- package/dist/signal/effect.js.map +1 -1
- package/dist/signal/graph.d.ts +111 -0
- package/dist/signal/graph.d.ts.map +1 -0
- package/dist/signal/graph.js +513 -0
- package/dist/signal/graph.js.map +1 -0
- package/dist/signal/index.d.ts +1 -0
- package/dist/signal/index.d.ts.map +1 -1
- package/dist/signal/index.js +1 -0
- package/dist/signal/index.js.map +1 -1
- package/dist/signal/peek.d.ts.map +1 -1
- package/dist/signal/peek.js +2 -9
- package/dist/signal/peek.js.map +1 -1
- package/dist/signal/selector.d.ts +5 -0
- package/dist/signal/selector.d.ts.map +1 -0
- package/dist/signal/selector.js +128 -0
- package/dist/signal/selector.js.map +1 -0
- package/dist/signal/signal.d.ts +0 -5
- package/dist/signal/signal.d.ts.map +1 -1
- package/dist/signal/signal.js +11 -70
- package/dist/signal/signal.js.map +1 -1
- package/package.json +13 -4
- package/src/component/internals.ts +35 -10
- package/src/internal.ts +26 -0
- package/src/signal/batch.ts +5 -33
- package/src/signal/computed.ts +13 -66
- package/src/signal/effect.ts +12 -92
- package/src/signal/graph.ts +562 -0
- package/src/signal/index.ts +1 -0
- package/src/signal/peek.ts +2 -8
- package/src/signal/selector.ts +140 -0
- package/src/signal/signal.ts +11 -74
- package/dist/__tests__/batch.test.d.ts +0 -2
- package/dist/__tests__/batch.test.d.ts.map +0 -1
- package/dist/__tests__/batch.test.js +0 -124
- package/dist/__tests__/batch.test.js.map +0 -1
- package/dist/__tests__/component.test.d.ts +0 -2
- package/dist/__tests__/component.test.d.ts.map +0 -1
- package/dist/__tests__/component.test.js +0 -124
- package/dist/__tests__/component.test.js.map +0 -1
- package/dist/__tests__/computed.test.d.ts +0 -2
- package/dist/__tests__/computed.test.d.ts.map +0 -1
- package/dist/__tests__/computed.test.js +0 -289
- package/dist/__tests__/computed.test.js.map +0 -1
- package/dist/__tests__/effect.test.d.ts +0 -2
- package/dist/__tests__/effect.test.d.ts.map +0 -1
- package/dist/__tests__/effect.test.js +0 -200
- package/dist/__tests__/effect.test.js.map +0 -1
- package/dist/__tests__/peek.test.d.ts +0 -2
- package/dist/__tests__/peek.test.d.ts.map +0 -1
- package/dist/__tests__/peek.test.js +0 -26
- package/dist/__tests__/peek.test.js.map +0 -1
- package/dist/__tests__/persisted-signal.test.d.ts +0 -2
- package/dist/__tests__/persisted-signal.test.d.ts.map +0 -1
- package/dist/__tests__/persisted-signal.test.js +0 -252
- package/dist/__tests__/persisted-signal.test.js.map +0 -1
- package/dist/__tests__/reactive.test.d.ts +0 -2
- package/dist/__tests__/reactive.test.d.ts.map +0 -1
- package/dist/__tests__/reactive.test.js +0 -299
- package/dist/__tests__/reactive.test.js.map +0 -1
- package/dist/__tests__/resource-focus.test.d.ts +0 -2
- package/dist/__tests__/resource-focus.test.d.ts.map +0 -1
- package/dist/__tests__/resource-focus.test.js +0 -50
- package/dist/__tests__/resource-focus.test.js.map +0 -1
- package/dist/__tests__/resource-server-pass.test.d.ts +0 -2
- package/dist/__tests__/resource-server-pass.test.d.ts.map +0 -1
- package/dist/__tests__/resource-server-pass.test.js +0 -78
- package/dist/__tests__/resource-server-pass.test.js.map +0 -1
- package/dist/__tests__/resource.test.d.ts +0 -2
- package/dist/__tests__/resource.test.d.ts.map +0 -1
- package/dist/__tests__/resource.test.js +0 -336
- package/dist/__tests__/resource.test.js.map +0 -1
- package/dist/__tests__/signal.test.d.ts +0 -2
- package/dist/__tests__/signal.test.d.ts.map +0 -1
- package/dist/__tests__/signal.test.js +0 -254
- package/dist/__tests__/signal.test.js.map +0 -1
- package/dist/__tests__/synced.test.d.ts +0 -2
- package/dist/__tests__/synced.test.d.ts.map +0 -1
- package/dist/__tests__/synced.test.js +0 -142
- package/dist/__tests__/synced.test.js.map +0 -1
- package/dist/__tests__/track.test.d.ts +0 -2
- package/dist/__tests__/track.test.d.ts.map +0 -1
- package/dist/__tests__/track.test.js +0 -54
- package/dist/__tests__/track.test.js.map +0 -1
- package/src/__tests__/batch.test.ts +0 -138
- package/src/__tests__/component.test.ts +0 -165
- package/src/__tests__/computed.test.ts +0 -333
- package/src/__tests__/effect.test.ts +0 -241
- package/src/__tests__/peek.test.ts +0 -31
- package/src/__tests__/persisted-signal.test.ts +0 -305
- package/src/__tests__/reactive.test.ts +0 -343
- package/src/__tests__/resource-focus.test.ts +0 -61
- package/src/__tests__/resource-server-pass.test.ts +0 -90
- package/src/__tests__/resource.test.ts +0 -421
- package/src/__tests__/signal.test.ts +0 -291
- package/src/__tests__/synced.test.ts +0 -173
- package/src/__tests__/track.test.ts +0 -61
- package/tsconfig.json +0 -8
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { activeSub, createEffect, DIRTY, disposeEffect, endBatch, notify, PENDING, startBatch, track, WatchedNode, type EffectNode } from "./graph";
|
|
2
|
+
|
|
3
|
+
export type Selector<K> = (key: K) => boolean;
|
|
4
|
+
export type SelectorEquals<K, T> = (key: K, value: T) => boolean;
|
|
5
|
+
|
|
6
|
+
// Keys live in a Map, so the default comparison has to be the Map's own (SameValueZero): a key
|
|
7
|
+
// that compares equal must be the one the lookup finds, or a bucket would never be notified.
|
|
8
|
+
function sameValueZero(a: unknown, b: unknown): boolean {
|
|
9
|
+
return a === b || (Number.isNaN(a) && Number.isNaN(b));
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
interface BucketOwner<K> {
|
|
13
|
+
drop(key: K): void;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// One class for every selector's buckets (rather than one declared per selector call), so the
|
|
17
|
+
// graph code that reads and links them always sees the same shape.
|
|
18
|
+
// Declared and assigned rather than parameter properties, which compile to class fields that are
|
|
19
|
+
// defined one by one and make buckets (one per row reading a selector) slower to create.
|
|
20
|
+
class Bucket<K> extends WatchedNode {
|
|
21
|
+
declare readonly key: K;
|
|
22
|
+
private declare readonly owner: BucketOwner<K>;
|
|
23
|
+
|
|
24
|
+
constructor(key: K, owner: BucketOwner<K>) {
|
|
25
|
+
super();
|
|
26
|
+
this.key = key;
|
|
27
|
+
this.owner = owner;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// A bucket drops itself from its selector once its last subscriber unlinks (re-run or disposal).
|
|
31
|
+
unwatched(): void {
|
|
32
|
+
this.owner.drop(this.key);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Keeps the bucket shape alive across full GCs; see the shape keepers in graph.ts.
|
|
37
|
+
Object.defineProperty(Bucket, "shapeKeeper", {
|
|
38
|
+
value: new Bucket<unknown>(undefined, {
|
|
39
|
+
drop() {
|
|
40
|
+
// Never called: the keeper has no subscriber to lose.
|
|
41
|
+
},
|
|
42
|
+
}),
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
export function selector<T>(source: () => T): Selector<T>;
|
|
46
|
+
export function selector<T, K>(source: () => T, equals: SelectorEquals<K, T>): Selector<K>;
|
|
47
|
+
export function selector<T, K>(source: () => T, equals?: SelectorEquals<K, T>): Selector<K> {
|
|
48
|
+
const compare = equals ?? (sameValueZero as SelectorEquals<K, T>);
|
|
49
|
+
const buckets = new Map<K, WatchedNode>();
|
|
50
|
+
let current: T;
|
|
51
|
+
let sourceEffect: EffectNode | null = null;
|
|
52
|
+
let releaseScheduled = false;
|
|
53
|
+
|
|
54
|
+
// The source subscription goes with the last bucket, so removed rows leave nothing behind.
|
|
55
|
+
const owner: BucketOwner<K> = {
|
|
56
|
+
drop(key) {
|
|
57
|
+
buckets.delete(key);
|
|
58
|
+
if (buckets.size === 0) scheduleRelease();
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
function changedBuckets(prev: T, next: T): WatchedNode[] {
|
|
63
|
+
const changed: WatchedNode[] = [];
|
|
64
|
+
if (equals === undefined) {
|
|
65
|
+
if (sameValueZero(prev, next)) return changed;
|
|
66
|
+
const prevBucket = buckets.get(prev as unknown as K);
|
|
67
|
+
const nextBucket = buckets.get(next as unknown as K);
|
|
68
|
+
if (prevBucket !== undefined) changed.push(prevBucket);
|
|
69
|
+
if (nextBucket !== undefined) changed.push(nextBucket);
|
|
70
|
+
return changed;
|
|
71
|
+
}
|
|
72
|
+
for (const [key, bucket] of buckets) {
|
|
73
|
+
if (compare(key, prev) !== compare(key, next)) changed.push(bucket);
|
|
74
|
+
}
|
|
75
|
+
return changed;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Batched so an effect reading several affected keys re-runs once, and so no subscriber runs
|
|
79
|
+
// (and unlinks) while the buckets are still being walked.
|
|
80
|
+
function notifyChanged(prev: T, next: T): void {
|
|
81
|
+
const changed = changedBuckets(prev, next);
|
|
82
|
+
if (changed.length === 0) return;
|
|
83
|
+
startBatch();
|
|
84
|
+
try {
|
|
85
|
+
for (const bucket of changed) {
|
|
86
|
+
bucket.version++;
|
|
87
|
+
notify(bucket);
|
|
88
|
+
}
|
|
89
|
+
} finally {
|
|
90
|
+
endBatch();
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function activate(): void {
|
|
95
|
+
let initialized = false;
|
|
96
|
+
sourceEffect = createEffect(() => {
|
|
97
|
+
const next = source();
|
|
98
|
+
const prev = current;
|
|
99
|
+
current = next;
|
|
100
|
+
if (!initialized) {
|
|
101
|
+
initialized = true;
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
notifyChanged(prev, next);
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// An effect re-running unlinks its bucket right before reading the key again, and a list
|
|
109
|
+
// re-render unlinks every bucket before the new rows subscribe. Waiting a microtask keeps the
|
|
110
|
+
// source subscribed through both instead of stopping and re-reading it each time.
|
|
111
|
+
function scheduleRelease(): void {
|
|
112
|
+
if (releaseScheduled) return;
|
|
113
|
+
releaseScheduled = true;
|
|
114
|
+
queueMicrotask(() => {
|
|
115
|
+
releaseScheduled = false;
|
|
116
|
+
if (buckets.size > 0) return;
|
|
117
|
+
const stop = sourceEffect as EffectNode;
|
|
118
|
+
sourceEffect = null;
|
|
119
|
+
disposeEffect(stop);
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return function select(key: K): boolean {
|
|
124
|
+
if (activeSub === undefined) {
|
|
125
|
+
// `current` lags the source while the source effect waits to run (a write inside a batch, or
|
|
126
|
+
// a computed source, whose effects run a microtask later). A tracked read keeps the cached
|
|
127
|
+
// value, which the effect's run then corrects through the buckets; nothing corrects this one.
|
|
128
|
+
const fresh = sourceEffect !== null && (sourceEffect.flags & (DIRTY | PENDING)) === 0;
|
|
129
|
+
return compare(key, fresh ? current : source());
|
|
130
|
+
}
|
|
131
|
+
if (sourceEffect === null) activate();
|
|
132
|
+
let bucket = buckets.get(key);
|
|
133
|
+
if (bucket === undefined) {
|
|
134
|
+
bucket = new Bucket(key, owner);
|
|
135
|
+
buckets.set(key, bucket);
|
|
136
|
+
}
|
|
137
|
+
track(bucket);
|
|
138
|
+
return compare(key, current);
|
|
139
|
+
};
|
|
140
|
+
}
|
package/src/signal/signal.ts
CHANGED
|
@@ -1,84 +1,21 @@
|
|
|
1
1
|
import type { Signal } from "@praxisjs/shared";
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
activeEffect,
|
|
6
|
-
recordDependency,
|
|
7
|
-
removeSub,
|
|
8
|
-
SUBS_SET_THRESHOLD,
|
|
9
|
-
type Effect,
|
|
10
|
-
type SubList,
|
|
11
|
-
type SubscriberHolder,
|
|
12
|
-
} from "./effect";
|
|
13
|
-
|
|
14
|
-
export type { SubList } from "./effect";
|
|
15
|
-
|
|
16
|
-
export function addSub(holder: SubscriberHolder, eff: Effect): void {
|
|
17
|
-
const subs = holder.subs;
|
|
18
|
-
if (subs === null) {
|
|
19
|
-
holder.subs = eff;
|
|
20
|
-
} else if (typeof subs === "function") {
|
|
21
|
-
if (subs !== eff) holder.subs = [subs, eff];
|
|
22
|
-
} else if (subs instanceof Set) {
|
|
23
|
-
subs.add(eff);
|
|
24
|
-
} else if (!subs.includes(eff)) {
|
|
25
|
-
subs.push(eff);
|
|
26
|
-
if (subs.length > SUBS_SET_THRESHOLD) holder.subs = new Set(subs);
|
|
27
|
-
}
|
|
28
|
-
recordDependency(eff, holder);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export { removeSub };
|
|
32
|
-
|
|
33
|
-
export function notifySubs(subs: Exclude<SubList, null>, batching: boolean): void {
|
|
34
|
-
if (typeof subs === "function") {
|
|
35
|
-
if (batching) enqueueEffect(subs); else subs();
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
const snapshot = [...subs];
|
|
39
|
-
if (batching) {
|
|
40
|
-
for (const sub of snapshot) enqueueEffect(sub);
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
let lastError: unknown;
|
|
44
|
-
let hasError = false;
|
|
45
|
-
for (const sub of snapshot) {
|
|
46
|
-
try {
|
|
47
|
-
sub();
|
|
48
|
-
} catch (e) {
|
|
49
|
-
lastError = e;
|
|
50
|
-
hasError = true;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
if (hasError) throw lastError;
|
|
54
|
-
}
|
|
3
|
+
import { untrack } from "./effect";
|
|
4
|
+
import { createEffect, disposeEffect, readSignal, SignalNode, writeSignal } from "./graph";
|
|
55
5
|
|
|
56
6
|
export function signal<T>(initialValue: T): Signal<T> {
|
|
57
|
-
|
|
58
|
-
const holder = { subs: null as SubList };
|
|
59
|
-
|
|
60
|
-
function read(): T {
|
|
61
|
-
if (activeEffect !== null) addSub(holder, activeEffect);
|
|
62
|
-
return value;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
const s = read as Signal<T>;
|
|
66
|
-
|
|
67
|
-
s.set = (newValue: T) => {
|
|
68
|
-
if (Object.is(value, newValue)) return;
|
|
69
|
-
value = newValue;
|
|
70
|
-
if (holder.subs !== null) notifySubs(holder.subs, isBatching());
|
|
71
|
-
};
|
|
72
|
-
|
|
73
|
-
s.update = (fn: (prev: T) => T) => { s.set(fn(value)); };
|
|
7
|
+
const node = new SignalNode(initialValue);
|
|
74
8
|
|
|
9
|
+
const s = (() => readSignal(node)) as Signal<T>;
|
|
10
|
+
s.set = (newValue: T) => { writeSignal(node, newValue); };
|
|
11
|
+
s.update = (fn: (prev: T) => T) => { writeSignal(node, fn(node.value)); };
|
|
75
12
|
s.subscribe = (fn: (value: T) => void) => {
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
13
|
+
const sub = createEffect(() => {
|
|
14
|
+
const value = readSignal(node);
|
|
15
|
+
untrack(() => { fn(value); });
|
|
16
|
+
});
|
|
17
|
+
return () => { disposeEffect(sub); };
|
|
80
18
|
};
|
|
81
|
-
|
|
82
19
|
s.__isSignal = true;
|
|
83
20
|
return s;
|
|
84
21
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"batch.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/batch.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi } from "vitest";
|
|
2
|
-
import { batch } from "../signal/batch";
|
|
3
|
-
import { effect } from "../signal/effect";
|
|
4
|
-
import { signal } from "../signal/signal";
|
|
5
|
-
describe("batch", () => {
|
|
6
|
-
it("executes the wrapped function", () => {
|
|
7
|
-
const s = signal(0);
|
|
8
|
-
batch(() => {
|
|
9
|
-
s.set(5);
|
|
10
|
-
s.set(10);
|
|
11
|
-
});
|
|
12
|
-
expect(s()).toBe(10);
|
|
13
|
-
});
|
|
14
|
-
it("does not throw when no effects are tracking", () => {
|
|
15
|
-
const s = signal(0);
|
|
16
|
-
expect(() => { batch(() => { s.set(1); }); }).not.toThrow();
|
|
17
|
-
expect(s()).toBe(1);
|
|
18
|
-
});
|
|
19
|
-
it("propagates errors thrown inside the batch", () => {
|
|
20
|
-
expect(() => {
|
|
21
|
-
batch(() => {
|
|
22
|
-
throw new Error("inside batch");
|
|
23
|
-
});
|
|
24
|
-
}).toThrow("inside batch");
|
|
25
|
-
});
|
|
26
|
-
it("nested batch() — effects run exactly once after outer batch completes", () => {
|
|
27
|
-
const s = signal(0);
|
|
28
|
-
const runs = [];
|
|
29
|
-
effect(() => { runs.push(s()); });
|
|
30
|
-
// initial run captured
|
|
31
|
-
const before = runs.length;
|
|
32
|
-
batch(() => {
|
|
33
|
-
batch(() => {
|
|
34
|
-
s.set(1);
|
|
35
|
-
s.set(2);
|
|
36
|
-
});
|
|
37
|
-
s.set(3);
|
|
38
|
-
});
|
|
39
|
-
// effect should have run exactly once for the final value
|
|
40
|
-
expect(runs.length).toBe(before + 1);
|
|
41
|
-
expect(runs[runs.length - 1]).toBe(3);
|
|
42
|
-
});
|
|
43
|
-
it("batch() that throws still cleans up state (no stuck batchQueue)", () => {
|
|
44
|
-
const s = signal(0);
|
|
45
|
-
const runs = [];
|
|
46
|
-
effect(() => { runs.push(s()); });
|
|
47
|
-
expect(() => batch(() => {
|
|
48
|
-
s.set(1);
|
|
49
|
-
throw new Error("batch boom");
|
|
50
|
-
})).toThrow("batch boom");
|
|
51
|
-
// After the failed batch, the queue must be cleared so subsequent
|
|
52
|
-
// signal changes work normally (not deferred indefinitely).
|
|
53
|
-
const countBefore = runs.length;
|
|
54
|
-
s.set(99);
|
|
55
|
-
expect(runs.length).toBe(countBefore + 1);
|
|
56
|
-
expect(runs[runs.length - 1]).toBe(99);
|
|
57
|
-
});
|
|
58
|
-
it("effect added inside a running batch is included in the drain", () => {
|
|
59
|
-
const s = signal(0);
|
|
60
|
-
const seen = [];
|
|
61
|
-
batch(() => {
|
|
62
|
-
// Create an effect inside the batch — it runs immediately (initial run)
|
|
63
|
-
// and registers itself as a subscriber. Then we set the signal so it
|
|
64
|
-
// gets enqueued into the batch queue.
|
|
65
|
-
effect(() => { seen.push(s()); });
|
|
66
|
-
s.set(5);
|
|
67
|
-
});
|
|
68
|
-
// The effect should have captured both the initial value and the batched value
|
|
69
|
-
expect(seen).toContain(0);
|
|
70
|
-
expect(seen).toContain(5);
|
|
71
|
-
});
|
|
72
|
-
it("an effect fed by several signals runs once per batch", () => {
|
|
73
|
-
const a = signal(0);
|
|
74
|
-
const b = signal(0);
|
|
75
|
-
const runs = vi.fn();
|
|
76
|
-
effect(() => {
|
|
77
|
-
void a();
|
|
78
|
-
void b();
|
|
79
|
-
runs();
|
|
80
|
-
});
|
|
81
|
-
runs.mockClear();
|
|
82
|
-
batch(() => {
|
|
83
|
-
a.set(1);
|
|
84
|
-
b.set(1);
|
|
85
|
-
a.set(2);
|
|
86
|
-
});
|
|
87
|
-
expect(runs).toHaveBeenCalledOnce();
|
|
88
|
-
});
|
|
89
|
-
it("a throwing effect does not stop the others and the error is rethrown after the flush", () => {
|
|
90
|
-
const s = signal(0);
|
|
91
|
-
const after = vi.fn();
|
|
92
|
-
let armed = false;
|
|
93
|
-
effect(() => {
|
|
94
|
-
void s();
|
|
95
|
-
if (armed)
|
|
96
|
-
throw new Error("effect boom");
|
|
97
|
-
});
|
|
98
|
-
effect(() => {
|
|
99
|
-
void s();
|
|
100
|
-
if (armed)
|
|
101
|
-
after();
|
|
102
|
-
});
|
|
103
|
-
armed = true;
|
|
104
|
-
expect(() => { batch(() => { s.set(1); }); }).toThrow("effect boom");
|
|
105
|
-
expect(after).toHaveBeenCalledOnce();
|
|
106
|
-
});
|
|
107
|
-
it("a failed flush leaves no stale entries for the next batch", () => {
|
|
108
|
-
const s = signal(0);
|
|
109
|
-
const runs = vi.fn();
|
|
110
|
-
let throws = true;
|
|
111
|
-
effect(() => {
|
|
112
|
-
void s();
|
|
113
|
-
runs();
|
|
114
|
-
if (throws && s() === 1)
|
|
115
|
-
throw new Error("once");
|
|
116
|
-
});
|
|
117
|
-
expect(() => { batch(() => { s.set(1); }); }).toThrow("once");
|
|
118
|
-
throws = false;
|
|
119
|
-
runs.mockClear();
|
|
120
|
-
batch(() => { s.set(2); });
|
|
121
|
-
expect(runs).toHaveBeenCalledOnce();
|
|
122
|
-
});
|
|
123
|
-
});
|
|
124
|
-
//# sourceMappingURL=batch.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"batch.test.js","sourceRoot":"","sources":["../../src/__tests__/batch.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"component.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/component.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from "vitest";
|
|
2
|
-
import { RootComponent } from "../component/base";
|
|
3
|
-
import { getComponentAnchor, getComponentDefault, getComponentDefaults, getComponentProps, getComponentRawProp, isComponentMounted, isStateDirty, markStateDirty, setComponentAnchor, setComponentDefault, setComponentMounted, setComponentProps, setStateDirty, } from "../component/internals";
|
|
4
|
-
import { StatefulComponent } from "../component/stateful";
|
|
5
|
-
import { StatelessComponent } from "../component/stateless";
|
|
6
|
-
class ConcreteRoot extends RootComponent {
|
|
7
|
-
render() {
|
|
8
|
-
return null;
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
class ConcreteStateful extends StatefulComponent {
|
|
12
|
-
render() {
|
|
13
|
-
return null;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
describe("RootComponent", () => {
|
|
17
|
-
it("stores props in component internals", () => {
|
|
18
|
-
const c = new ConcreteRoot({ name: "Alice" });
|
|
19
|
-
expect(getComponentProps(c).name).toBe("Alice");
|
|
20
|
-
});
|
|
21
|
-
it("does not expose old underscore internals as own properties", () => {
|
|
22
|
-
const c = new ConcreteRoot({ name: "Alice" });
|
|
23
|
-
expect(Object.prototype.hasOwnProperty.call(c, "_rawProps")).toBe(false);
|
|
24
|
-
expect(Object.prototype.hasOwnProperty.call(c, "_mounted")).toBe(false);
|
|
25
|
-
expect(Object.prototype.hasOwnProperty.call(c, "_anchor")).toBe(false);
|
|
26
|
-
expect(Object.prototype.hasOwnProperty.call(c, "_setProps")).toBe(false);
|
|
27
|
-
});
|
|
28
|
-
it("mounted starts as false", () => {
|
|
29
|
-
const c = new ConcreteRoot({ name: "" });
|
|
30
|
-
expect(isComponentMounted(c)).toBe(false);
|
|
31
|
-
});
|
|
32
|
-
it("anchor starts as undefined", () => {
|
|
33
|
-
const c = new ConcreteRoot({ name: "" });
|
|
34
|
-
expect(getComponentAnchor(c)).toBeUndefined();
|
|
35
|
-
});
|
|
36
|
-
it("defaults to empty object when no props given", () => {
|
|
37
|
-
const c = new ConcreteRoot();
|
|
38
|
-
expect(getComponentProps(c)).toEqual({});
|
|
39
|
-
});
|
|
40
|
-
});
|
|
41
|
-
describe("StatefulComponent", () => {
|
|
42
|
-
it("defaults start as empty object", () => {
|
|
43
|
-
const c = new ConcreteStateful();
|
|
44
|
-
expect(getComponentDefaults(c)).toEqual({});
|
|
45
|
-
});
|
|
46
|
-
it("stateDirty starts as false", () => {
|
|
47
|
-
const c = new ConcreteStateful();
|
|
48
|
-
expect(isStateDirty(c)).toBe(false);
|
|
49
|
-
});
|
|
50
|
-
it("setComponentProps replaces raw props contents", () => {
|
|
51
|
-
const c = new ConcreteStateful({ x: 1 });
|
|
52
|
-
setComponentProps(c, { y: 2 });
|
|
53
|
-
const props = getComponentProps(c);
|
|
54
|
-
expect(props.x).toBeUndefined();
|
|
55
|
-
expect(props.y).toBe(2);
|
|
56
|
-
});
|
|
57
|
-
it("updates anchor, mounted, defaults, and dirty state through helpers", () => {
|
|
58
|
-
const c = new ConcreteStateful();
|
|
59
|
-
const anchor = {};
|
|
60
|
-
setComponentAnchor(c, anchor);
|
|
61
|
-
setComponentMounted(c, true);
|
|
62
|
-
setComponentDefault(c, "label", "Save");
|
|
63
|
-
setStateDirty(c, true);
|
|
64
|
-
expect(getComponentAnchor(c)).toBe(anchor);
|
|
65
|
-
expect(isComponentMounted(c)).toBe(true);
|
|
66
|
-
expect(getComponentDefaults(c).label).toBe("Save");
|
|
67
|
-
expect(isStateDirty(c)).toBe(true);
|
|
68
|
-
});
|
|
69
|
-
it("reads raw props and defaults through single-value helpers", () => {
|
|
70
|
-
const c = new ConcreteStateful({ label: "From parent" });
|
|
71
|
-
setComponentDefault(c, "label", "Default");
|
|
72
|
-
expect(getComponentRawProp(c, "label")).toBe("From parent");
|
|
73
|
-
expect(getComponentDefault(c, "label")).toBe("Default");
|
|
74
|
-
});
|
|
75
|
-
it("throws when component internals are read from a non-component", () => {
|
|
76
|
-
expect(() => getComponentProps({})).toThrow(TypeError);
|
|
77
|
-
expect(() => getComponentProps({})).toThrow("Expected a PraxisJS component instance.");
|
|
78
|
-
});
|
|
79
|
-
it("ignores dirty-state writes on non-component hosts", () => {
|
|
80
|
-
const host = {};
|
|
81
|
-
expect(() => markStateDirty(host)).not.toThrow();
|
|
82
|
-
expect(() => setStateDirty(host, true)).not.toThrow();
|
|
83
|
-
expect(isStateDirty(host)).toBe(false);
|
|
84
|
-
});
|
|
85
|
-
});
|
|
86
|
-
class ConcreteStateless extends StatelessComponent {
|
|
87
|
-
render() {
|
|
88
|
-
return null;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
describe("StatelessComponent", () => {
|
|
92
|
-
it("stores props in component internals", () => {
|
|
93
|
-
const c = new ConcreteStateless({ name: "Alice" });
|
|
94
|
-
expect(getComponentProps(c).name).toBe("Alice");
|
|
95
|
-
});
|
|
96
|
-
it("setComponentProps replaces raw props contents", () => {
|
|
97
|
-
const c = new ConcreteStateless({ name: "Alice" });
|
|
98
|
-
setComponentProps(c, { name: "Bob" });
|
|
99
|
-
expect(getComponentProps(c).name).toBe("Bob");
|
|
100
|
-
});
|
|
101
|
-
it("setComponentProps removes old keys", () => {
|
|
102
|
-
const c = new ConcreteStateless({ name: "Alice" });
|
|
103
|
-
setComponentProps(c, {});
|
|
104
|
-
expect(getComponentProps(c).name).toBeUndefined();
|
|
105
|
-
});
|
|
106
|
-
it("accepts and exposes children via props.children", () => {
|
|
107
|
-
const c = new ConcreteStateless({ name: "x", children: "hello" });
|
|
108
|
-
expect(c.props.children).toBe("hello");
|
|
109
|
-
});
|
|
110
|
-
it("children is optional and defaults to undefined", () => {
|
|
111
|
-
const c = new ConcreteStateless({ name: "x" });
|
|
112
|
-
expect(c.props.children).toBeUndefined();
|
|
113
|
-
});
|
|
114
|
-
it("works with default generic (no explicit T)", () => {
|
|
115
|
-
class Bare extends StatelessComponent {
|
|
116
|
-
render() {
|
|
117
|
-
return null;
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
const c = new Bare({ children: "hi" });
|
|
121
|
-
expect(c.props.children).toBe("hi");
|
|
122
|
-
});
|
|
123
|
-
});
|
|
124
|
-
//# sourceMappingURL=component.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"component.test.js","sourceRoot":"","sources":["../../src/__tests__/component.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,aAAa,GACd,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,MAAM,YAAa,SAAQ,aAA+B;IACxD,MAAM;QACJ,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED,MAAM,gBAAiB,SAAQ,iBAAiB;IAC9C,MAAM;QACJ,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,GAAG,IAAI,YAAY,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAE,iBAAiB,CAAC,CAAC,CAAsB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,CAAC,GAAG,IAAI,YAAY,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,CAAC,GAAG,IAAI,YAAY,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACzC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,GAAG,IAAI,YAAY,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACzC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,GAAG,IAAI,YAAY,EAAE,CAAC;QAC7B,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACjC,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACjC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,GAAG,IAAI,gBAAgB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACzC,iBAAiB,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/B,MAAM,KAAK,GAAG,iBAAiB,CAAC,CAAC,CAA4B,CAAC;QAC9D,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC5E,MAAM,CAAC,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,EAAa,CAAC;QAE7B,kBAAkB,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAC9B,mBAAmB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAC7B,mBAAmB,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACxC,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAEvB,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnD,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,CAAC,GAAG,IAAI,gBAAgB,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;QACzD,mBAAmB,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QAE3C,MAAM,CAAC,mBAAmB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC5D,MAAM,CAAC,mBAAmB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACvD,MAAM,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CACzC,yCAAyC,CAC1C,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,IAAI,GAAG,EAAE,CAAC;QAEhB,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjD,MAAM,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACtD,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,MAAM,iBAAkB,SAAQ,kBAAoC;IAClE,MAAM;QACJ,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,GAAG,IAAI,iBAAiB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACnD,MAAM,CAAE,iBAAiB,CAAC,CAAC,CAAsB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,GAAG,IAAI,iBAAiB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACnD,iBAAiB,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACtC,MAAM,CAAE,iBAAiB,CAAC,CAAC,CAAsB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,GAAG,IAAI,iBAAiB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACnD,iBAAiB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACzB,MAAM,CAAE,iBAAiB,CAAC,CAAC,CAA6B,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;IACjF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,GAAG,IAAI,iBAAiB,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAClE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,GAAG,IAAI,iBAAiB,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QAC/C,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,aAAa,EAAE,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,IAAK,SAAQ,kBAAkB;YACnC,MAAM;gBACJ,OAAO,IAAI,CAAC;YACd,CAAC;SACF;QACD,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"computed.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/computed.test.ts"],"names":[],"mappings":""}
|