Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
13 changes: 13 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,11 +94,24 @@ and this project adheres to Semantic Versioning.
- **`@bquery/bquery/view/compiler`** — optional, build-tool-agnostic compiler ([#138](https://github.com/bQuery/bQuery/issues/138)). `compileViews()`, `compileToModule()`, `compileExpression()`, `emitModule()`, and the dependency-free CLI (`runCompileCli` / `compileFiles`, `bquery-view-compile`) pre-parse `bq-*` expressions into optimized, `with`-free update functions. New runtime hooks `registerCompiledExpressions()` / `clearCompiledExpressions()` (exported from `@bquery/bquery/view`) let the runtime use the precompiled functions, skipping the `new Function()` evaluator (and its `'unsafe-eval'` requirement). The runtime evaluator stays the default; un-compilable expressions transparently fall back to it, so both paths are behaviourally identical.
- **`@bquery/bquery/forms`** — progressive-enhancement form actions + optimistic updates ([#140](https://github.com/bQuery/bQuery/issues/140)). New `formAction(target, options)` binds a form to a server action that POSTs natively without JS and progressively enhances to a `fetch`-based submit with reactive `pending` / `error` / `result` state when JS is present (`enhance(form)` sets the native `action`/`method` and an optional hidden CSRF field, then intercepts `submit`). `useFormStatus(action)` exposes read-only status signals (mirroring React 19), and `optimistic(base, reducer)` is an optimistic-update primitive whose reactive `value` folds pending drafts over the base and reverts automatically (`add` / `run` / `clear`). Composes with the validation pipeline and the `server` module's `csrf()`. A non-OK response throws `FormActionError` (carrying `status` / `response`).
- **`@bquery/bquery/forms`** — `createFieldArray()` gains an optional `getKey` for keyed list reconciliation ([#139](https://github.com/bQuery/bQuery/issues/139)), plus `keys()` / `keyAt(index)`. When supplied, the stable-key contract (present, unique keys) is validated on every structural mutation and a descriptive error names the offending key. Without `getKey` the array stays positional (unchanged behaviour).
- **`@bquery/bquery/i18n`** — ICU MessageFormat support ([#141](https://github.com/bQuery/bQuery/issues/141)). Messages using typed arguments (`{count, plural, …}`, `{n, selectordinal, …}`, `{gender, select, …}`) are routed through a locale-aware formatter backed by `Intl.PluralRules`, with `offset:`, exact `=N` selectors, nested arguments, the `#` token, and apostrophe escaping. New authoring helpers `defineMessages()` (identity + extraction anchor) and `formatMessage()` (standalone single-message formatter). Plain `{name}` interpolation and the legacy `singular | plural` pipe form are unchanged.
- **`@bquery/bquery/i18n/extract`** — optional, dependency-free message-extraction tooling ([#141](https://github.com/bQuery/bQuery/issues/141)). `extractFromSource()`, `mergeCatalog()`, `extractFiles()`, `expandGlobs()`, `flatten()` / `unflatten()`, and the CLI (`runExtractCli`, `bquery-i18n extract`) scan source for `defineMessages` catalogs and `t()` / `tc()` calls, then emit/merge nested JSON catalogs without overwriting existing translations (`--prune` opt-in). A separate entry point — importing it is never required at runtime, preserving the zero-build path.
- **`@bquery/bquery/a11y`** — the runtime audit now stamps each `AuditFinding` with its WCAG 2.1 criterion (`wcag`), and the full rule catalog is exported as `auditRules` ([#142](https://github.com/bQuery/bQuery/issues/142)) — each rule documents its WCAG mapping, default severity, and a known limitation (what it cannot detect).
- **`@bquery/bquery/plugin`** — new `definePlugin()` authoring helper ([#145](https://github.com/bQuery/bQuery/issues/145)): an identity helper that infers a plugin's install-options type and gives third-party authors a single, stable entry point.
- **`@bquery/bquery/devtools`** — new stable, versioned bridge protocol for the DevTools browser extension ([#146](https://github.com/bQuery/bQuery/issues/146)): `connectDevtoolsBridge()` (over `window.postMessage`), the transport-agnostic `createBridgeServer()`, `serializeComponentTree()`, and `BRIDGE_PROTOCOL_VERSION` / `BRIDGE_SOURCE` / `BRIDGE_CAPABILITIES`. A reference Manifest V3 extension (component tree, signal/store inspection, live timeline) ships in `extension/`.

### Changed (Unreleased)

- **`@bquery/bquery/view`** — `view` is now **targeting Stable in 1.15.0** ([#136](https://github.com/bQuery/bQuery/issues/136)). The directive set and expression grammar are frozen for one minor cycle, and a per-directive SSR support matrix is published in the [View guide](https://bquery.js.org/guide/view).
- **`@bquery/bquery/forms`** — `forms` is now **targeting Stable in 1.15.0** ([#139](https://github.com/bQuery/bQuery/issues/139)). The 1.13 batteries-included surface is frozen for one minor cycle; the `'manual'` `validationStrategy` default is documented as a deliberate contract (`handleSubmit()` always runs the full validation pass; the strategy gates only *automatic* per-change/per-blur validation); the SSR serialization boundary is now a guaranteed contract (`serializeFormState()` deterministically drops functions, `File` / `Blob` / `FileList`, `bigint`, and `symbol`); and the `createFieldArray()` stable-key requirement is validated with clear errors. See the [Forms guide](https://bquery.js.org/guide/forms).
- **`@bquery/bquery/i18n`** — `i18n` is now **targeting Stable in 1.15.0** ([#141](https://github.com/bQuery/bQuery/issues/141)). The formatting/locale surface is frozen for one minor cycle, ICU MessageFormat coverage is documented and tested, and lazy-loading of catalogs is documented. See the [i18n guide](https://bquery.js.org/guide/i18n).
- **`@bquery/bquery/a11y`** — `a11y` is now **targeting Stable in 1.15.0** ([#142](https://github.com/bQuery/bQuery/issues/142)). The surface (focus management, live regions, `inert`/`scrollLock`, preference signals) is frozen for one minor cycle, and the audit's WCAG coverage is documented with its known limitations. See the [A11y guide](https://bquery.js.org/guide/a11y).
- **`@bquery/bquery/dnd`** — `dnd` is now **targeting Stable in 1.15.0** ([#143](https://github.com/bQuery/bQuery/issues/143)). The surface is frozen for one minor cycle; the keyboard model (pick up / move / drop / cancel, `aria-grabbed`) is hardened and tested across `grid` / `delay` / `viewport`; and an accessibility statement is published. Drag announcements route through the shared `a11y` live-region announcer. See the [DnD guide](https://bquery.js.org/guide/dnd).
- **`@bquery/bquery/media`** — `media` is now **targeting Stable in 1.15.0** ([#144](https://github.com/bQuery/bQuery/issues/144)). The 1.14 composable surface is frozen for one minor cycle; each composable's SSR-safe default and cleanup is documented; and reactivity, idempotent `destroy()`, listener detachment, and `AbortSignal` teardown are verified. Bake-and-verify — no new features. See the [Media guide](https://bquery.js.org/guide/media).
- **`@bquery/bquery/plugin`** — `plugin` is now **targeting Stable in 1.15.0** ([#145](https://github.com/bQuery/bQuery/issues/145)). The hook-bus / DI / install-lifecycle / directive-registration surface is frozen for one minor cycle; install/uninstall symmetry (no leaked directives/filters/actions/DI bindings) is proven with tests; and a plugin-author guide (lifecycle, hook timing, DI resolution, directive namespacing) is published. See the [Plugin guide](https://bquery.js.org/guide/plugin).
- **`@bquery/bquery/devtools`** — `devtools` is now **targeting Stable in 1.15.0** ([#146](https://github.com/bQuery/bQuery/issues/146)). The surface is frozen for one minor cycle; the bridge protocol is stabilized as the app↔extension contract; and a reference browser extension ships. See the [DevTools guide](https://bquery.js.org/guide/devtools).
- **`@bquery/bquery/testing`** — `testing` is now **targeting Stable in 1.15.0** ([#147](https://github.com/bQuery/bQuery/issues/147)). The Testing-Library-parity surface is frozen for one minor cycle; runner integration beyond `bun:test` (Vitest / Jest) is documented; and the shadow-DOM-aware queries, `userEvent` / `fireEvent`, and mocks are tested across light + shadow DOM. See the [Testing guide](https://bquery.js.org/guide/testing).
- **`@bquery/bquery/storybook`** — `storybook` is now **targeting Stable in 1.15.0** ([#148](https://github.com/bQuery/bQuery/issues/148)). The helper surface is frozen for one minor cycle, and the `unsafeHtml` security contract is pinned (sanitize-by-default; only brand-checked, author-controlled fragments inserted verbatim) and covered by tests. See the [Storybook guide](https://bquery.js.org/guide/storybook).

### Fixed (Unreleased)

Expand Down
16 changes: 8 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -208,21 +208,21 @@ import { storyHtml, when } from '@bquery/bquery/storybook';
| **Reactive** | Stable | `signal`, `computed`, `effect`, `watchDebounce`, `watchThrottle`, async data, HTTP clients, polling, pagination, WebSocket / SSE, and REST helpers |
| **Concurrency** | Experimental | Zero-build worker tasks, explicit RPC helpers, optional reactive state wrappers, bounded worker pools, high-level collection helpers, an optional fluent pipeline layer, CSP-safe module workers, and client UI-scheduling primitives (targeting Stable in 1.15.0) |
| **Component** | Stable | Typed Web Components with scoped reactivity and configurable Shadow DOM |
| **Storybook** | Beta | Safe story template helpers with boolean-attribute shorthand |
| **Storybook** | Beta | Secure-by-default story template helpers with a pinned `unsafeHtml` contract (targeting Stable in 1.15.0) |
| **Motion** | Stable | View transitions, FLIP, morphing, parallax, typewriter, springs, and timelines |
| **Security** | Stable | HTML sanitization, Trusted Types, CSP helpers, and trusted fragment composition |
| **Platform** | Stable | Storage, cache, cookies, page metadata, announcers, and shared runtime config |
| **Router** | Stable | SPA routing, constrained params, redirects, guards, `useRoute()`, and `<bq-link>` |
| **Store** | Stable | Signal-based state management, persistence, migrations, action hooks, and plugin lifecycle helpers |
| **View** | Beta | Declarative DOM bindings with `bq-*` directives, declarative enter/leave/move transitions, and an optional expression precompiler (targeting Stable in 1.15.0) |
| **Forms** | Beta | Reactive form state, validation, field arrays, progressive-enhancement form actions, and optimistic updates (targeting Stable in 1.15.0) |
| **i18n** | Beta | Reactive locales, interpolation, pluralization, lazy loading, and Intl formatting |
| **A11y** | Beta | Focus traps, live-region announcements, roving tabindex, skip links, and audits |
| **DnD** | Beta | Draggable elements, droppable zones, and sortable lists |
| **Media** | Beta | Reactive browser/device signals for viewport, network, battery, geolocation, clipboard, and DOM observers |
| **Plugin** | Beta | Global plugin registration for custom directives and Web Components |
| **Devtools** | Beta | Runtime inspection helpers for signals, stores, components, and timelines |
| **Testing** | Beta | Component mounting, mock signals/router helpers, and async test utilities |
| **i18n** | Beta | Reactive locales, interpolation, ICU MessageFormat plurals, lazy loading, Intl formatting, and optional message-extraction tooling (targeting Stable in 1.15.0) |
| **A11y** | Beta | Focus traps, live-region announcements, roving tabindex, skip links, and audits with documented WCAG scope (targeting Stable in 1.15.0) |
| **DnD** | Beta | Draggable elements, droppable zones, and keyboard-accessible sortable lists (targeting Stable in 1.15.0) |
| **Media** | Beta | Reactive, SSR-safe browser/device signals for viewport, network, battery, geolocation, clipboard, and DOM observers (targeting Stable in 1.15.0) |
| **Plugin** | Beta | Global plugin registration (hook bus, DI, namespaced directives) with symmetric install/uninstall, plus `definePlugin` (targeting Stable in 1.15.0) |
| **Devtools** | Beta | Runtime inspection helpers plus a stable bridge protocol and reference browser extension (component tree, signals/stores, timeline) (targeting Stable in 1.15.0) |
| **Testing** | Beta | Testing-Library-parity, shadow-DOM-aware queries, `userEvent`/`fireEvent`, mocks, runner-agnostic (Vitest/Jest/bun:test) (targeting Stable in 1.15.0) |
| **SSR** | Experimental | Runtime-agnostic server-side rendering (Node ≥ 24, Deno, Bun), streaming, async loaders, hydration islands, head/asset/CSP-nonce management, runtime adapters |
| **Server** | Experimental | Express-inspired backend routing, middleware, safe responses, SSR-aware requests, sessions, CSRF, guards, auth, and WebSocket sessions (targeting Stable in 1.15.0) |

Expand Down
14 changes: 14 additions & 0 deletions bin/bquery-i18n.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#!/usr/bin/env node
/**
* CLI launcher for bQuery i18n tooling.
*
* Thin wrapper around `runExtractCli` from the built `i18n/extract` entry.
* Runs against the published `dist/` build; for local development run the
* extractor programmatically from `src/i18n/extract`.
*
* Usage: bquery-i18n extract [options] <glob...>
*/
import { runExtractCli } from '../dist/i18n-extract.es.mjs';

const exitCode = await runExtractCli(process.argv.slice(2));
process.exit(exitCode);
Loading