@picobase_app/client 0.5.1 → 1.0.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/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/errors.ts","../src/http.ts","../src/auth-store.ts","../src/auth.ts","../src/collection.ts","../src/realtime.ts","../src/storage.ts","../src/admin.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\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","/**\n * Internal HTTP client for PicoBase SDK.\n *\n * Not exported. Used internally by all modules.\n * Handles: URL building, header injection, timeout, error mapping, 503 retry.\n */\n\nimport {\n InstanceUnavailableError,\n AuthorizationError,\n CollectionNotFoundError,\n RequestError,\n PicoBaseError,\n} from './errors'\n\nexport interface HttpSendOptions extends Omit<RequestInit, 'body'> {\n /** Query parameters appended to the URL. */\n query?: Record<string, unknown>\n /** Request body — plain object (serialized to JSON), FormData, or string. */\n body?: Record<string, unknown> | FormData | string | null\n}\n\nexport interface PicoBaseHttpClientOptions {\n /** Timeout in ms for each request. Default: 30_000 */\n timeout?: number\n /** Max retries on 503 (cold-start). Default: 3 */\n maxColdStartRetries?: number\n /** Custom fetch implementation. */\n fetch?: typeof globalThis.fetch\n /** Returns the current user JWT for Authorization header. */\n getToken?: () => string\n}\n\n/**\n * Minimal fetch-based HTTP client.\n * Injects X-PicoBase-Key and Authorization headers, handles cold-start retry.\n */\nexport class PicoBaseHttpClient {\n readonly baseUrl: string\n private readonly apiKey: string\n private readonly timeout: number\n private readonly maxColdStartRetries: number\n private readonly fetchImpl: typeof globalThis.fetch\n private readonly getToken?: () => string\n\n constructor(baseUrl: string, apiKey: string, options: PicoBaseHttpClientOptions = {}) {\n this.baseUrl = baseUrl\n this.apiKey = apiKey\n this.timeout = options.timeout ?? 30_000\n this.maxColdStartRetries = options.maxColdStartRetries ?? 3\n this.fetchImpl = options.fetch ?? globalThis.fetch\n this.getToken = options.getToken\n }\n\n async send<T>(path: string, init: HttpSendOptions = {}): Promise<T> {\n const { query, body: rawBody, ...restInit } = init\n\n // ── Build URL ────────────────────────────────────────────────────────────\n let url = `${this.baseUrl}${path}`\n if (query) {\n const params = new URLSearchParams()\n for (const [k, v] of Object.entries(query)) {\n if (v !== undefined && v !== null) params.append(k, String(v))\n }\n const qs = params.toString()\n if (qs) url += `?${qs}`\n }\n\n // ── Build headers ────────────────────────────────────────────────────────\n const headers: Record<string, string> = {\n ...(restInit.headers as Record<string, string> ?? {}),\n }\n headers['X-PicoBase-Key'] = this.apiKey\n\n const token = this.getToken?.()\n if (token) headers['Authorization'] = `Bearer ${token}`\n\n // ── Serialize body ───────────────────────────────────────────────────────\n let body: BodyInit | null | undefined\n if (rawBody instanceof FormData) {\n body = rawBody\n // Let fetch set Content-Type with boundary\n } else if (rawBody !== undefined && rawBody !== null) {\n headers['Content-Type'] = 'application/json'\n body = typeof rawBody === 'string' ? rawBody : JSON.stringify(rawBody)\n }\n\n // ── Execute with 503 retry ───────────────────────────────────────────────\n let lastError: Error = new Error('Unknown error')\n\n for (let attempt = 0; attempt <= this.maxColdStartRetries; attempt++) {\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), this.timeout)\n\n let response: Response\n try {\n response = await this.fetchImpl(url, {\n ...restInit,\n headers,\n body,\n signal: controller.signal,\n })\n } catch (fetchErr) {\n clearTimeout(timeoutId)\n const msg = fetchErr instanceof Error ? fetchErr.message : String(fetchErr)\n throw new RequestError(msg, 0, fetchErr)\n }\n clearTimeout(timeoutId)\n\n // ── Success ─────────────────────────────────────────────────────────\n if (response.ok) {\n if (response.status === 204) return undefined as T\n return (await response.json()) as T\n }\n\n // ── Error response ───────────────────────────────────────────────────\n let errorData: unknown = null\n try { errorData = await response.json() } catch { /* ignore */ }\n\n const message: string =\n (errorData as any)?.message ??\n (errorData as any)?.error ??\n response.statusText\n const status = response.status\n\n // 503 — cold-start, retry with exponential backoff\n if (status === 503) {\n lastError = new RequestError(message, status, errorData)\n if (attempt < this.maxColdStartRetries) {\n const delay = Math.pow(2, attempt + 1) * 1000\n await new Promise(resolve => setTimeout(resolve, delay))\n continue\n }\n break // all retries exhausted → fall through to InstanceUnavailableError\n }\n\n // 401 — invalid/missing API key\n if (status === 401) {\n const code = (errorData as any)?.code\n if (!code || code === 'INVALID_API_KEY') throw new AuthorizationError()\n throw new AuthorizationError(message)\n }\n\n // 404 — check for collection-not-found\n if (status === 404) {\n const lower = message.toLowerCase()\n if (\n lower.includes('collection') &&\n (lower.includes('not found') || lower.includes('missing'))\n ) {\n const match = message.match(/[\"']([^\"']+)[\"']/)\n throw new CollectionNotFoundError(match?.[1] ?? 'unknown')\n }\n }\n\n throw new RequestError(message, status, errorData)\n }\n\n throw new InstanceUnavailableError(\n `Instance unavailable after ${this.maxColdStartRetries} retries. ` +\n `Original error: ${lastError.message}`,\n )\n }\n}\n","/**\n * AuthStore — manages the end-user JWT and record in memory + localStorage.\n *\n * Not exported. Used by PicoBaseAuth and PicoBaseClient.\n */\n\nimport type { RecordModel } from './types'\n\nconst STORAGE_KEY_TOKEN = 'picobase_token'\nconst STORAGE_KEY_RECORD = 'picobase_record'\n\ntype AuthChangeCallback = (token: string, record: RecordModel | null) => void\n\nexport class AuthStore {\n private _token: string = ''\n private _record: RecordModel | null = null\n private _listeners: Set<AuthChangeCallback> = new Set()\n\n constructor() {\n this._loadFromStorage()\n }\n\n /** Current JWT, or empty string if not signed in. */\n get token(): string {\n return this._token\n }\n\n /** Currently signed-in user record, or null. */\n get record(): RecordModel | null {\n return this._record\n }\n\n /**\n * Returns true if a token is present and not yet expired.\n * Checks JWT `exp` claim — no signature verification (the server does that).\n */\n get isValid(): boolean {\n if (!this._token) return false\n try {\n const parts = this._token.split('.')\n if (parts.length !== 3) return false\n // base64url → base64 → JSON\n const padded = parts[1].replace(/-/g, '+').replace(/_/g, '/')\n const json = typeof atob !== 'undefined'\n ? atob(padded)\n : Buffer.from(padded, 'base64').toString('utf8')\n const payload = JSON.parse(json) as { exp?: number }\n return typeof payload.exp === 'number' && payload.exp * 1000 > Date.now()\n } catch {\n return false\n }\n }\n\n /** Save a token (and optionally the user record). Persists to localStorage. */\n save(token: string, record: RecordModel | null = null): void {\n this._token = token\n this._record = record\n try {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(STORAGE_KEY_TOKEN, token)\n if (record) {\n localStorage.setItem(STORAGE_KEY_RECORD, JSON.stringify(record))\n } else {\n localStorage.removeItem(STORAGE_KEY_RECORD)\n }\n }\n } catch { /* localStorage may be unavailable */ }\n this._notify()\n }\n\n /** Clear the token and user record. Removes from localStorage. */\n clear(): void {\n this._token = ''\n this._record = null\n try {\n if (typeof localStorage !== 'undefined') {\n localStorage.removeItem(STORAGE_KEY_TOKEN)\n localStorage.removeItem(STORAGE_KEY_RECORD)\n }\n } catch { /* localStorage may be unavailable */ }\n this._notify()\n }\n\n /**\n * Register a listener for auth state changes.\n * @returns Unsubscribe function.\n */\n onChange(callback: AuthChangeCallback): () => void {\n this._listeners.add(callback)\n return () => { this._listeners.delete(callback) }\n }\n\n // ── Private ───────────────────────────────────────────────────────────────\n\n private _loadFromStorage(): void {\n try {\n if (typeof localStorage !== 'undefined') {\n const token = localStorage.getItem(STORAGE_KEY_TOKEN)\n if (token) {\n this._token = token\n const raw = localStorage.getItem(STORAGE_KEY_RECORD)\n if (raw) {\n try { this._record = JSON.parse(raw) } catch { /* ignore */ }\n }\n }\n }\n } catch { /* localStorage may be unavailable */ }\n }\n\n private _notify(): void {\n for (const cb of this._listeners) {\n try { cb(this._token, this._record) } catch { /* don't let one listener crash others */ }\n }\n }\n}\n","import type { PicoBaseHttpClient } from './http'\nimport type { AuthStore } from './auth-store'\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 * @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 http: PicoBaseHttpClient\n private authStore: AuthStore\n private listeners: Set<AuthStateChangeCallback> = new Set()\n private _collection: string = '_auth_users'\n\n constructor(http: PicoBaseHttpClient, authStore: AuthStore) {\n this.http = http\n this.authStore = authStore\n\n // Listen to AuthStore changes and re-emit as AuthEvents\n this.authStore.onChange((token) => {\n const record = this.authStore.record\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 '_auth_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. Automatically signs the user in after creation.\n */\n async signUp(options: SignUpOptions): Promise<AuthResponse> {\n const { email, password, passwordConfirm, ...rest } = options\n\n // Create the user record\n await this.http.send<RecordModel>('/api/db/collections/_auth_users/records', {\n method: 'POST',\n body: {\n email,\n password,\n passwordConfirm: passwordConfirm ?? password,\n ...rest,\n },\n })\n\n // Auto sign in\n return this.signIn({ email, password })\n }\n\n /**\n * Sign in with email and password.\n */\n async signIn(options: SignInOptions): Promise<AuthResponse> {\n const result = await this.http.send<{ token: string; record: RecordModel }>(\n `/api/db/collections/${this._collection}/auth-with-password`,\n {\n method: 'POST',\n body: { identity: options.email, password: options.password },\n },\n )\n\n this.authStore.save(result.token, result.record)\n return { token: result.token, record: result.record }\n }\n\n /**\n * Sign in with an OAuth2 provider (Google, GitHub, etc.).\n */\n async signInWithOAuth(options: OAuthSignInOptions): Promise<AuthResponse> {\n const result = await this.http.send<{ token: string; record: RecordModel }>(\n `/api/db/collections/${this._collection}/auth-with-oauth2`,\n {\n method: 'POST',\n body: {\n provider: options.provider,\n scopes: options.scopes,\n createData: options.createData,\n },\n },\n )\n\n this.authStore.save(result.token, result.record)\n return { token: result.token, record: result.record }\n }\n\n /**\n * Refresh the current auth token.\n */\n async refreshToken(): Promise<AuthResponse> {\n const result = await this.http.send<{ token: string; record: RecordModel }>(\n `/api/db/collections/${this._collection}/auth-refresh`,\n { method: 'POST' },\n )\n\n this.authStore.save(result.token, result.record)\n this._notify('TOKEN_REFRESHED', result.record)\n return { token: result.token, record: result.record }\n }\n\n /**\n * Send a password reset email.\n */\n async requestPasswordReset(email: string): Promise<void> {\n await this.http.send(\n `/api/db/collections/${this._collection}/request-password-reset`,\n { method: 'POST', body: { email } },\n )\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.http.send(\n `/api/db/collections/${this._collection}/confirm-password-reset`,\n { method: 'POST', body: { token, password, passwordConfirm: passwordConfirm ?? password } },\n )\n }\n\n /**\n * Send an email verification email.\n */\n async requestVerification(email: string): Promise<void> {\n await this.http.send(\n `/api/db/collections/${this._collection}/request-verification`,\n { method: 'POST', body: { email } },\n )\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.http.send(\n `/api/db/collections/${this._collection}/confirm-verification`,\n { method: 'POST', body: { token } },\n )\n }\n\n /**\n * Sign out the current user. Clears the local auth store.\n */\n signOut(): void {\n this.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.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.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.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') console.log('Welcome', record.email)\n * })\n *\n * // Later:\n * unsubscribe()\n * ```\n */\n onStateChange(callback: AuthStateChangeCallback): () => void {\n this.listeners.add(callback)\n return () => { this.listeners.delete(callback) }\n }\n\n private _notify(event: AuthEvent, record: RecordModel | null): void {\n for (const cb of this.listeners) {\n try { cb(event, record) } catch { /* don't let one listener crash others */ }\n }\n }\n}\n","import type { PicoBaseHttpClient } from './http'\nimport type { PicoBaseRealtime } from './realtime'\nimport { RecordNotFoundError } from './errors'\nimport type { RecordModel, ListResult } from './types'\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 PicoBase 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({ title: 'Hello World', content: 'My first post' })\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 http: PicoBaseHttpClient\n private name: string\n private rt: PicoBaseRealtime\n\n constructor(http: PicoBaseHttpClient, name: string, realtime: PicoBaseRealtime) {\n this.http = http\n this.name = name\n this.rt = realtime\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 const { sort, filter, expand, fields, skipTotal, ...rest } = options\n const query: Record<string, unknown> = { page, perPage, ...rest }\n if (sort) query.sort = sort\n if (filter) query.filter = filter\n if (expand) query.expand = expand\n if (fields) query.fields = fields\n if (skipTotal) query.skipTotal = '1'\n\n return this.http.send<ListResult<T>>(\n `/api/db/collections/${this.name}/records`,\n { method: 'GET', query },\n )\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 const all: T[] = []\n let page = 1\n const perPage = 200\n\n while (true) {\n const result = await this.getList(page, perPage, options)\n all.push(...result.items)\n if (page >= result.totalPages) break\n page++\n }\n\n return all\n }\n\n /**\n * Fetch a single record by ID.\n */\n async getOne(id: string, options: RecordQueryOptions = {}): Promise<T> {\n const query: Record<string, unknown> = {}\n if (options.expand) query.expand = options.expand\n if (options.fields) query.fields = options.fields\n\n return this.http.send<T>(\n `/api/db/collections/${this.name}/records/${id}`,\n { method: 'GET', query: Object.keys(query).length ? query : undefined },\n )\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 const result = await this.getList(1, 1, { filter, ...options })\n if (!result.items.length) {\n throw new RecordNotFoundError(this.name, filter)\n }\n return result.items[0]\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(\n data: Record<string, unknown> | FormData,\n options: RecordQueryOptions = {},\n ): Promise<T> {\n const query: Record<string, unknown> = {}\n if (options.expand) query.expand = options.expand\n if (options.fields) query.fields = options.fields\n\n return this.http.send<T>(\n `/api/db/collections/${this.name}/records`,\n {\n method: 'POST',\n body: data as any,\n query: Object.keys(query).length ? query : undefined,\n },\n )\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(\n id: string,\n data: Record<string, unknown> | FormData,\n options: RecordQueryOptions = {},\n ): Promise<T> {\n const query: Record<string, unknown> = {}\n if (options.expand) query.expand = options.expand\n if (options.fields) query.fields = options.fields\n\n return this.http.send<T>(\n `/api/db/collections/${this.name}/records/${id}`,\n {\n method: 'PATCH',\n body: data as any,\n query: Object.keys(query).length ? query : undefined,\n },\n )\n }\n\n /**\n * Delete a record by ID.\n */\n async delete(id: string): Promise<boolean> {\n await this.http.send(\n `/api/db/collections/${this.name}/records/${id}`,\n { method: 'DELETE' },\n )\n return true\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 (client-side).\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 return this.rt.subscribe<T>(this.name, callback as any)\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 return this.rt.subscribeRecord<T>(this.name, id, callback as any)\n }\n}\n","import type { RecordModel, RecordSubscription, RealtimeAction } from './types'\n\ninterface InternalSubscription<T = RecordModel> {\n _id: string\n collection: string\n recordId?: string\n callback: (data: RecordSubscription<T>) => void\n}\n\n/**\n * Realtime module — subscribe to record changes via Server-Sent Events (SSE).\n *\n * For collection-level subscriptions, prefer `pb.collection('name').subscribe()`.\n * This module is for lower-level control.\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 * await pb.realtime.disconnectAll()\n * ```\n */\nexport class PicoBaseRealtime {\n private baseUrl: string\n private apiKey: string\n private getToken: () => string\n\n private eventSource: EventSource | null = null\n // key = collection or collection/recordId\n private subs: Map<string, Set<InternalSubscription>> = new Map()\n private counter = 0\n\n constructor(baseUrl: string, apiKey: string, getToken: () => string) {\n this.baseUrl = baseUrl\n this.apiKey = apiKey\n this.getToken = getToken\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 const id = this._addSub({ collection, callback: callback as any })\n this._ensureConnection()\n return async () => { this._removeSub(id) }\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 const id = this._addSub({ collection, recordId, callback: callback as any })\n this._ensureConnection()\n return async () => { this._removeSub(id) }\n }\n\n /**\n * Unsubscribe from all realtime events on a collection.\n */\n async unsubscribe(collection: string): Promise<void> {\n this.subs.delete(collection)\n this._pruneIfEmpty()\n }\n\n /**\n * Unsubscribe from ALL realtime events and close the SSE connection.\n */\n async disconnectAll(): Promise<void> {\n this.subs.clear()\n this._closeConnection()\n }\n\n // ── Private ───────────────────────────────────────────────────────────────\n\n private _addSub(sub: Omit<InternalSubscription, '_id'>): string {\n const id = `sub_${++this.counter}`\n const key = sub.recordId ? `${sub.collection}/${sub.recordId}` : sub.collection\n if (!this.subs.has(key)) this.subs.set(key, new Set())\n this.subs.get(key)!.add({ ...sub, _id: id } as InternalSubscription)\n return id\n }\n\n private _removeSub(id: string): void {\n for (const [key, set] of this.subs) {\n for (const sub of set) {\n if (sub._id === id) {\n set.delete(sub)\n if (set.size === 0) this.subs.delete(key)\n break\n }\n }\n }\n this._pruneIfEmpty()\n }\n\n private _pruneIfEmpty(): void {\n if (this.subs.size === 0) this._closeConnection()\n }\n\n /**\n * Open SSE connection to `/api/db/realtime`.\n * No-ops in environments where EventSource is unavailable (SSR / Node).\n */\n private _ensureConnection(): void {\n if (this.eventSource) return\n if (typeof EventSource === 'undefined') return // SSR / Node — skip\n\n const url = new URL(`${this.baseUrl}/api/db/realtime`)\n url.searchParams.set('apiKey', this.apiKey)\n const token = this.getToken()\n if (token) url.searchParams.set('token', token)\n\n const es = new EventSource(url.toString())\n this.eventSource = es\n\n es.onmessage = (event: MessageEvent) => {\n try {\n const data = JSON.parse(event.data) as {\n action: string\n collection: string\n record: RecordModel\n }\n this._dispatch(data)\n } catch { /* ignore malformed events */ }\n }\n\n // Also handle named events (action = \"create\" | \"update\" | \"delete\")\n for (const action of ['create', 'update', 'delete'] as RealtimeAction[]) {\n es.addEventListener(action, (event: MessageEvent) => {\n try {\n const data = JSON.parse(event.data) as {\n action: string\n collection: string\n record: RecordModel\n }\n this._dispatch(data)\n } catch { /* ignore */ }\n })\n }\n\n es.onerror = () => {\n // SSE auto-reconnects on error; close only if no subs remain\n if (this.subs.size === 0) this._closeConnection()\n }\n }\n\n private _closeConnection(): void {\n if (this.eventSource) {\n this.eventSource.close()\n this.eventSource = null\n }\n }\n\n private _dispatch(event: { action: string; collection: string; record: RecordModel }): void {\n const payload: RecordSubscription = {\n action: event.action as RealtimeAction,\n record: event.record,\n }\n\n // Collection-level subscribers\n const collSubs = this.subs.get(event.collection)\n if (collSubs) {\n for (const sub of collSubs) {\n try { sub.callback(payload) } catch { /* don't let one listener crash others */ }\n }\n }\n\n // Record-level subscribers\n const recordKey = `${event.collection}/${event.record?.id}`\n const recSubs = this.subs.get(recordKey)\n if (recSubs) {\n for (const sub of recSubs) {\n try { sub.callback(payload) } catch { /* don't let one listener crash others */ }\n }\n }\n }\n}\n","import type { PicoBaseHttpClient } from './http'\nimport type { RecordModel, FileOptions } from './types'\n\n/**\n * Storage module — work with file fields on PicoBase records.\n *\n * Files are served from `/api/db/files/:collection/:recordId/:filename`.\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', { thumb: '100x100' })\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 http: PicoBaseHttpClient\n private baseUrl: string\n\n constructor(baseUrl: string, http: PicoBaseHttpClient) {\n this.baseUrl = baseUrl\n this.http = http\n }\n\n /**\n * Get the URL for a file attached to a record.\n *\n * @param record - The record that owns the file. Must have `collectionName` and `id`.\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 collection = record.collectionName ?? ''\n const recordId = record.id\n let url = `${this.baseUrl}/api/db/files/${collection}/${recordId}/${filename}`\n\n const params = new URLSearchParams()\n if (options.thumb) params.set('thumb', options.thumb)\n if (options.token) params.set('token', options.token)\n if (options.download) params.set('download', '1')\n\n const qs = params.toString()\n if (qs) url += `?${qs}`\n return url\n }\n\n /**\n * Generate a temporary file access token for protected files.\n * Tokens are short-lived. Available after Phase 7 ships.\n */\n async getFileToken(): Promise<string> {\n const result = await this.http.send<{ token: string }>(\n '/api/db/files/token',\n { method: 'POST' },\n )\n return result.token\n }\n}\n","import type { PicoBaseHttpClient } from './http'\nimport type { CollectionModel } from './types'\n\n/**\n * Admin module — programmatic collection management.\n * Requires an admin API key.\n *\n * Breaking change from v0: `type` is now `\"flexible\" | \"strict\"` instead of `\"base\" | \"auth\" | \"view\"`.\n */\nexport class PicoBaseAdmin {\n private http: PicoBaseHttpClient\n\n constructor(http: PicoBaseHttpClient) {\n this.http = http\n }\n\n /**\n * Fetch a list of all collections.\n */\n async listCollections(): Promise<CollectionModel[]> {\n const result = await this.http.send<{ items: CollectionModel[] }>(\n '/api/db/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.http.send<CollectionModel>(\n `/api/db/collections/${idOrName}`,\n { method: 'GET' },\n )\n }\n\n /**\n * Create a new collection.\n *\n * @param data.type - `\"flexible\"` (JSONB, schema-free) or `\"strict\"` (typed SQL columns).\n */\n async createCollection(data: Partial<CollectionModel>): Promise<CollectionModel> {\n return this.http.send<CollectionModel>(\n '/api/db/collections',\n { method: 'POST', body: data as Record<string, unknown> },\n )\n }\n\n /**\n * Update an existing collection.\n */\n async updateCollection(idOrName: string, data: Partial<CollectionModel>): Promise<CollectionModel> {\n return this.http.send<CollectionModel>(\n `/api/db/collections/${idOrName}`,\n { method: 'PATCH', body: data as Record<string, unknown> },\n )\n }\n\n /**\n * Delete a collection.\n */\n async deleteCollection(idOrName: string): Promise<boolean> {\n try {\n await this.http.send(\n `/api/db/collections/${idOrName}`,\n { method: 'DELETE' },\n )\n return true\n } catch {\n return false\n }\n }\n}\n","import { PicoBaseHttpClient } from './http'\nimport { AuthStore } from './auth-store'\nimport { PicoBaseAuth } from './auth'\nimport { PicoBaseCollection } from './collection'\nimport { PicoBaseRealtime } from './realtime'\nimport { PicoBaseStorage } from './storage'\nimport { PicoBaseAdmin } from './admin'\nimport { ConfigurationError, RpcError } from './errors'\nimport type { PicoBaseClientOptions, RecordModel, SendOptions } from './types'\n\nconst DEFAULT_OPTIONS: Required<Omit<PicoBaseClientOptions, 'fetch'>> = {\n timeout: 30_000,\n maxColdStartRetries: 3,\n}\n\nexport class PicoBaseClient {\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 /** Internal HTTP client. */\n private readonly _http: PicoBaseHttpClient\n /** Internal auth store. */\n private readonly _authStore: AuthStore\n /** Normalized base URL (no trailing slash). */\n readonly baseUrl: string\n\n constructor(url: string, apiKey: string, options: PicoBaseClientOptions = {}) {\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 const mergedOptions = { ...DEFAULT_OPTIONS, ...options }\n\n // Normalize URL — strip trailing slash\n this.baseUrl = url.replace(/\\/+$/, '')\n\n this._authStore = new AuthStore()\n this._http = new PicoBaseHttpClient(this.baseUrl, apiKey, {\n timeout: mergedOptions.timeout,\n maxColdStartRetries: mergedOptions.maxColdStartRetries,\n fetch: options.fetch,\n getToken: () => this._authStore.token,\n })\n\n this.auth = new PicoBaseAuth(this._http, this._authStore)\n this.realtime = new PicoBaseRealtime(this.baseUrl, apiKey, () => this._authStore.token)\n this.storage = new PicoBaseStorage(this.baseUrl, this._http)\n this.admin = new PicoBaseAdmin(this._http)\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._http, name, this.realtime)\n }\n\n /**\n * Send a raw HTTP request to the PicoBase API.\n */\n async send<T = unknown>(path: string, options?: SendOptions): Promise<T> {\n return this._http.send<T>(path, options)\n }\n\n /**\n * Call a remote procedure (RPC) — convenience wrapper for custom API endpoints.\n *\n * Maps Supabase-style RPC calls: `pb.rpc('my_fn', params)` → `POST /api/rpc/my_fn`\n *\n * @example\n * ```ts\n * const result = await pb.rpc('calculate_total', { cart_id: '123' })\n * ```\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 const status = (err as { status?: number })?.status ?? 500\n const details = (err as { details?: unknown })?.details\n throw new RpcError(functionName, status, details)\n }\n }\n\n /**\n * Proactively warm up the Neon connection after scale-to-zero.\n *\n * Useful to call when a user navigates to a login page or before critical\n * operations, to absorb cold-start latency upfront.\n */\n async wake(): Promise<boolean> {\n try {\n await this.send('/api/db/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._authStore.token\n }\n\n /**\n * Check if a user is currently authenticated.\n */\n get isAuthenticated(): boolean {\n return this._authStore.isValid\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 */\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 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"]}