Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
aae7fd7
feat(forms, component): expand into batteries-included tier (1.13.0) …
Copilot May 20, 2026
21b9957
feat: massively expand motion module and core utilities (#94)
Copilot May 21, 2026
6acf275
docs: prepare 1.13.0 release (#96)
Copilot May 21, 2026
6865245
Potential fix for pull request finding 'Unreachable statement'
JosunLP May 21, 2026
4cc1bbc
fix: address PR #97 review thread 4334827935 (Copilot review)
Copilot May 21, 2026
52ca6a9
fix(component): preserve leading text nodes in reconcileKeyed
Copilot May 21, 2026
95ec69b
fix: address CodeRabbit review comments
Copilot May 21, 2026
818535c
fix(component): make useSlot observer CI-safe
Copilot May 21, 2026
caf9310
chore: finalize slot observer CI fix
Copilot May 21, 2026
7184891
Switch documentation domain metadata to bquery.js.org (#98)
Copilot May 21, 2026
61cd1ab
fix: address remaining PR review comments
Copilot May 21, 2026
bc9cfdb
fix(forms,motion): address remaining review feedback
Copilot May 21, 2026
0c9d8a9
fix(component): use formatPropValidationValue in syncProps() error me…
Copilot May 21, 2026
d1e02aa
fix(forms): cancel useFormField validation when disabling
Copilot May 21, 2026
6198b1b
fix(forms): avoid ambiguous schema initialValue heuristic
Copilot May 21, 2026
26eadcc
fix(component-motion): address review feedback
Copilot May 21, 2026
6af81dd
test(component): avoid innerHTML in delegated handler regression
Copilot May 21, 2026
b9d80d7
test(component): harden delegated attr parsing helper
Copilot May 21, 2026
fd2b07e
test(component): simplify delegated attr helper
Copilot May 21, 2026
910ca75
test(component): specialize delegated click helper
Copilot May 21, 2026
4073e35
docs(motion): fix spring preset JSDoc count
Copilot May 21, 2026
a130bb7
fix(component): require scope for delegated event helpers
Copilot May 21, 2026
ccc9558
fix(core): keep tryCatch sync promise throws awaitable
Copilot May 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .clinerules
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@ You are working on bQuery.js (`@bquery/bquery`), a batteries-included TypeScript

bQuery.js is not a utility library; its broad module surface is the product. The reactive module now also covers HTTP clients, polling, pagination, WebSocket / SSE, REST helpers, request queues, and request deduplication.

Current release baseline: **1.12.0**.
Current release baseline: **1.13.0**.

Version `1.13.0` graduates `@bquery/bquery/forms` into a batteries-included tier (many new validators and combinators, enriched field/form state, `createFieldArray`, `schema()`, `bindField`/`bindForm`, scope-aware composables, SSR resumability), expands `@bquery/bquery/component` with slot/ref/async/lifecycle/DI primitives plus delegated events, `css` adoptable stylesheets, and keyed lists, ships a major `@bquery/bquery/motion` expansion (full Penner easings, `cubicBezier`/`steps`/`mix`/`chain`, `tween`/`animateValue`, `animateTo`, `springVector`, label-aware timelines with `reverse`/`repeat`/`yoyo`/`progress`, `scrollProgress`/`inView`/`magnetic`/`tilt`/`shake`/`pulse`/`countUp`, richer `stagger`, reactive reduced-motion observation), and grows `@bquery/bquery/core` utilities with array/function/object/string/number/misc helpers and additional type guards.

Version `1.12.0` adds Store plugin teardown APIs (`unregisterPlugin()`, `clearPlugins()`), promotes `WebSocketSendData` to a public Reactive type export, and tightens `/full` bundle type-export drift checks through `bun run check:full-bundle`. Version `1.11.0` added the dedicated `@bquery/bquery/server` entry point plus a major runtime-agnostic `@bquery/bquery/ssr` expansion (`renderToStringAsync()`, `renderToStream()`, `renderToResponse()`, runtime adapters, snapshots, resumability), while preserving the `1.10.0` concurrency helpers and the `1.9.0` watch/view/media APIs as first-class public surface.

Expand Down
9 changes: 8 additions & 1 deletion .cursorrules
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ You are working on bQuery.js, a batteries-included TypeScript full-stack web fra

> Derived snapshot for Cursor. If this file conflicts with `package.json`, `src/*/index.ts`, or `AGENT.md`, trust those files in that order and then realign this one.

Current release baseline: **1.12.0**.
Current release baseline: **1.13.0**.

bQuery.js is not a utility library; treat its broad module surface as the product, and keep guidance aligned with that scope.

Expand All @@ -22,6 +22,13 @@ bQuery.js is not a utility library; treat its broad module surface as the produc
- `useSignal()`, `useComputed()`, and `useEffect()` from `@bquery/bquery/component` must be called from component lifecycle hooks, not from `render()`.
- When version, engine, or repo guidance files change, run `bun run check:ai-guidance` before finishing.

## 1.13.0 API Notes

- `@bquery/bquery/forms` graduates to batteries-included: many new validators (`integer`, `numeric`, `between`, `length`, `oneOf`, `notOneOf`, `arrayOf`, `requiredIf`, `requiredUnless`, `dateAfter`, `dateBefore`, `validDate`, `fileSize`, `fileType`) and combinators (`compose`, `all`, `not`, `withMessage`); enriched field/form state (`isValidating`, `isFocused`, `dirtySince`, `disabled`, `submitCount`, `submitError`, `isPristine`, …); dynamic field arrays via `createFieldArray`; fluent `schema()` declaration; two-way DOM bindings (`bindField`, `bindForm`); scope-aware composables (`useForm`, `useField`, `useFieldArray`); SSR helpers (`serializeFormState`, `readSerializedFormState`, `hydrateForm`).
- `@bquery/bquery/component` adds `useSlot` / `hasSlot` / `slotText`, `useRef`, `useAsync`, `whenIdle`, `provide` / `inject` / `formContextKey`, additive `beforeUnmount` and `errorBoundary` hooks, instance-level `setProp` / `getProp`, delegated event helpers (`on`, `onClick`, `onInput`, `onChange`, `onSubmit`, `bindDelegatedEvents`), a `css` tagged template with adoptable stylesheets, and `keyedList` / `reconcileKeyed` for keyed list rendering.
- `@bquery/bquery/motion` ships a major expansion: full Penner easing family with `cubicBezier()` / `steps()` / `mix()` / `chain()`; `tween()` interpolation with full transport controls + `AbortSignal`, plus Promise-based `animateValue()`; `animate()` gains `signal` + `playbackRate`, `animateTo()` builds keyframes from CSS records; `spring()` gains `.velocity()` / `.set()`, `springVector()`, and `wobbly`/`slow`/`molasses` presets; timelines support labels, `reverse()`, `playbackRate()`, `repeat()`, `yoyo()`, `onUpdate()`, `progress()`; new `scrollProgress()`, `inView()`, `magnetic()`, `tilt()`, `shake()`, `pulse()`, `countUp()`; richer `stagger()` (grid, axis, deterministic random); reactive `onReducedMotionChange()` / `reducedMotionSignal()`.
- `@bquery/bquery/core` adds a deep `utils/` expansion: array (`groupBy`, `keyBy`, `partition`, `zip`, `range`, `sample`, `shuffle`, `uniqueBy`, `sortBy`, `intersection`, `difference`, `flattenDeep`, `move`, `chunkBy`, …); function (`memoize`, `compose`, `pipe`, `curry`, `partial`, `retry`, plus richer `debounce`/`throttle` + `.flush()`); object (deep `get`/`set`/`has`, `mapValues`, `mapKeys`, `invert`, `deepEqual`, deep `freeze`, `defaults`, typed iteration); string (`toSnakeCase`, `toPascalCase`, `toTitleCase`, `pad`, `wordCount`, safe `template`, `stripHtml`, `randomString`, `lines`); number (`round`, `roundTo`, `lerp`, `mapRange`, `formatBytes`, `randomFloat`, `sum`, `average`, `median`, …); misc (`uuid`, `tryCatch`, `times`, `pollUntil`, `nextFrame`, `nextTick`); and many extra type guards.

## 1.12.0 API Notes

- `@bquery/bquery/store` includes `unregisterPlugin()` and `clearPlugins()` for plugin teardown, test isolation, and runtime plugin reloads.
Expand Down
12 changes: 11 additions & 1 deletion .github/copilot-instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ Work autonomously inside the scope of the current request, but do not invent a h

bQuery.js is a batteries-included framework, not a utility library. It is modular, tree-shakeable, has zero runtime dependencies, and currently ships **23 public entry points**.

Current release baseline: **1.12.0**.
Current release baseline: **1.13.0**.

Start here before making assumptions:

Expand All @@ -30,6 +30,16 @@ Prefer pointing back to those files instead of duplicating large architecture se

For repo guidance refreshes, keep the role split clear: `AGENT.md` is the deep reference, `llms.txt` is the compact mirror, this file stays behavioral/meta-oriented, and `.cursorrules` / `.clinerules` are derivative tool snapshots.

## Version 1.13.0 highlights

- `@bquery/bquery/forms` is now a true batteries-included tier. New validators (`integer`, `numeric`, `between`, `length`, `oneOf`, `notOneOf`, `arrayOf`, `requiredIf`, `requiredUnless`, `dateAfter`, `dateBefore`, `validDate`, `fileSize`, `fileType`) and combinators (`compose`, `all`, `not`, `withMessage`) are tree-shakeable; field/form state gains `isValidating`, `isFocused`, `dirtySince`, `disabled`, `setValue`/`setError`/`clearError`, `submitCount`, `submitError`, `isPristine`, `touchAll`/`untouchAll`, `resetField`, `resetErrors`, `getDirtyValues`, `subscribe`, `validationStrategy`, and `mode`; dynamic field arrays land via `createFieldArray`; declarative schema-style configuration via `schema()`; two-way DOM bindings via `bindField` / `bindForm`; scope-aware composables `useForm` / `useField` / `useFieldArray`; SSR helpers `serializeFormState` / `readSerializedFormState` / `hydrateForm`.
- `@bquery/bquery/component` adds slot helpers (`useSlot`, `hasSlot`, `slotText`), refs (`useRef`), async data (`useAsync`, `whenIdle`), DI (`provide` / `inject` / `formContextKey`), `beforeUnmount` and `errorBoundary` lifecycle hooks, instance-level `setProp` / `getProp` for non-string props, sanitizer-safe delegated event helpers (`on`, `onClick`, `onInput`, `onChange`, `onSubmit`, `bindDelegatedEvents`), a `css` tagged template literal with adoptable stylesheet support, and `keyedList` / `reconcileKeyed` for keyed list rendering.
- `@bquery/bquery/motion` ships a major expansion: full Penner easing family with `cubicBezier()`, `steps()`, `mix()`, and `chain()` composers; new `tween()` interpolation with full transport controls and `AbortSignal` support plus Promise-based `animateValue()`; `animate()` gains `signal` + `playbackRate`, and `animateTo()` builds keyframes from CSS records; `spring()` gains `.velocity()` / `.set()` plus `springVector()` and additional presets; timelines support labels, `reverse()`, `playbackRate()`, `repeat()`, `yoyo()`, `onUpdate()`, `progress()`; new primitives `scrollProgress()`, `inView()`, `magnetic()`, `tilt()`, `shake()`, `pulse()`, `countUp()`; richer `stagger()` (grid, axis, deterministic random); reactive `onReducedMotionChange()` / `reducedMotionSignal()`.
- `@bquery/bquery/core` adds a deep `utils/` expansion: array helpers (`groupBy`, `keyBy`, `partition`, `zip`, `range`, `take`, `drop`, `sample`, `shuffle`, `uniqueBy`, `sortBy`, `intersection`, `difference`, `flattenDeep`, `move`, `chunkBy`); function helpers (`memoize`, `compose`, `pipe`, `curry`, `partial`, `retry`, plus richer `debounce`/`throttle` options + `.flush()`); object helpers (deep `get`/`set`/`has`, `mapValues`, `mapKeys`, `invert`, `deepEqual`/`isEqual`, deep `freeze`, `defaults`, typed `entriesTyped`/`keysTyped`); string helpers (`toSnakeCase`, `toPascalCase`, `toTitleCase`, `pad`, `wordCount`, safe `template`, `stripHtml`, `randomString`, `lines`); number helpers (`round`, `roundTo`, `lerp`, `inverseLerp`, `mapRange`, `formatBytes`, `randomFloat`, `sum`, `average`, `median`, `degToRad`, `radToDeg`); misc helpers (`uuid`, `tryCatch`, `times`, `pollUntil`, `nextFrame`, `nextTick`); and additional type guards (`isError`, `isMap`, `isSet`, `isRegExp`, `isSymbol`, `isBigInt`, `isAsyncFunction`, `isIterable`, `isAsyncIterable`, `isNullish`, `isDefined`).
- The `1.12.0` store/reactive surface (`unregisterPlugin`, `clearPlugins`, `WebSocketSendData`) and the `1.11.0` SSR/server runtime (`createServer`, `renderToStringAsync`, `renderToStream`, `renderToResponse`, runtime-agnostic WebSocket sessions) remain first-class public surface.
- The `1.10.0` concurrency additions plus the `1.9.0` watcher/view/media APIs remain first-class public surface and should still appear in documentation refreshes.
- Publish and local validation target Node.js `>=24.0.0` and Bun `>=1.3.13`; when release metadata or repo guidance changes, `bun run check:ai-guidance` is part of the expected validation.

## Version 1.12.0 highlights

- `@bquery/bquery/store` now includes `unregisterPlugin()` and `clearPlugins()` for plugin teardown, test isolation, and runtime plugin reloads.
Expand Down
13 changes: 11 additions & 2 deletions AGENT.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,13 @@
| ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Name | bQuery.js |
| Package | `@bquery/bquery` |
| Version | 1.12.0 |
| Version | 1.13.0 |
| License | MIT |
| Language | TypeScript (strict) |
| Runtime | Browser (ESM, UMD, IIFE), plus Node.js, Bun, and Deno for SSR/server workflows |
| Toolchain | Node.js `>=24.0.0`, Bun `>=1.3.13` |
| Repository | <https://github.com/bQuery/bQuery> |
| Homepage | <https://bQuery.flausch-code.de> |
| Homepage | <https://bquery.js.org> |
| Tagline | The full-stack web framework that speaks jQuery. |
| Description | Batteries-included TypeScript framework for the modern web with signals, SSR, Web Components, routing, server helpers, and a jQuery-inspired API — zero mandatory build step, security-by-default |

Expand All @@ -40,6 +40,15 @@ bun run dev # VitePress docs server

Project-specific starter prompts live in [`.github/prompts/`](.github/prompts/) for common workflows such as starting a task, fixing a bug, extending a public API, adding a module, working on SSR/server features, and refreshing AI guidance.

## Version 1.13.0 Highlights

- `@bquery/bquery/forms` graduates into a batteries-included tier: new validators (`integer`, `numeric`, `between`, `length`, `oneOf`, `notOneOf`, `arrayOf`, `requiredIf`, `requiredUnless`, `dateAfter`, `dateBefore`, `validDate`, `fileSize`, `fileType`), validator combinators (`compose`, `all`, `not`, `withMessage`), enriched field/form state (`isValidating`, `isFocused`, `dirtySince`, `disabled`, `setValue`/`setError`/`clearError`, `submitCount`, `submitError`, `isPristine`, `touchAll`/`untouchAll`, `resetField`, `resetErrors`, `getDirtyValues`, `subscribe`, `validationStrategy`, `mode: 'all' | 'first'`), dynamic field arrays via `createFieldArray`, fluent `schema()` declaration, two-way DOM bindings (`bindField`, `bindForm`), scope-aware composables (`useForm`, `useField`, `useFieldArray`), and SSR helpers (`serializeFormState`, `readSerializedFormState`, `hydrateForm`).
- `@bquery/bquery/component` gains slot, ref, async, lifecycle, DI, and styling primitives: `useSlot` / `hasSlot` / `slotText`, `useRef`, `useAsync`, `whenIdle`, `provide` / `inject` / `formContextKey`, additive `beforeUnmount` and `errorBoundary` hooks, instance-level `setProp` / `getProp` for non-string props, delegated event helpers (`on`, `onClick`, `onInput`, `onChange`, `onSubmit`, `bindDelegatedEvents`), a `css` tagged template with adoptable stylesheet support, and `keyedList` / `reconcileKeyed` for keyed list rendering.
- `@bquery/bquery/motion` ships a major expansion: full Penner easing family plus `cubicBezier()`, `steps()`, `mix()`, and `chain()` composers; new `tween()` for number, array, or record interpolation with `pause`/`resume`/`reverse`/`seek`/`stop`/`progress`/`finished` controls and `AbortSignal` support, plus Promise-based `animateValue()`; `animate()` gains `signal` and `playbackRate`, and `animateTo()` turns CSS records into keyframes; `spring()` gains `.velocity()` / `.set()` plus `springVector()` and additional presets (`wobbly`, `slow`, `molasses`); timelines support labels, `reverse()`, `playbackRate()`, `repeat()`, `yoyo()`, `onUpdate()`, and `progress()`; new primitives `scrollProgress()`, `inView()`, `magnetic()`, `tilt()`, `shake()`, `pulse()`, and `countUp()`; `stagger()` gains 2D grids, `axis`, and deterministic `random` / `randomSeed`; new `onReducedMotionChange()` and `reducedMotionSignal()` for reactive reduced-motion observation.
- `@bquery/bquery/core` adds a deep utilities expansion in `utils/`: array helpers (`groupBy`, `keyBy`, `partition`, `zip`, `range`, `first`, `last`, `take`, `drop`, `sample`, `shuffle`, `uniqueBy`, `sortBy`, `intersection`, `difference`, `flattenDeep`, `move`, `chunkBy`); function helpers (`memoize`, `compose`, `pipe`, `curry`, `partial`, `retry`, plus richer `debounce`/`throttle` options and `.flush()`); object helpers (`get`, `set`, `has`, `mapValues`, `mapKeys`, `invert`, `deepEqual`/`isEqual`, deep `freeze`, `defaults`, `entriesTyped`, `keysTyped`); string helpers (`toSnakeCase`, `toPascalCase`, `toTitleCase`, `pad`/`padStart`/`padEnd`, `wordCount`, safe `template`, `stripHtml`, crypto-backed `randomString`, `lines`); number helpers (`round`, `roundTo`, `lerp`, `inverseLerp`, `mapRange`, `formatBytes`, `randomFloat`, `sum`, `average`, `median`, `degToRad`, `radToDeg`); misc helpers (`uuid`, `tryCatch`, `times`, `pollUntil`, `nextFrame`, `nextTick`); and additional type guards (`isError`, `isMap`, `isSet`, `isRegExp`, `isSymbol`, `isBigInt`, `isAsyncFunction`, `isIterable`, `isAsyncIterable`, `isNullish`, `isDefined`).
- All earlier baselines (`1.12.0` store plugin teardown, `1.11.0` runtime-agnostic SSR/server, `1.10.0` concurrency, `1.9.0` watch/view/media APIs) remain first-class public surface.
- Local validation and publish checks target Node.js `>=24.0.0` and Bun `>=1.3.13`; whenever release metadata or AI guidance changes, `bun run check:ai-guidance` should pass before you stop.

## Version 1.12.0 Highlights

- `@bquery/bquery/store` now exposes `unregisterPlugin()` and `clearPlugins()` so plugin registries can be torn down for test isolation and runtime reloads without affecting stores that already received extensions.
Expand Down
Loading
Loading