Skip to content
Runtime
Framework

Frameworks

Every integration on this page is a binding. None of them re-implements decoding, encoding, defaults, or transitions — they all drive the same @queryweave/core runtime, and they can all be removed without changing what a query means.

The path a query takes through the model, stage by stage.

  1. Query model — @queryweave/core
  2. Query runtime
  3. Adapter — browser · router · memory
  4. Binding
  5. Your components

Query model → Query runtime. Query runtime → Adapter. Adapter → Binding. Binding → Your components.

A framework enters at the last two stages. Everything before them is identical in a plain TypeScript application.

Read that from the left: you can stop after any stage. A server stops at the model. A vanilla client stops at the runtime. A Vue application takes one more step, and that step adds reactivity — nothing else.

Vanilla

@queryweave/core

The runtime on its own, with no framework in the dependency graph.

Runs in
Any ECMAScript runtime
Needs
No framework
pnpm add @queryweave/core @queryweave/browser

Vue

@queryweave/vue

Readonly reactive values and explicit operations, bound to one model.

Runs in
Vue application
Needs
vue
pnpm add @queryweave/core @queryweave/vue

Vue Router

@queryweave/vue-router

A router-backed adapter that keeps path and hash intact.

Runs in
Vue Router application
Needs
vue, vue-router
pnpm add @queryweave/core @queryweave/vue-router

Nuxt

@queryweave/nuxt

A module plus a request-scoped runtime plugin for server rendering.

Runs in
Nuxt server and client
Needs
nuxt
pnpm add @queryweave/core @queryweave/vue @queryweave/nuxt
  • No framework? Vanilla TypeScript. This is the baseline, and it is a complete story on its own.
  • Vue, no router? Vue with the browser adapter.
  • Vue with Vue Router? Vue Router supplies the adapter; Vue supplies the binding. They are separate packages because the adapter is useful without the binding.
  • Nuxt? Nuxt wires both, per request.

Only what the framework itself requires:

  • a reactive view of the values,
  • lifecycle-aware cleanup,
  • an idiomatic way to connect a value to an input.

A binding may not add a second way to decode, a different default rule, or its own navigation policy. If you can observe a behavioral difference between useQueryModel(model) and createQueryRuntime({ model, adapter }), that is a bug.

The core contracts were designed to be implemented from outside. An adapter is four methods, and a binding is a thin layer over QueryBinding. See writing an adapter for the rules, and the architecture page for the dependency direction to preserve.

Additional framework adapters are on the roadmap as work designed against these contracts rather than as a rewrite of them.