@vielzeug/codex 2.1.2 → 2.1.5

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 (46) hide show
  1. package/data/catalog.json +9 -5
  2. package/data/llms-full.txt +16 -44
  3. package/data/llms.txt +2 -2
  4. package/data/manifest.json +1 -1
  5. package/data/packages/arsenal.json +1 -1
  6. package/data/packages/assay.json +26 -26
  7. package/data/packages/clockwork.json +3 -3
  8. package/data/packages/codex.json +23 -23
  9. package/data/packages/coins.json +5 -5
  10. package/data/packages/conduit.json +8 -8
  11. package/data/packages/courier.json +8 -8
  12. package/data/packages/dnd.json +6 -6
  13. package/data/packages/familiar.json +9 -9
  14. package/data/packages/flux.json +9 -9
  15. package/data/packages/forge.json +2 -2
  16. package/data/packages/keymap.json +6 -6
  17. package/data/packages/lingua.json +22 -22
  18. package/data/packages/necromancer.json +2 -2
  19. package/data/packages/orbit.json +21 -21
  20. package/data/packages/ore.json +49 -49
  21. package/data/packages/prism.json +22 -22
  22. package/data/packages/pulse.json +17 -17
  23. package/data/packages/ripple.json +22 -16
  24. package/data/packages/rune.json +29 -29
  25. package/data/packages/scout.json +2 -2
  26. package/data/packages/scroll.json +15 -15
  27. package/data/packages/sourcerer.json +28 -28
  28. package/data/packages/spell.json +23 -23
  29. package/data/packages/tempo.json +14 -14
  30. package/data/packages/vault.json +4 -4
  31. package/data/packages/ward.json +25 -25
  32. package/data/packages/wayfinder.json +44 -44
  33. package/data/refine.json +4600 -4600
  34. package/data/search.json +33 -33
  35. package/dist/catalog.js.map +1 -1
  36. package/dist/cli.js +1 -1
  37. package/dist/cli.js.map +1 -1
  38. package/dist/http.js +1 -1
  39. package/dist/http.js.map +1 -1
  40. package/dist/index.js.map +1 -1
  41. package/dist/snapshot.js.map +1 -1
  42. package/dist/tools/index.js.map +1 -1
  43. package/dist/tools/packages.js.map +1 -1
  44. package/dist/tools/refine.js.map +1 -1
  45. package/mcp-setup.json +5 -5
  46. package/package.json +20 -20
@@ -1,5 +1,5 @@
1
1
  {
2
- "apiSource": "export { ScrollConfigurationError, ScrollError, ScrollRangeError } from './errors';\nexport { createDomVirtualList, createVirtualScroller } from './dom-virtual-list';\nexport type {\n DomVirtualListController,\n DomVirtualListOptions,\n DomVirtualListRenderArgs,\n RecycleFn,\n StickToBottomOptions,\n VirtualRenderItem,\n VirtualScrollerOptions,\n} from './dom-virtual-list';\nexport { createGridVirtualizer } from './grid-virtualizer';\nexport type {\n GridRangeChangeEvent,\n GridVirtualizer,\n GridVirtualizerOptions,\n GridVirtualizerState,\n GridVirtualizerUpdateOptions,\n ScrollToCellOptions,\n} from './grid-virtualizer';\nexport { createGroupedVirtualizer } from './grouped-virtualizer';\nexport type {\n GroupSection,\n GroupVirtualHeader,\n GroupVirtualItem,\n GroupVirtualizer,\n GroupVirtualizerOptions,\n GroupVirtualizerState,\n GroupVirtualizerUpdateOptions,\n} from './grouped-virtualizer';\nexport { createReactiveGroupedVirtualizer, createReactiveVirtualizer } from './reactive';\nexport type { ReactiveGroupVirtualizer, ReactiveVirtualizer, Signal } from './reactive';\nexport { createMeasurementCache, createVirtualizer, DEFAULT_ESTIMATE_SIZE, DEFAULT_OVERSCAN } from './virtualizer';\nexport type {\n MeasurementCache,\n Overscan,\n ScrollTarget,\n ScrollToIndexOptions,\n VirtualItem,\n Virtualizer,\n VirtualizerOptions,\n VirtualizerState,\n VirtualizerUpdateOptions,\n VirtualKey,\n} from './virtualizer';\n",
2
+ "apiSource": "export type {\n DomVirtualListController,\n DomVirtualListOptions,\n DomVirtualListRenderArgs,\n RecycleFn,\n StickToBottomOptions,\n VirtualRenderItem,\n VirtualScrollerOptions,\n} from './dom-virtual-list';\nexport { createDomVirtualList, createVirtualScroller } from './dom-virtual-list';\nexport { ScrollConfigurationError, ScrollError, ScrollRangeError } from './errors';\nexport type {\n GridRangeChangeEvent,\n GridVirtualizer,\n GridVirtualizerOptions,\n GridVirtualizerState,\n GridVirtualizerUpdateOptions,\n ScrollToCellOptions,\n} from './grid-virtualizer';\nexport { createGridVirtualizer } from './grid-virtualizer';\nexport type {\n GroupSection,\n GroupVirtualHeader,\n GroupVirtualItem,\n GroupVirtualizer,\n GroupVirtualizerOptions,\n GroupVirtualizerState,\n GroupVirtualizerUpdateOptions,\n} from './grouped-virtualizer';\nexport { createGroupedVirtualizer } from './grouped-virtualizer';\nexport type { ReactiveGroupVirtualizer, ReactiveVirtualizer, Signal } from './reactive';\nexport { createReactiveGroupedVirtualizer, createReactiveVirtualizer } from './reactive';\nexport type {\n MeasurementCache,\n Overscan,\n ScrollTarget,\n ScrollToIndexOptions,\n VirtualItem,\n Virtualizer,\n VirtualizerOptions,\n VirtualizerState,\n VirtualizerUpdateOptions,\n VirtualKey,\n} from './virtualizer';\nexport { createMeasurementCache, createVirtualizer, DEFAULT_ESTIMATE_SIZE, DEFAULT_OVERSCAN } from './virtualizer';\n",
3
3
  "docs": {
4
4
  "index": "---\ntitle: Scroll — Virtual list engine for TypeScript\ndescription: Lightweight, framework-agnostic virtual list engine with variable heights, sticky headers, grid support, and reactive integration.\npackage: scroll\ncategory: ui-performance\nkeywords: [virtual-list, virtualization, windowing, scroll, performance, large-lists]\nrelated: [dnd, ore, refine]\nexports:\n [\n createVirtualizer,\n createDomVirtualList,\n createVirtualScroller,\n createGroupedVirtualizer,\n createGridVirtualizer,\n createReactiveVirtualizer,\n createReactiveGroupedVirtualizer,\n createMeasurementCache,\n ScrollConfigurationError,\n ScrollError,\n ScrollRangeError,\n DEFAULT_ESTIMATE_SIZE,\n DEFAULT_OVERSCAN,\n ]\nenvironments: [browser]\n---\n\n<!-- markdownlint-disable MD025 MD033 MD060 -->\n\n<PackageHero package=\"scroll\" />\n\n## Why Scroll?\n\nRendering thousands of items as real DOM nodes freezes the browser. Each node consumes layout, paint, and memory — long lists need to render only what is visible in the viewport.\n\n```ts\n// Before — render all 10 000 items (browser freezes)\nlist.replaceChildren();\nitems.forEach((item) => {\n const el = document.createElement('div');\n el.textContent = item.name;\n list.appendChild(el); // 10 000 DOM nodes\n});\n\n// After — Scroll (only ~15 visible rows in the DOM at any time)\nimport { createVirtualizer } from '@vielzeug/scroll';\nconst virtualizer = createVirtualizer(scrollEl, {\n count: items.length,\n estimateSize: 36,\n onChange: ({ items: visibleItems, totalSize }) => {\n list.style.height = `${totalSize}px`;\n list.replaceChildren();\n for (const { index, start } of visibleItems) {\n const el = document.createElement('div');\n el.style.cssText = `position:absolute;top:${start}px;height:36px;`;\n el.textContent = items[index].name;\n list.appendChild(el);\n }\n },\n});\n```\n\n| Feature | Scroll | TanStack Virtual | react-window |\n| ------------------ | --------------------------------------------------- | ------------------------------------------ | ---------------------------------------------------------- |\n| Bundle size | <PackageInfo package=\"scroll\" type=\"size\" /> | ~5 kB | ~8 kB |\n| Framework agnostic | <ore-icon name=\"check\" size=\"16\"></ore-icon> | <ore-icon name=\"check\" size=\"16\"></ore-icon> | React only |\n| Variable heights | <ore-icon name=\"check\" size=\"16\"></ore-icon> Measured | <ore-icon name=\"check\" size=\"16\"></ore-icon> | <ore-icon name=\"triangle-alert\" size=\"16\"></ore-icon> Static |\n| O(log n) lookup | <ore-icon name=\"check\" size=\"16\"></ore-icon> | <ore-icon name=\"check\" size=\"16\"></ore-icon> | <ore-icon name=\"check\" size=\"16\"></ore-icon> |\n| `using` support | <ore-icon name=\"check\" size=\"16\"></ore-icon> | <ore-icon name=\"x\" size=\"16\"></ore-icon> | <ore-icon name=\"x\" size=\"16\"></ore-icon> |\n| Zero dependencies | <ore-icon name=\"x\" size=\"16\"></ore-icon> `@vielzeug/ripple` | <ore-icon name=\"check\" size=\"16\"></ore-icon> | <ore-icon name=\"check\" size=\"16\"></ore-icon> |\n\n<div class=\"decision-callout\">\n\n**Use Scroll when** you need to render large lists in a framework-agnostic environment with precise control over item measurement and scroll position.\n\n**Consider TanStack Virtual** if you need its framework adapters and ecosystem integration.\n\n</div>\n\n## Installation\n\n::: code-group\n\n```sh [pnpm]\npnpm add @vielzeug/scroll\n```\n\n```sh [npm]\nnpm install @vielzeug/scroll\n```\n\n```sh [yarn]\nyarn add @vielzeug/scroll\n```\n\n:::\n\n## Quick Start\n\n```ts\nimport { createVirtualizer } from '@vielzeug/scroll';\n\nconst scrollEl = document.querySelector<HTMLElement>('.scroll-container')!;\nconst spacer = document.querySelector<HTMLElement>('.spacer')!;\nconst list = document.querySelector<HTMLElement>('.list')!;\n\nconst virt = createVirtualizer(scrollEl, {\n count: 10_000,\n estimateSize: 36,\n onChange: ({ items, totalSize }) => {\n // Stretch the container so the scrollbar reflects the full list\n spacer.style.height = `${totalSize}px`;\n list.replaceChildren();\n\n for (const item of items) {\n const el = document.createElement('div');\n el.style.cssText = `position:absolute;top:${item.start}px;left:0;right:0;`;\n el.textContent = `Row ${item.index}`;\n list.appendChild(el);\n }\n },\n});\n\n// Clean up\nvirt.dispose();\n```\n\n### Entry Points\n\nAll APIs export from a single entry: `@vielzeug/scroll`.\n\n## Features\n\n<div class=\"features-grid\">\n\n- **Framework-agnostic** — callback-based `onChange` connects to any rendering layer (React, Vue, Svelte, Lit, vanilla DOM)\n- **Fixed and variable heights** — pass a fixed number, a per-index estimator function, or call `measure()` after rendering for exact heights\n- **Batched measurements** — calling `measure()` many times in a single tick coalesces into one prefix-sum rebuild via `queueMicrotask`\n- **Stable-key reflow** — call `refresh()` after reorder/filter changes to rebuild offsets without discarding measured sizes\n- **Sticky headers** — mark items with `sticky` to pin them at the viewport top; `createGroupedVirtualizer` handles section headers automatically\n- **Grouped sections** — `createGroupedVirtualizer` virtualizes sectioned data with per-section headers, `onChange` state, and `scrollToSection`/`scrollToItem`\n- **Grid virtualization** — `createGridVirtualizer` virtualizes two-dimensional data with independent row/column measurement and `scrollToCell`\n- `createReactiveVirtualizer()` / `createReactiveGroupedVirtualizer()` — Expose current state as a Ripple `Signal`\n- **DOM adapter** — `createDomVirtualList` and `createVirtualScroller` manage virtualizer lifecycle, list-height styles, and DOM node pooling\n- **Skipped re-renders** — `onChange` is not called when a scroll event doesn't move the visible window across an item boundary\n- **Programmatic scrolling** — `scrollToIndex()` with `start`, `end`, `center`, and `auto` alignment; `scrollToOffset()` for pixel control; `scrollToRow()`/`scrollToColumn()` for grids; all support `behavior: 'smooth'`\n- **Horizontal + window targets** — supports both element and `window` scrolling, in vertical or horizontal mode\n- **Asymmetric overscan + gap** — tune start/end overscan independently and add inter-item spacing\n- **Atomic updates** — `virt.update(...)` lets you change count, estimator, overscan, and more in one call\n- **Clamp-safe** — `scrollToIndex` silently clamps out-of-range indices\n- **Scroll state events** — `onScrollingChange` fires when scrolling starts/stops; `onScrollEnd` fires once scrolling settles (native `scrollend` or debounce fallback); `isScrolling` getter available at any time\n- **Scroll anchor** — viewport position is preserved visually when `estimateSize` changes via `update()`\n- **Prepend support** — `prepend()` adds items at the top while keeping the viewport visually stable\n- **Disposable** — implements `[Symbol.dispose]` for `using` declarations\n- `ScrollConfigurationError` — Rejects malformed static configuration before listeners attach or updates apply\n\n</div>\n\n## How It Works\n\nScroll maintains a prefix-sum offset array. On every scroll event it runs two binary searches — one for the first visible index, one for the last — to determine the render window in O(log n) time. Only the items within that window (plus `overscan` on each side) are passed to `onChange`.\n\n```text\nItems: [0] [1] [2] [3] [4] [5] [6] ...\nOffsets: 0 36 72 108 144 180 216 ...\n\nscrollTop = 90, containerHeight = 120 → visible items 2–5\nWith overscan=3: render items 0–8\n```\n\nThe offset array is rebuilt (O(n)) only when layout inputs change: on `measure()` flush, `refresh()`, `update({ count })`, `update({ estimateSize })`, or `invalidate()`. Scroll and resize events recompute the visible window without rebuilding offsets.\n\n## Documentation\n\n<div class=\"doc-links\">\n\n- [Usage Guide](./usage.md)\n- [API Reference](./api.md)\n- [Examples](./examples.md)\n- [Migration Guide](./migration.md)\n\n</div>\n\n## See Also\n\n<div class=\"see-also\">\n\n- [Refine](/refine/) — accessible web components that use Scroll internally for virtualized listboxes and comboboxes\n- [Ore](/ore/) — web-component authoring layer; use with Scroll to build virtualizing custom elements\n- [Dnd](/dnd/) — drag-and-drop engine; combine with Scroll to make sortable virtual lists\n\n</div>\n\n<!-- markdownlint-enable MD025 MD033 MD060 -->\n",
5
5
  "api": "---\ntitle: Scroll — API Reference\ndescription: Complete API reference for the Scroll virtual list engine.\n---\n\n[[toc]]\n\n## API Overview\n\n| Symbol | Purpose | Execution mode | Common gotcha |\n| ------------------------------------ | ----------------------------------------------- | -------------- | ------------------------------------------------------------------------------------- |\n| `createVirtualizer()` | Core 1D virtualizer | Sync | `onChange` fires on construction — wire DOM first |\n| `createDomVirtualList()` | DOM adapter for dropdown/listbox UIs | Sync | Virtualizer is created lazily on first `setItems()` |\n| `createVirtualScroller()` | Self-contained scroller (creates its own DOM) | Sync | `dispose()` removes the generated scroll element |\n| `createGroupedVirtualizer()` | Sectioned list with sticky headers | Sync | `update()` preserves measured sizes — call `invalidate()` only on font/layout changes |\n| `createGridVirtualizer()` | Two-dimensional grid virtualizer | Sync | `onRangeChange` fires even when `onChange` is omitted |\n| `createReactiveVirtualizer()` | Virtualizer with reactive signal output | Sync | `onChange` must not be passed — it is wired internally |\n| `createReactiveGroupedVirtualizer()` | Grouped virtualizer with reactive signal output | Sync | `onChange` must not be passed — it is wired internally |\n\n## Package Entry Point\n\nEverything exports from a single entry:\n\n```ts\nimport {\n createVirtualizer,\n createDomVirtualList,\n createVirtualScroller,\n createGroupedVirtualizer,\n createGridVirtualizer,\n createReactiveVirtualizer,\n type Virtualizer,\n type VirtualItem,\n type VirtualizerState,\n} from '@vielzeug/scroll';\n```\n\n## `createVirtualizer(target, options)`\n\n```ts\ncreateVirtualizer(target: ScrollTarget, options: VirtualizerOptions): Virtualizer;\n```\n\nCreates and immediately attaches a virtualizer to the provided scroll container. `onChange` fires synchronously on construction with the initial visible window. Call `dispose()` on unmount.\n\n```ts\nimport { createVirtualizer } from '@vielzeug/scroll';\n\nconst rows = [{ label: 'Ada Lovelace' }, { label: 'Grace Hopper' }];\nconst scrollEl = document.querySelector<HTMLElement>('.scroll-container')!;\nconst listEl = document.querySelector<HTMLElement>('.list')!;\n\nconst virt = createVirtualizer(scrollEl, {\n count: rows.length,\n estimateSize: 36,\n gap: 8,\n onChange: ({ items, totalSize }) => {\n listEl.style.height = `${totalSize}px`;\n listEl.replaceChildren();\n\n for (const item of items) {\n const row = document.createElement('div');\n row.style.cssText = `position:absolute;top:${item.start}px;left:0;right:0;height:${item.size}px;`;\n row.textContent = rows[item.index]?.label ?? '';\n listEl.appendChild(row);\n }\n },\n});\n```\n\n### Parameters\n\n| Parameter | Type | Description |\n| --------- | ----------------------- | --------------------------- |\n| `target` | `HTMLElement \\| Window` | Scroll container to observe |\n| `options` | `VirtualizerOptions` | Initial options |\n\n### `VirtualizerOptions`\n\n| Option | Type | Default | Description |\n| ------------------- | -------------------------------------------- | ---------------- | ------------------------------------------------------------------------------------------ |\n| `count` | `number` | required | Total item count |\n| `estimateSize` | `number \\| (index: number) => number` | `36` | Fixed size or per-index estimate in pixels |\n| `gap` | `number` | `0` | Gap between adjacent items in pixels |\n| `getItemKey` | `(index: number) => string \\| number` | `index => index` | Stable key for the measurement cache |\n| `horizontal` | `boolean` | `false` | Virtualize along the X axis instead of Y |\n| `initialOffset` | `number` | — | Initial scroll position; applied once on construction |\n| `measurementCache` | `MeasurementCache` | — | Shared external cache for scroll restoration or SSR pre-measurement |\n| `onChange` | `(state: VirtualizerState) => void` | — | Called when the visible window changes; replace through `update()`. |\n| `onScrollEnd` | `(offset: number) => void` | — | Called when scrolling settles; replace through `update()`. |\n| `onScrollingChange` | `(isScrolling: boolean) => void` | — | Called when scroll activity starts or stops; replace through `update()`. |\n| `overscan` | `number \\| { start?: number; end?: number }` | `3` | Extra items outside the viewport; number = symmetric on both sides |\n| `scrollEndDelay` | `number` | `150` | Debounce delay (ms) used to detect scroll end when native `scrollend` is unavailable |\n| `sticky` | `(index: number) => boolean` | — | Mark an item as a sticky header (pinned at viewport top) |\n\nCallbacks and `scrollEndDelay` can be replaced through `update()`; `horizontal` and `initialOffset` remain construction-only.\n\n**Returns:** `Virtualizer`\n\n### `VirtualizerState`\n\n```ts\ninterface VirtualizerState {\n readonly items: VirtualItem[];\n readonly stickyItems: VirtualItem[];\n readonly totalSize: number;\n}\n```\n\n`items` contains the currently visible items plus overscan. `stickyItems` contains items marked sticky that are pinned at the viewport top.\n\n### `Virtualizer` — read-only properties\n\n| Property | Type | Description |\n| -------------- | --------------- | ----------------------------------------------------------- |\n| `count` | `number` | Current item count |\n| `isScrolling` | `boolean` | `true` while the user is scrolling; `false` once settled |\n| `items` | `VirtualItem[]` | Currently rendered items. Always populated. |\n| `scrollOffset` | `number` | Current scroll position in pixels |\n| `stickyItems` | `VirtualItem[]` | Items pinned at the viewport top (requires `sticky` option) |\n| `totalSize` | `number` | Total height (or width in horizontal mode) |\n\n### `Virtualizer` — methods\n\n| Method | Signature | Description |\n| ------------------ | ------------------------------------------------------------------- | -------------------------------------------------------------------- |\n| `update` | `(next: VirtualizerUpdateOptions) => void` | Atomically update live options |\n| `measure` | `(index: number, size: number) => void` | Record one measured size; rebuild batched in microtask |\n| `measureBatch` | `(entries: Array<{ index: number; size: number }>) => void` | Record many sizes; single rebuild |\n| `measureEl` | `(index: number, el: HTMLElement) => () => void` | Attach ResizeObserver to auto-measure. Returns a disconnect function |\n| `refresh` | `() => void` | Rebuild offset table and re-emit; preserves cached measurements |\n| `prepend` | `(additionalCount: number) => void` | Add items at the top; adjusts scroll offset to keep viewport stable |\n| `scrollToIndex` | `(index: number, options?: ScrollToIndexOptions) => void` | Scroll to an item; out-of-range indices are clamped |\n| `scrollToOffset` | `(offset: number, options?: { behavior?: ScrollBehavior }) => void` | Scroll to a raw pixel offset |\n| `scrollToTop` | `(options?: { behavior?: ScrollBehavior }) => void` | Scroll to offset `0` |\n| `scrollToBottom` | `(options?: { behavior?: ScrollBehavior }) => void` | Scroll to the end of the list |\n| `isAtEnd` | `(threshold?: number) => boolean` | `true` when within `threshold` px (default `0`) of the end — check before appending items to decide whether to auto-follow (chat \"stick to bottom\") |\n| `invalidate` | `() => void` | Clear all measurements and rebuild from estimates |\n| `dispose` | `() => void` | Detach listeners; idempotent |\n| `disposed` | `boolean` | `true` after `dispose()` is called |\n| `[Symbol.dispose]` | `() => void` | Delegates to `dispose()` — enables `using` declarations |\n\n### `update(next)`\n\nAtomically updates one or more live options. Accepts: `count`, `estimateSize`, `gap`, `getItemKey`, `measurementCache`, `onChange`, `onScrollEnd`, `onScrollingChange`, `overscan`, `scrollEndDelay`, and `sticky`. `horizontal` and `initialOffset` remain construction-only. Invalid static numeric values throw `ScrollConfigurationError` before any update applies.\n\nWhen `estimateSize` changes, the measurement cache is cleared and a scroll anchor is applied to keep the current viewport position visually stable.\n\n```ts\nvirt.update({ count: rows.length });\nvirt.update({ estimateSize: 40 });\nvirt.update({ gap: 8, overscan: { start: 5, end: 5 } });\n```\n\n### `measure(index, size)` and `measureBatch(entries)`\n\nReport exact sizes for variable-height rows. Calls within one microtask tick coalesce into a single offset rebuild. `measure()` is a no-op when the new size equals the current effective size.\n\n```ts\nvirt.measure(item.index, el.offsetHeight);\n\n// Prefer measureBatch for ResizeObserver batches\nvirt.measureBatch(entries.map((e) => ({ index: Number(e.target.dataset.index), size: e.contentRect.height })));\n```\n\n### `measureEl(index, el)`\n\nAttaches a `ResizeObserver` to auto-measure `el` on resize. Returns a disconnect function. The\nobserver is also disconnected automatically when the virtualizer is disposed, so calling the\nreturned function is only needed to stop observing a specific element early (e.g. before it is\nrecycled or removed).\n\n```ts\nconst disconnect = virt.measureEl(item.index, rowEl);\n// later: disconnect();\n```\n\n### `refresh()`\n\nRebuilds the full offset table and re-emits. Preserves cached measurements. Use after reordering, filtering, or any data change where sizes may have changed.\n\n### `prepend(additionalCount)`\n\nAdds `additionalCount` items at the front while adjusting scroll offset so the viewport stays visually stable. Use for \"load previous page\" patterns.\n\n### `scrollToIndex(index, options?)`\n\nScroll to an item. Out-of-range indices are clamped silently.\n\n| `align` | Behavior |\n| ------------------ | ------------------------------------------------------------ |\n| `'start'` | Item top at viewport top |\n| `'end'` | Item bottom at viewport bottom |\n| `'center'` | Item centered in the viewport |\n| `'auto'` (default) | No scroll if already fully visible; otherwise minimum scroll |\n\n```ts\nvirt.scrollToIndex(0, { align: 'start' });\nvirt.scrollToIndex(500, { align: 'center', behavior: 'smooth' });\nvirt.scrollToIndex(focusedIndex, { align: 'auto' });\n```\n\n### `scrollToOffset(offset, options?)`\n\n```ts\nvirt.scrollToOffset(Number(sessionStorage.getItem('scrollOffset') ?? '0'));\n```\n\n### `invalidate()`\n\nClears all measured sizes and rebuilds from estimator values.\n\n```ts\ndocument.fonts.ready.then(() => virt.invalidate());\n```\n\n### `dispose()` and `[Symbol.dispose]()`\n\n`dispose()` detaches observers and event listeners. It is idempotent.\n\n```ts\n{\n using virt = createVirtualizer(scrollEl, { count: rows.length, onChange: render });\n} // → dispose() called automatically\n```\n\n## `createDomVirtualList(options)`\n\n```ts\ncreateDomVirtualList<T>(options: DomVirtualListOptions<T>): DomVirtualListController<T>;\n```\n\nDOM-focused adapter. Manages virtualizer lifecycle, applies list-height styles automatically, and provides a node pool via `recycle`. The virtualizer is created lazily on the first non-empty `setItems()` call and destroyed automatically when `setItems([])` is called.\n\n```ts\nimport { createDomVirtualList } from '@vielzeug/scroll';\n\nconst ctrl = createDomVirtualList<Row>({\n estimateSize: 36,\n getItemKey: (_, row) => row.id,\n listElement: listEl,\n scrollElement: scrollEl,\n render: ({ items, listEl, recycle }) => {\n for (const item of items) {\n const el = recycle(item.data.id, () => document.createElement('div'));\n el.style.cssText = `position:absolute;top:0;left:0;right:0;transform:translateY(${item.start}px);height:${item.size}px;`;\n el.textContent = item.data.label;\n listEl.appendChild(el);\n }\n },\n});\n\nctrl.setItems(rows);\nctrl.scrollToIndex(focusedIndex, { align: 'auto' });\nctrl.dispose();\n```\n\n### `DomVirtualListOptions<T>`\n\n| Option | Type | Default | Description |\n| ------------------ | --------------------------------------------- | -------- | ---------------------------------------------------------- |\n| `scrollElement` | `HTMLElement \\| Window` | required | Scroll container to observe |\n| `listElement` | `HTMLElement` | required | Element that receives height and item children |\n| `render` | `(args: DomVirtualListRenderArgs<T>) => void` | required | Called on every visible-window change |\n| `estimateSize` | `number \\| (index, item) => number` | `36` | Fixed or per-item size estimate |\n| `gap` | `number` | `0` | Gap between items in pixels |\n| `getItemKey` | `(index, item) => string \\| number` | — | Stable key; keeps measurements across `setItems()` calls |\n| `horizontal` | `boolean` | `false` | Virtualize along X axis |\n| `measurementCache` | `MeasurementCache` | — | External measurement cache |\n| `overscan` | `number \\| { start?: number; end?: number }` | `3` | Extra items outside the viewport; number = symmetric |\n| `sticky` | `(index: number, item: T) => boolean` | — | Mark items as sticky headers |\n| `clear` | `(listEl: HTMLElement) => void` | — | Custom teardown for listEl; defaults to `textContent = ''` |\n| `stickToBottom` | `boolean \\| StickToBottomOptions` | — | Auto-scroll to the end after `setItems()` whenever the list was already at (or near) the end — the chat \"stick to bottom on new message\" pattern |\n\nWithout `getItemKey`, each `setItems()` call drops cached measurements.\n\n### `StickToBottomOptions`\n\n| Option | Type | Default | Description |\n| ----------- | --------- | ------- | --------------------------------------------------------------------------- |\n| `enabled` | `boolean` | `true` | Enable/disable at runtime — pass the object form to toggle without removing it |\n| `threshold` | `number` | `48` | Distance in pixels from the end still considered \"at the end\" |\n\n`stickToBottom` fires on **any** `setItems()` call made while the list is at the end — not just when the item count grows. This also follows a streaming last item that grows in place (same array length, bigger content) without you needing to detect that case yourself. It never fires while the user has scrolled away from the end, so reading older messages is never interrupted.\n\n```ts\nconst chat = createDomVirtualList<Message>({\n estimateSize: 48,\n getItemKey: (_, m) => m.id,\n listElement: listEl,\n render: renderMessages,\n scrollElement: scrollEl,\n stickToBottom: true, // or { threshold: 80 } for a larger \"still at bottom\" tolerance\n});\n\nchat.setItems(messages); // scrolls to bottom on first load\n// … later, a new message arrives (or the last one grows while streaming) …\nchat.setItems([...messages, newMessage]); // follows along only if the user was already at the bottom\n```\n\n### `DomVirtualListRenderArgs<T>`\n\n```ts\ntype DomVirtualListRenderArgs<T> = {\n items: Array<VirtualRenderItem<T>>; // visible items — each has .data + layout fields\n listEl: HTMLElement;\n recycle: RecycleFn; // node pool — returns existing node or calls create()\n stickyItems: Array<VirtualRenderItem<T>>; // sticky items (requires sticky option)\n totalSize: number;\n};\n```\n\n`VirtualRenderItem<T>` is `VirtualItem` (`start`, `end`, `size`, `index`) enriched with `data: T`.\n\n`recycle(key, create)` returns a live node for `key` if one exists in the pool, or calls `create()` for a new one. Nodes not reused in a render cycle are removed automatically. `listEl.style.height` is set before `render` is called — you do not need to set it yourself.\n\n### `DomVirtualListController<T>`\n\nExtends `Virtualizer` (minus `prepend` and `update`) with `setItems()`. All virtualizer methods and live getters are available directly.\n\n| Member | Description |\n| ------------------ | ------------------------------------------------------------------------------------------- |\n| `setItems(items)` | Set the current item array. Spawns virtualizer on first non-empty call; destroys it on `[]` |\n| `count` | Current item count (live getter) |\n| `items` | Currently rendered virtual items (live getter) |\n| `totalSize` | Total list size in pixels (live getter) |\n| `scrollOffset` | Current scroll position (live getter) |\n| `stickyItems` | Sticky items pinned at viewport top (live getter) |\n| `measure` | Delegate to underlying virtualizer; no-op before first `setItems` |\n| `measureBatch` | Batch measurement delegate |\n| `measureEl` | Attach auto-measuring ResizeObserver |\n| `refresh` | Rebuild offset table and re-emit |\n| `invalidate` | Clear measurements and rebuild from estimates |\n| `scrollToIndex` | Scroll to an item |\n| `scrollToOffset` | Scroll to a pixel offset |\n| `scrollToTop` | Scroll to offset `0` |\n| `scrollToBottom` | Scroll to the end of the list |\n| `isAtEnd` | `true` when within `threshold` px of the end |\n| `dispose` | Teardown; idempotent |\n| `disposed` | `true` after `dispose()` is called (live getter) |\n| `[Symbol.dispose]` | Delegates to `dispose()` |\n\n## `createVirtualScroller(container, options)`\n\n```ts\ncreateVirtualScroller<T>(container: HTMLElement, options: VirtualScrollerOptions<T>): DomVirtualListController<T>;\n```\n\nCreates a scroll container `div` and inner list `div`, appends them to `container`, and returns a fully wired `DomVirtualListController`. Useful when the scroll DOM doesn't already exist.\n\n```ts\nconst list = createVirtualScroller<Row>(document.getElementById('root')!, {\n estimateSize: 36,\n render: ({ items, listEl, recycle }) => {\n for (const item of items) {\n const el = recycle(item.data.id, () => document.createElement('div'));\n el.textContent = item.data.label;\n el.style.cssText = `position:absolute;top:0;left:0;right:0;transform:translateY(${item.start}px);`;\n listEl.appendChild(el);\n }\n },\n});\n\nlist.setItems(rows);\nlist.dispose(); // also removes the generated scroll container\n```\n\n`VirtualScrollerOptions<T>` is `DomVirtualListOptions<T>` minus `listElement`/`scrollElement`, plus:\n\n| Option | Type | Description |\n| ---------------- | -------- | ------------------------------------------------- |\n| `containerClass` | `string` | CSS class applied to the generated scroll element |\n\n`dispose()` removes the generated scroll container from the DOM.\n\n## `createGroupedVirtualizer(target, options)`\n\n```ts\ncreateGroupedVirtualizer<T>(target: ScrollTarget, options: GroupVirtualizerOptions<T>): GroupVirtualizer<T>;\n```\n\nVirtualizes a sectioned list. Headers are automatically sticky (pinned at viewport top while the section is in view).\n\n```ts\nimport { createGroupedVirtualizer } from '@vielzeug/scroll';\n\ntype Contact = { id: number; name: string };\n\nconst virt = createGroupedVirtualizer<Contact>(scrollEl, {\n estimateHeaderSize: 32,\n estimateItemSize: 48,\n sections: [\n { label: 'A', items: [{ id: 1, name: 'Alice' }] },\n { label: 'B', items: [{ id: 2, name: 'Bob' }] },\n ],\n onChange: ({ headers, items, stickyHeader, totalSize }) => {\n listEl.style.height = `${totalSize}px`;\n listEl.replaceChildren();\n\n if (stickyHeader) {\n const el = document.createElement('div');\n el.className = 'sticky-header';\n el.textContent = stickyHeader.label;\n listEl.appendChild(el);\n }\n\n for (const header of headers) {\n const el = document.createElement('div');\n el.style.cssText = `position:absolute;top:${header.start}px;height:${header.size}px;`;\n el.textContent = header.label;\n listEl.appendChild(el);\n }\n\n for (const item of items) {\n const el = document.createElement('div');\n el.style.cssText = `position:absolute;top:${item.start}px;height:${item.size}px;`;\n el.textContent = item.data.name;\n listEl.appendChild(el);\n }\n },\n});\n\nvirt.scrollToSection(1, { align: 'start' });\nvirt.update(nextSections);\nvirt.dispose();\n```\n\n### `GroupVirtualizerOptions<T>`\n\n| Option | Type | Default | Description |\n| -------------------- | ------------------------------------------------------------------ | -------- | ----------------------------------------------------------------------- |\n| `sections` | `Array<GroupSection<T>>` | required | Initial sections |\n| `onChange` | `(state: GroupVirtualizerState<T>) => void` | — | Called when the visible window changes; replace through `update()`. |\n| `onScrollEnd` | `(offset: number) => void` | — | Called when scrolling settles; replace through `update()`. |\n| `onScrollingChange` | `(isScrolling: boolean) => void` | — | Called when scroll activity starts or stops; replace through `update()`. |\n| `estimateHeaderSize` | `number \\| (section, sectionIndex) => number` | `36` | Header height estimate |\n| `estimateItemSize` | `number \\| (item, itemIndex, sectionIndex) => number` | `36` | Item height estimate |\n| `getItemKey` | `(item: T, itemIndex: number, sectionIndex: number) => VirtualKey` | — | Stable key for measurement cache |\n| `horizontal` | `boolean` | `false` | Virtualize along X axis |\n| `measurementCache` | `MeasurementCache` | — | External measurement cache |\n| `overscan` | `number \\| { start?: number; end?: number }` | `3` | Overscan on each side (number = symmetric) |\n| `scrollEndDelay` | `number` | `150` | Debounce delay (ms) for scroll-end detection |\n\n### `GroupSection<T>`\n\n```ts\ninterface GroupSection<T> {\n items: T[];\n label: string;\n}\n```\n\n### `GroupVirtualizerState<T>`\n\n```ts\ninterface GroupVirtualizerState<T> {\n readonly headers: GroupVirtualHeader[];\n readonly items: Array<GroupVirtualItem<T>>;\n readonly stickyHeader: GroupVirtualHeader | null;\n readonly totalSize: number;\n}\n```\n\n`stickyHeader` is the header of the section currently at or above the viewport top, or `null` when at the very top. Render it as a floating overlay above the list.\n\n### `GroupVirtualItem<T>` and `GroupVirtualHeader`\n\n```ts\ninterface GroupVirtualItem<T> extends VirtualItem {\n data: T;\n itemIndex: number; // index within the section\n sectionIndex: number;\n}\n\ninterface GroupVirtualHeader extends VirtualItem {\n label: string;\n sectionIndex: number;\n}\n```\n\n### `GroupVirtualizer<T>` — methods\n\n`GroupVirtualizer<T>` is an independent interface that exposes all core virtualizer methods directly, plus grouped-specific navigation.\n\n| Method / Property | Description |\n| ---------------------------------- | ------------------------------------------------------------------------ |\n| `update(sections, opts?)` | Replace all sections with optional config overrides; see `GroupVirtualizerUpdateOptions<T>` |\n| `scrollToSection(i, options?)` | Scroll to section header at index `i`. Out-of-range is a no-op |\n| `scrollToItem(s, i, options?)` | Scroll to item `i` in section `s`. Out-of-range is a no-op |\n| `scrollToIndex(i, options?)` | Scroll to flat index `i` (from underlying virtualizer) |\n| `scrollToOffset(offset, options?)` | Scroll to a raw pixel offset |\n| `scrollToTop(options?)` | Scroll to offset `0` |\n| `scrollToBottom(options?)` | Scroll to the end of the list |\n| `measure(index, size)` | Record a measurement for a flat index |\n| `measureBatch(entries)` | Batch-record measurements for flat indices |\n| `measureEl(index, el)` | Attach auto-measuring ResizeObserver. Returns disconnect function |\n| `invalidate()` | Clear all measurements and rebuild |\n| `refresh()` | Rebuild offset table without clearing measurements |\n| `isScrolling` | `true` while the user is scrolling; `false` once scroll settles |\n| `scrollOffset` | Current scroll position in pixels (live getter) |\n| `dispose()` | Teardown; idempotent |\n| `disposed` | `true` after `dispose()` is called |\n| `[Symbol.dispose]()` | Delegates to `dispose()` |\n\nAll scroll methods accept an optional `ScrollToIndexOptions` object (`{ align?, behavior?, onComplete? }`).\n\n### `GroupVirtualizerUpdateOptions<T>`\n\nPassed as the second argument to `groupVirtualizer.update()`. All fields are optional — omit any you don't want to change.\n\n| Option | Type | Description |\n| -------------------- | ------------------------------------------------------------- | -------------------------------------------------------- |\n| `estimateHeaderSize` | `number \\| (section, sectionIndex) => number` | New header size estimate, applied on next rebuild |\n| `estimateItemSize` | `number \\| (item, itemIndex, sectionIndex) => number` | New item size estimate, applied on next rebuild |\n| `getItemKey` | `(item, itemIndex, sectionIndex) => VirtualKey` | New item key function |\n| `measurementCache` | `MeasurementCache` | Hot-swap the measurement cache |\n| `overscan` | `number \\| { start?, end? }` | New overscan count |\n\n> `onChange`, `onScrollEnd`, `onScrollingChange`, and `scrollEndDelay` can be replaced through `update()`. `horizontal` remains construction-only.\n\n## `createGridVirtualizer(target, options)`\n\n```ts\ncreateGridVirtualizer(target: ScrollTarget, options: GridVirtualizerOptions): GridVirtualizer;\n```\n\nTwo-dimensional virtualizer. Fires `onChange` with visible row and column descriptors. Callers form the cross-product `rows × cols` to render visible cells.\n\n```ts\nimport { createGridVirtualizer } from '@vielzeug/scroll';\n\nconst grid = createGridVirtualizer(scrollEl, {\n rowCount: 10_000,\n colCount: 50,\n estimateRowSize: 36,\n estimateColSize: 120,\n onChange: ({ rows, cols, totalHeight, totalWidth }) => {\n containerEl.style.cssText = `position:relative;height:${totalHeight}px;width:${totalWidth}px;`;\n containerEl.replaceChildren();\n\n for (const row of rows) {\n for (const col of cols) {\n const cell = document.createElement('div');\n cell.style.cssText = `position:absolute;top:${row.start}px;left:${col.start}px;height:${row.size}px;width:${col.size}px;`;\n cell.textContent = `${row.index},${col.index}`;\n containerEl.appendChild(cell);\n }\n }\n },\n});\n\ngrid.scrollToCell(500, 10, { rowAlign: 'center', colAlign: 'start' });\ngrid.dispose();\n```\n\n### `GridVirtualizerOptions`\n\n| Option | Type | Default | Description |\n| --------------------- | --------------------------------------- | ---------------------- | -------------------------------------- |\n| `rowCount` | `number` | required | Total row count |\n| `colCount` | `number` | required | Total column count |\n| `estimateRowSize` | `number \\| (row) => number` | `36` | Row height estimate |\n| `estimateColSize` | `number \\| (col) => number` | `36` | Column width estimate |\n| `rowGap` | `number` | `0` | Gap between rows |\n| `colGap` | `number` | `0` | Gap between columns |\n| `overscanY` | `{ start?: number; end?: number }` | `{ start: 3, end: 3 }` | Row overscan |\n| `overscanX` | `{ start?: number; end?: number }` | `{ start: 3, end: 3 }` | Column overscan |\n| `initialScrollTop` | `number` | — | Initial vertical scroll position |\n| `initialScrollLeft` | `number` | — | Initial horizontal scroll position |\n| `onChange` | `(state: GridVirtualizerState) => void` | — | Called when the visible window changes |\n| `onRangeChange` | `(range: GridRangeChangeEvent) => void` | — | Zero-allocation range callback |\n| `rowMeasurementCache` | `Map<number, number>` | — | External row measurement cache |\n| `colMeasurementCache` | `Map<number, number>` | — | External column measurement cache |\n\n### `GridVirtualizerState`\n\n```ts\ninterface GridVirtualizerState {\n readonly cols: VirtualItem[];\n readonly rows: VirtualItem[];\n readonly totalHeight: number;\n readonly totalWidth: number;\n}\n```\n\n### `GridVirtualizer` — properties and methods\n\n**Read-only properties:** `rows`, `cols`, `scrollTop`, `scrollLeft`, `totalHeight`, `totalWidth`\n\n| Method | Description |\n| ---------------------------------- | --------------------------------------------------------------------------------- |\n| `update(next)` | Atomically update row/col counts, estimates, gaps, and overscan |\n| `measureRow(row, size)` | Record a row height |\n| `measureColumn(col, size)` | Record a column width |\n| `measureBatch(rows, cols)` | Measure rows and columns in a single coordinated rebuild pass |\n| `measureRowEl(row, el)` | Auto-measure row height via ResizeObserver. Returns disconnect fn |\n| `measureColEl(col, el)` | Auto-measure column width via ResizeObserver. Returns disconnect fn |\n| `refresh()` | Rebuild offset tables from current measurements |\n| `invalidate()` | Clear all measurements and rebuild from estimates |\n| `scrollToCell(row, col, options?)` | Scroll to bring a cell into view; no-op when `rowCount === 0` or `colCount === 0` |\n| `scrollToRow(row, options?)` | Scroll to bring a row into view; `rowAlign` controls alignment |\n| `scrollToColumn(col, options?)` | Scroll to bring a column into view; `colAlign` controls alignment |\n| `prependRows(n)` | Add `n` rows at the top; adjusts scroll offset to keep viewport stable |\n| `dispose()` | Teardown; idempotent |\n| `[Symbol.dispose]()` | Delegates to `dispose()` |\n\n`measureRowEl`/`measureColEl`'s `ResizeObserver` is also disconnected automatically on `dispose()` —\nthe returned disconnect function is only needed to stop observing a specific element early.\n\n### `ScrollToCellOptions`\n\n```ts\ninterface ScrollToCellOptions {\n behavior?: ScrollBehavior;\n colAlign?: 'auto' | 'center' | 'end' | 'start';\n rowAlign?: 'auto' | 'center' | 'end' | 'start';\n}\n```\n\n## `createReactiveGroupedVirtualizer(target, options)`\n\n```ts\ncreateReactiveGroupedVirtualizer<T>(\n target: ScrollTarget,\n options: Omit<GroupVirtualizerOptions<T>, 'onChange'>,\n): ReactiveGroupVirtualizer<T>;\n```\n\nWraps `createGroupedVirtualizer` and exposes state as a `Signal<GroupVirtualizerState<T>>` from `@vielzeug/ripple`. All `GroupVirtualizer<T>` methods and live getters are available. `onChange` must not be provided — it is wired internally.\n\n```ts\nimport { createReactiveGroupedVirtualizer } from '@vielzeug/scroll';\nimport { effect } from '@vielzeug/ripple';\n\nconst virt = createReactiveGroupedVirtualizer<Contact>(scrollEl, {\n estimateHeaderSize: 32,\n estimateItemSize: 48,\n sections,\n});\n\neffect(() => {\n const { headers, items, stickyHeader, totalSize } = virt.state.value;\n render(headers, items, stickyHeader, totalSize);\n});\n\nvirt.update(nextSections);\nvirt.dispose();\n```\n\n### `ReactiveGroupVirtualizer<T>`\n\n```ts\ninterface ReactiveGroupVirtualizer<T> extends GroupVirtualizer<T> {\n readonly state: Signal<GroupVirtualizerState<T>>;\n}\n```\n\nThe `state` signal is updated synchronously on every render cycle. All live getters remain current through copied property descriptors.\n\n## `createReactiveVirtualizer(target, options)`\n\n```ts\ncreateReactiveVirtualizer(\n target: ScrollTarget,\n options: Omit<VirtualizerOptions, 'onChange'>,\n): ReactiveVirtualizer;\n```\n\nWraps `createVirtualizer` and exposes state as a `Signal<VirtualizerState>` from `@vielzeug/ripple`. All `Virtualizer` methods and live getters are available on the returned object. `onChange` must not be provided — it is wired internally.\n\n```ts\nimport { createReactiveVirtualizer } from '@vielzeug/scroll';\nimport { effect } from '@vielzeug/ripple';\n\nconst virt = createReactiveVirtualizer(scrollEl, {\n count: 1000,\n estimateSize: 40,\n});\n\neffect(() => {\n const { items, totalSize } = virt.state.value;\n listEl.style.height = `${totalSize}px`;\n listEl.replaceChildren();\n for (const item of items) {\n const el = document.createElement('div');\n el.style.cssText = `position:absolute;top:${item.start}px;height:${item.size}px;`;\n listEl.appendChild(el);\n }\n});\n\nvirt.update({ count: 2000 });\nvirt.dispose();\n```\n\n### `ReactiveVirtualizer`\n\n```ts\ninterface ReactiveVirtualizer extends Virtualizer {\n readonly state: Signal<VirtualizerState>;\n}\n```\n\nThe `state` signal is updated synchronously whenever the visible window changes. All live getters (`count`, `items`, `totalSize`, `scrollOffset`, `stickyItems`) remain current.\n\n## Types\n\n### `VirtualItem`\n\n```ts\ninterface VirtualItem {\n end: number;\n index: number;\n size: number;\n start: number;\n}\n```\n\n### `VirtualizerState`\n\n```ts\ninterface VirtualizerState {\n readonly items: VirtualItem[];\n readonly stickyItems: VirtualItem[];\n readonly totalSize: number;\n}\n```\n\n### `ScrollToIndexOptions`\n\n```ts\ninterface ScrollToIndexOptions {\n align?: 'auto' | 'center' | 'end' | 'start';\n behavior?: ScrollBehavior;\n /** Called when the scroll animation completes (instant scrolls: next microtask). */\n onComplete?: () => void;\n}\n```\n\n### `Overscan`\n\n```ts\ntype Overscan = number | { end?: number; start?: number };\n```\n\nPassing a number is shorthand for symmetric overscan on both sides.\n\n### `VirtualKey`\n\n```ts\ntype VirtualKey = number | string;\n```\n\n### `VirtualRenderItem<T>`\n\n```ts\ntype VirtualRenderItem<T> = VirtualItem & { readonly data: T };\n```\n\n### `ScrollTarget`\n\n```ts\ntype ScrollTarget = HTMLElement | Window;\n```\n\n### `MeasurementCache`\n\n```ts\ntype MeasurementCache = Map<VirtualKey, number>;\n```\n\nUse `createMeasurementCache()` to create an empty cache:\n\n```ts\nimport { createMeasurementCache } from '@vielzeug/scroll';\n\nconst cache = createMeasurementCache();\nconst virt1 = createVirtualizer(el1, { count: 100, measurementCache: cache });\nconst virt2 = createVirtualizer(el2, { count: 100, measurementCache: cache });\n```\n\n### `RecycleFn`\n\n```ts\ntype RecycleFn = (key: VirtualKey, create: () => HTMLElement) => HTMLElement;\n```\n\n### `VirtualizerUpdateOptions`\n\n```ts\ninterface VirtualizerUpdateOptions {\n count?: number;\n estimateSize?: number | ((index: number) => number);\n gap?: number;\n getItemKey?: (index: number) => VirtualKey;\n /** Replace the active measurement cache. Existing entries are used immediately on the next rebuild. */\n measurementCache?: MeasurementCache;\n overscan?: Overscan;\n sticky?: (index: number) => boolean;\n}\n```\n\n### `VirtualScrollerOptions<T>`\n\n`DomVirtualListOptions<T>` minus `listElement` and `scrollElement`, plus:\n\n```ts\ntype VirtualScrollerOptions<T> = Omit<DomVirtualListOptions<T>, 'listElement' | 'scrollElement'> & {\n /** CSS class applied to the generated scroll container element. */\n containerClass?: string;\n};\n```\n\n### `GridVirtualizerUpdateOptions`\n\n```ts\ninterface GridVirtualizerUpdateOptions {\n colCount?: number;\n colGap?: number;\n estimateColSize?: number | ((col: number) => number);\n estimateRowSize?: number | ((row: number) => number);\n overscanX?: { end?: number; start?: number };\n overscanY?: { end?: number; start?: number };\n rowCount?: number;\n rowGap?: number;\n}\n```\n\n### `GridRangeChangeEvent`\n\nFired by `onRangeChange` on `createGridVirtualizer`. Zero-allocation alternative to `onChange` — no `rows`/`cols` arrays are allocated.\n\n```ts\ninterface GridRangeChangeEvent {\n firstCol: number;\n firstRow: number;\n lastCol: number;\n lastRow: number;\n}\n```\n\n## Errors\n\n| Class | Thrown when | Notable properties |\n| --- | --- | --- |\n| `ScrollError` | Base class for every Scroll error. | `ScrollError.is(error)` narrows errors from this package. |\n| `ScrollConfigurationError` | A constructor or `update()` receives invalid static configuration. | Extends `ScrollError`; malformed JavaScript values also use this class. |\n| `ScrollRangeError` | A DOM virtual-list render detects that a caller mutated its items array without calling `setItems()` again. | Extends `ScrollError`; message includes stale index and current item count. |\n\nRuntime estimator failures, stale measurements, and out-of-range navigation remain resilient: they fall back, no-op, or clamp as documented.\n\n### Constants\n\n```ts\nconst DEFAULT_ESTIMATE_SIZE = 36; // default estimateSize\nconst DEFAULT_OVERSCAN = 3; // default overscan on each side\n```\n",
@@ -64,11 +64,6 @@
64
64
  }
65
65
  ],
66
66
  "typeSignatures": {
67
- "ScrollConfigurationError": "export { ScrollConfigurationError, ScrollError, ScrollRangeError } from './errors';",
68
- "ScrollError": "export { ScrollConfigurationError, ScrollError, ScrollRangeError } from './errors';",
69
- "ScrollRangeError": "export { ScrollConfigurationError, ScrollError, ScrollRangeError } from './errors';",
70
- "createDomVirtualList": "export { createDomVirtualList, createVirtualScroller } from './dom-virtual-list';",
71
- "createVirtualScroller": "export { createDomVirtualList, createVirtualScroller } from './dom-virtual-list';",
72
67
  "DomVirtualListController": "export type {\n DomVirtualListController,\n DomVirtualListOptions,\n DomVirtualListRenderArgs,\n RecycleFn,\n StickToBottomOptions,\n VirtualRenderItem,\n VirtualScrollerOptions,\n} from './dom-virtual-list';",
73
68
  "DomVirtualListOptions": "export type {\n DomVirtualListController,\n DomVirtualListOptions,\n DomVirtualListRenderArgs,\n RecycleFn,\n StickToBottomOptions,\n VirtualRenderItem,\n VirtualScrollerOptions,\n} from './dom-virtual-list';",
74
69
  "DomVirtualListRenderArgs": "export type {\n DomVirtualListController,\n DomVirtualListOptions,\n DomVirtualListRenderArgs,\n RecycleFn,\n StickToBottomOptions,\n VirtualRenderItem,\n VirtualScrollerOptions,\n} from './dom-virtual-list';",
@@ -76,14 +71,18 @@
76
71
  "StickToBottomOptions": "export type {\n DomVirtualListController,\n DomVirtualListOptions,\n DomVirtualListRenderArgs,\n RecycleFn,\n StickToBottomOptions,\n VirtualRenderItem,\n VirtualScrollerOptions,\n} from './dom-virtual-list';",
77
72
  "VirtualRenderItem": "export type {\n DomVirtualListController,\n DomVirtualListOptions,\n DomVirtualListRenderArgs,\n RecycleFn,\n StickToBottomOptions,\n VirtualRenderItem,\n VirtualScrollerOptions,\n} from './dom-virtual-list';",
78
73
  "VirtualScrollerOptions": "export type {\n DomVirtualListController,\n DomVirtualListOptions,\n DomVirtualListRenderArgs,\n RecycleFn,\n StickToBottomOptions,\n VirtualRenderItem,\n VirtualScrollerOptions,\n} from './dom-virtual-list';",
79
- "createGridVirtualizer": "export { createGridVirtualizer } from './grid-virtualizer';",
74
+ "createDomVirtualList": "export { createDomVirtualList, createVirtualScroller } from './dom-virtual-list';",
75
+ "createVirtualScroller": "export { createDomVirtualList, createVirtualScroller } from './dom-virtual-list';",
76
+ "ScrollConfigurationError": "export { ScrollConfigurationError, ScrollError, ScrollRangeError } from './errors';",
77
+ "ScrollError": "export { ScrollConfigurationError, ScrollError, ScrollRangeError } from './errors';",
78
+ "ScrollRangeError": "export { ScrollConfigurationError, ScrollError, ScrollRangeError } from './errors';",
80
79
  "GridRangeChangeEvent": "export type {\n GridRangeChangeEvent,\n GridVirtualizer,\n GridVirtualizerOptions,\n GridVirtualizerState,\n GridVirtualizerUpdateOptions,\n ScrollToCellOptions,\n} from './grid-virtualizer';",
81
80
  "GridVirtualizer": "export type {\n GridRangeChangeEvent,\n GridVirtualizer,\n GridVirtualizerOptions,\n GridVirtualizerState,\n GridVirtualizerUpdateOptions,\n ScrollToCellOptions,\n} from './grid-virtualizer';",
82
81
  "GridVirtualizerOptions": "export type {\n GridRangeChangeEvent,\n GridVirtualizer,\n GridVirtualizerOptions,\n GridVirtualizerState,\n GridVirtualizerUpdateOptions,\n ScrollToCellOptions,\n} from './grid-virtualizer';",
83
82
  "GridVirtualizerState": "export type {\n GridRangeChangeEvent,\n GridVirtualizer,\n GridVirtualizerOptions,\n GridVirtualizerState,\n GridVirtualizerUpdateOptions,\n ScrollToCellOptions,\n} from './grid-virtualizer';",
84
83
  "GridVirtualizerUpdateOptions": "export type {\n GridRangeChangeEvent,\n GridVirtualizer,\n GridVirtualizerOptions,\n GridVirtualizerState,\n GridVirtualizerUpdateOptions,\n ScrollToCellOptions,\n} from './grid-virtualizer';",
85
84
  "ScrollToCellOptions": "export type {\n GridRangeChangeEvent,\n GridVirtualizer,\n GridVirtualizerOptions,\n GridVirtualizerState,\n GridVirtualizerUpdateOptions,\n ScrollToCellOptions,\n} from './grid-virtualizer';",
86
- "createGroupedVirtualizer": "export { createGroupedVirtualizer } from './grouped-virtualizer';",
85
+ "createGridVirtualizer": "export { createGridVirtualizer } from './grid-virtualizer';",
87
86
  "GroupSection": "export type {\n GroupSection,\n GroupVirtualHeader,\n GroupVirtualItem,\n GroupVirtualizer,\n GroupVirtualizerOptions,\n GroupVirtualizerState,\n GroupVirtualizerUpdateOptions,\n} from './grouped-virtualizer';",
88
87
  "GroupVirtualHeader": "export type {\n GroupSection,\n GroupVirtualHeader,\n GroupVirtualItem,\n GroupVirtualizer,\n GroupVirtualizerOptions,\n GroupVirtualizerState,\n GroupVirtualizerUpdateOptions,\n} from './grouped-virtualizer';",
89
88
  "GroupVirtualItem": "export type {\n GroupSection,\n GroupVirtualHeader,\n GroupVirtualItem,\n GroupVirtualizer,\n GroupVirtualizerOptions,\n GroupVirtualizerState,\n GroupVirtualizerUpdateOptions,\n} from './grouped-virtualizer';",
@@ -91,15 +90,12 @@
91
90
  "GroupVirtualizerOptions": "export type {\n GroupSection,\n GroupVirtualHeader,\n GroupVirtualItem,\n GroupVirtualizer,\n GroupVirtualizerOptions,\n GroupVirtualizerState,\n GroupVirtualizerUpdateOptions,\n} from './grouped-virtualizer';",
92
91
  "GroupVirtualizerState": "export type {\n GroupSection,\n GroupVirtualHeader,\n GroupVirtualItem,\n GroupVirtualizer,\n GroupVirtualizerOptions,\n GroupVirtualizerState,\n GroupVirtualizerUpdateOptions,\n} from './grouped-virtualizer';",
93
92
  "GroupVirtualizerUpdateOptions": "export type {\n GroupSection,\n GroupVirtualHeader,\n GroupVirtualItem,\n GroupVirtualizer,\n GroupVirtualizerOptions,\n GroupVirtualizerState,\n GroupVirtualizerUpdateOptions,\n} from './grouped-virtualizer';",
94
- "createReactiveGroupedVirtualizer": "export { createReactiveGroupedVirtualizer, createReactiveVirtualizer } from './reactive';",
95
- "createReactiveVirtualizer": "export { createReactiveGroupedVirtualizer, createReactiveVirtualizer } from './reactive';",
93
+ "createGroupedVirtualizer": "export { createGroupedVirtualizer } from './grouped-virtualizer';",
96
94
  "ReactiveGroupVirtualizer": "export type { ReactiveGroupVirtualizer, ReactiveVirtualizer, Signal } from './reactive';",
97
95
  "ReactiveVirtualizer": "export type { ReactiveGroupVirtualizer, ReactiveVirtualizer, Signal } from './reactive';",
98
96
  "Signal": "export type { ReactiveGroupVirtualizer, ReactiveVirtualizer, Signal } from './reactive';",
99
- "createMeasurementCache": "export { createMeasurementCache, createVirtualizer, DEFAULT_ESTIMATE_SIZE, DEFAULT_OVERSCAN } from './virtualizer';",
100
- "createVirtualizer": "export { createMeasurementCache, createVirtualizer, DEFAULT_ESTIMATE_SIZE, DEFAULT_OVERSCAN } from './virtualizer';",
101
- "DEFAULT_ESTIMATE_SIZE": "export { createMeasurementCache, createVirtualizer, DEFAULT_ESTIMATE_SIZE, DEFAULT_OVERSCAN } from './virtualizer';",
102
- "DEFAULT_OVERSCAN": "export { createMeasurementCache, createVirtualizer, DEFAULT_ESTIMATE_SIZE, DEFAULT_OVERSCAN } from './virtualizer';",
97
+ "createReactiveGroupedVirtualizer": "export { createReactiveGroupedVirtualizer, createReactiveVirtualizer } from './reactive';",
98
+ "createReactiveVirtualizer": "export { createReactiveGroupedVirtualizer, createReactiveVirtualizer } from './reactive';",
103
99
  "MeasurementCache": "export type {\n MeasurementCache,\n Overscan,\n ScrollTarget,\n ScrollToIndexOptions,\n VirtualItem,\n Virtualizer,\n VirtualizerOptions,\n VirtualizerState,\n VirtualizerUpdateOptions,\n VirtualKey,\n} from './virtualizer';",
104
100
  "Overscan": "export type {\n MeasurementCache,\n Overscan,\n ScrollTarget,\n ScrollToIndexOptions,\n VirtualItem,\n Virtualizer,\n VirtualizerOptions,\n VirtualizerState,\n VirtualizerUpdateOptions,\n VirtualKey,\n} from './virtualizer';",
105
101
  "ScrollTarget": "export type {\n MeasurementCache,\n Overscan,\n ScrollTarget,\n ScrollToIndexOptions,\n VirtualItem,\n Virtualizer,\n VirtualizerOptions,\n VirtualizerState,\n VirtualizerUpdateOptions,\n VirtualKey,\n} from './virtualizer';",
@@ -109,6 +105,10 @@
109
105
  "VirtualizerOptions": "export type {\n MeasurementCache,\n Overscan,\n ScrollTarget,\n ScrollToIndexOptions,\n VirtualItem,\n Virtualizer,\n VirtualizerOptions,\n VirtualizerState,\n VirtualizerUpdateOptions,\n VirtualKey,\n} from './virtualizer';",
110
106
  "VirtualizerState": "export type {\n MeasurementCache,\n Overscan,\n ScrollTarget,\n ScrollToIndexOptions,\n VirtualItem,\n Virtualizer,\n VirtualizerOptions,\n VirtualizerState,\n VirtualizerUpdateOptions,\n VirtualKey,\n} from './virtualizer';",
111
107
  "VirtualizerUpdateOptions": "export type {\n MeasurementCache,\n Overscan,\n ScrollTarget,\n ScrollToIndexOptions,\n VirtualItem,\n Virtualizer,\n VirtualizerOptions,\n VirtualizerState,\n VirtualizerUpdateOptions,\n VirtualKey,\n} from './virtualizer';",
112
- "VirtualKey": "export type {\n MeasurementCache,\n Overscan,\n ScrollTarget,\n ScrollToIndexOptions,\n VirtualItem,\n Virtualizer,\n VirtualizerOptions,\n VirtualizerState,\n VirtualizerUpdateOptions,\n VirtualKey,\n} from './virtualizer';"
108
+ "VirtualKey": "export type {\n MeasurementCache,\n Overscan,\n ScrollTarget,\n ScrollToIndexOptions,\n VirtualItem,\n Virtualizer,\n VirtualizerOptions,\n VirtualizerState,\n VirtualizerUpdateOptions,\n VirtualKey,\n} from './virtualizer';",
109
+ "createMeasurementCache": "export { createMeasurementCache, createVirtualizer, DEFAULT_ESTIMATE_SIZE, DEFAULT_OVERSCAN } from './virtualizer';",
110
+ "createVirtualizer": "export { createMeasurementCache, createVirtualizer, DEFAULT_ESTIMATE_SIZE, DEFAULT_OVERSCAN } from './virtualizer';",
111
+ "DEFAULT_ESTIMATE_SIZE": "export { createMeasurementCache, createVirtualizer, DEFAULT_ESTIMATE_SIZE, DEFAULT_OVERSCAN } from './virtualizer';",
112
+ "DEFAULT_OVERSCAN": "export { createMeasurementCache, createVirtualizer, DEFAULT_ESTIMATE_SIZE, DEFAULT_OVERSCAN } from './virtualizer';"
113
113
  }
114
114
  }
@@ -1,5 +1,5 @@
1
1
  {
2
- "apiSource": "export { createCursorSource } from './cursorSource';\nexport { createInfiniteSource } from './infiniteSource';\nexport { createLocalSource } from './localSource';\nexport { createPageSource } from './pageSource';\nexport type {\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n AnyPagination,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';\n",
2
+ "apiSource": "export { createCursorSource } from './cursorSource';\nexport { createInfiniteSource } from './infiniteSource';\nexport { createLocalSource } from './localSource';\nexport { createPageSource } from './pageSource';\nexport type {\n AnyPagination,\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';\n",
3
3
  "docs": {
4
4
  "index": "---\ntitle: Sourcerer — Reactive Query Sources\ndescription: Framework-agnostic collection sources for local, page, cursor, and infinite pagination.\npackage: sourcerer\ncategory: data\nkeywords: [pagination, data-source, cursor, infinite-scroll, search]\nrelated: [courier, ripple, scout, wayfinder]\nexports:\n [\n createCursorSource,\n createInfiniteSource,\n createLocalSource,\n createPageSource,\n AnyPagination,\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n ]\nenvironments: [browser, node, ssr, deno]\n---\n\n<!-- markdownlint-disable MD025 MD033 MD060 -->\n\n<PackageHero package=\"sourcerer\" />\n\n## Why Sourcerer?\n\nLists often combine pagination, search, request cancellation, and render state. Sourcerer gives local arrays and remote loaders one snapshot contract while leaving caching, retries, and transport policy to your application.\n\n```ts\nimport { createPageSource } from '@vielzeug/sourcerer';\n\ntype User = { id: number; name: string };\n\n// Before: query changes can mix old items with new loading and page state.\nlet items: User[] = [];\nlet page = 1;\nlet isLoading = false;\n\n// After: one source publishes internally consistent loaded state.\nconst source = createPageSource<User>({\n autoStart: false,\n load: async () => ({ data: [{ id: 1, name: 'Ada' }], total: 1 }),\n});\nsource.subscribe((snapshot) => console.log(snapshot.data));\nsource.dispose();\n```\n\n| Feature | Sourcerer | Manual list state | Courier query cache |\n| --- | --- | --- | --- |\n| Bundle size | <PackageInfo package=\"sourcerer\" type=\"size\" /> | Application-defined | <PackageInfo package=\"courier\" type=\"size\" /> |\n| Zero runtime dependencies | <ore-icon name=\"check\" size=\"16\"></ore-icon> | <ore-icon name=\"check\" size=\"16\"></ore-icon> | <ore-icon name=\"x\" size=\"16\"></ore-icon> |\n| Local and remote collections | <ore-icon name=\"check\" size=\"16\"></ore-icon> | Application-defined | <ore-icon name=\"triangle-alert\" size=\"16\"></ore-icon> |\n| Cursor and infinite pagination | <ore-icon name=\"check\" size=\"16\"></ore-icon> | Application-defined | <ore-icon name=\"triangle-alert\" size=\"16\"></ore-icon> |\n| Latest-request cancellation | <ore-icon name=\"check\" size=\"16\"></ore-icon> | Application-defined | Transport-level |\n\n<div class=\"decision-callout\">\n\n**Use Sourcerer when** one UI collection needs local or remote pagination with an explicit, framework-independent snapshot contract.\n\n**Consider Courier alone when** you only need cached HTTP queries and pagination state belongs elsewhere.\n\n</div>\n\n## Installation\n\n::: code-group\n\n```sh [pnpm]\npnpm add @vielzeug/sourcerer\n```\n\n```sh [npm]\nnpm install @vielzeug/sourcerer\n```\n\n```sh [yarn]\nyarn add @vielzeug/sourcerer\n```\n\n:::\n\n## Quick Start\n\nCreate a page source, load it, then dispose it with its owner.\n\n```ts\nimport { createPageSource } from '@vielzeug/sourcerer';\n\ntype User = { id: number; name: string };\n\nconst source = createPageSource<User>({\n autoStart: false,\n load: async ({ query }) => {\n const users = [\n { id: 1, name: 'Ada' },\n { id: 2, name: 'Grace' },\n { id: 3, name: 'Linus' },\n ];\n const start = (query.page - 1) * query.pageSize;\n\n return { data: users.slice(start, start + query.pageSize), total: users.length };\n },\n});\n\ntry {\n await source.reload();\n console.log(source.snapshot.data);\n} catch (error) {\n console.error(error);\n} finally {\n source.dispose();\n}\n```\n\n## Features\n\n<div class=\"features-grid\">\n\n- `createLocalSource()` — synchronous search and numbered pagination over an array\n- `createPageSource()` — numbered remote pages with latest-request cancellation\n- `createCursorSource()` — sequential opaque-cursor navigation\n- `createInfiniteSource()` — append-only page loading\n- `SourceSnapshot` — loaded `query`, `data`, and `pagination` plus optional `pendingQuery`\n- `debugSource()` — opt-in `console.debug` observer from `/devtools`\n\n</div>\n\n## Documentation\n\n<div class=\"doc-links\">\n\n- [Usage Guide](./usage.md)\n- [API Reference](./api.md)\n- [Examples](./examples.md)\n- [Migration Guide](./migration.md)\n\n</div>\n\n## See Also\n\n<div class=\"see-also\">\n\n- [Courier](/courier/) — use as transport, caching, and retry policy inside a page loader\n- [Scout](/scout/) — adapt an indexed search matcher for local sources\n- [Ripple](/ripple/) — project source snapshots into reactive application state\n- [Wayfinder](/wayfinder/) — validate and synchronize page query fields with route state\n\n</div>\n\n<!-- markdownlint-enable MD025 MD033 MD060 -->\n",
5
5
  "api": "---\ntitle: Sourcerer — API Reference\ndescription: Public API for @vielzeug/sourcerer.\n---\n\n[[toc]]\n\n## API Overview\n\n| Symbol | Purpose | Execution | Common gotcha |\n| --- | --- | --- | --- |\n| `createLocalSource()` | In-memory search and pagination | Sync | Prepare filtering and ranking before `setData()` |\n| `createPageSource()` | Numbered async pages | Async | `query` remains loaded state while `pendingQuery` is active |\n| `createCursorSource()` | Cursor-based async pages | Async | `after` and `before` cannot coexist |\n| `createInfiniteSource()` | Appended async pages | Async | `loadMore()` does nothing while fetching or exhausted |\n| `SourceSnapshot` | Atomic loaded state plus pending request | Type | Read `pendingQuery` for newer in-flight state |\n| `debugSource()` | Console debug observer | Sync | Import from `/devtools` |\n\n## Package Entry Point\n\n| Import | Purpose |\n| --- | --- |\n| `@vielzeug/sourcerer` | Factories and public types |\n| `@vielzeug/sourcerer/devtools` | `debugSource()` observer |\n\n## Factories\n\n### `createLocalSource()`\n\n```ts\nfunction createLocalSource<T>(data: readonly T[], config?: LocalSourceConfig<T>): LocalSource<T>\n```\n\nCreates a synchronous source over an in-memory collection.\n\n| Option | Type | Description |\n| --- | --- | --- |\n| `initialQuery` | `LocalQueryPatch` | Initial page, page size, or search value |\n| `match` | `(item, search) => boolean` | Explicit search predicate |\n\n**Returns:** `LocalSource<T>`.\n\n```ts\nimport { createLocalSource } from '@vielzeug/sourcerer';\n\nconst users = createLocalSource(\n [{ id: 1, name: 'Ada' }],\n {\n initialQuery: { pageSize: 20 },\n match: (user, search) => user.name.toLowerCase().includes(search.toLowerCase()),\n },\n);\n\nusers.setQuery({ search: 'ada' });\n```\n\n---\n\n### `createPageSource()`\n\n```ts\nfunction createPageSource<T, TFilter = unknown, TSort = unknown>(\n config: PageSourceConfig<T, TFilter, TSort>,\n): PageSource<T, TFilter, TSort>\n```\n\nCreates a numbered source. New queries abort older work. Loaded state stays in `snapshot`; newer work appears in `snapshot.pendingQuery`.\n\n| Option | Type | Description |\n| --- | --- | --- |\n| `autoStart` | `boolean` | Start initial request; default `true` |\n| `initialQuery` | `PageQueryPatch<TFilter, TSort>` | Initial query values |\n| `load` | `(context) => Promise<PageResult<T>>` | Transport callback |\n\n**Returns:** `PageSource<T, TFilter, TSort>`.\n\n```ts\nimport { createPageSource } from '@vielzeug/sourcerer';\n\nconst users = createPageSource({\n autoStart: false,\n load: async () => ({ data: [{ id: 1, name: 'Ada' }], total: 1 }),\n});\n\nawait users.setQuery({ page: 1 });\nusers.dispose();\n```\n\n---\n\n### `createCursorSource()`\n\n```ts\nfunction createCursorSource<T, TCursor = string>(\n config: CursorSourceConfig<T, TCursor>,\n): CursorSource<T, TCursor>\n```\n\nCreates a sequential cursor source. Search and page-size changes reset cursors.\n\n**Returns:** `CursorSource<T, TCursor>`.\n\n```ts\nimport { createCursorSource } from '@vielzeug/sourcerer';\n\nconst orders = createCursorSource({\n autoStart: false,\n load: async () => ({ data: ['order-1'] }),\n});\n\nawait orders.reload();\nawait orders.page.next();\norders.dispose();\n```\n\n---\n\n### `createInfiniteSource()`\n\n```ts\nfunction createInfiniteSource<T>(config: InfiniteSourceConfig<T>): InfiniteSource<T>\n```\n\nCreates an append-only source. Query changes replace loaded collection after successful first-page load.\n\n**Returns:** `InfiniteSource<T>`.\n\n```ts\nimport { createInfiniteSource } from '@vielzeug/sourcerer';\n\nconst feed = createInfiniteSource({\n autoStart: false,\n load: async () => ({ data: ['post-1'], total: 1 }),\n});\n\nawait feed.loadMore();\nfeed.dispose();\n```\n\n## Types\n\n### Source primitives\n\n```ts\ntype Disposable = {\n [Symbol.dispose](): void;\n readonly disposalSignal: AbortSignal;\n dispose(): void;\n readonly disposed: boolean;\n};\n\ntype SourceSnapshot<T, TQuery, TPagination extends AnyPagination = AnyPagination> = Readonly<{\n data: readonly T[];\n error: Error | null;\n isFetching: boolean;\n pagination: TPagination;\n pendingQuery?: TQuery;\n query: TQuery;\n}>;\n\ntype Source<T, TQuery, TPagination extends AnyPagination = AnyPagination> = Disposable & {\n readonly snapshot: SourceSnapshot<T, TQuery, TPagination>;\n subscribe(listener: (snapshot: SourceSnapshot<T, TQuery, TPagination>) => void): () => void;\n};\n```\n\n### Numbered pages\n\n```ts\ntype PagePagination = Readonly<{\n count: number;\n hasNext: boolean;\n hasPrevious: boolean;\n index: number;\n kind: 'page';\n size: number;\n total: number;\n}>;\n\ntype PageQuery<TFilter = unknown, TSort = unknown> = Readonly<{\n filter?: TFilter;\n page: number;\n pageSize: number;\n search: string;\n sort?: TSort;\n}>;\n\ntype PageQueryPatch<TFilter = unknown, TSort = unknown> = Readonly<{\n filter?: TFilter | undefined;\n page?: number;\n pageSize?: number;\n search?: string;\n sort?: TSort | undefined;\n}>;\n\ntype PageResult<T> = Readonly<{ data: readonly T[]; total: number }>;\ntype PageLoadContext<TQuery> = Readonly<{ query: TQuery; signal: AbortSignal }>;\n\ntype PageSourceConfig<T, TFilter = unknown, TSort = unknown> = Readonly<{\n autoStart?: boolean;\n initialQuery?: PageQueryPatch<TFilter, TSort>;\n load(context: PageLoadContext<PageQuery<TFilter, TSort>>): Promise<PageResult<T>>;\n}>;\n\ntype PageSource<T, TFilter = unknown, TSort = unknown> = Source<T, PageQuery<TFilter, TSort>, PagePagination> & {\n readonly page: Readonly<{\n go(index: number): Promise<void>;\n last(): Promise<void>;\n next(): Promise<void>;\n previous(): Promise<void>;\n }>;\n reload(): Promise<void>;\n setQuery(changes: PageQueryPatch<TFilter, TSort>): Promise<void>;\n};\n```\n\n### Local sources\n\n```ts\ntype LocalQuery = Readonly<{ page: number; pageSize: number; search: string }>;\ntype LocalQueryPatch = Readonly<{ page?: number; pageSize?: number; search?: string }>;\ntype LocalSourceConfig<T> = Readonly<{\n initialQuery?: LocalQueryPatch;\n match?: (item: T, search: string) => boolean;\n}>;\n\ntype LocalSource<T> = Source<T, LocalQuery, PagePagination> & {\n readonly page: Readonly<{\n go(index: number): boolean;\n last(): boolean;\n next(): boolean;\n previous(): boolean;\n }>;\n setData(data: readonly T[]): boolean;\n setQuery(changes: LocalQueryPatch): boolean;\n};\n```\n\n### Cursor and infinite sources\n\n```ts\ntype CursorPagination<TCursor = string> = Readonly<{\n hasNext: boolean;\n hasPrevious: boolean;\n kind: 'cursor';\n nextCursor?: TCursor;\n previousCursor?: TCursor;\n total?: number;\n}>;\n\ntype CursorQuery<TCursor = string> = Readonly<{\n after?: TCursor;\n before?: TCursor;\n pageSize: number;\n search: string;\n}>;\n\ntype CursorQueryPatch<TCursor = string> = Readonly<{\n after?: TCursor | undefined;\n before?: TCursor | undefined;\n pageSize?: number;\n search?: string;\n}>;\n\ntype CursorResult<T, TCursor = string> = Readonly<{\n data: readonly T[];\n nextCursor?: TCursor;\n previousCursor?: TCursor;\n total?: number;\n}>;\n\ntype CursorSourceConfig<T, TCursor = string> = Readonly<{\n autoStart?: boolean;\n initialQuery?: CursorQueryPatch<TCursor>;\n load(context: PageLoadContext<CursorQuery<TCursor>>): Promise<CursorResult<T, TCursor>>;\n}>;\n\ntype CursorSource<T, TCursor = string> = Source<T, CursorQuery<TCursor>, CursorPagination<TCursor>> & {\n readonly page: Readonly<{ next(): Promise<void>; previous(): Promise<void> }>;\n reload(): Promise<void>;\n setQuery(changes: CursorQueryPatch<TCursor>): Promise<void>;\n};\n\ntype InfinitePagination = Readonly<{\n hasMore: boolean;\n isLoadingMore: boolean;\n kind: 'infinite';\n loaded: number;\n total: number;\n}>;\n\ntype InfiniteQuery = Readonly<{ pageSize: number; search: string }>;\ntype InfiniteQueryPatch = Readonly<{ pageSize?: number; search?: string }>;\n\ntype InfiniteSourceConfig<T> = Readonly<{\n autoStart?: boolean;\n initialQuery?: InfiniteQueryPatch;\n load(context: PageLoadContext<PageQuery>): Promise<PageResult<T>>;\n}>;\n\ntype InfiniteSource<T> = Source<T, InfiniteQuery, InfinitePagination> & {\n loadMore(): Promise<void>;\n reload(): Promise<void>;\n setQuery(changes: InfiniteQueryPatch): Promise<void>;\n};\n```\n\n### Shared helpers\n\n```ts\ntype AnyPagination = CursorPagination<unknown> | InfinitePagination | PagePagination;\ntype Predicate<T> = (value: T, index: number, values: readonly T[]) => boolean;\ntype Sorter<T> = (left: T, right: T) => number;\n```\n\n## Devtools\n\n```ts\nimport { debugSource } from '@vielzeug/sourcerer/devtools';\n\nconst stopDebugging = debugSource(source, { label: 'users' });\nstopDebugging();\n```\n",
@@ -43,32 +43,32 @@
43
43
  "createInfiniteSource": "export { createInfiniteSource } from './infiniteSource';",
44
44
  "createLocalSource": "export { createLocalSource } from './localSource';",
45
45
  "createPageSource": "export { createPageSource } from './pageSource';",
46
- "CursorPagination": "export type {\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n AnyPagination,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
47
- "CursorQuery": "export type {\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n AnyPagination,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
48
- "CursorQueryPatch": "export type {\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n AnyPagination,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
49
- "CursorResult": "export type {\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n AnyPagination,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
50
- "CursorSource": "export type {\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n AnyPagination,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
51
- "CursorSourceConfig": "export type {\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n AnyPagination,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
52
- "InfinitePagination": "export type {\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n AnyPagination,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
53
- "InfiniteQuery": "export type {\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n AnyPagination,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
54
- "InfiniteQueryPatch": "export type {\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n AnyPagination,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
55
- "InfiniteSource": "export type {\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n AnyPagination,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
56
- "InfiniteSourceConfig": "export type {\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n AnyPagination,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
57
- "LocalQuery": "export type {\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n AnyPagination,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
58
- "LocalQueryPatch": "export type {\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n AnyPagination,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
59
- "LocalSource": "export type {\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n AnyPagination,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
60
- "LocalSourceConfig": "export type {\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n AnyPagination,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
61
- "PageLoadContext": "export type {\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n AnyPagination,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
62
- "PagePagination": "export type {\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n AnyPagination,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
63
- "PageQuery": "export type {\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n AnyPagination,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
64
- "PageQueryPatch": "export type {\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n AnyPagination,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
65
- "PageResult": "export type {\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n AnyPagination,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
66
- "PageSource": "export type {\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n AnyPagination,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
67
- "PageSourceConfig": "export type {\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n AnyPagination,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
68
- "AnyPagination": "export type {\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n AnyPagination,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
69
- "Predicate": "export type {\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n AnyPagination,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
70
- "Sorter": "export type {\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n AnyPagination,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
71
- "Source": "export type {\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n AnyPagination,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
72
- "SourceSnapshot": "export type {\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n AnyPagination,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';"
46
+ "AnyPagination": "export type {\n AnyPagination,\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
47
+ "CursorPagination": "export type {\n AnyPagination,\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
48
+ "CursorQuery": "export type {\n AnyPagination,\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
49
+ "CursorQueryPatch": "export type {\n AnyPagination,\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
50
+ "CursorResult": "export type {\n AnyPagination,\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
51
+ "CursorSource": "export type {\n AnyPagination,\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
52
+ "CursorSourceConfig": "export type {\n AnyPagination,\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
53
+ "InfinitePagination": "export type {\n AnyPagination,\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
54
+ "InfiniteQuery": "export type {\n AnyPagination,\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
55
+ "InfiniteQueryPatch": "export type {\n AnyPagination,\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
56
+ "InfiniteSource": "export type {\n AnyPagination,\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
57
+ "InfiniteSourceConfig": "export type {\n AnyPagination,\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
58
+ "LocalQuery": "export type {\n AnyPagination,\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
59
+ "LocalQueryPatch": "export type {\n AnyPagination,\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
60
+ "LocalSource": "export type {\n AnyPagination,\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
61
+ "LocalSourceConfig": "export type {\n AnyPagination,\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
62
+ "PageLoadContext": "export type {\n AnyPagination,\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
63
+ "PagePagination": "export type {\n AnyPagination,\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
64
+ "PageQuery": "export type {\n AnyPagination,\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
65
+ "PageQueryPatch": "export type {\n AnyPagination,\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
66
+ "PageResult": "export type {\n AnyPagination,\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
67
+ "PageSource": "export type {\n AnyPagination,\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
68
+ "PageSourceConfig": "export type {\n AnyPagination,\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
69
+ "Predicate": "export type {\n AnyPagination,\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
70
+ "Sorter": "export type {\n AnyPagination,\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
71
+ "Source": "export type {\n AnyPagination,\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';",
72
+ "SourceSnapshot": "export type {\n AnyPagination,\n CursorPagination,\n CursorQuery,\n CursorQueryPatch,\n CursorResult,\n CursorSource,\n CursorSourceConfig,\n InfinitePagination,\n InfiniteQuery,\n InfiniteQueryPatch,\n InfiniteSource,\n InfiniteSourceConfig,\n LocalQuery,\n LocalQueryPatch,\n LocalSource,\n LocalSourceConfig,\n PageLoadContext,\n PagePagination,\n PageQuery,\n PageQueryPatch,\n PageResult,\n PageSource,\n PageSourceConfig,\n Predicate,\n Sorter,\n Source,\n SourceSnapshot,\n} from './types';"
73
73
  }
74
74
  }
@@ -1,5 +1,5 @@
1
1
  {
2
- "apiSource": "import { fail, prependIssuePath } from './errors';\nimport { createParseContext } from './messages';\n\nexport {\n ErrorCode,\n PipeSchema,\n Schema,\n SpellDefinitionError,\n SpellError,\n SpellValidationError,\n schemaMode,\n} from './core';\nexport type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n MergeSchemaModes,\n SchemaMode,\n JsonSchema,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';\nexport { s } from './s';\nexport type { DeepPartial } from './messages';\n\n/** Error helpers and immutable parse-context creation are secondary operations. */\nexport const diagnostics = {\n createParseContext,\n fail,\n prependIssuePath,\n};\n",
2
+ "apiSource": "import { fail, prependIssuePath } from './errors';\nimport { createParseContext } from './messages';\n\nexport type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n JsonSchema,\n MergeSchemaModes,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaMode,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';\nexport {\n ErrorCode,\n PipeSchema,\n Schema,\n SpellDefinitionError,\n SpellError,\n SpellValidationError,\n schemaMode,\n} from './core';\nexport type { DeepPartial } from './messages';\nexport { s } from './s';\n\n/** Error helpers and immutable parse-context creation are secondary operations. */\nexport const diagnostics = {\n createParseContext,\n fail,\n prependIssuePath,\n};\n",
3
3
  "docs": {
4
4
  "index": "---\ntitle: Spell — Schema validation for TypeScript\ndescription: Schema validation with explicit sync/async checks, portable definitions, JSON Schema export, and tree-shakeable entry points.\npackage: spell\ncategory: validation\nkeywords: [schema, validation, parsing, json-schema, locale, typescript, descriptors]\nrelated: [forge, courier, vault]\nexports:\n [s, Schema, PipeSchema, SpellValidationError, SpellDefinitionError, ErrorCode, diagnostics, './json', './predicates']\nenvironments: [browser, node, ssr, deno]\n---\n\n<!-- markdownlint-disable MD025 MD033 MD060 -->\n\n<PackageHero package=\"spell\" />\n\n## Why Spell?\n\nSpell keeps runtime validation, static inference, and portable definitions in one API. Use `s` for schema construction; import JSON conversion and predicates from dedicated subpaths.\n\nThis example shows the difference between manual branching and a single reusable schema.\n\n```ts\n// Before\nfunction parseUserBefore(value: unknown) {\n if (typeof value !== 'object' || value === null) throw new Error('Expected object');\n\n const candidate = value as Record<string, unknown>;\n\n if (typeof candidate.email !== 'string' || !candidate.email.includes('@')) {\n throw new Error('Expected valid email');\n }\n\n if (typeof candidate.role !== 'string' || !['admin', 'editor', 'viewer'].includes(candidate.role)) {\n throw new Error('Expected valid role');\n }\n\n return {\n email: candidate.email,\n role: candidate.role,\n };\n}\n\n// After\nimport { s } from '@vielzeug/spell';\n\nconst User = s.object({\n email: s.string().email(),\n role: s.enum(['admin', 'editor', 'viewer'] as const),\n});\n\nconst user = User.parse({ email: 'ada@example.com', role: 'admin' });\n```\n\n| Feature | Spell | Zod | Yup |\n| ----------------- | --------------------------------------------------------------------------- | -------------------------------------------- | -------------------------------------------- |\n| Bundle size | <PackageInfo package=\"spell\" type=\"size\" /> | ~62 kB | ~14 kB |\n| Type inference | <ore-icon name=\"check\" size=\"16\"></ore-icon> `Infer<T>` | <ore-icon name=\"check\" size=\"16\"></ore-icon> | Partial |\n| Coercion API | <ore-icon name=\"check\" size=\"16\"></ore-icon> `s.coerce.*` | <ore-icon name=\"check\" size=\"16\"></ore-icon> | <ore-icon name=\"check\" size=\"16\"></ore-icon> |\n| Async validation | <ore-icon name=\"check\" size=\"16\"></ore-icon> `.checkAsync()` | <ore-icon name=\"check\" size=\"16\"></ore-icon> | <ore-icon name=\"check\" size=\"16\"></ore-icon> |\n| Error flattening | <ore-icon name=\"check\" size=\"16\"></ore-icon> `flatten()` + `flattenFirst()` | <ore-icon name=\"check\" size=\"16\"></ore-icon> | Partial |\n| Zero dependencies | <ore-icon name=\"check\" size=\"16\"></ore-icon> | <ore-icon name=\"check\" size=\"16\"></ore-icon> | <ore-icon name=\"x\" size=\"16\"></ore-icon> |\n\n<div class=\"decision-callout\">\n\n**Use Spell when** you want a fluent schema API with strong TypeScript inference, structured errors, and no third-party runtime dependencies.\n\n**Consider alternatives when** you are already standardized on another validator ecosystem and migration cost outweighs the API benefits.\n\n</div>\n\n## Installation\n\nUse your workspace package manager to add Spell.\n\n::: code-group\n\n```sh [pnpm]\npnpm add @vielzeug/spell\n```\n\n```sh [npm]\nnpm install @vielzeug/spell\n```\n\n```sh [yarn]\nyarn add @vielzeug/spell\n```\n\n:::\n\n## Quick Start\n\nStart with a schema, then parse unknown input and use the inferred output type everywhere else.\n\n```ts\nimport { s, type Infer } from '@vielzeug/spell';\n\nconst User = s\n .object({\n email: s.string().email(),\n name: s.string().min(1),\n role: s.enum(['admin', 'editor', 'viewer'] as const),\n })\n .relaxed(); // allow extra keys — omit for strict-mode (default)\n\ntype User = Infer<typeof User>;\n\nconst payload: unknown = {\n email: 'ada@example.com',\n name: 'Ada',\n role: 'admin',\n team: 'platform',\n};\n\nconst result = User.safeParse(payload);\n\nif (!result.success) throw result.error;\nconst user = result.data;\n```\n\n## Features\n\n<div class=\"features-grid\">\n\n- Namespace and tree-shakeable schema builders.\n- Sync and async parsing with `parse()`, `safeParse()`, `parseAsync()`, and `safeParseAsync()`.\n- Explicit `check()` and `checkAsync()` rules; sync parsing never skips an async check.\n- Wrapper modes for `optional`, `nullable`, `nullish`, `default`, `catch`, and `required`.\n- Frozen declarative definitions through `definition()` and JSON Schema export via `fromDefinition()` from `@vielzeug/spell/json`.\n- Grouped `diagnostics` and `predicates` utilities keep schema construction focused.\n- Ordered union parsing produces the same selected branch in sync and async modes.\n- Structured errors with direct path lookup, flattened views, and best-match union diagnostics.\n- Object parsing is hardened against prototype-pollution-style keys.\n\n</div>\n\n## Documentation\n\n<div class=\"doc-links\">\n\n- [Usage Guide](./usage.md)\n- [API Reference](./api.md)\n- [Examples](./examples.md)\n- [Migration Guide](./migration.md)\n\n</div>\n\n## See Also\n\n<div class=\"see-also\">\n\n- [Forge](/forge/) — typed form state that uses Spell schemas as its validation layer\n- [Courier](/courier/) — HTTP client for validating request and response payloads at service boundaries\n- [Vault](/vault/) — unified storage API that accepts Spell schemas to type-gate persisted data\n\n</div>\n\n<!-- markdownlint-enable MD025 MD033 MD060 -->\n",
5
5
  "api": "---\ntitle: Spell — API Reference\ndescription: Reference for Spell schema builders, parsing, diagnostics, and tooling exports.\n---\n\n[[toc]]\n\n## API Overview\n\n| Symbol | Purpose | Execution mode | Common gotcha |\n| ----------------------- | ------------------------------- | ---------------------------------- | ---------------------------------------------------- |\n| `s` | Creates schemas | Sync or async, depending on checks | `checkAsync()` requires async parsing |\n| `Schema` / `PipeSchema` | Base schema abstractions | Sync or async | Use `Infer` rather than assuming input equals output |\n| `diagnostics` | Parse-context and error helpers | Sync | Context is per parse/request, not global |\n| `SpellValidationError` | Validation failure details | Sync/async parse failures | Use `safeParse()` to handle it as a result |\n\n## Package Entry Point\n\n| Import | Purpose |\n| ---------------------------- | ----------------------------------------------- |\n| `@vielzeug/spell` | Schema builders, errors, types, and diagnostics |\n| `@vielzeug/spell/json` | Convert portable definitions to JSON Schema |\n| `@vielzeug/spell/predicates` | Standalone format and type predicates |\n\n```ts\nimport { diagnostics, s, type Infer } from '@vielzeug/spell';\nimport { fromDefinition } from '@vielzeug/spell/json';\nimport { isEmail } from '@vielzeug/spell/predicates';\n```\n\n## `s`\n\nAll builders live under `s`.\n\n| Builder | Purpose |\n| ----------------------------------------------------------------- | -------------------------- |\n| `string`, `number`, `boolean`, `bigint`, `date` | Primitive values |\n| `literal`, `enum`, `null`, `undefined`, `unknown`, `any`, `never` | Exact and universal values |\n| `array`, `tuple`, `set`, `map`, `record`, `object` | Collections |\n| `union`, `intersect`, `discriminatedUnion`, `lazy` | Composition |\n| `coerce.*` | Coercing primitive schemas |\n\n```ts\nconst User = s.object({\n email: s.string().email(),\n id: s.string().uuid(),\n role: s.enum(['admin', 'member'] as const),\n});\n\ntype User = Infer<typeof User>;\n```\n\nObject schemas reject unknown keys. Use `.relaxed()` to retain extras.\n\n## Parsing\n\nEvery schema provides:\n\n```ts\nschema.parse(value, context?); // Output or SpellValidationError\nschema.safeParse(value, context?); // ParseResult<Output>\nschema.parseAsync(value, context?); // Promise<Output>\nschema.safeParseAsync(value, context?); // Promise<ParseResult<Output>>\nschema.is(value); // value is Output\nschema.assert(value, label?); // assertion\n```\n\n`parse()` and `safeParse()` are available on synchronous schemas. Calling `checkAsync()` returns an async-only schema, where TypeScript exposes only `parseAsync()` and `safeParseAsync()`. That async-only mode propagates through compositional schemas when a child is asynchronous.\n\n## Custom Checks\n\n`check()` is synchronous. `checkAsync()` is asynchronous. Do not return a Promise from `check()`.\n\n```ts\nconst Signup = s.object({ confirm: s.string(), password: s.string() }).check((value, context) => {\n if (value.password !== value.confirm) {\n context.addIssue({ code: 'custom', message: 'Passwords must match', path: ['confirm'] });\n }\n});\n\nconst AvailableEmail = s\n .string()\n .email()\n .checkAsync(async (value) => {\n return (await emailAvailable(value)) || 'Email is already registered';\n });\n```\n\n`CheckContext.addIssue()` takes `{ code, message, params?, path? }`. Paths are relative to current schema.\n\n## Modifiers and Transforms\n\n```ts\ns.string().optional();\ns.string().nullable();\ns.string().nullish();\ns.string().required();\ns.string().default('guest');\ns.string().catch('guest');\ns.string()\n .trim()\n .transform((value) => value.toLowerCase());\ns.string().pipe(s.string().slug());\ns.string().label('User name');\n```\n\n`default()`, `catch()`, preprocessors, transforms, and checks are runtime behavior. They cannot become portable definitions.\n\n## Definitions and JSON Schema\n\n`definition()` is only for schemas containing declarative structure. It returns frozen data and throws `SpellDefinitionError` when runtime behavior is present.\n\n```ts\nimport { s } from '@vielzeug/spell';\nimport { fromDefinition } from '@vielzeug/spell/json';\n\nconst Product = s.object({\n id: s.string().uuid(),\n name: s.string().min(1),\n});\n\nconst definition = Product.definition();\nconst jsonSchema = fromDefinition(definition);\n```\n\nNo implicit schema-to-JSON conversion exists. Make definition boundary explicit.\n\n## Diagnostics\n\n`diagnostics` contains pure helpers and immutable parse-context creation.\n\n```ts\nimport { diagnostics, s } from '@vielzeug/spell';\n\nconst context = diagnostics.createParseContext({\n object: { invalidKeys: () => 'Unsupported field' },\n});\n\nconst result = s.object({ email: s.string().email() }).safeParse({ email: 'ada@example.com', extra: true }, context);\n\nif (!result.success) {\n const messages = result.error.messagesAt('email');\n console.log(messages);\n}\n```\n\n`diagnostics.fail(code, message, params?)` and `diagnostics.prependIssuePath(issues, segment)` support custom parser implementations.\n\n## Errors\n\n- `SpellError` — base class. Use `SpellError.is(error)` for cross-boundary narrowing.\n- `SpellValidationError` — validation failure with `issues`, `bestMatch()`, `messagesAt()`, `flatten()`, and `flattenFirst()`.\n- `SpellDefinitionError` — schema cannot create portable definition.\n\n```ts\nconst result = s.object({ email: s.string().email() }).safeParse({ email: 'invalid' });\n\nif (!result.success) {\n const { fieldErrors, formErrors } = result.error.flatten();\n console.log(fieldErrors, formErrors);\n}\n```\n\n## Types\n\n| Type | Purpose |\n| --------------------------------- | ----------------------------------------------------------------- |\n| `Infer<T>` / `InferOutput<T>` | Parsed output type |\n| `InferInput<T>` | Accepted input type, including async schemas |\n| `InferSchemaMode<T>` | `'sync'` or `'async'` parsing capability |\n| `SchemaMode` | Mode union: `'sync' | 'async'` |\n| `AnySchema` | Structural schema surface for composition and custom integrations |\n| `schemaMode` | Public symbol marking a schema's parsing capability |\n| `MergeSchemaModes<T>` | Produces `'async'` when any constituent mode is async |\n| `ParseResult<T>` | Tagged safe-parse result |\n| `Issue` | Validation issue union |\n| `CheckContext` / `ValidateResult` | Custom check callback contracts |\n| `SchemaDefinition` | Frozen portable schema definition |\n| `JsonSchema` | JSON Schema object shape |\n| `Messages` / `DeepPartial<T>` | Parse-context message overrides |\n| `SchemaWalker<R>` | Schema traversal visitor |\n",
@@ -99,6 +99,27 @@
99
99
  }
100
100
  ],
101
101
  "typeSignatures": {
102
+ "AnySchema": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n JsonSchema,\n MergeSchemaModes,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaMode,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
103
+ "CheckContext": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n JsonSchema,\n MergeSchemaModes,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaMode,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
104
+ "FlatError": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n JsonSchema,\n MergeSchemaModes,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaMode,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
105
+ "FlatErrorFirst": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n JsonSchema,\n MergeSchemaModes,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaMode,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
106
+ "Infer": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n JsonSchema,\n MergeSchemaModes,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaMode,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
107
+ "InferInput": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n JsonSchema,\n MergeSchemaModes,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaMode,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
108
+ "InferOutput": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n JsonSchema,\n MergeSchemaModes,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaMode,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
109
+ "InferSchemaMode": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n JsonSchema,\n MergeSchemaModes,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaMode,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
110
+ "Issue": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n JsonSchema,\n MergeSchemaModes,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaMode,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
111
+ "JsonSchema": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n JsonSchema,\n MergeSchemaModes,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaMode,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
112
+ "MergeSchemaModes": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n JsonSchema,\n MergeSchemaModes,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaMode,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
113
+ "MessageFn": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n JsonSchema,\n MergeSchemaModes,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaMode,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
114
+ "Messages": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n JsonSchema,\n MergeSchemaModes,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaMode,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
115
+ "ParseContext": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n JsonSchema,\n MergeSchemaModes,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaMode,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
116
+ "ParseResult": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n JsonSchema,\n MergeSchemaModes,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaMode,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
117
+ "SchemaDefinition": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n JsonSchema,\n MergeSchemaModes,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaMode,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
118
+ "SchemaDescriptor": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n JsonSchema,\n MergeSchemaModes,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaMode,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
119
+ "SchemaMode": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n JsonSchema,\n MergeSchemaModes,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaMode,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
120
+ "SchemaWalker": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n JsonSchema,\n MergeSchemaModes,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaMode,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
121
+ "ValidateFn": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n JsonSchema,\n MergeSchemaModes,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaMode,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
122
+ "ValidateResult": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n JsonSchema,\n MergeSchemaModes,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaMode,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
102
123
  "ErrorCode": "export {\n ErrorCode,\n PipeSchema,\n Schema,\n SpellDefinitionError,\n SpellError,\n SpellValidationError,\n schemaMode,\n} from './core';",
103
124
  "PipeSchema": "export {\n ErrorCode,\n PipeSchema,\n Schema,\n SpellDefinitionError,\n SpellError,\n SpellValidationError,\n schemaMode,\n} from './core';",
104
125
  "Schema": "export {\n ErrorCode,\n PipeSchema,\n Schema,\n SpellDefinitionError,\n SpellError,\n SpellValidationError,\n schemaMode,\n} from './core';",
@@ -106,29 +127,8 @@
106
127
  "SpellError": "export {\n ErrorCode,\n PipeSchema,\n Schema,\n SpellDefinitionError,\n SpellError,\n SpellValidationError,\n schemaMode,\n} from './core';",
107
128
  "SpellValidationError": "export {\n ErrorCode,\n PipeSchema,\n Schema,\n SpellDefinitionError,\n SpellError,\n SpellValidationError,\n schemaMode,\n} from './core';",
108
129
  "schemaMode": "export {\n ErrorCode,\n PipeSchema,\n Schema,\n SpellDefinitionError,\n SpellError,\n SpellValidationError,\n schemaMode,\n} from './core';",
109
- "AnySchema": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n MergeSchemaModes,\n SchemaMode,\n JsonSchema,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
110
- "CheckContext": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n MergeSchemaModes,\n SchemaMode,\n JsonSchema,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
111
- "FlatError": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n MergeSchemaModes,\n SchemaMode,\n JsonSchema,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
112
- "FlatErrorFirst": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n MergeSchemaModes,\n SchemaMode,\n JsonSchema,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
113
- "Infer": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n MergeSchemaModes,\n SchemaMode,\n JsonSchema,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
114
- "InferInput": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n MergeSchemaModes,\n SchemaMode,\n JsonSchema,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
115
- "InferOutput": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n MergeSchemaModes,\n SchemaMode,\n JsonSchema,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
116
- "InferSchemaMode": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n MergeSchemaModes,\n SchemaMode,\n JsonSchema,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
117
- "Issue": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n MergeSchemaModes,\n SchemaMode,\n JsonSchema,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
118
- "MergeSchemaModes": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n MergeSchemaModes,\n SchemaMode,\n JsonSchema,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
119
- "SchemaMode": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n MergeSchemaModes,\n SchemaMode,\n JsonSchema,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
120
- "JsonSchema": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n MergeSchemaModes,\n SchemaMode,\n JsonSchema,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
121
- "MessageFn": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n MergeSchemaModes,\n SchemaMode,\n JsonSchema,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
122
- "Messages": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n MergeSchemaModes,\n SchemaMode,\n JsonSchema,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
123
- "ParseContext": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n MergeSchemaModes,\n SchemaMode,\n JsonSchema,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
124
- "ParseResult": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n MergeSchemaModes,\n SchemaMode,\n JsonSchema,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
125
- "SchemaDefinition": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n MergeSchemaModes,\n SchemaMode,\n JsonSchema,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
126
- "SchemaDescriptor": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n MergeSchemaModes,\n SchemaMode,\n JsonSchema,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
127
- "SchemaWalker": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n MergeSchemaModes,\n SchemaMode,\n JsonSchema,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
128
- "ValidateFn": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n MergeSchemaModes,\n SchemaMode,\n JsonSchema,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
129
- "ValidateResult": "export type {\n AnySchema,\n CheckContext,\n FlatError,\n FlatErrorFirst,\n Infer,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n MergeSchemaModes,\n SchemaMode,\n JsonSchema,\n MessageFn,\n Messages,\n ParseContext,\n ParseResult,\n SchemaDefinition,\n SchemaDescriptor,\n SchemaWalker,\n ValidateFn,\n ValidateResult,\n} from './core';",
130
- "s": "export { s } from './s';",
131
130
  "DeepPartial": "export type { DeepPartial } from './messages';",
131
+ "s": "export { s } from './s';",
132
132
  "diagnostics": "export const diagnostics = {\n createParseContext,\n fail,\n prependIssuePath,\n};"
133
133
  }
134
134
  }