@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/query.js CHANGED
@@ -1,238 +1,429 @@
1
1
  /**
2
- * query.ts — Declarative async data loading with cache
2
+ * query.ts — Keyed logical-request store (ADR 0030.2 T1).
3
3
  *
4
- * `query()` absorbs the loading/error/cache/refetch boilerplate that
5
- * every data-fetching component would otherwise write manually.
6
- *
7
- * Inspired by TanStack Query / React Query, but built on signals.
4
+ * The cache unit is a per-key RECORD living in `QueryClient`:
5
+ * `{data, error, status, fetchedAt}` as signals, plus exactly one `run()`
6
+ * owning the retry loop, a per-run `AbortController` handed to the fetcher,
7
+ * and the cache commit. `query()` is a thin OBSERVER: an effect keeps it
8
+ * registered on the record its current key points at, and its outputs are
9
+ * `computed()` views over that record. Dedup unit = logical request, by
10
+ * construction (issues 0005–0009 close as a class).
8
11
  *
9
12
  * ```ts
10
13
  * const tasks = query(
11
14
  * () => ['tasks', scopeId.value],
12
- * () => api.getTasks(scopeId.value),
15
+ * (signal) => api.getTasks(scopeId.value, { signal }),
13
16
  * );
14
- * tasks.data // Signal<Task[] | undefined>
15
- * tasks.loading // Signal<boolean>
16
- * tasks.error // Signal<Error | null>
17
- * tasks.refetch() // manual refetch
17
+ * tasks.data // ReadonlySignal<Task[] | undefined>
18
+ * tasks.loading // ReadonlySignal<boolean>
19
+ * tasks.error // ReadonlySignal<Error | null>
20
+ * tasks.status // ReadonlySignal<'idle' | 'loading' | 'success' | 'error'>
21
+ * tasks.refetch() // force a refetch (joins an in-flight run)
22
+ * tasks.dispose() // standalone callers; component setup auto-disposes
18
23
  * ```
24
+ *
25
+ * Ownership rules (ADR 0030.2 §8, binding):
26
+ * - The most-recently-mounted enabled observer's fetcher/options own the
27
+ * next run for a shared key; `staleTime` freshness is per-observer POLICY
28
+ * (it decides whether *that* observer triggers a run), while the record
29
+ * state is shared truth.
30
+ * - `invalidate()` marks records stale and reruns only records with ≥1
31
+ * enabled observer; disabled observers revalidate on re-enable.
32
+ * - A zero-observer record's in-flight run completes and commits.
33
+ * - Records are NEVER garbage-collected: the cache is unbounded for the
34
+ * life of the client (restates today's unbounded-cache bound). Bound it
35
+ * operationally with `clear()` or a fresh client per app lifetime.
36
+ *
37
+ * Key contract: keys are FLAT — `readonly (string|number|boolean|null)[]`.
38
+ * Objects and `undefined` are rejected with coded error N602 (`null` is
39
+ * the optional sentinel). Flat keys are order-sensitive: prefer
40
+ * per-endpoint key-builder helpers — a reordered key is a silent cache
41
+ * *miss*, benign relative to a collision, but a miss.
42
+ *
43
+ * SSG stance (documented, not built): under core-render, records fetch
44
+ * into the build-lifetime client and must TERMINATE before snapshot —
45
+ * `await settle()` is the barrier. Otherwise queries must be statically
46
+ * disabled for the build.
19
47
  */
20
- import { signal, effect, computed } from './signal.js';
48
+ import { signal, effect, computed, untrack, } from './signal.js';
21
49
  import { hasContext, getCurrentComponent } from './context.js';
50
+ import { disposable } from './disposable.js';
22
51
  import { inject } from './injector.js';
52
+ import { __enrollPending } from './settle.js';
53
+ import { formatDiag } from './diagnostics.js';
54
+ // Diagnostics go through the core leaf (diagnostics.ts). Codes N602–N603
55
+ // belong to the query/async cluster (N601 retired before release — see
56
+ // the eliminated-class note below).
57
+ /** Build the coded error for key-contract violations. Always thrown —
58
+ * key validity is a contract, not an advisory diagnostic. */
59
+ function keyError(detail) {
60
+ return new Error(formatDiag('N602', `invalid query key: ${detail}. Keys must be flat `
61
+ + 'readonly (string | number | boolean | null)[] arrays — spread '
62
+ + 'object params into tuple elements; null is the optional sentinel.'));
63
+ }
23
64
  /**
24
- * Global query cache. Managed as an auto-singleton via inject().
25
- * Components use query() which accesses the client internally.
65
+ * Validate a key against the flat contract and return a detached copy
66
+ * (callers may mutate their array; records must not observe that).
67
+ * Rejects objects, arrays, functions, undefined, and non-finite numbers
68
+ * (NaN/Infinity JSON-serialize as null and would collide) with N602.
26
69
  */
27
- export class QueryClient {
28
- cache = new Map();
29
- inFlight = new Map();
30
- /** Check if a cache entry is fresh */
31
- isFresh(key, staleTime) {
32
- const entry = this.cache.get(key);
33
- if (!entry)
34
- return false;
35
- return Date.now() - entry.fetchedAt < staleTime;
70
+ function validateKey(raw) {
71
+ if (!Array.isArray(raw)) {
72
+ throw keyError(`expected an array, got ${typeof raw}`);
36
73
  }
37
- /** Get cached data */
38
- getCached(key) {
39
- return this.cache.get(key)?.data;
74
+ for (let i = 0; i < raw.length; i++) {
75
+ const el = raw[i];
76
+ if (el === null)
77
+ continue;
78
+ const t = typeof el;
79
+ if (t === 'string' || t === 'boolean')
80
+ continue;
81
+ if (t === 'number') {
82
+ if (Number.isFinite(el))
83
+ continue;
84
+ throw keyError(`non-finite number at index ${i} (would collide with null)`);
85
+ }
86
+ if (el === undefined) {
87
+ throw keyError(`undefined at index ${i}`);
88
+ }
89
+ throw keyError(`${t} at index ${i}`);
40
90
  }
41
- /** Store data in cache */
42
- set(key, data, staleTime) {
43
- this.cache.set(key, { data, fetchedAt: Date.now(), staleTime });
91
+ return raw.slice();
92
+ }
93
+ /** THE one serializer: JSON.stringify of the validated flat array. */
94
+ function serializeKey(key) {
95
+ return JSON.stringify(key);
96
+ }
97
+ /** Element-wise prefix match over validated keys (=== is sound: elements
98
+ * are primitives and NaN is rejected by the contract). */
99
+ function matchesPrefix(key, prefix) {
100
+ if (prefix.length > key.length)
101
+ return false;
102
+ for (let i = 0; i < prefix.length; i++) {
103
+ if (key[i] !== prefix[i])
104
+ return false;
44
105
  }
45
- /** Get in-flight promise for deduplication */
46
- getInFlight(key) {
47
- return this.inFlight.get(key);
106
+ return true;
107
+ }
108
+ /** Monotonic mount counter — "most recently mounted" is decided by
109
+ * query() construction order, not re-registration order. */
110
+ let nextMountIndex = 0;
111
+ /** Read a record signal without tracking it into the ambient observer —
112
+ * the observer effect must depend on keys/enabled/version ONLY, never on
113
+ * record state (that is what keeps refetch loops unrepresentable). */
114
+ function peek(s) {
115
+ let v;
116
+ untrack(() => { v = s.value; });
117
+ return v;
118
+ }
119
+ function toError(cause) {
120
+ if (cause instanceof Error)
121
+ return cause;
122
+ try {
123
+ return new Error(String(cause));
48
124
  }
49
- /** Register an in-flight request */
50
- setInFlight(key, promise) {
51
- // Attach a catch handler to prevent unhandled rejection on the stored promise.
52
- // Callers who await this promise get the original behavior from their own try/catch.
53
- const handled = promise.catch(() => { });
54
- this.inFlight.set(key, promise);
55
- // Clean up when done
56
- handled.finally(() => {
57
- if (this.inFlight.get(key) === promise) {
58
- this.inFlight.delete(key);
59
- }
60
- });
125
+ catch {
126
+ return new Error('Unknown error');
61
127
  }
128
+ }
129
+ /**
130
+ * Global keyed logical-request store. One per app: resolved via
131
+ * `inject(QueryClient)` (auto-singleton; override with
132
+ * `provide(QueryClient, ...)` BEFORE the first query() call).
133
+ *
134
+ * Records are never GC'd — see the module doc for the bound.
135
+ */
136
+ export class QueryClient {
137
+ /** @internal */ _records = new Map();
138
+ /** @internal clear() bumps this; observer effects track it and re-resolve. */
139
+ _version = signal(0);
140
+ /** @internal live observer count (N601 mixed-client diagnostic). */
141
+ _observers = 0;
62
142
  /**
63
- * Invalidate cached entries whose key array starts with the given prefix elements.
64
- * Returns the number of entries invalidated.
143
+ * Mark records matching the key prefix stale and rerun those with ≥1
144
+ * enabled observer (using the owning observer's fetcher/options).
145
+ * Disabled observers revalidate on re-enable; a record with only
146
+ * disabled/no observers stays stale until one arrives. Returns the
147
+ * number of records invalidated.
65
148
  *
66
- * invalidate(['tasks']) matches ['tasks'], ['tasks', '1'], ['tasks', '2', 'x']
149
+ * invalidate(['tasks']) matches ['tasks'], ['tasks', '1'], ['tasks', '2', 'x'].
67
150
  */
68
151
  invalidate(keyPrefix) {
152
+ const prefix = validateKey(keyPrefix);
69
153
  let count = 0;
70
- for (const [serialized] of this.cache) {
71
- try {
72
- const key = JSON.parse(serialized);
73
- if (Array.isArray(key) && keyPrefix.every((v, i) => JSON.stringify(v) === JSON.stringify(key[i]))) {
74
- this.cache.delete(serialized);
75
- count++;
76
- }
77
- }
78
- catch {
79
- // Skip invalid keys
80
- }
154
+ for (const rec of this._records.values()) {
155
+ if (!matchesPrefix(rec.key, prefix))
156
+ continue;
157
+ count++;
158
+ rec.stale = true;
159
+ const owner = ownerOf(rec, /* requireEnabled */ true);
160
+ if (owner)
161
+ startRun(rec, owner.fetcher, owner.retry);
81
162
  }
82
163
  return count;
83
164
  }
84
- /** Prefetch and cache data */
85
- async prefetch(key, fetcher, staleTime = 0) {
86
- const serialized = serializeKey(key);
87
- if (this.isFresh(serialized, staleTime))
88
- return;
89
- const data = await fetcher();
90
- this.set(serialized, data, staleTime);
91
- }
92
- /** Clear all cache */
165
+ /**
166
+ * Drop every record. In-flight runs are aborted (a settle() termination).
167
+ * Live observers re-resolve fresh records on the version bump — enabled
168
+ * ones revalidate immediately.
169
+ */
93
170
  clear() {
94
- this.cache.clear();
95
- this.inFlight.clear();
171
+ for (const rec of this._records.values()) {
172
+ rec.generation++;
173
+ rec.controller?.abort();
174
+ rec.terminate?.();
175
+ rec.controller = null;
176
+ rec.terminate = null;
177
+ rec.runPromise = null;
178
+ rec.running = false;
179
+ rec.observers.clear();
180
+ }
181
+ this._records.clear();
182
+ this._version.value++;
183
+ }
184
+ /**
185
+ * Imperatively warm a record. Joins an in-flight run; a fresh record
186
+ * (per the given staleTime) is a no-op. Otherwise starts a run with THE
187
+ * GIVEN fetcher — an explicit imperative is its own owner. The run
188
+ * commits even with zero observers. Resolves at run termination.
189
+ */
190
+ prefetch(key, fetcher, staleTime = 0) {
191
+ const rec = resolveRecord(this, key);
192
+ if (rec.running)
193
+ return rec.runPromise ?? Promise.resolve();
194
+ if (!rec.stale && peek(rec.status) === 'success' && staleTime > 0
195
+ && Date.now() - peek(rec.fetchedAt) < staleTime) {
196
+ return Promise.resolve();
197
+ }
198
+ return startRun(rec, fetcher, 0);
96
199
  }
97
200
  }
98
- // ── Key serialization ───────────────────────────────────────────────
99
- function serializeKey(key) {
100
- return JSON.stringify(key);
201
+ /** Get-or-create the record for a key. Validation throws N602. */
202
+ function resolveRecord(client, rawKey) {
203
+ const key = validateKey(rawKey);
204
+ const serialized = serializeKey(key);
205
+ let rec = client._records.get(serialized);
206
+ if (!rec) {
207
+ rec = {
208
+ key,
209
+ serialized,
210
+ data: signal(undefined),
211
+ error: signal(null),
212
+ status: signal('idle'),
213
+ fetchedAt: signal(0),
214
+ stale: false,
215
+ running: false,
216
+ generation: 0,
217
+ controller: null,
218
+ runPromise: null,
219
+ terminate: null,
220
+ observers: new Set(),
221
+ };
222
+ client._records.set(serialized, rec); // never deleted — documented bound
223
+ }
224
+ return rec;
101
225
  }
102
- // ── query() — the main API ──────────────────────────────────────────
226
+ /** The observer whose fetcher/options own the next run: most recently
227
+ * mounted, preferring enabled observers (a disabled observer asked not
228
+ * to fetch — its fetcher should not fire). */
229
+ function ownerOf(rec, requireEnabled = false) {
230
+ let best;
231
+ let bestDisabled;
232
+ for (const obs of rec.observers) {
233
+ if (obs.enabled) {
234
+ if (!best || obs.mountIndex > best.mountIndex)
235
+ best = obs;
236
+ }
237
+ else if (!requireEnabled) {
238
+ if (!bestDisabled || obs.mountIndex > bestDisabled.mountIndex)
239
+ bestDisabled = obs;
240
+ }
241
+ }
242
+ return best ?? bestDisabled;
243
+ }
244
+ /** Does this record need a run, per THIS observer's freshness policy?
245
+ * Called only on real transitions (registration, re-enable, clear());
246
+ * record reads are untracked, so commits never re-trigger observers. */
247
+ function needsRun(rec, observer) {
248
+ if (rec.running)
249
+ return false; // join the in-flight logical request
250
+ if (rec.stale)
251
+ return true;
252
+ const status = peek(rec.status);
253
+ if (status === 'idle' || status === 'error')
254
+ return true;
255
+ if (observer.staleTime <= 0)
256
+ return true;
257
+ return Date.now() - peek(rec.fetchedAt) >= observer.staleTime;
258
+ }
259
+ /**
260
+ * THE run: one logical request owning the retry loop and the commit.
261
+ * Supersedes (aborts) any in-flight run for the record. Enrolls in the
262
+ * settle() registry on start and terminates it at commit, terminal error,
263
+ * or abort — never at raw promise settlement.
264
+ */
265
+ function startRun(rec, fetcher, retry) {
266
+ // Supersede: abort IS the superseded run's termination.
267
+ rec.controller?.abort();
268
+ rec.terminate?.();
269
+ const generation = ++rec.generation;
270
+ const controller = new AbortController();
271
+ const terminate = __enrollPending();
272
+ rec.controller = controller;
273
+ rec.terminate = terminate;
274
+ rec.running = true;
275
+ rec.stale = false;
276
+ rec.status.value = 'loading';
277
+ rec.error.value = null;
278
+ const run = (async () => {
279
+ try {
280
+ let lastError = null;
281
+ for (let attempt = 0; attempt <= retry; attempt++) {
282
+ if (generation !== rec.generation)
283
+ return; // superseded
284
+ try {
285
+ // The microtask hop makes a synchronous fetcher throw a normal
286
+ // rejection — it enters the same retry/terminal path (issue 0008).
287
+ const result = await Promise.resolve().then(() => fetcher(controller.signal));
288
+ if (generation !== rec.generation)
289
+ return;
290
+ rec.data.value = result;
291
+ rec.error.value = null;
292
+ rec.fetchedAt.value = Date.now();
293
+ rec.status.value = 'success';
294
+ return; // commit
295
+ }
296
+ catch (cause) {
297
+ lastError = toError(cause);
298
+ }
299
+ }
300
+ if (generation !== rec.generation)
301
+ return;
302
+ rec.error.value = lastError;
303
+ rec.status.value = 'error'; // terminal error after retries
304
+ }
305
+ finally {
306
+ if (generation === rec.generation) {
307
+ rec.running = false;
308
+ rec.controller = null;
309
+ rec.runPromise = null;
310
+ rec.terminate = null;
311
+ }
312
+ terminate(); // idempotent — superseded runs already terminated at abort
313
+ }
314
+ })();
315
+ rec.runPromise = run;
316
+ return run;
317
+ }
318
+ // ── Mixed clients: an eliminated class (formerly N601) ──────────────
319
+ // With inject() as the single resolution path, the only way two clients
320
+ // could mix was provide(QueryClient, ...) landing after queries already
321
+ // bound the auto-created singleton. The injector now throws N501 at that
322
+ // exact provide() (DI freeze, ADR 0030.2 T6), so the split-brain state is
323
+ // unrepresentable in dev and was always silent in prod — the symptom-side
324
+ // warning this block used to hold (N601) died with its cause. Retired
325
+ // before release; the code number is not reused.
326
+ // ── query() — the thin observer ─────────────────────────────────────
103
327
  /**
104
- * Declarative async data loading with caching and auto-refetch.
328
+ * Observe the record the reactive key points at.
105
329
  *
106
- * @param keyFn - Returns a cache key array. Signal reads are auto-tracked for refetch.
107
- * @param fetcher - Async function that fetches the data.
108
- * @param options - Optional configuration (staleTime, retry, enabled, etc.)
330
+ * @param keyFn - Returns the flat cache key. Signal reads are tracked; a
331
+ * key change re-registers the observer on the new record.
332
+ * @param fetcher - Fetches the data; receives the run's AbortSignal.
333
+ * @param options - staleTime / retry / enabled / initialData.
334
+ * @throws N602 synchronously when the initial key violates the contract.
109
335
  */
110
336
  export function query(keyFn, fetcher, options = {}) {
111
- const { staleTime = 0, retry = 0, enabled, initialData, onSuccess, onError, } = options;
112
- const data = signal(initialData);
113
- const loading = signal(false);
114
- const error = signal(null);
115
- // Get or lazily create the QueryClient
116
- let client;
117
- try {
118
- client = inject(QueryClient);
119
- }
120
- catch {
121
- // If no DI context, create a local client
122
- client = new QueryClient();
123
- }
124
- // Track the current fetch generation to handle race conditions
125
- let fetchGeneration = 0;
337
+ const { staleTime = 0, retry = 0, enabled, initialData } = options;
338
+ const client = inject(QueryClient);
339
+ // Surface key-contract violations at the call site: the observer effect
340
+ // is error-contained (a later reactive key going invalid is logged with
341
+ // the same coded message), so the construction-time key must be checked
342
+ // synchronously. untrack: query() may run under an ambient observer
343
+ // (component setup) and key signals must not widen its dependencies.
344
+ untrack(() => { validateKey(keyFn()); });
345
+ const observer = {
346
+ mountIndex: nextMountIndex++,
347
+ fetcher: fetcher,
348
+ staleTime,
349
+ retry,
350
+ enabled: true,
351
+ record: null,
352
+ };
353
+ client._observers++;
354
+ const recSig = signal(null);
355
+ const enabledSig = signal(true);
126
356
  let disposed = false;
127
- // `force` is set by the manual refetch() path. An explicit refetch is a
128
- // force (react-query semantics): it skips the fresh-cache short-circuit, so a
129
- // manual refetch inside the freshness window is never a silent no-op. It does
130
- // NOT skip in-flight deduplication — a same-key request already running is
131
- // joined, not duplicated — and the generation guards are unchanged. The
132
- // automatic (effect-driven) path leaves `force` false and stays cache-first.
133
- // (ADR 0025 item 12.)
134
- const doFetch = async (force = false) => {
357
+ let prevEnabled = null;
358
+ let prevVersion = -1;
359
+ // The registration effect — depends on keyFn signals, enabled() signals,
360
+ // and the client version. NEVER on record state (all record reads are
361
+ // untracked), so commits cannot re-trigger it: run starts happen only on
362
+ // the real transitions listed in needsRun()'s doc.
363
+ const stopEffect = effect(() => {
135
364
  if (disposed)
136
365
  return;
137
- // Check enabled
138
- if (enabled && !enabled())
139
- return;
366
+ const version = client._version.value;
140
367
  const key = keyFn();
141
- const serialized = serializeKey(key);
142
- const generation = ++fetchGeneration;
143
- // Check cache freshness (automatic path only — an explicit refetch forces).
144
- if (!force && staleTime > 0 && client.isFresh(serialized, staleTime)) {
145
- const cached = client.getCached(serialized);
146
- if (cached !== undefined) {
147
- data.value = cached;
148
- return;
368
+ const on = enabled ? !!enabled() : true;
369
+ const rec = resolveRecord(client, key);
370
+ observer.enabled = on;
371
+ enabledSig.value = on;
372
+ const moved = rec !== observer.record;
373
+ if (moved) {
374
+ observer.record?.observers.delete(observer);
375
+ rec.observers.add(observer);
376
+ observer.record = rec;
377
+ if (initialData !== undefined && peek(rec.status) === 'idle'
378
+ && peek(rec.data) === undefined) {
379
+ rec.data.value = initialData; // seed; not a fetch — status stays idle
149
380
  }
381
+ recSig.value = rec;
150
382
  }
151
- // Check for in-flight deduplication
152
- const existing = client.getInFlight(serialized);
153
- if (existing) {
154
- loading.value = true;
155
- try {
156
- const result = await existing;
157
- if (generation === fetchGeneration && !disposed) {
158
- data.value = result;
159
- error.value = null;
160
- }
161
- }
162
- catch (e) {
163
- if (generation === fetchGeneration && !disposed) {
164
- error.value = e instanceof Error ? e : new Error(String(e));
165
- }
166
- }
167
- finally {
168
- if (generation === fetchGeneration && !disposed) {
169
- loading.value = false;
170
- }
171
- }
172
- return;
173
- }
174
- loading.value = true;
175
- error.value = null;
176
- let lastError = null;
177
- const attempts = retry + 1;
178
- for (let attempt = 0; attempt < attempts; attempt++) {
179
- if (disposed || generation !== fetchGeneration)
180
- return;
181
- const promise = fetcher();
182
- // Prevent unhandled rejection on the shared in-flight reference
183
- promise.catch(() => { });
184
- client.setInFlight(serialized, promise);
185
- try {
186
- const result = await promise;
187
- // Guard against stale responses
188
- if (generation === fetchGeneration && !disposed) {
189
- data.value = result;
190
- error.value = null;
191
- loading.value = false;
192
- client.set(serialized, result, staleTime);
193
- onSuccess?.(result);
194
- }
195
- return; // success
196
- }
197
- catch (e) {
198
- lastError = e instanceof Error ? e : new Error(String(e));
199
- // Continue to next retry attempt
200
- }
201
- }
202
- // All retries exhausted
203
- if (generation === fetchGeneration && !disposed) {
204
- error.value = lastError;
205
- loading.value = false;
206
- if (lastError)
207
- onError?.(lastError);
383
+ const reEnabled = prevEnabled === false && on;
384
+ const versionChanged = version !== prevVersion;
385
+ prevEnabled = on;
386
+ prevVersion = version;
387
+ if (on && (moved || reEnabled || versionChanged) && needsRun(rec, observer)) {
388
+ const owner = ownerOf(rec) ?? observer;
389
+ startRun(rec, owner.fetcher, owner.retry);
208
390
  }
209
- };
210
- // Auto-fetch on mount and when dependencies change
211
- const disposeEffect = effect(() => {
212
- // Reading keyFn() inside the effect tracks signal dependencies
213
- const _key = keyFn();
214
- // Also track enabled()
215
- if (enabled)
216
- enabled();
217
- // Schedule the async fetch — catch to prevent unhandled promise rejection
218
- doFetch().catch(() => { });
219
391
  });
220
- // Register disposal if in component context
392
+ const dispose = () => {
393
+ if (disposed)
394
+ return;
395
+ disposed = true;
396
+ observer.record?.observers.delete(observer);
397
+ observer.record = null;
398
+ client._observers--;
399
+ stopEffect();
400
+ // NOTE: no abort — a zero-observer in-flight run completes and commits.
401
+ };
221
402
  if (hasContext()) {
222
- getCurrentComponent().addDisposer(() => {
223
- disposed = true;
224
- disposeEffect();
225
- });
403
+ getCurrentComponent().addDisposer(dispose);
226
404
  }
227
405
  const refetch = () => {
228
- fetchGeneration++; // invalidate any in-flight
229
- doFetch(true).catch(() => { }); // force: bypass staleTime (ADR 0025 item 12)
406
+ if (disposed)
407
+ return;
408
+ const rec = observer.record;
409
+ if (!rec || !observer.enabled)
410
+ return;
411
+ if (rec.running)
412
+ return; // join the in-flight logical request (dedup)
413
+ const owner = ownerOf(rec) ?? observer;
414
+ startRun(rec, owner.fetcher, owner.retry);
230
415
  };
231
- return {
232
- data,
233
- loading: loading,
234
- error,
416
+ const result = {
417
+ data: computed(() => {
418
+ const rec = recSig.value;
419
+ return (rec ? rec.data.value : initialData);
420
+ }),
421
+ loading: computed(() => enabledSig.value && recSig.value?.status.value === 'loading'),
422
+ error: computed(() => recSig.value?.error.value ?? null),
423
+ status: computed(() => recSig.value?.status.value ?? 'idle'),
235
424
  refetch,
425
+ dispose,
236
426
  };
427
+ return disposable(result, dispose);
237
428
  }
238
429
  //# sourceMappingURL=query.js.map
package/dist/query.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}