@nisli/core 0.54.1 → 0.55.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.
Files changed (47) hide show
  1. package/README.md +93 -3
  2. package/dist/component.js +146 -5
  3. package/dist/component.js.map +1 -1
  4. package/dist/diagnostics.d.ts +48 -0
  5. package/dist/diagnostics.js +118 -0
  6. package/dist/diagnostics.js.map +1 -0
  7. package/dist/disposable.d.ts +14 -0
  8. package/dist/disposable.js +8 -0
  9. package/dist/disposable.js.map +1 -0
  10. package/dist/emitter.d.ts +2 -1
  11. package/dist/emitter.js +2 -1
  12. package/dist/emitter.js.map +1 -1
  13. package/dist/hmr/registry.js +8 -1
  14. package/dist/hmr/registry.js.map +1 -1
  15. package/dist/index.d.ts +5 -3
  16. package/dist/index.js +6 -2
  17. package/dist/index.js.map +1 -1
  18. package/dist/injector.d.ts +9 -2
  19. package/dist/injector.js +18 -0
  20. package/dist/injector.js.map +1 -1
  21. package/dist/lifecycle.d.ts +9 -0
  22. package/dist/lifecycle.js +17 -7
  23. package/dist/lifecycle.js.map +1 -1
  24. package/dist/projection.js +24 -5
  25. package/dist/projection.js.map +1 -1
  26. package/dist/query.d.ts +134 -55
  27. package/dist/query.js +379 -188
  28. package/dist/query.js.map +1 -1
  29. package/dist/resource.d.ts +2 -1
  30. package/dist/resource.js +21 -4
  31. package/dist/resource.js.map +1 -1
  32. package/dist/settle.d.ts +61 -0
  33. package/dist/settle.js +106 -0
  34. package/dist/settle.js.map +1 -0
  35. package/dist/signal.d.ts +42 -7
  36. package/dist/signal.js +248 -68
  37. package/dist/signal.js.map +1 -1
  38. package/dist/template-audit.d.ts +64 -0
  39. package/dist/template-audit.js +246 -0
  40. package/dist/template-audit.js.map +1 -0
  41. package/dist/template.d.ts +70 -1
  42. package/dist/template.js +322 -65
  43. package/dist/template.js.map +1 -1
  44. package/dist/view-transition.d.ts +70 -0
  45. package/dist/view-transition.js +98 -0
  46. package/dist/view-transition.js.map +1 -0
  47. 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 "dirty" flags up the dependency graph
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
- * Global epoch counter. Incremented on every signal write.
35
- * Used to determine if a computed needs recalculation: if a dependency's
36
- * lastChanged > this computed's lastChecked, the computed is stale.
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
- const effects = [...pendingEffects];
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
- if (this.state === NodeState.Clean) {
183
- this.state = NodeState.Dirty;
184
- // Propagate dirty flags to downstream observers
185
- // (they need to re-check if this computed's value actually changed)
186
- notifyObservers(this._node.observers);
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 consecutive re-runs within a time window before we assume an infinite loop.
216
- * An effect that writes to a signal it reads will re-trigger itself
217
- * on every flush. This guard prevents silent UI freezes.
218
- * See ADR 0008 Gap 2 / ADR 0009.
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
- runCount: 0,
236
- windowStart: 0,
237
- notify() {
345
+ order: nextEffectOrder++,
346
+ lastRunEpoch: 0,
347
+ selfReschedules: 0,
348
+ notify(flavor) {
238
349
  if (this.disposed)
239
350
  return;
240
- this.state = NodeState.Dirty;
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
- // Loop detection: count consecutive re-runs within a time window.
250
- // If the effect runs MAX_EFFECT_RERUNS times within LOOP_WINDOW_MS,
251
- // it's almost certainly a write-to-own-dependency loop. Dispose it.
252
- const now = Date.now();
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
@@ -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;