@nisli/core 0.54.1 → 0.56.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/README.md +119 -4
- package/dist/component.js +146 -5
- package/dist/component.js.map +1 -1
- package/dist/diagnostics.d.ts +48 -0
- package/dist/diagnostics.js +118 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/disposable.d.ts +14 -0
- package/dist/disposable.js +8 -0
- package/dist/disposable.js.map +1 -0
- package/dist/emitter.d.ts +2 -1
- package/dist/emitter.js +2 -1
- package/dist/emitter.js.map +1 -1
- package/dist/hmr/registry.js +8 -1
- package/dist/hmr/registry.js.map +1 -1
- package/dist/index.d.ts +6 -3
- package/dist/index.js +9 -2
- package/dist/index.js.map +1 -1
- package/dist/injector.d.ts +9 -2
- package/dist/injector.js +18 -0
- package/dist/injector.js.map +1 -1
- package/dist/lifecycle.d.ts +9 -0
- package/dist/lifecycle.js +17 -7
- package/dist/lifecycle.js.map +1 -1
- package/dist/projection.js +24 -5
- package/dist/projection.js.map +1 -1
- package/dist/query.d.ts +134 -55
- package/dist/query.js +379 -188
- package/dist/query.js.map +1 -1
- package/dist/resource.d.ts +2 -1
- package/dist/resource.js +21 -4
- package/dist/resource.js.map +1 -1
- package/dist/settle.d.ts +61 -0
- package/dist/settle.js +106 -0
- package/dist/settle.js.map +1 -0
- package/dist/signal.d.ts +42 -7
- package/dist/signal.js +248 -68
- package/dist/signal.js.map +1 -1
- package/dist/template-audit.d.ts +64 -0
- package/dist/template-audit.js +246 -0
- package/dist/template-audit.js.map +1 -0
- package/dist/template.d.ts +69 -12
- package/dist/template.js +349 -66
- package/dist/template.js.map +1 -1
- package/dist/view-transition.d.ts +70 -0
- package/dist/view-transition.js +98 -0
- package/dist/view-transition.js.map +1 -0
- package/package.json +1 -1
package/dist/signal.js
CHANGED
|
@@ -2,10 +2,26 @@
|
|
|
2
2
|
* signal.ts — Reactive primitives: signal(), computed(), effect()
|
|
3
3
|
*
|
|
4
4
|
* Push-pull hybrid model:
|
|
5
|
-
* - Writes push
|
|
5
|
+
* - Writes push dirty flags up the dependency graph in two flavors: a signal
|
|
6
|
+
* write pushes Dirty (the value definitely changed), a computed propagates
|
|
7
|
+
* MaybeDirty (recompute to find out). Flags never downgrade.
|
|
6
8
|
* - Reads pull fresh values lazily (computed only recalculates when read)
|
|
7
9
|
* - Multiple synchronous writes coalesce into one microtask flush
|
|
8
10
|
*
|
|
11
|
+
* Scheduler invariants (ADR 0030.2 T5):
|
|
12
|
+
* - An effect re-runs iff a value it read changed. Before a MaybeDirty
|
|
13
|
+
* effect runs, its computed sources are polled (recomputed via the
|
|
14
|
+
* node→impl back-pointer); if no source's change-epoch advanced past the
|
|
15
|
+
* effect's last completed run, the run is skipped. A computed's
|
|
16
|
+
* change-epoch also bumps on every error-state TRANSITION (enter and
|
|
17
|
+
* exit), so effects never skip across error entry or equal-value recovery
|
|
18
|
+
* (issue 0003 containment happens at the effect's own read).
|
|
19
|
+
* - Pending effects flush in creation order (monotonic index), so identical
|
|
20
|
+
* writes produce identical run order. Documented cost: a later-created
|
|
21
|
+
* writer effect costs one deterministic extra run vs. topological order.
|
|
22
|
+
* - The loop guard is clock-free: an effect that re-schedules ITSELF on
|
|
23
|
+
* MAX_EFFECT_RERUNS consecutive runs is diagnosed (N301) and disposed.
|
|
24
|
+
*
|
|
9
25
|
* Dependency tracking is automatic: reading a signal inside a computed
|
|
10
26
|
* or effect registers it as a dependency. Dependencies are re-tracked
|
|
11
27
|
* on every execution (dynamic/conditional tracking).
|
|
@@ -31,11 +47,34 @@ export const SIGNAL_BRAND = Symbol.for('backlog.signal');
|
|
|
31
47
|
*/
|
|
32
48
|
let activeObserver = null;
|
|
33
49
|
/**
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
50
|
+
* The effect whose fn frame is currently executing. Unlike activeObserver
|
|
51
|
+
* (which switches to a computed during its recompute, and to null under
|
|
52
|
+
* untrack()), this stays pinned to the running effect — it exists solely to
|
|
53
|
+
* attribute writes to the effect that performed them (N302).
|
|
54
|
+
*/
|
|
55
|
+
let runningEffect = null;
|
|
56
|
+
/**
|
|
57
|
+
* Global epoch counter. Incremented on every observable change: a signal
|
|
58
|
+
* write, a computed recomputing to a different value, and a computed's
|
|
59
|
+
* error-state transitions (enter and exit). A node's `lastChanged` epoch is
|
|
60
|
+
* compared against an observer's last-validated/last-run epoch to decide
|
|
61
|
+
* staleness.
|
|
37
62
|
*/
|
|
38
63
|
let globalEpoch = 0;
|
|
64
|
+
/** Monotonic effect creation index — pending effects flush in this order. */
|
|
65
|
+
let nextEffectOrder = 0;
|
|
66
|
+
// ── Dev diagnostics ─────────────────────────────────────────────────
|
|
67
|
+
// Reporting goes through the diagnostics leaf (its dev gate governs);
|
|
68
|
+
// guard BEHAVIOR (loop disposal, rejection containment) is never gated —
|
|
69
|
+
// only the reporting. Assigned codes: N301 effect loop, N302
|
|
70
|
+
// write-in-own-effect, N303 flush/tick cap, N310 effect(async).
|
|
71
|
+
import { diag as emitDiag, isDev } from './diagnostics.js';
|
|
72
|
+
import { disposable } from './disposable.js';
|
|
73
|
+
function diag(code, message, detail) {
|
|
74
|
+
if (!isDev())
|
|
75
|
+
return;
|
|
76
|
+
emitDiag(code, message, detail);
|
|
77
|
+
}
|
|
39
78
|
// ── Effect scheduling ────────────────────────────────────────────────
|
|
40
79
|
const pendingEffects = new Set();
|
|
41
80
|
let flushScheduled = false;
|
|
@@ -47,8 +86,9 @@ function scheduleFlush() {
|
|
|
47
86
|
}
|
|
48
87
|
function flushPendingEffects() {
|
|
49
88
|
flushScheduled = false;
|
|
50
|
-
// Copy to avoid mutation during iteration
|
|
51
|
-
|
|
89
|
+
// Copy to avoid mutation during iteration; sort by creation index so
|
|
90
|
+
// identical writes produce identical run order forever (ADR 0030.2 T5).
|
|
91
|
+
const effects = [...pendingEffects].sort((a, b) => a.order - b.order);
|
|
52
92
|
pendingEffects.clear();
|
|
53
93
|
for (const effect of effects) {
|
|
54
94
|
if (!effect.disposed) {
|
|
@@ -86,9 +126,23 @@ class SignalImpl {
|
|
|
86
126
|
set value(newValue) {
|
|
87
127
|
if (Object.is(this._node.value, newValue))
|
|
88
128
|
return;
|
|
129
|
+
// N302: write-in-own-sources — the running effect wrote a signal it also
|
|
130
|
+
// reads this run, so this write re-triggers it. Attribution-only (never
|
|
131
|
+
// disposes; the loop guard owns disposal). Placed AFTER the Object.is
|
|
132
|
+
// cutoff so certified converging writers — registry reflect effects,
|
|
133
|
+
// each() item-signal reuse — never warn on equal-value writes.
|
|
134
|
+
if (runningEffect !== null &&
|
|
135
|
+
runningEffect.sources.has(this._node)) {
|
|
136
|
+
diag('N302', 'Effect wrote to a signal it also reads — the write re-schedules the ' +
|
|
137
|
+
'effect. If this does not converge to an equal value it is an ' +
|
|
138
|
+
'infinite loop. Derive the value with computed() instead.', runningEffect.createdAt ? { effect: runningEffect.createdAt } : undefined);
|
|
139
|
+
}
|
|
89
140
|
this._node.value = newValue;
|
|
90
141
|
this._node.lastChanged = ++globalEpoch;
|
|
91
|
-
notifyObservers(this._node.observers);
|
|
142
|
+
notifyObservers(this._node.observers, NodeState.Dirty);
|
|
143
|
+
}
|
|
144
|
+
peek() {
|
|
145
|
+
return this._node.value;
|
|
92
146
|
}
|
|
93
147
|
subscribe(fn) {
|
|
94
148
|
return effect(() => {
|
|
@@ -100,9 +154,9 @@ class SignalImpl {
|
|
|
100
154
|
});
|
|
101
155
|
}
|
|
102
156
|
}
|
|
103
|
-
function notifyObservers(observers) {
|
|
157
|
+
function notifyObservers(observers, flavor) {
|
|
104
158
|
for (const observer of observers) {
|
|
105
|
-
observer.notify();
|
|
159
|
+
observer.notify(flavor);
|
|
106
160
|
}
|
|
107
161
|
}
|
|
108
162
|
class ComputedImpl {
|
|
@@ -114,12 +168,19 @@ class ComputedImpl {
|
|
|
114
168
|
sources = new Set();
|
|
115
169
|
computing = false;
|
|
116
170
|
error = NO_COMPUTED_ERROR;
|
|
171
|
+
/**
|
|
172
|
+
* globalEpoch snapshot at the end of the last update()/validation pass.
|
|
173
|
+
* A MaybeDirty computed recomputes only if some source's lastChanged
|
|
174
|
+
* advanced past this — otherwise it revalidates to Clean for free.
|
|
175
|
+
*/
|
|
176
|
+
lastValidated = 0;
|
|
117
177
|
constructor(fn) {
|
|
118
178
|
this.compute = fn;
|
|
119
179
|
this._node = {
|
|
120
180
|
value: undefined,
|
|
121
181
|
lastChanged: 0,
|
|
122
182
|
observers: new Set(),
|
|
183
|
+
pull: () => { this.peek(); },
|
|
123
184
|
};
|
|
124
185
|
}
|
|
125
186
|
get value() {
|
|
@@ -131,7 +192,7 @@ class ComputedImpl {
|
|
|
131
192
|
activeObserver.sources.add(this._node);
|
|
132
193
|
this._node.observers.add(activeObserver);
|
|
133
194
|
}
|
|
134
|
-
// Pull: recalculate if dirty
|
|
195
|
+
// Pull: recalculate if (maybe) dirty
|
|
135
196
|
if (this.state !== NodeState.Clean) {
|
|
136
197
|
this.update();
|
|
137
198
|
}
|
|
@@ -140,7 +201,47 @@ class ComputedImpl {
|
|
|
140
201
|
}
|
|
141
202
|
return this._node.value;
|
|
142
203
|
}
|
|
204
|
+
peek() {
|
|
205
|
+
if (this.computing) {
|
|
206
|
+
throw new Error('Circular dependency detected in computed()');
|
|
207
|
+
}
|
|
208
|
+
// Same pull as `get value`, minus dependency registration.
|
|
209
|
+
if (this.state !== NodeState.Clean) {
|
|
210
|
+
this.update();
|
|
211
|
+
}
|
|
212
|
+
if (this.error !== NO_COMPUTED_ERROR) {
|
|
213
|
+
throw this.error;
|
|
214
|
+
}
|
|
215
|
+
return this._node.value;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* MaybeDirty validation: pull each source (computeds recompute lazily) and
|
|
219
|
+
* report whether any source's change-epoch advanced past our last
|
|
220
|
+
* validation. A pulled source may throw — its error-state transition
|
|
221
|
+
* already bumped its change-epoch, so the epoch comparison decides.
|
|
222
|
+
*/
|
|
223
|
+
sourcesChanged() {
|
|
224
|
+
for (const source of this.sources) {
|
|
225
|
+
if ('pull' in source) {
|
|
226
|
+
try {
|
|
227
|
+
source.pull();
|
|
228
|
+
}
|
|
229
|
+
catch (_) { /* transition bumped lastChanged */ }
|
|
230
|
+
}
|
|
231
|
+
if (source.lastChanged > this.lastValidated)
|
|
232
|
+
return true;
|
|
233
|
+
}
|
|
234
|
+
return false;
|
|
235
|
+
}
|
|
143
236
|
update() {
|
|
237
|
+
// MaybeDirty means "an upstream computed MAY have changed". Validate
|
|
238
|
+
// first: if no polled source advanced, revalidate to Clean without
|
|
239
|
+
// recomputing (the half of push-pull that was previously unimplemented).
|
|
240
|
+
if (this.state === NodeState.MaybeDirty && !this.sourcesChanged()) {
|
|
241
|
+
this.state = NodeState.Clean;
|
|
242
|
+
this.lastValidated = globalEpoch;
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
144
245
|
// Unsubscribe from previous sources (for dynamic dependency tracking)
|
|
145
246
|
for (const source of this.sources) {
|
|
146
247
|
source.observers.delete(this);
|
|
@@ -150,6 +251,7 @@ class ComputedImpl {
|
|
|
150
251
|
const prevObserver = activeObserver;
|
|
151
252
|
activeObserver = this;
|
|
152
253
|
this.computing = true;
|
|
254
|
+
const wasError = this.error !== NO_COMPUTED_ERROR;
|
|
153
255
|
try {
|
|
154
256
|
const newValue = this.compute();
|
|
155
257
|
this.error = NO_COMPUTED_ERROR;
|
|
@@ -163,9 +265,21 @@ class ComputedImpl {
|
|
|
163
265
|
// re-schedule the very effect performing this read — a spurious
|
|
164
266
|
// double-run that only surfaced once flush() began draining cascades.
|
|
165
267
|
}
|
|
268
|
+
else if (wasError) {
|
|
269
|
+
// Error-state TRANSITION (exit) recovering to an EQUAL value: the
|
|
270
|
+
// epoch must still advance, or downstream effects would skip the
|
|
271
|
+
// recovery in their pre-run poll (ADR 0030.2 §8 T5 error rule).
|
|
272
|
+
this._node.lastChanged = ++globalEpoch;
|
|
273
|
+
}
|
|
166
274
|
}
|
|
167
275
|
catch (error) {
|
|
168
276
|
this.error = error;
|
|
277
|
+
if (!wasError) {
|
|
278
|
+
// Error-state TRANSITION (enter) counts as a change: polls must see
|
|
279
|
+
// the epoch advance so the effect re-runs and its own read rethrows
|
|
280
|
+
// into the effect's containment (issue 0003 semantics).
|
|
281
|
+
this._node.lastChanged = ++globalEpoch;
|
|
282
|
+
}
|
|
169
283
|
throw error;
|
|
170
284
|
}
|
|
171
285
|
finally {
|
|
@@ -175,15 +289,22 @@ class ComputedImpl {
|
|
|
175
289
|
// notify(): the next dependency write then marks it dirty and propagates
|
|
176
290
|
// to downstream observers so the computation can recover (issue 0003).
|
|
177
291
|
this.state = NodeState.Clean;
|
|
292
|
+
this.lastValidated = globalEpoch;
|
|
178
293
|
}
|
|
179
294
|
}
|
|
180
295
|
/** @internal — called by the ReactiveNode interface when a source changes */
|
|
181
|
-
notify() {
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
296
|
+
notify(flavor) {
|
|
297
|
+
// Never downgrade: a Dirty mark (definite signal change) survives a
|
|
298
|
+
// later MaybeDirty from a parallel computed path.
|
|
299
|
+
if (flavor > this.state) {
|
|
300
|
+
const wasClean = this.state === NodeState.Clean;
|
|
301
|
+
this.state = flavor;
|
|
302
|
+
// Propagate once per dirty episode. Downstream observers always get
|
|
303
|
+
// MaybeDirty — through a computed, "changed" is only knowable after a
|
|
304
|
+
// recompute, which stays lazy (pull-based).
|
|
305
|
+
if (wasClean) {
|
|
306
|
+
notifyObservers(this._node.observers, NodeState.MaybeDirty);
|
|
307
|
+
}
|
|
187
308
|
}
|
|
188
309
|
}
|
|
189
310
|
subscribe(fn) {
|
|
@@ -201,29 +322,18 @@ class ComputedImpl {
|
|
|
201
322
|
Object.defineProperty(ComputedImpl.prototype, 'sources', {
|
|
202
323
|
enumerable: false,
|
|
203
324
|
});
|
|
204
|
-
// Bridge ComputedImpl to ReactiveNode — the observer interface.
|
|
205
|
-
// We cast in notify() above; here we make the computed usable as a ReactiveNode
|
|
206
|
-
// by defining the properties the tracker expects.
|
|
207
|
-
const computedAsReactiveNode = (c) => ({
|
|
208
|
-
get state() { return c['state']; },
|
|
209
|
-
set state(v) { c['state'] = v; },
|
|
210
|
-
get sources() { return c['sources']; },
|
|
211
|
-
notify: () => c.notify(),
|
|
212
|
-
});
|
|
213
325
|
// ── Effect (side-effect, auto-tracks, auto-disposes) ────────────────
|
|
214
326
|
/**
|
|
215
|
-
* Maximum
|
|
216
|
-
* An effect that writes to a signal it reads
|
|
217
|
-
*
|
|
218
|
-
*
|
|
327
|
+
* Maximum CONSECUTIVE self-re-schedules before we assume an infinite loop.
|
|
328
|
+
* An effect that writes to a signal it reads re-schedules itself on every
|
|
329
|
+
* run; when that happens MAX_EFFECT_RERUNS times in a row (the counter
|
|
330
|
+
* resets whenever a run does NOT re-schedule the effect), the effect is
|
|
331
|
+
* diagnosed (N301) and disposed. Clock-free — deterministic under CI and
|
|
332
|
+
* fake timers, and convergent clamps pass because their second run writes
|
|
333
|
+
* an equal value (Object.is cutoff → no re-schedule → counter reset).
|
|
334
|
+
* See ADR 0008 Gap 2 / ADR 0009 / ADR 0030.2 T5.
|
|
219
335
|
*/
|
|
220
336
|
const MAX_EFFECT_RERUNS = 100;
|
|
221
|
-
/**
|
|
222
|
-
* Time window (ms) for counting consecutive re-runs.
|
|
223
|
-
* If an effect runs MAX_EFFECT_RERUNS times within this window, it's a loop.
|
|
224
|
-
* Resets when the effect hasn't been re-triggered for longer than this window.
|
|
225
|
-
*/
|
|
226
|
-
const LOOP_WINDOW_MS = 2000;
|
|
227
337
|
function createEffectNode(fn) {
|
|
228
338
|
return {
|
|
229
339
|
state: NodeState.Dirty,
|
|
@@ -232,41 +342,55 @@ function createEffectNode(fn) {
|
|
|
232
342
|
disposed: false,
|
|
233
343
|
sources: new Set(),
|
|
234
344
|
disposers: [],
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
345
|
+
order: nextEffectOrder++,
|
|
346
|
+
lastRunEpoch: 0,
|
|
347
|
+
selfReschedules: 0,
|
|
348
|
+
notify(flavor) {
|
|
238
349
|
if (this.disposed)
|
|
239
350
|
return;
|
|
240
|
-
|
|
351
|
+
// Never downgrade Dirty (definite signal change) to MaybeDirty.
|
|
352
|
+
if (flavor > this.state)
|
|
353
|
+
this.state = flavor;
|
|
241
354
|
pendingEffects.add(this);
|
|
242
355
|
scheduleFlush();
|
|
243
356
|
},
|
|
244
357
|
};
|
|
245
358
|
}
|
|
359
|
+
/**
|
|
360
|
+
* Pre-run poll (ADR 0030.2 T5): the effect was notified MaybeDirty, meaning
|
|
361
|
+
* only computed sources MAY have changed. Pull each computed source (via the
|
|
362
|
+
* node back-pointer) so its change-epoch is fresh, then compare every
|
|
363
|
+
* source's epoch against the effect's last completed run. A pull may throw:
|
|
364
|
+
* the computed's error-state transition already bumped its epoch, so the
|
|
365
|
+
* comparison decides — a NEW error re-runs the effect (whose own read
|
|
366
|
+
* rethrows into its containment, issue 0003), while an error the effect
|
|
367
|
+
* already observed does not.
|
|
368
|
+
*/
|
|
369
|
+
function effectSourcesChanged(node) {
|
|
370
|
+
for (const source of node.sources) {
|
|
371
|
+
if ('pull' in source) {
|
|
372
|
+
try {
|
|
373
|
+
source.pull();
|
|
374
|
+
}
|
|
375
|
+
catch (_) { /* transition bumped lastChanged */ }
|
|
376
|
+
}
|
|
377
|
+
if (source.lastChanged > node.lastRunEpoch)
|
|
378
|
+
return true;
|
|
379
|
+
}
|
|
380
|
+
return false;
|
|
381
|
+
}
|
|
382
|
+
function isThenable(value) {
|
|
383
|
+
return (value !== null &&
|
|
384
|
+
typeof value === 'object' &&
|
|
385
|
+
typeof value.then === 'function');
|
|
386
|
+
}
|
|
246
387
|
function runEffect(node) {
|
|
247
388
|
if (node.disposed)
|
|
248
389
|
return;
|
|
249
|
-
//
|
|
250
|
-
//
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
if (now - node.windowStart > LOOP_WINDOW_MS) {
|
|
254
|
-
// New window — reset counter
|
|
255
|
-
node.runCount = 0;
|
|
256
|
-
node.windowStart = now;
|
|
257
|
-
}
|
|
258
|
-
node.runCount++;
|
|
259
|
-
if (node.runCount > MAX_EFFECT_RERUNS) {
|
|
260
|
-
console.error(`Effect exceeded maximum re-run limit (${MAX_EFFECT_RERUNS}). ` +
|
|
261
|
-
`This usually means the effect writes to a signal it reads. ` +
|
|
262
|
-
`The effect has been disposed to prevent a UI freeze.`);
|
|
263
|
-
node.disposed = true;
|
|
264
|
-
// Unsubscribe from all sources to stop further notifications
|
|
265
|
-
for (const source of node.sources) {
|
|
266
|
-
source.observers.delete(node);
|
|
267
|
-
}
|
|
268
|
-
node.sources.clear();
|
|
269
|
-
pendingEffects.delete(node);
|
|
390
|
+
// MaybeDirty: poll sources — skip the run when no value the effect read
|
|
391
|
+
// actually changed (equal recomputes through a computed chain stop here).
|
|
392
|
+
if (node.state === NodeState.MaybeDirty && !effectSourcesChanged(node)) {
|
|
393
|
+
node.state = NodeState.Clean;
|
|
270
394
|
return;
|
|
271
395
|
}
|
|
272
396
|
// Run cleanup from previous execution
|
|
@@ -282,14 +406,33 @@ function runEffect(node) {
|
|
|
282
406
|
source.observers.delete(node);
|
|
283
407
|
}
|
|
284
408
|
node.sources.clear();
|
|
409
|
+
// Reset state BEFORE running: a notify fired by the effect's own writes
|
|
410
|
+
// must survive into the next flush pass, not be clobbered afterwards.
|
|
411
|
+
node.state = NodeState.Clean;
|
|
285
412
|
// Run effect with tracking
|
|
286
413
|
const prevObserver = activeObserver;
|
|
414
|
+
const prevRunning = runningEffect;
|
|
287
415
|
activeObserver = node;
|
|
416
|
+
runningEffect = node;
|
|
288
417
|
try {
|
|
289
418
|
const result = node.fn();
|
|
290
419
|
if (typeof result === 'function') {
|
|
291
420
|
node.cleanup = result;
|
|
292
421
|
}
|
|
422
|
+
else if (isThenable(result)) {
|
|
423
|
+
// effect(async …) — rejected at the type level, guarded at runtime for
|
|
424
|
+
// JS callers (ADR 0030.2 §3). The Promise is NOT a cleanup; route its
|
|
425
|
+
// rejection into the effect error path so nothing goes unhandled.
|
|
426
|
+
if (!node.asyncWarned) {
|
|
427
|
+
node.asyncWarned = true;
|
|
428
|
+
diag('N310', 'effect() callback returned a Promise — effects must be synchronous. ' +
|
|
429
|
+
'Async state belongs in resource(). The returned Promise is not a ' +
|
|
430
|
+
'cleanup function; its rejection is contained by the effect error path.', node.createdAt ? { effect: node.createdAt } : undefined);
|
|
431
|
+
}
|
|
432
|
+
result.then(undefined, (err) => {
|
|
433
|
+
console.error('Effect error:', err);
|
|
434
|
+
});
|
|
435
|
+
}
|
|
293
436
|
}
|
|
294
437
|
catch (err) {
|
|
295
438
|
// Effect errors: log but don't crash the system.
|
|
@@ -298,8 +441,30 @@ function runEffect(node) {
|
|
|
298
441
|
}
|
|
299
442
|
finally {
|
|
300
443
|
activeObserver = prevObserver;
|
|
444
|
+
runningEffect = prevRunning;
|
|
445
|
+
// Everything observable up to now — including epochs bumped by this
|
|
446
|
+
// run's own lazy computed pulls — counts as SEEN by this run.
|
|
447
|
+
node.lastRunEpoch = globalEpoch;
|
|
448
|
+
}
|
|
449
|
+
// Clock-free loop guard: this run re-scheduled the effect iff the effect
|
|
450
|
+
// is back in the pending set (only its own writes can do that mid-run).
|
|
451
|
+
if (pendingEffects.has(node)) {
|
|
452
|
+
if (++node.selfReschedules > MAX_EFFECT_RERUNS) {
|
|
453
|
+
diag('N301', `Effect exceeded maximum re-run limit (${MAX_EFFECT_RERUNS}). ` +
|
|
454
|
+
`This usually means the effect writes to a signal it reads. ` +
|
|
455
|
+
`The effect has been disposed to prevent a UI freeze.`, node.createdAt ? { effect: node.createdAt } : undefined);
|
|
456
|
+
// Dispose as today: unsubscribe everywhere and drop from the queue.
|
|
457
|
+
node.disposed = true;
|
|
458
|
+
for (const source of node.sources) {
|
|
459
|
+
source.observers.delete(node);
|
|
460
|
+
}
|
|
461
|
+
node.sources.clear();
|
|
462
|
+
pendingEffects.delete(node);
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
else {
|
|
466
|
+
node.selfReschedules = 0;
|
|
301
467
|
}
|
|
302
|
-
node.state = NodeState.Clean;
|
|
303
468
|
}
|
|
304
469
|
// ── Public API ──────────────────────────────────────────────────────
|
|
305
470
|
/**
|
|
@@ -309,6 +474,7 @@ function runEffect(node) {
|
|
|
309
474
|
* const count = signal(0);
|
|
310
475
|
* count.value; // read (auto-tracks in reactive contexts)
|
|
311
476
|
* count.value = 5; // write (notifies dependents)
|
|
477
|
+
* count.peek(); // read WITHOUT tracking
|
|
312
478
|
* ```
|
|
313
479
|
*/
|
|
314
480
|
export function signal(initialValue) {
|
|
@@ -331,7 +497,9 @@ export function computed(fn) {
|
|
|
331
497
|
* Returns a dispose function to stop the effect.
|
|
332
498
|
*
|
|
333
499
|
* The effect function may return a cleanup callback that runs
|
|
334
|
-
* before each re-execution and on disposal.
|
|
500
|
+
* before each re-execution and on disposal. It must be SYNCHRONOUS —
|
|
501
|
+
* async functions are rejected at the type level and diagnosed at
|
|
502
|
+
* runtime (N310); async state belongs in resource().
|
|
335
503
|
*
|
|
336
504
|
* ```ts
|
|
337
505
|
* const dispose = effect(() => {
|
|
@@ -343,8 +511,12 @@ export function computed(fn) {
|
|
|
343
511
|
* dispose(); // stop the effect
|
|
344
512
|
* ```
|
|
345
513
|
*/
|
|
346
|
-
export function effect(fn) {
|
|
514
|
+
export function effect(fn, ..._rejectAsync) {
|
|
347
515
|
const node = createEffectNode(fn);
|
|
516
|
+
if (isDev()) {
|
|
517
|
+
// Dev-captured effect identity: N301/N302 diagnostics name this site.
|
|
518
|
+
node.createdAt = new Error('effect() created here').stack;
|
|
519
|
+
}
|
|
348
520
|
// Run immediately to establish initial dependencies
|
|
349
521
|
runEffect(node);
|
|
350
522
|
const dispose = () => {
|
|
@@ -371,7 +543,7 @@ export function effect(fn) {
|
|
|
371
543
|
addDisposer(dispose);
|
|
372
544
|
}
|
|
373
545
|
}
|
|
374
|
-
return dispose;
|
|
546
|
+
return disposable(dispose, dispose);
|
|
375
547
|
}
|
|
376
548
|
/**
|
|
377
549
|
* Check if a value is a signal (writable or computed).
|
|
@@ -385,7 +557,8 @@ export function isSignal(value) {
|
|
|
385
557
|
// ── Observer isolation ───────────────────────────────────────────────
|
|
386
558
|
/**
|
|
387
559
|
* Run a function with activeObserver set to null, preventing any
|
|
388
|
-
* signal reads inside `fn` from being tracked by an outer effect
|
|
560
|
+
* signal reads inside `fn` from being tracked by an outer effect,
|
|
561
|
+
* and return the function's result.
|
|
389
562
|
*
|
|
390
563
|
* Used by component.ts to isolate connectedCallback: child component
|
|
391
564
|
* setup signal reads must not leak into a parent effect's dependency
|
|
@@ -395,7 +568,7 @@ export function untrack(fn) {
|
|
|
395
568
|
const prev = activeObserver;
|
|
396
569
|
activeObserver = null;
|
|
397
570
|
try {
|
|
398
|
-
fn();
|
|
571
|
+
return fn();
|
|
399
572
|
}
|
|
400
573
|
finally {
|
|
401
574
|
activeObserver = prev;
|
|
@@ -419,8 +592,12 @@ export function flush() {
|
|
|
419
592
|
let guard = 0;
|
|
420
593
|
while (pendingEffects.size > 0) {
|
|
421
594
|
flushPendingEffects();
|
|
422
|
-
if (++guard > 100000)
|
|
595
|
+
if (++guard > 100000) {
|
|
596
|
+
diag('N303', 'flush() cascade cap reached (100000 passes) — effects keep ' +
|
|
597
|
+
'scheduling more effects (a cross-effect write cycle?). Breaking out ' +
|
|
598
|
+
'to avoid a freeze; pending work remains unflushed.');
|
|
423
599
|
break;
|
|
600
|
+
}
|
|
424
601
|
}
|
|
425
602
|
}
|
|
426
603
|
/** Backward compat alias for tests. */
|
|
@@ -436,7 +613,7 @@ export { flush as flushEffects };
|
|
|
436
613
|
* TASKS scheduled by that microtask work (e.g. a microtask calling
|
|
437
614
|
* setTimeout) may fire after tick() resolves; awaiting arbitrary future
|
|
438
615
|
* tasks is unbounded. Self-perpetuating schedulers are cut off at the
|
|
439
|
-
* iteration cap.
|
|
616
|
+
* iteration cap (loudly — N303).
|
|
440
617
|
*
|
|
441
618
|
* ```ts
|
|
442
619
|
* host.setProp('x', 1);
|
|
@@ -461,5 +638,8 @@ export async function tick() {
|
|
|
461
638
|
return; // the microtask drain scheduled nothing
|
|
462
639
|
flush();
|
|
463
640
|
}
|
|
641
|
+
diag('N303', 'tick() iteration cap (50) reached with effects still pending — ' +
|
|
642
|
+
'something keeps scheduling reactive work every task (a ' +
|
|
643
|
+
'self-perpetuating scheduler?). Returning with work still queued.');
|
|
464
644
|
}
|
|
465
645
|
//# sourceMappingURL=signal.js.map
|
package/dist/signal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signal.js","sourceRoot":"","sources":["../src/signal.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"signal.js","sourceRoot":"","sources":["../src/signal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* template-audit.ts — First-parse static template audit (ADR 0030.2 T4).
|
|
3
|
+
*
|
|
4
|
+
* Attached to the parse-once cache in template.ts: runs ONCE per `html`
|
|
5
|
+
* callsite (keyed by TemplateStringsArray identity) at the first parse, and
|
|
6
|
+
* walks the parsed-but-never-mounted template element checking its STATIC
|
|
7
|
+
* parts. The silent-static-typo class — the no-build equivalent of a compile
|
|
8
|
+
* error — dies in the engine, amortized free.
|
|
9
|
+
*
|
|
10
|
+
* Checks (per ADR 0030.2 §2 T4 as amended by §8 "T4 (template)"):
|
|
11
|
+
* - N101 — a dash-tag with no customElements definition. Races
|
|
12
|
+
* `customElements.whenDefined` against a microtask + macrotask grace so
|
|
13
|
+
* ordinary lazy definition (module import order) never warns.
|
|
14
|
+
* - N102 — an `@event` name that is neither a known native event nor an
|
|
15
|
+
* allowlisted component-dispatched event (`ui-*`, `nisli-*`).
|
|
16
|
+
* - N103 — an unknown `@event.modifier`.
|
|
17
|
+
* - N104 — an attribute on a component tag that declares attributes
|
|
18
|
+
* (non-empty `static observedAttributes`) which is neither declared nor a
|
|
19
|
+
* global HTML attribute. Components WITHOUT declared attributes get NO
|
|
20
|
+
* attribute audit: pre-schema (T3) there is no truth source — auto-resolved
|
|
21
|
+
* props are deliberately not attributes (§8).
|
|
22
|
+
*
|
|
23
|
+
* Suppression escape (designed for lazy islands, §8): a comment directive as
|
|
24
|
+
* the template's FIRST node (leading whitespace allowed):
|
|
25
|
+
*
|
|
26
|
+
* html`<!-- nisli-audit off --><my-island>…</my-island>`
|
|
27
|
+
* — disables the whole audit for this template.
|
|
28
|
+
*
|
|
29
|
+
* html`<!-- nisli-audit allow-undefined: my-island other-tag --><…>`
|
|
30
|
+
* — suppresses only N101 for the named tags (other checks stay live).
|
|
31
|
+
*
|
|
32
|
+
* The directive comment is static content: it survives into the mounted DOM
|
|
33
|
+
* (and SSG output) as an inert HTML comment. Documented, accepted for the
|
|
34
|
+
* prototype; the design gate may choose to strip it at parse.
|
|
35
|
+
*
|
|
36
|
+
* Dev gating: core has no build-time dev/prod define today — that mechanism
|
|
37
|
+
* is a named Wave-1 deliverable (§8). Until it exists this module is gated on
|
|
38
|
+
* the `devMode` flag below ONLY. SSG/happy-dom detection is deliberately NOT
|
|
39
|
+
* attempted (unreliable); an SSG build that wants silence must call
|
|
40
|
+
* `setTemplateAuditEnabled(false)` before rendering.
|
|
41
|
+
*/
|
|
42
|
+
/**
|
|
43
|
+
* Enable/disable the first-parse audit (and its callsite capture);
|
|
44
|
+
* `null` restores the dev-gate default.
|
|
45
|
+
*/
|
|
46
|
+
export declare function setTemplateAuditEnabled(enabled: boolean | null): void;
|
|
47
|
+
/** Current audit gate state (exposed for template.ts and tests). */
|
|
48
|
+
export declare function isTemplateAuditEnabled(): boolean;
|
|
49
|
+
/** Emit a coded audit diagnostic through the diagnostics leaf (audit-gated). */
|
|
50
|
+
export declare function diag(code: string, message: string, detail?: unknown): void;
|
|
51
|
+
/**
|
|
52
|
+
* Remember the authoring callsite of an `html` template the first time its
|
|
53
|
+
* strings identity is seen. Must be called from `html()` itself — by the
|
|
54
|
+
* time the first parse happens (first mount), the authoring frame is gone
|
|
55
|
+
* from the stack. No-op when the audit is disabled or already captured.
|
|
56
|
+
*/
|
|
57
|
+
export declare function captureCallsite(strings: TemplateStringsArray): void;
|
|
58
|
+
/**
|
|
59
|
+
* Run the one-time static audit over a freshly parsed template. Called by
|
|
60
|
+
* template.ts's parse-once cache on cache miss; idempotent per template
|
|
61
|
+
* identity, no-op when the audit is disabled. Read-only over the cached
|
|
62
|
+
* template element — mounting state is never touched.
|
|
63
|
+
*/
|
|
64
|
+
export declare function auditTemplate(strings: TemplateStringsArray, template: HTMLTemplateElement): void;
|