postbasejs 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/client.ts"],"sourcesContent":["export { createClient } from \"./client\";\nexport type {\n PostbaseClient,\n PostbaseClientOptions,\n QueryBuilder,\n QueryResult,\n SingleResult,\n AuthClient,\n AuthAdminClient,\n AuthResponse,\n AuthUser,\n AuthChangeEvent,\n Session,\n StorageClient,\n StorageBucketClient,\n StorageObject,\n Bucket,\n RealtimeChannel,\n RealtimePayload,\n RealtimeEvent,\n Filter,\n FilterOperator,\n CookieAdapter,\n} from \"./types\";\n","import type {\n PostbaseClient,\n PostbaseClientOptions,\n QueryBuilder,\n QueryResult,\n SingleResult,\n AuthClient,\n AuthAdminClient,\n AuthResponse,\n AuthUser,\n Session,\n AuthChangeEvent,\n StorageClient,\n StorageBucketClient,\n StorageObject,\n Bucket,\n RpcOptions,\n RealtimeChannel,\n RealtimePayload,\n RealtimeEvent,\n Filter,\n FilterOperator,\n SelectOptions,\n InsertBuilder,\n UpdateBuilder,\n DeleteBuilder,\n CookieAdapter,\n} from \"./types\";\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nconst SESSION_STORAGE_KEY = \"postbase_session\";\n\nfunction getStorageKey(options?: PostbaseClientOptions): string {\n return options?.auth?.storageKey ?? SESSION_STORAGE_KEY;\n}\n\nfunction isBrowser(): boolean {\n return typeof window !== \"undefined\" && typeof document !== \"undefined\";\n}\n\n// ─── Query Builder ────────────────────────────────────────────────────────────\n\ninterface QueryState<T> {\n baseUrl: string;\n apiKey: string;\n table: string;\n columns: string;\n selectOptions: SelectOptions;\n filters: Filter[];\n orFilters: string[];\n notFilters: Array<{ column: string; operator: string; value: unknown }>;\n orderBy: Array<{ column: string; ascending?: boolean; nullsFirst?: boolean }>;\n _limit?: number;\n _offset?: number;\n _range?: { from: number; to: number };\n operation: \"select\" | \"insert\" | \"update\" | \"delete\" | \"upsert\";\n insertData?: Partial<T> | Partial<T>[];\n upsertOnConflict?: string;\n updateData?: Partial<T>;\n returning?: string;\n customHeaders?: Record<string, string>;\n cookieAdapter?: CookieAdapter;\n}\n\nasync function executeQuery<T>(state: QueryState<T>): Promise<QueryResult<T>> {\n try {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${state.apiKey}`,\n ...state.customHeaders,\n };\n\n // Forward session cookie as bearer token if using SSR cookie adapter\n if (state.cookieAdapter) {\n const cookies = await state.cookieAdapter.getAll();\n const sessionCookie = cookies.find((c) => c.name.startsWith(\"postbase-session\") || c.name === \"next-auth.session-token\" || c.name === \"__Secure-next-auth.session-token\");\n if (sessionCookie) {\n headers[\"X-Postbase-Session\"] = sessionCookie.value;\n }\n }\n\n const body: Record<string, unknown> = {\n operation: state.operation === \"upsert\" ? \"upsert\" : state.operation,\n table: state.table,\n };\n\n if (state.operation === \"select\") {\n if (state.columns && state.columns !== \"*\") {\n body.columns = state.columns.split(\",\").map((c) => c.trim());\n }\n body.count = state.selectOptions.count;\n body.head = state.selectOptions.head;\n }\n\n if ([\"select\", \"update\", \"delete\"].includes(state.operation)) {\n const filters: Filter[] = [...state.filters];\n if (filters.length) body.filters = filters;\n if (state.orFilters.length) body.orFilters = state.orFilters;\n if (state.notFilters.length) body.notFilters = state.notFilters;\n }\n\n if (state.operation === \"insert\" || state.operation === \"upsert\") {\n body.data = state.insertData;\n if (state.upsertOnConflict) body.onConflict = state.upsertOnConflict;\n }\n\n if (state.operation === \"update\") {\n body.data = state.updateData;\n }\n\n if (state.orderBy.length) body.order = state.orderBy;\n if (state._limit !== undefined) body.limit = state._limit;\n if (state._offset !== undefined) body.offset = state._offset;\n if (state._range) body.range = state._range;\n if (state.returning) body.returning = state.returning;\n\n const res = await fetch(`${state.baseUrl}/api/db/query`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n });\n\n const json = await res.json();\n if (!res.ok) return { data: null, count: null, error: json.error ?? \"Query failed\" };\n return { data: json.data, count: json.count ?? null, error: null };\n } catch (err) {\n return { data: null, count: null, error: String(err) };\n }\n}\n\nclass QueryBuilderImpl<T> implements QueryBuilder<T> {\n private state: QueryState<T>;\n\n constructor(state: QueryState<T>) {\n this.state = state;\n }\n\n private clone(patch: Partial<QueryState<T>>): QueryBuilderImpl<T> {\n return new QueryBuilderImpl<T>({ ...this.state, ...patch });\n }\n\n select(columns = \"*\", options: SelectOptions = {}): QueryBuilderImpl<T> {\n return this.clone({ columns, selectOptions: options, operation: \"select\" });\n }\n\n private addFilter(column: string, operator: FilterOperator, value: unknown): QueryBuilderImpl<T> {\n return this.clone({ filters: [...this.state.filters, { column, operator, value }] });\n }\n\n eq(column: string, value: unknown) { return this.addFilter(column, \"eq\", value); }\n neq(column: string, value: unknown) { return this.addFilter(column, \"neq\", value); }\n gt(column: string, value: unknown) { return this.addFilter(column, \"gt\", value); }\n gte(column: string, value: unknown) { return this.addFilter(column, \"gte\", value); }\n lt(column: string, value: unknown) { return this.addFilter(column, \"lt\", value); }\n lte(column: string, value: unknown) { return this.addFilter(column, \"lte\", value); }\n like(column: string, pattern: string) { return this.addFilter(column, \"like\", pattern); }\n ilike(column: string, pattern: string) { return this.addFilter(column, \"ilike\", pattern); }\n in(column: string, values: unknown[]) { return this.addFilter(column, \"in\", values); }\n is(column: string, value: null | boolean) { return this.addFilter(column, \"is\", value); }\n contains(column: string, value: unknown) { return this.addFilter(column, \"contains\", value); }\n overlaps(column: string, value: unknown[]) { return this.addFilter(column, \"overlaps\", value); }\n textSearch(column: string, query: string, options?: { config?: string }) {\n return this.addFilter(column, \"textSearch\", { query, config: options?.config });\n }\n\n or(filters: string): QueryBuilderImpl<T> {\n return this.clone({ orFilters: [...this.state.orFilters, filters] });\n }\n\n not(column: string, operator: string, value: unknown): QueryBuilderImpl<T> {\n return this.clone({ notFilters: [...this.state.notFilters, { column, operator, value }] });\n }\n\n order(column: string, options?: { ascending?: boolean; nullsFirst?: boolean }): QueryBuilderImpl<T> {\n return this.clone({\n orderBy: [...this.state.orderBy, { column, ascending: options?.ascending, nullsFirst: options?.nullsFirst }],\n });\n }\n\n limit(count: number): QueryBuilderImpl<T> {\n return this.clone({ _limit: count });\n }\n\n offset(count: number): QueryBuilderImpl<T> {\n return this.clone({ _offset: count });\n }\n\n range(from: number, to: number): QueryBuilderImpl<T> {\n return this.clone({ _range: { from, to }, _limit: to - from + 1, _offset: from });\n }\n\n insert(data: Partial<T> | Partial<T>[], options?: { returning?: string }): InsertBuilderImpl<T> {\n return new InsertBuilderImpl<T>({\n ...this.state,\n operation: \"insert\",\n insertData: data,\n returning: options?.returning ?? \"*\",\n });\n }\n\n upsert(data: Partial<T> | Partial<T>[], options?: { onConflict?: string; returning?: string }): InsertBuilderImpl<T> {\n return new InsertBuilderImpl<T>({\n ...this.state,\n operation: \"upsert\",\n insertData: data,\n upsertOnConflict: options?.onConflict,\n returning: options?.returning ?? \"*\",\n });\n }\n\n update(data: Partial<T>): UpdateBuilderImpl<T> {\n return new UpdateBuilderImpl<T>({\n ...this.state,\n operation: \"update\",\n updateData: data,\n returning: \"*\",\n });\n }\n\n delete(): DeleteBuilderImpl<T> {\n return new DeleteBuilderImpl<T>({\n ...this.state,\n operation: \"delete\",\n returning: \"*\",\n });\n }\n\n async single(): Promise<SingleResult<T>> {\n const result = await executeQuery<T>(this.clone({ _limit: 1 }).state);\n if (result.error) return { data: null, error: result.error };\n const rows = result.data ?? [];\n if (rows.length === 0) return { data: null, error: \"No rows returned\" };\n if (rows.length > 1) return { data: null, error: \"Multiple rows returned\" };\n return { data: rows[0], error: null };\n }\n\n async maybeSingle(): Promise<SingleResult<T>> {\n const result = await executeQuery<T>(this.clone({ _limit: 1 }).state);\n if (result.error) return { data: null, error: result.error };\n const rows = result.data ?? [];\n return { data: rows[0] ?? null, error: null };\n }\n\n // Thenable — make the builder awaitable directly\n get then() {\n const promise = executeQuery<T>(this.state);\n return promise.then.bind(promise);\n }\n}\n\nclass InsertBuilderImpl<T> {\n private state: QueryState<T>;\n\n constructor(state: QueryState<T>) {\n this.state = state;\n }\n\n select(columns = \"*\"): InsertBuilderImpl<T> {\n return new InsertBuilderImpl<T>({ ...this.state, returning: columns });\n }\n\n async single(): Promise<SingleResult<T>> {\n const result = await executeQuery<T>(this.state);\n if (result.error) return { data: null, error: result.error };\n const rows = result.data ?? [];\n return { data: rows[0] ?? null, error: null };\n }\n\n get then() {\n const promise = executeQuery<T>(this.state);\n return promise.then.bind(promise);\n }\n}\n\nclass UpdateBuilderImpl<T> {\n private state: QueryState<T>;\n\n constructor(state: QueryState<T>) {\n this.state = state;\n }\n\n private addFilter(column: string, operator: FilterOperator, value: unknown): UpdateBuilderImpl<T> {\n return new UpdateBuilderImpl<T>({ ...this.state, filters: [...this.state.filters, { column, operator, value }] });\n }\n\n eq(column: string, value: unknown) { return this.addFilter(column, \"eq\", value); }\n neq(column: string, value: unknown) { return this.addFilter(column, \"neq\", value); }\n gt(column: string, value: unknown) { return this.addFilter(column, \"gt\", value); }\n gte(column: string, value: unknown) { return this.addFilter(column, \"gte\", value); }\n lt(column: string, value: unknown) { return this.addFilter(column, \"lt\", value); }\n lte(column: string, value: unknown) { return this.addFilter(column, \"lte\", value); }\n in(column: string, values: unknown[]) { return this.addFilter(column, \"in\", values); }\n\n select(columns = \"*\"): UpdateBuilderImpl<T> {\n return new UpdateBuilderImpl<T>({ ...this.state, returning: columns });\n }\n\n async single(): Promise<SingleResult<T>> {\n const result = await executeQuery<T>(this.state);\n if (result.error) return { data: null, error: result.error };\n const rows = result.data ?? [];\n return { data: rows[0] ?? null, error: null };\n }\n\n get then() {\n const promise = executeQuery<T>(this.state);\n return promise.then.bind(promise);\n }\n}\n\nclass DeleteBuilderImpl<T> {\n private state: QueryState<T>;\n\n constructor(state: QueryState<T>) {\n this.state = state;\n }\n\n private addFilter(column: string, operator: FilterOperator, value: unknown): DeleteBuilderImpl<T> {\n return new DeleteBuilderImpl<T>({ ...this.state, filters: [...this.state.filters, { column, operator, value }] });\n }\n\n eq(column: string, value: unknown) { return this.addFilter(column, \"eq\", value); }\n neq(column: string, value: unknown) { return this.addFilter(column, \"neq\", value); }\n gt(column: string, value: unknown) { return this.addFilter(column, \"gt\", value); }\n gte(column: string, value: unknown) { return this.addFilter(column, \"gte\", value); }\n lt(column: string, value: unknown) { return this.addFilter(column, \"lt\", value); }\n lte(column: string, value: unknown) { return this.addFilter(column, \"lte\", value); }\n in(column: string, values: unknown[]) { return this.addFilter(column, \"in\", values); }\n\n select(columns = \"*\"): DeleteBuilderImpl<T> {\n return new DeleteBuilderImpl<T>({ ...this.state, returning: columns });\n }\n\n async single(): Promise<SingleResult<T>> {\n const result = await executeQuery<T>(this.state);\n if (result.error) return { data: null, error: result.error };\n const rows = result.data ?? [];\n return { data: rows[0] ?? null, error: null };\n }\n\n get then() {\n const promise = executeQuery<T>(this.state);\n return promise.then.bind(promise);\n }\n}\n\n// ─── Auth Client ──────────────────────────────────────────────────────────────\n\nfunction createAuthAdmin(baseUrl: string, apiKey: string, customHeaders?: Record<string, string>): AuthAdminClient {\n const headers = () => ({\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n ...customHeaders,\n });\n\n return {\n async listUsers(options) {\n try {\n const url = new URL(`${baseUrl}/api/auth/v1/admin/users`);\n if (options?.page) url.searchParams.set(\"page\", String(options.page));\n if (options?.perPage) url.searchParams.set(\"perPage\", String(options.perPage));\n const res = await fetch(url.toString(), { headers: headers() });\n const json = await res.json();\n if (!res.ok) return { data: null, error: json.error ?? \"Failed to list users\" };\n return { data: { users: json.users, total: json.total }, error: null };\n } catch (err) {\n return { data: null, error: String(err) };\n }\n },\n\n async getUserById(id) {\n try {\n const res = await fetch(`${baseUrl}/api/auth/v1/admin/users/${id}`, { headers: headers() });\n const json = await res.json();\n if (!res.ok) return { data: { user: null }, error: json.error ?? \"User not found\" };\n return { data: { user: json.user }, error: null };\n } catch (err) {\n return { data: { user: null }, error: String(err) };\n }\n },\n\n async createUser(options) {\n try {\n const res = await fetch(`${baseUrl}/api/auth/v1/admin/users`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify(options),\n });\n const json = await res.json();\n if (!res.ok) return { data: { user: null }, error: json.error ?? \"Failed to create user\" };\n return { data: { user: json.user }, error: null };\n } catch (err) {\n return { data: { user: null }, error: String(err) };\n }\n },\n\n async updateUserById(id, attributes) {\n try {\n const res = await fetch(`${baseUrl}/api/auth/v1/admin/users/${id}`, {\n method: \"PATCH\",\n headers: headers(),\n body: JSON.stringify(attributes),\n });\n const json = await res.json();\n if (!res.ok) return { data: { user: null }, error: json.error ?? \"Failed to update user\" };\n return { data: { user: json.user }, error: null };\n } catch (err) {\n return { data: { user: null }, error: String(err) };\n }\n },\n\n async deleteUser(id) {\n try {\n const res = await fetch(`${baseUrl}/api/auth/v1/admin/users/${id}`, {\n method: \"DELETE\",\n headers: headers(),\n });\n const json = await res.json();\n if (!res.ok) return { data: null, error: json.error ?? \"Failed to delete user\" };\n return { data: null, error: null };\n } catch (err) {\n return { data: null, error: String(err) };\n }\n },\n };\n}\n\nfunction createAuthClient(\n baseUrl: string,\n apiKey: string,\n options?: PostbaseClientOptions,\n cookieAdapter?: CookieAdapter\n): AuthClient {\n const storageKey = getStorageKey(options);\n const listeners: Array<(event: AuthChangeEvent, session: Session | null) => void> = [];\n let refreshTimer: ReturnType<typeof setTimeout> | null = null;\n let currentSession: Session | null = null;\n\n const customHeaders = options?.global?.headers;\n\n const headers = () => ({\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n ...customHeaders,\n });\n\n function persistSession(session: Session | null): void {\n if (!isBrowser()) return;\n if (options?.auth?.persistSession === false) return;\n if (session) {\n localStorage.setItem(storageKey, JSON.stringify(session));\n } else {\n localStorage.removeItem(storageKey);\n }\n }\n\n function loadPersistedSession(): Session | null {\n if (!isBrowser()) return null;\n if (options?.auth?.persistSession === false) return null;\n try {\n const raw = localStorage.getItem(storageKey);\n if (!raw) return null;\n const session = JSON.parse(raw) as Session;\n // Check expiry\n if (session.expiresAt && Date.now() / 1000 > session.expiresAt) return null;\n return session;\n } catch {\n return null;\n }\n }\n\n function scheduleRefresh(session: Session): void {\n if (!isBrowser()) return;\n if (options?.auth?.autoRefreshToken === false) return;\n if (refreshTimer) clearTimeout(refreshTimer);\n const expiresIn = session.expiresAt - Date.now() / 1000;\n const refreshIn = Math.max((expiresIn - 60) * 1000, 0); // 1 minute before expiry\n refreshTimer = setTimeout(async () => {\n if (session.refreshToken) {\n const result = await authClient.refreshSession(session.refreshToken);\n if (!result.error && result.data.session) {\n notifyListeners(\"TOKEN_REFRESHED\", result.data.session);\n }\n }\n }, refreshIn);\n }\n\n function notifyListeners(event: AuthChangeEvent, session: Session | null): void {\n currentSession = session;\n persistSession(session);\n if (session) scheduleRefresh(session);\n listeners.forEach((fn) => fn(event, session));\n }\n\n const authClient: AuthClient = {\n async signUp({ email, password, options: signUpOptions }) {\n try {\n const res = await fetch(`${baseUrl}/api/auth/v1/signup`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify({ email, password, data: signUpOptions?.data }),\n });\n const json = await res.json();\n if (!res.ok) return { data: { user: null, session: null }, error: json.error ?? \"Sign up failed\" };\n const session: Session | null = json.session ?? null;\n const user: AuthUser | null = json.user ?? null;\n if (session) notifyListeners(\"SIGNED_IN\", session);\n return { data: { user, session }, error: null };\n } catch (err) {\n return { data: { user: null, session: null }, error: String(err) };\n }\n },\n\n async signInWithPassword({ email, password }) {\n try {\n const res = await fetch(`${baseUrl}/api/auth/v1/token`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify({ email, password, grant_type: \"password\" }),\n });\n const json = await res.json();\n if (!res.ok) return { data: { user: null, session: null }, error: json.error ?? \"Sign in failed\" };\n const session: Session = json.session;\n const user: AuthUser = json.user;\n notifyListeners(\"SIGNED_IN\", session);\n return { data: { user, session }, error: null };\n } catch (err) {\n return { data: { user: null, session: null }, error: String(err) };\n }\n },\n\n async signInWithOtp({ email, options: otpOptions }) {\n try {\n const res = await fetch(`${baseUrl}/api/auth/v1/otp`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify({ email, redirectTo: otpOptions?.redirectTo }),\n });\n const json = await res.json();\n if (!res.ok) return { data: null, error: json.error ?? \"OTP send failed\" };\n return { data: null, error: null };\n } catch (err) {\n return { data: null, error: String(err) };\n }\n },\n\n async signInWithOAuth({ provider, options: oauthOptions }) {\n if (!isBrowser()) return;\n const redirectTo = oauthOptions?.redirectTo ?? window.location.href;\n const url = new URL(`${baseUrl}/api/auth/${provider}`);\n url.searchParams.set(\"redirectTo\", redirectTo);\n if (oauthOptions?.scopes) url.searchParams.set(\"scopes\", oauthOptions.scopes);\n window.location.href = url.toString();\n },\n\n async signOut() {\n try {\n const session = currentSession ?? loadPersistedSession();\n await fetch(`${baseUrl}/api/auth/v1/logout`, {\n method: \"POST\",\n headers: {\n ...headers(),\n ...(session ? { \"X-Postbase-Token\": session.accessToken } : {}),\n },\n });\n if (refreshTimer) clearTimeout(refreshTimer);\n notifyListeners(\"SIGNED_OUT\", null);\n return { error: null };\n } catch (err) {\n return { error: String(err) };\n }\n },\n\n async getSession() {\n try {\n // SSR: read from cookie adapter\n if (cookieAdapter) {\n const cookies = await cookieAdapter.getAll();\n const sessionCookie = cookies.find((c) =>\n c.name.startsWith(\"postbase-session\") ||\n c.name === \"next-auth.session-token\" ||\n c.name === \"__Secure-next-auth.session-token\"\n );\n if (!sessionCookie) return { data: { session: null }, error: null };\n // Validate via server\n const res = await fetch(`${baseUrl}/api/auth/v1/session`, {\n headers: { ...headers(), \"X-Postbase-Session\": sessionCookie.value },\n });\n if (!res.ok) return { data: { session: null }, error: null };\n const json = await res.json();\n return { data: { session: json.session ?? null }, error: null };\n }\n\n // Browser: check localStorage\n if (isBrowser()) {\n const persisted = loadPersistedSession();\n if (persisted) {\n currentSession = persisted;\n return { data: { session: persisted }, error: null };\n }\n }\n\n // Fall back to server check\n const res = await fetch(`${baseUrl}/api/auth/v1/session`, { headers: headers() });\n if (!res.ok) return { data: { session: null }, error: null };\n const json = await res.json();\n return { data: { session: json.session ?? null }, error: null };\n } catch (err) {\n return { data: { session: null }, error: String(err) };\n }\n },\n\n async getUser(jwt?: string) {\n try {\n const token = jwt ?? currentSession?.accessToken ?? loadPersistedSession()?.accessToken;\n const res = await fetch(`${baseUrl}/api/auth/v1/user`, {\n headers: {\n ...headers(),\n ...(token ? { \"X-Postbase-Token\": token } : {}),\n },\n });\n const json = await res.json();\n if (!res.ok) return { data: { user: null }, error: json.error ?? \"Failed to get user\" };\n return { data: { user: json.user }, error: null };\n } catch (err) {\n return { data: { user: null }, error: String(err) };\n }\n },\n\n async refreshSession(refreshToken?: string) {\n try {\n const token = refreshToken ?? currentSession?.refreshToken ?? loadPersistedSession()?.refreshToken;\n const res = await fetch(`${baseUrl}/api/auth/v1/token`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify({ refresh_token: token, grant_type: \"refresh_token\" }),\n });\n const json = await res.json();\n if (!res.ok) return { data: { user: null, session: null }, error: json.error ?? \"Refresh failed\" };\n const session: Session = json.session;\n const user: AuthUser = json.user;\n notifyListeners(\"TOKEN_REFRESHED\", session);\n return { data: { user, session }, error: null };\n } catch (err) {\n return { data: { user: null, session: null }, error: String(err) };\n }\n },\n\n onAuthStateChange(callback) {\n listeners.push(callback);\n\n // Emit current session immediately\n const session = currentSession ?? loadPersistedSession();\n if (session) {\n setTimeout(() => callback(\"SIGNED_IN\", session), 0);\n currentSession = session;\n scheduleRefresh(session);\n }\n\n return {\n data: {\n subscription: {\n unsubscribe() {\n const idx = listeners.indexOf(callback);\n if (idx > -1) listeners.splice(idx, 1);\n },\n },\n },\n };\n },\n\n admin: createAuthAdmin(baseUrl, apiKey, customHeaders),\n };\n\n return authClient;\n}\n\n// ─── Storage Client ───────────────────────────────────────────────────────────\n\nfunction createStorageClient(\n baseUrl: string,\n apiKey: string,\n options?: PostbaseClientOptions\n): StorageClient {\n const customHeaders = options?.global?.headers;\n const headers = () => ({ Authorization: `Bearer ${apiKey}`, ...customHeaders });\n\n function bucketClient(bucket: string): StorageBucketClient {\n return {\n async upload(path, file, uploadOptions) {\n try {\n const form = new FormData();\n form.append(\"file\", file as Blob);\n form.append(\"path\", path);\n if (uploadOptions?.upsert) form.append(\"upsert\", \"true\");\n if (uploadOptions?.cacheControl) form.append(\"cacheControl\", uploadOptions.cacheControl);\n const res = await fetch(`${baseUrl}/api/storage/v1/object/${bucket}/${encodeURIComponent(path)}`, {\n method: uploadOptions?.upsert ? \"PUT\" : \"POST\",\n headers: headers(),\n body: form,\n });\n const json = await res.json();\n if (!res.ok) return { data: null, error: json.error ?? \"Upload failed\" };\n return { data: { path, fullPath: `${bucket}/${path}` }, error: null };\n } catch (err) {\n return { data: null, error: String(err) };\n }\n },\n\n async download(path) {\n try {\n const res = await fetch(`${baseUrl}/api/storage/v1/object/${bucket}/${encodeURIComponent(path)}`, {\n headers: headers(),\n });\n if (!res.ok) return { data: null, error: \"Download failed\" };\n return { data: await res.blob(), error: null };\n } catch (err) {\n return { data: null, error: String(err) };\n }\n },\n\n async remove(paths) {\n try {\n const res = await fetch(`${baseUrl}/api/storage/v1/object/${bucket}`, {\n method: \"DELETE\",\n headers: { ...headers(), \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ prefixes: paths }),\n });\n const json = await res.json();\n if (!res.ok) return { data: null, count: null, error: json.error ?? \"Delete failed\" };\n return { data: json.data, count: json.data?.length ?? null, error: null };\n } catch (err) {\n return { data: null, count: null, error: String(err) };\n }\n },\n\n async list(prefix, listOptions) {\n try {\n const res = await fetch(`${baseUrl}/api/storage/v1/object/list/${bucket}`, {\n method: \"POST\",\n headers: { ...headers(), \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n prefix: prefix ?? \"\",\n limit: listOptions?.limit ?? 100,\n offset: listOptions?.offset ?? 0,\n sortBy: listOptions?.sortBy,\n }),\n });\n const json = await res.json();\n if (!res.ok) return { data: null, count: null, error: json.error ?? \"List failed\" };\n return { data: json.data, count: json.data?.length ?? null, error: null };\n } catch (err) {\n return { data: null, count: null, error: String(err) };\n }\n },\n\n getPublicUrl(path) {\n return {\n data: { publicUrl: `${baseUrl}/api/storage/v1/object/public/${bucket}/${encodeURIComponent(path)}` },\n };\n },\n\n async createSignedUrl(path, expiresIn) {\n try {\n const res = await fetch(`${baseUrl}/api/storage/v1/object/sign/${bucket}/${encodeURIComponent(path)}`, {\n method: \"POST\",\n headers: { ...headers(), \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ expiresIn }),\n });\n const json = await res.json();\n if (!res.ok) return { data: null, error: json.error ?? \"Sign failed\" };\n return { data: { signedUrl: `${baseUrl}${json.signedUrl}` }, error: null };\n } catch (err) {\n return { data: null, error: String(err) };\n }\n },\n\n async move(fromPath, toPath) {\n try {\n const res = await fetch(`${baseUrl}/api/storage/v1/object/move`, {\n method: \"POST\",\n headers: { ...headers(), \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ bucketId: bucket, sourceKey: fromPath, destinationKey: toPath }),\n });\n const json = await res.json();\n if (!res.ok) return { error: json.error ?? \"Move failed\" };\n return { error: null };\n } catch (err) {\n return { error: String(err) };\n }\n },\n\n async copy(fromPath, toPath) {\n try {\n const res = await fetch(`${baseUrl}/api/storage/v1/object/copy`, {\n method: \"POST\",\n headers: { ...headers(), \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ bucketId: bucket, sourceKey: fromPath, destinationKey: toPath }),\n });\n const json = await res.json();\n if (!res.ok) return { data: null, error: json.error ?? \"Copy failed\" };\n return { data: { path: toPath }, error: null };\n } catch (err) {\n return { data: null, error: String(err) };\n }\n },\n };\n }\n\n return {\n from: bucketClient,\n\n async createBucket(name, bucketOptions) {\n try {\n const res = await fetch(`${baseUrl}/api/storage/v1/bucket`, {\n method: \"POST\",\n headers: { ...headers(), \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n name,\n id: name,\n public: bucketOptions?.public ?? false,\n file_size_limit: bucketOptions?.fileSizeLimit,\n allowed_mime_types: bucketOptions?.allowedMimeTypes,\n }),\n });\n const json = await res.json();\n if (!res.ok) return { data: null, error: json.error ?? \"Create bucket failed\" };\n return { data: json.data, error: null };\n } catch (err) {\n return { data: null, error: String(err) };\n }\n },\n\n async getBucket(id) {\n try {\n const res = await fetch(`${baseUrl}/api/storage/v1/bucket/${id}`, { headers: headers() });\n const json = await res.json();\n if (!res.ok) return { data: null, error: json.error ?? \"Get bucket failed\" };\n return { data: json.data, error: null };\n } catch (err) {\n return { data: null, error: String(err) };\n }\n },\n\n async listBuckets() {\n try {\n const res = await fetch(`${baseUrl}/api/storage/v1/bucket`, { headers: headers() });\n const json = await res.json();\n if (!res.ok) return { data: null, count: null, error: json.error ?? \"List buckets failed\" };\n return { data: json.data, count: json.data?.length ?? null, error: null };\n } catch (err) {\n return { data: null, count: null, error: String(err) };\n }\n },\n\n async updateBucket(id, bucketOptions) {\n try {\n const res = await fetch(`${baseUrl}/api/storage/v1/bucket/${id}`, {\n method: \"PUT\",\n headers: { ...headers(), \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n public: bucketOptions.public,\n file_size_limit: bucketOptions.fileSizeLimit,\n allowed_mime_types: bucketOptions.allowedMimeTypes,\n }),\n });\n const json = await res.json();\n if (!res.ok) return { data: null, error: json.error ?? \"Update bucket failed\" };\n return { data: json.data, error: null };\n } catch (err) {\n return { data: null, error: String(err) };\n }\n },\n\n async deleteBucket(id) {\n try {\n const res = await fetch(`${baseUrl}/api/storage/v1/bucket/${id}`, {\n method: \"DELETE\",\n headers: headers(),\n });\n const json = await res.json();\n if (!res.ok) return { error: json.error ?? \"Delete bucket failed\" };\n return { error: null };\n } catch (err) {\n return { error: String(err) };\n }\n },\n\n async emptyBucket(id) {\n try {\n const res = await fetch(`${baseUrl}/api/storage/v1/bucket/${id}/empty`, {\n method: \"POST\",\n headers: headers(),\n });\n const json = await res.json();\n if (!res.ok) return { error: json.error ?? \"Empty bucket failed\" };\n return { error: null };\n } catch (err) {\n return { error: String(err) };\n }\n },\n };\n}\n\n// ─── Realtime ─────────────────────────────────────────────────────────────────\n\nclass RealtimeChannelImpl implements RealtimeChannel {\n private handlers: Array<{ event: RealtimeEvent; callback: (payload: RealtimePayload) => void }> = [];\n private ws: WebSocket | null = null;\n private statusCallback?: (status: \"SUBSCRIBED\" | \"CLOSED\" | \"CHANNEL_ERROR\") => void;\n\n constructor(\n private baseUrl: string,\n private apiKey: string,\n private channelName: string\n ) {}\n\n on<T = Record<string, unknown>>(\n event: RealtimeEvent,\n callback: (payload: RealtimePayload<T>) => void\n ): RealtimeChannel {\n this.handlers.push({ event, callback: callback as (p: RealtimePayload) => void });\n return this;\n }\n\n subscribe(callback?: (status: \"SUBSCRIBED\" | \"CLOSED\" | \"CHANNEL_ERROR\") => void): RealtimeChannel {\n if (typeof window === \"undefined\") return this;\n this.statusCallback = callback;\n\n const wsUrl = this.baseUrl.replace(/^http/, \"ws\");\n try {\n this.ws = new WebSocket(`${wsUrl}/api/realtime?channel=${encodeURIComponent(this.channelName)}&apikey=${this.apiKey}`);\n\n this.ws.onopen = () => {\n this.statusCallback?.(\"SUBSCRIBED\");\n };\n\n this.ws.onmessage = (event) => {\n try {\n const payload = JSON.parse(event.data) as RealtimePayload;\n this.handlers.forEach(({ event: eventType, callback }) => {\n if (eventType === \"*\" || eventType === payload.eventType) {\n callback(payload);\n }\n });\n } catch {\n // ignore malformed messages\n }\n };\n\n this.ws.onerror = () => {\n this.statusCallback?.(\"CHANNEL_ERROR\");\n };\n\n this.ws.onclose = () => {\n this.statusCallback?.(\"CLOSED\");\n };\n } catch {\n this.statusCallback?.(\"CHANNEL_ERROR\");\n }\n\n return this;\n }\n\n unsubscribe(): void {\n this.ws?.close();\n this.ws = null;\n }\n}\n\n// ─── Main factory ─────────────────────────────────────────────────────────────\n\nconst channels = new Set<RealtimeChannelImpl>();\n\nexport function createClient(\n url: string,\n key: string,\n options?: PostbaseClientOptions\n): PostbaseClient {\n const baseUrl = url.replace(/\\/$/, \"\");\n const cookieAdapter = options?.cookies;\n\n const makeQueryState = <T>(table: string): QueryState<T> => ({\n baseUrl,\n apiKey: key,\n table,\n columns: \"*\",\n selectOptions: {},\n filters: [],\n orFilters: [],\n notFilters: [],\n orderBy: [],\n operation: \"select\",\n customHeaders: options?.global?.headers,\n cookieAdapter,\n });\n\n return {\n url: baseUrl,\n key,\n auth: createAuthClient(baseUrl, key, options, cookieAdapter),\n storage: createStorageClient(baseUrl, key, options),\n\n from<T = Record<string, unknown>>(table: string): QueryBuilder<T> {\n return new QueryBuilderImpl<T>(makeQueryState<T>(table)) as unknown as QueryBuilder<T>;\n },\n\n async rpc<T = Record<string, unknown>>(\n fn: string,\n args?: Record<string, unknown>,\n rpcOptions?: RpcOptions\n ): Promise<QueryResult<T>> {\n try {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${key}`,\n ...options?.global?.headers,\n };\n if (cookieAdapter) {\n const cookies = await cookieAdapter.getAll();\n const sessionCookie = cookies.find((c) =>\n c.name.startsWith(\"postbase-session\") ||\n c.name === \"next-auth.session-token\" ||\n c.name === \"__Secure-next-auth.session-token\"\n );\n if (sessionCookie) headers[\"X-Postbase-Session\"] = sessionCookie.value;\n }\n const res = await fetch(`${baseUrl}/api/rpc/${fn}`, {\n method: rpcOptions?.head ? \"HEAD\" : \"POST\",\n headers,\n body: JSON.stringify({ args: args ?? {}, count: rpcOptions?.count }),\n });\n const json = await res.json();\n if (!res.ok) return { data: null, count: null, error: json.error ?? \"RPC failed\" };\n return { data: json.data, count: json.count ?? null, error: null };\n } catch (err) {\n return { data: null, count: null, error: String(err) };\n }\n },\n\n channel(name: string): RealtimeChannel {\n const ch = new RealtimeChannelImpl(baseUrl, key, name);\n channels.add(ch);\n return ch;\n },\n\n removeChannel(channel: RealtimeChannel): void {\n channel.unsubscribe();\n channels.delete(channel as RealtimeChannelImpl);\n },\n\n removeAllChannels(): void {\n channels.forEach((ch) => ch.unsubscribe());\n channels.clear();\n },\n };\n}\n"],"mappings":"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","names":["res","json","callback"]}