Getting Started

Tutorial

A step-by-step guide to building type-safe PocketBase queries with pb-query.

Install pb-query

npm install @sergio9929/pb-query

Create a PocketBase instance

example.ts
import PocketBase from 'pocketbase';

const pb = new PocketBase("https://example.com");

Define your types

types.ts
export interface User {
  id: string;
  name: string;
  email: string;
  created: Date;
  updated: Date;
}

export interface Post {
  id: string;
  title: string;
  content: string;
  author: User;
  status: 'draft' | 'published';
  created: Date;
  updated: Date;
}

You can read more about how to set up you types in Setting up Types.

Build a type-safe query

example.ts
import { pbQuery } from '@sergio9929/pb-query';
import type { Post } from './types';

const query = pbQuery<Post>() // posts collection
  .fields([
    'title',
    'content:excerpt(100,true)',
    'status',
    'author',
    'expand.author.name', // Automatically expanded
  ])
  .search(['title', 'content', 'author.name'], 'footba')
  .and()
  .group((q) =>
    q.equal('status', 'published')
      .or()
      .equal('author.name', 'Sergio')
  )
  .sort(['-created'])
  .build(pb.filter);

Now your query object contains the properly formatted filter, expand, fields, and sort strings.

You can read more about the output returned by pbQuery() in Returning Values.

Use your query

example.ts
const records = await pb.collection("posts").getList(1, 20, query);

Full example

app/example.ts
import PocketBase from 'pocketbase';
import { pbQuery } from '@sergio9929/pb-query';
import type { Post } from './types';

const pb = new PocketBase("https://example.com");

const query = pbQuery<Post>() // posts collection
  .fields([
    'title',
    'content:excerpt(100,true)',
    'status',
    'author',
    'expand.author.name', // Automatically expanded
  ])
  .search(['title', 'content', 'author.name'], 'footba')
  .and()
  .group((q) =>
    q.equal('status', 'published')
      .or()
      .equal('author.name', 'Sergio')
  )
  .sort(['-created'])
  .build(pb.filter);

const records = await pb.collection("posts").getList(1, 20, query);