@kontsedal/olas-core 0.0.1-rc.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 (66) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +64 -0
  3. package/dist/index.cjs +363 -0
  4. package/dist/index.cjs.map +1 -0
  5. package/dist/index.d.cts +178 -0
  6. package/dist/index.d.cts.map +1 -0
  7. package/dist/index.d.mts +178 -0
  8. package/dist/index.d.mts.map +1 -0
  9. package/dist/index.mjs +339 -0
  10. package/dist/index.mjs.map +1 -0
  11. package/dist/root-BImHnGj1.mjs +3270 -0
  12. package/dist/root-BImHnGj1.mjs.map +1 -0
  13. package/dist/root-Bazp5_Ik.cjs +3347 -0
  14. package/dist/root-Bazp5_Ik.cjs.map +1 -0
  15. package/dist/testing.cjs +81 -0
  16. package/dist/testing.cjs.map +1 -0
  17. package/dist/testing.d.cts +56 -0
  18. package/dist/testing.d.cts.map +1 -0
  19. package/dist/testing.d.mts +56 -0
  20. package/dist/testing.d.mts.map +1 -0
  21. package/dist/testing.mjs +78 -0
  22. package/dist/testing.mjs.map +1 -0
  23. package/dist/types-CAMgqCMz.d.mts +816 -0
  24. package/dist/types-CAMgqCMz.d.mts.map +1 -0
  25. package/dist/types-emq_lZd7.d.cts +816 -0
  26. package/dist/types-emq_lZd7.d.cts.map +1 -0
  27. package/package.json +47 -0
  28. package/src/__dev__.d.ts +8 -0
  29. package/src/controller/define.ts +50 -0
  30. package/src/controller/index.ts +12 -0
  31. package/src/controller/instance.ts +499 -0
  32. package/src/controller/root.ts +160 -0
  33. package/src/controller/types.ts +195 -0
  34. package/src/devtools.ts +0 -0
  35. package/src/emitter.ts +79 -0
  36. package/src/errors.ts +49 -0
  37. package/src/forms/field.ts +303 -0
  38. package/src/forms/form-types.ts +130 -0
  39. package/src/forms/form.ts +640 -0
  40. package/src/forms/index.ts +2 -0
  41. package/src/forms/types.ts +1 -0
  42. package/src/forms/validators.ts +70 -0
  43. package/src/index.ts +89 -0
  44. package/src/query/client.ts +934 -0
  45. package/src/query/define.ts +154 -0
  46. package/src/query/entry.ts +322 -0
  47. package/src/query/focus-online.ts +73 -0
  48. package/src/query/index.ts +3 -0
  49. package/src/query/infinite.ts +462 -0
  50. package/src/query/keys.ts +33 -0
  51. package/src/query/local.ts +113 -0
  52. package/src/query/mutation.ts +384 -0
  53. package/src/query/plugin.ts +135 -0
  54. package/src/query/types.ts +168 -0
  55. package/src/query/use.ts +321 -0
  56. package/src/scope.ts +42 -0
  57. package/src/selection.ts +146 -0
  58. package/src/signals/index.ts +3 -0
  59. package/src/signals/readonly.ts +22 -0
  60. package/src/signals/runtime.ts +115 -0
  61. package/src/signals/types.ts +31 -0
  62. package/src/testing.ts +142 -0
  63. package/src/timing/debounced.ts +32 -0
  64. package/src/timing/index.ts +2 -0
  65. package/src/timing/throttled.ts +46 -0
  66. package/src/utils.ts +13 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root-BImHnGj1.mjs","names":["_signal","_computed","signal","computed","effect","_effect","batch","_batch","untracked","_untracked","signal","abortableSleep","signal","computed","abortableSleep","signal","signal","computed","effect","signal","computed","effect","effect","signal","signal","computed","internal","effect","standaloneEffect"],"sources":["../src/controller/define.ts","../src/devtools.ts","../src/errors.ts","../src/signals/runtime.ts","../src/utils.ts","../src/query/entry.ts","../src/query/focus-online.ts","../src/query/infinite.ts","../src/query/keys.ts","../src/query/plugin.ts","../src/query/client.ts","../src/emitter.ts","../src/forms/field.ts","../src/forms/form.ts","../src/query/local.ts","../src/query/mutation.ts","../src/query/use.ts","../src/controller/instance.ts","../src/controller/root.ts"],"sourcesContent":["import type { ControllerDef, Ctx } from './types'\n\ntype InternalControllerDef<Props, Api> = ControllerDef<Props, Api> & {\n readonly __factory: (ctx: Ctx, props: Props) => Api\n readonly __name?: string\n}\n\n/** Optional configuration for `defineController`. */\nexport type DefineControllerOptions = {\n /**\n * A short, human-readable name for this controller — used in the devtools\n * tree, `controller:*` events, and error contexts (e.g. `[\"root\",\"board[0]\"]`).\n *\n * When omitted, the runtime falls back to `factory.name` (the JS-inferred\n * function name) or `\"anonymous\"` for arrow-function factories defined\n * inline. Naming is strongly recommended in app code.\n */\n name?: string\n}\n\n/**\n * Create a controller definition. The factory is stored on the returned object\n * and invoked during `createRoot` / `ctx.child` to build instances.\n *\n * `Props` defaults to `void` so a factory written as `(ctx) => ...` is typed\n * as `ControllerDef<void, Api>` — the form `createRoot` requires.\n */\nexport function defineController<Props = void, Api = unknown>(\n factory: (ctx: Ctx, props: Props) => Api,\n options?: DefineControllerOptions,\n): ControllerDef<Props, Api> {\n const def: InternalControllerDef<Props, Api> = {\n __olas: 'controller',\n __factory: factory,\n ...(options?.name !== undefined ? { __name: options.name } : {}),\n } as InternalControllerDef<Props, Api>\n return def\n}\n\n/** Internal — extracts the factory from a ControllerDef. */\nexport function getFactory<Props, Api>(\n def: ControllerDef<Props, Api>,\n): (ctx: Ctx, props: Props) => Api {\n return (def as InternalControllerDef<Props, Api>).__factory\n}\n\n/** Internal — extracts the explicit `name` option from a ControllerDef, if any. */\nexport function getName<Props, Api>(def: ControllerDef<Props, Api>): string | undefined {\n return (def as InternalControllerDef<Props, Api>).__name\n}\n","/**\n * Discriminated union of devtools events emitted by a root via\n * `root.__debug.subscribe(handler)`. Spec §20.9. Adding new variants is\n * non-breaking — consumers `switch` on `type` and ignore unknowns.\n */\nexport type DebugEvent =\n | { type: 'controller:constructed'; path: readonly string[]; props: unknown }\n | { type: 'controller:suspended'; path: readonly string[] }\n | { type: 'controller:resumed'; path: readonly string[] }\n | { type: 'controller:disposed'; path: readonly string[] }\n | {\n type: 'cache:subscribed'\n queryKey: readonly unknown[]\n subscriberPath: readonly string[]\n }\n | { type: 'cache:fetch-start'; queryKey: readonly unknown[] }\n | { type: 'cache:fetch-success'; queryKey: readonly unknown[]; durationMs: number }\n | {\n type: 'cache:fetch-error'\n queryKey: readonly unknown[]\n error: unknown\n durationMs: number\n }\n | { type: 'cache:invalidated'; queryKey: readonly unknown[] }\n | { type: 'cache:gc'; queryKey: readonly unknown[] }\n | { type: 'mutation:run'; path: readonly string[]; name?: string; vars: unknown }\n | { type: 'mutation:success'; path: readonly string[]; name?: string; result: unknown }\n | { type: 'mutation:error'; path: readonly string[]; name?: string; error: unknown }\n | { type: 'mutation:rollback'; path: readonly string[]; name?: string }\n | {\n type: 'field:validated'\n path: readonly string[]\n field: string\n valid: boolean\n errors: string[]\n }\n\n/**\n * Snapshot of one live cache entry — produced by `root.__debug.queryEntries()`\n * so devtools panels can show *current data*, not just past fetch events.\n */\nexport type DebugCacheEntry = {\n key: readonly unknown[]\n status: 'idle' | 'pending' | 'success' | 'error'\n data: unknown\n error: unknown\n lastUpdatedAt: number | undefined\n isStale: boolean\n isFetching: boolean\n hasPendingMutations: boolean\n}\n\n/**\n * The shape of `root.__debug`. Subscribe to receive every `DebugEvent` until\n * the returned unsubscribe is called.\n *\n * The bus replays a snapshot of the *live controller tree* to every new\n * subscriber synchronously inside `subscribe(...)` — so a panel that mounts\n * after `createRoot()` sees the existing tree immediately, not just future\n * events. Event types other than `controller:*` are not buffered.\n *\n * `queryEntries()` returns a fresh inspector snapshot — current state of\n * every cached entry. Useful for \"what's in the cache right now?\" views.\n */\nexport type DebugBus = {\n subscribe(handler: (event: DebugEvent) => void): () => void\n queryEntries(): DebugCacheEntry[]\n}\n\ntype LiveControllerEntry = {\n path: readonly string[]\n props: unknown\n state: 'active' | 'suspended'\n}\n\nfunction pathKey(path: readonly string[]): string {\n return path.join('\u0000')\n}\n\n/**\n * Per-root devtools event multiplexer. Emit is a no-op when no one is\n * subscribed (one Set size check), so leaving the bus in production has\n * effectively zero cost until a consumer attaches.\n *\n * Internal — exposed to consumers via `root.__debug`.\n *\n * Tracks a snapshot of every live controller (constructed but not yet\n * disposed) and replays construction events to new subscribers, so the\n * devtools tree populates on mount instead of staying blank until the\n * next event.\n */\nexport class DevtoolsEmitter {\n private handlers = new Set<(event: DebugEvent) => void>()\n /** Path → entry for every live (constructed, not disposed) controller. */\n private liveControllers = new Map<string, LiveControllerEntry>()\n\n subscribe(handler: (event: DebugEvent) => void): () => void {\n // Replay the snapshot of the current tree, in insertion order. Insertion\n // order matches construction order, which is parent-before-child (parents\n // construct their children inside their factories). The replayed handler\n // gets the same event shape it would have seen live.\n for (const entry of this.liveControllers.values()) {\n try {\n handler({\n type: 'controller:constructed',\n path: entry.path,\n props: entry.props,\n })\n if (entry.state === 'suspended') {\n handler({ type: 'controller:suspended', path: entry.path })\n }\n } catch {\n // Devtools handlers must not break replay for other handlers.\n }\n }\n this.handlers.add(handler)\n return () => {\n this.handlers.delete(handler)\n }\n }\n\n emit(event: DebugEvent): void {\n // Track live controllers regardless of subscriber count — the snapshot\n // must be accurate even when no one was watching.\n this.recordLifecycle(event)\n if (this.handlers.size === 0) return\n // Snapshot — handlers may unsubscribe.\n const snapshot = Array.from(this.handlers)\n for (const handler of snapshot) {\n try {\n handler(event)\n } catch {\n // Devtools handlers must not break the program.\n }\n }\n }\n\n get hasSubscribers(): boolean {\n return this.handlers.size > 0\n }\n\n private recordLifecycle(event: DebugEvent): void {\n if (event.type === 'controller:constructed') {\n this.liveControllers.set(pathKey(event.path), {\n path: event.path,\n props: event.props,\n state: 'active',\n })\n return\n }\n if (event.type === 'controller:suspended') {\n const key = pathKey(event.path)\n const cur = this.liveControllers.get(key)\n if (cur !== undefined) cur.state = 'suspended'\n return\n }\n if (event.type === 'controller:resumed') {\n const key = pathKey(event.path)\n const cur = this.liveControllers.get(key)\n if (cur !== undefined) cur.state = 'active'\n return\n }\n if (event.type === 'controller:disposed') {\n this.liveControllers.delete(pathKey(event.path))\n return\n }\n }\n}\n","/**\n * Context passed to a root's `onError` handler. `kind` identifies where in\n * the controller's surface the throw originated; `controllerPath` is the\n * path from root to the controller that owned the failing code; `queryKey`\n * is set for `cache` kinds. Spec §12, §20.9.\n *\n * `'plugin'` is used for exceptions raised by `QueryClientPlugin` callbacks\n * (`@kontsedal/olas-cross-tab` and friends); SPEC §13.2.\n */\nexport type ErrorContext = {\n kind: 'effect' | 'cache' | 'mutation' | 'emitter' | 'construction' | 'plugin'\n controllerPath: readonly string[]\n queryKey?: readonly unknown[]\n}\n\n/** Signature of `RootOptions.onError`. */\nexport type ErrorHandler = (err: unknown, context: ErrorContext) => void\n\nconst defaultHandler: ErrorHandler = (err, context) => {\n // eslint-disable-next-line no-console\n console.error('[olas]', context, err)\n}\n\n/**\n * Dispatch an error to a user-provided handler, falling back to console.error.\n * The handler itself is wrapped — if it throws, the throw is swallowed and\n * logged so an `onError` bug never tears down the tree.\n *\n * Internal — used by the controller container and query client.\n */\nexport function dispatchError(\n handler: ErrorHandler | undefined,\n err: unknown,\n context: ErrorContext,\n): void {\n const fn = handler ?? defaultHandler\n try {\n fn(err, context)\n } catch (handlerErr) {\n try {\n // eslint-disable-next-line no-console\n console.error('[olas] onError handler threw:', handlerErr)\n // eslint-disable-next-line no-console\n console.error('[olas] original error:', err, context)\n } catch {\n // Console itself failed — give up silently.\n }\n }\n}\n","import {\n batch as _batch,\n computed as _computed,\n effect as _effect,\n signal as _signal,\n untracked as _untracked,\n type ReadonlySignal as PreactReadonlySignal,\n type Signal as PreactSignal,\n} from '@preact/signals-core'\n\nimport type { Computed, Signal } from './types'\n\nclass SignalImpl<T> implements Signal<T> {\n private readonly inner: PreactSignal<T>\n\n constructor(initial: T) {\n this.inner = _signal<T>(initial)\n }\n\n get value(): T {\n return this.inner.value\n }\n\n set value(next: T) {\n this.inner.value = next\n }\n\n peek(): T {\n return this.inner.peek()\n }\n\n subscribe(handler: (value: T) => void): () => void {\n return this.inner.subscribe(handler)\n }\n\n set(value: T): void {\n this.inner.value = value\n }\n\n update(fn: (prev: T) => T): void {\n this.inner.value = fn(this.inner.peek())\n }\n}\n\nclass ComputedImpl<T> implements Computed<T> {\n private readonly inner: PreactReadonlySignal<T>\n\n constructor(fn: () => T) {\n this.inner = _computed<T>(fn)\n }\n\n get value(): T {\n return this.inner.value\n }\n\n peek(): T {\n return this.inner.peek()\n }\n\n subscribe(handler: (value: T) => void): () => void {\n return this.inner.subscribe(handler)\n }\n}\n\n/**\n * Create a writable `Signal<T>`. Reads track the current auto-tracking scope\n * (effect / computed); writes notify all subscribers (deduped via `Object.is`).\n *\n * Spec §20.1. For a single-pass non-tracked read use `signal.peek()`.\n */\nexport function signal<T>(initial: T): Signal<T> {\n return new SignalImpl(initial)\n}\n\n/**\n * Create a `Computed<T>` — a read-only derived signal. The provided `fn` is\n * re-evaluated whenever a signal it read during its last run changes; the\n * resulting value is cached until then.\n *\n * Spec §20.1. The graph is glitch-free: a `computed` re-runs at most once per\n * batched-write cycle.\n */\nexport function computed<T>(fn: () => T): Computed<T> {\n return new ComputedImpl(fn)\n}\n\n/**\n * Run `fn` immediately and again whenever any signal it reads changes. If\n * `fn` returns a function, that function is called as a cleanup before the\n * next re-run and on dispose.\n *\n * Returns a `dispose` function. Inside a controller use `ctx.effect(...)`\n * instead — that variant is auto-disposed with the controller.\n */\nexport function effect(fn: () => void | (() => void)): () => void {\n return _effect(fn)\n}\n\n/**\n * Batch synchronous signal writes so subscribers see one notification at the\n * end of the batch rather than one per write. Returns whatever `fn` returns.\n */\nexport function batch<T>(fn: () => T): T {\n return _batch(fn)\n}\n\n/**\n * Run `fn` with auto-tracking suppressed — signals read inside don't become\n * dependencies of the surrounding `computed` / `effect`. Useful for \"read\n * these signals once to log them\" or for snapshotting state inside an effect\n * without subscribing to it. For a single-signal peek, prefer `signal.peek()`.\n */\nexport function untracked<T>(fn: () => T): T {\n return _untracked(fn)\n}\n","/**\n * True iff `err` is an AbortError. Used to filter superseded latest-wins\n * mutations and aborted fetches from genuine failures.\n *\n * Spec: §20.12 — checks `err instanceof DOMException && err.name === 'AbortError'`.\n * Node 17+ exposes a global DOMException, so this works server-side too.\n */\nexport function isAbortError(err: unknown): boolean {\n if (typeof DOMException !== 'undefined' && err instanceof DOMException) {\n return err.name === 'AbortError'\n }\n return false\n}\n","import { batch, type Signal, signal } from '../signals'\nimport { isAbortError } from '../utils'\nimport type { AsyncStatus, RetryDelay, RetryPolicy, Snapshot } from './types'\n\nexport type EntryEvents = {\n onFetchStart?: () => void\n onFetchSuccess?: (durationMs: number) => void\n onFetchError?: (durationMs: number, error: unknown) => void\n}\n\nexport type EntryOptions<T> = {\n fetcher: () => (signal: AbortSignal) => Promise<T>\n staleTime?: number\n initialData?: T | undefined\n initialUpdatedAt?: number | undefined\n retry?: RetryPolicy\n retryDelay?: RetryDelay\n events?: EntryEvents\n}\n\ntype SnapshotRecord<T> = {\n id: number\n prev: T | undefined\n live: boolean\n}\n\n/**\n * One cache entry's state machine. Owns the AsyncState signals, race\n * protection, retry loop, optimistic-update snapshot stack.\n *\n * Internal — not exported from the public surface.\n */\nexport class Entry<T> {\n readonly data: Signal<T | undefined>\n readonly error: Signal<unknown | undefined> = signal(undefined)\n readonly status: Signal<AsyncStatus>\n readonly isLoading: Signal<boolean> = signal(false)\n readonly isFetching: Signal<boolean> = signal(false)\n readonly lastUpdatedAt: Signal<number | undefined>\n readonly hasPendingMutations: Signal<boolean> = signal(false)\n readonly isStale: Signal<boolean> = signal(true)\n\n fetcherProvider: () => (signal: AbortSignal) => Promise<T>\n private staleTime: number\n private retry: RetryPolicy\n private retryDelay: RetryDelay\n private currentFetchId = 0\n private currentAbort: AbortController | null = null\n private staleTimer: ReturnType<typeof setTimeout> | null = null\n private snapshots: Array<SnapshotRecord<T>> = []\n private nextSnapshotId = 0\n private disposed = false\n private readonly events: EntryEvents\n private fetchStartTime = 0\n\n constructor(options: EntryOptions<T>) {\n this.fetcherProvider = options.fetcher\n this.staleTime = options.staleTime ?? 0\n this.retry = options.retry ?? 0\n this.retryDelay = options.retryDelay ?? 1000\n this.events = options.events ?? {}\n this.data = signal<T | undefined>(options.initialData)\n if (options.initialData !== undefined) {\n this.status = signal<AsyncStatus>('success')\n this.scheduleStaleness()\n this.isStale.set(this.staleTime === 0)\n } else {\n this.status = signal<AsyncStatus>('idle')\n }\n this.lastUpdatedAt = signal<number | undefined>(options.initialUpdatedAt)\n }\n\n startFetch(): Promise<T> {\n if (this.disposed) {\n return Promise.reject(new Error('Entry disposed'))\n }\n const myId = ++this.currentFetchId\n this.currentAbort?.abort()\n const abort = new AbortController()\n this.currentAbort = abort\n\n const previouslyHadData = this.data.peek() !== undefined\n batch(() => {\n this.status.set('pending')\n this.isFetching.set(true)\n this.isLoading.set(!previouslyHadData)\n })\n\n this.fetchStartTime = Date.now()\n try {\n this.events.onFetchStart?.()\n } catch {\n // devtools handlers must not break the program.\n }\n\n return this.runWithRetry(myId, abort)\n }\n\n private async runWithRetry(myId: number, abort: AbortController): Promise<T> {\n let attempt = 0\n while (true) {\n if (myId !== this.currentFetchId || this.disposed) {\n throw new DOMException('Superseded', 'AbortError')\n }\n try {\n const fetcher = this.fetcherProvider()\n const result = await fetcher(abort.signal)\n if (myId !== this.currentFetchId || this.disposed) {\n throw new DOMException('Superseded', 'AbortError')\n }\n return this.applySuccess(result)\n } catch (err) {\n if (myId !== this.currentFetchId || this.disposed || isAbortError(err)) {\n throw err\n }\n if (!this.shouldRetry(attempt, err)) {\n return this.applyFailure(err)\n }\n const delay = this.computeDelay(attempt)\n await abortableSleep(delay, abort.signal)\n attempt += 1\n }\n }\n }\n\n private shouldRetry(attempt: number, err: unknown): boolean {\n const retry = this.retry\n if (retry === 0) return false\n if (typeof retry === 'number') return attempt < retry\n return retry(attempt, err)\n }\n\n private computeDelay(attempt: number): number {\n const d = this.retryDelay\n return typeof d === 'function' ? d(attempt) : d\n }\n\n private applySuccess(result: T): T {\n batch(() => {\n this.data.set(result)\n this.error.set(undefined)\n this.status.set('success')\n this.isLoading.set(false)\n this.isFetching.set(false)\n this.lastUpdatedAt.set(Date.now())\n this.isStale.set(this.staleTime === 0)\n })\n if (this.staleTime > 0) this.scheduleStaleness()\n try {\n this.events.onFetchSuccess?.(Date.now() - this.fetchStartTime)\n } catch {\n // devtools handlers must not break the program.\n }\n return result\n }\n\n private applyFailure(err: unknown): never {\n batch(() => {\n this.error.set(err)\n this.status.set('error')\n this.isLoading.set(false)\n this.isFetching.set(false)\n })\n try {\n this.events.onFetchError?.(Date.now() - this.fetchStartTime, err)\n } catch {\n // devtools handlers must not break the program.\n }\n throw err\n }\n\n private scheduleStaleness(): void {\n if (this.staleTimer != null) clearTimeout(this.staleTimer)\n if (this.staleTime > 0) {\n this.staleTimer = setTimeout(() => {\n this.staleTimer = null\n if (!this.disposed) this.isStale.set(true)\n }, this.staleTime)\n }\n }\n\n refetch(): Promise<T> {\n return this.startFetch()\n }\n\n invalidate(): Promise<T> {\n if (this.staleTimer != null) {\n clearTimeout(this.staleTimer)\n this.staleTimer = null\n }\n this.isStale.set(true)\n return this.startFetch()\n }\n\n reset(): void {\n if (this.disposed) return\n batch(() => {\n this.error.set(undefined)\n this.status.set(this.data.peek() !== undefined ? 'success' : 'idle')\n })\n }\n\n setData(updater: (prev: T | undefined) => T): Snapshot {\n if (this.disposed) {\n return { rollback: () => {}, finalize: () => {} }\n }\n const prev = this.data.peek()\n const next = updater(prev)\n const id = this.nextSnapshotId++\n const record: SnapshotRecord<T> = { id, prev, live: true }\n this.snapshots.push(record)\n\n batch(() => {\n this.data.set(next)\n if (this.status.peek() === 'idle' || this.status.peek() === 'pending') {\n this.status.set('success')\n }\n this.lastUpdatedAt.set(Date.now())\n this.hasPendingMutations.set(true)\n })\n\n return {\n rollback: () => {\n if (!record.live || this.disposed) return\n record.live = false\n batch(() => {\n this.data.set(record.prev as T)\n this.snapshots = this.snapshots.filter((s) => s.id !== id)\n const anyLive = this.snapshots.some((s) => s.live)\n this.hasPendingMutations.set(anyLive)\n })\n },\n finalize: () => {\n if (!record.live || this.disposed) return\n record.live = false\n this.snapshots = this.snapshots.filter((s) => s.id !== id)\n if (!this.snapshots.some((s) => s.live)) {\n this.hasPendingMutations.set(false)\n }\n },\n }\n }\n\n finalizeSnapshot(snapshot: Snapshot): void {\n const id = snapshotIds.get(snapshot)\n if (id === undefined) return\n const record = this.snapshots.find((s) => s.live && s.id === id)\n if (!record) return\n record.live = false\n this.snapshots = this.snapshots.filter((s) => s !== record)\n if (!this.snapshots.some((s) => s.live)) {\n this.hasPendingMutations.set(false)\n }\n }\n\n firstValue(): Promise<T> {\n if (this.status.peek() === 'success') {\n return Promise.resolve(this.data.peek() as T)\n }\n if (this.status.peek() === 'error') {\n return Promise.reject(this.error.peek())\n }\n return new Promise<T>((resolve, reject) => {\n const unsub = this.status.subscribe((s) => {\n if (s === 'success') {\n unsub()\n resolve(this.data.peek() as T)\n } else if (s === 'error') {\n unsub()\n reject(this.error.peek())\n }\n })\n })\n }\n\n /**\n * True iff data is older than `staleTime` (or no data has been fetched yet).\n * Used by the query client to decide whether to refetch on subscribe.\n */\n isStaleNow(): boolean {\n const last = this.lastUpdatedAt.peek()\n if (last === undefined) return true\n return Date.now() - last >= this.staleTime\n }\n\n dispose(): void {\n if (this.disposed) return\n this.disposed = true\n if (this.staleTimer != null) {\n clearTimeout(this.staleTimer)\n this.staleTimer = null\n }\n this.currentAbort?.abort()\n this.currentAbort = null\n }\n}\n\nconst snapshotIds = new WeakMap<Snapshot, number>()\n\nexport function tagSnapshot(snapshot: Snapshot, id: number): Snapshot {\n snapshotIds.set(snapshot, id)\n return snapshot\n}\n\nfunction abortableSleep(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal.aborted) {\n reject(new DOMException('Aborted', 'AbortError'))\n return\n }\n const timer = setTimeout(() => {\n signal.removeEventListener('abort', onAbort)\n resolve()\n }, ms)\n const onAbort = () => {\n clearTimeout(timer)\n signal.removeEventListener('abort', onAbort)\n reject(new DOMException('Aborted', 'AbortError'))\n }\n signal.addEventListener('abort', onAbort, { once: true })\n })\n}\n","/**\n * Lazy pub/sub for window-focus and reconnect events.\n *\n * Each `ClientEntry` with `refetchOnWindowFocus` or `refetchOnReconnect` set\n * subscribes here on its first subscriber and unsubscribes when it has none.\n * We install a single window/document listener for each event the first time\n * anyone subscribes; after that, we fan out to all subscribers ourselves.\n *\n * SSR-safe: no-ops when `window` is undefined. Spec §5.9.\n */\n\ntype Sub = () => void\n\nconst focusSubs = new Set<Sub>()\nconst onlineSubs = new Set<Sub>()\n\nlet focusInstalled = false\nlet onlineInstalled = false\n\nfunction fireFocus(): void {\n for (const fn of focusSubs) {\n try {\n fn()\n } catch {\n // Subscriber failures must not break the fan-out.\n }\n }\n}\n\nfunction fireOnline(): void {\n for (const fn of onlineSubs) {\n try {\n fn()\n } catch {\n // ditto\n }\n }\n}\n\nfunction ensureFocusInstalled(): void {\n if (focusInstalled) return\n if (typeof window === 'undefined') return\n window.addEventListener('focus', fireFocus)\n if (typeof document !== 'undefined') {\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'visible') fireFocus()\n })\n }\n focusInstalled = true\n}\n\nfunction ensureOnlineInstalled(): void {\n if (onlineInstalled) return\n if (typeof window === 'undefined') return\n window.addEventListener('online', fireOnline)\n onlineInstalled = true\n}\n\nexport function subscribeWindowFocus(fn: Sub): () => void {\n ensureFocusInstalled()\n focusSubs.add(fn)\n return () => {\n focusSubs.delete(fn)\n }\n}\n\nexport function subscribeReconnect(fn: Sub): () => void {\n ensureOnlineInstalled()\n onlineSubs.add(fn)\n return () => {\n onlineSubs.delete(fn)\n }\n}\n","import { batch, computed, type Signal, signal } from '../signals'\nimport type { ReadSignal } from '../signals/types'\nimport { isAbortError } from '../utils'\nimport type { AsyncState, AsyncStatus, RetryDelay, RetryPolicy } from './types'\n\n/**\n * Configuration for `defineInfiniteQuery({ ... })`. Spec §5.7, §20.4.\n *\n * - `getNextPageParam(lastPage, allPages)` returns the param for the next\n * page, or `null` when there's no more.\n * - `getPreviousPageParam` (optional) enables bidirectional infinite lists.\n * - `itemsOf(page)` (optional) flattens pages into items for the\n * `subscription.flat` convenience signal.\n */\nexport type InfiniteFetchCtx<PageParam> = {\n pageParam: PageParam\n signal: AbortSignal\n deps: import('../controller/types').AmbientDeps\n}\n\nexport type InfiniteQuerySpec<Args extends unknown[], PageParam, TPage, TItem = TPage> = {\n key: (...args: Args) => unknown[]\n /**\n * Fetcher receives an `InfiniteFetchCtx` (pageParam + signal + deps) as\n * the first arg and positional cache args after. See `FetchCtx` for the\n * regular-query analogue.\n */\n fetcher: (ctx: InfiniteFetchCtx<PageParam>, ...args: Args) => Promise<TPage>\n initialPageParam: PageParam\n getNextPageParam: (lastPage: TPage, allPages: TPage[]) => PageParam | null\n getPreviousPageParam?: (firstPage: TPage, allPages: TPage[]) => PageParam | null\n itemsOf?: (page: TPage) => TItem[]\n staleTime?: number\n gcTime?: number\n refetchInterval?: number\n keepPreviousData?: boolean\n retry?: RetryPolicy\n retryDelay?: RetryDelay\n /**\n * Stable identifier used by `QueryClientPlugin`s (`@kontsedal/olas-cross-tab`,\n * etc.). Infinite queries do NOT propagate cross-tab in v1 — the\n * page-array payload is too heavy to be a safe default — but the field is\n * accepted for forward compatibility. SPEC §13.2.\n */\n queryId?: string\n /**\n * Opt into cross-tab sync. No effect for infinite queries in v1 (see\n * `queryId` doc above).\n */\n crossTab?: boolean\n}\n\n/**\n * Module-scoped handle for a paginated query. Mirrors `Query<Args, TPage[]>`\n * with paginated `setData` semantics.\n */\nexport type InfiniteQuery<Args extends unknown[], TPage, _TItem> = {\n readonly __olas: 'infiniteQuery'\n invalidate(...args: Args): void\n invalidateAll(): void\n setData(...args: [...Args, updater: (prev: TPage[] | undefined) => TPage[]]): {\n rollback: () => void\n }\n prefetch(...args: Args): Promise<TPage>\n}\n\n/**\n * What `ctx.use(infiniteQuery, ...)` returns. Extends `AsyncState<TPage[]>`\n * with paginated controls: `fetchNextPage` / `fetchPreviousPage`,\n * `hasNextPage` / `hasPreviousPage`, and per-direction `isFetching` signals.\n *\n * `flat` is a convenience: present when the query spec provides `itemsOf` —\n * otherwise it's an empty array.\n */\nexport type InfiniteQuerySubscription<TPage, TItem> = AsyncState<TPage[]> & {\n pages: ReadSignal<TPage[]>\n flat: ReadSignal<TItem[]>\n hasNextPage: ReadSignal<boolean>\n hasPreviousPage: ReadSignal<boolean>\n isFetchingNextPage: ReadSignal<boolean>\n isFetchingPreviousPage: ReadSignal<boolean>\n fetchNextPage: () => Promise<void>\n fetchPreviousPage: () => Promise<void>\n}\n\nimport type { Snapshot } from './types'\n\n/**\n * Holds an array of pages plus their pageParams. Supports fetchNextPage /\n * fetchPreviousPage / invalidate (drops all pages). Race-protected.\n *\n * Internal.\n */\nexport class InfiniteEntry<TPage, TItem, PageParam> {\n readonly pages: Signal<TPage[]> = signal<TPage[]>([])\n readonly pageParams: Signal<PageParam[]>\n readonly data: ReadSignal<TPage[] | undefined>\n readonly error: Signal<unknown | undefined> = signal(undefined)\n readonly status: Signal<AsyncStatus> = signal<AsyncStatus>('idle')\n readonly isLoading: Signal<boolean> = signal(false)\n readonly isFetching: Signal<boolean> = signal(false)\n readonly isStale: Signal<boolean> = signal(true)\n readonly lastUpdatedAt: Signal<number | undefined> = signal(undefined)\n readonly hasPendingMutations: Signal<boolean> = signal(false)\n\n readonly isFetchingNextPage: Signal<boolean> = signal(false)\n readonly isFetchingPreviousPage: Signal<boolean> = signal(false)\n\n readonly hasNextPage: ReadSignal<boolean>\n readonly hasPreviousPage: ReadSignal<boolean>\n readonly flat: ReadSignal<TItem[]>\n\n private currentFetchId = 0\n private currentAbort: AbortController | null = null\n private staleTimer: ReturnType<typeof setTimeout> | null = null\n private snapshots: Array<{ id: number; prev: TPage[]; live: boolean }> = []\n private nextSnapshotId = 0\n private disposed = false\n\n private readonly fetcher: (pageCtx: {\n pageParam: PageParam\n signal: AbortSignal\n }) => Promise<TPage>\n private readonly initialPageParam: PageParam\n private readonly getNextPageParam: (lastPage: TPage, allPages: TPage[]) => PageParam | null\n private readonly getPreviousPageParam:\n | ((firstPage: TPage, allPages: TPage[]) => PageParam | null)\n | undefined\n private readonly staleTime: number\n private readonly retry: RetryPolicy\n private readonly retryDelay: RetryDelay\n private readonly itemsOf?: (page: TPage) => TItem[]\n\n constructor(opts: {\n fetcher: (pageCtx: { pageParam: PageParam; signal: AbortSignal }) => Promise<TPage>\n initialPageParam: PageParam\n getNextPageParam: (lastPage: TPage, allPages: TPage[]) => PageParam | null\n getPreviousPageParam?: (firstPage: TPage, allPages: TPage[]) => PageParam | null\n itemsOf?: (page: TPage) => TItem[]\n staleTime?: number\n retry?: RetryPolicy\n retryDelay?: RetryDelay\n }) {\n this.fetcher = opts.fetcher\n this.initialPageParam = opts.initialPageParam\n this.getNextPageParam = opts.getNextPageParam\n this.getPreviousPageParam = opts.getPreviousPageParam\n this.itemsOf = opts.itemsOf\n this.staleTime = opts.staleTime ?? 0\n this.retry = opts.retry ?? 0\n this.retryDelay = opts.retryDelay ?? 1000\n this.pageParams = signal<PageParam[]>([])\n this.data = computed(() => {\n const ps = this.pages.value\n return ps.length === 0 ? undefined : ps\n })\n this.flat = computed<TItem[]>(() => {\n const ps = this.pages.value\n if (!this.itemsOf) return ps as unknown as TItem[]\n const out: TItem[] = []\n for (const p of ps) {\n for (const item of this.itemsOf(p)) out.push(item)\n }\n return out\n })\n this.hasNextPage = computed(() => {\n const ps = this.pages.value\n if (ps.length === 0) return false\n return this.getNextPageParam(ps[ps.length - 1] as TPage, ps) !== null\n })\n this.hasPreviousPage = computed(() => {\n const ps = this.pages.value\n if (ps.length === 0) return false\n const fn = this.getPreviousPageParam\n if (!fn) return false\n return fn(ps[0] as TPage, ps) !== null\n })\n }\n\n /** Initial / refetch — drops all pages and fetches starting from initialPageParam. */\n startFetch(): Promise<TPage> {\n if (this.disposed) return Promise.reject(new Error('Entry disposed'))\n const myId = ++this.currentFetchId\n this.currentAbort?.abort()\n const abort = new AbortController()\n this.currentAbort = abort\n\n const previouslyHadPages = this.pages.peek().length > 0\n batch(() => {\n this.status.set('pending')\n this.isFetching.set(true)\n this.isLoading.set(!previouslyHadPages)\n })\n\n return this.runFetch(\n myId,\n abort.signal,\n this.initialPageParam,\n (page, param) => {\n if (myId !== this.currentFetchId || this.disposed) return\n batch(() => {\n this.pages.set([page])\n this.pageParams.set([param])\n this.error.set(undefined)\n this.status.set('success')\n this.isLoading.set(false)\n this.isFetching.set(false)\n this.lastUpdatedAt.set(Date.now())\n this.isStale.set(this.staleTime === 0)\n })\n if (this.staleTime > 0) this.scheduleStaleness()\n },\n 'initial',\n )\n }\n\n fetchNextPage(): Promise<void> {\n if (this.disposed) return Promise.reject(new Error('Entry disposed'))\n if (this.isFetchingNextPage.peek()) return Promise.resolve()\n const ps = this.pages.peek()\n if (ps.length === 0) {\n return this.startFetch().then(() => {})\n }\n const nextParam = this.getNextPageParam(ps[ps.length - 1] as TPage, ps)\n if (nextParam === null) return Promise.resolve()\n\n const myId = ++this.currentFetchId\n const abort = new AbortController()\n this.currentAbort?.abort()\n this.currentAbort = abort\n batch(() => {\n this.isFetchingNextPage.set(true)\n this.isFetching.set(true)\n })\n\n return this.runFetch(\n myId,\n abort.signal,\n nextParam,\n (page, param) => {\n if (myId !== this.currentFetchId || this.disposed) return\n batch(() => {\n this.pages.set([...this.pages.peek(), page])\n this.pageParams.set([...this.pageParams.peek(), param])\n this.isFetchingNextPage.set(false)\n this.isFetching.set(false)\n this.lastUpdatedAt.set(Date.now())\n })\n },\n 'next',\n ).then(() => {})\n }\n\n fetchPreviousPage(): Promise<void> {\n if (this.disposed) return Promise.reject(new Error('Entry disposed'))\n if (this.isFetchingPreviousPage.peek()) return Promise.resolve()\n if (!this.getPreviousPageParam) return Promise.resolve()\n const ps = this.pages.peek()\n if (ps.length === 0) {\n return this.startFetch().then(() => {})\n }\n const prevParam = this.getPreviousPageParam(ps[0] as TPage, ps)\n if (prevParam === null) return Promise.resolve()\n\n const myId = ++this.currentFetchId\n const abort = new AbortController()\n this.currentAbort?.abort()\n this.currentAbort = abort\n batch(() => {\n this.isFetchingPreviousPage.set(true)\n this.isFetching.set(true)\n })\n\n return this.runFetch(\n myId,\n abort.signal,\n prevParam,\n (page, param) => {\n if (myId !== this.currentFetchId || this.disposed) return\n batch(() => {\n this.pages.set([page, ...this.pages.peek()])\n this.pageParams.set([param, ...this.pageParams.peek()])\n this.isFetchingPreviousPage.set(false)\n this.isFetching.set(false)\n this.lastUpdatedAt.set(Date.now())\n })\n },\n 'prev',\n ).then(() => {})\n }\n\n private async runFetch(\n myId: number,\n signal: AbortSignal,\n pageParam: PageParam,\n onSuccess: (page: TPage, param: PageParam) => void,\n direction: 'initial' | 'next' | 'prev',\n ): Promise<TPage> {\n let attempt = 0\n while (true) {\n if (myId !== this.currentFetchId || this.disposed) {\n throw new DOMException('Superseded', 'AbortError')\n }\n try {\n const page = await this.fetcher({ pageParam, signal })\n if (myId !== this.currentFetchId || this.disposed) {\n throw new DOMException('Superseded', 'AbortError')\n }\n onSuccess(page, pageParam)\n return page\n } catch (err) {\n if (myId !== this.currentFetchId || this.disposed || isAbortError(err)) {\n throw err\n }\n const shouldRetry =\n typeof this.retry === 'number' ? attempt < this.retry : this.retry(attempt, err)\n if (!shouldRetry) {\n batch(() => {\n this.error.set(err)\n this.status.set('error')\n this.isLoading.set(false)\n this.isFetching.set(false)\n if (direction === 'next') this.isFetchingNextPage.set(false)\n if (direction === 'prev') this.isFetchingPreviousPage.set(false)\n })\n throw err\n }\n const delay =\n typeof this.retryDelay === 'function' ? this.retryDelay(attempt) : this.retryDelay\n await abortableSleep(delay, signal)\n attempt += 1\n }\n }\n }\n\n refetch(): Promise<TPage> {\n return this.startFetch()\n }\n\n invalidate(): Promise<TPage> {\n if (this.staleTimer != null) {\n clearTimeout(this.staleTimer)\n this.staleTimer = null\n }\n this.isStale.set(true)\n return this.startFetch()\n }\n\n reset(): void {\n if (this.disposed) return\n batch(() => {\n this.error.set(undefined)\n this.status.set(this.pages.peek().length > 0 ? 'success' : 'idle')\n })\n }\n\n setData(updater: (prev: TPage[] | undefined) => TPage[]): Snapshot {\n if (this.disposed) {\n return { rollback: () => {}, finalize: () => {} }\n }\n const prev = this.pages.peek()\n const next = updater(prev.length === 0 ? undefined : prev)\n const id = this.nextSnapshotId++\n const record = { id, prev, live: true }\n this.snapshots.push(record)\n\n batch(() => {\n this.pages.set(next)\n if (this.status.peek() === 'idle' || this.status.peek() === 'pending') {\n this.status.set('success')\n }\n this.lastUpdatedAt.set(Date.now())\n this.hasPendingMutations.set(true)\n })\n\n return {\n rollback: () => {\n if (!record.live || this.disposed) return\n record.live = false\n batch(() => {\n this.pages.set(record.prev)\n this.snapshots = this.snapshots.filter((s) => s.id !== id)\n this.hasPendingMutations.set(this.snapshots.some((s) => s.live))\n })\n },\n finalize: () => {\n if (!record.live || this.disposed) return\n record.live = false\n this.snapshots = this.snapshots.filter((s) => s.id !== id)\n if (!this.snapshots.some((s) => s.live)) {\n this.hasPendingMutations.set(false)\n }\n },\n }\n }\n\n firstValue(): Promise<TPage[]> {\n if (this.status.peek() === 'success') {\n return Promise.resolve(this.pages.peek())\n }\n if (this.status.peek() === 'error') {\n return Promise.reject(this.error.peek())\n }\n return new Promise<TPage[]>((resolve, reject) => {\n const unsub = this.status.subscribe((s) => {\n if (s === 'success') {\n unsub()\n resolve(this.pages.peek())\n } else if (s === 'error') {\n unsub()\n reject(this.error.peek())\n }\n })\n })\n }\n\n isStaleNow(): boolean {\n const last = this.lastUpdatedAt.peek()\n if (last === undefined) return true\n return Date.now() - last >= this.staleTime\n }\n\n private scheduleStaleness(): void {\n if (this.staleTimer != null) clearTimeout(this.staleTimer)\n if (this.staleTime > 0) {\n this.staleTimer = setTimeout(() => {\n this.staleTimer = null\n if (!this.disposed) this.isStale.set(true)\n }, this.staleTime)\n }\n }\n\n dispose(): void {\n if (this.disposed) return\n this.disposed = true\n if (this.staleTimer != null) {\n clearTimeout(this.staleTimer)\n this.staleTimer = null\n }\n this.currentAbort?.abort()\n this.currentAbort = null\n }\n}\n\nfunction abortableSleep(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal.aborted) {\n reject(new DOMException('Aborted', 'AbortError'))\n return\n }\n const timer = setTimeout(() => {\n signal.removeEventListener('abort', onAbort)\n resolve()\n }, ms)\n const onAbort = () => {\n clearTimeout(timer)\n signal.removeEventListener('abort', onAbort)\n reject(new DOMException('Aborted', 'AbortError'))\n }\n signal.addEventListener('abort', onAbort, { once: true })\n })\n}\n","/**\n * Stable string hash of a key tuple. Two equal-by-content args produce the\n * same string regardless of property iteration order. Handles primitives,\n * arrays, plain objects, Date.\n *\n * Functions and symbols throw — keys must be serializable so distinct\n * subscribers can share entries.\n */\nexport function stableHash(args: readonly unknown[]): string {\n return JSON.stringify(args, replacer)\n}\n\nconst replacer = (_key: string, value: unknown): unknown => {\n if (typeof value === 'function') {\n throw new Error('[olas] query keys cannot contain functions')\n }\n if (typeof value === 'symbol') {\n throw new Error('[olas] query keys cannot contain symbols')\n }\n if (value === undefined) return '__undefined__'\n if (value instanceof Date) return { __date: value.toISOString() }\n if (value instanceof Map || value instanceof Set) {\n throw new Error('[olas] query keys cannot contain Map/Set — use arrays/objects')\n }\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const sorted: Record<string, unknown> = {}\n for (const k of Object.keys(value).sort()) {\n sorted[k] = (value as Record<string, unknown>)[k]\n }\n return sorted\n }\n return value\n}\n","/**\n * `QueryClientPlugin` — a slot for layered cache concerns (cross-tab sync,\n * server-push patches, persistence-like layers) that need to observe\n * `setData` / `invalidate` / `gc` and apply remote writes back into the\n * cache without re-triggering their own outbound side-effects.\n *\n * Plugins are installed via `RootOptions.plugins[]`; lifecycle is bound to\n * the root's `QueryClient` (`init` is called once after construction;\n * `dispose` is called from `QueryClient.dispose`).\n *\n * SPEC §13.2.\n */\n\n/**\n * Surface the plugin gets at `init` time. Used to push remote-originated\n * cache writes through the normal `setData`/`invalidate` paths without\n * triggering the plugin's own outbound hooks for those writes (the inbound\n * writes are marked `isRemote: true` and rebroadcast must be skipped).\n *\n * `subscribedKeys(queryId)` walks the per-root entry registry for the\n * matching query and returns every bound entry's `keyArgs`. Cross-tab\n * plugins use this to scope outbound traffic (e.g. only echo invalidations\n * for queries the local tab actually has entries for).\n */\nexport type QueryClientPluginApi = {\n /**\n * Apply a remote snapshot. The plugin's own `onSetData` IS fired for the\n * resulting cache write, but the event carries `isRemote: true` — plugins\n * MUST skip rebroadcast in that case.\n */\n applyRemoteSetData(queryId: string, keyArgs: readonly unknown[], data: unknown): void\n applyRemoteInvalidate(queryId: string, keyArgs: readonly unknown[]): void\n /**\n * Snapshot of currently bound entry keys for a query (by `queryId`). Empty\n * array when the query isn't registered, has no client entries, or the\n * `queryId` doesn't match any registered query.\n */\n subscribedKeys(queryId: string): readonly (readonly unknown[])[]\n}\n\nexport type SetDataEvent = {\n queryId: string\n keyArgs: readonly unknown[]\n data: unknown\n /**\n * `'data'` for regular queries, `'infinite'` for paginated queries.\n * Cross-tab plugins skip `'infinite'` in v1 — page-array payloads are\n * too heavy to be a safe default.\n */\n kind: 'data' | 'infinite'\n /**\n * True iff this write originated from `applyRemoteSetData`. Plugins MUST\n * skip rebroadcast in that case — otherwise the message would echo back.\n */\n isRemote: boolean\n}\n\nexport type InvalidateEvent = {\n queryId: string\n keyArgs: readonly unknown[]\n kind: 'data' | 'infinite'\n isRemote: boolean\n}\n\nexport type GcEvent = {\n queryId: string\n keyArgs: readonly unknown[]\n kind: 'data' | 'infinite'\n}\n\n/**\n * Plugin contract. Every hook is optional. Hooks are wrapped in try/catch\n * by `QueryClient`; thrown exceptions are routed through the root's\n * `onError` handler with `kind: 'plugin'`.\n */\nexport type QueryClientPlugin = {\n /**\n * Called once after the `QueryClient` is constructed. Use it to wire up\n * transport listeners and capture the `QueryClientPluginApi`.\n */\n init?(api: QueryClientPluginApi): void\n onSetData?(event: SetDataEvent): void\n onInvalidate?(event: InvalidateEvent): void\n onGc?(event: GcEvent): void\n /** Called from `QueryClient.dispose`. Tear down transports / listeners here. */\n dispose?(): void\n}\n\n/**\n * Internal helper — fetch the `queryId` from a query's spec without\n * peeking into private types. Returns `undefined` for queries that didn't\n * declare a `queryId`; plugin events are then skipped (a plugin can't route\n * by name without one).\n */\nexport function readQueryId(query: { readonly __spec: { queryId?: string } }): string | undefined {\n return query.__spec.queryId\n}\n\n/**\n * Shape of values stored in the `queryId → Query` registry. Either a\n * regular `Query` or an `InfiniteQuery`, both branded by `__olas`.\n */\nexport type RegisteredQuery = {\n readonly __olas: 'query' | 'infiniteQuery'\n readonly __spec: { queryId?: string; crossTab?: boolean }\n}\n\nconst queryRegistry = new Map<string, RegisteredQuery>()\n\n/**\n * Register a query by its `queryId`. Internal — called from `defineQuery` /\n * `defineInfiniteQuery`. Replaces any previous registration with the same\n * id (matches Olas's \"full root rebuild\" HMR story; a mid-flight remote\n * message routed against the old `Query` simply misses).\n */\nexport function registerQueryById(queryId: string, query: RegisteredQuery): void {\n queryRegistry.set(queryId, query)\n}\n\n/**\n * Look up a query by its declared `queryId`. Returns `undefined` when no\n * query with that id has been defined yet (e.g. the module isn't imported\n * in the receiving tab).\n */\nexport function lookupRegisteredQuery(queryId: string): RegisteredQuery | undefined {\n return queryRegistry.get(queryId)\n}\n\n/**\n * Test-only — drop a registered entry. Lets tests defining the same\n * `queryId` across cases avoid bleed. Not exported from `@kontsedal/olas-core`.\n */\nexport function _unregisterQueryById(queryId: string): void {\n queryRegistry.delete(queryId)\n}\n","import type { DevtoolsEmitter } from '../devtools'\nimport { dispatchError, type ErrorHandler } from '../errors'\nimport { type Signal, signal } from '../signals'\nimport { Entry } from './entry'\nimport { subscribeReconnect, subscribeWindowFocus } from './focus-online'\nimport { InfiniteEntry, type InfiniteQuery, type InfiniteQuerySpec } from './infinite'\nimport { stableHash } from './keys'\nimport {\n type GcEvent,\n type InvalidateEvent,\n lookupRegisteredQuery,\n type QueryClientPlugin,\n type QueryClientPluginApi,\n type SetDataEvent,\n} from './plugin'\nimport type { DehydratedState, Query, QuerySpec, RetryDelay, RetryPolicy, Snapshot } from './types'\n\nconst DEFAULT_GC_TIME = 5 * 60_000\n\ntype AnyQuery = Query<any, any> & {\n readonly __spec: QuerySpec<any, any>\n __clients: Set<QueryClient>\n}\n\ntype AnyInfiniteQuery = InfiniteQuery<any, any, any> & {\n readonly __spec: InfiniteQuerySpec<any, any, any, any>\n __clients: Set<QueryClient>\n}\n\nexport class ClientEntry<T> {\n readonly entry: Entry<T>\n /** The result of `spec.key(...args)` — used for hashing/identity. */\n readonly keyArgs: readonly unknown[]\n /** The original args the consumer passed — what the fetcher receives. */\n readonly callArgs: readonly unknown[]\n readonly client: QueryClient\n readonly query: AnyQuery\n private subscriberCount = 0\n private gcTimer: ReturnType<typeof setTimeout> | null = null\n private intervalTimer: ReturnType<typeof setInterval> | null = null\n private unsubFocus: (() => void) | null = null\n private unsubOnline: (() => void) | null = null\n private gcTime: number\n private refetchInterval: number | undefined\n private refetchOnWindowFocus: boolean\n private refetchOnReconnect: boolean\n\n constructor(\n client: QueryClient,\n query: AnyQuery,\n callArgs: readonly unknown[],\n keyArgs: readonly unknown[],\n spec: QuerySpec<any, T>,\n hydrated?: { data: T; lastUpdatedAt: number },\n ) {\n this.client = client\n this.query = query\n this.callArgs = callArgs\n this.keyArgs = keyArgs\n this.gcTime = spec.gcTime ?? DEFAULT_GC_TIME\n this.refetchInterval = spec.refetchInterval\n this.refetchOnWindowFocus = spec.refetchOnWindowFocus ?? client.refetchOnWindowFocus\n this.refetchOnReconnect = spec.refetchOnReconnect ?? client.refetchOnReconnect\n const fetcherFn = spec.fetcher\n const deps = client.deps as import('../controller/types').AmbientDeps\n const devtools = client.devtools\n const queryKey = this.keyArgs\n this.entry = new Entry<T>({\n fetcher: () => (signal) => fetcherFn({ signal, deps }, ...(callArgs as never[])),\n staleTime: spec.staleTime,\n retry: spec.retry as RetryPolicy | undefined,\n retryDelay: spec.retryDelay as RetryDelay | undefined,\n initialData: hydrated?.data,\n initialUpdatedAt: hydrated?.lastUpdatedAt,\n events:\n __DEV__ && devtools !== undefined\n ? {\n onFetchStart: () => devtools.emit({ type: 'cache:fetch-start', queryKey }),\n onFetchSuccess: (durationMs) =>\n devtools.emit({ type: 'cache:fetch-success', queryKey, durationMs }),\n onFetchError: (durationMs, error) =>\n devtools.emit({\n type: 'cache:fetch-error',\n queryKey,\n durationMs,\n error,\n }),\n }\n : undefined,\n })\n }\n\n acquire(): void {\n this.subscriberCount += 1\n if (this.gcTimer != null) {\n clearTimeout(this.gcTimer)\n this.gcTimer = null\n }\n if (this.subscriberCount === 1) {\n if (this.refetchInterval != null) this.startIntervalTimer()\n if (this.refetchOnWindowFocus) {\n this.unsubFocus = subscribeWindowFocus(() => this.triggerEventRefetch())\n }\n if (this.refetchOnReconnect) {\n this.unsubOnline = subscribeReconnect(() => this.triggerEventRefetch())\n }\n }\n }\n\n release(): void {\n this.subscriberCount -= 1\n if (this.subscriberCount <= 0) {\n this.stopIntervalTimer()\n this.stopEventSubscriptions()\n if (this.gcTime === 0) {\n this.client.dropEntry(this)\n } else {\n this.gcTimer = setTimeout(() => {\n this.gcTimer = null\n this.client.dropEntry(this)\n }, this.gcTime)\n }\n }\n }\n\n hasSubscribers(): boolean {\n return this.subscriberCount > 0\n }\n\n startIntervalTimer(): void {\n if (this.refetchInterval == null) return\n if (this.intervalTimer != null) return\n this.intervalTimer = setInterval(() => {\n this.entry.startFetch().catch(() => {\n /* error already captured on entry */\n })\n }, this.refetchInterval)\n }\n\n stopIntervalTimer(): void {\n if (this.intervalTimer != null) {\n clearInterval(this.intervalTimer)\n this.intervalTimer = null\n }\n }\n\n stopEventSubscriptions(): void {\n if (this.unsubFocus != null) {\n this.unsubFocus()\n this.unsubFocus = null\n }\n if (this.unsubOnline != null) {\n this.unsubOnline()\n this.unsubOnline = null\n }\n }\n\n /**\n * Schedule a gc timer for an entry that was just created via a non-subscribing\n * path (`prefetch`, `setData`, `invalidate`). Without this, those entries\n * never trigger `release()` and would live until root dispose. Called by\n * `QueryClient.bindEntry` right after creating a fresh entry; `acquire()`\n * (e.g., from a subscriber that arrives shortly after a prefetch) clears it.\n * No-op if the entry already has subscribers or a gc timer pending.\n */\n scheduleGcIfOrphan(): void {\n if (this.subscriberCount > 0 || this.gcTimer != null) return\n if (this.gcTime === 0) {\n // Defer one microtask so the current caller (e.g. a `setData` that\n // writes then expects to read back in the same tick) sees the entry.\n queueMicrotask(() => {\n if (this.subscriberCount === 0 && this.gcTimer == null) {\n this.client.dropEntry(this)\n }\n })\n return\n }\n this.gcTimer = setTimeout(() => {\n this.gcTimer = null\n this.client.dropEntry(this)\n }, this.gcTime)\n }\n\n /** Refetch on focus / reconnect, but only if the data is actually stale. */\n private triggerEventRefetch(): void {\n if (!this.entry.isStaleNow()) return\n this.entry.startFetch().catch(() => {\n /* error already captured on entry */\n })\n }\n\n dispose(): void {\n if (this.gcTimer != null) {\n clearTimeout(this.gcTimer)\n this.gcTimer = null\n }\n this.stopIntervalTimer()\n this.stopEventSubscriptions()\n this.entry.dispose()\n }\n}\n\nexport class InfiniteClientEntry<TPage, TItem, PageParam> {\n readonly entry: InfiniteEntry<TPage, TItem, PageParam>\n readonly keyArgs: readonly unknown[]\n readonly callArgs: readonly unknown[]\n readonly client: QueryClient\n readonly query: AnyInfiniteQuery\n private subscriberCount = 0\n private gcTimer: ReturnType<typeof setTimeout> | null = null\n private intervalTimer: ReturnType<typeof setInterval> | null = null\n private gcTime: number\n private refetchInterval: number | undefined\n\n constructor(\n client: QueryClient,\n query: AnyInfiniteQuery,\n callArgs: readonly unknown[],\n keyArgs: readonly unknown[],\n spec: InfiniteQuerySpec<any, PageParam, TPage, TItem>,\n ) {\n this.client = client\n this.query = query\n this.callArgs = callArgs\n this.keyArgs = keyArgs\n this.gcTime = spec.gcTime ?? DEFAULT_GC_TIME\n this.refetchInterval = spec.refetchInterval\n const fetcherFn = spec.fetcher\n const deps = client.deps as import('../controller/types').AmbientDeps\n this.entry = new InfiniteEntry<TPage, TItem, PageParam>({\n fetcher: ({ pageParam, signal }) =>\n fetcherFn({ pageParam, signal, deps }, ...(callArgs as never[])),\n initialPageParam: spec.initialPageParam,\n getNextPageParam: spec.getNextPageParam,\n getPreviousPageParam: spec.getPreviousPageParam,\n itemsOf: spec.itemsOf,\n staleTime: spec.staleTime,\n retry: spec.retry as RetryPolicy | undefined,\n retryDelay: spec.retryDelay as RetryDelay | undefined,\n })\n }\n\n acquire(): void {\n this.subscriberCount += 1\n if (this.gcTimer != null) {\n clearTimeout(this.gcTimer)\n this.gcTimer = null\n }\n if (this.subscriberCount === 1 && this.refetchInterval != null) {\n this.startIntervalTimer()\n }\n }\n\n release(): void {\n this.subscriberCount -= 1\n if (this.subscriberCount <= 0) {\n this.stopIntervalTimer()\n if (this.gcTime === 0) {\n this.client.dropInfiniteEntry(\n this as unknown as InfiniteClientEntry<unknown, unknown, unknown>,\n )\n } else {\n this.gcTimer = setTimeout(() => {\n this.gcTimer = null\n this.client.dropInfiniteEntry(\n this as unknown as InfiniteClientEntry<unknown, unknown, unknown>,\n )\n }, this.gcTime)\n }\n }\n }\n\n private startIntervalTimer(): void {\n if (this.refetchInterval == null || this.intervalTimer != null) return\n this.intervalTimer = setInterval(() => {\n this.entry.startFetch().catch(() => {\n /* error captured on entry */\n })\n }, this.refetchInterval)\n }\n\n private stopIntervalTimer(): void {\n if (this.intervalTimer != null) {\n clearInterval(this.intervalTimer)\n this.intervalTimer = null\n }\n }\n\n /** See `ClientEntry.scheduleGcIfOrphan`. */\n scheduleGcIfOrphan(): void {\n if (this.subscriberCount > 0 || this.gcTimer != null) return\n if (this.gcTime === 0) {\n queueMicrotask(() => {\n if (this.subscriberCount === 0 && this.gcTimer == null) {\n this.client.dropInfiniteEntry(\n this as unknown as InfiniteClientEntry<unknown, unknown, unknown>,\n )\n }\n })\n return\n }\n this.gcTimer = setTimeout(() => {\n this.gcTimer = null\n this.client.dropInfiniteEntry(\n this as unknown as InfiniteClientEntry<unknown, unknown, unknown>,\n )\n }, this.gcTime)\n }\n\n dispose(): void {\n if (this.gcTimer != null) {\n clearTimeout(this.gcTimer)\n this.gcTimer = null\n }\n this.stopIntervalTimer()\n this.entry.dispose()\n }\n}\n\n/**\n * Per-root entry registry. Owns the keyed `Map<hash, ClientEntry>` per query,\n * GC timers, refetch-interval timers. Subscribers are routed in/out via\n * `acquire` / `release`.\n */\nexport class QueryClient {\n private readonly maps = new Map<AnyQuery, Map<string, ClientEntry<unknown>>>()\n private readonly infiniteMaps = new Map<\n AnyInfiniteQuery,\n Map<string, InfiniteClientEntry<unknown, unknown, unknown>>\n >()\n private readonly touchedQueries = new Set<AnyQuery>()\n private readonly touchedInfiniteQueries = new Set<AnyInfiniteQuery>()\n private readonly hydratedData = new Map<string, { data: unknown; lastUpdatedAt: number }>()\n /** Mutations inflight across the whole root — used by `waitForIdle`. */\n readonly mutationsInflight$: Signal<number> = signal(0)\n private onError: ErrorHandler | undefined\n private disposed = false\n /** Devtools bus, if any — passed by `createRoot`. Used to emit cache events. */\n readonly devtools: DevtoolsEmitter | undefined\n\n /** Root-level deps; passed to every `QuerySpec.fetcher` via `FetchCtx`. */\n readonly deps: Record<string, unknown>\n\n /** Root-wide defaults for refetch triggers; per-query spec overrides win. Spec §5.9. */\n readonly refetchOnWindowFocus: boolean\n readonly refetchOnReconnect: boolean\n\n /**\n * Installed plugins. Fired on every `setData` / `invalidate` / `gc` so\n * cross-tab / persistence-like layers can observe and react. SPEC §13.2.\n */\n private readonly plugins: QueryClientPlugin[]\n /**\n * Flipped to `true` while a remote-originated write (via\n * `applyRemoteSetData` / `applyRemoteInvalidate`) is being applied. The\n * resulting plugin events carry `isRemote: true` so plugins know to skip\n * rebroadcast.\n */\n private applyingRemote = false\n\n constructor(opts?: {\n onError?: ErrorHandler\n hydrate?: DehydratedState\n devtools?: DevtoolsEmitter\n deps?: Record<string, unknown>\n refetchOnWindowFocus?: boolean\n refetchOnReconnect?: boolean\n plugins?: QueryClientPlugin[]\n }) {\n this.onError = opts?.onError\n this.devtools = opts?.devtools\n this.deps = opts?.deps ?? {}\n this.refetchOnWindowFocus = opts?.refetchOnWindowFocus ?? false\n this.refetchOnReconnect = opts?.refetchOnReconnect ?? false\n this.plugins = opts?.plugins ?? []\n if (opts?.hydrate) this.hydrate(opts.hydrate)\n const api = this.makePluginApi()\n for (const plugin of this.plugins) {\n this.callPlugin(() => plugin.init?.(api))\n }\n }\n\n /**\n * Build the `QueryClientPluginApi` view that plugins receive at `init`\n * time. Closes over `this`; safe to hand out — plugins call back through\n * these methods to push remote-originated writes into the local cache.\n */\n private makePluginApi(): QueryClientPluginApi {\n const self = this\n return {\n applyRemoteSetData(queryId, keyArgs, data) {\n self.applyRemoteSetData(queryId, keyArgs, data)\n },\n applyRemoteInvalidate(queryId, keyArgs) {\n self.applyRemoteInvalidate(queryId, keyArgs)\n },\n subscribedKeys(queryId) {\n return self.subscribedKeysFor(queryId)\n },\n }\n }\n\n /** Invoke a plugin callback; route exceptions through `onError`. */\n private callPlugin(fn: () => void): void {\n try {\n fn()\n } catch (err) {\n dispatchError(this.onError, err, {\n kind: 'plugin',\n controllerPath: [],\n })\n }\n }\n\n private emitSetData(\n query: AnyQuery | AnyInfiniteQuery,\n keyArgs: readonly unknown[],\n data: unknown,\n kind: 'data' | 'infinite',\n ): void {\n if (this.plugins.length === 0) return\n const queryId = query.__spec.queryId\n if (queryId == null) return\n const event: SetDataEvent = {\n queryId,\n keyArgs,\n data,\n kind,\n isRemote: this.applyingRemote,\n }\n for (const plugin of this.plugins) {\n if (plugin.onSetData) {\n const cb = plugin.onSetData\n this.callPlugin(() => cb.call(plugin, event))\n }\n }\n }\n\n private emitInvalidate(\n query: AnyQuery | AnyInfiniteQuery,\n keyArgs: readonly unknown[],\n kind: 'data' | 'infinite',\n ): void {\n if (this.plugins.length === 0) return\n const queryId = query.__spec.queryId\n if (queryId == null) return\n const event: InvalidateEvent = {\n queryId,\n keyArgs,\n kind,\n isRemote: this.applyingRemote,\n }\n for (const plugin of this.plugins) {\n if (plugin.onInvalidate) {\n const cb = plugin.onInvalidate\n this.callPlugin(() => cb.call(plugin, event))\n }\n }\n }\n\n private emitGc(\n query: AnyQuery | AnyInfiniteQuery,\n keyArgs: readonly unknown[],\n kind: 'data' | 'infinite',\n ): void {\n if (this.plugins.length === 0) return\n const queryId = query.__spec.queryId\n if (queryId == null) return\n const event: GcEvent = { queryId, keyArgs, kind }\n for (const plugin of this.plugins) {\n if (plugin.onGc) {\n const cb = plugin.onGc\n this.callPlugin(() => cb.call(plugin, event))\n }\n }\n }\n\n /** Resolve `queryId → live entry-map keys`. Empty array when unknown. */\n private subscribedKeysFor(queryId: string): readonly (readonly unknown[])[] {\n // Defer the registry lookup to avoid an eager circular import — `define.ts`\n // imports `QueryClient` as a type, and we import the registry helper here\n // for runtime use only.\n const query = lookupRegisteredQuery(queryId)\n if (!query) return []\n const out: (readonly unknown[])[] = []\n if (query.__olas === 'query') {\n const map = this.maps.get(query as unknown as AnyQuery)\n if (map) for (const ce of map.values()) out.push(ce.keyArgs)\n } else {\n const map = this.infiniteMaps.get(query as unknown as AnyInfiniteQuery)\n if (map) for (const ce of map.values()) out.push(ce.keyArgs)\n }\n return out\n }\n\n /**\n * Apply a remote-originated `setData` for the query identified by\n * `queryId`, scoped to the entry already keyed by `keyArgs` in this\n * client. Goes through the underlying `Entry.setData` so subscribers see\n * the write; plugin `onSetData` fires with `isRemote: true`.\n *\n * Drops silently when:\n * - No query with that id is registered (the receiving tab hasn't\n * imported the module that defined it).\n * - The registered query is an infinite query (cross-tab infinite sync\n * is deferred — see `plugin.ts` `SetDataEvent.kind`).\n * - No local entry exists for that key (the receiving tab isn't\n * subscribed; nothing useful to write to without callArgs for a\n * future refetch).\n */\n applyRemoteSetData(queryId: string, keyArgs: readonly unknown[], data: unknown): void {\n const query = lookupRegisteredQuery(queryId)\n if (!query) return\n if (query.__olas !== 'query') return // infinite — deferred for v1\n const internal = query as unknown as AnyQuery\n const map = this.maps.get(internal)\n if (!map) return\n const hash = stableHash(keyArgs)\n const entry = map.get(hash)\n if (!entry) return\n this.applyingRemote = true\n try {\n entry.entry.setData(() => data as never)\n this.emitSetData(internal, entry.keyArgs, data, 'data')\n } finally {\n this.applyingRemote = false\n }\n }\n\n applyRemoteInvalidate(queryId: string, keyArgs: readonly unknown[]): void {\n const query = lookupRegisteredQuery(queryId)\n if (!query) return\n if (query.__olas !== 'query') return // infinite — deferred for v1\n const internal = query as unknown as AnyQuery\n const map = this.maps.get(internal)\n if (!map) return\n const hash = stableHash(keyArgs)\n const entry = map.get(hash)\n if (!entry) return\n this.applyingRemote = true\n try {\n // Emit AFTER kicking off invalidate so plugins reading entry state see\n // post-invalidation values, mirroring setData's emit-after-write order.\n entry.entry.invalidate().catch((err) => {\n dispatchError(this.onError, err, {\n kind: 'cache',\n controllerPath: [],\n queryKey: entry.keyArgs,\n })\n })\n this.emitInvalidate(internal, entry.keyArgs, 'data')\n } finally {\n this.applyingRemote = false\n }\n }\n\n hydrate(state: DehydratedState): void {\n if (state.version !== 1) return\n for (const entry of state.entries) {\n const hash = stableHash(entry.key)\n this.hydratedData.set(hash, {\n data: entry.data,\n lastUpdatedAt: entry.lastUpdatedAt,\n })\n }\n }\n\n /**\n * Snapshot every live cache entry (regular + infinite) as a flat list of\n * `DebugCacheEntry`. Exposed via `root.__debug.queryEntries()` for the\n * devtools cache inspector — shows current data and state, not past\n * fetch events. Spec §20.9.\n */\n queryEntriesSnapshot(): import('../devtools').DebugCacheEntry[] {\n const out: import('../devtools').DebugCacheEntry[] = []\n for (const map of this.maps.values()) {\n for (const ce of map.values()) {\n out.push({\n key: ce.keyArgs as readonly unknown[],\n status: ce.entry.status.peek(),\n data: ce.entry.data.peek(),\n error: ce.entry.error.peek(),\n lastUpdatedAt: ce.entry.lastUpdatedAt.peek(),\n isStale: ce.entry.isStale.peek(),\n isFetching: ce.entry.isFetching.peek(),\n hasPendingMutations: ce.entry.hasPendingMutations.peek(),\n })\n }\n }\n for (const map of this.infiniteMaps.values()) {\n for (const ce of map.values()) {\n out.push({\n key: ce.keyArgs as readonly unknown[],\n status: ce.entry.status.peek(),\n // Infinite entries carry an array of pages; expose them verbatim.\n data: ce.entry.pages.peek(),\n error: ce.entry.error.peek(),\n lastUpdatedAt: ce.entry.lastUpdatedAt.peek(),\n isStale: ce.entry.isStale.peek(),\n isFetching: ce.entry.isFetching.peek(),\n hasPendingMutations: ce.entry.hasPendingMutations.peek(),\n })\n }\n }\n return out\n }\n\n dehydrate(): DehydratedState {\n const entries: DehydratedState['entries'] = []\n for (const map of this.maps.values()) {\n for (const ce of map.values()) {\n if (ce.entry.status.peek() === 'success') {\n entries.push({\n key: ce.keyArgs,\n data: ce.entry.data.peek(),\n lastUpdatedAt: ce.entry.lastUpdatedAt.peek() ?? Date.now(),\n })\n }\n }\n }\n return { version: 1, entries }\n }\n\n async waitForIdle(): Promise<void> {\n for (let safety = 0; safety < 100; safety++) {\n const tasks: Promise<void>[] = []\n for (const map of this.maps.values()) {\n for (const ce of map.values()) {\n if (ce.entry.isFetching.peek()) {\n tasks.push(waitUntilFalse(ce.entry.isFetching))\n }\n }\n }\n for (const map of this.infiniteMaps.values()) {\n for (const ce of map.values()) {\n if (ce.entry.isFetching.peek()) {\n tasks.push(waitUntilFalse(ce.entry.isFetching))\n }\n }\n }\n if (this.mutationsInflight$.peek() > 0) {\n tasks.push(\n new Promise<void>((resolve) => {\n const unsub = this.mutationsInflight$.subscribe((v) => {\n if (v === 0) {\n unsub()\n resolve()\n }\n })\n }),\n )\n }\n if (tasks.length === 0) return\n await Promise.all(tasks)\n }\n }\n\n bindEntry<Args extends unknown[], T>(query: Query<Args, T>, args: Args): ClientEntry<T> {\n const internal = query as AnyQuery\n let map = this.maps.get(internal)\n if (!map) {\n map = new Map()\n this.maps.set(internal, map)\n this.touchedQueries.add(internal)\n internal.__clients.add(this)\n }\n const keyArgs = internal.__spec.key(...args)\n const hash = stableHash(keyArgs)\n let entry = map.get(hash) as ClientEntry<T> | undefined\n if (!entry) {\n const hydrated = this.hydratedData.get(hash) as { data: T; lastUpdatedAt: number } | undefined\n if (hydrated) this.hydratedData.delete(hash)\n entry = new ClientEntry<T>(this, internal, args, keyArgs, internal.__spec, hydrated)\n map.set(hash, entry as ClientEntry<unknown>)\n // The entry is created without an immediate subscriber (callers like\n // `prefetch`/`setData`/`invalidate` reach `bindEntry` first; subscribing\n // callers then call `acquire()` right after, which clears the gc timer).\n entry.scheduleGcIfOrphan()\n }\n return entry\n }\n\n dropEntry(entry: ClientEntry<unknown>): void {\n const map = this.maps.get(entry.query)\n if (!map) return\n const hash = stableHash(entry.keyArgs)\n if (map.get(hash) !== entry) return\n map.delete(hash)\n entry.dispose()\n if (map.size === 0) {\n this.maps.delete(entry.query)\n }\n if (__DEV__) {\n this.devtools?.emit({ type: 'cache:gc', queryKey: entry.keyArgs })\n }\n this.emitGc(entry.query, entry.keyArgs, 'data')\n }\n\n invalidate<Args extends unknown[]>(query: Query<Args, any>, args: Args): void {\n const internal = query as AnyQuery\n const map = this.maps.get(internal)\n if (!map) return\n const keyArgs = internal.__spec.key(...args)\n const hash = stableHash(keyArgs)\n const entry = map.get(hash)\n if (!entry) return\n if (__DEV__) {\n this.devtools?.emit({ type: 'cache:invalidated', queryKey: keyArgs })\n }\n entry.entry.invalidate().catch((err) => {\n dispatchError(this.onError, err, {\n kind: 'cache',\n controllerPath: [],\n queryKey: keyArgs,\n })\n })\n this.emitInvalidate(internal, keyArgs, 'data')\n }\n\n invalidateAll(query: Query<any, any>): void {\n const internal = query as AnyQuery\n const map = this.maps.get(internal)\n if (!map) return\n for (const [hash, entry] of map) {\n void hash\n if (__DEV__) {\n this.devtools?.emit({ type: 'cache:invalidated', queryKey: entry.keyArgs })\n }\n entry.entry.invalidate().catch((err) => {\n dispatchError(this.onError, err, {\n kind: 'cache',\n controllerPath: [],\n queryKey: entry.keyArgs,\n })\n })\n this.emitInvalidate(internal, entry.keyArgs, 'data')\n }\n }\n\n setData<Args extends unknown[], T>(\n query: Query<Args, T>,\n args: Args,\n updater: (prev: T | undefined) => T,\n ): Snapshot {\n const entry = this.bindEntry(query, args)\n const snapshot = entry.entry.setData(updater)\n // Read the post-update value to broadcast — plugins want the new state,\n // not the updater function (which would be uncloneable across\n // BroadcastChannel).\n this.emitSetData(entry.query, entry.keyArgs, entry.entry.data.peek(), 'data')\n return snapshot\n }\n\n bindInfiniteEntry<Args extends unknown[], TPage, TItem>(\n query: InfiniteQuery<Args, TPage, TItem>,\n args: Args,\n ): InfiniteClientEntry<TPage, TItem, unknown> {\n const internal = query as AnyInfiniteQuery\n let map = this.infiniteMaps.get(internal)\n if (!map) {\n map = new Map()\n this.infiniteMaps.set(internal, map)\n this.touchedInfiniteQueries.add(internal)\n internal.__clients.add(this)\n }\n const keyArgs = internal.__spec.key(...args)\n const hash = stableHash(keyArgs)\n let entry = map.get(hash) as InfiniteClientEntry<TPage, TItem, unknown> | undefined\n if (!entry) {\n entry = new InfiniteClientEntry<TPage, TItem, unknown>(\n this,\n internal,\n args,\n keyArgs,\n internal.__spec,\n )\n map.set(hash, entry as InfiniteClientEntry<unknown, unknown, unknown>)\n entry.scheduleGcIfOrphan()\n }\n return entry\n }\n\n dropInfiniteEntry(entry: InfiniteClientEntry<unknown, unknown, unknown>): void {\n const map = this.infiniteMaps.get(entry.query)\n if (!map) return\n const hash = stableHash(entry.keyArgs)\n if (map.get(hash) !== entry) return\n map.delete(hash)\n entry.dispose()\n if (map.size === 0) {\n this.infiniteMaps.delete(entry.query)\n }\n this.emitGc(entry.query, entry.keyArgs, 'infinite')\n }\n\n invalidateInfinite<Args extends unknown[]>(\n query: InfiniteQuery<Args, any, any>,\n args: Args,\n ): void {\n const internal = query as AnyInfiniteQuery\n const map = this.infiniteMaps.get(internal)\n if (!map) return\n const keyArgs = internal.__spec.key(...args)\n const hash = stableHash(keyArgs)\n const entry = map.get(hash)\n if (!entry) return\n entry.entry.invalidate().catch((err) => {\n dispatchError(this.onError, err, {\n kind: 'cache',\n controllerPath: [],\n queryKey: entry.keyArgs,\n })\n })\n this.emitInvalidate(internal, keyArgs, 'infinite')\n }\n\n invalidateAllInfinite(query: InfiniteQuery<any, any, any>): void {\n const internal = query as AnyInfiniteQuery\n const map = this.infiniteMaps.get(internal)\n if (!map) return\n for (const entry of map.values()) {\n entry.entry.invalidate().catch((err) => {\n dispatchError(this.onError, err, {\n kind: 'cache',\n controllerPath: [],\n queryKey: entry.keyArgs,\n })\n })\n this.emitInvalidate(internal, entry.keyArgs, 'infinite')\n }\n }\n\n setInfiniteData<Args extends unknown[], TPage>(\n query: InfiniteQuery<Args, TPage, any>,\n args: Args,\n updater: (prev: TPage[] | undefined) => TPage[],\n ): Snapshot {\n const entry = this.bindInfiniteEntry(query, args)\n const snapshot = entry.entry.setData(updater)\n this.emitSetData(entry.query, entry.keyArgs, entry.entry.pages.peek(), 'infinite')\n return snapshot\n }\n\n prefetchInfinite<Args extends unknown[], TPage>(\n query: InfiniteQuery<Args, TPage, any>,\n args: Args,\n ): Promise<TPage> {\n const entry = this.bindInfiniteEntry(query, args)\n // Acquire/release wraps the fetch so the entry isn't gc'd mid-flight by\n // the orphan-gc timer scheduled in `bindInfiniteEntry`.\n entry.acquire()\n const promise = (async () => {\n const status = entry.entry.status.peek()\n if (status === 'success' && !entry.entry.isStaleNow()) {\n return entry.entry.pages.peek()[0] as TPage\n }\n return entry.entry.startFetch()\n })()\n return promise.finally(() => entry.release())\n }\n\n prefetch<Args extends unknown[], T>(query: Query<Args, T>, args: Args): Promise<T> {\n const entry = this.bindEntry(query, args)\n entry.acquire()\n const promise = (async () => {\n const status = entry.entry.status.peek()\n if (status === 'success' && !entry.entry.isStaleNow()) {\n return entry.entry.data.peek() as T\n }\n if (entry.entry.isFetching.peek()) {\n return entry.entry.firstValue()\n }\n return entry.entry.startFetch()\n })()\n return promise.finally(() => entry.release())\n }\n\n inflightCount(): number {\n let count = 0\n for (const [, map] of this.maps) {\n for (const [, entry] of map) {\n if (entry.entry.isFetching.peek()) count++\n }\n }\n return count\n }\n\n dispose(): void {\n if (this.disposed) return\n this.disposed = true\n for (const map of this.maps.values()) {\n for (const entry of map.values()) {\n entry.dispose()\n }\n }\n this.maps.clear()\n for (const map of this.infiniteMaps.values()) {\n for (const entry of map.values()) {\n entry.dispose()\n }\n }\n this.infiniteMaps.clear()\n for (const q of this.touchedQueries) {\n q.__clients.delete(this)\n }\n this.touchedQueries.clear()\n for (const q of this.touchedInfiniteQueries) {\n q.__clients.delete(this)\n }\n this.touchedInfiniteQueries.clear()\n this.hydratedData.clear()\n for (const plugin of this.plugins) {\n if (plugin.dispose) {\n const cb = plugin.dispose\n this.callPlugin(() => cb.call(plugin))\n }\n }\n }\n}\n\nfunction waitUntilFalse(sig: {\n peek(): boolean\n subscribe(h: (v: boolean) => void): () => void\n}): Promise<void> {\n if (!sig.peek()) return Promise.resolve()\n return new Promise<void>((resolve) => {\n const unsub = sig.subscribe((v) => {\n if (!v) {\n unsub()\n resolve()\n }\n })\n })\n}\n","/**\n * Synchronous fan-out event bus. Handlers run in the order they subscribed.\n * Handlers added during emit don't fire for the current emission; handlers\n * removed during emit are skipped from that point in the iteration.\n *\n * `Emitter<void>` exposes `emit()` (no argument); other shapes expose\n * `emit(value: T)`.\n *\n * Spec §7, §20.6.\n */\nexport type Emitter<T> = {\n emit: [T] extends [void] ? () => void : (value: T) => void\n /** Subscribe to every emission. Returns the unsubscribe function. */\n on(handler: (value: T) => void): () => void\n /** Subscribe to the next emission only. Auto-unsubscribes after firing. */\n once(handler: (value: T) => void): () => void\n /** Tear down the emitter. Subsequent `emit` / `on` / `once` are no-ops. */\n dispose(): void\n}\n\ntype AnyHandler = (value: unknown) => void\n\nclass EmitterImpl<T> {\n private handlers = new Set<AnyHandler>()\n private disposed = false\n\n emit(value: T): void {\n if (this.disposed) return\n // Snapshot so a handler that unsubscribes itself (or another) doesn't\n // mutate the set mid-iteration.\n const snapshot = Array.from(this.handlers)\n for (const handler of snapshot) {\n handler(value as unknown)\n }\n }\n\n on(handler: (value: T) => void): () => void {\n if (this.disposed) return () => {}\n const wrapped = handler as AnyHandler\n this.handlers.add(wrapped)\n return () => {\n this.handlers.delete(wrapped)\n }\n }\n\n once(handler: (value: T) => void): () => void {\n if (this.disposed) return () => {}\n const wrapped: AnyHandler = (value) => {\n this.handlers.delete(wrapped)\n handler(value as T)\n }\n this.handlers.add(wrapped)\n return () => {\n this.handlers.delete(wrapped)\n }\n }\n\n dispose(): void {\n if (this.disposed) return\n this.disposed = true\n this.handlers.clear()\n }\n}\n\n/**\n * Create a standalone emitter. Handlers persist until explicitly unsubscribed\n * (or the emitter is disposed). Use this for emitters that live outside any\n * single controller — typically in deps. Use `ctx.emitter()` for emitters that\n * should auto-clean with a controller.\n */\nexport function createEmitter<T = void>(): Emitter<T> {\n const impl = new EmitterImpl<T>()\n return {\n emit: ((value?: T) => impl.emit(value as T)) as Emitter<T>['emit'],\n on: (handler) => impl.on(handler),\n once: (handler) => impl.once(handler),\n dispose: () => impl.dispose(),\n }\n}\n","import type { Field } from '../controller/types'\nimport type { DevtoolsEmitter } from '../devtools'\nimport {\n batch,\n type Computed,\n computed,\n effect,\n type ReadSignal,\n type Signal,\n signal,\n} from '../signals'\nimport { isAbortError } from '../utils'\nimport type { Validator } from './types'\n\n/**\n * Hook attached by `ctx.form` (or `createForm`) so a Field can publish\n * `field:validated` devtools events with its owning controller path + the\n * field's name within the form schema. See devtools §20.9 and FieldImpl.bind.\n */\nexport type FieldDevtoolsOwner = {\n controllerPath: readonly string[]\n fieldName: string\n emitter: DevtoolsEmitter\n}\n\nclass FieldImpl<T> implements Field<T> {\n private readonly value$: Signal<T>\n private readonly errors$: Signal<string[]>\n private readonly touched$: Signal<boolean>\n private readonly dirty$: Signal<boolean>\n private readonly validating$: Signal<boolean>\n private readonly isValid$: Computed<boolean>\n private readonly revalidateTrigger$: Signal<number>\n\n private readonly validators: ReadonlyArray<Validator<T>>\n /** The value `reset()` returns to. Mutated by `setAsInitial()` so a form\n * initialized from server data resets to *that* data, not the empty seed. */\n private initial: T\n private validatorDispose: (() => void) | null = null\n private currentAbort: AbortController | null = null\n private runId = 0\n private disposed = false\n private devtoolsOwner: FieldDevtoolsOwner | null = null\n\n constructor(initial: T, validators: ReadonlyArray<Validator<T>> = []) {\n this.initial = initial\n this.validators = validators\n this.value$ = signal(initial)\n this.errors$ = signal<string[]>([])\n this.touched$ = signal(false)\n this.dirty$ = signal(false)\n this.validating$ = signal(false)\n this.revalidateTrigger$ = signal(0)\n this.isValid$ = computed(() => this.errors$.value.length === 0 && !this.validating$.value)\n\n if (validators.length > 0) {\n this.validatorDispose = effect(() => {\n this.runValidators()\n })\n }\n }\n\n // --- ReadSignal<T> ---\n get value(): T {\n return this.value$.value\n }\n\n peek(): T {\n return this.value$.peek()\n }\n\n subscribe(handler: (value: T) => void): () => void {\n return this.value$.subscribe(handler)\n }\n\n // --- Field-only signals ---\n get errors(): ReadSignal<string[]> {\n return this.errors$\n }\n\n get isValid(): ReadSignal<boolean> {\n return this.isValid$\n }\n\n get isDirty(): ReadSignal<boolean> {\n return this.dirty$\n }\n\n get touched(): ReadSignal<boolean> {\n return this.touched$\n }\n\n get isValidating(): ReadSignal<boolean> {\n return this.validating$\n }\n\n // --- mutating methods ---\n set(value: T): void {\n if (this.disposed) return\n this.value$.set(value)\n this.dirty$.set(true)\n }\n\n /**\n * Reseat the field as if this value had been its constructor `initial`.\n * Sets the value, re-anchors `reset()`'s target, and does NOT mark dirty.\n * Used by `Form` when applying its own `initial` (in the constructor and\n * on `reset()`), so server-loaded forms don't start dirty. Internal-ish —\n * exposed for `Form`'s use, not for user code that just wants to write.\n */\n setAsInitial(value: T): void {\n if (this.disposed) return\n this.initial = value\n batch(() => {\n this.value$.set(value)\n this.dirty$.set(false)\n })\n }\n\n reset(): void {\n if (this.disposed) return\n this.currentAbort?.abort()\n this.currentAbort = null\n batch(() => {\n this.value$.set(this.initial)\n this.dirty$.set(false)\n this.touched$.set(false)\n this.errors$.set([])\n this.validating$.set(false)\n })\n }\n\n markTouched(): void {\n if (this.disposed) return\n this.touched$.set(true)\n }\n\n async revalidate(): Promise<boolean> {\n if (this.disposed) return this.isValid$.peek()\n // Bump the trigger to force re-run.\n this.revalidateTrigger$.update((n) => n + 1)\n await this.waitUntilSettled()\n return this.isValid$.peek()\n }\n\n dispose(): void {\n if (this.disposed) return\n this.disposed = true\n this.validatorDispose?.()\n this.validatorDispose = null\n this.currentAbort?.abort()\n this.currentAbort = null\n this.devtoolsOwner = null\n }\n\n /**\n * Bind this field to a devtools owner. Each subsequent validation pass\n * publishes a `field:validated` event with the supplied path + name.\n * Idempotent — calling again replaces the owner. Internal: called by\n * `createForm` / `createFieldArray` so the form's keys reach the panel.\n */\n bindDevtoolsOwner(owner: FieldDevtoolsOwner | null): void {\n this.devtoolsOwner = owner\n }\n\n private emitValidated(valid: boolean, errors: readonly string[]): void {\n if (!__DEV__) return\n const owner = this.devtoolsOwner\n if (owner === null) return\n owner.emitter.emit({\n type: 'field:validated',\n path: owner.controllerPath,\n field: owner.fieldName,\n valid,\n errors: [...errors],\n })\n }\n\n // --- internal ---\n private async waitUntilSettled(): Promise<void> {\n // If a validation pass is in progress, wait for validating$ to become false.\n if (!this.validating$.peek()) return\n await new Promise<void>((resolve) => {\n const unsub = this.validating$.subscribe((v) => {\n if (!v) {\n unsub()\n resolve()\n }\n })\n })\n }\n\n private runValidators(): void {\n if (this.disposed) return\n\n // Track value and revalidate trigger.\n const value = this.value$.value\n void this.revalidateTrigger$.value\n\n // Abort previous in-flight run.\n this.currentAbort?.abort()\n const abort = new AbortController()\n this.currentAbort = abort\n const myId = ++this.runId\n\n const syncErrors: string[] = []\n const asyncPromises: Promise<string | null>[] = []\n\n for (const validator of this.validators) {\n const result = validator(value, abort.signal)\n if (result instanceof Promise) {\n asyncPromises.push(result)\n } else if (result != null) {\n syncErrors.push(result)\n }\n }\n\n if (syncErrors.length > 0) {\n batch(() => {\n this.errors$.set(syncErrors)\n this.validating$.set(false)\n })\n this.emitValidated(false, syncErrors)\n return\n }\n\n if (asyncPromises.length === 0) {\n batch(() => {\n this.errors$.set([])\n this.validating$.set(false)\n })\n this.emitValidated(true, [])\n return\n }\n\n batch(() => {\n this.errors$.set([])\n this.validating$.set(true)\n })\n\n Promise.allSettled(asyncPromises).then((results) => {\n if (myId !== this.runId || this.disposed) return\n const asyncErrors: string[] = []\n for (const r of results) {\n if (r.status === 'fulfilled') {\n if (r.value != null) asyncErrors.push(r.value)\n } else if (!isAbortError(r.reason)) {\n const msg = r.reason instanceof Error ? r.reason.message : String(r.reason)\n asyncErrors.push(msg)\n }\n }\n batch(() => {\n this.errors$.set(asyncErrors)\n this.validating$.set(false)\n })\n this.emitValidated(asyncErrors.length === 0, asyncErrors)\n })\n }\n}\n\n/**\n * Internal — type guard / accessor for the binding hook. Avoids exposing\n * `bindDevtoolsOwner` on the public `Field<T>` type while letting `createForm`\n * call it via a structural check.\n */\nexport function bindFieldDevtoolsOwner<T>(field: Field<T>, owner: FieldDevtoolsOwner | null): void {\n const impl = field as { bindDevtoolsOwner?: (o: FieldDevtoolsOwner | null) => void }\n if (typeof impl.bindDevtoolsOwner === 'function') {\n impl.bindDevtoolsOwner(owner)\n }\n}\n\nexport function createField<T>(initial: T, validators?: ReadonlyArray<Validator<T>>): Field<T> {\n return new FieldImpl(initial, validators)\n}\n\n/**\n * Wrap an async validator with a debounce. The debounce timer resets on every\n * value change. While debouncing or the request is in flight, the field's\n * `isValidating` is true and `isValid` is false (treat-as-invalid-until-proven-valid).\n */\nexport function debouncedValidator<T>(\n fn: (value: T, signal: AbortSignal) => Promise<string | null>,\n ms: number,\n): Validator<T> {\n return (value, signal) =>\n new Promise<string | null>((resolve, reject) => {\n if (signal.aborted) {\n reject(new DOMException('Aborted', 'AbortError'))\n return\n }\n const timer = setTimeout(() => {\n signal.removeEventListener('abort', onAbort)\n fn(value, signal).then(resolve, reject)\n }, ms)\n const onAbort = () => {\n clearTimeout(timer)\n signal.removeEventListener('abort', onAbort)\n reject(new DOMException('Aborted', 'AbortError'))\n }\n signal.addEventListener('abort', onAbort, { once: true })\n })\n}\n","import type { Field } from '../controller/types'\nimport { batch, computed, effect, type Signal, signal, untracked } from '../signals'\nimport type { ReadSignal } from '../signals/types'\nimport { bindFieldDevtoolsOwner, createField } from './field'\nimport type {\n DeepPartial,\n FieldArray,\n FieldArrayItemErrors,\n FieldArrayOptions,\n FieldArrayValidator,\n FieldArrayValue,\n Form,\n FormErrors,\n FormOptions,\n FormSchema,\n FormValidator,\n FormValue,\n ItemInitial,\n} from './form-types'\n\nconst FORM_BRAND = Symbol.for('olas.form')\nconst FIELD_ARRAY_BRAND = Symbol.for('olas.fieldArray')\n\nconst isForm = (x: unknown): x is Form<FormSchema> =>\n typeof x === 'object' && x !== null && (x as Record<symbol, unknown>)[FORM_BRAND] === true\n\nconst isFieldArray = (x: unknown): x is FieldArray<Field<unknown> | Form<FormSchema>> =>\n typeof x === 'object' && x !== null && (x as Record<symbol, unknown>)[FIELD_ARRAY_BRAND] === true\n\nconst isField = (x: unknown): x is Field<unknown> =>\n typeof x === 'object' && x !== null && !isForm(x) && !isFieldArray(x)\n\nclass FormImpl<S extends FormSchema> implements Form<S> {\n readonly [FORM_BRAND] = true\n\n readonly fields: S\n readonly value: ReadSignal<FormValue<S>>\n readonly errors: ReadSignal<FormErrors<S>>\n readonly isValid: ReadSignal<boolean>\n readonly isDirty: ReadSignal<boolean>\n readonly touched: ReadSignal<boolean>\n readonly isValidating: ReadSignal<boolean>\n readonly flatErrors: ReadSignal<Array<{ path: string; errors: string[] }>>\n\n private readonly topLevelErrors$: Signal<string[]> = signal([])\n readonly topLevelErrors: ReadSignal<string[]> = this.topLevelErrors$\n private readonly topLevelValidating$: Signal<boolean> = signal(false)\n\n private readonly validators: ReadonlyArray<FormValidator<S>>\n private readonly options: FormOptions<S> | undefined\n private validatorDispose: (() => void) | null = null\n private currentValidatorRun = 0\n private currentValidatorAbort: AbortController | null = null\n private disposed = false\n\n constructor(schema: S, options?: FormOptions<S>) {\n this.fields = schema\n this.options = options\n this.validators = options?.validators ?? []\n\n // Apply initial values (one-shot or initial snapshot from a function).\n // `asInitial: true` flag tells leaf fields to set their value AND re-anchor\n // their `reset()` target without marking themselves dirty.\n if (options?.initial !== undefined) {\n const ini = typeof options.initial === 'function' ? options.initial() : options.initial\n if (ini !== undefined) this.applyPartial(ini as DeepPartial<FormValue<S>>, true)\n }\n\n this.value = computed(() => this.computeValue())\n this.errors = computed(() => this.computeErrors())\n this.isDirty = computed(() => this.computeBool('isDirty'))\n this.touched = computed(() => this.computeBool('touched'))\n this.isValidating = computed(() => {\n if (this.topLevelValidating$.value) return true\n for (const child of Object.values(this.fields)) {\n if ((child as { isValidating: ReadSignal<boolean> }).isValidating.value) return true\n }\n return false\n })\n this.isValid = computed(() => {\n if (this.topLevelErrors$.value.length > 0) return false\n if (this.isValidating.value) return false\n for (const child of Object.values(this.fields)) {\n if (!(child as { isValid: ReadSignal<boolean> }).isValid.value) return false\n }\n return true\n })\n this.flatErrors = computed(() => this.computeFlatErrors())\n\n if (this.validators.length > 0) {\n this.validatorDispose = effect(() => this.runTopLevelValidators())\n }\n }\n\n private computeValue(): FormValue<S> {\n const out: Record<string, unknown> = {}\n for (const [k, child] of Object.entries(this.fields)) {\n if (isForm(child) || isFieldArray(child)) {\n out[k] = (child as { value: ReadSignal<unknown> }).value.value\n } else {\n // Field<T> is itself a ReadSignal<T>; .value returns T (tracked).\n out[k] = (child as Field<unknown>).value\n }\n }\n return out as FormValue<S>\n }\n\n private computeErrors(): FormErrors<S> {\n const out: Record<string, unknown> = {}\n for (const [k, child] of Object.entries(this.fields)) {\n if (isForm(child)) {\n out[k] = child.errors.value\n } else if (isFieldArray(child)) {\n out[k] = child.errors.value\n } else {\n const errs = (child as Field<unknown>).errors.value\n out[k] = errs.length > 0 ? errs : undefined\n }\n }\n return out as FormErrors<S>\n }\n\n private computeBool(key: 'isDirty' | 'touched'): boolean {\n for (const child of Object.values(this.fields)) {\n const sig = (child as unknown as Record<string, ReadSignal<boolean>>)[key]\n if (sig?.value) return true\n }\n return false\n }\n\n private computeFlatErrors(): Array<{ path: string; errors: string[] }> {\n const out: Array<{ path: string; errors: string[] }> = []\n const tle = this.topLevelErrors$.value\n if (tle.length > 0) out.push({ path: '', errors: tle })\n walkErrors(this.fields, '', out)\n return out\n }\n\n set(partial: DeepPartial<FormValue<S>>): void {\n if (this.disposed) return\n batch(() => this.applyPartial(partial, false))\n }\n\n private applyPartial(partial: DeepPartial<FormValue<S>>, asInitial: boolean): void {\n for (const [k, val] of Object.entries(partial)) {\n const child = (this.fields as Record<string, unknown>)[k]\n if (!child) continue\n if (isForm(child)) {\n // Nested form: recurse via its own `set` (user) or rebuild via reset\n // through the same `applyPartial`-with-`asInitial` flag (initial).\n if (asInitial) {\n ;(child as Form<FormSchema>).resetWithInitial(val as DeepPartial<FormValue<FormSchema>>)\n } else {\n child.set(val as DeepPartial<FormValue<FormSchema>>)\n }\n } else if (isFieldArray(child)) {\n const arr = child\n // Replace items: clear, then add each\n arr.clear()\n for (const itemVal of val as unknown[]) {\n arr.add(itemVal as ItemInitial<Field<unknown>>)\n }\n } else {\n const f = child as Field<unknown>\n if (asInitial) f.setAsInitial(val)\n else f.set(val)\n }\n }\n }\n\n /** Internal: re-seat this form's leaves from `partial` as their new initial. */\n resetWithInitial(partial: DeepPartial<FormValue<S>>): void {\n if (this.disposed) return\n batch(() => this.applyPartial(partial, true))\n }\n\n reset(): void {\n if (this.disposed) return\n batch(() => {\n for (const child of Object.values(this.fields)) {\n if (isForm(child) || isFieldArray(child)) {\n ;(child as { reset: () => void }).reset()\n } else {\n ;(child as Field<unknown>).reset()\n }\n }\n this.topLevelErrors$.set([])\n })\n // Re-apply initial if provided — as initial (no dirty bump).\n if (this.options?.initial !== undefined) {\n const ini =\n typeof this.options.initial === 'function' ? this.options.initial() : this.options.initial\n if (ini !== undefined) this.applyPartial(ini as DeepPartial<FormValue<S>>, true)\n }\n }\n\n markAllTouched(): void {\n if (this.disposed) return\n for (const child of Object.values(this.fields)) {\n if (isForm(child)) child.markAllTouched()\n else if (isFieldArray(child)) child.markAllTouched()\n else (child as Field<unknown>).markTouched()\n }\n }\n\n async validate(): Promise<boolean> {\n if (this.disposed) return this.isValid.peek()\n const tasks: Promise<unknown>[] = []\n for (const child of Object.values(this.fields)) {\n if (isForm(child) || isFieldArray(child)) {\n tasks.push((child as { validate: () => Promise<boolean> }).validate())\n } else {\n tasks.push((child as Field<unknown>).revalidate())\n }\n }\n await Promise.all(tasks)\n // Wait for top-level validators to finish.\n if (this.topLevelValidating$.peek()) {\n await new Promise<void>((resolve) => {\n const unsub = this.topLevelValidating$.subscribe((v) => {\n if (!v) {\n unsub()\n resolve()\n }\n })\n })\n }\n return this.isValid.peek()\n }\n\n dispose(): void {\n if (this.disposed) return\n this.disposed = true\n this.validatorDispose?.()\n this.currentValidatorAbort?.abort()\n for (const child of Object.values(this.fields)) {\n ;(child as { dispose?: () => void }).dispose?.()\n }\n }\n\n private runTopLevelValidators(): void {\n if (this.disposed) return\n const value = this.value.value\n this.currentValidatorAbort?.abort()\n const abort = new AbortController()\n this.currentValidatorAbort = abort\n const myId = ++this.currentValidatorRun\n\n const syncErrors: string[] = []\n const asyncPromises: Promise<string | null>[] = []\n for (const v of this.validators) {\n const r = v(value, abort.signal)\n if (r instanceof Promise) asyncPromises.push(r)\n else if (r != null) syncErrors.push(r)\n }\n\n if (syncErrors.length > 0) {\n batch(() => {\n this.topLevelErrors$.set(syncErrors)\n this.topLevelValidating$.set(false)\n })\n return\n }\n\n if (asyncPromises.length === 0) {\n batch(() => {\n this.topLevelErrors$.set([])\n this.topLevelValidating$.set(false)\n })\n return\n }\n\n batch(() => {\n this.topLevelErrors$.set([])\n this.topLevelValidating$.set(true)\n })\n\n Promise.allSettled(asyncPromises).then((results) => {\n if (myId !== this.currentValidatorRun || this.disposed) return\n const errs: string[] = []\n for (const r of results) {\n if (r.status === 'fulfilled' && r.value != null) errs.push(r.value)\n }\n batch(() => {\n this.topLevelErrors$.set(errs)\n this.topLevelValidating$.set(false)\n })\n })\n }\n}\n\nfunction walkErrors(\n fields: FormSchema,\n prefix: string,\n out: Array<{ path: string; errors: string[] }>,\n): void {\n for (const [k, child] of Object.entries(fields)) {\n const path = prefix ? `${prefix}.${k}` : k\n if (isForm(child)) {\n const tle = child.topLevelErrors.value\n if (tle.length > 0) out.push({ path, errors: tle })\n walkErrors(child.fields, path, out)\n } else if (isFieldArray(child)) {\n const tle = child.topLevelErrors.value\n if (tle.length > 0) out.push({ path, errors: tle })\n const items = child.items.value\n items.forEach((item, idx) => {\n const itemPath = `${path}[${idx}]`\n if (isForm(item)) {\n const itle = item.topLevelErrors.value\n if (itle.length > 0) out.push({ path: itemPath, errors: itle })\n walkErrors(item.fields, itemPath, out)\n } else {\n const errs = (item as Field<unknown>).errors.value\n if (errs.length > 0) out.push({ path: itemPath, errors: errs })\n }\n })\n } else {\n const errs = (child as Field<unknown>).errors.value\n if (errs.length > 0) out.push({ path, errors: errs })\n }\n }\n}\n\nclass FieldArrayImpl<I extends Field<any> | Form<any>> implements FieldArray<I> {\n readonly [FIELD_ARRAY_BRAND] = true\n\n readonly items: ReadSignal<ReadonlyArray<I>>\n readonly value: ReadSignal<FieldArrayValue<I>>\n readonly errors: ReadSignal<Array<FieldArrayItemErrors<I> | undefined>>\n readonly size: ReadSignal<number>\n readonly isValid: ReadSignal<boolean>\n readonly isDirty: ReadSignal<boolean>\n readonly touched: ReadSignal<boolean>\n readonly isValidating: ReadSignal<boolean>\n\n private readonly items$: Signal<I[]>\n private readonly topLevelErrors$: Signal<string[]> = signal([])\n readonly topLevelErrors: ReadSignal<string[]> = this.topLevelErrors$\n private readonly topLevelValidating$: Signal<boolean> = signal(false)\n\n private readonly itemFactory: (initial?: ItemInitial<I>) => I\n private readonly initialItems: Array<ItemInitial<I>> = []\n private readonly validators: ReadonlyArray<FieldArrayValidator<I>>\n private currentValidatorRun = 0\n private currentValidatorAbort: AbortController | null = null\n private validatorDispose: (() => void) | null = null\n private disposed = false\n\n constructor(itemFactory: (initial?: ItemInitial<I>) => I, options?: FieldArrayOptions<I>) {\n this.itemFactory = itemFactory\n this.validators = options?.validators ?? []\n this.items$ = signal<I[]>([])\n if (options?.initial) {\n this.initialItems = options.initial\n for (const ini of options.initial) {\n this.items$.peek().push(itemFactory(ini))\n }\n // re-set to trigger subscribers\n this.items$.set([...this.items$.peek()])\n }\n\n this.items = this.items$\n this.size = computed(() => this.items$.value.length)\n this.value = computed(\n () =>\n this.items$.value.map((item) => {\n if (isForm(item)) return item.value.value\n // Field is a ReadSignal — `.value` is the actual value.\n return (item as Field<unknown>).value\n }) as FieldArrayValue<I>,\n )\n this.errors = computed(() =>\n this.items$.value.map((item) => {\n if (isForm(item)) return item.errors.value as FieldArrayItemErrors<I>\n const errs = (item as Field<unknown>).errors.value\n return (errs.length > 0 ? errs : undefined) as FieldArrayItemErrors<I> | undefined\n }),\n )\n this.isDirty = computed(() => {\n for (const item of this.items$.value) {\n if ((item as { isDirty: ReadSignal<boolean> }).isDirty.value) return true\n }\n return false\n })\n this.touched = computed(() => {\n for (const item of this.items$.value) {\n if ((item as { touched: ReadSignal<boolean> }).touched.value) return true\n }\n return false\n })\n this.isValidating = computed(() => {\n if (this.topLevelValidating$.value) return true\n for (const item of this.items$.value) {\n if ((item as { isValidating: ReadSignal<boolean> }).isValidating.value) return true\n }\n return false\n })\n this.isValid = computed(() => {\n if (this.topLevelErrors$.value.length > 0) return false\n if (this.isValidating.value) return false\n for (const item of this.items$.value) {\n if (!(item as { isValid: ReadSignal<boolean> }).isValid.value) return false\n }\n return true\n })\n\n if (this.validators.length > 0) {\n this.validatorDispose = effect(() => this.runTopLevelValidators())\n }\n }\n\n at(index: number): I | undefined {\n return this.items$.peek()[index]\n }\n\n add(initial?: ItemInitial<I>): void {\n if (this.disposed) return\n const item = this.itemFactory(initial)\n this.items$.set([...this.items$.peek(), item])\n }\n\n insert(index: number, initial?: ItemInitial<I>): void {\n if (this.disposed) return\n const item = this.itemFactory(initial)\n const next = [...this.items$.peek()]\n next.splice(index, 0, item)\n this.items$.set(next)\n }\n\n remove(index: number): void {\n if (this.disposed) return\n const next = [...this.items$.peek()]\n const [removed] = next.splice(index, 1)\n if (removed) {\n ;(removed as { dispose?: () => void }).dispose?.()\n }\n this.items$.set(next)\n }\n\n move(from: number, to: number): void {\n if (this.disposed) return\n const next = [...this.items$.peek()]\n const [item] = next.splice(from, 1)\n if (item) next.splice(to, 0, item)\n this.items$.set(next)\n }\n\n clear(): void {\n if (this.disposed) return\n for (const item of this.items$.peek()) {\n ;(item as { dispose?: () => void }).dispose?.()\n }\n this.items$.set([])\n }\n\n reset(): void {\n if (this.disposed) return\n batch(() => {\n this.clear()\n for (const ini of this.initialItems) {\n this.add(ini)\n }\n this.topLevelErrors$.set([])\n })\n }\n\n markAllTouched(): void {\n for (const item of this.items$.peek()) {\n if (isForm(item)) item.markAllTouched()\n else (item as Field<unknown>).markTouched()\n }\n }\n\n async validate(): Promise<boolean> {\n if (this.disposed) return this.isValid.peek()\n const tasks: Promise<unknown>[] = []\n for (const item of this.items$.peek()) {\n if (isForm(item)) tasks.push(item.validate())\n else tasks.push((item as Field<unknown>).revalidate())\n }\n await Promise.all(tasks)\n if (this.topLevelValidating$.peek()) {\n await new Promise<void>((resolve) => {\n const unsub = this.topLevelValidating$.subscribe((v) => {\n if (!v) {\n unsub()\n resolve()\n }\n })\n })\n }\n return this.isValid.peek()\n }\n\n dispose(): void {\n if (this.disposed) return\n this.disposed = true\n this.validatorDispose?.()\n this.currentValidatorAbort?.abort()\n for (const item of this.items$.peek()) {\n ;(item as { dispose?: () => void }).dispose?.()\n }\n }\n\n private runTopLevelValidators(): void {\n if (this.disposed) return\n const value = this.value.value\n this.currentValidatorAbort?.abort()\n const abort = new AbortController()\n this.currentValidatorAbort = abort\n const myId = ++this.currentValidatorRun\n\n const syncErrors: string[] = []\n const asyncPromises: Promise<string | null>[] = []\n for (const v of this.validators) {\n const r = v(value, abort.signal)\n if (r instanceof Promise) asyncPromises.push(r)\n else if (r != null) syncErrors.push(r)\n }\n\n if (syncErrors.length > 0) {\n batch(() => {\n this.topLevelErrors$.set(syncErrors)\n this.topLevelValidating$.set(false)\n })\n return\n }\n\n if (asyncPromises.length === 0) {\n batch(() => {\n this.topLevelErrors$.set([])\n this.topLevelValidating$.set(false)\n })\n return\n }\n\n batch(() => {\n this.topLevelErrors$.set([])\n this.topLevelValidating$.set(true)\n })\n\n Promise.allSettled(asyncPromises).then((results) => {\n if (myId !== this.currentValidatorRun || this.disposed) return\n const errs: string[] = []\n for (const r of results) {\n if (r.status === 'fulfilled' && r.value != null) errs.push(r.value)\n }\n batch(() => {\n this.topLevelErrors$.set(errs)\n this.topLevelValidating$.set(false)\n })\n })\n }\n}\n\nexport function createForm<S extends FormSchema>(schema: S, options?: FormOptions<S>): Form<S> {\n return new FormImpl(schema, options)\n}\n\nexport function createFieldArray<I extends Field<any> | Form<any>>(\n itemFactory: (initial?: ItemInitial<I>) => I,\n options?: FieldArrayOptions<I>,\n): FieldArray<I> {\n return new FieldArrayImpl<I>(itemFactory, options)\n}\n\n/**\n * Recursively wire every leaf `Field` in a form / field-array tree to a\n * devtools emitter. Returns a single disposer that tears down every standalone\n * `effect()` registered along the way (used for FieldArray watching), so the\n * caller — `ctx.form` / `ctx.fieldArray` in the controller — can register one\n * cleanup entry and have the whole subtree's reactive work die with the\n * controller. Spec §20.9.\n */\nexport function bindTreeToDevtools(\n node: Field<unknown> | Form<FormSchema> | FieldArray<Field<unknown> | Form<FormSchema>>,\n prefix: string,\n controllerPath: readonly string[],\n emitter: import('../devtools').DevtoolsEmitter,\n): () => void {\n const disposers: Array<() => void> = []\n bindTreeToDevtoolsInto(node, prefix, controllerPath, emitter, disposers)\n return () => {\n for (const d of disposers) {\n try {\n d()\n } catch {\n // Disposer failures must not break sibling cleanup.\n }\n }\n disposers.length = 0\n }\n}\n\nfunction bindTreeToDevtoolsInto(\n node: Field<unknown> | Form<FormSchema> | FieldArray<Field<unknown> | Form<FormSchema>>,\n prefix: string,\n controllerPath: readonly string[],\n emitter: import('../devtools').DevtoolsEmitter,\n disposers: Array<() => void>,\n): void {\n if (isForm(node)) {\n for (const [key, child] of Object.entries(node.fields)) {\n bindTreeToDevtoolsInto(\n child,\n prefix === '' ? key : `${prefix}.${key}`,\n controllerPath,\n emitter,\n disposers,\n )\n }\n return\n }\n if (isFieldArray(node)) {\n // Re-bind on every items change so dynamically-added entries get tracked.\n // `effect()` returns its own disposer; capture it so the controller can\n // tear it down on dispose (otherwise dynamic forms leak reactive work).\n const arr = node as FieldArray<Field<unknown> | Form<FormSchema>>\n const stop = effect(() => {\n const items = arr.items.value\n items.forEach((item, idx) => {\n bindTreeToDevtoolsInto(item, `${prefix}[${idx}]`, controllerPath, emitter, disposers)\n })\n })\n disposers.push(stop)\n return\n }\n // Leaf Field.\n bindFieldDevtoolsOwner(node as Field<unknown>, {\n controllerPath,\n fieldName: prefix,\n emitter,\n })\n}\n\n// Quiet unused-import linter without exporting these symbols publicly.\nvoid createField\nvoid untracked\nvoid isField\n","import { effect, untracked } from '../signals'\nimport type { ReadSignal } from '../signals/types'\nimport { Entry } from './entry'\nimport type { LocalCache, Snapshot } from './types'\n\nexport type LocalCacheOptions<T> = {\n key?: () => readonly unknown[]\n staleTime?: number\n keepPreviousData?: boolean\n initialData?: T | undefined\n}\n\nclass LocalCacheImpl<T> implements LocalCache<T> {\n private readonly entry: Entry<T>\n private keyEffectDispose: (() => void) | null = null\n private disposed = false\n private readonly keepPreviousData: boolean\n private lastSucceededFor: unknown[] | null = null\n\n constructor(fetcher: (signal: AbortSignal) => Promise<T>, options: LocalCacheOptions<T>) {\n this.keepPreviousData = options.keepPreviousData ?? false\n this.entry = new Entry<T>({\n fetcher: () => fetcher,\n staleTime: options.staleTime ?? 0,\n initialData: options.initialData,\n })\n\n if (options.key) {\n const keyFn = options.key\n this.keyEffectDispose = effect(() => {\n // Track keys.\n const keyArgs = keyFn() as unknown[]\n untracked(() => {\n if (!this.keepPreviousData) {\n // Reset data on key change so consumers see \"loading\" rather than\n // the previous key's stale value.\n if (this.lastSucceededFor != null && !arraysEqual(this.lastSucceededFor, keyArgs)) {\n this.entry.data.set(undefined)\n }\n }\n this.entry.startFetch().then(\n () => {\n this.lastSucceededFor = [...keyArgs]\n },\n () => {\n /* error already captured on entry */\n },\n )\n })\n })\n } else {\n this.entry.startFetch().catch(() => {\n /* error already captured on entry */\n })\n }\n }\n\n get data(): ReadSignal<T | undefined> {\n return this.entry.data\n }\n get error(): ReadSignal<unknown | undefined> {\n return this.entry.error\n }\n get status(): ReadSignal<'idle' | 'pending' | 'success' | 'error'> {\n return this.entry.status\n }\n get isLoading(): ReadSignal<boolean> {\n return this.entry.isLoading\n }\n get isFetching(): ReadSignal<boolean> {\n return this.entry.isFetching\n }\n get isStale(): ReadSignal<boolean> {\n return this.entry.isStale\n }\n get lastUpdatedAt(): ReadSignal<number | undefined> {\n return this.entry.lastUpdatedAt\n }\n get hasPendingMutations(): ReadSignal<boolean> {\n return this.entry.hasPendingMutations\n }\n\n refetch = (): Promise<T> => this.entry.refetch()\n reset = (): void => this.entry.reset()\n firstValue = (): Promise<T> => this.entry.firstValue()\n invalidate = (): void => {\n this.entry.invalidate().catch(() => {})\n }\n setData = (updater: (prev: T | undefined) => T): Snapshot => this.entry.setData(updater)\n\n dispose(): void {\n if (this.disposed) return\n this.disposed = true\n this.keyEffectDispose?.()\n this.keyEffectDispose = null\n this.entry.dispose()\n }\n}\n\nexport function createLocalCache<T>(\n fetcher: (signal: AbortSignal) => Promise<T>,\n options?: LocalCacheOptions<T>,\n): LocalCache<T> {\n return new LocalCacheImpl(fetcher, options ?? {})\n}\n\nfunction arraysEqual(a: readonly unknown[], b: readonly unknown[]): boolean {\n if (a.length !== b.length) return false\n for (let i = 0; i < a.length; i++) {\n if (!Object.is(a[i], b[i])) return false\n }\n return true\n}\n","import type { DevtoolsEmitter } from '../devtools'\nimport { dispatchError, type ErrorHandler } from '../errors'\nimport { batch, type Signal, signal } from '../signals'\nimport type { ReadSignal } from '../signals/types'\nimport { isAbortError } from '../utils'\nimport type { RetryDelay, RetryPolicy, Snapshot } from './types'\n\n/**\n * How concurrent calls to `mutation.run(...)` interact:\n * - `parallel` (default): every call runs concurrently.\n * - `latest-wins`: a new call aborts any in-flight previous call (`AbortSignal` fires).\n * - `serial`: calls queue and run one at a time in order.\n *\n * Spec §6.3.\n */\nexport type MutationConcurrency = 'parallel' | 'latest-wins' | 'serial'\n\n/**\n * The configuration object passed to `ctx.mutation(spec)`. See spec §20.5 for\n * the full lifecycle semantics. `onMutate` may return a `Snapshot` (from\n * `query.setData(...)`) to enable automatic rollback on error.\n */\nexport type MutationSpec<V, R> = {\n /**\n * A short human-readable name. Surfaces in the devtools mutation log so the\n * user sees `moveCard` instead of just the controller path. Strongly\n * recommended in app code; cosmetic only — no runtime semantics depend on it.\n */\n name?: string\n /** The actual write. Receives the user-supplied vars and an `AbortSignal`. */\n mutate: (vars: V, signal: AbortSignal) => Promise<R>\n /**\n * Runs before `mutate`. Return a `Snapshot` from `query.setData(...)` to\n * apply an optimistic update; the snapshot is rolled back on error.\n */\n onMutate?: (vars: V) => Snapshot | void\n onSuccess?: (result: R, vars: V) => void\n onError?: (err: unknown, vars: V, snapshot: Snapshot | undefined) => void\n onSettled?: (result: R | undefined, err: unknown | undefined, vars: V) => void\n concurrency?: MutationConcurrency\n retry?: RetryPolicy\n retryDelay?: RetryDelay\n}\n\n/**\n * A running mutation. Created via `ctx.mutation(spec)` — the controller owns\n * its lifetime. Each `run(vars)` returns a Promise; the four signals reflect\n * the last-resolved run for UI binding.\n *\n * Spec §6, §20.5.\n */\n/**\n * Call signature for `mutation.run`:\n * - When `V` is `void` → no args. (`mutation.run()`)\n * - When `V` was not constrained (default-inferred as `unknown`) → optional\n * arg. Lets `ctx.mutation({ mutate: async () => 1 })` call `run()` *or*\n * `run(anything)` without a type error.\n * - Otherwise → arg required. (`mutation.run(vars)`)\n *\n * Defined as a variadic-tuple conditional so consumers see the right shape\n * without writing `run(undefined as unknown as void)`.\n */\nexport type MutationRun<V, R> = (\n ...args: unknown extends V ? [V?] : [V] extends [void] ? [] : [V]\n) => Promise<R>\n\nexport type Mutation<V, R> = {\n /** Trigger a run. Returns a Promise that resolves with the mutate result. */\n run: MutationRun<V, R>\n data: ReadSignal<R | undefined>\n error: ReadSignal<unknown | undefined>\n isPending: ReadSignal<boolean>\n lastVariables: ReadSignal<V | undefined>\n /** Clear `data` / `error` / `lastVariables` without aborting in-flight runs. */\n reset(): void\n /** Abort in-flight runs and tear down. Idempotent. Called by the parent controller's dispose. */\n dispose(): void\n}\n\ntype RunHandle = {\n abort: AbortController\n snapshot: Snapshot | undefined\n}\n\ntype SerialEntry<V, R> = {\n vars: V\n resolve: (value: R) => void\n reject: (err: unknown) => void\n}\n\nclass MutationImpl<V, R> implements Mutation<V, R> {\n readonly data: Signal<R | undefined> = signal(undefined)\n readonly error: Signal<unknown | undefined> = signal(undefined)\n readonly isPending: Signal<boolean> = signal(false)\n readonly lastVariables: Signal<V | undefined> = signal(undefined)\n\n private inflight = new Set<RunHandle>()\n private serialQueue: Array<SerialEntry<V, R>> = []\n private serialActive = false\n private disposed = false\n\n constructor(\n private readonly spec: MutationSpec<V, R>,\n private readonly onError: ErrorHandler | undefined,\n private readonly controllerPath: readonly string[],\n private readonly inflightCounter?: {\n update(fn: (n: number) => number): void\n },\n private readonly devtools?: DevtoolsEmitter,\n ) {}\n\n private emit(event: { type: 'mutation:run'; vars: unknown }): void\n private emit(event: { type: 'mutation:success'; result: unknown }): void\n private emit(event: { type: 'mutation:error'; error: unknown }): void\n private emit(event: { type: 'mutation:rollback' }): void\n private emit(\n event:\n | { type: 'mutation:run'; vars: unknown }\n | { type: 'mutation:success'; result: unknown }\n | { type: 'mutation:error'; error: unknown }\n | { type: 'mutation:rollback' },\n ): void {\n if (!__DEV__) return\n if (this.devtools === undefined) return\n const out: Record<string, unknown> = { ...event, path: this.controllerPath }\n if (this.spec.name !== undefined) out.name = this.spec.name\n this.devtools.emit(out as Parameters<DevtoolsEmitter['emit']>[0])\n }\n\n // Implementation-side signature accepts an optional `vars` (defaults to\n // `undefined`) so call sites for `Mutation<void, R>` can call `.run()` with\n // no args. The public type forces the right shape per `V`.\n run = ((vars: V = undefined as V): Promise<R> => {\n if (this.disposed) {\n return Promise.reject(new Error('Mutation disposed'))\n }\n const mode = this.spec.concurrency ?? 'parallel'\n switch (mode) {\n case 'parallel':\n return this.executeRun(vars)\n case 'latest-wins':\n // Spec §6.1: rollback the superseded run's snapshot BEFORE the new\n // run's onMutate runs, so the new optimistic update doesn't stack on\n // top of the obsolete one.\n for (const handle of this.inflight) {\n handle.abort.abort()\n handle.snapshot?.rollback()\n handle.snapshot = undefined\n }\n return this.executeRun(vars)\n case 'serial':\n return this.enqueueSerial(vars)\n }\n }) as MutationRun<V, R>\n\n private enqueueSerial(vars: V): Promise<R> {\n if (this.serialActive) {\n return new Promise<R>((resolve, reject) => {\n this.serialQueue.push({ vars, resolve, reject })\n })\n }\n this.serialActive = true\n return this.executeRun(vars).finally(() => this.advanceSerialQueue())\n }\n\n private advanceSerialQueue(): void {\n const next = this.serialQueue.shift()\n if (!next) {\n this.serialActive = false\n return\n }\n this.executeRun(next.vars).then(\n (result) => {\n next.resolve(result)\n this.advanceSerialQueue()\n },\n (err) => {\n next.reject(err)\n this.advanceSerialQueue()\n },\n )\n }\n\n private async executeRun(vars: V): Promise<R> {\n const abort = new AbortController()\n let snapshot: Snapshot | undefined\n try {\n const raw = this.spec.onMutate?.(vars) ?? undefined\n snapshot = raw === undefined ? undefined : this.wrapSnapshot(raw)\n } catch (err) {\n dispatchError(this.onError, err, {\n kind: 'mutation',\n controllerPath: this.controllerPath,\n })\n }\n\n const handle: RunHandle = { abort, snapshot }\n this.inflight.add(handle)\n this.inflightCounter?.update((n) => n + 1)\n batch(() => {\n this.isPending.set(true)\n this.lastVariables.set(vars)\n })\n\n if (__DEV__) this.emit({ type: 'mutation:run', vars })\n\n try {\n const result = await raceAbort(this.runWithRetry(vars, abort.signal), abort.signal)\n if (abort.signal.aborted || this.disposed) {\n snapshot?.rollback()\n throw new DOMException('Superseded', 'AbortError')\n }\n batch(() => {\n this.data.set(result)\n this.error.set(undefined)\n })\n if (__DEV__) this.emit({ type: 'mutation:success', result })\n this.safeCall(() => this.spec.onSuccess?.(result, vars), 'mutation')\n // Commit the optimistic snapshot so `hasPendingMutations` clears on the\n // affected entry. Symmetric to the auto-rollback in the error path.\n // Spec §6.4.\n snapshot?.finalize()\n this.safeCall(() => this.spec.onSettled?.(result, undefined, vars), 'mutation')\n return result\n } catch (err) {\n if (isAbortError(err) || abort.signal.aborted) {\n snapshot?.rollback()\n // Reserve `error` signal for genuine failures.\n throw err\n }\n this.error.set(err)\n if (__DEV__) this.emit({ type: 'mutation:error', error: err })\n this.safeCall(() => this.spec.onError?.(err, vars, snapshot), 'mutation')\n // Auto-rollback after the user's onError. The wrapped snapshot is\n // single-consume, so an `onError` that already called `snapshot.rollback()`\n // turns the auto-call into a no-op. Spec §6.4.\n snapshot?.rollback()\n this.safeCall(() => this.spec.onSettled?.(undefined, err, vars), 'mutation')\n throw err\n } finally {\n this.inflight.delete(handle)\n this.inflightCounter?.update((n) => Math.max(0, n - 1))\n if (this.inflight.size === 0) {\n this.isPending.set(false)\n }\n }\n }\n\n // Wrap so any rollback / finalize path runs the raw operation at most\n // once. The mutation auto-finalizes on success and auto-rolls-back on\n // error; user code may also call rollback() from onError. Whichever\n // happens first wins; subsequent calls (including the auto-call) no-op.\n private wrapSnapshot(raw: Snapshot): Snapshot {\n let consumed = false\n return {\n rollback: () => {\n if (consumed) return\n consumed = true\n raw.rollback()\n if (__DEV__) this.emit({ type: 'mutation:rollback' })\n },\n finalize: () => {\n if (consumed) return\n consumed = true\n raw.finalize()\n },\n }\n }\n\n private async runWithRetry(vars: V, signal: AbortSignal): Promise<R> {\n const retry = this.spec.retry ?? 0\n const retryDelay = this.spec.retryDelay ?? 1000\n let attempt = 0\n while (true) {\n try {\n return await this.spec.mutate(vars, signal)\n } catch (err) {\n if (signal.aborted || isAbortError(err)) throw err\n const shouldRetry = typeof retry === 'number' ? attempt < retry : retry(attempt, err)\n if (!shouldRetry) throw err\n const delay = typeof retryDelay === 'function' ? retryDelay(attempt) : retryDelay\n await abortableSleep(delay, signal)\n attempt += 1\n }\n }\n }\n\n private safeCall(fn: () => void, kind: 'mutation'): void {\n try {\n fn()\n } catch (err) {\n dispatchError(this.onError, err, {\n kind,\n controllerPath: this.controllerPath,\n })\n }\n }\n\n reset(): void {\n if (this.disposed) return\n for (const handle of this.inflight) handle.abort.abort()\n this.serialQueue.length = 0\n batch(() => {\n this.data.set(undefined)\n this.error.set(undefined)\n this.lastVariables.set(undefined)\n this.isPending.set(false)\n })\n }\n\n dispose(): void {\n if (this.disposed) return\n this.disposed = true\n for (const handle of this.inflight) handle.abort.abort()\n for (const queued of this.serialQueue) {\n queued.reject(new DOMException('Disposed', 'AbortError'))\n }\n this.serialQueue.length = 0\n }\n}\n\nexport function createMutation<V, R>(\n spec: MutationSpec<V, R>,\n onError: ErrorHandler | undefined,\n controllerPath: readonly string[],\n inflightCounter?: { update(fn: (n: number) => number): void },\n devtools?: DevtoolsEmitter,\n): Mutation<V, R> {\n return new MutationImpl<V, R>(spec, onError, controllerPath, inflightCounter, devtools)\n}\n\n/**\n * Race a promise against an AbortSignal. If the signal fires before the\n * promise settles, the returned promise rejects with AbortError — regardless\n * of whether the underlying promise ever resolves. Protects against\n * misbehaving mutate fns that ignore their signal.\n */\nfunction raceAbort<T>(promise: Promise<T>, signal: AbortSignal): Promise<T> {\n if (signal.aborted) {\n return Promise.reject(new DOMException('Aborted', 'AbortError'))\n }\n return new Promise<T>((resolve, reject) => {\n let settled = false\n const onAbort = () => {\n if (settled) return\n settled = true\n reject(new DOMException('Aborted', 'AbortError'))\n }\n signal.addEventListener('abort', onAbort, { once: true })\n promise.then(\n (v) => {\n if (settled) return\n settled = true\n signal.removeEventListener('abort', onAbort)\n resolve(v)\n },\n (e) => {\n if (settled) return\n settled = true\n signal.removeEventListener('abort', onAbort)\n reject(e)\n },\n )\n })\n}\n\nfunction abortableSleep(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal.aborted) {\n reject(new DOMException('Aborted', 'AbortError'))\n return\n }\n const timer = setTimeout(() => {\n signal.removeEventListener('abort', onAbort)\n resolve()\n }, ms)\n const onAbort = () => {\n clearTimeout(timer)\n signal.removeEventListener('abort', onAbort)\n reject(new DOMException('Aborted', 'AbortError'))\n }\n signal.addEventListener('abort', onAbort, { once: true })\n })\n}\n","import { computed, effect, type Signal, signal, untracked } from '../signals'\nimport type { ReadSignal } from '../signals/types'\nimport type { ClientEntry, InfiniteClientEntry, QueryClient } from './client'\nimport type { InfiniteQuery, InfiniteQuerySpec, InfiniteQuerySubscription } from './infinite'\nimport type { AsyncStatus, Query, QuerySpec, QuerySubscription, UseOptions } from './types'\n\ntype QueryInternal<Args extends unknown[], T> = Query<Args, T> & {\n readonly __spec: QuerySpec<Args, T>\n}\n\nclass SubscriptionImpl<T> implements QuerySubscription<T> {\n private readonly current$: Signal<ClientEntry<T> | null> = signal(null)\n private readonly previousData$: Signal<T | undefined> = signal(undefined)\n\n readonly data: ReadSignal<T | undefined>\n readonly error: ReadSignal<unknown | undefined>\n readonly status: ReadSignal<AsyncStatus>\n readonly isLoading: ReadSignal<boolean>\n readonly isFetching: ReadSignal<boolean>\n readonly isStale: ReadSignal<boolean>\n readonly lastUpdatedAt: ReadSignal<number | undefined>\n readonly hasPendingMutations: ReadSignal<boolean>\n\n constructor(private readonly keepPreviousData: boolean) {\n this.data = computed(() => {\n const cur = this.current$.value\n const curData = cur?.entry.data.value\n if (curData !== undefined) return curData\n if (keepPreviousData) return this.previousData$.value\n return undefined\n })\n this.error = computed(() => this.current$.value?.entry.error.value)\n this.status = computed<AsyncStatus>(() => this.current$.value?.entry.status.value ?? 'idle')\n this.isLoading = computed(() => {\n const cur = this.current$.value\n if (!cur) return false\n if (keepPreviousData && this.previousData$.value !== undefined) return false\n return cur.entry.isLoading.value\n })\n this.isFetching = computed(() => this.current$.value?.entry.isFetching.value ?? false)\n this.isStale = computed(() => this.current$.value?.entry.isStale.value ?? true)\n this.lastUpdatedAt = computed(() => this.current$.value?.entry.lastUpdatedAt.value)\n this.hasPendingMutations = computed(\n () => this.current$.value?.entry.hasPendingMutations.value ?? false,\n )\n }\n\n attach(entry: ClientEntry<T>): void {\n const prev = this.current$.peek()\n if (prev === entry) return\n if (prev && this.keepPreviousData) {\n const prevData = prev.entry.data.peek()\n if (prevData !== undefined) this.previousData$.set(prevData)\n }\n this.current$.set(entry)\n }\n\n detach(): void {\n this.current$.set(null)\n }\n\n refetch = (): Promise<T> => {\n const cur = this.current$.peek()\n if (!cur) return Promise.reject(new Error('[olas] no active subscription'))\n return cur.entry.refetch()\n }\n\n reset = (): void => {\n this.current$.peek()?.entry.reset()\n }\n\n firstValue = (): Promise<T> => {\n const cur = this.current$.peek()\n if (!cur) return Promise.reject(new Error('[olas] no active subscription'))\n return cur.entry.firstValue()\n }\n}\n\n/**\n * Build a subscription + the effect that keeps it bound to the right entry.\n * The controller container wires the disposer into the lifecycle.\n */\nexport function createUse<Args extends unknown[], T>(\n client: QueryClient,\n query: Query<Args, T>,\n keyOrOptions?: (() => Args) | UseOptions<Args>,\n): { subscription: QuerySubscription<T>; dispose: () => void } {\n const internal = query as unknown as QueryInternal<Args, T>\n const spec = internal.__spec\n const keepPreviousData = spec.keepPreviousData ?? false\n\n const keyFn = typeof keyOrOptions === 'function' ? keyOrOptions : keyOrOptions?.key\n const enabledFn =\n typeof keyOrOptions === 'object' && keyOrOptions !== null ? keyOrOptions.enabled : undefined\n\n const sub = new SubscriptionImpl<T>(keepPreviousData)\n let currentEntry: ClientEntry<T> | null = null\n\n const effectDispose = effect(() => {\n const isEnabled = enabledFn ? enabledFn() : true\n if (!isEnabled) {\n untracked(() => {\n if (currentEntry) {\n currentEntry.release()\n currentEntry = null\n }\n sub.detach()\n })\n return\n }\n\n const args = (keyFn ? keyFn() : ([] as unknown as Args)) as Args\n\n untracked(() => {\n const entry = client.bindEntry<Args, T>(query, args)\n if (currentEntry === entry) return\n if (currentEntry) currentEntry.release()\n entry.acquire()\n currentEntry = entry\n sub.attach(entry)\n\n const status = entry.entry.status.peek()\n const fetching = entry.entry.isFetching.peek()\n if (!fetching && (status === 'idle' || entry.entry.isStaleNow() || status === 'error')) {\n entry.entry.startFetch().catch(() => {\n /* error captured on entry */\n })\n }\n })\n })\n\n const dispose = () => {\n effectDispose()\n if (currentEntry) {\n currentEntry.release()\n currentEntry = null\n }\n sub.detach()\n }\n\n return { subscription: sub, dispose }\n}\n\ntype InfiniteQueryInternal<Args extends unknown[], TPage, TItem> = InfiniteQuery<\n Args,\n TPage,\n TItem\n> & {\n readonly __spec: InfiniteQuerySpec<Args, any, TPage, TItem>\n}\n\nclass InfiniteSubscriptionImpl<TPage, TItem> implements InfiniteQuerySubscription<TPage, TItem> {\n private readonly current$: Signal<InfiniteClientEntry<TPage, TItem, unknown> | null> =\n signal(null)\n private readonly previousPages$: Signal<TPage[] | undefined> = signal(undefined)\n\n readonly data: ReadSignal<TPage[] | undefined>\n readonly pages: ReadSignal<TPage[]>\n readonly flat: ReadSignal<TItem[]>\n readonly error: ReadSignal<unknown | undefined>\n readonly status: ReadSignal<AsyncStatus>\n readonly isLoading: ReadSignal<boolean>\n readonly isFetching: ReadSignal<boolean>\n readonly isStale: ReadSignal<boolean>\n readonly lastUpdatedAt: ReadSignal<number | undefined>\n readonly hasPendingMutations: ReadSignal<boolean>\n readonly hasNextPage: ReadSignal<boolean>\n readonly hasPreviousPage: ReadSignal<boolean>\n readonly isFetchingNextPage: ReadSignal<boolean>\n readonly isFetchingPreviousPage: ReadSignal<boolean>\n\n constructor(private readonly keepPreviousData: boolean) {\n this.pages = computed(() => {\n const cur = this.current$.value\n const ps = cur?.entry.pages.value\n if (ps && ps.length > 0) return ps\n if (keepPreviousData) return this.previousPages$.value ?? []\n return ps ?? []\n })\n this.data = computed(() => {\n const cur = this.current$.value\n const ps = cur?.entry.pages.value\n if (ps && ps.length > 0) return ps\n if (keepPreviousData) {\n const prev = this.previousPages$.value\n if (prev && prev.length > 0) return prev\n }\n return undefined\n })\n this.flat = computed(() => this.current$.value?.entry.flat.value ?? [])\n this.error = computed(() => this.current$.value?.entry.error.value)\n this.status = computed<AsyncStatus>(() => this.current$.value?.entry.status.value ?? 'idle')\n this.isLoading = computed(() => {\n const cur = this.current$.value\n if (!cur) return false\n if (keepPreviousData) {\n const prev = this.previousPages$.value\n if (prev && prev.length > 0) return false\n }\n return cur.entry.isLoading.value\n })\n this.isFetching = computed(() => this.current$.value?.entry.isFetching.value ?? false)\n this.isStale = computed(() => this.current$.value?.entry.isStale.value ?? true)\n this.lastUpdatedAt = computed(() => this.current$.value?.entry.lastUpdatedAt.value)\n this.hasPendingMutations = computed(\n () => this.current$.value?.entry.hasPendingMutations.value ?? false,\n )\n this.hasNextPage = computed(() => this.current$.value?.entry.hasNextPage.value ?? false)\n this.hasPreviousPage = computed(() => this.current$.value?.entry.hasPreviousPage.value ?? false)\n this.isFetchingNextPage = computed(\n () => this.current$.value?.entry.isFetchingNextPage.value ?? false,\n )\n this.isFetchingPreviousPage = computed(\n () => this.current$.value?.entry.isFetchingPreviousPage.value ?? false,\n )\n }\n\n attach(entry: InfiniteClientEntry<TPage, TItem, unknown>): void {\n const prev = this.current$.peek()\n if (prev === entry) return\n if (prev && this.keepPreviousData) {\n const prevPages = prev.entry.pages.peek()\n if (prevPages.length > 0) this.previousPages$.set(prevPages)\n }\n this.current$.set(entry)\n }\n\n detach(): void {\n this.current$.set(null)\n }\n\n refetch = (): Promise<TPage[]> => {\n const cur = this.current$.peek()\n if (!cur) return Promise.reject(new Error('[olas] no active subscription'))\n return cur.entry.refetch().then(() => cur.entry.pages.peek())\n }\n\n reset = (): void => {\n this.current$.peek()?.entry.reset()\n }\n\n firstValue = (): Promise<TPage[]> => {\n const cur = this.current$.peek()\n if (!cur) return Promise.reject(new Error('[olas] no active subscription'))\n return cur.entry.firstValue()\n }\n\n fetchNextPage = (): Promise<void> => {\n const cur = this.current$.peek()\n if (!cur) return Promise.resolve()\n return cur.entry.fetchNextPage()\n }\n\n fetchPreviousPage = (): Promise<void> => {\n const cur = this.current$.peek()\n if (!cur) return Promise.resolve()\n return cur.entry.fetchPreviousPage()\n }\n}\n\nexport function createInfiniteUse<Args extends unknown[], TPage, TItem>(\n client: QueryClient,\n query: InfiniteQuery<Args, TPage, TItem>,\n keyOrOptions?: (() => Args) | UseOptions<Args>,\n): {\n subscription: InfiniteQuerySubscription<TPage, TItem>\n dispose: () => void\n} {\n const spec = (query as unknown as InfiniteQueryInternal<Args, TPage, TItem>).__spec\n const keepPreviousData = spec.keepPreviousData ?? false\n const keyFn = typeof keyOrOptions === 'function' ? keyOrOptions : keyOrOptions?.key\n const enabledFn =\n typeof keyOrOptions === 'object' && keyOrOptions !== null ? keyOrOptions.enabled : undefined\n\n const sub = new InfiniteSubscriptionImpl<TPage, TItem>(keepPreviousData)\n let currentEntry: InfiniteClientEntry<TPage, TItem, unknown> | null = null\n\n const effectDispose = effect(() => {\n const isEnabled = enabledFn ? enabledFn() : true\n if (!isEnabled) {\n untracked(() => {\n if (currentEntry) {\n currentEntry.release()\n currentEntry = null\n }\n sub.detach()\n })\n return\n }\n\n const args = (keyFn ? keyFn() : ([] as unknown as Args)) as Args\n\n untracked(() => {\n const entry = client.bindInfiniteEntry<Args, TPage, TItem>(query, args)\n if (currentEntry === entry) return\n if (currentEntry) currentEntry.release()\n entry.acquire()\n currentEntry = entry\n sub.attach(entry)\n\n const status = entry.entry.status.peek()\n const fetching = entry.entry.isFetching.peek()\n if (!fetching && (status === 'idle' || entry.entry.isStaleNow() || status === 'error')) {\n entry.entry.startFetch().catch(() => {\n /* error captured on entry */\n })\n }\n })\n })\n\n const dispose = () => {\n effectDispose()\n if (currentEntry) {\n currentEntry.release()\n currentEntry = null\n }\n sub.detach()\n }\n\n return { subscription: sub, dispose }\n}\n","import type { DevtoolsEmitter } from '../devtools'\nimport { createEmitter, type Emitter } from '../emitter'\nimport { dispatchError, type ErrorHandler } from '../errors'\nimport { bindFieldDevtoolsOwner, createField } from '../forms/field'\nimport { bindTreeToDevtools, createFieldArray, createForm } from '../forms/form'\nimport type {\n FieldArray,\n FieldArrayOptions,\n Form,\n FormOptions,\n FormSchema,\n ItemInitial,\n} from '../forms/form-types'\nimport type { Validator } from '../forms/types'\nimport type { QueryClient } from '../query/client'\nimport type { InfiniteQuery } from '../query/infinite'\nimport { createLocalCache, type LocalCacheOptions } from '../query/local'\nimport { createMutation, type Mutation, type MutationSpec } from '../query/mutation'\nimport type { LocalCache, Query } from '../query/types'\nimport { createInfiniteUse, createUse } from '../query/use'\nimport type { Scope } from '../scope'\nimport { effect as standaloneEffect } from '../signals'\nimport { getFactory, getName } from './define'\nimport type { ControllerDef, Ctx, Field } from './types'\n\nexport type RootShared = {\n readonly devtools: DevtoolsEmitter\n readonly onError: ErrorHandler | undefined\n readonly queryClient: QueryClient\n}\n\ntype LifecycleEntry =\n | {\n kind: 'effect'\n factory: () => void | (() => void)\n dispose: (() => void) | null\n }\n | { kind: 'cleanup'; dispose: () => void }\n | { kind: 'child'; instance: ControllerInstance }\n | { kind: 'onDispose'; fn: () => void }\n | { kind: 'onSuspend'; fn: () => void }\n | { kind: 'onResume'; fn: () => void }\n | { kind: 'subscription'; unsubscribe: () => void }\n\ntype State = 'constructing' | 'active' | 'suspended' | 'disposed'\n\nexport class ControllerInstance {\n readonly path: readonly string[]\n readonly deps: Record<string, unknown>\n\n private state: State = 'constructing'\n private readonly entries: LifecycleEntry[] = []\n private readonly rootShared: RootShared\n private readonly parent: ControllerInstance | null\n private childCounter = 0\n /** Scope values provided on this instance, keyed by `Scope.__id`. */\n private scopes: Map<symbol, unknown> | null = null\n\n constructor(\n parent: ControllerInstance | null,\n rootShared: RootShared,\n pathSegment: string,\n deps: Record<string, unknown>,\n ) {\n this.parent = parent\n this.rootShared = rootShared\n this.path = parent ? [...parent.path, pathSegment] : [pathSegment]\n this.deps = deps\n }\n\n /**\n * Run the factory and produce an api. On throw, the partially-constructed\n * state is rolled back (entries disposed in reverse) and the error is rethrown.\n */\n construct<Props, Api>(factory: (ctx: Ctx, props: Props) => Api, props: Props): Api {\n const ctx = this.buildCtx()\n let api: Api\n try {\n api = factory(ctx, props)\n } catch (err) {\n this.rollbackPartialConstruction()\n throw err\n }\n this.state = 'active'\n if (__DEV__) {\n this.rootShared.devtools.emit({\n type: 'controller:constructed',\n path: this.path,\n props: props as unknown,\n })\n }\n return api\n }\n\n private rollbackPartialConstruction(): void {\n // Tear down what was built before the throw, in reverse order.\n for (let i = this.entries.length - 1; i >= 0; i--) {\n const entry = this.entries[i]\n if (!entry) continue\n try {\n this.disposeEntry(entry)\n } catch {\n // Rollback paths can't throw further.\n }\n }\n this.entries.length = 0\n this.state = 'disposed'\n }\n\n dispose(): void {\n if (this.state === 'disposed') return\n const wasSuspended = this.state === 'suspended'\n this.state = 'disposed'\n\n for (let i = this.entries.length - 1; i >= 0; i--) {\n const entry = this.entries[i]\n if (!entry) continue\n try {\n this.disposeEntry(entry)\n } catch (err) {\n dispatchError(this.rootShared.onError, err, {\n kind: 'effect',\n controllerPath: this.path,\n })\n }\n }\n this.entries.length = 0\n this.scopes = null\n\n if (__DEV__) {\n this.rootShared.devtools.emit({ type: 'controller:disposed', path: this.path })\n }\n // Silence \"unused\" — `wasSuspended` may inform future logic; intentionally a no-op for now.\n void wasSuspended\n }\n\n private disposeEntry(entry: LifecycleEntry): void {\n switch (entry.kind) {\n case 'effect':\n entry.dispose?.()\n entry.dispose = null\n break\n case 'cleanup':\n entry.dispose()\n break\n case 'child':\n entry.instance.dispose()\n break\n case 'subscription':\n entry.unsubscribe()\n break\n case 'onDispose':\n entry.fn()\n break\n case 'onSuspend':\n case 'onResume':\n // No work on dispose.\n break\n }\n }\n\n suspend(): void {\n if (this.state !== 'active') return\n this.state = 'suspended'\n\n for (let i = this.entries.length - 1; i >= 0; i--) {\n const entry = this.entries[i]\n if (!entry) continue\n try {\n switch (entry.kind) {\n case 'effect':\n entry.dispose?.()\n entry.dispose = null\n break\n case 'child':\n entry.instance.suspend()\n break\n case 'onSuspend':\n entry.fn()\n break\n default:\n break\n }\n } catch (err) {\n dispatchError(this.rootShared.onError, err, {\n kind: 'effect',\n controllerPath: this.path,\n })\n }\n }\n\n if (__DEV__) {\n this.rootShared.devtools.emit({ type: 'controller:suspended', path: this.path })\n }\n }\n\n resume(): void {\n if (this.state !== 'suspended') return\n this.state = 'active'\n\n for (const entry of this.entries) {\n try {\n switch (entry.kind) {\n case 'effect':\n entry.dispose = standaloneEffect(entry.factory)\n break\n case 'child':\n entry.instance.resume()\n break\n case 'onResume':\n entry.fn()\n break\n default:\n break\n }\n } catch (err) {\n dispatchError(this.rootShared.onError, err, {\n kind: 'effect',\n controllerPath: this.path,\n })\n }\n }\n\n if (__DEV__) {\n this.rootShared.devtools.emit({ type: 'controller:resumed', path: this.path })\n }\n }\n\n // --- Ctx surface --------------------------------------------------------\n\n private buildCtx(): Ctx {\n const self = this\n const ctx: Ctx = {\n get deps() {\n return self.deps\n },\n\n effect(fn) {\n if (self.isTerminal()) return\n const entry: LifecycleEntry = {\n kind: 'effect',\n factory: () => fn(),\n dispose: null,\n }\n // Wrap with error reporting so an effect throw goes through onError.\n const wrapped = (): void | (() => void) => {\n try {\n return fn()\n } catch (err) {\n dispatchError(self.rootShared.onError, err, {\n kind: 'effect',\n controllerPath: self.path,\n })\n return undefined\n }\n }\n entry.factory = wrapped\n entry.dispose = standaloneEffect(wrapped)\n self.entries.push(entry)\n },\n\n cache<T>(\n fetcher: (signal: AbortSignal) => Promise<T>,\n options?: LocalCacheOptions<T>,\n ): LocalCache<T> {\n const cache = createLocalCache<T>(fetcher, options)\n self.entries.push({ kind: 'cleanup', dispose: () => cache.dispose() })\n return cache\n },\n\n use(query: any, keyOrOptions?: any): any {\n const brand = (query as { __olas?: string }).__olas\n if (brand === 'infiniteQuery') {\n const { subscription, dispose: d } = createInfiniteUse(\n self.rootShared.queryClient,\n query as InfiniteQuery<unknown[], unknown, unknown>,\n keyOrOptions,\n )\n self.entries.push({ kind: 'cleanup', dispose: d })\n return subscription\n }\n const { subscription, dispose: d } = createUse(\n self.rootShared.queryClient,\n query as Query<unknown[], unknown>,\n keyOrOptions,\n )\n self.entries.push({ kind: 'cleanup', dispose: d })\n return subscription\n },\n\n mutation<V, R>(spec: MutationSpec<V, R>): Mutation<V, R> {\n const m = createMutation<V, R>(\n spec,\n self.rootShared.onError,\n self.path,\n self.rootShared.queryClient.mutationsInflight$,\n self.rootShared.devtools,\n )\n self.entries.push({ kind: 'cleanup', dispose: () => m.dispose() })\n return m\n },\n\n emitter<T>(): Emitter<T> {\n const e = createEmitter<T>()\n self.entries.push({ kind: 'cleanup', dispose: () => e.dispose() })\n return e\n },\n\n field<T>(initial: T, validators?: ReadonlyArray<Validator<T>>): Field<T> {\n const f = createField(initial, validators)\n self.entries.push({ kind: 'cleanup', dispose: () => f.dispose() })\n // Standalone fields (not inside a form) still publish field:validated\n // events. Use the controller path with field name \"(field)\" — the\n // devtools panel groups by path so this is fine.\n bindFieldDevtoolsOwner(f, {\n controllerPath: self.path,\n fieldName: '(field)',\n emitter: self.rootShared.devtools,\n })\n return f\n },\n\n form<S extends FormSchema>(schema: S, options?: FormOptions<S>): Form<S> {\n const f = createForm(schema, options)\n self.entries.push({ kind: 'cleanup', dispose: () => f.dispose() })\n // Make every leaf field publish `field:validated` to the devtools bus\n // with its key path inside the form. See spec §20.9.\n const stop = bindTreeToDevtools(\n f as unknown as Form<FormSchema>,\n '',\n self.path,\n self.rootShared.devtools,\n )\n self.entries.push({ kind: 'cleanup', dispose: stop })\n return f\n },\n\n fieldArray<I extends Field<any> | Form<any>>(\n itemFactory: (initial?: ItemInitial<I>) => I,\n options?: FieldArrayOptions<I>,\n ): FieldArray<I> {\n const fa = createFieldArray<I>(itemFactory, options)\n self.entries.push({ kind: 'cleanup', dispose: () => fa.dispose() })\n const stop = bindTreeToDevtools(\n fa as unknown as FieldArray<Field<unknown> | Form<FormSchema>>,\n '',\n self.path,\n self.rootShared.devtools,\n )\n self.entries.push({ kind: 'cleanup', dispose: stop })\n return fa\n },\n\n provide<T>(scope: Scope<T>, value: T): void {\n if (self.scopes === null) self.scopes = new Map()\n self.scopes.set(scope.__id, value)\n },\n\n inject<T>(scope: Scope<T>): T {\n let node: ControllerInstance | null = self\n while (node !== null) {\n const map = node.scopes\n if (map?.has(scope.__id)) {\n return map.get(scope.__id) as T\n }\n node = node.parent\n }\n if (scope.hasDefault) return scope.default as T\n const label = scope.name ?? scope.__id.description ?? 'unnamed'\n throw new Error(\n `[olas] ctx.inject(): no provider for scope '${label}' and no default. Provide it on an ancestor via ctx.provide(${label}, ...) or pass a default to defineScope.`,\n )\n },\n\n on<T>(emitter: Emitter<T>, handler: (value: T) => void): void {\n const wrapped = (value: T) => {\n try {\n handler(value)\n } catch (err) {\n dispatchError(self.rootShared.onError, err, {\n kind: 'emitter',\n controllerPath: self.path,\n })\n }\n }\n const unsubscribe = emitter.on(wrapped)\n self.entries.push({ kind: 'subscription', unsubscribe })\n },\n\n child<Props, Api>(\n def: ControllerDef<Props, Api>,\n props: Props,\n options?: { deps?: Partial<Record<string, unknown>> },\n ): Api {\n const segment = self.makeChildSegment(getFactory(def), getName(def))\n const override = options?.deps\n const childDeps = override !== undefined ? { ...self.deps, ...override } : self.deps\n const childInstance = new ControllerInstance(self, self.rootShared, segment, childDeps)\n // child.construct() rolls back its own partial state on throw; we let\n // the throw propagate so the parent's rollback handles cleanup.\n const api = childInstance.construct(getFactory(def), props)\n self.entries.push({ kind: 'child', instance: childInstance })\n return api\n },\n\n attach<Props, Api>(\n def: ControllerDef<Props, Api>,\n props: Props,\n options?: { deps?: Partial<Record<string, unknown>> },\n ): { api: Api; dispose: () => void } {\n const segment = self.makeChildSegment(getFactory(def), getName(def))\n const override = options?.deps\n const childDeps = override !== undefined ? { ...self.deps, ...override } : self.deps\n const childInstance = new ControllerInstance(self, self.rootShared, segment, childDeps)\n const api = childInstance.construct(getFactory(def), props)\n const entry: LifecycleEntry = { kind: 'child', instance: childInstance }\n self.entries.push(entry)\n let disposed = false\n return {\n api,\n dispose: () => {\n if (disposed) return\n disposed = true\n const idx = self.entries.indexOf(entry)\n if (idx >= 0) self.entries.splice(idx, 1)\n try {\n childInstance.dispose()\n } catch (err) {\n dispatchError(self.rootShared.onError, err, {\n kind: 'effect',\n controllerPath: self.path,\n })\n }\n },\n }\n },\n\n onDispose(fn) {\n self.entries.push({\n kind: 'onDispose',\n fn: () => {\n try {\n fn()\n } catch (err) {\n dispatchError(self.rootShared.onError, err, {\n kind: 'effect',\n controllerPath: self.path,\n })\n }\n },\n })\n },\n\n onSuspend(fn) {\n self.entries.push({\n kind: 'onSuspend',\n fn: () => {\n try {\n fn()\n } catch (err) {\n dispatchError(self.rootShared.onError, err, {\n kind: 'effect',\n controllerPath: self.path,\n })\n }\n },\n })\n },\n\n onResume(fn) {\n self.entries.push({\n kind: 'onResume',\n fn: () => {\n try {\n fn()\n } catch (err) {\n dispatchError(self.rootShared.onError, err, {\n kind: 'effect',\n controllerPath: self.path,\n })\n }\n },\n })\n },\n }\n return ctx\n }\n\n private isTerminal(): boolean {\n return this.state === 'disposed'\n }\n\n // biome-ignore lint/complexity/noBannedTypes: Function is the precise type for \"any function with a .name\"\n private makeChildSegment(factory: Function, explicitName: string | undefined): string {\n const idx = this.childCounter++\n const base = explicitName ?? factory.name ?? ''\n return `${base !== '' ? base : 'anonymous'}[${idx}]`\n }\n}\n","import { DevtoolsEmitter } from '../devtools'\nimport { QueryClient } from '../query/client'\nimport { getFactory } from './define'\nimport { ControllerInstance, type RootShared } from './instance'\nimport type { AmbientDeps, ControllerDef, Root, RootOptions } from './types'\n\nconst ROOT_METHODS = [\n 'dispose',\n 'suspend',\n 'resume',\n 'dehydrate',\n 'waitForIdle',\n '__debug',\n] as const\n\n/**\n * Construct a root controller.\n *\n * Internal: this is the shared engine. The public `createRoot` (props-less)\n * and `createTestController` (props-allowing) both call through here.\n */\nexport function createRootWithProps<Props, Api, TDeps extends Record<string, unknown>>(\n def: ControllerDef<Props, Api>,\n props: Props,\n options: RootOptions<TDeps>,\n): Root<Api> {\n const devtools = new DevtoolsEmitter()\n const queryClient = new QueryClient({\n onError: options.onError,\n hydrate: options.hydrate,\n devtools,\n deps: options.deps as Record<string, unknown>,\n refetchOnWindowFocus: options.refetchOnWindowFocus,\n refetchOnReconnect: options.refetchOnReconnect,\n plugins: options.plugins,\n })\n const rootShared: RootShared = {\n devtools,\n onError: options.onError,\n queryClient,\n }\n\n const instance = new ControllerInstance(\n null,\n rootShared,\n 'root',\n options.deps as Record<string, unknown>,\n )\n\n // Bootstrap failure throws straight out of createRoot. Spec §12.1.5.\n const api = instance.construct(getFactory(def), props)\n\n if (typeof api !== 'object' || api === null) {\n // Allow primitive APIs in principle but root controls must live somewhere.\n // Wrap in a holder.\n const holder = { value: api } as unknown as Api\n return attachRootControls(holder, instance, devtools, queryClient)\n }\n\n return attachRootControls(api, instance, devtools, queryClient)\n}\n\nfunction attachRootControls<Api>(\n api: Api,\n instance: ControllerInstance,\n devtools: DevtoolsEmitter,\n queryClient: QueryClient,\n): Root<Api> {\n let suspendTimer: ReturnType<typeof setTimeout> | null = null\n\n const dispose = () => {\n if (suspendTimer != null) {\n clearTimeout(suspendTimer)\n suspendTimer = null\n }\n instance.dispose()\n queryClient.dispose()\n }\n\n const suspend = (opts?: { maxIdle?: number }) => {\n instance.suspend()\n if (suspendTimer != null) {\n clearTimeout(suspendTimer)\n suspendTimer = null\n }\n const maxIdle = opts?.maxIdle\n if (maxIdle != null && maxIdle !== Number.POSITIVE_INFINITY) {\n suspendTimer = setTimeout(() => {\n suspendTimer = null\n dispose()\n }, maxIdle)\n }\n }\n\n const resume = () => {\n if (suspendTimer != null) {\n clearTimeout(suspendTimer)\n suspendTimer = null\n }\n instance.resume()\n }\n\n const debug = {\n subscribe: (handler: Parameters<DevtoolsEmitter['subscribe']>[0]) =>\n devtools.subscribe(handler),\n queryEntries: () => queryClient.queryEntriesSnapshot(),\n }\n\n const target = api as Record<string, unknown>\n for (const method of ROOT_METHODS) {\n if (Object.hasOwn(target, method)) {\n throw new Error(\n `[olas] Root controller api defines '${method}' which conflicts with the root controls.`,\n )\n }\n }\n Object.defineProperty(target, 'dispose', {\n value: dispose,\n enumerable: false,\n configurable: true,\n })\n Object.defineProperty(target, 'suspend', {\n value: suspend,\n enumerable: false,\n configurable: true,\n })\n Object.defineProperty(target, 'resume', {\n value: resume,\n enumerable: false,\n configurable: true,\n })\n Object.defineProperty(target, '__debug', {\n value: debug,\n enumerable: false,\n configurable: true,\n })\n Object.defineProperty(target, 'dehydrate', {\n value: () => queryClient.dehydrate(),\n enumerable: false,\n configurable: true,\n })\n Object.defineProperty(target, 'waitForIdle', {\n value: () => queryClient.waitForIdle(),\n enumerable: false,\n configurable: true,\n })\n\n return api as Root<Api>\n}\n\n/**\n * Construct a root controller. Root factories take no props — startup config\n * goes in `deps`.\n */\nexport function createRoot<Api, TDeps extends Record<string, unknown> = AmbientDeps>(\n def: ControllerDef<void, Api>,\n options: RootOptions<TDeps>,\n): Root<Api> {\n return createRootWithProps<void, Api, TDeps>(def, undefined as void, options)\n}\n"],"mappings":"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"}