Add types to the PocketBase JavaScript SDK.
# npm
npm i typed-pocketbase
# pnpm
pnpm i typed-pocketbase
# yarn
yarn add typed-pocketbaseGenerate the types:
npx typed-pocketbase --email [email protected] --password supersecretpassword -o Database.d.tsThe codegen tool will look for POCKETBASE_EMAIL and POCKETBASE_PASSWORD environment variables if the email or password are not passed using cli options.
Create a PocketBase client:
import PocketBase from 'pocketbase';
import { TypedPocketBase } from 'typed-pocketbase';
import { Schema } from './Database';
const db = new TypedPocketBase<Schema>('http://localhost:8090');Enjoy full type-safety:
import { neq } from 'typed-pocketbase';
db.from('posts').getFullList({
	select: {
		id: true,
		title: true,
		content: true,
		expand: {
			owner: {
				username: true
			}
		}
	}
	sort: '-date',
	filter: neq('content', '')
});const showId = Math.random() < 0.5;
db.from('posts').getFullList({
	select: {
		id: showId,
		title: true,
		content: true
	}
});Use the and, or and other utility functions to filter rows:
import { and, or, eq, gte, lt } from 'typed-pocketbase';
// get all posts created in 2022
db.from('posts').getFullList({
	// a "manual" filter is a tuple of length 3
	filter: and(['date', '<', '2023-01-01'], ['data', '>=', '2022-01-01'])
});
// get all posts expect for those created in 2022
db.from('posts').getFullList({
	filter: or(['date', '>=', '2023-01-01'], ['data', '<', '2022-01-01'])
});
// get all posts that were create at '2023-01-01'
db.from('posts').getFullList({ filter: eq('date', '2023-01-01') });
// combine or/and with helpers and manual filters
db.from('posts').getFullList({
	filter: or(
		//
		['date', '>=', '2023-01-01'],
		lt('date', '2022-01-01')
	)
});
// conditionally filter rows
// falsy values are excluded
db.from('posts').getFullList({
	filter: and(
		//
		gte('date', '2022-01-01'),
		!untilNow && lt('date', '2023-01-01')
	)
});
// filter for columns in relations
// works up to 6 levels deep, including the top level
db.from('posts').getFullList({
	filter: eq('owner.name', 'me')
});Most filter operators are available as short hand function.
Visit the pocketbase documentation to find out about all filters in the List/Search records section.
db.from('posts').getFullList({
	// sort by descending 'date'
	sort: '-date'
});
db.from('posts').getFullList({
	// sort by descending 'date' and ascending 'title'
	sort: ['-date', '+title']
});
// conditionally sort rows
// falsy values are excluded
db.from('posts').getFullList({
	sort: ['-date', sortTitle && '+title']
});In typed-pocketbase expanding happens automatically when using select.
db.from('posts').getFullList({
	select: {
		expand: {
			user: true
		}
	}
});
// select nested columns
db.from('posts').getFullList({
	select: {
		expand: {
			user: {
				name: true
				avatar: true
			}
		}
	}
});
// nested expand
db.from('posts').getFullList({
	select:{
		expand: {
			user: {
				expand: {
					profile: true
				}
			}
		}
	}
});Back relation expanding is support aswell:
db.from('user').getFullList({
	select: {
		expand: {
			'posts(user)': {
				title: true,
				created: true
			}
		}
	}
});const select = db.from('posts').createSelect({
	id: true,
	content: true,
	owner: true,
	collectionName: true,
	asd: true,
	expand: {
		owner: {
			username: true,
			email: true
		}
	}
});const filter = db
	.from('posts')
	.createFilter(or(eq('content', 'bla'), eq('published', true)));const sort = db.from('posts').createSort('+id', '-date');