UNPKG

agnostic-query

Version:

Type-safe fluent builder for portable query schemas. Runtime-agnostic, database-agnostic — the same QuerySchema drives Drizzle, Kysely, db0, or raw SQL.

122 lines (85 loc) 3.56 kB
--- name: adapters description: > Convert a portable QuerySchema to/from Drizzle, Kysely, TanStack DB, db0, or raw SQL. Tree-shakeable adapters — only import what you need. Covers toDrizzle, fromTanDb, fromKysely, toKysely, toDb0, and toSql. type: core library: agnostic-query library_version: '1.7.0' sources: - 'Nahida-aa/agnostic-query:docs/src/content/docs/guides/adapters.md' - 'Nahida-aa/agnostic-query:docs/src/content/docs/guides/e2e.md' - 'Nahida-aa/agnostic-query:packages/agnostic-query/src/drizzle/pg.ts' - 'Nahida-aa/agnostic-query:packages/agnostic-query/src/kysely/pg.ts' - 'Nahida-aa/agnostic-query:packages/agnostic-query/src/tanstack-db.ts' - 'Nahida-aa/agnostic-query:packages/agnostic-query/src/db0/pg.ts' - 'Nahida-aa/agnostic-query:packages/agnostic-query/src/sql/pg.ts' --- # agnostic-query — Translate Between ORMs All adapter dependencies (`drizzle-orm`, `kysely`, `@tanstack/db`, `db0`, `zod`, `valibot`) are **optional peer dependencies** — install only what you use. ## Setup ```ts import { toDrizzle, toDrizzleWhere, toDrizzleOrderBy } from 'agnostic-query/drizzle/pg' import { fromTanDb, fromTanDbWhere, fromTanDbOrderBy } from 'agnostic-query/tanstack-db' import { fromKysely, toKyselyWhere, toKyselyOrderBy } from 'agnostic-query/kysely/pg' import { toDb0, toDb0Where, toDb0OrderBy } from 'agnostic-query/db0/pg' import { toSql, toSqlWhere, toSqlOrderBy } from 'agnostic-query/sql/pg' ``` ## Core Patterns ### Execute a QuerySchema via Drizzle ```ts import { toDrizzle } from 'agnostic-query/drizzle/pg' import { db, users } from './db.ts' const schema = aq<User>() .where('name', 'eq', 'Alice') .where('age', 'gte', 18) .toJSON() const rows = await toDrizzle(db, users, schema) ``` `toDrizzleWhere` and `toDrizzleOrderBy` are also available for custom Drizzle queries. ### Translate from TanStack DB `fromTanDb` handles where, cursor, limit, and orderBy from `LoadSubsetOptions` in one call: ```ts import { fromTanDb } from 'agnostic-query/tanstack-db' // Inside a server function / queryFn const data = fromTanDb(meta?.loadSubsetOptions) // → QuerySchema ``` Lower-level: `fromTanDbWhere` and `fromTanDbOrderBy` for manual control. ### Translate from Kysely ```ts import { fromKysely } from 'agnostic-query/kysely/pg' import { db } from './db.ts' const query = db.selectFrom('users').selectAll().where('age', '>=', 18) const schema = fromKysely<User>(query) // converts the Kysely query into a portable QuerySchema ``` ### Execute via db0 ```ts import { toDb0 } from 'agnostic-query/db0/pg' const rows = await toDb0<User>(db, schema) ``` Lower-level: `toDb0Where` and `toDb0OrderBy` for building raw SQL clauses. ### Generate raw SQL strings ```ts import { toSql } from 'agnostic-query/sql/pg' const result = toSql({ table: 'users', ...schema }) // → { sql: 'SELECT * FROM "users" WHERE ...', params: [...] } ``` Also: `toSqlWhere`, `toSqlOrderBy` for individual clause generation. ## Common Mistakes ### MEDIUM Assuming adapter dependencies are installed Wrong — importing an adapter without its optional peer dep: ```ts import { toDrizzle } from 'agnostic-query/drizzle/pg' // Error: Cannot find module 'drizzle-orm' ``` Correct — install the adapter's peer dep first: ```sh bun add drizzle-orm ``` All peer dependencies are optional. See `package.json` `peerDependenciesMeta` for the full list. Source: package.json peerDependenciesMeta --- See also: agnostic-query/query — understanding QuerySchema structure helps debug unexpected conversions