An ORM-Agnostic Query Builder

Building type-safe queries from API request query strings. Transform ?filter[status][eq]=active into database queries.

Why qbjs?

Parser → AST → Compiler

Clean architecture with a well-defined Abstract Syntax Tree for maximum flexibility and extensibility.

Security-First

Built-in security configuration for field allowlisting, operator restrictions, and query limits.

Type-Safe

Full TypeScript support with comprehensive type definitions for a great developer experience.

Multi-Database

Works with PostgreSQL, MySQL, and SQLite through Drizzle ORM compilers.

Framework Integration

First-class support for Hono with middleware included. Easy to integrate with any framework.

Flexible Filtering

Support for comparison, string, and logical operators with nested filter expressions.

Simple & Powerful

Build secure, type-safe API endpoints with just a few lines of code. qbjs handles parsing, validation, and compilation automatically.

Example: Hono + Drizzle
import { createQueryBuilder, createDrizzlePgCompiler } from "@qbjs/core";
import { users } from "./db/schema";

const queryBuilder = createQueryBuilder({
  config: {
    allowedFields: ["id", "name", "email", "status"],
    maxLimit: 100,
  },
  compiler: createDrizzlePgCompiler(),
});

// GET /users?filter[status][eq]=active&sort=-createdAt&limit=10
app.get("/users", async (c) => {
  const result = queryBuilder.executeFromUrl(c.req.url, users);
  
  if (result.errors.length > 0) {
    return c.json({ errors: result.errors }, 400);
  }

  const data = await db.query.users.findMany(result.query);
  return c.json(data);
});

Works With Your Stack

qbjs integrates seamlessly with popular tools and databases.

Ready to Get Started?

Install qbjs and build your first type-safe API endpoint in minutes.

pnpm add @qbjs/core
Read the Documentation