Awesome
typed-pocketbase
Add types to the PocketBase JavaScript SDK.
Installation
# npm
npm i typed-pocketbase
# pnpm
pnpm i typed-pocketbase
# yarn
yarn add typed-pocketbase
Usage
Generate the types:
npx typed-pocketbase --email admin@mail.com --password supersecretpassword -o Database.d.ts
The 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', '')
});
Selecting fields
const showId = Math.random() < 0.5;
db.from('posts').getFullList({
select: {
id: showId,
title: true,
content: true
}
});
Filtering columns
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.
Sorting rows
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']
});
Expanding
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
}
}
}
});
Helper methods:
createSelect
const select = db.from('posts').createSelect({
id: true,
content: true,
owner: true,
collectionName: true,
asd: true,
expand: {
owner: {
username: true,
email: true
}
}
});
createFilter
const filter = db
.from('posts')
.createFilter(or(eq('content', 'bla'), eq('published', true)));
createSort
const sort = db.from('posts').createSort('+id', '-date');