Generate typescript definitions from your pocketbase.io schema.
npx pocketbase-typegen --url https://myproject.pockethost.io --email [email protected] --password 'secr3tp@ssword!'
This will produce types for all your PocketBase collections to use in your frontend typescript codebase.
Collections can be automatically typed using the generated TypedPocketBase type:
import { TypedPocketBase } from "./pocketbase-types"
const pb = new PocketBase("http://127.0.0.1:8090") as TypedPocketBase
await pb.collection("tasks").getOne("RECORD_ID") // -> results in TaskResponse
await pb.collection("posts").getOne("RECORD_ID") // -> results in PostResponseAlternatively, you can use generic types for each request, eg:
import { Collections, TasksResponse } from "./pocketbase-types"
await pb.collection(Collections.Tasks).getOne<TasksResponse>("RECORD_ID") // -> results in TaskResponseYou can provide types for JSON fields and expanded relations by passing generic arguments to the Response types:
import { Collections, CommentsResponse, UserResponse } from "./pocketbase-types"
/**
type CommentsRecord<Tmetadata = unknown> = {
text: string
metadata: null | Tmetadata // This is a json field
user: RecordIdString // This is a relation field
}
*/
type Metadata = {
likes: number
}
type Expand = {
user: UsersResponse
}
const result = await pb
.collection(Collections.Comments)
.getOne<CommentsResponse<Metadata, Expand>>("RECORD_ID", { expand: "user" })
// Now you can access the expanded relation with type safety and hints in your IDE
result.expand.user.usernameYou can also type the create/update operations:
import { Collections, Create, Update } from "./pocketbase-types"
// Create
const newUser: Create<Collections.Users> = {
name: "Name",
username: "username",
password: "password",
passwordConfirm: "password",
email: "[email protected]",
emailVisibility: true,
verified: false,
}
await pb.collection(Collections.Users).create(newUser)
// Update
const updatedUser: Update<Collections.Users> = {
name: "Updated name",
email: "[email protected]",
verified: false,
}
await pb.collection(Collections.Users).update("RECORD_ID", updatedUser)Options:
-V, --version output the version number
-u, --url <url> URL to your hosted pocketbase instance. When using this options you must also provide email and
password options or auth token option.
--email <email> Email for a pocketbase superuser. Use this with the --url option.
-p, --password <password> Password for a pocketbase superuser. Use this with the --url option.
-t, --token <token> Auth token for a pocketbase superuser. Use this with the --url option.
-d, --db <path> Path to the pocketbase SQLite database.
-j, --json <path> Path to JSON schema exported from pocketbase admin UI.
--env [dir] Use environment variables for configuration. Add PB_TYPEGEN_URL, PB_TYPEGEN_EMAIL, PB_TYPEGEN_PASSWORD
to your .env file. Optionally provide a path to a directory containing a .env file (default: true)
-o, --out <path> Path to save the typescript output file. (default: "pocketbase-types.ts")
--no-sdk Removes the pocketbase package dependency. A typed version of the SDK will not be generated.
-h, --help display help for command
npx pocketbase-typegen --url https://myproject.pockethost.io --email [email protected] --password 'secr3tp@ssword!'
You can generate such token via the above impersonate API or from the Dashboard > Collections > _superusers > {select superuser} > "Impersonate" dropdown option.
npx pocketbase-typegen --url https://myproject.pockethost.io --token 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9'
Also supports environment specific files such as .env.local (uses dotenv-flow)
npx pocketbase-typegen --env or npx pocketbase-typegen --env path/to/dir
.env variables include:
PB_TYPEGEN_URL=https://myproject.pockethost.io
[email protected]
PB_TYPEGEN_PASSWORD=secr3tp@ssword!
PB_TYPEGEN_TOKEN=eyJhbGciOiJI...ozhyQVfYm24
npx pocketbase-typegen --db ./pb_data/data.db
npx pocketbase-typegen --json ./pb_schema.json
Pocketbase hooks can be used to generate new types every time a collections is created/updated/deleted. Create a file generateHooks.pb.js and place it in a directory called pb_hooks along side your pocketbase executable.
/// <reference path="../pb_data/types.d.ts" />
const generateTypes = (e) => {
console.log("Collection changed - Running type generation...")
const cmd = $os.cmd(
"npx",
"pocketbase-typegen",
"--db",
"pb_data/data.db",
"--out",
"../client/src/pocketbase-types.ts"
)
const result = toString(cmd.output())
console.log(result)
e.next()
}
onCollectionAfterCreateSuccess(generateTypes)
onCollectionAfterUpdateSuccess(generateTypes)
onCollectionAfterDeleteSuccess(generateTypes)Add it to your projects package.json:
"scripts": {
"typegen": "pocketbase-typegen --env",
},
The output is a typescript file pocketbase-types.ts (example) which will contain:
CollectionsAn enum of all collections.[CollectionName]RecordOne type for each collection (eg ProfilesRecord).[CollectionName]ResponseOne response type for each collection (eg ProfilesResponse) which includes system fields. This is what is returned from the PocketBase API.[CollectionName][FieldName]OptionsIf the collection contains a select field with set values, an enum of the options will be generated.
CollectionRecordsA type mapping each collection name to the record type.CollectionResponsesA type mapping each collection name to the response type.TypedPocketBaseA type for usage with type asserted PocketBase instance.
| PocketBase | pocketbase-typegen |
|---|---|
| v0.23.x | v1.3.x |
| v0.18.x | v1.2.x |
| v0.8.x | v1.1.x |
| v0.7.x | v1.0.x |