@picobase_app/client 0.5.0 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -0
- package/dist/index.d.mts +17 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +25 -0
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -198,6 +198,39 @@ const token = await pb.storage.getFileToken()
|
|
|
198
198
|
const protectedUrl = pb.storage.getFileUrl(user, 'document.pdf', { token })
|
|
199
199
|
```
|
|
200
200
|
|
|
201
|
+
## Admin API (Collection Management)
|
|
202
|
+
|
|
203
|
+
The SDK provides an admin module that allows you to programmatically manage your PicoBase collections. **This requires an admin API key** to be used during client initialization.
|
|
204
|
+
|
|
205
|
+
```typescript
|
|
206
|
+
// Initializing with an admin API key
|
|
207
|
+
const adminPb = createClient('https://myapp.picobase.com', 'pbk_admin_xxxxxxxx')
|
|
208
|
+
|
|
209
|
+
// Create a new collection
|
|
210
|
+
const usersCollection = await adminPb.admin.createCollection({
|
|
211
|
+
name: "custom_users",
|
|
212
|
+
type: "base",
|
|
213
|
+
schema: [
|
|
214
|
+
{ name: "full_name", type: "text", required: true },
|
|
215
|
+
{ name: "age", type: "number" }
|
|
216
|
+
]
|
|
217
|
+
})
|
|
218
|
+
|
|
219
|
+
// List all collections
|
|
220
|
+
const collections = await adminPb.admin.listCollections()
|
|
221
|
+
|
|
222
|
+
// Get a single collection
|
|
223
|
+
const collection = await adminPb.admin.getCollection('custom_users')
|
|
224
|
+
|
|
225
|
+
// Update an existing collection
|
|
226
|
+
const updated = await adminPb.admin.updateCollection('custom_users', {
|
|
227
|
+
name: "users_updated"
|
|
228
|
+
})
|
|
229
|
+
|
|
230
|
+
// Delete a collection
|
|
231
|
+
const success = await adminPb.admin.deleteCollection('users_updated')
|
|
232
|
+
```
|
|
233
|
+
|
|
201
234
|
## Advanced
|
|
202
235
|
|
|
203
236
|
### Custom auth collection
|
package/dist/index.d.mts
CHANGED
|
@@ -491,6 +491,23 @@ declare class PicoBaseClient {
|
|
|
491
491
|
* @returns The function result
|
|
492
492
|
*/
|
|
493
493
|
rpc<T = unknown>(functionName: string, params?: Record<string, unknown>): Promise<T>;
|
|
494
|
+
/**
|
|
495
|
+
* Proactively wake up the instance if it's sleeping and wait for it to be ready.
|
|
496
|
+
* Useful to call when a user navigates to a login page or before critical operations,
|
|
497
|
+
* to absorb the cold-start latency upfront.
|
|
498
|
+
*
|
|
499
|
+
* This method guarantees that the instance is fully running and able to serve requests
|
|
500
|
+
* when the promise resolves.
|
|
501
|
+
*
|
|
502
|
+
* @example
|
|
503
|
+
* ```ts
|
|
504
|
+
* // In a useEffect on your login page:
|
|
505
|
+
* useEffect(() => {
|
|
506
|
+
* pb.wake().catch(console.error)
|
|
507
|
+
* }, [])
|
|
508
|
+
* ```
|
|
509
|
+
*/
|
|
510
|
+
wake(): Promise<boolean>;
|
|
494
511
|
/**
|
|
495
512
|
* Get the current auth token (if signed in), or empty string.
|
|
496
513
|
*/
|
package/dist/index.d.ts
CHANGED
|
@@ -491,6 +491,23 @@ declare class PicoBaseClient {
|
|
|
491
491
|
* @returns The function result
|
|
492
492
|
*/
|
|
493
493
|
rpc<T = unknown>(functionName: string, params?: Record<string, unknown>): Promise<T>;
|
|
494
|
+
/**
|
|
495
|
+
* Proactively wake up the instance if it's sleeping and wait for it to be ready.
|
|
496
|
+
* Useful to call when a user navigates to a login page or before critical operations,
|
|
497
|
+
* to absorb the cold-start latency upfront.
|
|
498
|
+
*
|
|
499
|
+
* This method guarantees that the instance is fully running and able to serve requests
|
|
500
|
+
* when the promise resolves.
|
|
501
|
+
*
|
|
502
|
+
* @example
|
|
503
|
+
* ```ts
|
|
504
|
+
* // In a useEffect on your login page:
|
|
505
|
+
* useEffect(() => {
|
|
506
|
+
* pb.wake().catch(console.error)
|
|
507
|
+
* }, [])
|
|
508
|
+
* ```
|
|
509
|
+
*/
|
|
510
|
+
wake(): Promise<boolean>;
|
|
494
511
|
/**
|
|
495
512
|
* Get the current auth token (if signed in), or empty string.
|
|
496
513
|
*/
|
package/dist/index.js
CHANGED
|
@@ -620,6 +620,31 @@ var PicoBaseClient = class {
|
|
|
620
620
|
throw new RpcError(functionName, status, details);
|
|
621
621
|
}
|
|
622
622
|
}
|
|
623
|
+
/**
|
|
624
|
+
* Proactively wake up the instance if it's sleeping and wait for it to be ready.
|
|
625
|
+
* Useful to call when a user navigates to a login page or before critical operations,
|
|
626
|
+
* to absorb the cold-start latency upfront.
|
|
627
|
+
*
|
|
628
|
+
* This method guarantees that the instance is fully running and able to serve requests
|
|
629
|
+
* when the promise resolves.
|
|
630
|
+
*
|
|
631
|
+
* @example
|
|
632
|
+
* ```ts
|
|
633
|
+
* // In a useEffect on your login page:
|
|
634
|
+
* useEffect(() => {
|
|
635
|
+
* pb.wake().catch(console.error)
|
|
636
|
+
* }, [])
|
|
637
|
+
* ```
|
|
638
|
+
*/
|
|
639
|
+
async wake() {
|
|
640
|
+
try {
|
|
641
|
+
await this.send("/api/health", { method: "GET" });
|
|
642
|
+
return true;
|
|
643
|
+
} catch (err) {
|
|
644
|
+
console.warn("Failed to wake instance:", err);
|
|
645
|
+
return false;
|
|
646
|
+
}
|
|
647
|
+
}
|
|
623
648
|
/**
|
|
624
649
|
* Get the current auth token (if signed in), or empty string.
|
|
625
650
|
*/
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/auth.ts","../src/collection.ts","../src/realtime.ts","../src/storage.ts","../src/admin.ts","../src/errors.ts","../src/client.ts"],"names":["PocketBase","url"],"mappings":"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","file":"index.js","sourcesContent":["import type PocketBase from 'pocketbase'\nimport type {\n AuthResponse,\n AuthStateChangeCallback,\n AuthEvent,\n SignUpOptions,\n SignInOptions,\n OAuthSignInOptions,\n RecordModel,\n} from './types'\n\n/**\n * Auth module — handles user sign-up, sign-in, OAuth, and session management.\n *\n * PicoBase uses PocketBase's built-in `users` collection for auth. Each\n * instance has its own isolated user pool.\n *\n * @example\n * ```ts\n * // Sign up\n * const { token, record } = await pb.auth.signUp({\n * email: 'user@example.com',\n * password: 'securepassword',\n * })\n *\n * // Sign in\n * const { token, record } = await pb.auth.signIn({\n * email: 'user@example.com',\n * password: 'securepassword',\n * })\n *\n * // Listen to auth changes\n * pb.auth.onStateChange((event, record) => {\n * console.log(event, record)\n * })\n * ```\n */\nexport class PicoBaseAuth {\n private pb: PocketBase\n private listeners: Set<AuthStateChangeCallback> = new Set()\n private _collection: string = 'users'\n\n constructor(pb: PocketBase) {\n this.pb = pb\n\n // Listen to PocketBase auth store changes and re-emit\n this.pb.authStore.onChange((token) => {\n const record = this.pb.authStore.record ?? null\n const event: AuthEvent = token ? 'SIGNED_IN' : 'SIGNED_OUT'\n this._notify(event, record)\n })\n }\n\n /**\n * Set which collection to authenticate against.\n * Defaults to 'users'. Use this if you have a custom auth collection.\n */\n setCollection(name: string): this {\n this._collection = name\n return this\n }\n\n /**\n * Create a new user account.\n */\n async signUp(options: SignUpOptions): Promise<AuthResponse> {\n const { email, password, passwordConfirm, ...rest } = options\n\n const record = await this.pb.collection(this._collection).create<RecordModel>({\n email,\n password,\n passwordConfirm: passwordConfirm ?? password,\n ...rest,\n })\n\n // Automatically sign in after sign-up\n const authResult = await this.pb\n .collection(this._collection)\n .authWithPassword<RecordModel>(email, password)\n\n return {\n token: authResult.token,\n record: authResult.record,\n }\n }\n\n /**\n * Sign in with email and password.\n */\n async signIn(options: SignInOptions): Promise<AuthResponse> {\n const result = await this.pb\n .collection(this._collection)\n .authWithPassword<RecordModel>(options.email, options.password)\n\n return {\n token: result.token,\n record: result.record,\n }\n }\n\n /**\n * Sign in with an OAuth2 provider (Google, GitHub, etc.).\n *\n * In browser environments this opens a popup/redirect to the provider.\n * Configure providers in your PicoBase dashboard.\n */\n async signInWithOAuth(options: OAuthSignInOptions): Promise<AuthResponse> {\n const result = await this.pb.collection(this._collection).authWithOAuth2({\n provider: options.provider,\n scopes: options.scopes,\n createData: options.createData,\n urlCallback: options.urlCallback,\n })\n\n return {\n token: result.token,\n record: result.record,\n }\n }\n\n /**\n * Refresh the current auth token.\n */\n async refreshToken(): Promise<AuthResponse> {\n const result = await this.pb.collection(this._collection).authRefresh<RecordModel>()\n this._notify('TOKEN_REFRESHED', result.record)\n return {\n token: result.token,\n record: result.record,\n }\n }\n\n /**\n * Send a password reset email.\n */\n async requestPasswordReset(email: string): Promise<void> {\n await this.pb.collection(this._collection).requestPasswordReset(email)\n }\n\n /**\n * Confirm a password reset with the token from the reset email.\n */\n async confirmPasswordReset(\n token: string,\n password: string,\n passwordConfirm?: string,\n ): Promise<void> {\n await this.pb\n .collection(this._collection)\n .confirmPasswordReset(token, password, passwordConfirm ?? password)\n }\n\n /**\n * Send an email verification email.\n */\n async requestVerification(email: string): Promise<void> {\n await this.pb.collection(this._collection).requestVerification(email)\n }\n\n /**\n * Confirm email verification with the token from the verification email.\n */\n async confirmVerification(token: string): Promise<void> {\n await this.pb.collection(this._collection).confirmVerification(token)\n }\n\n /**\n * Sign out the current user. Clears the local auth store.\n */\n signOut(): void {\n this.pb.authStore.clear()\n }\n\n /**\n * Get the currently authenticated user record, or `null` if not signed in.\n */\n get user(): RecordModel | null {\n return this.pb.authStore.record\n }\n\n /**\n * Get the current auth token, or empty string if not signed in.\n */\n get token(): string {\n return this.pb.authStore.token\n }\n\n /**\n * Check if the current auth session is valid (token exists and not expired).\n */\n get isValid(): boolean {\n return this.pb.authStore.isValid\n }\n\n /**\n * Listen to auth state changes. Returns an unsubscribe function.\n *\n * @example\n * ```ts\n * const unsubscribe = pb.auth.onStateChange((event, record) => {\n * if (event === 'SIGNED_IN') {\n * console.log('Welcome', record.email)\n * }\n * })\n *\n * // Later:\n * unsubscribe()\n * ```\n */\n onStateChange(callback: AuthStateChangeCallback): () => void {\n this.listeners.add(callback)\n return () => {\n this.listeners.delete(callback)\n }\n }\n\n private _notify(event: AuthEvent, record: RecordModel | null): void {\n for (const cb of this.listeners) {\n try {\n cb(event, record)\n } catch {\n // Don't let one listener crash others\n }\n }\n }\n}\n","import type PocketBase from 'pocketbase'\nimport type { RecordModel, ListResult } from 'pocketbase'\n\n/** Options for list queries. */\nexport interface ListOptions {\n sort?: string\n filter?: string\n expand?: string\n fields?: string\n skipTotal?: boolean\n [key: string]: unknown\n}\n\n/** Options for single record queries. */\nexport interface RecordQueryOptions {\n expand?: string\n fields?: string\n [key: string]: unknown\n}\n\n/**\n * Collection module — CRUD operations on a PocketBase collection.\n *\n * @example\n * ```ts\n * const posts = pb.collection('posts')\n *\n * // List with filtering, sorting, and pagination\n * const result = await posts.getList(1, 20, {\n * filter: 'published = true',\n * sort: '-created',\n * expand: 'author',\n * })\n *\n * // Get a single record\n * const post = await posts.getOne('record_id')\n *\n * // Create a record\n * const newPost = await posts.create({\n * title: 'Hello World',\n * content: 'My first post',\n * })\n *\n * // Update a record\n * const updated = await posts.update('record_id', { title: 'Updated' })\n *\n * // Delete a record\n * await posts.delete('record_id')\n * ```\n */\nexport class PicoBaseCollection<T = RecordModel> {\n private pb: PocketBase\n private name: string\n\n constructor(pb: PocketBase, name: string) {\n this.pb = pb\n this.name = name\n }\n\n /**\n * Fetch a paginated list of records.\n *\n * @param page - Page number (1-indexed). Default: 1.\n * @param perPage - Records per page. Default: 30.\n * @param options - Filter, sort, expand, fields.\n */\n async getList(page = 1, perPage = 30, options: ListOptions = {}): Promise<ListResult<T>> {\n return this.pb.collection(this.name).getList<T>(page, perPage, options)\n }\n\n /**\n * Fetch all records matching the filter (auto-paginates).\n *\n * **Warning:** Use with caution on large collections. Prefer `getList()` with pagination.\n */\n async getFullList(options: ListOptions = {}): Promise<T[]> {\n return this.pb.collection(this.name).getFullList<T>(options)\n }\n\n /**\n * Fetch a single record by ID.\n */\n async getOne(id: string, options: RecordQueryOptions = {}): Promise<T> {\n return this.pb.collection(this.name).getOne<T>(id, options)\n }\n\n /**\n * Fetch the first record matching a filter.\n *\n * @example\n * ```ts\n * const admin = await pb.collection('users').getFirstListItem('role = \"admin\"')\n * ```\n */\n async getFirstListItem(filter: string, options: RecordQueryOptions = {}): Promise<T> {\n return this.pb.collection(this.name).getFirstListItem<T>(filter, options)\n }\n\n /**\n * Create a new record.\n *\n * @param data - Record data. Can be a plain object or `FormData` (for file uploads).\n */\n async create(data: Record<string, unknown> | FormData, options: RecordQueryOptions = {}): Promise<T> {\n return this.pb.collection(this.name).create<T>(data, options)\n }\n\n /**\n * Update an existing record.\n *\n * @param id - Record ID.\n * @param data - Fields to update. Can be a plain object or `FormData`.\n */\n async update(id: string, data: Record<string, unknown> | FormData, options: RecordQueryOptions = {}): Promise<T> {\n return this.pb.collection(this.name).update<T>(id, data, options)\n }\n\n /**\n * Delete a record by ID.\n */\n async delete(id: string): Promise<boolean> {\n return this.pb.collection(this.name).delete(id)\n }\n\n /**\n * Subscribe to realtime changes on this collection.\n *\n * @param callback - Called on every create/update/delete event.\n * @param filter - Optional: only receive events matching this filter.\n * @returns Unsubscribe function.\n *\n * @example\n * ```ts\n * const unsubscribe = await pb.collection('posts').subscribe((e) => {\n * console.log(e.action, e.record)\n * })\n *\n * // Later:\n * await unsubscribe()\n * ```\n */\n async subscribe(\n callback: (data: { action: string; record: T }) => void,\n filter?: string,\n ): Promise<() => Promise<void>> {\n const topic = '*'\n await this.pb.collection(this.name).subscribe<T>(topic, callback, filter ? { filter } : undefined)\n return () => this.pb.collection(this.name).unsubscribe(topic)\n }\n\n /**\n * Subscribe to changes on a specific record.\n *\n * @param id - Record ID.\n * @param callback - Called on update/delete events.\n * @returns Unsubscribe function.\n */\n async subscribeOne(\n id: string,\n callback: (data: { action: string; record: T }) => void,\n ): Promise<() => Promise<void>> {\n await this.pb.collection(this.name).subscribe<T>(id, callback)\n return () => this.pb.collection(this.name).unsubscribe(id)\n }\n}\n","import type PocketBase from 'pocketbase'\nimport type { RecordModel, RecordSubscription } from './types'\n\n/**\n * Realtime module — manage global realtime subscriptions.\n *\n * For collection-level subscriptions, prefer `pb.collection('name').subscribe()`.\n * This module is for lower-level control over the SSE connection.\n *\n * @example\n * ```ts\n * // Subscribe to all changes on a collection\n * const unsub = await pb.realtime.subscribe('posts', (e) => {\n * console.log(e.action, e.record)\n * })\n *\n * // Unsubscribe\n * await unsub()\n *\n * // Disconnect all realtime connections\n * pb.realtime.disconnect()\n * ```\n */\nexport class PicoBaseRealtime {\n private pb: PocketBase\n\n constructor(pb: PocketBase) {\n this.pb = pb\n }\n\n /**\n * Subscribe to realtime events on a collection.\n *\n * @param collection - Collection name (e.g. 'posts').\n * @param callback - Called on every create/update/delete event.\n * @returns Unsubscribe function.\n */\n async subscribe<T = RecordModel>(\n collection: string,\n callback: (data: RecordSubscription<T>) => void,\n ): Promise<() => Promise<void>> {\n await this.pb.collection(collection).subscribe<T>('*', callback)\n return () => this.pb.collection(collection).unsubscribe('*')\n }\n\n /**\n * Subscribe to realtime events on a specific record.\n *\n * @param collection - Collection name.\n * @param recordId - Record ID.\n * @param callback - Called on update/delete events.\n * @returns Unsubscribe function.\n */\n async subscribeRecord<T = RecordModel>(\n collection: string,\n recordId: string,\n callback: (data: RecordSubscription<T>) => void,\n ): Promise<() => Promise<void>> {\n await this.pb.collection(collection).subscribe<T>(recordId, callback)\n return () => this.pb.collection(collection).unsubscribe(recordId)\n }\n\n /**\n * Unsubscribe from all realtime events on a collection.\n */\n async unsubscribe(collection: string): Promise<void> {\n await this.pb.collection(collection).unsubscribe()\n }\n\n /**\n * Unsubscribe from ALL realtime events. The SSE connection will be\n * automatically closed when there are no remaining subscriptions.\n */\n async disconnectAll(): Promise<void> {\n await this.pb.realtime.unsubscribe()\n }\n}\n","import type PocketBase from 'pocketbase'\nimport type { RecordModel, FileOptions } from './types'\n\n/**\n * Storage module — work with file fields on PocketBase records.\n *\n * PocketBase stores files as record fields. This module provides helpers\n * to get file URLs and generate access tokens for protected files.\n *\n * @example\n * ```ts\n * const user = await pb.collection('users').getOne('user_id')\n *\n * // Get the URL for the user's avatar\n * const avatarUrl = pb.storage.getFileUrl(user, 'avatar.jpg')\n *\n * // Get a thumbnail URL (100x100)\n * const thumbUrl = pb.storage.getFileUrl(user, 'avatar.jpg', {\n * thumb: '100x100',\n * })\n *\n * // Get a temporary token for protected files\n * const token = await pb.storage.getFileToken()\n * const protectedUrl = pb.storage.getFileUrl(user, 'document.pdf', { token })\n * ```\n */\nexport class PicoBaseStorage {\n private pb: PocketBase\n\n constructor(pb: PocketBase) {\n this.pb = pb\n }\n\n /**\n * Get the public URL for a file attached to a record.\n *\n * @param record - The record that owns the file.\n * @param filename - The filename (as stored in the record's file field).\n * @param options - Optional: thumb size, token for protected files, download flag.\n */\n getFileUrl(record: RecordModel, filename: string, options: FileOptions = {}): string {\n const queryParams: Record<string, string> = {}\n\n if (options.thumb) {\n queryParams['thumb'] = options.thumb\n }\n if (options.token) {\n queryParams['token'] = options.token\n }\n if (options.download) {\n queryParams['download'] = '1'\n }\n\n return this.pb.files.getURL(record, filename, queryParams)\n }\n\n /**\n * Generate a temporary file access token.\n *\n * Use this for accessing protected files. Tokens are short-lived.\n */\n async getFileToken(): Promise<string> {\n return this.pb.files.getToken()\n }\n}\n","import type PocketBase from 'pocketbase'\nimport type { CollectionModel } from './types' // Assuming types are updated\n\nexport class PicoBaseAdmin {\n private pb: PocketBase\n\n constructor(pb: PocketBase) {\n this.pb = pb\n }\n\n /**\n * Fetch a list of all collections.\n */\n async listCollections(): Promise<CollectionModel[]> {\n const result = await this.pb.send<{ items: CollectionModel[] }>('/api/collections', {\n method: 'GET',\n })\n return result.items || []\n }\n\n /**\n * Fetch a single collection by ID or name.\n */\n async getCollection(idOrName: string): Promise<CollectionModel> {\n return this.pb.send<CollectionModel>(`/api/collections/${idOrName}`, {\n method: 'GET',\n })\n }\n\n /**\n * Create a new collection.\n */\n async createCollection(data: Partial<CollectionModel>): Promise<CollectionModel> {\n return this.pb.send<CollectionModel>('/api/collections', {\n method: 'POST',\n body: data,\n })\n }\n\n /**\n * Update an existing collection.\n */\n async updateCollection(idOrName: string, data: Partial<CollectionModel>): Promise<CollectionModel> {\n return this.pb.send<CollectionModel>(`/api/collections/${idOrName}`, {\n method: 'PATCH',\n body: data,\n })\n }\n\n /**\n * Delete a collection.\n */\n async deleteCollection(idOrName: string): Promise<boolean> {\n try {\n await this.pb.send(`/api/collections/${idOrName}`, {\n method: 'DELETE',\n })\n return true\n } catch (e) {\n return false\n }\n }\n}\n","/**\n * Base error class for all PicoBase SDK errors.\n *\n * Every error includes a `code` for programmatic handling and a `fix`\n * suggestion so developers can resolve issues without digging through docs.\n */\nexport class PicoBaseError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly status?: number,\n public readonly details?: unknown,\n /** Actionable suggestion for how to fix this error. */\n public readonly fix?: string,\n ) {\n super(message)\n this.name = 'PicoBaseError'\n }\n\n /** Formatted error string including fix suggestion. */\n toString(): string {\n let s = `${this.name} [${this.code}]: ${this.message}`\n if (this.fix) s += `\\n Fix: ${this.fix}`\n return s\n }\n}\n\n/**\n * Thrown when the instance is not running and cold-start retries are exhausted.\n */\nexport class InstanceUnavailableError extends PicoBaseError {\n constructor(message = 'Instance is not available. It may be stopped or starting up.') {\n super(\n message,\n 'INSTANCE_UNAVAILABLE',\n 503,\n undefined,\n 'Check your instance status in the PicoBase dashboard, or wait a few seconds and retry. ' +\n 'If this persists, your instance may have been stopped — restart it with `picobase status`.',\n )\n this.name = 'InstanceUnavailableError'\n }\n}\n\n/**\n * Thrown when an API key is invalid or missing.\n */\nexport class AuthorizationError extends PicoBaseError {\n constructor(message = 'Invalid or missing API key.') {\n super(\n message,\n 'UNAUTHORIZED',\n 401,\n undefined,\n 'Make sure PICOBASE_API_KEY is set in your .env file and matches a valid key from your dashboard. ' +\n 'Keys start with \"pbk_\". You can generate a new key at https://picobase.com/dashboard.',\n )\n this.name = 'AuthorizationError'\n }\n}\n\n/**\n * Thrown when a collection is not found.\n */\nexport class CollectionNotFoundError extends PicoBaseError {\n constructor(collectionName: string) {\n super(\n `Collection \"${collectionName}\" not found.`,\n 'COLLECTION_NOT_FOUND',\n 404,\n { collection: collectionName },\n `Make sure the collection \"${collectionName}\" exists in your PicoBase instance. ` +\n 'Collections are auto-created when you first write data, or you can create them ' +\n 'manually in the PicoBase dashboard under Collections.',\n )\n this.name = 'CollectionNotFoundError'\n }\n}\n\n/**\n * Thrown when a record is not found.\n */\nexport class RecordNotFoundError extends PicoBaseError {\n constructor(collectionName: string, recordId: string) {\n super(\n `Record \"${recordId}\" not found in collection \"${collectionName}\".`,\n 'RECORD_NOT_FOUND',\n 404,\n { collection: collectionName, recordId },\n 'Check that the record ID is correct. IDs are 15-character alphanumeric strings (e.g., \"abc123def456789\").',\n )\n this.name = 'RecordNotFoundError'\n }\n}\n\n/**\n * Thrown when a PocketBase API request fails.\n */\nexport class RequestError extends PicoBaseError {\n constructor(message: string, status: number, details?: unknown) {\n const fix = requestErrorFix(status, message)\n super(message, 'REQUEST_FAILED', status, details, fix)\n this.name = 'RequestError'\n }\n}\n\n/**\n * Thrown when the SDK is misconfigured (bad URL, missing params, etc.).\n */\nexport class ConfigurationError extends PicoBaseError {\n constructor(message: string, fix: string) {\n super(message, 'CONFIGURATION_ERROR', undefined, undefined, fix)\n this.name = 'ConfigurationError'\n }\n}\n\n/**\n * Thrown when an RPC (remote procedure call) fails.\n */\nexport class RpcError extends PicoBaseError {\n constructor(functionName: string, status: number, details?: unknown) {\n const fix = rpcErrorFix(functionName, status)\n super(\n `RPC function \"${functionName}\" failed.`,\n 'RPC_ERROR',\n status,\n details,\n fix,\n )\n this.name = 'RpcError'\n }\n}\n\n/** Generate fix suggestions for RPC errors. */\nfunction rpcErrorFix(functionName: string, status: number): string {\n if (status === 404) {\n return `The RPC endpoint \"/api/rpc/${functionName}\" does not exist. ` +\n 'Create a custom route in your PocketBase instance to handle this RPC call. ' +\n 'See: https://pocketbase.io/docs/js-routing/'\n }\n if (status === 400) {\n return 'Check the parameters you are passing to this RPC function. ' +\n 'The function may be expecting different parameters or types.'\n }\n if (status === 403) {\n return 'You don\\'t have permission to call this RPC function. ' +\n 'Check the authentication requirements for this endpoint in your PocketBase routes.'\n }\n return 'Check your PicoBase instance logs for details about this RPC error. ' +\n 'Ensure the custom route is correctly implemented in your PocketBase setup.'\n}\n\n/** Map common HTTP statuses to actionable fixes. */\nfunction requestErrorFix(status: number, message: string): string {\n switch (status) {\n case 400:\n return 'Check the data you are sending — a required field may be missing or have the wrong type. ' +\n 'Run `picobase typegen` to regenerate types and check your field names.'\n case 403:\n return 'You don\\'t have permission for this action. Check your collection API rules in the dashboard. ' +\n 'By default, only authenticated users can read/write records.'\n case 404:\n if (message.toLowerCase().includes('collection'))\n return 'This collection does not exist yet. Write a record to auto-create it, or create it in the dashboard.'\n return 'The requested resource was not found. Double-check IDs and collection names.'\n case 413:\n return 'The request payload is too large. Check file upload size limits in your instance settings.'\n case 429:\n return 'Too many requests. Add a short delay between requests or implement client-side caching.'\n default:\n return 'If this error persists, check your PicoBase dashboard for instance health and logs.'\n }\n}\n","import PocketBase from 'pocketbase'\nimport { PicoBaseAuth } from './auth'\nimport { PicoBaseCollection } from './collection'\nimport { PicoBaseRealtime } from './realtime'\nimport { PicoBaseStorage } from './storage'\nimport { PicoBaseAdmin } from './admin'\nimport { InstanceUnavailableError, AuthorizationError, CollectionNotFoundError, RecordNotFoundError, ConfigurationError, RpcError } from './errors'\nimport type { PicoBaseClientOptions, RecordModel, SendOptions } from './types'\n\nconst DEFAULT_OPTIONS: Required<Omit<PicoBaseClientOptions, 'fetch'>> & { fetch?: typeof globalThis.fetch } = {\n timeout: 30_000,\n maxColdStartRetries: 3,\n lang: 'en-US',\n}\n\nexport class PicoBaseClient {\n /** The underlying PocketBase SDK instance. Exposed for advanced usage. */\n readonly pb: PocketBase\n /** Auth module — sign up, sign in, OAuth, session management. */\n readonly auth: PicoBaseAuth\n /** Realtime module — subscribe to record changes. */\n readonly realtime: PicoBaseRealtime\n /** Storage module — get file URLs and tokens. */\n readonly storage: PicoBaseStorage\n /** Admin module — manage collections (requires admin API key). */\n readonly admin: PicoBaseAdmin\n\n private readonly apiKey: string\n private readonly options: typeof DEFAULT_OPTIONS\n\n constructor(url: string, apiKey: string, options: PicoBaseClientOptions = {}) {\n // Validate inputs with clear messages\n if (!url) {\n throw new ConfigurationError(\n 'PicoBase URL is required.',\n 'Pass the URL as the first argument: createClient(\"https://myapp.picobase.com\", \"pbk_...\") ' +\n 'or set PICOBASE_URL in your .env file.',\n )\n }\n if (!apiKey) {\n throw new ConfigurationError(\n 'PicoBase API key is required.',\n 'Pass the API key as the second argument: createClient(\"https://...\", \"pbk_your_key\") ' +\n 'or set PICOBASE_API_KEY in your .env file. Get a key from your dashboard.',\n )\n }\n if (!url.startsWith('http://') && !url.startsWith('https://')) {\n throw new ConfigurationError(\n `Invalid URL: \"${url}\". Must start with http:// or https://.`,\n `Use the full URL: createClient(\"https://${url}\", \"...\")`,\n )\n }\n\n this.apiKey = apiKey\n this.options = { ...DEFAULT_OPTIONS, ...options }\n\n // Normalize URL — strip trailing slash\n const baseUrl = url.replace(/\\/+$/, '')\n\n this.pb = new PocketBase(baseUrl)\n this.pb.autoCancellation(false)\n\n if (this.options.lang) {\n this.pb.lang = this.options.lang\n }\n\n // Inject API key header into every request via beforeSend hook\n this.pb.beforeSend = (url, reqInit) => {\n const headers = reqInit.headers as Record<string, string> ?? {}\n headers['X-PicoBase-Key'] = this.apiKey\n reqInit.headers = headers\n return { url, options: reqInit }\n }\n\n // Wrap the send method for cold-start retry logic\n this._wrapSendWithRetry()\n\n // Initialize modules\n this.auth = new PicoBaseAuth(this.pb)\n this.realtime = new PicoBaseRealtime(this.pb)\n this.storage = new PicoBaseStorage(this.pb)\n this.admin = new PicoBaseAdmin(this.pb)\n }\n\n /**\n * Access a collection for CRUD operations.\n *\n * @example\n * ```ts\n * const posts = await pb.collection('posts').getList(1, 20)\n * ```\n */\n collection<T = RecordModel>(name: string): PicoBaseCollection<T> {\n return new PicoBaseCollection<T>(this.pb, name)\n }\n\n /**\n * Call a server-side function (PocketBase custom API endpoint).\n * Proxies to PocketBase's send() method.\n */\n async send<T = unknown>(path: string, options?: SendOptions): Promise<T> {\n return this.pb.send<T>(path, options ?? {})\n }\n\n /**\n * Call a remote procedure (RPC) - a convenience method for calling custom API endpoints.\n *\n * Maps Supabase-style RPC calls to PicoBase custom endpoints:\n * - `pb.rpc('my_function', params)` → `POST /api/rpc/my_function` with params as body\n *\n * @example\n * ```ts\n * // Simple RPC call\n * const result = await pb.rpc('calculate_total', { cart_id: '123' })\n *\n * // Complex RPC with typed response\n * interface DashboardStats {\n * posts: number\n * comments: number\n * followers: number\n * }\n * const stats = await pb.rpc<DashboardStats>('get_dashboard_stats', {\n * user_id: currentUser.id\n * })\n * ```\n *\n * @param functionName The name of the RPC function to call\n * @param params Optional parameters to pass to the function\n * @returns The function result\n */\n async rpc<T = unknown>(functionName: string, params?: Record<string, unknown>): Promise<T> {\n try {\n return await this.send<T>(`/api/rpc/${functionName}`, {\n method: 'POST',\n body: params ?? {},\n })\n } catch (err: unknown) {\n // Wrap errors with RpcError for better error messages\n const status = (err as { status?: number })?.status ?? 500\n const details = (err as { data?: unknown })?.data\n throw new RpcError(functionName, status, details)\n }\n }\n\n /**\n * Get the current auth token (if signed in), or empty string.\n */\n get token(): string {\n return this.pb.authStore.token\n }\n\n /**\n * Check if a user is currently authenticated.\n */\n get isAuthenticated(): boolean {\n return this.pb.authStore.isValid\n }\n\n /**\n * Monkey-patch pb.send to retry on 503 (cold start).\n *\n * When an instance is stopped or starting, the proxy returns 503.\n * The SDK automatically retries with exponential backoff so the developer\n * doesn't have to handle cold-start logic.\n */\n private _wrapSendWithRetry(): void {\n const originalSend = this.pb.send.bind(this.pb)\n const maxRetries = this.options.maxColdStartRetries\n\n this.pb.send = async <T>(path: string, options: SendOptions): Promise<T> => {\n let lastError: unknown\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await originalSend<T>(path, options)\n } catch (err: unknown) {\n lastError = err\n\n // Check if this is a 503 (instance starting up)\n const status = (err as { status?: number })?.status\n if (status === 503 && attempt < maxRetries) {\n // Exponential backoff: 2s, 4s, 8s\n const delay = Math.pow(2, attempt + 1) * 1000\n await new Promise(resolve => setTimeout(resolve, delay))\n continue\n }\n\n // Check if this is a 401 from our gateway (bad API key)\n if (status === 401) {\n const data = (err as { data?: { code?: string } })?.data\n if (data?.code === 'INVALID_API_KEY') {\n throw new AuthorizationError()\n }\n }\n\n // Detect collection-not-found for a clearer message\n if (status === 404) {\n const msg = (err as { message?: string })?.message ?? ''\n if (msg.toLowerCase().includes('missing collection') || msg.toLowerCase().includes('not found collection')) {\n const match = msg.match(/[\"']([^\"']+)[\"']/)\n throw new CollectionNotFoundError(match?.[1] ?? 'unknown')\n }\n }\n\n throw err\n }\n }\n\n throw new InstanceUnavailableError(\n `Instance unavailable after ${maxRetries} retries. ` +\n `Original error: ${lastError instanceof Error ? lastError.message : String(lastError)}`\n )\n }\n }\n}\n\n/**\n * Create a new PicoBase client.\n *\n * Can be called with explicit URL and API key, or with zero arguments to\n * auto-detect from environment variables (`PICOBASE_URL` / `NEXT_PUBLIC_PICOBASE_URL`\n * and `PICOBASE_API_KEY` / `NEXT_PUBLIC_PICOBASE_API_KEY`).\n *\n * @example\n * ```ts\n * import { createClient } from '@picobase_app/client'\n *\n * // Zero-config — reads from env vars\n * const pb = createClient()\n *\n * // Or explicit\n * const pb = createClient('https://myapp.picobase.com', 'pbk_abc123_secret')\n *\n * // Sign up a user\n * const user = await pb.auth.signUp({\n * email: 'user@example.com',\n * password: 'securepassword',\n * })\n *\n * // Query records\n * const posts = await pb.collection('posts').getList(1, 20, {\n * filter: 'published = true',\n * sort: '-created',\n * })\n * ```\n */\nexport function createClient(options?: PicoBaseClientOptions): PicoBaseClient\nexport function createClient(url: string, apiKey: string, options?: PicoBaseClientOptions): PicoBaseClient\nexport function createClient(\n urlOrOptions?: string | PicoBaseClientOptions,\n apiKeyOrUndefined?: string,\n options?: PicoBaseClientOptions,\n): PicoBaseClient {\n // Zero-arg / options-only: read from env\n if (typeof urlOrOptions !== 'string') {\n const env = typeof process !== 'undefined' ? process.env : {} as Record<string, string | undefined>\n const url = env.PICOBASE_URL || env.NEXT_PUBLIC_PICOBASE_URL\n const apiKey = env.PICOBASE_API_KEY || env.NEXT_PUBLIC_PICOBASE_API_KEY\n\n if (!url || !apiKey) {\n const missing = [\n !url && 'PICOBASE_URL (or NEXT_PUBLIC_PICOBASE_URL)',\n !apiKey && 'PICOBASE_API_KEY (or NEXT_PUBLIC_PICOBASE_API_KEY)',\n ].filter(Boolean).join(' and ')\n\n throw new ConfigurationError(\n `Missing environment variable${!url && !apiKey ? 's' : ''}: ${missing}`,\n 'Add them to your .env.local file:\\n\\n' +\n ' PICOBASE_URL=https://your-app.picobase.com\\n' +\n ' PICOBASE_API_KEY=pbk_your_key_here\\n\\n' +\n 'Or for Next.js (client-side access), prefix with NEXT_PUBLIC_:\\n\\n' +\n ' NEXT_PUBLIC_PICOBASE_URL=https://your-app.picobase.com\\n' +\n ' NEXT_PUBLIC_PICOBASE_API_KEY=pbk_your_key_here\\n\\n' +\n 'Get your URL and API key from: https://picobase.com/dashboard\\n' +\n 'Or run: picobase init',\n )\n }\n\n return new PicoBaseClient(url, apiKey, urlOrOptions)\n }\n\n return new PicoBaseClient(urlOrOptions, apiKeyOrUndefined!, options)\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/auth.ts","../src/collection.ts","../src/realtime.ts","../src/storage.ts","../src/admin.ts","../src/errors.ts","../src/client.ts"],"names":["PocketBase","url"],"mappings":"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","file":"index.js","sourcesContent":["import type PocketBase from 'pocketbase'\nimport type {\n AuthResponse,\n AuthStateChangeCallback,\n AuthEvent,\n SignUpOptions,\n SignInOptions,\n OAuthSignInOptions,\n RecordModel,\n} from './types'\n\n/**\n * Auth module — handles user sign-up, sign-in, OAuth, and session management.\n *\n * PicoBase uses PocketBase's built-in `users` collection for auth. Each\n * instance has its own isolated user pool.\n *\n * @example\n * ```ts\n * // Sign up\n * const { token, record } = await pb.auth.signUp({\n * email: 'user@example.com',\n * password: 'securepassword',\n * })\n *\n * // Sign in\n * const { token, record } = await pb.auth.signIn({\n * email: 'user@example.com',\n * password: 'securepassword',\n * })\n *\n * // Listen to auth changes\n * pb.auth.onStateChange((event, record) => {\n * console.log(event, record)\n * })\n * ```\n */\nexport class PicoBaseAuth {\n private pb: PocketBase\n private listeners: Set<AuthStateChangeCallback> = new Set()\n private _collection: string = 'users'\n\n constructor(pb: PocketBase) {\n this.pb = pb\n\n // Listen to PocketBase auth store changes and re-emit\n this.pb.authStore.onChange((token) => {\n const record = this.pb.authStore.record ?? null\n const event: AuthEvent = token ? 'SIGNED_IN' : 'SIGNED_OUT'\n this._notify(event, record)\n })\n }\n\n /**\n * Set which collection to authenticate against.\n * Defaults to 'users'. Use this if you have a custom auth collection.\n */\n setCollection(name: string): this {\n this._collection = name\n return this\n }\n\n /**\n * Create a new user account.\n */\n async signUp(options: SignUpOptions): Promise<AuthResponse> {\n const { email, password, passwordConfirm, ...rest } = options\n\n const record = await this.pb.collection(this._collection).create<RecordModel>({\n email,\n password,\n passwordConfirm: passwordConfirm ?? password,\n ...rest,\n })\n\n // Automatically sign in after sign-up\n const authResult = await this.pb\n .collection(this._collection)\n .authWithPassword<RecordModel>(email, password)\n\n return {\n token: authResult.token,\n record: authResult.record,\n }\n }\n\n /**\n * Sign in with email and password.\n */\n async signIn(options: SignInOptions): Promise<AuthResponse> {\n const result = await this.pb\n .collection(this._collection)\n .authWithPassword<RecordModel>(options.email, options.password)\n\n return {\n token: result.token,\n record: result.record,\n }\n }\n\n /**\n * Sign in with an OAuth2 provider (Google, GitHub, etc.).\n *\n * In browser environments this opens a popup/redirect to the provider.\n * Configure providers in your PicoBase dashboard.\n */\n async signInWithOAuth(options: OAuthSignInOptions): Promise<AuthResponse> {\n const result = await this.pb.collection(this._collection).authWithOAuth2({\n provider: options.provider,\n scopes: options.scopes,\n createData: options.createData,\n urlCallback: options.urlCallback,\n })\n\n return {\n token: result.token,\n record: result.record,\n }\n }\n\n /**\n * Refresh the current auth token.\n */\n async refreshToken(): Promise<AuthResponse> {\n const result = await this.pb.collection(this._collection).authRefresh<RecordModel>()\n this._notify('TOKEN_REFRESHED', result.record)\n return {\n token: result.token,\n record: result.record,\n }\n }\n\n /**\n * Send a password reset email.\n */\n async requestPasswordReset(email: string): Promise<void> {\n await this.pb.collection(this._collection).requestPasswordReset(email)\n }\n\n /**\n * Confirm a password reset with the token from the reset email.\n */\n async confirmPasswordReset(\n token: string,\n password: string,\n passwordConfirm?: string,\n ): Promise<void> {\n await this.pb\n .collection(this._collection)\n .confirmPasswordReset(token, password, passwordConfirm ?? password)\n }\n\n /**\n * Send an email verification email.\n */\n async requestVerification(email: string): Promise<void> {\n await this.pb.collection(this._collection).requestVerification(email)\n }\n\n /**\n * Confirm email verification with the token from the verification email.\n */\n async confirmVerification(token: string): Promise<void> {\n await this.pb.collection(this._collection).confirmVerification(token)\n }\n\n /**\n * Sign out the current user. Clears the local auth store.\n */\n signOut(): void {\n this.pb.authStore.clear()\n }\n\n /**\n * Get the currently authenticated user record, or `null` if not signed in.\n */\n get user(): RecordModel | null {\n return this.pb.authStore.record\n }\n\n /**\n * Get the current auth token, or empty string if not signed in.\n */\n get token(): string {\n return this.pb.authStore.token\n }\n\n /**\n * Check if the current auth session is valid (token exists and not expired).\n */\n get isValid(): boolean {\n return this.pb.authStore.isValid\n }\n\n /**\n * Listen to auth state changes. Returns an unsubscribe function.\n *\n * @example\n * ```ts\n * const unsubscribe = pb.auth.onStateChange((event, record) => {\n * if (event === 'SIGNED_IN') {\n * console.log('Welcome', record.email)\n * }\n * })\n *\n * // Later:\n * unsubscribe()\n * ```\n */\n onStateChange(callback: AuthStateChangeCallback): () => void {\n this.listeners.add(callback)\n return () => {\n this.listeners.delete(callback)\n }\n }\n\n private _notify(event: AuthEvent, record: RecordModel | null): void {\n for (const cb of this.listeners) {\n try {\n cb(event, record)\n } catch {\n // Don't let one listener crash others\n }\n }\n }\n}\n","import type PocketBase from 'pocketbase'\nimport type { RecordModel, ListResult } from 'pocketbase'\n\n/** Options for list queries. */\nexport interface ListOptions {\n sort?: string\n filter?: string\n expand?: string\n fields?: string\n skipTotal?: boolean\n [key: string]: unknown\n}\n\n/** Options for single record queries. */\nexport interface RecordQueryOptions {\n expand?: string\n fields?: string\n [key: string]: unknown\n}\n\n/**\n * Collection module — CRUD operations on a PocketBase collection.\n *\n * @example\n * ```ts\n * const posts = pb.collection('posts')\n *\n * // List with filtering, sorting, and pagination\n * const result = await posts.getList(1, 20, {\n * filter: 'published = true',\n * sort: '-created',\n * expand: 'author',\n * })\n *\n * // Get a single record\n * const post = await posts.getOne('record_id')\n *\n * // Create a record\n * const newPost = await posts.create({\n * title: 'Hello World',\n * content: 'My first post',\n * })\n *\n * // Update a record\n * const updated = await posts.update('record_id', { title: 'Updated' })\n *\n * // Delete a record\n * await posts.delete('record_id')\n * ```\n */\nexport class PicoBaseCollection<T = RecordModel> {\n private pb: PocketBase\n private name: string\n\n constructor(pb: PocketBase, name: string) {\n this.pb = pb\n this.name = name\n }\n\n /**\n * Fetch a paginated list of records.\n *\n * @param page - Page number (1-indexed). Default: 1.\n * @param perPage - Records per page. Default: 30.\n * @param options - Filter, sort, expand, fields.\n */\n async getList(page = 1, perPage = 30, options: ListOptions = {}): Promise<ListResult<T>> {\n return this.pb.collection(this.name).getList<T>(page, perPage, options)\n }\n\n /**\n * Fetch all records matching the filter (auto-paginates).\n *\n * **Warning:** Use with caution on large collections. Prefer `getList()` with pagination.\n */\n async getFullList(options: ListOptions = {}): Promise<T[]> {\n return this.pb.collection(this.name).getFullList<T>(options)\n }\n\n /**\n * Fetch a single record by ID.\n */\n async getOne(id: string, options: RecordQueryOptions = {}): Promise<T> {\n return this.pb.collection(this.name).getOne<T>(id, options)\n }\n\n /**\n * Fetch the first record matching a filter.\n *\n * @example\n * ```ts\n * const admin = await pb.collection('users').getFirstListItem('role = \"admin\"')\n * ```\n */\n async getFirstListItem(filter: string, options: RecordQueryOptions = {}): Promise<T> {\n return this.pb.collection(this.name).getFirstListItem<T>(filter, options)\n }\n\n /**\n * Create a new record.\n *\n * @param data - Record data. Can be a plain object or `FormData` (for file uploads).\n */\n async create(data: Record<string, unknown> | FormData, options: RecordQueryOptions = {}): Promise<T> {\n return this.pb.collection(this.name).create<T>(data, options)\n }\n\n /**\n * Update an existing record.\n *\n * @param id - Record ID.\n * @param data - Fields to update. Can be a plain object or `FormData`.\n */\n async update(id: string, data: Record<string, unknown> | FormData, options: RecordQueryOptions = {}): Promise<T> {\n return this.pb.collection(this.name).update<T>(id, data, options)\n }\n\n /**\n * Delete a record by ID.\n */\n async delete(id: string): Promise<boolean> {\n return this.pb.collection(this.name).delete(id)\n }\n\n /**\n * Subscribe to realtime changes on this collection.\n *\n * @param callback - Called on every create/update/delete event.\n * @param filter - Optional: only receive events matching this filter.\n * @returns Unsubscribe function.\n *\n * @example\n * ```ts\n * const unsubscribe = await pb.collection('posts').subscribe((e) => {\n * console.log(e.action, e.record)\n * })\n *\n * // Later:\n * await unsubscribe()\n * ```\n */\n async subscribe(\n callback: (data: { action: string; record: T }) => void,\n filter?: string,\n ): Promise<() => Promise<void>> {\n const topic = '*'\n await this.pb.collection(this.name).subscribe<T>(topic, callback, filter ? { filter } : undefined)\n return () => this.pb.collection(this.name).unsubscribe(topic)\n }\n\n /**\n * Subscribe to changes on a specific record.\n *\n * @param id - Record ID.\n * @param callback - Called on update/delete events.\n * @returns Unsubscribe function.\n */\n async subscribeOne(\n id: string,\n callback: (data: { action: string; record: T }) => void,\n ): Promise<() => Promise<void>> {\n await this.pb.collection(this.name).subscribe<T>(id, callback)\n return () => this.pb.collection(this.name).unsubscribe(id)\n }\n}\n","import type PocketBase from 'pocketbase'\nimport type { RecordModel, RecordSubscription } from './types'\n\n/**\n * Realtime module — manage global realtime subscriptions.\n *\n * For collection-level subscriptions, prefer `pb.collection('name').subscribe()`.\n * This module is for lower-level control over the SSE connection.\n *\n * @example\n * ```ts\n * // Subscribe to all changes on a collection\n * const unsub = await pb.realtime.subscribe('posts', (e) => {\n * console.log(e.action, e.record)\n * })\n *\n * // Unsubscribe\n * await unsub()\n *\n * // Disconnect all realtime connections\n * pb.realtime.disconnect()\n * ```\n */\nexport class PicoBaseRealtime {\n private pb: PocketBase\n\n constructor(pb: PocketBase) {\n this.pb = pb\n }\n\n /**\n * Subscribe to realtime events on a collection.\n *\n * @param collection - Collection name (e.g. 'posts').\n * @param callback - Called on every create/update/delete event.\n * @returns Unsubscribe function.\n */\n async subscribe<T = RecordModel>(\n collection: string,\n callback: (data: RecordSubscription<T>) => void,\n ): Promise<() => Promise<void>> {\n await this.pb.collection(collection).subscribe<T>('*', callback)\n return () => this.pb.collection(collection).unsubscribe('*')\n }\n\n /**\n * Subscribe to realtime events on a specific record.\n *\n * @param collection - Collection name.\n * @param recordId - Record ID.\n * @param callback - Called on update/delete events.\n * @returns Unsubscribe function.\n */\n async subscribeRecord<T = RecordModel>(\n collection: string,\n recordId: string,\n callback: (data: RecordSubscription<T>) => void,\n ): Promise<() => Promise<void>> {\n await this.pb.collection(collection).subscribe<T>(recordId, callback)\n return () => this.pb.collection(collection).unsubscribe(recordId)\n }\n\n /**\n * Unsubscribe from all realtime events on a collection.\n */\n async unsubscribe(collection: string): Promise<void> {\n await this.pb.collection(collection).unsubscribe()\n }\n\n /**\n * Unsubscribe from ALL realtime events. The SSE connection will be\n * automatically closed when there are no remaining subscriptions.\n */\n async disconnectAll(): Promise<void> {\n await this.pb.realtime.unsubscribe()\n }\n}\n","import type PocketBase from 'pocketbase'\nimport type { RecordModel, FileOptions } from './types'\n\n/**\n * Storage module — work with file fields on PocketBase records.\n *\n * PocketBase stores files as record fields. This module provides helpers\n * to get file URLs and generate access tokens for protected files.\n *\n * @example\n * ```ts\n * const user = await pb.collection('users').getOne('user_id')\n *\n * // Get the URL for the user's avatar\n * const avatarUrl = pb.storage.getFileUrl(user, 'avatar.jpg')\n *\n * // Get a thumbnail URL (100x100)\n * const thumbUrl = pb.storage.getFileUrl(user, 'avatar.jpg', {\n * thumb: '100x100',\n * })\n *\n * // Get a temporary token for protected files\n * const token = await pb.storage.getFileToken()\n * const protectedUrl = pb.storage.getFileUrl(user, 'document.pdf', { token })\n * ```\n */\nexport class PicoBaseStorage {\n private pb: PocketBase\n\n constructor(pb: PocketBase) {\n this.pb = pb\n }\n\n /**\n * Get the public URL for a file attached to a record.\n *\n * @param record - The record that owns the file.\n * @param filename - The filename (as stored in the record's file field).\n * @param options - Optional: thumb size, token for protected files, download flag.\n */\n getFileUrl(record: RecordModel, filename: string, options: FileOptions = {}): string {\n const queryParams: Record<string, string> = {}\n\n if (options.thumb) {\n queryParams['thumb'] = options.thumb\n }\n if (options.token) {\n queryParams['token'] = options.token\n }\n if (options.download) {\n queryParams['download'] = '1'\n }\n\n return this.pb.files.getURL(record, filename, queryParams)\n }\n\n /**\n * Generate a temporary file access token.\n *\n * Use this for accessing protected files. Tokens are short-lived.\n */\n async getFileToken(): Promise<string> {\n return this.pb.files.getToken()\n }\n}\n","import type PocketBase from 'pocketbase'\nimport type { CollectionModel } from './types' // Assuming types are updated\n\nexport class PicoBaseAdmin {\n private pb: PocketBase\n\n constructor(pb: PocketBase) {\n this.pb = pb\n }\n\n /**\n * Fetch a list of all collections.\n */\n async listCollections(): Promise<CollectionModel[]> {\n const result = await this.pb.send<{ items: CollectionModel[] }>('/api/collections', {\n method: 'GET',\n })\n return result.items || []\n }\n\n /**\n * Fetch a single collection by ID or name.\n */\n async getCollection(idOrName: string): Promise<CollectionModel> {\n return this.pb.send<CollectionModel>(`/api/collections/${idOrName}`, {\n method: 'GET',\n })\n }\n\n /**\n * Create a new collection.\n */\n async createCollection(data: Partial<CollectionModel>): Promise<CollectionModel> {\n return this.pb.send<CollectionModel>('/api/collections', {\n method: 'POST',\n body: data,\n })\n }\n\n /**\n * Update an existing collection.\n */\n async updateCollection(idOrName: string, data: Partial<CollectionModel>): Promise<CollectionModel> {\n return this.pb.send<CollectionModel>(`/api/collections/${idOrName}`, {\n method: 'PATCH',\n body: data,\n })\n }\n\n /**\n * Delete a collection.\n */\n async deleteCollection(idOrName: string): Promise<boolean> {\n try {\n await this.pb.send(`/api/collections/${idOrName}`, {\n method: 'DELETE',\n })\n return true\n } catch (e) {\n return false\n }\n }\n}\n","/**\n * Base error class for all PicoBase SDK errors.\n *\n * Every error includes a `code` for programmatic handling and a `fix`\n * suggestion so developers can resolve issues without digging through docs.\n */\nexport class PicoBaseError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly status?: number,\n public readonly details?: unknown,\n /** Actionable suggestion for how to fix this error. */\n public readonly fix?: string,\n ) {\n super(message)\n this.name = 'PicoBaseError'\n }\n\n /** Formatted error string including fix suggestion. */\n toString(): string {\n let s = `${this.name} [${this.code}]: ${this.message}`\n if (this.fix) s += `\\n Fix: ${this.fix}`\n return s\n }\n}\n\n/**\n * Thrown when the instance is not running and cold-start retries are exhausted.\n */\nexport class InstanceUnavailableError extends PicoBaseError {\n constructor(message = 'Instance is not available. It may be stopped or starting up.') {\n super(\n message,\n 'INSTANCE_UNAVAILABLE',\n 503,\n undefined,\n 'Check your instance status in the PicoBase dashboard, or wait a few seconds and retry. ' +\n 'If this persists, your instance may have been stopped — restart it with `picobase status`.',\n )\n this.name = 'InstanceUnavailableError'\n }\n}\n\n/**\n * Thrown when an API key is invalid or missing.\n */\nexport class AuthorizationError extends PicoBaseError {\n constructor(message = 'Invalid or missing API key.') {\n super(\n message,\n 'UNAUTHORIZED',\n 401,\n undefined,\n 'Make sure PICOBASE_API_KEY is set in your .env file and matches a valid key from your dashboard. ' +\n 'Keys start with \"pbk_\". You can generate a new key at https://picobase.com/dashboard.',\n )\n this.name = 'AuthorizationError'\n }\n}\n\n/**\n * Thrown when a collection is not found.\n */\nexport class CollectionNotFoundError extends PicoBaseError {\n constructor(collectionName: string) {\n super(\n `Collection \"${collectionName}\" not found.`,\n 'COLLECTION_NOT_FOUND',\n 404,\n { collection: collectionName },\n `Make sure the collection \"${collectionName}\" exists in your PicoBase instance. ` +\n 'Collections are auto-created when you first write data, or you can create them ' +\n 'manually in the PicoBase dashboard under Collections.',\n )\n this.name = 'CollectionNotFoundError'\n }\n}\n\n/**\n * Thrown when a record is not found.\n */\nexport class RecordNotFoundError extends PicoBaseError {\n constructor(collectionName: string, recordId: string) {\n super(\n `Record \"${recordId}\" not found in collection \"${collectionName}\".`,\n 'RECORD_NOT_FOUND',\n 404,\n { collection: collectionName, recordId },\n 'Check that the record ID is correct. IDs are 15-character alphanumeric strings (e.g., \"abc123def456789\").',\n )\n this.name = 'RecordNotFoundError'\n }\n}\n\n/**\n * Thrown when a PocketBase API request fails.\n */\nexport class RequestError extends PicoBaseError {\n constructor(message: string, status: number, details?: unknown) {\n const fix = requestErrorFix(status, message)\n super(message, 'REQUEST_FAILED', status, details, fix)\n this.name = 'RequestError'\n }\n}\n\n/**\n * Thrown when the SDK is misconfigured (bad URL, missing params, etc.).\n */\nexport class ConfigurationError extends PicoBaseError {\n constructor(message: string, fix: string) {\n super(message, 'CONFIGURATION_ERROR', undefined, undefined, fix)\n this.name = 'ConfigurationError'\n }\n}\n\n/**\n * Thrown when an RPC (remote procedure call) fails.\n */\nexport class RpcError extends PicoBaseError {\n constructor(functionName: string, status: number, details?: unknown) {\n const fix = rpcErrorFix(functionName, status)\n super(\n `RPC function \"${functionName}\" failed.`,\n 'RPC_ERROR',\n status,\n details,\n fix,\n )\n this.name = 'RpcError'\n }\n}\n\n/** Generate fix suggestions for RPC errors. */\nfunction rpcErrorFix(functionName: string, status: number): string {\n if (status === 404) {\n return `The RPC endpoint \"/api/rpc/${functionName}\" does not exist. ` +\n 'Create a custom route in your PocketBase instance to handle this RPC call. ' +\n 'See: https://pocketbase.io/docs/js-routing/'\n }\n if (status === 400) {\n return 'Check the parameters you are passing to this RPC function. ' +\n 'The function may be expecting different parameters or types.'\n }\n if (status === 403) {\n return 'You don\\'t have permission to call this RPC function. ' +\n 'Check the authentication requirements for this endpoint in your PocketBase routes.'\n }\n return 'Check your PicoBase instance logs for details about this RPC error. ' +\n 'Ensure the custom route is correctly implemented in your PocketBase setup.'\n}\n\n/** Map common HTTP statuses to actionable fixes. */\nfunction requestErrorFix(status: number, message: string): string {\n switch (status) {\n case 400:\n return 'Check the data you are sending — a required field may be missing or have the wrong type. ' +\n 'Run `picobase typegen` to regenerate types and check your field names.'\n case 403:\n return 'You don\\'t have permission for this action. Check your collection API rules in the dashboard. ' +\n 'By default, only authenticated users can read/write records.'\n case 404:\n if (message.toLowerCase().includes('collection'))\n return 'This collection does not exist yet. Write a record to auto-create it, or create it in the dashboard.'\n return 'The requested resource was not found. Double-check IDs and collection names.'\n case 413:\n return 'The request payload is too large. Check file upload size limits in your instance settings.'\n case 429:\n return 'Too many requests. Add a short delay between requests or implement client-side caching.'\n default:\n return 'If this error persists, check your PicoBase dashboard for instance health and logs.'\n }\n}\n","import PocketBase from 'pocketbase'\nimport { PicoBaseAuth } from './auth'\nimport { PicoBaseCollection } from './collection'\nimport { PicoBaseRealtime } from './realtime'\nimport { PicoBaseStorage } from './storage'\nimport { PicoBaseAdmin } from './admin'\nimport { InstanceUnavailableError, AuthorizationError, CollectionNotFoundError, RecordNotFoundError, ConfigurationError, RpcError } from './errors'\nimport type { PicoBaseClientOptions, RecordModel, SendOptions } from './types'\n\nconst DEFAULT_OPTIONS: Required<Omit<PicoBaseClientOptions, 'fetch'>> & { fetch?: typeof globalThis.fetch } = {\n timeout: 30_000,\n maxColdStartRetries: 3,\n lang: 'en-US',\n}\n\nexport class PicoBaseClient {\n /** The underlying PocketBase SDK instance. Exposed for advanced usage. */\n readonly pb: PocketBase\n /** Auth module — sign up, sign in, OAuth, session management. */\n readonly auth: PicoBaseAuth\n /** Realtime module — subscribe to record changes. */\n readonly realtime: PicoBaseRealtime\n /** Storage module — get file URLs and tokens. */\n readonly storage: PicoBaseStorage\n /** Admin module — manage collections (requires admin API key). */\n readonly admin: PicoBaseAdmin\n\n private readonly apiKey: string\n private readonly options: typeof DEFAULT_OPTIONS\n\n constructor(url: string, apiKey: string, options: PicoBaseClientOptions = {}) {\n // Validate inputs with clear messages\n if (!url) {\n throw new ConfigurationError(\n 'PicoBase URL is required.',\n 'Pass the URL as the first argument: createClient(\"https://myapp.picobase.com\", \"pbk_...\") ' +\n 'or set PICOBASE_URL in your .env file.',\n )\n }\n if (!apiKey) {\n throw new ConfigurationError(\n 'PicoBase API key is required.',\n 'Pass the API key as the second argument: createClient(\"https://...\", \"pbk_your_key\") ' +\n 'or set PICOBASE_API_KEY in your .env file. Get a key from your dashboard.',\n )\n }\n if (!url.startsWith('http://') && !url.startsWith('https://')) {\n throw new ConfigurationError(\n `Invalid URL: \"${url}\". Must start with http:// or https://.`,\n `Use the full URL: createClient(\"https://${url}\", \"...\")`,\n )\n }\n\n this.apiKey = apiKey\n this.options = { ...DEFAULT_OPTIONS, ...options }\n\n // Normalize URL — strip trailing slash\n const baseUrl = url.replace(/\\/+$/, '')\n\n this.pb = new PocketBase(baseUrl)\n this.pb.autoCancellation(false)\n\n if (this.options.lang) {\n this.pb.lang = this.options.lang\n }\n\n // Inject API key header into every request via beforeSend hook\n this.pb.beforeSend = (url, reqInit) => {\n const headers = reqInit.headers as Record<string, string> ?? {}\n headers['X-PicoBase-Key'] = this.apiKey\n reqInit.headers = headers\n return { url, options: reqInit }\n }\n\n // Wrap the send method for cold-start retry logic\n this._wrapSendWithRetry()\n\n // Initialize modules\n this.auth = new PicoBaseAuth(this.pb)\n this.realtime = new PicoBaseRealtime(this.pb)\n this.storage = new PicoBaseStorage(this.pb)\n this.admin = new PicoBaseAdmin(this.pb)\n }\n\n /**\n * Access a collection for CRUD operations.\n *\n * @example\n * ```ts\n * const posts = await pb.collection('posts').getList(1, 20)\n * ```\n */\n collection<T = RecordModel>(name: string): PicoBaseCollection<T> {\n return new PicoBaseCollection<T>(this.pb, name)\n }\n\n /**\n * Call a server-side function (PocketBase custom API endpoint).\n * Proxies to PocketBase's send() method.\n */\n async send<T = unknown>(path: string, options?: SendOptions): Promise<T> {\n return this.pb.send<T>(path, options ?? {})\n }\n\n /**\n * Call a remote procedure (RPC) - a convenience method for calling custom API endpoints.\n *\n * Maps Supabase-style RPC calls to PicoBase custom endpoints:\n * - `pb.rpc('my_function', params)` → `POST /api/rpc/my_function` with params as body\n *\n * @example\n * ```ts\n * // Simple RPC call\n * const result = await pb.rpc('calculate_total', { cart_id: '123' })\n *\n * // Complex RPC with typed response\n * interface DashboardStats {\n * posts: number\n * comments: number\n * followers: number\n * }\n * const stats = await pb.rpc<DashboardStats>('get_dashboard_stats', {\n * user_id: currentUser.id\n * })\n * ```\n *\n * @param functionName The name of the RPC function to call\n * @param params Optional parameters to pass to the function\n * @returns The function result\n */\n async rpc<T = unknown>(functionName: string, params?: Record<string, unknown>): Promise<T> {\n try {\n return await this.send<T>(`/api/rpc/${functionName}`, {\n method: 'POST',\n body: params ?? {},\n })\n } catch (err: unknown) {\n // Wrap errors with RpcError for better error messages\n const status = (err as { status?: number })?.status ?? 500\n const details = (err as { data?: unknown })?.data\n throw new RpcError(functionName, status, details)\n }\n }\n\n /**\n * Proactively wake up the instance if it's sleeping and wait for it to be ready.\n * Useful to call when a user navigates to a login page or before critical operations,\n * to absorb the cold-start latency upfront.\n * \n * This method guarantees that the instance is fully running and able to serve requests\n * when the promise resolves.\n * \n * @example\n * ```ts\n * // In a useEffect on your login page:\n * useEffect(() => {\n * pb.wake().catch(console.error)\n * }, [])\n * ```\n */\n async wake(): Promise<boolean> {\n try {\n await this.send('/api/health', { method: 'GET' })\n return true\n } catch (err) {\n console.warn('Failed to wake instance:', err)\n return false\n }\n }\n\n /**\n * Get the current auth token (if signed in), or empty string.\n */\n get token(): string {\n return this.pb.authStore.token\n }\n\n /**\n * Check if a user is currently authenticated.\n */\n get isAuthenticated(): boolean {\n return this.pb.authStore.isValid\n }\n\n /**\n * Monkey-patch pb.send to retry on 503 (cold start).\n *\n * When an instance is stopped or starting, the proxy returns 503.\n * The SDK automatically retries with exponential backoff so the developer\n * doesn't have to handle cold-start logic.\n */\n private _wrapSendWithRetry(): void {\n const originalSend = this.pb.send.bind(this.pb)\n const maxRetries = this.options.maxColdStartRetries\n\n this.pb.send = async <T>(path: string, options: SendOptions): Promise<T> => {\n let lastError: unknown\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await originalSend<T>(path, options)\n } catch (err: unknown) {\n lastError = err\n\n // Check if this is a 503 (instance starting up)\n const status = (err as { status?: number })?.status\n if (status === 503 && attempt < maxRetries) {\n // Exponential backoff: 2s, 4s, 8s\n const delay = Math.pow(2, attempt + 1) * 1000\n await new Promise(resolve => setTimeout(resolve, delay))\n continue\n }\n\n // Check if this is a 401 from our gateway (bad API key)\n if (status === 401) {\n const data = (err as { data?: { code?: string } })?.data\n if (data?.code === 'INVALID_API_KEY') {\n throw new AuthorizationError()\n }\n }\n\n // Detect collection-not-found for a clearer message\n if (status === 404) {\n const msg = (err as { message?: string })?.message ?? ''\n if (msg.toLowerCase().includes('missing collection') || msg.toLowerCase().includes('not found collection')) {\n const match = msg.match(/[\"']([^\"']+)[\"']/)\n throw new CollectionNotFoundError(match?.[1] ?? 'unknown')\n }\n }\n\n throw err\n }\n }\n\n throw new InstanceUnavailableError(\n `Instance unavailable after ${maxRetries} retries. ` +\n `Original error: ${lastError instanceof Error ? lastError.message : String(lastError)}`\n )\n }\n }\n}\n\n/**\n * Create a new PicoBase client.\n *\n * Can be called with explicit URL and API key, or with zero arguments to\n * auto-detect from environment variables (`PICOBASE_URL` / `NEXT_PUBLIC_PICOBASE_URL`\n * and `PICOBASE_API_KEY` / `NEXT_PUBLIC_PICOBASE_API_KEY`).\n *\n * @example\n * ```ts\n * import { createClient } from '@picobase_app/client'\n *\n * // Zero-config — reads from env vars\n * const pb = createClient()\n *\n * // Or explicit\n * const pb = createClient('https://myapp.picobase.com', 'pbk_abc123_secret')\n *\n * // Sign up a user\n * const user = await pb.auth.signUp({\n * email: 'user@example.com',\n * password: 'securepassword',\n * })\n *\n * // Query records\n * const posts = await pb.collection('posts').getList(1, 20, {\n * filter: 'published = true',\n * sort: '-created',\n * })\n * ```\n */\nexport function createClient(options?: PicoBaseClientOptions): PicoBaseClient\nexport function createClient(url: string, apiKey: string, options?: PicoBaseClientOptions): PicoBaseClient\nexport function createClient(\n urlOrOptions?: string | PicoBaseClientOptions,\n apiKeyOrUndefined?: string,\n options?: PicoBaseClientOptions,\n): PicoBaseClient {\n // Zero-arg / options-only: read from env\n if (typeof urlOrOptions !== 'string') {\n const env = typeof process !== 'undefined' ? process.env : {} as Record<string, string | undefined>\n const url = env.PICOBASE_URL || env.NEXT_PUBLIC_PICOBASE_URL\n const apiKey = env.PICOBASE_API_KEY || env.NEXT_PUBLIC_PICOBASE_API_KEY\n\n if (!url || !apiKey) {\n const missing = [\n !url && 'PICOBASE_URL (or NEXT_PUBLIC_PICOBASE_URL)',\n !apiKey && 'PICOBASE_API_KEY (or NEXT_PUBLIC_PICOBASE_API_KEY)',\n ].filter(Boolean).join(' and ')\n\n throw new ConfigurationError(\n `Missing environment variable${!url && !apiKey ? 's' : ''}: ${missing}`,\n 'Add them to your .env.local file:\\n\\n' +\n ' PICOBASE_URL=https://your-app.picobase.com\\n' +\n ' PICOBASE_API_KEY=pbk_your_key_here\\n\\n' +\n 'Or for Next.js (client-side access), prefix with NEXT_PUBLIC_:\\n\\n' +\n ' NEXT_PUBLIC_PICOBASE_URL=https://your-app.picobase.com\\n' +\n ' NEXT_PUBLIC_PICOBASE_API_KEY=pbk_your_key_here\\n\\n' +\n 'Get your URL and API key from: https://picobase.com/dashboard\\n' +\n 'Or run: picobase init',\n )\n }\n\n return new PicoBaseClient(url, apiKey, urlOrOptions)\n }\n\n return new PicoBaseClient(urlOrOptions, apiKeyOrUndefined!, options)\n}\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -614,6 +614,31 @@ var PicoBaseClient = class {
|
|
|
614
614
|
throw new RpcError(functionName, status, details);
|
|
615
615
|
}
|
|
616
616
|
}
|
|
617
|
+
/**
|
|
618
|
+
* Proactively wake up the instance if it's sleeping and wait for it to be ready.
|
|
619
|
+
* Useful to call when a user navigates to a login page or before critical operations,
|
|
620
|
+
* to absorb the cold-start latency upfront.
|
|
621
|
+
*
|
|
622
|
+
* This method guarantees that the instance is fully running and able to serve requests
|
|
623
|
+
* when the promise resolves.
|
|
624
|
+
*
|
|
625
|
+
* @example
|
|
626
|
+
* ```ts
|
|
627
|
+
* // In a useEffect on your login page:
|
|
628
|
+
* useEffect(() => {
|
|
629
|
+
* pb.wake().catch(console.error)
|
|
630
|
+
* }, [])
|
|
631
|
+
* ```
|
|
632
|
+
*/
|
|
633
|
+
async wake() {
|
|
634
|
+
try {
|
|
635
|
+
await this.send("/api/health", { method: "GET" });
|
|
636
|
+
return true;
|
|
637
|
+
} catch (err) {
|
|
638
|
+
console.warn("Failed to wake instance:", err);
|
|
639
|
+
return false;
|
|
640
|
+
}
|
|
641
|
+
}
|
|
617
642
|
/**
|
|
618
643
|
* Get the current auth token (if signed in), or empty string.
|
|
619
644
|
*/
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/auth.ts","../src/collection.ts","../src/realtime.ts","../src/storage.ts","../src/admin.ts","../src/errors.ts","../src/client.ts"],"names":["url"],"mappings":"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","file":"index.mjs","sourcesContent":["import type PocketBase from 'pocketbase'\nimport type {\n AuthResponse,\n AuthStateChangeCallback,\n AuthEvent,\n SignUpOptions,\n SignInOptions,\n OAuthSignInOptions,\n RecordModel,\n} from './types'\n\n/**\n * Auth module — handles user sign-up, sign-in, OAuth, and session management.\n *\n * PicoBase uses PocketBase's built-in `users` collection for auth. Each\n * instance has its own isolated user pool.\n *\n * @example\n * ```ts\n * // Sign up\n * const { token, record } = await pb.auth.signUp({\n * email: 'user@example.com',\n * password: 'securepassword',\n * })\n *\n * // Sign in\n * const { token, record } = await pb.auth.signIn({\n * email: 'user@example.com',\n * password: 'securepassword',\n * })\n *\n * // Listen to auth changes\n * pb.auth.onStateChange((event, record) => {\n * console.log(event, record)\n * })\n * ```\n */\nexport class PicoBaseAuth {\n private pb: PocketBase\n private listeners: Set<AuthStateChangeCallback> = new Set()\n private _collection: string = 'users'\n\n constructor(pb: PocketBase) {\n this.pb = pb\n\n // Listen to PocketBase auth store changes and re-emit\n this.pb.authStore.onChange((token) => {\n const record = this.pb.authStore.record ?? null\n const event: AuthEvent = token ? 'SIGNED_IN' : 'SIGNED_OUT'\n this._notify(event, record)\n })\n }\n\n /**\n * Set which collection to authenticate against.\n * Defaults to 'users'. Use this if you have a custom auth collection.\n */\n setCollection(name: string): this {\n this._collection = name\n return this\n }\n\n /**\n * Create a new user account.\n */\n async signUp(options: SignUpOptions): Promise<AuthResponse> {\n const { email, password, passwordConfirm, ...rest } = options\n\n const record = await this.pb.collection(this._collection).create<RecordModel>({\n email,\n password,\n passwordConfirm: passwordConfirm ?? password,\n ...rest,\n })\n\n // Automatically sign in after sign-up\n const authResult = await this.pb\n .collection(this._collection)\n .authWithPassword<RecordModel>(email, password)\n\n return {\n token: authResult.token,\n record: authResult.record,\n }\n }\n\n /**\n * Sign in with email and password.\n */\n async signIn(options: SignInOptions): Promise<AuthResponse> {\n const result = await this.pb\n .collection(this._collection)\n .authWithPassword<RecordModel>(options.email, options.password)\n\n return {\n token: result.token,\n record: result.record,\n }\n }\n\n /**\n * Sign in with an OAuth2 provider (Google, GitHub, etc.).\n *\n * In browser environments this opens a popup/redirect to the provider.\n * Configure providers in your PicoBase dashboard.\n */\n async signInWithOAuth(options: OAuthSignInOptions): Promise<AuthResponse> {\n const result = await this.pb.collection(this._collection).authWithOAuth2({\n provider: options.provider,\n scopes: options.scopes,\n createData: options.createData,\n urlCallback: options.urlCallback,\n })\n\n return {\n token: result.token,\n record: result.record,\n }\n }\n\n /**\n * Refresh the current auth token.\n */\n async refreshToken(): Promise<AuthResponse> {\n const result = await this.pb.collection(this._collection).authRefresh<RecordModel>()\n this._notify('TOKEN_REFRESHED', result.record)\n return {\n token: result.token,\n record: result.record,\n }\n }\n\n /**\n * Send a password reset email.\n */\n async requestPasswordReset(email: string): Promise<void> {\n await this.pb.collection(this._collection).requestPasswordReset(email)\n }\n\n /**\n * Confirm a password reset with the token from the reset email.\n */\n async confirmPasswordReset(\n token: string,\n password: string,\n passwordConfirm?: string,\n ): Promise<void> {\n await this.pb\n .collection(this._collection)\n .confirmPasswordReset(token, password, passwordConfirm ?? password)\n }\n\n /**\n * Send an email verification email.\n */\n async requestVerification(email: string): Promise<void> {\n await this.pb.collection(this._collection).requestVerification(email)\n }\n\n /**\n * Confirm email verification with the token from the verification email.\n */\n async confirmVerification(token: string): Promise<void> {\n await this.pb.collection(this._collection).confirmVerification(token)\n }\n\n /**\n * Sign out the current user. Clears the local auth store.\n */\n signOut(): void {\n this.pb.authStore.clear()\n }\n\n /**\n * Get the currently authenticated user record, or `null` if not signed in.\n */\n get user(): RecordModel | null {\n return this.pb.authStore.record\n }\n\n /**\n * Get the current auth token, or empty string if not signed in.\n */\n get token(): string {\n return this.pb.authStore.token\n }\n\n /**\n * Check if the current auth session is valid (token exists and not expired).\n */\n get isValid(): boolean {\n return this.pb.authStore.isValid\n }\n\n /**\n * Listen to auth state changes. Returns an unsubscribe function.\n *\n * @example\n * ```ts\n * const unsubscribe = pb.auth.onStateChange((event, record) => {\n * if (event === 'SIGNED_IN') {\n * console.log('Welcome', record.email)\n * }\n * })\n *\n * // Later:\n * unsubscribe()\n * ```\n */\n onStateChange(callback: AuthStateChangeCallback): () => void {\n this.listeners.add(callback)\n return () => {\n this.listeners.delete(callback)\n }\n }\n\n private _notify(event: AuthEvent, record: RecordModel | null): void {\n for (const cb of this.listeners) {\n try {\n cb(event, record)\n } catch {\n // Don't let one listener crash others\n }\n }\n }\n}\n","import type PocketBase from 'pocketbase'\nimport type { RecordModel, ListResult } from 'pocketbase'\n\n/** Options for list queries. */\nexport interface ListOptions {\n sort?: string\n filter?: string\n expand?: string\n fields?: string\n skipTotal?: boolean\n [key: string]: unknown\n}\n\n/** Options for single record queries. */\nexport interface RecordQueryOptions {\n expand?: string\n fields?: string\n [key: string]: unknown\n}\n\n/**\n * Collection module — CRUD operations on a PocketBase collection.\n *\n * @example\n * ```ts\n * const posts = pb.collection('posts')\n *\n * // List with filtering, sorting, and pagination\n * const result = await posts.getList(1, 20, {\n * filter: 'published = true',\n * sort: '-created',\n * expand: 'author',\n * })\n *\n * // Get a single record\n * const post = await posts.getOne('record_id')\n *\n * // Create a record\n * const newPost = await posts.create({\n * title: 'Hello World',\n * content: 'My first post',\n * })\n *\n * // Update a record\n * const updated = await posts.update('record_id', { title: 'Updated' })\n *\n * // Delete a record\n * await posts.delete('record_id')\n * ```\n */\nexport class PicoBaseCollection<T = RecordModel> {\n private pb: PocketBase\n private name: string\n\n constructor(pb: PocketBase, name: string) {\n this.pb = pb\n this.name = name\n }\n\n /**\n * Fetch a paginated list of records.\n *\n * @param page - Page number (1-indexed). Default: 1.\n * @param perPage - Records per page. Default: 30.\n * @param options - Filter, sort, expand, fields.\n */\n async getList(page = 1, perPage = 30, options: ListOptions = {}): Promise<ListResult<T>> {\n return this.pb.collection(this.name).getList<T>(page, perPage, options)\n }\n\n /**\n * Fetch all records matching the filter (auto-paginates).\n *\n * **Warning:** Use with caution on large collections. Prefer `getList()` with pagination.\n */\n async getFullList(options: ListOptions = {}): Promise<T[]> {\n return this.pb.collection(this.name).getFullList<T>(options)\n }\n\n /**\n * Fetch a single record by ID.\n */\n async getOne(id: string, options: RecordQueryOptions = {}): Promise<T> {\n return this.pb.collection(this.name).getOne<T>(id, options)\n }\n\n /**\n * Fetch the first record matching a filter.\n *\n * @example\n * ```ts\n * const admin = await pb.collection('users').getFirstListItem('role = \"admin\"')\n * ```\n */\n async getFirstListItem(filter: string, options: RecordQueryOptions = {}): Promise<T> {\n return this.pb.collection(this.name).getFirstListItem<T>(filter, options)\n }\n\n /**\n * Create a new record.\n *\n * @param data - Record data. Can be a plain object or `FormData` (for file uploads).\n */\n async create(data: Record<string, unknown> | FormData, options: RecordQueryOptions = {}): Promise<T> {\n return this.pb.collection(this.name).create<T>(data, options)\n }\n\n /**\n * Update an existing record.\n *\n * @param id - Record ID.\n * @param data - Fields to update. Can be a plain object or `FormData`.\n */\n async update(id: string, data: Record<string, unknown> | FormData, options: RecordQueryOptions = {}): Promise<T> {\n return this.pb.collection(this.name).update<T>(id, data, options)\n }\n\n /**\n * Delete a record by ID.\n */\n async delete(id: string): Promise<boolean> {\n return this.pb.collection(this.name).delete(id)\n }\n\n /**\n * Subscribe to realtime changes on this collection.\n *\n * @param callback - Called on every create/update/delete event.\n * @param filter - Optional: only receive events matching this filter.\n * @returns Unsubscribe function.\n *\n * @example\n * ```ts\n * const unsubscribe = await pb.collection('posts').subscribe((e) => {\n * console.log(e.action, e.record)\n * })\n *\n * // Later:\n * await unsubscribe()\n * ```\n */\n async subscribe(\n callback: (data: { action: string; record: T }) => void,\n filter?: string,\n ): Promise<() => Promise<void>> {\n const topic = '*'\n await this.pb.collection(this.name).subscribe<T>(topic, callback, filter ? { filter } : undefined)\n return () => this.pb.collection(this.name).unsubscribe(topic)\n }\n\n /**\n * Subscribe to changes on a specific record.\n *\n * @param id - Record ID.\n * @param callback - Called on update/delete events.\n * @returns Unsubscribe function.\n */\n async subscribeOne(\n id: string,\n callback: (data: { action: string; record: T }) => void,\n ): Promise<() => Promise<void>> {\n await this.pb.collection(this.name).subscribe<T>(id, callback)\n return () => this.pb.collection(this.name).unsubscribe(id)\n }\n}\n","import type PocketBase from 'pocketbase'\nimport type { RecordModel, RecordSubscription } from './types'\n\n/**\n * Realtime module — manage global realtime subscriptions.\n *\n * For collection-level subscriptions, prefer `pb.collection('name').subscribe()`.\n * This module is for lower-level control over the SSE connection.\n *\n * @example\n * ```ts\n * // Subscribe to all changes on a collection\n * const unsub = await pb.realtime.subscribe('posts', (e) => {\n * console.log(e.action, e.record)\n * })\n *\n * // Unsubscribe\n * await unsub()\n *\n * // Disconnect all realtime connections\n * pb.realtime.disconnect()\n * ```\n */\nexport class PicoBaseRealtime {\n private pb: PocketBase\n\n constructor(pb: PocketBase) {\n this.pb = pb\n }\n\n /**\n * Subscribe to realtime events on a collection.\n *\n * @param collection - Collection name (e.g. 'posts').\n * @param callback - Called on every create/update/delete event.\n * @returns Unsubscribe function.\n */\n async subscribe<T = RecordModel>(\n collection: string,\n callback: (data: RecordSubscription<T>) => void,\n ): Promise<() => Promise<void>> {\n await this.pb.collection(collection).subscribe<T>('*', callback)\n return () => this.pb.collection(collection).unsubscribe('*')\n }\n\n /**\n * Subscribe to realtime events on a specific record.\n *\n * @param collection - Collection name.\n * @param recordId - Record ID.\n * @param callback - Called on update/delete events.\n * @returns Unsubscribe function.\n */\n async subscribeRecord<T = RecordModel>(\n collection: string,\n recordId: string,\n callback: (data: RecordSubscription<T>) => void,\n ): Promise<() => Promise<void>> {\n await this.pb.collection(collection).subscribe<T>(recordId, callback)\n return () => this.pb.collection(collection).unsubscribe(recordId)\n }\n\n /**\n * Unsubscribe from all realtime events on a collection.\n */\n async unsubscribe(collection: string): Promise<void> {\n await this.pb.collection(collection).unsubscribe()\n }\n\n /**\n * Unsubscribe from ALL realtime events. The SSE connection will be\n * automatically closed when there are no remaining subscriptions.\n */\n async disconnectAll(): Promise<void> {\n await this.pb.realtime.unsubscribe()\n }\n}\n","import type PocketBase from 'pocketbase'\nimport type { RecordModel, FileOptions } from './types'\n\n/**\n * Storage module — work with file fields on PocketBase records.\n *\n * PocketBase stores files as record fields. This module provides helpers\n * to get file URLs and generate access tokens for protected files.\n *\n * @example\n * ```ts\n * const user = await pb.collection('users').getOne('user_id')\n *\n * // Get the URL for the user's avatar\n * const avatarUrl = pb.storage.getFileUrl(user, 'avatar.jpg')\n *\n * // Get a thumbnail URL (100x100)\n * const thumbUrl = pb.storage.getFileUrl(user, 'avatar.jpg', {\n * thumb: '100x100',\n * })\n *\n * // Get a temporary token for protected files\n * const token = await pb.storage.getFileToken()\n * const protectedUrl = pb.storage.getFileUrl(user, 'document.pdf', { token })\n * ```\n */\nexport class PicoBaseStorage {\n private pb: PocketBase\n\n constructor(pb: PocketBase) {\n this.pb = pb\n }\n\n /**\n * Get the public URL for a file attached to a record.\n *\n * @param record - The record that owns the file.\n * @param filename - The filename (as stored in the record's file field).\n * @param options - Optional: thumb size, token for protected files, download flag.\n */\n getFileUrl(record: RecordModel, filename: string, options: FileOptions = {}): string {\n const queryParams: Record<string, string> = {}\n\n if (options.thumb) {\n queryParams['thumb'] = options.thumb\n }\n if (options.token) {\n queryParams['token'] = options.token\n }\n if (options.download) {\n queryParams['download'] = '1'\n }\n\n return this.pb.files.getURL(record, filename, queryParams)\n }\n\n /**\n * Generate a temporary file access token.\n *\n * Use this for accessing protected files. Tokens are short-lived.\n */\n async getFileToken(): Promise<string> {\n return this.pb.files.getToken()\n }\n}\n","import type PocketBase from 'pocketbase'\nimport type { CollectionModel } from './types' // Assuming types are updated\n\nexport class PicoBaseAdmin {\n private pb: PocketBase\n\n constructor(pb: PocketBase) {\n this.pb = pb\n }\n\n /**\n * Fetch a list of all collections.\n */\n async listCollections(): Promise<CollectionModel[]> {\n const result = await this.pb.send<{ items: CollectionModel[] }>('/api/collections', {\n method: 'GET',\n })\n return result.items || []\n }\n\n /**\n * Fetch a single collection by ID or name.\n */\n async getCollection(idOrName: string): Promise<CollectionModel> {\n return this.pb.send<CollectionModel>(`/api/collections/${idOrName}`, {\n method: 'GET',\n })\n }\n\n /**\n * Create a new collection.\n */\n async createCollection(data: Partial<CollectionModel>): Promise<CollectionModel> {\n return this.pb.send<CollectionModel>('/api/collections', {\n method: 'POST',\n body: data,\n })\n }\n\n /**\n * Update an existing collection.\n */\n async updateCollection(idOrName: string, data: Partial<CollectionModel>): Promise<CollectionModel> {\n return this.pb.send<CollectionModel>(`/api/collections/${idOrName}`, {\n method: 'PATCH',\n body: data,\n })\n }\n\n /**\n * Delete a collection.\n */\n async deleteCollection(idOrName: string): Promise<boolean> {\n try {\n await this.pb.send(`/api/collections/${idOrName}`, {\n method: 'DELETE',\n })\n return true\n } catch (e) {\n return false\n }\n }\n}\n","/**\n * Base error class for all PicoBase SDK errors.\n *\n * Every error includes a `code` for programmatic handling and a `fix`\n * suggestion so developers can resolve issues without digging through docs.\n */\nexport class PicoBaseError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly status?: number,\n public readonly details?: unknown,\n /** Actionable suggestion for how to fix this error. */\n public readonly fix?: string,\n ) {\n super(message)\n this.name = 'PicoBaseError'\n }\n\n /** Formatted error string including fix suggestion. */\n toString(): string {\n let s = `${this.name} [${this.code}]: ${this.message}`\n if (this.fix) s += `\\n Fix: ${this.fix}`\n return s\n }\n}\n\n/**\n * Thrown when the instance is not running and cold-start retries are exhausted.\n */\nexport class InstanceUnavailableError extends PicoBaseError {\n constructor(message = 'Instance is not available. It may be stopped or starting up.') {\n super(\n message,\n 'INSTANCE_UNAVAILABLE',\n 503,\n undefined,\n 'Check your instance status in the PicoBase dashboard, or wait a few seconds and retry. ' +\n 'If this persists, your instance may have been stopped — restart it with `picobase status`.',\n )\n this.name = 'InstanceUnavailableError'\n }\n}\n\n/**\n * Thrown when an API key is invalid or missing.\n */\nexport class AuthorizationError extends PicoBaseError {\n constructor(message = 'Invalid or missing API key.') {\n super(\n message,\n 'UNAUTHORIZED',\n 401,\n undefined,\n 'Make sure PICOBASE_API_KEY is set in your .env file and matches a valid key from your dashboard. ' +\n 'Keys start with \"pbk_\". You can generate a new key at https://picobase.com/dashboard.',\n )\n this.name = 'AuthorizationError'\n }\n}\n\n/**\n * Thrown when a collection is not found.\n */\nexport class CollectionNotFoundError extends PicoBaseError {\n constructor(collectionName: string) {\n super(\n `Collection \"${collectionName}\" not found.`,\n 'COLLECTION_NOT_FOUND',\n 404,\n { collection: collectionName },\n `Make sure the collection \"${collectionName}\" exists in your PicoBase instance. ` +\n 'Collections are auto-created when you first write data, or you can create them ' +\n 'manually in the PicoBase dashboard under Collections.',\n )\n this.name = 'CollectionNotFoundError'\n }\n}\n\n/**\n * Thrown when a record is not found.\n */\nexport class RecordNotFoundError extends PicoBaseError {\n constructor(collectionName: string, recordId: string) {\n super(\n `Record \"${recordId}\" not found in collection \"${collectionName}\".`,\n 'RECORD_NOT_FOUND',\n 404,\n { collection: collectionName, recordId },\n 'Check that the record ID is correct. IDs are 15-character alphanumeric strings (e.g., \"abc123def456789\").',\n )\n this.name = 'RecordNotFoundError'\n }\n}\n\n/**\n * Thrown when a PocketBase API request fails.\n */\nexport class RequestError extends PicoBaseError {\n constructor(message: string, status: number, details?: unknown) {\n const fix = requestErrorFix(status, message)\n super(message, 'REQUEST_FAILED', status, details, fix)\n this.name = 'RequestError'\n }\n}\n\n/**\n * Thrown when the SDK is misconfigured (bad URL, missing params, etc.).\n */\nexport class ConfigurationError extends PicoBaseError {\n constructor(message: string, fix: string) {\n super(message, 'CONFIGURATION_ERROR', undefined, undefined, fix)\n this.name = 'ConfigurationError'\n }\n}\n\n/**\n * Thrown when an RPC (remote procedure call) fails.\n */\nexport class RpcError extends PicoBaseError {\n constructor(functionName: string, status: number, details?: unknown) {\n const fix = rpcErrorFix(functionName, status)\n super(\n `RPC function \"${functionName}\" failed.`,\n 'RPC_ERROR',\n status,\n details,\n fix,\n )\n this.name = 'RpcError'\n }\n}\n\n/** Generate fix suggestions for RPC errors. */\nfunction rpcErrorFix(functionName: string, status: number): string {\n if (status === 404) {\n return `The RPC endpoint \"/api/rpc/${functionName}\" does not exist. ` +\n 'Create a custom route in your PocketBase instance to handle this RPC call. ' +\n 'See: https://pocketbase.io/docs/js-routing/'\n }\n if (status === 400) {\n return 'Check the parameters you are passing to this RPC function. ' +\n 'The function may be expecting different parameters or types.'\n }\n if (status === 403) {\n return 'You don\\'t have permission to call this RPC function. ' +\n 'Check the authentication requirements for this endpoint in your PocketBase routes.'\n }\n return 'Check your PicoBase instance logs for details about this RPC error. ' +\n 'Ensure the custom route is correctly implemented in your PocketBase setup.'\n}\n\n/** Map common HTTP statuses to actionable fixes. */\nfunction requestErrorFix(status: number, message: string): string {\n switch (status) {\n case 400:\n return 'Check the data you are sending — a required field may be missing or have the wrong type. ' +\n 'Run `picobase typegen` to regenerate types and check your field names.'\n case 403:\n return 'You don\\'t have permission for this action. Check your collection API rules in the dashboard. ' +\n 'By default, only authenticated users can read/write records.'\n case 404:\n if (message.toLowerCase().includes('collection'))\n return 'This collection does not exist yet. Write a record to auto-create it, or create it in the dashboard.'\n return 'The requested resource was not found. Double-check IDs and collection names.'\n case 413:\n return 'The request payload is too large. Check file upload size limits in your instance settings.'\n case 429:\n return 'Too many requests. Add a short delay between requests or implement client-side caching.'\n default:\n return 'If this error persists, check your PicoBase dashboard for instance health and logs.'\n }\n}\n","import PocketBase from 'pocketbase'\nimport { PicoBaseAuth } from './auth'\nimport { PicoBaseCollection } from './collection'\nimport { PicoBaseRealtime } from './realtime'\nimport { PicoBaseStorage } from './storage'\nimport { PicoBaseAdmin } from './admin'\nimport { InstanceUnavailableError, AuthorizationError, CollectionNotFoundError, RecordNotFoundError, ConfigurationError, RpcError } from './errors'\nimport type { PicoBaseClientOptions, RecordModel, SendOptions } from './types'\n\nconst DEFAULT_OPTIONS: Required<Omit<PicoBaseClientOptions, 'fetch'>> & { fetch?: typeof globalThis.fetch } = {\n timeout: 30_000,\n maxColdStartRetries: 3,\n lang: 'en-US',\n}\n\nexport class PicoBaseClient {\n /** The underlying PocketBase SDK instance. Exposed for advanced usage. */\n readonly pb: PocketBase\n /** Auth module — sign up, sign in, OAuth, session management. */\n readonly auth: PicoBaseAuth\n /** Realtime module — subscribe to record changes. */\n readonly realtime: PicoBaseRealtime\n /** Storage module — get file URLs and tokens. */\n readonly storage: PicoBaseStorage\n /** Admin module — manage collections (requires admin API key). */\n readonly admin: PicoBaseAdmin\n\n private readonly apiKey: string\n private readonly options: typeof DEFAULT_OPTIONS\n\n constructor(url: string, apiKey: string, options: PicoBaseClientOptions = {}) {\n // Validate inputs with clear messages\n if (!url) {\n throw new ConfigurationError(\n 'PicoBase URL is required.',\n 'Pass the URL as the first argument: createClient(\"https://myapp.picobase.com\", \"pbk_...\") ' +\n 'or set PICOBASE_URL in your .env file.',\n )\n }\n if (!apiKey) {\n throw new ConfigurationError(\n 'PicoBase API key is required.',\n 'Pass the API key as the second argument: createClient(\"https://...\", \"pbk_your_key\") ' +\n 'or set PICOBASE_API_KEY in your .env file. Get a key from your dashboard.',\n )\n }\n if (!url.startsWith('http://') && !url.startsWith('https://')) {\n throw new ConfigurationError(\n `Invalid URL: \"${url}\". Must start with http:// or https://.`,\n `Use the full URL: createClient(\"https://${url}\", \"...\")`,\n )\n }\n\n this.apiKey = apiKey\n this.options = { ...DEFAULT_OPTIONS, ...options }\n\n // Normalize URL — strip trailing slash\n const baseUrl = url.replace(/\\/+$/, '')\n\n this.pb = new PocketBase(baseUrl)\n this.pb.autoCancellation(false)\n\n if (this.options.lang) {\n this.pb.lang = this.options.lang\n }\n\n // Inject API key header into every request via beforeSend hook\n this.pb.beforeSend = (url, reqInit) => {\n const headers = reqInit.headers as Record<string, string> ?? {}\n headers['X-PicoBase-Key'] = this.apiKey\n reqInit.headers = headers\n return { url, options: reqInit }\n }\n\n // Wrap the send method for cold-start retry logic\n this._wrapSendWithRetry()\n\n // Initialize modules\n this.auth = new PicoBaseAuth(this.pb)\n this.realtime = new PicoBaseRealtime(this.pb)\n this.storage = new PicoBaseStorage(this.pb)\n this.admin = new PicoBaseAdmin(this.pb)\n }\n\n /**\n * Access a collection for CRUD operations.\n *\n * @example\n * ```ts\n * const posts = await pb.collection('posts').getList(1, 20)\n * ```\n */\n collection<T = RecordModel>(name: string): PicoBaseCollection<T> {\n return new PicoBaseCollection<T>(this.pb, name)\n }\n\n /**\n * Call a server-side function (PocketBase custom API endpoint).\n * Proxies to PocketBase's send() method.\n */\n async send<T = unknown>(path: string, options?: SendOptions): Promise<T> {\n return this.pb.send<T>(path, options ?? {})\n }\n\n /**\n * Call a remote procedure (RPC) - a convenience method for calling custom API endpoints.\n *\n * Maps Supabase-style RPC calls to PicoBase custom endpoints:\n * - `pb.rpc('my_function', params)` → `POST /api/rpc/my_function` with params as body\n *\n * @example\n * ```ts\n * // Simple RPC call\n * const result = await pb.rpc('calculate_total', { cart_id: '123' })\n *\n * // Complex RPC with typed response\n * interface DashboardStats {\n * posts: number\n * comments: number\n * followers: number\n * }\n * const stats = await pb.rpc<DashboardStats>('get_dashboard_stats', {\n * user_id: currentUser.id\n * })\n * ```\n *\n * @param functionName The name of the RPC function to call\n * @param params Optional parameters to pass to the function\n * @returns The function result\n */\n async rpc<T = unknown>(functionName: string, params?: Record<string, unknown>): Promise<T> {\n try {\n return await this.send<T>(`/api/rpc/${functionName}`, {\n method: 'POST',\n body: params ?? {},\n })\n } catch (err: unknown) {\n // Wrap errors with RpcError for better error messages\n const status = (err as { status?: number })?.status ?? 500\n const details = (err as { data?: unknown })?.data\n throw new RpcError(functionName, status, details)\n }\n }\n\n /**\n * Get the current auth token (if signed in), or empty string.\n */\n get token(): string {\n return this.pb.authStore.token\n }\n\n /**\n * Check if a user is currently authenticated.\n */\n get isAuthenticated(): boolean {\n return this.pb.authStore.isValid\n }\n\n /**\n * Monkey-patch pb.send to retry on 503 (cold start).\n *\n * When an instance is stopped or starting, the proxy returns 503.\n * The SDK automatically retries with exponential backoff so the developer\n * doesn't have to handle cold-start logic.\n */\n private _wrapSendWithRetry(): void {\n const originalSend = this.pb.send.bind(this.pb)\n const maxRetries = this.options.maxColdStartRetries\n\n this.pb.send = async <T>(path: string, options: SendOptions): Promise<T> => {\n let lastError: unknown\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await originalSend<T>(path, options)\n } catch (err: unknown) {\n lastError = err\n\n // Check if this is a 503 (instance starting up)\n const status = (err as { status?: number })?.status\n if (status === 503 && attempt < maxRetries) {\n // Exponential backoff: 2s, 4s, 8s\n const delay = Math.pow(2, attempt + 1) * 1000\n await new Promise(resolve => setTimeout(resolve, delay))\n continue\n }\n\n // Check if this is a 401 from our gateway (bad API key)\n if (status === 401) {\n const data = (err as { data?: { code?: string } })?.data\n if (data?.code === 'INVALID_API_KEY') {\n throw new AuthorizationError()\n }\n }\n\n // Detect collection-not-found for a clearer message\n if (status === 404) {\n const msg = (err as { message?: string })?.message ?? ''\n if (msg.toLowerCase().includes('missing collection') || msg.toLowerCase().includes('not found collection')) {\n const match = msg.match(/[\"']([^\"']+)[\"']/)\n throw new CollectionNotFoundError(match?.[1] ?? 'unknown')\n }\n }\n\n throw err\n }\n }\n\n throw new InstanceUnavailableError(\n `Instance unavailable after ${maxRetries} retries. ` +\n `Original error: ${lastError instanceof Error ? lastError.message : String(lastError)}`\n )\n }\n }\n}\n\n/**\n * Create a new PicoBase client.\n *\n * Can be called with explicit URL and API key, or with zero arguments to\n * auto-detect from environment variables (`PICOBASE_URL` / `NEXT_PUBLIC_PICOBASE_URL`\n * and `PICOBASE_API_KEY` / `NEXT_PUBLIC_PICOBASE_API_KEY`).\n *\n * @example\n * ```ts\n * import { createClient } from '@picobase_app/client'\n *\n * // Zero-config — reads from env vars\n * const pb = createClient()\n *\n * // Or explicit\n * const pb = createClient('https://myapp.picobase.com', 'pbk_abc123_secret')\n *\n * // Sign up a user\n * const user = await pb.auth.signUp({\n * email: 'user@example.com',\n * password: 'securepassword',\n * })\n *\n * // Query records\n * const posts = await pb.collection('posts').getList(1, 20, {\n * filter: 'published = true',\n * sort: '-created',\n * })\n * ```\n */\nexport function createClient(options?: PicoBaseClientOptions): PicoBaseClient\nexport function createClient(url: string, apiKey: string, options?: PicoBaseClientOptions): PicoBaseClient\nexport function createClient(\n urlOrOptions?: string | PicoBaseClientOptions,\n apiKeyOrUndefined?: string,\n options?: PicoBaseClientOptions,\n): PicoBaseClient {\n // Zero-arg / options-only: read from env\n if (typeof urlOrOptions !== 'string') {\n const env = typeof process !== 'undefined' ? process.env : {} as Record<string, string | undefined>\n const url = env.PICOBASE_URL || env.NEXT_PUBLIC_PICOBASE_URL\n const apiKey = env.PICOBASE_API_KEY || env.NEXT_PUBLIC_PICOBASE_API_KEY\n\n if (!url || !apiKey) {\n const missing = [\n !url && 'PICOBASE_URL (or NEXT_PUBLIC_PICOBASE_URL)',\n !apiKey && 'PICOBASE_API_KEY (or NEXT_PUBLIC_PICOBASE_API_KEY)',\n ].filter(Boolean).join(' and ')\n\n throw new ConfigurationError(\n `Missing environment variable${!url && !apiKey ? 's' : ''}: ${missing}`,\n 'Add them to your .env.local file:\\n\\n' +\n ' PICOBASE_URL=https://your-app.picobase.com\\n' +\n ' PICOBASE_API_KEY=pbk_your_key_here\\n\\n' +\n 'Or for Next.js (client-side access), prefix with NEXT_PUBLIC_:\\n\\n' +\n ' NEXT_PUBLIC_PICOBASE_URL=https://your-app.picobase.com\\n' +\n ' NEXT_PUBLIC_PICOBASE_API_KEY=pbk_your_key_here\\n\\n' +\n 'Get your URL and API key from: https://picobase.com/dashboard\\n' +\n 'Or run: picobase init',\n )\n }\n\n return new PicoBaseClient(url, apiKey, urlOrOptions)\n }\n\n return new PicoBaseClient(urlOrOptions, apiKeyOrUndefined!, options)\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/auth.ts","../src/collection.ts","../src/realtime.ts","../src/storage.ts","../src/admin.ts","../src/errors.ts","../src/client.ts"],"names":["url"],"mappings":"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","file":"index.mjs","sourcesContent":["import type PocketBase from 'pocketbase'\nimport type {\n AuthResponse,\n AuthStateChangeCallback,\n AuthEvent,\n SignUpOptions,\n SignInOptions,\n OAuthSignInOptions,\n RecordModel,\n} from './types'\n\n/**\n * Auth module — handles user sign-up, sign-in, OAuth, and session management.\n *\n * PicoBase uses PocketBase's built-in `users` collection for auth. Each\n * instance has its own isolated user pool.\n *\n * @example\n * ```ts\n * // Sign up\n * const { token, record } = await pb.auth.signUp({\n * email: 'user@example.com',\n * password: 'securepassword',\n * })\n *\n * // Sign in\n * const { token, record } = await pb.auth.signIn({\n * email: 'user@example.com',\n * password: 'securepassword',\n * })\n *\n * // Listen to auth changes\n * pb.auth.onStateChange((event, record) => {\n * console.log(event, record)\n * })\n * ```\n */\nexport class PicoBaseAuth {\n private pb: PocketBase\n private listeners: Set<AuthStateChangeCallback> = new Set()\n private _collection: string = 'users'\n\n constructor(pb: PocketBase) {\n this.pb = pb\n\n // Listen to PocketBase auth store changes and re-emit\n this.pb.authStore.onChange((token) => {\n const record = this.pb.authStore.record ?? null\n const event: AuthEvent = token ? 'SIGNED_IN' : 'SIGNED_OUT'\n this._notify(event, record)\n })\n }\n\n /**\n * Set which collection to authenticate against.\n * Defaults to 'users'. Use this if you have a custom auth collection.\n */\n setCollection(name: string): this {\n this._collection = name\n return this\n }\n\n /**\n * Create a new user account.\n */\n async signUp(options: SignUpOptions): Promise<AuthResponse> {\n const { email, password, passwordConfirm, ...rest } = options\n\n const record = await this.pb.collection(this._collection).create<RecordModel>({\n email,\n password,\n passwordConfirm: passwordConfirm ?? password,\n ...rest,\n })\n\n // Automatically sign in after sign-up\n const authResult = await this.pb\n .collection(this._collection)\n .authWithPassword<RecordModel>(email, password)\n\n return {\n token: authResult.token,\n record: authResult.record,\n }\n }\n\n /**\n * Sign in with email and password.\n */\n async signIn(options: SignInOptions): Promise<AuthResponse> {\n const result = await this.pb\n .collection(this._collection)\n .authWithPassword<RecordModel>(options.email, options.password)\n\n return {\n token: result.token,\n record: result.record,\n }\n }\n\n /**\n * Sign in with an OAuth2 provider (Google, GitHub, etc.).\n *\n * In browser environments this opens a popup/redirect to the provider.\n * Configure providers in your PicoBase dashboard.\n */\n async signInWithOAuth(options: OAuthSignInOptions): Promise<AuthResponse> {\n const result = await this.pb.collection(this._collection).authWithOAuth2({\n provider: options.provider,\n scopes: options.scopes,\n createData: options.createData,\n urlCallback: options.urlCallback,\n })\n\n return {\n token: result.token,\n record: result.record,\n }\n }\n\n /**\n * Refresh the current auth token.\n */\n async refreshToken(): Promise<AuthResponse> {\n const result = await this.pb.collection(this._collection).authRefresh<RecordModel>()\n this._notify('TOKEN_REFRESHED', result.record)\n return {\n token: result.token,\n record: result.record,\n }\n }\n\n /**\n * Send a password reset email.\n */\n async requestPasswordReset(email: string): Promise<void> {\n await this.pb.collection(this._collection).requestPasswordReset(email)\n }\n\n /**\n * Confirm a password reset with the token from the reset email.\n */\n async confirmPasswordReset(\n token: string,\n password: string,\n passwordConfirm?: string,\n ): Promise<void> {\n await this.pb\n .collection(this._collection)\n .confirmPasswordReset(token, password, passwordConfirm ?? password)\n }\n\n /**\n * Send an email verification email.\n */\n async requestVerification(email: string): Promise<void> {\n await this.pb.collection(this._collection).requestVerification(email)\n }\n\n /**\n * Confirm email verification with the token from the verification email.\n */\n async confirmVerification(token: string): Promise<void> {\n await this.pb.collection(this._collection).confirmVerification(token)\n }\n\n /**\n * Sign out the current user. Clears the local auth store.\n */\n signOut(): void {\n this.pb.authStore.clear()\n }\n\n /**\n * Get the currently authenticated user record, or `null` if not signed in.\n */\n get user(): RecordModel | null {\n return this.pb.authStore.record\n }\n\n /**\n * Get the current auth token, or empty string if not signed in.\n */\n get token(): string {\n return this.pb.authStore.token\n }\n\n /**\n * Check if the current auth session is valid (token exists and not expired).\n */\n get isValid(): boolean {\n return this.pb.authStore.isValid\n }\n\n /**\n * Listen to auth state changes. Returns an unsubscribe function.\n *\n * @example\n * ```ts\n * const unsubscribe = pb.auth.onStateChange((event, record) => {\n * if (event === 'SIGNED_IN') {\n * console.log('Welcome', record.email)\n * }\n * })\n *\n * // Later:\n * unsubscribe()\n * ```\n */\n onStateChange(callback: AuthStateChangeCallback): () => void {\n this.listeners.add(callback)\n return () => {\n this.listeners.delete(callback)\n }\n }\n\n private _notify(event: AuthEvent, record: RecordModel | null): void {\n for (const cb of this.listeners) {\n try {\n cb(event, record)\n } catch {\n // Don't let one listener crash others\n }\n }\n }\n}\n","import type PocketBase from 'pocketbase'\nimport type { RecordModel, ListResult } from 'pocketbase'\n\n/** Options for list queries. */\nexport interface ListOptions {\n sort?: string\n filter?: string\n expand?: string\n fields?: string\n skipTotal?: boolean\n [key: string]: unknown\n}\n\n/** Options for single record queries. */\nexport interface RecordQueryOptions {\n expand?: string\n fields?: string\n [key: string]: unknown\n}\n\n/**\n * Collection module — CRUD operations on a PocketBase collection.\n *\n * @example\n * ```ts\n * const posts = pb.collection('posts')\n *\n * // List with filtering, sorting, and pagination\n * const result = await posts.getList(1, 20, {\n * filter: 'published = true',\n * sort: '-created',\n * expand: 'author',\n * })\n *\n * // Get a single record\n * const post = await posts.getOne('record_id')\n *\n * // Create a record\n * const newPost = await posts.create({\n * title: 'Hello World',\n * content: 'My first post',\n * })\n *\n * // Update a record\n * const updated = await posts.update('record_id', { title: 'Updated' })\n *\n * // Delete a record\n * await posts.delete('record_id')\n * ```\n */\nexport class PicoBaseCollection<T = RecordModel> {\n private pb: PocketBase\n private name: string\n\n constructor(pb: PocketBase, name: string) {\n this.pb = pb\n this.name = name\n }\n\n /**\n * Fetch a paginated list of records.\n *\n * @param page - Page number (1-indexed). Default: 1.\n * @param perPage - Records per page. Default: 30.\n * @param options - Filter, sort, expand, fields.\n */\n async getList(page = 1, perPage = 30, options: ListOptions = {}): Promise<ListResult<T>> {\n return this.pb.collection(this.name).getList<T>(page, perPage, options)\n }\n\n /**\n * Fetch all records matching the filter (auto-paginates).\n *\n * **Warning:** Use with caution on large collections. Prefer `getList()` with pagination.\n */\n async getFullList(options: ListOptions = {}): Promise<T[]> {\n return this.pb.collection(this.name).getFullList<T>(options)\n }\n\n /**\n * Fetch a single record by ID.\n */\n async getOne(id: string, options: RecordQueryOptions = {}): Promise<T> {\n return this.pb.collection(this.name).getOne<T>(id, options)\n }\n\n /**\n * Fetch the first record matching a filter.\n *\n * @example\n * ```ts\n * const admin = await pb.collection('users').getFirstListItem('role = \"admin\"')\n * ```\n */\n async getFirstListItem(filter: string, options: RecordQueryOptions = {}): Promise<T> {\n return this.pb.collection(this.name).getFirstListItem<T>(filter, options)\n }\n\n /**\n * Create a new record.\n *\n * @param data - Record data. Can be a plain object or `FormData` (for file uploads).\n */\n async create(data: Record<string, unknown> | FormData, options: RecordQueryOptions = {}): Promise<T> {\n return this.pb.collection(this.name).create<T>(data, options)\n }\n\n /**\n * Update an existing record.\n *\n * @param id - Record ID.\n * @param data - Fields to update. Can be a plain object or `FormData`.\n */\n async update(id: string, data: Record<string, unknown> | FormData, options: RecordQueryOptions = {}): Promise<T> {\n return this.pb.collection(this.name).update<T>(id, data, options)\n }\n\n /**\n * Delete a record by ID.\n */\n async delete(id: string): Promise<boolean> {\n return this.pb.collection(this.name).delete(id)\n }\n\n /**\n * Subscribe to realtime changes on this collection.\n *\n * @param callback - Called on every create/update/delete event.\n * @param filter - Optional: only receive events matching this filter.\n * @returns Unsubscribe function.\n *\n * @example\n * ```ts\n * const unsubscribe = await pb.collection('posts').subscribe((e) => {\n * console.log(e.action, e.record)\n * })\n *\n * // Later:\n * await unsubscribe()\n * ```\n */\n async subscribe(\n callback: (data: { action: string; record: T }) => void,\n filter?: string,\n ): Promise<() => Promise<void>> {\n const topic = '*'\n await this.pb.collection(this.name).subscribe<T>(topic, callback, filter ? { filter } : undefined)\n return () => this.pb.collection(this.name).unsubscribe(topic)\n }\n\n /**\n * Subscribe to changes on a specific record.\n *\n * @param id - Record ID.\n * @param callback - Called on update/delete events.\n * @returns Unsubscribe function.\n */\n async subscribeOne(\n id: string,\n callback: (data: { action: string; record: T }) => void,\n ): Promise<() => Promise<void>> {\n await this.pb.collection(this.name).subscribe<T>(id, callback)\n return () => this.pb.collection(this.name).unsubscribe(id)\n }\n}\n","import type PocketBase from 'pocketbase'\nimport type { RecordModel, RecordSubscription } from './types'\n\n/**\n * Realtime module — manage global realtime subscriptions.\n *\n * For collection-level subscriptions, prefer `pb.collection('name').subscribe()`.\n * This module is for lower-level control over the SSE connection.\n *\n * @example\n * ```ts\n * // Subscribe to all changes on a collection\n * const unsub = await pb.realtime.subscribe('posts', (e) => {\n * console.log(e.action, e.record)\n * })\n *\n * // Unsubscribe\n * await unsub()\n *\n * // Disconnect all realtime connections\n * pb.realtime.disconnect()\n * ```\n */\nexport class PicoBaseRealtime {\n private pb: PocketBase\n\n constructor(pb: PocketBase) {\n this.pb = pb\n }\n\n /**\n * Subscribe to realtime events on a collection.\n *\n * @param collection - Collection name (e.g. 'posts').\n * @param callback - Called on every create/update/delete event.\n * @returns Unsubscribe function.\n */\n async subscribe<T = RecordModel>(\n collection: string,\n callback: (data: RecordSubscription<T>) => void,\n ): Promise<() => Promise<void>> {\n await this.pb.collection(collection).subscribe<T>('*', callback)\n return () => this.pb.collection(collection).unsubscribe('*')\n }\n\n /**\n * Subscribe to realtime events on a specific record.\n *\n * @param collection - Collection name.\n * @param recordId - Record ID.\n * @param callback - Called on update/delete events.\n * @returns Unsubscribe function.\n */\n async subscribeRecord<T = RecordModel>(\n collection: string,\n recordId: string,\n callback: (data: RecordSubscription<T>) => void,\n ): Promise<() => Promise<void>> {\n await this.pb.collection(collection).subscribe<T>(recordId, callback)\n return () => this.pb.collection(collection).unsubscribe(recordId)\n }\n\n /**\n * Unsubscribe from all realtime events on a collection.\n */\n async unsubscribe(collection: string): Promise<void> {\n await this.pb.collection(collection).unsubscribe()\n }\n\n /**\n * Unsubscribe from ALL realtime events. The SSE connection will be\n * automatically closed when there are no remaining subscriptions.\n */\n async disconnectAll(): Promise<void> {\n await this.pb.realtime.unsubscribe()\n }\n}\n","import type PocketBase from 'pocketbase'\nimport type { RecordModel, FileOptions } from './types'\n\n/**\n * Storage module — work with file fields on PocketBase records.\n *\n * PocketBase stores files as record fields. This module provides helpers\n * to get file URLs and generate access tokens for protected files.\n *\n * @example\n * ```ts\n * const user = await pb.collection('users').getOne('user_id')\n *\n * // Get the URL for the user's avatar\n * const avatarUrl = pb.storage.getFileUrl(user, 'avatar.jpg')\n *\n * // Get a thumbnail URL (100x100)\n * const thumbUrl = pb.storage.getFileUrl(user, 'avatar.jpg', {\n * thumb: '100x100',\n * })\n *\n * // Get a temporary token for protected files\n * const token = await pb.storage.getFileToken()\n * const protectedUrl = pb.storage.getFileUrl(user, 'document.pdf', { token })\n * ```\n */\nexport class PicoBaseStorage {\n private pb: PocketBase\n\n constructor(pb: PocketBase) {\n this.pb = pb\n }\n\n /**\n * Get the public URL for a file attached to a record.\n *\n * @param record - The record that owns the file.\n * @param filename - The filename (as stored in the record's file field).\n * @param options - Optional: thumb size, token for protected files, download flag.\n */\n getFileUrl(record: RecordModel, filename: string, options: FileOptions = {}): string {\n const queryParams: Record<string, string> = {}\n\n if (options.thumb) {\n queryParams['thumb'] = options.thumb\n }\n if (options.token) {\n queryParams['token'] = options.token\n }\n if (options.download) {\n queryParams['download'] = '1'\n }\n\n return this.pb.files.getURL(record, filename, queryParams)\n }\n\n /**\n * Generate a temporary file access token.\n *\n * Use this for accessing protected files. Tokens are short-lived.\n */\n async getFileToken(): Promise<string> {\n return this.pb.files.getToken()\n }\n}\n","import type PocketBase from 'pocketbase'\nimport type { CollectionModel } from './types' // Assuming types are updated\n\nexport class PicoBaseAdmin {\n private pb: PocketBase\n\n constructor(pb: PocketBase) {\n this.pb = pb\n }\n\n /**\n * Fetch a list of all collections.\n */\n async listCollections(): Promise<CollectionModel[]> {\n const result = await this.pb.send<{ items: CollectionModel[] }>('/api/collections', {\n method: 'GET',\n })\n return result.items || []\n }\n\n /**\n * Fetch a single collection by ID or name.\n */\n async getCollection(idOrName: string): Promise<CollectionModel> {\n return this.pb.send<CollectionModel>(`/api/collections/${idOrName}`, {\n method: 'GET',\n })\n }\n\n /**\n * Create a new collection.\n */\n async createCollection(data: Partial<CollectionModel>): Promise<CollectionModel> {\n return this.pb.send<CollectionModel>('/api/collections', {\n method: 'POST',\n body: data,\n })\n }\n\n /**\n * Update an existing collection.\n */\n async updateCollection(idOrName: string, data: Partial<CollectionModel>): Promise<CollectionModel> {\n return this.pb.send<CollectionModel>(`/api/collections/${idOrName}`, {\n method: 'PATCH',\n body: data,\n })\n }\n\n /**\n * Delete a collection.\n */\n async deleteCollection(idOrName: string): Promise<boolean> {\n try {\n await this.pb.send(`/api/collections/${idOrName}`, {\n method: 'DELETE',\n })\n return true\n } catch (e) {\n return false\n }\n }\n}\n","/**\n * Base error class for all PicoBase SDK errors.\n *\n * Every error includes a `code` for programmatic handling and a `fix`\n * suggestion so developers can resolve issues without digging through docs.\n */\nexport class PicoBaseError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly status?: number,\n public readonly details?: unknown,\n /** Actionable suggestion for how to fix this error. */\n public readonly fix?: string,\n ) {\n super(message)\n this.name = 'PicoBaseError'\n }\n\n /** Formatted error string including fix suggestion. */\n toString(): string {\n let s = `${this.name} [${this.code}]: ${this.message}`\n if (this.fix) s += `\\n Fix: ${this.fix}`\n return s\n }\n}\n\n/**\n * Thrown when the instance is not running and cold-start retries are exhausted.\n */\nexport class InstanceUnavailableError extends PicoBaseError {\n constructor(message = 'Instance is not available. It may be stopped or starting up.') {\n super(\n message,\n 'INSTANCE_UNAVAILABLE',\n 503,\n undefined,\n 'Check your instance status in the PicoBase dashboard, or wait a few seconds and retry. ' +\n 'If this persists, your instance may have been stopped — restart it with `picobase status`.',\n )\n this.name = 'InstanceUnavailableError'\n }\n}\n\n/**\n * Thrown when an API key is invalid or missing.\n */\nexport class AuthorizationError extends PicoBaseError {\n constructor(message = 'Invalid or missing API key.') {\n super(\n message,\n 'UNAUTHORIZED',\n 401,\n undefined,\n 'Make sure PICOBASE_API_KEY is set in your .env file and matches a valid key from your dashboard. ' +\n 'Keys start with \"pbk_\". You can generate a new key at https://picobase.com/dashboard.',\n )\n this.name = 'AuthorizationError'\n }\n}\n\n/**\n * Thrown when a collection is not found.\n */\nexport class CollectionNotFoundError extends PicoBaseError {\n constructor(collectionName: string) {\n super(\n `Collection \"${collectionName}\" not found.`,\n 'COLLECTION_NOT_FOUND',\n 404,\n { collection: collectionName },\n `Make sure the collection \"${collectionName}\" exists in your PicoBase instance. ` +\n 'Collections are auto-created when you first write data, or you can create them ' +\n 'manually in the PicoBase dashboard under Collections.',\n )\n this.name = 'CollectionNotFoundError'\n }\n}\n\n/**\n * Thrown when a record is not found.\n */\nexport class RecordNotFoundError extends PicoBaseError {\n constructor(collectionName: string, recordId: string) {\n super(\n `Record \"${recordId}\" not found in collection \"${collectionName}\".`,\n 'RECORD_NOT_FOUND',\n 404,\n { collection: collectionName, recordId },\n 'Check that the record ID is correct. IDs are 15-character alphanumeric strings (e.g., \"abc123def456789\").',\n )\n this.name = 'RecordNotFoundError'\n }\n}\n\n/**\n * Thrown when a PocketBase API request fails.\n */\nexport class RequestError extends PicoBaseError {\n constructor(message: string, status: number, details?: unknown) {\n const fix = requestErrorFix(status, message)\n super(message, 'REQUEST_FAILED', status, details, fix)\n this.name = 'RequestError'\n }\n}\n\n/**\n * Thrown when the SDK is misconfigured (bad URL, missing params, etc.).\n */\nexport class ConfigurationError extends PicoBaseError {\n constructor(message: string, fix: string) {\n super(message, 'CONFIGURATION_ERROR', undefined, undefined, fix)\n this.name = 'ConfigurationError'\n }\n}\n\n/**\n * Thrown when an RPC (remote procedure call) fails.\n */\nexport class RpcError extends PicoBaseError {\n constructor(functionName: string, status: number, details?: unknown) {\n const fix = rpcErrorFix(functionName, status)\n super(\n `RPC function \"${functionName}\" failed.`,\n 'RPC_ERROR',\n status,\n details,\n fix,\n )\n this.name = 'RpcError'\n }\n}\n\n/** Generate fix suggestions for RPC errors. */\nfunction rpcErrorFix(functionName: string, status: number): string {\n if (status === 404) {\n return `The RPC endpoint \"/api/rpc/${functionName}\" does not exist. ` +\n 'Create a custom route in your PocketBase instance to handle this RPC call. ' +\n 'See: https://pocketbase.io/docs/js-routing/'\n }\n if (status === 400) {\n return 'Check the parameters you are passing to this RPC function. ' +\n 'The function may be expecting different parameters or types.'\n }\n if (status === 403) {\n return 'You don\\'t have permission to call this RPC function. ' +\n 'Check the authentication requirements for this endpoint in your PocketBase routes.'\n }\n return 'Check your PicoBase instance logs for details about this RPC error. ' +\n 'Ensure the custom route is correctly implemented in your PocketBase setup.'\n}\n\n/** Map common HTTP statuses to actionable fixes. */\nfunction requestErrorFix(status: number, message: string): string {\n switch (status) {\n case 400:\n return 'Check the data you are sending — a required field may be missing or have the wrong type. ' +\n 'Run `picobase typegen` to regenerate types and check your field names.'\n case 403:\n return 'You don\\'t have permission for this action. Check your collection API rules in the dashboard. ' +\n 'By default, only authenticated users can read/write records.'\n case 404:\n if (message.toLowerCase().includes('collection'))\n return 'This collection does not exist yet. Write a record to auto-create it, or create it in the dashboard.'\n return 'The requested resource was not found. Double-check IDs and collection names.'\n case 413:\n return 'The request payload is too large. Check file upload size limits in your instance settings.'\n case 429:\n return 'Too many requests. Add a short delay between requests or implement client-side caching.'\n default:\n return 'If this error persists, check your PicoBase dashboard for instance health and logs.'\n }\n}\n","import PocketBase from 'pocketbase'\nimport { PicoBaseAuth } from './auth'\nimport { PicoBaseCollection } from './collection'\nimport { PicoBaseRealtime } from './realtime'\nimport { PicoBaseStorage } from './storage'\nimport { PicoBaseAdmin } from './admin'\nimport { InstanceUnavailableError, AuthorizationError, CollectionNotFoundError, RecordNotFoundError, ConfigurationError, RpcError } from './errors'\nimport type { PicoBaseClientOptions, RecordModel, SendOptions } from './types'\n\nconst DEFAULT_OPTIONS: Required<Omit<PicoBaseClientOptions, 'fetch'>> & { fetch?: typeof globalThis.fetch } = {\n timeout: 30_000,\n maxColdStartRetries: 3,\n lang: 'en-US',\n}\n\nexport class PicoBaseClient {\n /** The underlying PocketBase SDK instance. Exposed for advanced usage. */\n readonly pb: PocketBase\n /** Auth module — sign up, sign in, OAuth, session management. */\n readonly auth: PicoBaseAuth\n /** Realtime module — subscribe to record changes. */\n readonly realtime: PicoBaseRealtime\n /** Storage module — get file URLs and tokens. */\n readonly storage: PicoBaseStorage\n /** Admin module — manage collections (requires admin API key). */\n readonly admin: PicoBaseAdmin\n\n private readonly apiKey: string\n private readonly options: typeof DEFAULT_OPTIONS\n\n constructor(url: string, apiKey: string, options: PicoBaseClientOptions = {}) {\n // Validate inputs with clear messages\n if (!url) {\n throw new ConfigurationError(\n 'PicoBase URL is required.',\n 'Pass the URL as the first argument: createClient(\"https://myapp.picobase.com\", \"pbk_...\") ' +\n 'or set PICOBASE_URL in your .env file.',\n )\n }\n if (!apiKey) {\n throw new ConfigurationError(\n 'PicoBase API key is required.',\n 'Pass the API key as the second argument: createClient(\"https://...\", \"pbk_your_key\") ' +\n 'or set PICOBASE_API_KEY in your .env file. Get a key from your dashboard.',\n )\n }\n if (!url.startsWith('http://') && !url.startsWith('https://')) {\n throw new ConfigurationError(\n `Invalid URL: \"${url}\". Must start with http:// or https://.`,\n `Use the full URL: createClient(\"https://${url}\", \"...\")`,\n )\n }\n\n this.apiKey = apiKey\n this.options = { ...DEFAULT_OPTIONS, ...options }\n\n // Normalize URL — strip trailing slash\n const baseUrl = url.replace(/\\/+$/, '')\n\n this.pb = new PocketBase(baseUrl)\n this.pb.autoCancellation(false)\n\n if (this.options.lang) {\n this.pb.lang = this.options.lang\n }\n\n // Inject API key header into every request via beforeSend hook\n this.pb.beforeSend = (url, reqInit) => {\n const headers = reqInit.headers as Record<string, string> ?? {}\n headers['X-PicoBase-Key'] = this.apiKey\n reqInit.headers = headers\n return { url, options: reqInit }\n }\n\n // Wrap the send method for cold-start retry logic\n this._wrapSendWithRetry()\n\n // Initialize modules\n this.auth = new PicoBaseAuth(this.pb)\n this.realtime = new PicoBaseRealtime(this.pb)\n this.storage = new PicoBaseStorage(this.pb)\n this.admin = new PicoBaseAdmin(this.pb)\n }\n\n /**\n * Access a collection for CRUD operations.\n *\n * @example\n * ```ts\n * const posts = await pb.collection('posts').getList(1, 20)\n * ```\n */\n collection<T = RecordModel>(name: string): PicoBaseCollection<T> {\n return new PicoBaseCollection<T>(this.pb, name)\n }\n\n /**\n * Call a server-side function (PocketBase custom API endpoint).\n * Proxies to PocketBase's send() method.\n */\n async send<T = unknown>(path: string, options?: SendOptions): Promise<T> {\n return this.pb.send<T>(path, options ?? {})\n }\n\n /**\n * Call a remote procedure (RPC) - a convenience method for calling custom API endpoints.\n *\n * Maps Supabase-style RPC calls to PicoBase custom endpoints:\n * - `pb.rpc('my_function', params)` → `POST /api/rpc/my_function` with params as body\n *\n * @example\n * ```ts\n * // Simple RPC call\n * const result = await pb.rpc('calculate_total', { cart_id: '123' })\n *\n * // Complex RPC with typed response\n * interface DashboardStats {\n * posts: number\n * comments: number\n * followers: number\n * }\n * const stats = await pb.rpc<DashboardStats>('get_dashboard_stats', {\n * user_id: currentUser.id\n * })\n * ```\n *\n * @param functionName The name of the RPC function to call\n * @param params Optional parameters to pass to the function\n * @returns The function result\n */\n async rpc<T = unknown>(functionName: string, params?: Record<string, unknown>): Promise<T> {\n try {\n return await this.send<T>(`/api/rpc/${functionName}`, {\n method: 'POST',\n body: params ?? {},\n })\n } catch (err: unknown) {\n // Wrap errors with RpcError for better error messages\n const status = (err as { status?: number })?.status ?? 500\n const details = (err as { data?: unknown })?.data\n throw new RpcError(functionName, status, details)\n }\n }\n\n /**\n * Proactively wake up the instance if it's sleeping and wait for it to be ready.\n * Useful to call when a user navigates to a login page or before critical operations,\n * to absorb the cold-start latency upfront.\n * \n * This method guarantees that the instance is fully running and able to serve requests\n * when the promise resolves.\n * \n * @example\n * ```ts\n * // In a useEffect on your login page:\n * useEffect(() => {\n * pb.wake().catch(console.error)\n * }, [])\n * ```\n */\n async wake(): Promise<boolean> {\n try {\n await this.send('/api/health', { method: 'GET' })\n return true\n } catch (err) {\n console.warn('Failed to wake instance:', err)\n return false\n }\n }\n\n /**\n * Get the current auth token (if signed in), or empty string.\n */\n get token(): string {\n return this.pb.authStore.token\n }\n\n /**\n * Check if a user is currently authenticated.\n */\n get isAuthenticated(): boolean {\n return this.pb.authStore.isValid\n }\n\n /**\n * Monkey-patch pb.send to retry on 503 (cold start).\n *\n * When an instance is stopped or starting, the proxy returns 503.\n * The SDK automatically retries with exponential backoff so the developer\n * doesn't have to handle cold-start logic.\n */\n private _wrapSendWithRetry(): void {\n const originalSend = this.pb.send.bind(this.pb)\n const maxRetries = this.options.maxColdStartRetries\n\n this.pb.send = async <T>(path: string, options: SendOptions): Promise<T> => {\n let lastError: unknown\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await originalSend<T>(path, options)\n } catch (err: unknown) {\n lastError = err\n\n // Check if this is a 503 (instance starting up)\n const status = (err as { status?: number })?.status\n if (status === 503 && attempt < maxRetries) {\n // Exponential backoff: 2s, 4s, 8s\n const delay = Math.pow(2, attempt + 1) * 1000\n await new Promise(resolve => setTimeout(resolve, delay))\n continue\n }\n\n // Check if this is a 401 from our gateway (bad API key)\n if (status === 401) {\n const data = (err as { data?: { code?: string } })?.data\n if (data?.code === 'INVALID_API_KEY') {\n throw new AuthorizationError()\n }\n }\n\n // Detect collection-not-found for a clearer message\n if (status === 404) {\n const msg = (err as { message?: string })?.message ?? ''\n if (msg.toLowerCase().includes('missing collection') || msg.toLowerCase().includes('not found collection')) {\n const match = msg.match(/[\"']([^\"']+)[\"']/)\n throw new CollectionNotFoundError(match?.[1] ?? 'unknown')\n }\n }\n\n throw err\n }\n }\n\n throw new InstanceUnavailableError(\n `Instance unavailable after ${maxRetries} retries. ` +\n `Original error: ${lastError instanceof Error ? lastError.message : String(lastError)}`\n )\n }\n }\n}\n\n/**\n * Create a new PicoBase client.\n *\n * Can be called with explicit URL and API key, or with zero arguments to\n * auto-detect from environment variables (`PICOBASE_URL` / `NEXT_PUBLIC_PICOBASE_URL`\n * and `PICOBASE_API_KEY` / `NEXT_PUBLIC_PICOBASE_API_KEY`).\n *\n * @example\n * ```ts\n * import { createClient } from '@picobase_app/client'\n *\n * // Zero-config — reads from env vars\n * const pb = createClient()\n *\n * // Or explicit\n * const pb = createClient('https://myapp.picobase.com', 'pbk_abc123_secret')\n *\n * // Sign up a user\n * const user = await pb.auth.signUp({\n * email: 'user@example.com',\n * password: 'securepassword',\n * })\n *\n * // Query records\n * const posts = await pb.collection('posts').getList(1, 20, {\n * filter: 'published = true',\n * sort: '-created',\n * })\n * ```\n */\nexport function createClient(options?: PicoBaseClientOptions): PicoBaseClient\nexport function createClient(url: string, apiKey: string, options?: PicoBaseClientOptions): PicoBaseClient\nexport function createClient(\n urlOrOptions?: string | PicoBaseClientOptions,\n apiKeyOrUndefined?: string,\n options?: PicoBaseClientOptions,\n): PicoBaseClient {\n // Zero-arg / options-only: read from env\n if (typeof urlOrOptions !== 'string') {\n const env = typeof process !== 'undefined' ? process.env : {} as Record<string, string | undefined>\n const url = env.PICOBASE_URL || env.NEXT_PUBLIC_PICOBASE_URL\n const apiKey = env.PICOBASE_API_KEY || env.NEXT_PUBLIC_PICOBASE_API_KEY\n\n if (!url || !apiKey) {\n const missing = [\n !url && 'PICOBASE_URL (or NEXT_PUBLIC_PICOBASE_URL)',\n !apiKey && 'PICOBASE_API_KEY (or NEXT_PUBLIC_PICOBASE_API_KEY)',\n ].filter(Boolean).join(' and ')\n\n throw new ConfigurationError(\n `Missing environment variable${!url && !apiKey ? 's' : ''}: ${missing}`,\n 'Add them to your .env.local file:\\n\\n' +\n ' PICOBASE_URL=https://your-app.picobase.com\\n' +\n ' PICOBASE_API_KEY=pbk_your_key_here\\n\\n' +\n 'Or for Next.js (client-side access), prefix with NEXT_PUBLIC_:\\n\\n' +\n ' NEXT_PUBLIC_PICOBASE_URL=https://your-app.picobase.com\\n' +\n ' NEXT_PUBLIC_PICOBASE_API_KEY=pbk_your_key_here\\n\\n' +\n 'Get your URL and API key from: https://picobase.com/dashboard\\n' +\n 'Or run: picobase init',\n )\n }\n\n return new PicoBaseClient(url, apiKey, urlOrOptions)\n }\n\n return new PicoBaseClient(urlOrOptions, apiKeyOrUndefined!, options)\n}\n"]}
|