Signals all the way down
The URI, the query state and every page flag — uri(), state(), hasNextPage() — are computed signals. No RxJS, no subscriptions.
@qubeejs/angular is the Angular adapter for @qubeejs/core. It makes the core's query builder and paginator injectable, reads them as signals, and keeps a list's filters, sorts and page in the address bar.
These pages cover only what the adapter adds. Filters, operators, sorting, drivers and the builder's semantics are documented once, in the core docs ↗.

The URI, the query state and every page flag — uri(), state(), hasNextPage() — are computed signals. No RxJS, no subscriptions.
injectQubeeList() keeps filters, sorts and the page in the address bar as typed signals, through the Angular Router, the History API or memory.
qubeeHttpResource() is built on httpResource(): your HttpClient, your interceptors, stale requests aborted.
Pass a driver definition — STRAPI_DRIVER, LARAVEL_DRIVER, … — and the other nineteen tree-shake out of your bundle.
Register a driver once with provideQubee() — or QubeeModule.forRoot() — and inject the query builder anywhere. Everything the core exports comes from the same import.
import { ApplicationConfig } from '@angular/core';
import { provideHttpClient } from '@angular/common/http';
import { STRAPI_DRIVER, provideQubee } from '@qubeejs/angular';
export const appConfig: ApplicationConfig = {
providers: [
provideHttpClient(),
provideQubee({
baseUrl: 'https://api.example.com',
driver: STRAPI_DRIVER
})
]
};import { NgModule } from '@angular/core';
import { QubeeModule, STRAPI_DRIVER } from '@qubeejs/angular';
@NgModule({
imports: [
QubeeModule.forRoot({
baseUrl: 'https://api.example.com',
driver: STRAPI_DRIVER
})
]
})
export class AppModule {}The adapter documents nothing the core already documents. Query semantics are the same in every framework binding — read them once, over there.
@qubeejs/core — @qubeejs/angular re-exports all of it — its reference page is in the core docs, not here.