@picobase_app/client 0.2.0 → 0.5.1

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":["../node_modules/pocketbase/src/ClientResponseError.ts","../node_modules/pocketbase/src/tools/cookie.ts","../node_modules/pocketbase/src/tools/jwt.ts","../node_modules/pocketbase/src/stores/BaseAuthStore.ts","../node_modules/pocketbase/src/stores/LocalAuthStore.ts","../node_modules/pocketbase/src/services/BaseService.ts","../node_modules/pocketbase/src/services/SettingsService.ts","../node_modules/pocketbase/src/tools/options.ts","../node_modules/pocketbase/src/services/RealtimeService.ts","../node_modules/pocketbase/src/services/CrudService.ts","../node_modules/pocketbase/src/tools/legacy.ts","../node_modules/pocketbase/src/tools/refresh.ts","../node_modules/pocketbase/src/services/RecordService.ts","../node_modules/pocketbase/src/services/CollectionService.ts","../node_modules/pocketbase/src/services/LogService.ts","../node_modules/pocketbase/src/services/HealthService.ts","../node_modules/pocketbase/src/services/FileService.ts","../node_modules/pocketbase/src/services/BackupService.ts","../node_modules/pocketbase/src/services/CronService.ts","../node_modules/pocketbase/src/tools/formdata.ts","../node_modules/pocketbase/src/services/BatchService.ts","../node_modules/pocketbase/src/Client.ts","../src/auth.ts","../src/collection.ts","../src/realtime.ts","../src/storage.ts","../src/errors.ts","../src/client.ts"],"names":["ClientResponseError","Error","errData","super","this","url","status","response","isAbort","originalError","Object","setPrototypeOf","prototype","data","DOMException","name","message","cause","includes","toJSON","fieldContentRegExp","cookieParse","str","options","result","decode","assign","defaultDecode","index","length","eqIdx","indexOf","endIdx","lastIndexOf","key","slice","trim","val","charCodeAt","_","cookieSerialize","opt","encode","defaultEncode","test","TypeError","value","maxAge","isNaN","isFinite","Math","floor","domain","path","expires","isDate","toString","call","Date","valueOf","toUTCString","httpOnly","secure","priority","toLowerCase","sameSite","decodeURIComponent","encodeURIComponent","isReactNative","navigator","product","global","HermesInternal","atobPolyfill","getTokenPayload","token","encodedPayload","split","map","c","join","JSON","parse","e","isTokenExpired","expirationThreshold","payload","keys","exp","now","atob","input","String","replace","bs","buffer","bc","idx","output","charAt","fromCharCode","defaultCookieKey","BaseAuthStore","constructor","baseToken","baseModel","_onChangeCallbacks","record","model","isValid","isSuperuser","type","collectionName","collectionId","isAdmin","console","warn","isAuthRecord","triggerChange","clear","cookie","rawData","Array","isArray","save","defaultOptions","stringify","resultLength","Blob","size","id","email","extraProps","prop","callback","fireImmediately","push","i","splice","LocalAuthStore","storageKey","storageFallback","_bindStorageEvent","_storageGet","_storageSet","_storageRemove","window","localStorage","rawValue","getItem","normalizedVal","setItem","removeItem","addEventListener","BaseService","client","SettingsService","method","send","bodyParams","body","filesystem","then","collectionIdOrName","toEmail","emailTemplate","template","collection","clientId","teamId","keyId","privateKey","duration","knownSendOptionsKeys","normalizeUnknownQueryParams","query","serializeQueryParams","params","encodedKey","arrValue","v","prepareQueryParamValue","toISOString","RealtimeService","eventSource","subscriptions","lastSentSubscriptions","maxConnectTimeout","reconnectAttempts","maxReconnectAttempts","Infinity","predefinedReconnectIntervals","pendingConnects","isConnected","topic","serialized","headers","listener","msgEvent","submitSubscriptions","connect","async","unsubscribeByTopicAndListener","needToSubmit","subs","getSubscriptionsByTopic","hasSubscriptionListeners","removeEventListener","disconnect","keyPrefix","hasAtleastOneTopic","startsWith","exist","keyToCheck","addAllSubscriptionListeners","getNonEmptySubscriptionKeys","requestKey","getSubscriptionsCancelKey","catch","err","removeAllSubscriptionListeners","Promise","resolve","reject","initConnect","clearTimeout","connectTimeoutId","setTimeout","connectErrorHandler","EventSource","buildURL","onerror","lastEventId","retries","hasUnsentSubscriptions","p","reconnectTimeoutId","connectSubs","latestTopics","t","timeout","fromReconnect","onDisconnect","cancelRequest","close","CrudService","batchOrqueryParams","_getFullList","batch","page","perPage","baseCrudPath","responseData","items","item","filter","skipTotal","getList","code","batchSize","request","list","concat","normalizeLegacyOptionsArgs","legacyWarn","baseOptions","bodyOrOptions","hasQuery","resetAutoRefresh","_resetAutoRefresh","RecordService","baseCollectionPath","isSuperusers","realtime","subscribe","unsubscribe","unsubscribeByPrefix","batchOrOptions","getFullList","getFirstListItem","getOne","create","update","authStore","authExpand","expand","authRecord","delete","success","fields","usernameOrEmail","password","autoRefreshThreshold","identity","autoRefresh","authData","authResponse","registerAutoRefresh","threshold","refreshFunc","reauthenticateFunc","oldBeforeSend","beforeSend","oldModel","unsubStoreChange","onChange","newToken","sendOptions","oldToken","authRefresh","authWithPassword","provider","codeVerifier","redirectURL","createData","args","authWithOAuth2Code","config","eagerDefaultPopup","urlCallback","openBrowserPopup","undefined","cleanup","requestKeyOptions","listAuthMethods","authMethods","oauth2","providers","find","cancelController","signal","onabort","oldState","state","error","scopes","replacements","_replaceQueryParams","authURL","location","href","passwordResetToken","passwordConfirm","verificationToken","verified","newEmail","emailChangeToken","recordId","ea","otpId","Authorization","Client","baseURL","lang","urlPath","substring","parsedParams","rawParams","param","pair","hasOwnProperty","open","width","height","windowWidth","innerWidth","windowHeight","innerHeight","left","top","CollectionService","collections","deleteMissing","LogService","HealthService","FileService","filename","queryParams","getURL","parts","download","URLSearchParams","BackupService","basename","getDownloadURL","CronService","jobId","isFile","File","uri","isFormData","FormData","hasFileField","values","inferNumberCharsRegex","inferFormDataValue","num","BatchService","requests","SubBatchService","formData","jsonData","req","json","files","file","append","prepareRequest","convertFormDataToObject","forEach","k","parsed","foundFiles","foundRegular","fileKey","endsWith","baseUrl","cancelControllers","recordServices","enableAutoCancellation","Deno","logs","settings","health","backups","crons","admins","createBatch","idOrName","enable","abort","cancelAllRequests","raw","replaceAll","origin","pathname","initSendOptions","getHeader","fetch","afterSend","convertToFormDataIfNeeded","form","$autoCancel","$cancelKey","controller","AbortController","s"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * ClientResponseError is a custom Error class that is intended to wrap\n * and normalize any error thrown by `Client.send()`.\n */\nexport class ClientResponseError extends Error {\n url: string = \"\";\n status: number = 0;\n response: { [key: string]: any } = {};\n isAbort: boolean = false;\n originalError: any = null;\n\n constructor(errData?: any) {\n super(\"ClientResponseError\");\n\n // Set the prototype explicitly.\n // https://github.com/Microsoft/TypeScript-wiki/blob/main/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work\n Object.setPrototypeOf(this, ClientResponseError.prototype);\n\n if (errData !== null && typeof errData === \"object\") {\n this.url = typeof errData.url === \"string\" ? errData.url : \"\";\n this.status = typeof errData.status === \"number\" ? errData.status : 0;\n this.isAbort = !!errData.isAbort;\n this.originalError = errData.originalError;\n\n if (errData.response !== null && typeof errData.response === \"object\") {\n this.response = errData.response;\n } else if (errData.data !== null && typeof errData.data === \"object\") {\n this.response = errData.data;\n } else {\n this.response = {};\n }\n }\n\n if (!this.originalError && !(errData instanceof ClientResponseError)) {\n this.originalError = errData;\n }\n\n if (typeof DOMException !== \"undefined\" && errData instanceof DOMException) {\n this.isAbort = true;\n }\n\n this.name = \"ClientResponseError \" + this.status;\n this.message = this.response?.message;\n if (!this.message) {\n if (this.isAbort) {\n this.message =\n \"The request was autocancelled. You can find more info in https://github.com/pocketbase/js-sdk#auto-cancellation.\";\n } else if (this.originalError?.cause?.message?.includes(\"ECONNREFUSED ::1\")) {\n this.message =\n \"Failed to connect to the PocketBase server. Try changing the SDK URL from localhost to 127.0.0.1 (https://github.com/pocketbase/js-sdk/issues/21).\";\n } else {\n this.message = \"Something went wrong while processing your request.\";\n }\n }\n }\n\n /**\n * Alias for `this.response` for backward compatibility.\n */\n get data() {\n return this.response;\n }\n\n /**\n * Make a POJO's copy of the current error class instance.\n * @see https://github.com/vuex-orm/vuex-orm/issues/255\n */\n toJSON() {\n return { ...this };\n }\n}\n","/**\n * -------------------------------------------------------------------\n * Simple cookie parse and serialize utilities mostly based on the\n * node module https://github.com/jshttp/cookie.\n * -------------------------------------------------------------------\n */\n\n/**\n * RegExp to match field-content in RFC 7230 sec 3.2\n *\n * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ]\n * field-vchar = VCHAR / obs-text\n * obs-text = %x80-FF\n */\nconst fieldContentRegExp = /^[\\u0009\\u0020-\\u007e\\u0080-\\u00ff]+$/;\n\nexport interface ParseOptions {\n decode?: (val: string) => string;\n}\n\n/**\n * Parses the given cookie header string into an object\n * The object has the various cookies as keys(names) => values\n */\nexport function cookieParse(str: string, options?: ParseOptions): { [key: string]: any } {\n const result: { [key: string]: any } = {};\n\n if (typeof str !== \"string\") {\n return result;\n }\n\n const opt = Object.assign({}, options || {});\n const decode = opt.decode || defaultDecode;\n\n let index = 0;\n while (index < str.length) {\n const eqIdx = str.indexOf(\"=\", index);\n\n // no more cookie pairs\n if (eqIdx === -1) {\n break;\n }\n\n let endIdx = str.indexOf(\";\", index);\n\n if (endIdx === -1) {\n endIdx = str.length;\n } else if (endIdx < eqIdx) {\n // backtrack on prior semicolon\n index = str.lastIndexOf(\";\", eqIdx - 1) + 1;\n continue;\n }\n\n const key = str.slice(index, eqIdx).trim();\n\n // only assign once\n if (undefined === result[key]) {\n let val = str.slice(eqIdx + 1, endIdx).trim();\n\n // quoted values\n if (val.charCodeAt(0) === 0x22) {\n val = val.slice(1, -1);\n }\n\n try {\n result[key] = decode(val);\n } catch (_) {\n result[key] = val; // no decoding\n }\n }\n\n index = endIdx + 1;\n }\n\n return result;\n}\n\nexport interface SerializeOptions {\n encode?: (val: string | number | boolean) => string;\n maxAge?: number;\n domain?: string;\n path?: string;\n expires?: Date;\n httpOnly?: boolean;\n secure?: boolean;\n priority?: string;\n sameSite?: boolean | string;\n}\n\n/**\n * Serialize data into a cookie header.\n *\n * Serialize the a name value pair into a cookie string suitable for\n * http headers. An optional options object specified cookie parameters.\n *\n * ```js\n * cookieSerialize('foo', 'bar', { httpOnly: true }) // \"foo=bar; httpOnly\"\n * ```\n */\nexport function cookieSerialize(\n name: string,\n val: string,\n options?: SerializeOptions,\n): string {\n const opt = Object.assign({}, options || {});\n const encode = opt.encode || defaultEncode;\n\n if (!fieldContentRegExp.test(name)) {\n throw new TypeError(\"argument name is invalid\");\n }\n\n const value = encode(val);\n\n if (value && !fieldContentRegExp.test(value)) {\n throw new TypeError(\"argument val is invalid\");\n }\n\n let result = name + \"=\" + value;\n\n if (opt.maxAge != null) {\n const maxAge = opt.maxAge - 0;\n\n if (isNaN(maxAge) || !isFinite(maxAge)) {\n throw new TypeError(\"option maxAge is invalid\");\n }\n\n result += \"; Max-Age=\" + Math.floor(maxAge);\n }\n\n if (opt.domain) {\n if (!fieldContentRegExp.test(opt.domain)) {\n throw new TypeError(\"option domain is invalid\");\n }\n\n result += \"; Domain=\" + opt.domain;\n }\n\n if (opt.path) {\n if (!fieldContentRegExp.test(opt.path)) {\n throw new TypeError(\"option path is invalid\");\n }\n\n result += \"; Path=\" + opt.path;\n }\n\n if (opt.expires) {\n if (!isDate(opt.expires) || isNaN(opt.expires.valueOf())) {\n throw new TypeError(\"option expires is invalid\");\n }\n\n result += \"; Expires=\" + opt.expires.toUTCString();\n }\n\n if (opt.httpOnly) {\n result += \"; HttpOnly\";\n }\n\n if (opt.secure) {\n result += \"; Secure\";\n }\n\n if (opt.priority) {\n const priority =\n typeof opt.priority === \"string\" ? opt.priority.toLowerCase() : opt.priority;\n\n switch (priority) {\n case \"low\":\n result += \"; Priority=Low\";\n break;\n case \"medium\":\n result += \"; Priority=Medium\";\n break;\n case \"high\":\n result += \"; Priority=High\";\n break;\n default:\n throw new TypeError(\"option priority is invalid\");\n }\n }\n\n if (opt.sameSite) {\n const sameSite =\n typeof opt.sameSite === \"string\" ? opt.sameSite.toLowerCase() : opt.sameSite;\n\n switch (sameSite) {\n case true:\n result += \"; SameSite=Strict\";\n break;\n case \"lax\":\n result += \"; SameSite=Lax\";\n break;\n case \"strict\":\n result += \"; SameSite=Strict\";\n break;\n case \"none\":\n result += \"; SameSite=None\";\n break;\n default:\n throw new TypeError(\"option sameSite is invalid\");\n }\n }\n\n return result;\n}\n\n/**\n * Default URL-decode string value function.\n * Optimized to skip native call when no `%`.\n */\nfunction defaultDecode(val: string): string {\n return val.indexOf(\"%\") !== -1 ? decodeURIComponent(val) : val;\n}\n\n/**\n * Default URL-encode value function.\n */\nfunction defaultEncode(val: string | number | boolean): string {\n return encodeURIComponent(val);\n}\n\n/**\n * Determines if value is a Date.\n */\nfunction isDate(val: any): boolean {\n return Object.prototype.toString.call(val) === \"[object Date]\" || val instanceof Date;\n}\n","// @todo remove after https://github.com/reactwg/react-native-releases/issues/287\nconst isReactNative =\n (typeof navigator !== \"undefined\" && navigator.product === \"ReactNative\") ||\n (typeof global !== \"undefined\" && (global as any).HermesInternal);\n\nlet atobPolyfill: Function;\nif (typeof atob === \"function\" && !isReactNative) {\n atobPolyfill = atob;\n} else {\n /**\n * The code was extracted from:\n * https://github.com/davidchambers/Base64.js\n */\n atobPolyfill = (input: any) => {\n const chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n\n let str = String(input).replace(/=+$/, \"\");\n if (str.length % 4 == 1) {\n throw new Error(\n \"'atob' failed: The string to be decoded is not correctly encoded.\",\n );\n }\n\n for (\n // initialize result and counters\n var bc = 0, bs, buffer, idx = 0, output = \"\";\n // get next character\n (buffer = str.charAt(idx++));\n // character found in table? initialize bit storage and add its ascii value;\n ~buffer &&\n ((bs = bc % 4 ? (bs as any) * 64 + buffer : buffer),\n // and if not first of each 4 characters,\n // convert the first 8 bits to one ascii character\n bc++ % 4)\n ? (output += String.fromCharCode(255 & (bs >> ((-2 * bc) & 6))))\n : 0\n ) {\n // try to find character in table (0-63, not found => -1)\n buffer = chars.indexOf(buffer);\n }\n\n return output;\n };\n}\n\n/**\n * Returns JWT token's payload data.\n */\nexport function getTokenPayload(token: string): { [key: string]: any } {\n if (token) {\n try {\n const encodedPayload = decodeURIComponent(\n atobPolyfill(token.split(\".\")[1])\n .split(\"\")\n .map(function (c: string) {\n return \"%\" + (\"00\" + c.charCodeAt(0).toString(16)).slice(-2);\n })\n .join(\"\"),\n );\n\n return JSON.parse(encodedPayload) || {};\n } catch (e) {}\n }\n\n return {};\n}\n\n/**\n * Checks whether a JWT token is expired or not.\n * Tokens without `exp` payload key are considered valid.\n * Tokens with empty payload (eg. invalid token strings) are considered expired.\n *\n * @param token The token to check.\n * @param [expirationThreshold] Time in seconds that will be subtracted from the token `exp` property.\n */\nexport function isTokenExpired(token: string, expirationThreshold = 0): boolean {\n let payload = getTokenPayload(token);\n\n if (\n Object.keys(payload).length > 0 &&\n (!payload.exp || payload.exp - expirationThreshold > Date.now() / 1000)\n ) {\n return false;\n }\n\n return true;\n}\n","import { cookieParse, cookieSerialize, SerializeOptions } from \"@/tools/cookie\";\nimport { isTokenExpired, getTokenPayload } from \"@/tools/jwt\";\nimport { RecordModel } from \"@/tools/dtos\";\n\nexport type AuthRecord = RecordModel | null;\n\nexport type AuthModel = AuthRecord; // for backward compatibility\n\nexport type OnStoreChangeFunc = (token: string, record: AuthRecord) => void;\n\nconst defaultCookieKey = \"pb_auth\";\n\n/**\n * Base AuthStore class that stores the auth state in runtime memory (aka. only for the duration of the store instane).\n *\n * Usually you wouldn't use it directly and instead use the builtin LocalAuthStore, AsyncAuthStore\n * or extend it with your own custom implementation.\n */\nexport class BaseAuthStore {\n protected baseToken: string = \"\";\n protected baseModel: AuthRecord = null;\n\n private _onChangeCallbacks: Array<OnStoreChangeFunc> = [];\n\n /**\n * Retrieves the stored token (if any).\n */\n get token(): string {\n return this.baseToken;\n }\n\n /**\n * Retrieves the stored model data (if any).\n */\n get record(): AuthRecord {\n return this.baseModel;\n }\n\n /**\n * @deprecated use `record` instead.\n */\n get model(): AuthRecord {\n return this.baseModel;\n }\n\n /**\n * Loosely checks if the store has valid token (aka. existing and unexpired exp claim).\n */\n get isValid(): boolean {\n return !isTokenExpired(this.token);\n }\n\n /**\n * Loosely checks whether the currently loaded store state is for superuser.\n *\n * Alternatively you can also compare directly `pb.authStore.record?.collectionName`.\n */\n get isSuperuser(): boolean {\n let payload = getTokenPayload(this.token);\n\n return (\n payload.type == \"auth\" &&\n (this.record?.collectionName == \"_superusers\" ||\n // fallback in case the record field is not populated and assuming\n // that the collection crc32 checksum id wasn't manually changed\n (!this.record?.collectionName &&\n payload.collectionId == \"pbc_3142635823\"))\n );\n }\n\n /**\n * @deprecated use `isSuperuser` instead or simply check the record.collectionName property.\n */\n get isAdmin(): boolean {\n console.warn(\n \"Please replace pb.authStore.isAdmin with pb.authStore.isSuperuser OR simply check the value of pb.authStore.record?.collectionName\",\n );\n return this.isSuperuser;\n }\n\n /**\n * @deprecated use `!isSuperuser` instead or simply check the record.collectionName property.\n */\n get isAuthRecord(): boolean {\n console.warn(\n \"Please replace pb.authStore.isAuthRecord with !pb.authStore.isSuperuser OR simply check the value of pb.authStore.record?.collectionName\",\n );\n return getTokenPayload(this.token).type == \"auth\" && !this.isSuperuser;\n }\n\n /**\n * Saves the provided new token and model data in the auth store.\n */\n save(token: string, record?: AuthRecord): void {\n this.baseToken = token || \"\";\n this.baseModel = record || null;\n\n this.triggerChange();\n }\n\n /**\n * Removes the stored token and model data form the auth store.\n */\n clear(): void {\n this.baseToken = \"\";\n this.baseModel = null;\n this.triggerChange();\n }\n\n /**\n * Parses the provided cookie string and updates the store state\n * with the cookie's token and model data.\n *\n * NB! This function doesn't validate the token or its data.\n * Usually this isn't a concern if you are interacting only with the\n * PocketBase API because it has the proper server-side security checks in place,\n * but if you are using the store `isValid` state for permission controls\n * in a node server (eg. SSR), then it is recommended to call `authRefresh()`\n * after loading the cookie to ensure an up-to-date token and model state.\n * For example:\n *\n * ```js\n * pb.authStore.loadFromCookie(\"cookie string...\");\n *\n * try {\n * // get an up-to-date auth store state by veryfing and refreshing the loaded auth model (if any)\n * pb.authStore.isValid && await pb.collection('users').authRefresh();\n * } catch (_) {\n * // clear the auth store on failed refresh\n * pb.authStore.clear();\n * }\n * ```\n */\n loadFromCookie(cookie: string, key = defaultCookieKey): void {\n const rawData = cookieParse(cookie || \"\")[key] || \"\";\n\n let data: { [key: string]: any } = {};\n try {\n data = JSON.parse(rawData);\n // normalize\n if (typeof data === null || typeof data !== \"object\" || Array.isArray(data)) {\n data = {};\n }\n } catch (_) {}\n\n this.save(data.token || \"\", data.record || data.model || null);\n }\n\n /**\n * Exports the current store state as cookie string.\n *\n * By default the following optional attributes are added:\n * - Secure\n * - HttpOnly\n * - SameSite=Strict\n * - Path=/\n * - Expires={the token expiration date}\n *\n * NB! If the generated cookie exceeds 4096 bytes, this method will\n * strip the model data to the bare minimum to try to fit within the\n * recommended size in https://www.rfc-editor.org/rfc/rfc6265#section-6.1.\n */\n exportToCookie(options?: SerializeOptions, key = defaultCookieKey): string {\n const defaultOptions: SerializeOptions = {\n secure: true,\n sameSite: true,\n httpOnly: true,\n path: \"/\",\n };\n\n // extract the token expiration date\n const payload = getTokenPayload(this.token);\n if (payload?.exp) {\n defaultOptions.expires = new Date(payload.exp * 1000);\n } else {\n defaultOptions.expires = new Date(\"1970-01-01\");\n }\n\n // merge with the user defined options\n options = Object.assign({}, defaultOptions, options);\n\n const rawData = {\n token: this.token,\n record: this.record ? JSON.parse(JSON.stringify(this.record)) : null,\n };\n\n let result = cookieSerialize(key, JSON.stringify(rawData), options);\n\n const resultLength =\n typeof Blob !== \"undefined\" ? new Blob([result]).size : result.length;\n\n // strip down the model data to the bare minimum\n if (rawData.record && resultLength > 4096) {\n rawData.record = { id: rawData.record?.id, email: rawData.record?.email };\n const extraProps = [\"collectionId\", \"collectionName\", \"verified\"];\n for (const prop in this.record) {\n if (extraProps.includes(prop)) {\n rawData.record[prop] = this.record[prop];\n }\n }\n result = cookieSerialize(key, JSON.stringify(rawData), options);\n }\n\n return result;\n }\n\n /**\n * Register a callback function that will be called on store change.\n *\n * You can set the `fireImmediately` argument to true in order to invoke\n * the provided callback right after registration.\n *\n * Returns a removal function that you could call to \"unsubscribe\" from the changes.\n */\n onChange(callback: OnStoreChangeFunc, fireImmediately = false): () => void {\n this._onChangeCallbacks.push(callback);\n\n if (fireImmediately) {\n callback(this.token, this.record);\n }\n\n return () => {\n for (let i = this._onChangeCallbacks.length - 1; i >= 0; i--) {\n if (this._onChangeCallbacks[i] == callback) {\n delete this._onChangeCallbacks[i]; // removes the function reference\n this._onChangeCallbacks.splice(i, 1); // reindex the array\n return;\n }\n }\n };\n }\n\n protected triggerChange(): void {\n for (const callback of this._onChangeCallbacks) {\n callback && callback(this.token, this.record);\n }\n }\n}\n","import { BaseAuthStore, AuthRecord } from \"@/stores/BaseAuthStore\";\n\n/**\n * The default token store for browsers with auto fallback\n * to runtime/memory if local storage is undefined (e.g. in node env).\n */\nexport class LocalAuthStore extends BaseAuthStore {\n private storageFallback: { [key: string]: any } = {};\n private storageKey: string;\n\n constructor(storageKey = \"pocketbase_auth\") {\n super();\n\n this.storageKey = storageKey;\n\n this._bindStorageEvent();\n }\n\n /**\n * @inheritdoc\n */\n get token(): string {\n const data = this._storageGet(this.storageKey) || {};\n\n return data.token || \"\";\n }\n\n /**\n * @inheritdoc\n */\n get record(): AuthRecord {\n const data = this._storageGet(this.storageKey) || {};\n\n return data.record || data.model || null;\n }\n\n /**\n * @deprecated use `record` instead.\n */\n get model(): AuthRecord {\n return this.record;\n }\n\n /**\n * @inheritdoc\n */\n save(token: string, record?: AuthRecord) {\n this._storageSet(this.storageKey, {\n token: token,\n record: record,\n });\n\n super.save(token, record);\n }\n\n /**\n * @inheritdoc\n */\n clear() {\n this._storageRemove(this.storageKey);\n\n super.clear();\n }\n\n // ---------------------------------------------------------------\n // Internal helpers:\n // ---------------------------------------------------------------\n\n /**\n * Retrieves `key` from the browser's local storage\n * (or runtime/memory if local storage is undefined).\n */\n private _storageGet(key: string): any {\n if (typeof window !== \"undefined\" && window?.localStorage) {\n const rawValue = window.localStorage.getItem(key) || \"\";\n try {\n return JSON.parse(rawValue);\n } catch (e) {\n // not a json\n return rawValue;\n }\n }\n\n // fallback\n return this.storageFallback[key];\n }\n\n /**\n * Stores a new data in the browser's local storage\n * (or runtime/memory if local storage is undefined).\n */\n private _storageSet(key: string, value: any) {\n if (typeof window !== \"undefined\" && window?.localStorage) {\n // store in local storage\n let normalizedVal = value;\n if (typeof value !== \"string\") {\n normalizedVal = JSON.stringify(value);\n }\n window.localStorage.setItem(key, normalizedVal);\n } else {\n // store in fallback\n this.storageFallback[key] = value;\n }\n }\n\n /**\n * Removes `key` from the browser's local storage and the runtime/memory.\n */\n private _storageRemove(key: string) {\n // delete from local storage\n if (typeof window !== \"undefined\" && window?.localStorage) {\n window.localStorage?.removeItem(key);\n }\n\n // delete from fallback\n delete this.storageFallback[key];\n }\n\n /**\n * Updates the current store state on localStorage change.\n */\n private _bindStorageEvent() {\n if (\n typeof window === \"undefined\" ||\n !window?.localStorage ||\n !window.addEventListener\n ) {\n return;\n }\n\n window.addEventListener(\"storage\", (e) => {\n if (e.key != this.storageKey) {\n return;\n }\n\n const data = this._storageGet(this.storageKey) || {};\n\n super.save(data.token || \"\", data.record || data.model || null);\n });\n }\n}\n","import Client from \"@/Client\";\n\n/**\n * BaseService class that should be inherited from all API services.\n */\nexport abstract class BaseService {\n readonly client: Client;\n\n constructor(client: Client) {\n this.client = client;\n }\n}\n","import { BaseService } from \"@/services/BaseService\";\nimport { CommonOptions } from \"@/tools/options\";\n\ninterface appleClientSecret {\n secret: string;\n}\n\nexport class SettingsService extends BaseService {\n /**\n * Fetch all available app settings.\n *\n * @throws {ClientResponseError}\n */\n async getAll(options?: CommonOptions): Promise<{ [key: string]: any }> {\n options = Object.assign(\n {\n method: \"GET\",\n },\n options,\n );\n\n return this.client.send(\"/api/settings\", options);\n }\n\n /**\n * Bulk updates app settings.\n *\n * @throws {ClientResponseError}\n */\n async update(\n bodyParams?: { [key: string]: any } | FormData,\n options?: CommonOptions,\n ): Promise<{ [key: string]: any }> {\n options = Object.assign(\n {\n method: \"PATCH\",\n body: bodyParams,\n },\n options,\n );\n\n return this.client.send(\"/api/settings\", options);\n }\n\n /**\n * Performs a S3 filesystem connection test.\n *\n * The currently supported `filesystem` are \"storage\" and \"backups\".\n *\n * @throws {ClientResponseError}\n */\n async testS3(\n filesystem: string = \"storage\",\n options?: CommonOptions,\n ): Promise<boolean> {\n options = Object.assign(\n {\n method: \"POST\",\n body: {\n filesystem: filesystem,\n },\n },\n options,\n );\n\n return this.client.send(\"/api/settings/test/s3\", options).then(() => true);\n }\n\n /**\n * Sends a test email.\n *\n * The possible `emailTemplate` values are:\n * - verification\n * - password-reset\n * - email-change\n *\n * @throws {ClientResponseError}\n */\n async testEmail(\n collectionIdOrName: string,\n toEmail: string,\n emailTemplate: string,\n options?: CommonOptions,\n ): Promise<boolean> {\n options = Object.assign(\n {\n method: \"POST\",\n body: {\n email: toEmail,\n template: emailTemplate,\n collection: collectionIdOrName,\n },\n },\n options,\n );\n\n return this.client.send(\"/api/settings/test/email\", options).then(() => true);\n }\n\n /**\n * Generates a new Apple OAuth2 client secret.\n *\n * @throws {ClientResponseError}\n */\n async generateAppleClientSecret(\n clientId: string,\n teamId: string,\n keyId: string,\n privateKey: string,\n duration: number,\n options?: CommonOptions,\n ): Promise<appleClientSecret> {\n options = Object.assign(\n {\n method: \"POST\",\n body: {\n clientId,\n teamId,\n keyId,\n privateKey,\n duration,\n },\n },\n options,\n );\n\n return this.client.send(\"/api/settings/apple/generate-client-secret\", options);\n }\n}\n","export interface SendOptions extends RequestInit {\n // for backward compatibility and to minimize the verbosity,\n // any top-level field that doesn't exist in RequestInit or the\n // fields below will be treated as query parameter.\n [key: string]: any;\n\n /**\n * Optional custom fetch function to use for sending the request.\n */\n fetch?: (url: RequestInfo | URL, config?: RequestInit) => Promise<Response>;\n\n /**\n * Custom headers to send with the requests.\n */\n headers?: { [key: string]: string };\n\n /**\n * The body of the request (serialized automatically for json requests).\n */\n body?: any;\n\n /**\n * Query parameters that will be appended to the request url.\n */\n query?: { [key: string]: any };\n\n /**\n * @deprecated use `query` instead\n *\n * for backward-compatibility `params` values are merged with `query`,\n * but this option may get removed in the final v1 release\n */\n params?: { [key: string]: any };\n\n /**\n * The request identifier that can be used to cancel pending requests.\n */\n requestKey?: string | null;\n\n /**\n * @deprecated use `requestKey:string` instead\n */\n $cancelKey?: string;\n\n /**\n * @deprecated use `requestKey:null` instead\n */\n $autoCancel?: boolean;\n}\n\nexport interface CommonOptions extends SendOptions {\n fields?: string;\n}\n\nexport interface ListOptions extends CommonOptions {\n page?: number;\n perPage?: number;\n sort?: string;\n filter?: string;\n skipTotal?: boolean;\n}\n\nexport interface FullListOptions extends ListOptions {\n batch?: number;\n}\n\nexport interface RecordOptions extends CommonOptions {\n expand?: string;\n}\n\nexport interface RecordListOptions extends ListOptions, RecordOptions {}\n\nexport interface RecordFullListOptions extends FullListOptions, RecordOptions {}\n\nexport interface RecordSubscribeOptions extends SendOptions {\n fields?: string;\n filter?: string;\n expand?: string;\n}\n\nexport interface LogStatsOptions extends CommonOptions {\n filter?: string;\n}\n\nexport interface FileOptions extends CommonOptions {\n thumb?: string;\n download?: boolean;\n}\n\nexport interface AuthOptions extends CommonOptions {\n /**\n * If autoRefreshThreshold is set it will take care to auto refresh\n * when necessary the auth data before each request to ensure that\n * the auth state is always valid.\n *\n * The value must be in seconds, aka. the amount of seconds\n * that will be subtracted from the current token `exp` claim in order\n * to determine whether it is going to expire within the specified time threshold.\n *\n * For example, if you want to auto refresh the token if it is\n * going to expire in the next 30mins (or already has expired),\n * it can be set to `1800`\n */\n autoRefreshThreshold?: number;\n}\n\n// -------------------------------------------------------------------\n\n// list of known SendOptions keys (everything else is treated as query param)\nconst knownSendOptionsKeys = [\n \"requestKey\",\n \"$cancelKey\",\n \"$autoCancel\",\n \"fetch\",\n \"headers\",\n \"body\",\n \"query\",\n \"params\",\n // ---,\n \"cache\",\n \"credentials\",\n \"headers\",\n \"integrity\",\n \"keepalive\",\n \"method\",\n \"mode\",\n \"redirect\",\n \"referrer\",\n \"referrerPolicy\",\n \"signal\",\n \"window\",\n];\n\n// modifies in place the provided options by moving unknown send options as query parameters.\nexport function normalizeUnknownQueryParams(options?: SendOptions): void {\n if (!options) {\n return;\n }\n\n options.query = options.query || {};\n for (let key in options) {\n if (knownSendOptionsKeys.includes(key)) {\n continue;\n }\n\n options.query[key] = options[key];\n delete options[key];\n }\n}\n\nexport function serializeQueryParams(params: { [key: string]: any }): string {\n const result: Array<string> = [];\n\n for (const key in params) {\n const encodedKey = encodeURIComponent(key);\n const arrValue = Array.isArray(params[key]) ? params[key] : [params[key]];\n\n for (let v of arrValue) {\n v = prepareQueryParamValue(v);\n if (v === null) {\n continue\n }\n result.push(encodedKey + \"=\" + v);\n }\n }\n\n return result.join(\"&\");\n}\n\n// encodes and normalizes the provided query param value.\nfunction prepareQueryParamValue(value: any): null|string {\n if (value === null || typeof value === \"undefined\") {\n return null;\n }\n\n if (value instanceof Date) {\n return encodeURIComponent(value.toISOString().replace(\"T\", \" \"));\n }\n\n if (typeof value === \"object\") {\n return encodeURIComponent(JSON.stringify(value));\n }\n\n return encodeURIComponent(value)\n}\n","import { ClientResponseError } from \"@/ClientResponseError\";\nimport { BaseService } from \"@/services/BaseService\";\nimport { SendOptions, normalizeUnknownQueryParams } from \"@/tools/options\";\n\ninterface promiseCallbacks {\n resolve: Function;\n reject: Function;\n}\n\ntype Subscriptions = { [key: string]: Array<EventListener> };\n\nexport type UnsubscribeFunc = () => Promise<void>;\n\nexport class RealtimeService extends BaseService {\n clientId: string = \"\";\n\n private eventSource: EventSource | null = null;\n private subscriptions: Subscriptions = {};\n private lastSentSubscriptions: Array<string> = [];\n private connectTimeoutId: any;\n private maxConnectTimeout: number = 15000;\n private reconnectTimeoutId: any;\n private reconnectAttempts: number = 0;\n private maxReconnectAttempts: number = Infinity;\n private predefinedReconnectIntervals: Array<number> = [\n 200, 300, 500, 1000, 1200, 1500, 2000,\n ];\n private pendingConnects: Array<promiseCallbacks> = [];\n\n /**\n * Returns whether the realtime connection has been established.\n */\n get isConnected(): boolean {\n return !!this.eventSource && !!this.clientId && !this.pendingConnects.length;\n }\n\n /**\n * An optional hook that is invoked when the realtime client disconnects\n * either when unsubscribing from all subscriptions or when the\n * connection was interrupted or closed by the server.\n *\n * The received argument could be used to determine whether the disconnect\n * is a result from unsubscribing (`activeSubscriptions.length == 0`)\n * or because of network/server error (`activeSubscriptions.length > 0`).\n *\n * If you want to listen for the opposite, aka. when the client connection is established,\n * subscribe to the `PB_CONNECT` event.\n */\n onDisconnect?: (activeSubscriptions: Array<string>) => void;\n\n /**\n * Register the subscription listener.\n *\n * You can subscribe multiple times to the same topic.\n *\n * If the SSE connection is not started yet,\n * this method will also initialize it.\n */\n async subscribe(\n topic: string,\n callback: (data: any) => void,\n options?: SendOptions,\n ): Promise<UnsubscribeFunc> {\n if (!topic) {\n throw new Error(\"topic must be set.\");\n }\n\n let key = topic;\n\n // serialize and append the topic options (if any)\n if (options) {\n options = Object.assign({}, options); // shallow copy\n normalizeUnknownQueryParams(options);\n const serialized =\n \"options=\" +\n encodeURIComponent(\n JSON.stringify({ query: options.query, headers: options.headers }),\n );\n key += (key.includes(\"?\") ? \"&\" : \"?\") + serialized;\n }\n\n const listener = function (e: Event) {\n const msgEvent = e as MessageEvent;\n\n let data;\n try {\n data = JSON.parse(msgEvent?.data);\n } catch {}\n\n callback(data || {});\n };\n\n // store the listener\n if (!this.subscriptions[key]) {\n this.subscriptions[key] = [];\n }\n this.subscriptions[key].push(listener);\n\n if (!this.isConnected) {\n // initialize sse connection\n await this.connect();\n } else if (this.subscriptions[key].length === 1) {\n // send the updated subscriptions (if it is the first for the key)\n await this.submitSubscriptions();\n } else {\n // only register the listener\n this.eventSource?.addEventListener(key, listener);\n }\n\n return async (): Promise<void> => {\n return this.unsubscribeByTopicAndListener(topic, listener);\n };\n }\n\n /**\n * Unsubscribe from all subscription listeners with the specified topic.\n *\n * If `topic` is not provided, then this method will unsubscribe\n * from all active subscriptions.\n *\n * This method is no-op if there are no active subscriptions.\n *\n * The related sse connection will be autoclosed if after the\n * unsubscribe operation there are no active subscriptions left.\n */\n async unsubscribe(topic?: string): Promise<void> {\n let needToSubmit = false;\n\n if (!topic) {\n // remove all subscriptions\n this.subscriptions = {};\n } else {\n // remove all listeners related to the topic\n const subs = this.getSubscriptionsByTopic(topic);\n for (let key in subs) {\n if (!this.hasSubscriptionListeners(key)) {\n continue; // already unsubscribed\n }\n\n for (let listener of this.subscriptions[key]) {\n this.eventSource?.removeEventListener(key, listener);\n }\n delete this.subscriptions[key];\n\n // mark for subscriptions change submit if there are no other listeners\n if (!needToSubmit) {\n needToSubmit = true;\n }\n }\n }\n\n if (!this.hasSubscriptionListeners()) {\n // no other active subscriptions -> close the sse connection\n this.disconnect();\n } else if (needToSubmit) {\n await this.submitSubscriptions();\n }\n }\n\n /**\n * Unsubscribe from all subscription listeners starting with the specified topic prefix.\n *\n * This method is no-op if there are no active subscriptions with the specified topic prefix.\n *\n * The related sse connection will be autoclosed if after the\n * unsubscribe operation there are no active subscriptions left.\n */\n async unsubscribeByPrefix(keyPrefix: string): Promise<void> {\n let hasAtleastOneTopic = false;\n for (let key in this.subscriptions) {\n // \"?\" so that it can be used as end delimiter for the prefix\n if (!(key + \"?\").startsWith(keyPrefix)) {\n continue;\n }\n\n hasAtleastOneTopic = true;\n for (let listener of this.subscriptions[key]) {\n this.eventSource?.removeEventListener(key, listener);\n }\n delete this.subscriptions[key];\n }\n\n if (!hasAtleastOneTopic) {\n return; // nothing to unsubscribe from\n }\n\n if (this.hasSubscriptionListeners()) {\n // submit the deleted subscriptions\n await this.submitSubscriptions();\n } else {\n // no other active subscriptions -> close the sse connection\n this.disconnect();\n }\n }\n\n /**\n * Unsubscribe from all subscriptions matching the specified topic and listener function.\n *\n * This method is no-op if there are no active subscription with\n * the specified topic and listener.\n *\n * The related sse connection will be autoclosed if after the\n * unsubscribe operation there are no active subscriptions left.\n */\n async unsubscribeByTopicAndListener(\n topic: string,\n listener: EventListener,\n ): Promise<void> {\n let needToSubmit = false;\n\n const subs = this.getSubscriptionsByTopic(topic);\n for (let key in subs) {\n if (\n !Array.isArray(this.subscriptions[key]) ||\n !this.subscriptions[key].length\n ) {\n continue; // already unsubscribed\n }\n\n let exist = false;\n for (let i = this.subscriptions[key].length - 1; i >= 0; i--) {\n if (this.subscriptions[key][i] !== listener) {\n continue;\n }\n\n exist = true; // has at least one matching listener\n delete this.subscriptions[key][i]; // removes the function reference\n this.subscriptions[key].splice(i, 1); // reindex the array\n this.eventSource?.removeEventListener(key, listener);\n }\n if (!exist) {\n continue;\n }\n\n // remove the key from the subscriptions list if there are no other listeners\n if (!this.subscriptions[key].length) {\n delete this.subscriptions[key];\n }\n\n // mark for subscriptions change submit if there are no other listeners\n if (!needToSubmit && !this.hasSubscriptionListeners(key)) {\n needToSubmit = true;\n }\n }\n\n if (!this.hasSubscriptionListeners()) {\n // no other active subscriptions -> close the sse connection\n this.disconnect();\n } else if (needToSubmit) {\n await this.submitSubscriptions();\n }\n }\n\n private hasSubscriptionListeners(keyToCheck?: string): boolean {\n this.subscriptions = this.subscriptions || {};\n\n // check the specified key\n if (keyToCheck) {\n return !!this.subscriptions[keyToCheck]?.length;\n }\n\n // check for at least one non-empty subscription\n for (let key in this.subscriptions) {\n if (!!this.subscriptions[key]?.length) {\n return true;\n }\n }\n\n return false;\n }\n\n private async submitSubscriptions(): Promise<void> {\n if (!this.clientId) {\n return; // no client/subscriber\n }\n\n // optimistic update\n this.addAllSubscriptionListeners();\n\n this.lastSentSubscriptions = this.getNonEmptySubscriptionKeys();\n\n return this.client\n .send(\"/api/realtime\", {\n method: \"POST\",\n body: {\n clientId: this.clientId,\n subscriptions: this.lastSentSubscriptions,\n },\n requestKey: this.getSubscriptionsCancelKey(),\n })\n .catch((err) => {\n if (err?.isAbort) {\n return; // silently ignore aborted pending requests\n }\n throw err;\n });\n }\n\n private getSubscriptionsCancelKey(): string {\n return \"realtime_\" + this.clientId;\n }\n\n private getSubscriptionsByTopic(topic: string): Subscriptions {\n const result: Subscriptions = {};\n\n // \"?\" so that it can be used as end delimiter for the topic\n topic = topic.includes(\"?\") ? topic : topic + \"?\";\n\n for (let key in this.subscriptions) {\n if ((key + \"?\").startsWith(topic)) {\n result[key] = this.subscriptions[key];\n }\n }\n\n return result;\n }\n\n private getNonEmptySubscriptionKeys(): Array<string> {\n const result: Array<string> = [];\n\n for (let key in this.subscriptions) {\n if (this.subscriptions[key].length) {\n result.push(key);\n }\n }\n\n return result;\n }\n\n private addAllSubscriptionListeners(): void {\n if (!this.eventSource) {\n return;\n }\n\n this.removeAllSubscriptionListeners();\n\n for (let key in this.subscriptions) {\n for (let listener of this.subscriptions[key]) {\n this.eventSource.addEventListener(key, listener);\n }\n }\n }\n\n private removeAllSubscriptionListeners(): void {\n if (!this.eventSource) {\n return;\n }\n\n for (let key in this.subscriptions) {\n for (let listener of this.subscriptions[key]) {\n this.eventSource.removeEventListener(key, listener);\n }\n }\n }\n\n private async connect(): Promise<void> {\n if (this.reconnectAttempts > 0) {\n // immediately resolve the promise to avoid indefinitely\n // blocking the client during reconnection\n return;\n }\n\n return new Promise((resolve, reject) => {\n this.pendingConnects.push({ resolve, reject });\n\n if (this.pendingConnects.length > 1) {\n // all promises will be resolved once the connection is established\n return;\n }\n\n this.initConnect();\n });\n }\n\n private initConnect() {\n this.disconnect(true);\n\n // wait up to 15s for connect\n clearTimeout(this.connectTimeoutId);\n this.connectTimeoutId = setTimeout(() => {\n this.connectErrorHandler(new Error(\"EventSource connect took too long.\"));\n }, this.maxConnectTimeout);\n\n this.eventSource = new EventSource(this.client.buildURL(\"/api/realtime\"));\n\n this.eventSource.onerror = (_) => {\n this.connectErrorHandler(\n new Error(\"Failed to establish realtime connection.\"),\n );\n };\n\n this.eventSource.addEventListener(\"PB_CONNECT\", (e) => {\n const msgEvent = e as MessageEvent;\n this.clientId = msgEvent?.lastEventId;\n\n this.submitSubscriptions()\n .then(async () => {\n let retries = 3;\n while (this.hasUnsentSubscriptions() && retries > 0) {\n retries--;\n // resubscribe to ensure that the latest topics are submitted\n //\n // This is needed because missed topics could happen on reconnect\n // if after the pending sent `submitSubscriptions()` call another `subscribe()`\n // was made before the submit was able to complete.\n await this.submitSubscriptions();\n }\n })\n .then(() => {\n for (let p of this.pendingConnects) {\n p.resolve();\n }\n\n // reset connect meta\n this.pendingConnects = [];\n this.reconnectAttempts = 0;\n clearTimeout(this.reconnectTimeoutId);\n clearTimeout(this.connectTimeoutId);\n\n // propagate the PB_CONNECT event\n const connectSubs = this.getSubscriptionsByTopic(\"PB_CONNECT\");\n for (let key in connectSubs) {\n for (let listener of connectSubs[key]) {\n listener(e);\n }\n }\n })\n .catch((err) => {\n this.clientId = \"\";\n this.connectErrorHandler(err);\n });\n });\n }\n\n private hasUnsentSubscriptions(): boolean {\n const latestTopics = this.getNonEmptySubscriptionKeys();\n if (latestTopics.length != this.lastSentSubscriptions.length) {\n return true;\n }\n\n for (const t of latestTopics) {\n if (!this.lastSentSubscriptions.includes(t)) {\n return true;\n }\n }\n\n return false;\n }\n\n private connectErrorHandler(err: any) {\n clearTimeout(this.connectTimeoutId);\n clearTimeout(this.reconnectTimeoutId);\n\n if (\n // wasn't previously connected -> direct reject\n (!this.clientId && !this.reconnectAttempts) ||\n // was previously connected but the max reconnection limit has been reached\n this.reconnectAttempts > this.maxReconnectAttempts\n ) {\n for (let p of this.pendingConnects) {\n p.reject(new ClientResponseError(err));\n }\n this.pendingConnects = [];\n this.disconnect();\n return;\n }\n\n // otherwise -> reconnect in the background\n this.disconnect(true);\n const timeout =\n this.predefinedReconnectIntervals[this.reconnectAttempts] ||\n this.predefinedReconnectIntervals[\n this.predefinedReconnectIntervals.length - 1\n ];\n this.reconnectAttempts++;\n this.reconnectTimeoutId = setTimeout(() => {\n this.initConnect();\n }, timeout);\n }\n\n private disconnect(fromReconnect = false): void {\n if (this.clientId && this.onDisconnect) {\n this.onDisconnect(Object.keys(this.subscriptions));\n }\n\n clearTimeout(this.connectTimeoutId);\n clearTimeout(this.reconnectTimeoutId);\n this.removeAllSubscriptionListeners();\n this.client.cancelRequest(this.getSubscriptionsCancelKey());\n this.eventSource?.close();\n this.eventSource = null;\n this.clientId = \"\";\n\n if (!fromReconnect) {\n this.reconnectAttempts = 0;\n\n // resolve any remaining connect promises\n //\n // this is done to avoid unnecessary throwing errors in case\n // unsubscribe is called before the pending connect promises complete\n // (see https://github.com/pocketbase/pocketbase/discussions/2897#discussioncomment-6423818)\n for (let p of this.pendingConnects) {\n p.resolve();\n }\n this.pendingConnects = [];\n }\n }\n}\n","import { BaseService } from \"@/services/BaseService\";\nimport { ClientResponseError } from \"@/ClientResponseError\";\nimport { ListResult } from \"@/tools/dtos\";\nimport { CommonOptions, ListOptions, FullListOptions } from \"@/tools/options\";\n\nexport abstract class CrudService<M> extends BaseService {\n /**\n * Base path for the crud actions (without trailing slash, eg. '/admins').\n */\n abstract get baseCrudPath(): string;\n\n /**\n * Response data decoder.\n */\n decode<T = M>(data: { [key: string]: any }): T {\n return data as T;\n }\n\n /**\n * Returns a promise with all list items batch fetched at once\n * (by default 500 items per request; to change it set the `batch` query param).\n *\n * You can use the generic T to supply a wrapper type of the crud model.\n *\n * @throws {ClientResponseError}\n */\n async getFullList<T = M>(options?: FullListOptions): Promise<Array<T>>;\n\n /**\n * Legacy version of getFullList with explicitly specified batch size.\n */\n async getFullList<T = M>(batch?: number, options?: ListOptions): Promise<Array<T>>;\n\n async getFullList<T = M>(\n batchOrqueryParams?: number | FullListOptions,\n options?: ListOptions,\n ): Promise<Array<T>> {\n if (typeof batchOrqueryParams == \"number\") {\n return this._getFullList<T>(batchOrqueryParams, options);\n }\n\n options = Object.assign({}, batchOrqueryParams, options);\n\n let batch = 500;\n if (options.batch) {\n batch = options.batch;\n delete options.batch;\n }\n\n return this._getFullList<T>(batch, options);\n }\n\n /**\n * Returns paginated items list.\n *\n * You can use the generic T to supply a wrapper type of the crud model.\n *\n * @throws {ClientResponseError}\n */\n async getList<T = M>(\n page = 1,\n perPage = 30,\n options?: ListOptions,\n ): Promise<ListResult<T>> {\n options = Object.assign(\n {\n method: \"GET\",\n },\n options,\n );\n\n options.query = Object.assign(\n {\n page: page,\n perPage: perPage,\n },\n options.query,\n );\n\n return this.client.send(this.baseCrudPath, options).then((responseData: any) => {\n responseData.items =\n responseData.items?.map((item: any) => {\n return this.decode<T>(item);\n }) || [];\n\n return responseData;\n });\n }\n\n /**\n * Returns the first found item by the specified filter.\n *\n * Internally it calls `getList(1, 1, { filter, skipTotal })` and\n * returns the first found item.\n *\n * You can use the generic T to supply a wrapper type of the crud model.\n *\n * For consistency with `getOne`, this method will throw a 404\n * ClientResponseError if no item was found.\n *\n * @throws {ClientResponseError}\n */\n async getFirstListItem<T = M>(filter: string, options?: CommonOptions): Promise<T> {\n options = Object.assign(\n {\n requestKey: \"one_by_filter_\" + this.baseCrudPath + \"_\" + filter,\n },\n options,\n );\n\n options.query = Object.assign(\n {\n filter: filter,\n skipTotal: 1,\n },\n options.query,\n );\n\n return this.getList<T>(1, 1, options).then((result) => {\n if (!result?.items?.length) {\n throw new ClientResponseError({\n status: 404,\n response: {\n code: 404,\n message: \"The requested resource wasn't found.\",\n data: {},\n },\n });\n }\n\n return result.items[0];\n });\n }\n\n /**\n * Returns single item by its id.\n *\n * You can use the generic T to supply a wrapper type of the crud model.\n *\n * If `id` is empty it will throw a 404 error.\n *\n * @throws {ClientResponseError}\n */\n async getOne<T = M>(id: string, options?: CommonOptions): Promise<T> {\n if (!id) {\n throw new ClientResponseError({\n url: this.client.buildURL(this.baseCrudPath + \"/\"),\n status: 404,\n response: {\n code: 404,\n message: \"Missing required record id.\",\n data: {},\n },\n });\n }\n\n options = Object.assign(\n {\n method: \"GET\",\n },\n options,\n );\n\n return this.client\n .send(this.baseCrudPath + \"/\" + encodeURIComponent(id), options)\n .then((responseData: any) => this.decode<T>(responseData));\n }\n\n /**\n * Creates a new item.\n *\n * You can use the generic T to supply a wrapper type of the crud model.\n *\n * @throws {ClientResponseError}\n */\n async create<T = M>(\n bodyParams?: { [key: string]: any } | FormData,\n options?: CommonOptions,\n ): Promise<T> {\n options = Object.assign(\n {\n method: \"POST\",\n body: bodyParams,\n },\n options,\n );\n\n return this.client\n .send(this.baseCrudPath, options)\n .then((responseData: any) => this.decode<T>(responseData));\n }\n\n /**\n * Updates an existing item by its id.\n *\n * You can use the generic T to supply a wrapper type of the crud model.\n *\n * @throws {ClientResponseError}\n */\n async update<T = M>(\n id: string,\n bodyParams?: { [key: string]: any } | FormData,\n options?: CommonOptions,\n ): Promise<T> {\n options = Object.assign(\n {\n method: \"PATCH\",\n body: bodyParams,\n },\n options,\n );\n\n return this.client\n .send(this.baseCrudPath + \"/\" + encodeURIComponent(id), options)\n .then((responseData: any) => this.decode<T>(responseData));\n }\n\n /**\n * Deletes an existing item by its id.\n *\n * @throws {ClientResponseError}\n */\n async delete(id: string, options?: CommonOptions): Promise<boolean> {\n options = Object.assign(\n {\n method: \"DELETE\",\n },\n options,\n );\n\n return this.client\n .send(this.baseCrudPath + \"/\" + encodeURIComponent(id), options)\n .then(() => true);\n }\n\n /**\n * Returns a promise with all list items batch fetched at once.\n */\n protected _getFullList<T = M>(\n batchSize = 500,\n options?: ListOptions,\n ): Promise<Array<T>> {\n options = options || {};\n options.query = Object.assign(\n {\n skipTotal: 1,\n },\n options.query,\n );\n\n let result: Array<T> = [];\n\n let request = async (page: number): Promise<Array<any>> => {\n return this.getList(page, batchSize || 500, options).then((list) => {\n const castedList = list as any as ListResult<T>;\n const items = castedList.items;\n\n result = result.concat(items);\n\n if (items.length == list.perPage) {\n return request(page + 1);\n }\n\n return result;\n });\n };\n\n return request(1);\n }\n}\n","import { SendOptions } from \"@/tools/options\";\n\nexport function normalizeLegacyOptionsArgs(\n legacyWarn: string,\n baseOptions: SendOptions,\n bodyOrOptions?: any,\n query?: any,\n): SendOptions {\n const hasBodyOrOptions = typeof bodyOrOptions !== \"undefined\";\n const hasQuery = typeof query !== \"undefined\";\n\n if (!hasQuery && !hasBodyOrOptions) {\n return baseOptions;\n }\n\n if (hasQuery) {\n console.warn(legacyWarn);\n baseOptions.body = Object.assign({}, baseOptions.body, bodyOrOptions);\n baseOptions.query = Object.assign({}, baseOptions.query, query);\n\n return baseOptions;\n }\n\n return Object.assign(baseOptions, bodyOrOptions);\n}\n","import Client from \"@/Client\";\nimport { isTokenExpired } from \"@/tools/jwt\";\n\n// reset previous auto refresh registrations\nexport function resetAutoRefresh(client: Client) {\n (client as any)._resetAutoRefresh?.();\n}\n\nexport function registerAutoRefresh(\n client: Client,\n threshold: number,\n refreshFunc: () => Promise<any>,\n reauthenticateFunc: () => Promise<any>,\n) {\n resetAutoRefresh(client);\n\n const oldBeforeSend = client.beforeSend;\n const oldModel = client.authStore.record;\n\n // unset the auto refresh in case the auth store was cleared\n // OR a new model was authenticated\n const unsubStoreChange = client.authStore.onChange((newToken, model) => {\n if (\n !newToken ||\n model?.id != oldModel?.id ||\n ((model?.collectionId || oldModel?.collectionId) &&\n model?.collectionId != oldModel?.collectionId)\n ) {\n resetAutoRefresh(client);\n }\n });\n\n // initialize a reset function and attach it dynamically to the client\n (client as any)._resetAutoRefresh = function () {\n unsubStoreChange();\n client.beforeSend = oldBeforeSend;\n delete (client as any)._resetAutoRefresh;\n };\n\n client.beforeSend = async (url, sendOptions) => {\n const oldToken = client.authStore.token;\n\n if (sendOptions.query?.autoRefresh) {\n return oldBeforeSend ? oldBeforeSend(url, sendOptions) : { url, sendOptions };\n }\n\n let isValid = client.authStore.isValid;\n if (\n // is loosely valid\n isValid &&\n // but it is going to expire in the next \"threshold\" seconds\n isTokenExpired(client.authStore.token, threshold)\n ) {\n try {\n await refreshFunc();\n } catch (_) {\n isValid = false;\n }\n }\n\n // still invalid -> reauthenticate\n if (!isValid) {\n await reauthenticateFunc();\n }\n\n // the request wasn't sent with a custom token\n const headers = sendOptions.headers || {};\n for (let key in headers) {\n if (\n key.toLowerCase() == \"authorization\" &&\n // the request wasn't sent with a custom token\n oldToken == headers[key] &&\n client.authStore.token\n ) {\n // set the latest store token\n headers[key] = client.authStore.token;\n break;\n }\n }\n sendOptions.headers = headers;\n\n return oldBeforeSend ? oldBeforeSend(url, sendOptions) : { url, sendOptions };\n };\n}\n","import Client from \"@/Client\";\nimport { ClientResponseError } from \"@/ClientResponseError\";\nimport { RealtimeService, UnsubscribeFunc } from \"@/services/RealtimeService\";\nimport { BaseAuthStore } from \"@/stores/BaseAuthStore\";\nimport { CrudService } from \"@/services/CrudService\";\nimport { ListResult, RecordModel } from \"@/tools/dtos\";\nimport { normalizeLegacyOptionsArgs } from \"@/tools/legacy\";\nimport {\n CommonOptions,\n RecordFullListOptions,\n RecordListOptions,\n RecordOptions,\n SendOptions,\n RecordSubscribeOptions,\n} from \"@/tools/options\";\nimport { getTokenPayload } from \"@/tools/jwt\";\nimport { registerAutoRefresh, resetAutoRefresh } from \"@/tools/refresh\";\n\nexport interface RecordAuthResponse<T = RecordModel> {\n /**\n * The signed PocketBase auth record.\n */\n record: T;\n\n /**\n * The PocketBase record auth token.\n *\n * If you are looking for the OAuth2 access and refresh tokens\n * they are available under the `meta.accessToken` and `meta.refreshToken` props.\n */\n token: string;\n\n /**\n * Auth meta data usually filled when OAuth2 is used.\n */\n meta?: { [key: string]: any };\n}\n\nexport interface AuthProviderInfo {\n name: string;\n displayName: string;\n state: string;\n authURL: string;\n codeVerifier: string;\n codeChallenge: string;\n codeChallengeMethod: string;\n}\n\nexport interface AuthMethodsList {\n mfa: {\n enabled: boolean;\n duration: number;\n };\n otp: {\n enabled: boolean;\n duration: number;\n };\n password: {\n enabled: boolean;\n identityFields: Array<string>;\n };\n oauth2: {\n enabled: boolean;\n providers: Array<AuthProviderInfo>;\n };\n}\n\nexport interface RecordSubscription<T = RecordModel> {\n action: string; // eg. create, update, delete\n record: T;\n}\n\nexport type OAuth2UrlCallback = (url: string) => void | Promise<void>;\n\nexport interface OAuth2AuthConfig extends SendOptions {\n // the name of the OAuth2 provider (eg. \"google\")\n provider: string;\n\n // custom scopes to overwrite the default ones\n scopes?: Array<string>;\n\n // optional record create data\n createData?: { [key: string]: any };\n\n // optional callback that is triggered after the OAuth2 sign-in/sign-up url generation\n urlCallback?: OAuth2UrlCallback;\n\n // optional query params to send with the PocketBase auth request (eg. fields, expand, etc.)\n query?: RecordOptions;\n}\n\nexport interface OTPResponse {\n otpId: string;\n}\n\nexport class RecordService<M = RecordModel> extends CrudService<M> {\n readonly collectionIdOrName: string;\n\n constructor(client: Client, collectionIdOrName: string) {\n super(client);\n\n this.collectionIdOrName = collectionIdOrName;\n }\n\n /**\n * @inheritdoc\n */\n get baseCrudPath(): string {\n return this.baseCollectionPath + \"/records\";\n }\n\n /**\n * Returns the current collection service base path.\n */\n get baseCollectionPath(): string {\n return \"/api/collections/\" + encodeURIComponent(this.collectionIdOrName);\n }\n\n /**\n * Returns whether the current service collection is superusers.\n */\n get isSuperusers(): boolean {\n return (\n this.collectionIdOrName == \"_superusers\" ||\n this.collectionIdOrName == \"_pbc_2773867675\"\n );\n }\n\n // ---------------------------------------------------------------\n // Realtime handlers\n // ---------------------------------------------------------------\n\n /**\n * Subscribe to realtime changes to the specified topic (\"*\" or record id).\n *\n * If `topic` is the wildcard \"*\", then this method will subscribe to\n * any record changes in the collection.\n *\n * If `topic` is a record id, then this method will subscribe only\n * to changes of the specified record id.\n *\n * It's OK to subscribe multiple times to the same topic.\n * You can use the returned `UnsubscribeFunc` to remove only a single subscription.\n * Or use `unsubscribe(topic)` if you want to remove all subscriptions attached to the topic.\n */\n async subscribe<T = M>(\n topic: string,\n callback: (data: RecordSubscription<T>) => void,\n options?: RecordSubscribeOptions,\n ): Promise<UnsubscribeFunc> {\n if (!topic) {\n throw new Error(\"Missing topic.\");\n }\n\n if (!callback) {\n throw new Error(\"Missing subscription callback.\");\n }\n\n return this.client.realtime.subscribe(\n this.collectionIdOrName + \"/\" + topic,\n callback,\n options,\n );\n }\n\n /**\n * Unsubscribe from all subscriptions of the specified topic\n * (\"*\" or record id).\n *\n * If `topic` is not set, then this method will unsubscribe from\n * all subscriptions associated to the current collection.\n */\n async unsubscribe(topic?: string): Promise<void> {\n // unsubscribe from the specified topic\n if (topic) {\n return this.client.realtime.unsubscribe(\n this.collectionIdOrName + \"/\" + topic,\n );\n }\n\n // unsubscribe from everything related to the collection\n return this.client.realtime.unsubscribeByPrefix(this.collectionIdOrName);\n }\n\n // ---------------------------------------------------------------\n // Crud handers\n // ---------------------------------------------------------------\n /**\n * @inheritdoc\n */\n async getFullList<T = M>(options?: RecordFullListOptions): Promise<Array<T>>;\n\n /**\n * @inheritdoc\n */\n async getFullList<T = M>(\n batch?: number,\n options?: RecordListOptions,\n ): Promise<Array<T>>;\n\n /**\n * @inheritdoc\n */\n async getFullList<T = M>(\n batchOrOptions?: number | RecordFullListOptions,\n options?: RecordListOptions,\n ): Promise<Array<T>> {\n if (typeof batchOrOptions == \"number\") {\n return super.getFullList<T>(batchOrOptions, options);\n }\n\n const params = Object.assign({}, batchOrOptions, options);\n\n return super.getFullList<T>(params);\n }\n\n /**\n * @inheritdoc\n */\n async getList<T = M>(\n page = 1,\n perPage = 30,\n options?: RecordListOptions,\n ): Promise<ListResult<T>> {\n return super.getList<T>(page, perPage, options);\n }\n\n /**\n * @inheritdoc\n */\n async getFirstListItem<T = M>(\n filter: string,\n options?: RecordListOptions,\n ): Promise<T> {\n return super.getFirstListItem<T>(filter, options);\n }\n\n /**\n * @inheritdoc\n */\n async getOne<T = M>(id: string, options?: RecordOptions): Promise<T> {\n return super.getOne<T>(id, options);\n }\n\n /**\n * @inheritdoc\n */\n async create<T = M>(\n bodyParams?: { [key: string]: any } | FormData,\n options?: RecordOptions,\n ): Promise<T> {\n return super.create<T>(bodyParams, options);\n }\n\n /**\n * @inheritdoc\n *\n * If the current `client.authStore.record` matches with the updated id, then\n * on success the `client.authStore.record` will be updated with the new response record fields.\n */\n async update<T = M>(\n id: string,\n bodyParams?: { [key: string]: any } | FormData,\n options?: RecordOptions,\n ): Promise<T> {\n return super.update<RecordModel>(id, bodyParams, options).then((item) => {\n if (\n // is record auth\n this.client.authStore.record?.id === item?.id &&\n (this.client.authStore.record?.collectionId === this.collectionIdOrName ||\n this.client.authStore.record?.collectionName ===\n this.collectionIdOrName)\n ) {\n let authExpand = Object.assign({}, this.client.authStore.record.expand);\n let authRecord = Object.assign({}, this.client.authStore.record, item);\n if (authExpand) {\n // for now \"merge\" only top-level expand\n authRecord.expand = Object.assign(authExpand, item.expand);\n }\n\n this.client.authStore.save(this.client.authStore.token, authRecord);\n }\n\n return item as any as T;\n });\n }\n\n /**\n * @inheritdoc\n *\n * If the current `client.authStore.record` matches with the deleted id,\n * then on success the `client.authStore` will be cleared.\n */\n async delete(id: string, options?: CommonOptions): Promise<boolean> {\n return super.delete(id, options).then((success) => {\n if (\n success &&\n // is record auth\n this.client.authStore.record?.id === id &&\n (this.client.authStore.record?.collectionId === this.collectionIdOrName ||\n this.client.authStore.record?.collectionName ===\n this.collectionIdOrName)\n ) {\n this.client.authStore.clear();\n }\n\n return success;\n });\n }\n\n // ---------------------------------------------------------------\n // Auth handlers\n // ---------------------------------------------------------------\n\n /**\n * Prepare successful collection authorization response.\n */\n protected authResponse<T = M>(responseData: any): RecordAuthResponse<T> {\n const record = this.decode(responseData?.record || {});\n\n this.client.authStore.save(responseData?.token, record as any);\n\n return Object.assign({}, responseData, {\n // normalize common fields\n token: responseData?.token || \"\",\n record: record as any as T,\n });\n }\n\n /**\n * Returns all available collection auth methods.\n *\n * @throws {ClientResponseError}\n */\n async listAuthMethods(options?: CommonOptions): Promise<AuthMethodsList> {\n options = Object.assign(\n {\n method: \"GET\",\n // @todo remove after deleting the pre v0.23 API response fields\n fields: \"mfa,otp,password,oauth2\",\n },\n options,\n );\n\n return this.client.send(this.baseCollectionPath + \"/auth-methods\", options);\n }\n\n /**\n * Authenticate a single auth collection record via its username/email and password.\n *\n * On success, this method also automatically updates\n * the client's AuthStore data and returns:\n * - the authentication token\n * - the authenticated record model\n *\n * @throws {ClientResponseError}\n */\n async authWithPassword<T = M>(\n usernameOrEmail: string,\n password: string,\n options?: RecordOptions,\n ): Promise<RecordAuthResponse<T>> {\n options = Object.assign(\n {\n method: \"POST\",\n body: {\n identity: usernameOrEmail,\n password: password,\n },\n },\n options,\n );\n\n // note: consider to deprecate\n let autoRefreshThreshold;\n if (this.isSuperusers) {\n autoRefreshThreshold = options.autoRefreshThreshold;\n delete options.autoRefreshThreshold;\n if (!options.autoRefresh) {\n resetAutoRefresh(this.client);\n }\n }\n\n let authData = await this.client.send(\n this.baseCollectionPath + \"/auth-with-password\",\n options,\n );\n\n authData = this.authResponse<T>(authData);\n\n if (autoRefreshThreshold && this.isSuperusers) {\n registerAutoRefresh(\n this.client,\n autoRefreshThreshold,\n () => this.authRefresh({ autoRefresh: true }),\n () =>\n this.authWithPassword<T>(\n usernameOrEmail,\n password,\n Object.assign({ autoRefresh: true }, options),\n ),\n );\n }\n\n return authData;\n }\n\n /**\n * Authenticate a single auth collection record with OAuth2 code.\n *\n * If you don't have an OAuth2 code you may also want to check `authWithOAuth2` method.\n *\n * On success, this method also automatically updates\n * the client's AuthStore data and returns:\n * - the authentication token\n * - the authenticated record model\n * - the OAuth2 account data (eg. name, email, avatar, etc.)\n *\n * @throws {ClientResponseError}\n */\n async authWithOAuth2Code<T = M>(\n provider: string,\n code: string,\n codeVerifier: string,\n redirectURL: string,\n createData?: { [key: string]: any },\n options?: RecordOptions,\n ): Promise<RecordAuthResponse<T>>;\n\n /**\n * @deprecated\n * Consider using authWithOAuth2Code(provider, code, codeVerifier, redirectURL, createdData, options?).\n */\n async authWithOAuth2Code<T = M>(\n provider: string,\n code: string,\n codeVerifier: string,\n redirectURL: string,\n createData?: { [key: string]: any },\n body?: any,\n query?: any,\n ): Promise<RecordAuthResponse<T>>;\n\n async authWithOAuth2Code<T = M>(\n provider: string,\n code: string,\n codeVerifier: string,\n redirectURL: string,\n createData?: { [key: string]: any },\n bodyOrOptions?: any,\n query?: any,\n ): Promise<RecordAuthResponse<T>> {\n let options: any = {\n method: \"POST\",\n body: {\n provider: provider,\n code: code,\n codeVerifier: codeVerifier,\n redirectURL: redirectURL,\n createData: createData,\n },\n };\n\n options = normalizeLegacyOptionsArgs(\n \"This form of authWithOAuth2Code(provider, code, codeVerifier, redirectURL, createData?, body?, query?) is deprecated. Consider replacing it with authWithOAuth2Code(provider, code, codeVerifier, redirectURL, createData?, options?).\",\n options,\n bodyOrOptions,\n query,\n );\n\n return this.client\n .send(this.baseCollectionPath + \"/auth-with-oauth2\", options)\n .then((data) => this.authResponse<T>(data));\n }\n\n /**\n * @deprecated This form of authWithOAuth2 is deprecated.\n *\n * Please use `authWithOAuth2Code()` OR its simplified realtime version\n * as shown in https://pocketbase.io/docs/authentication/#oauth2-integration.\n */\n async authWithOAuth2<T = M>(\n provider: string,\n code: string,\n codeVerifier: string,\n redirectURL: string,\n createData?: { [key: string]: any },\n bodyParams?: { [key: string]: any },\n queryParams?: RecordOptions,\n ): Promise<RecordAuthResponse<T>>;\n\n /**\n * Authenticate a single auth collection record with OAuth2\n * **without custom redirects, deeplinks or even page reload**.\n *\n * This method initializes a one-off realtime subscription and will\n * open a popup window with the OAuth2 vendor page to authenticate.\n * Once the external OAuth2 sign-in/sign-up flow is completed, the popup\n * window will be automatically closed and the OAuth2 data sent back\n * to the user through the previously established realtime connection.\n *\n * You can specify an optional `urlCallback` prop to customize\n * the default url `window.open` behavior.\n *\n * On success, this method also automatically updates\n * the client's AuthStore data and returns:\n * - the authentication token\n * - the authenticated record model\n * - the OAuth2 account data (eg. name, email, avatar, etc.)\n *\n * Example:\n *\n * ```js\n * const authData = await pb.collection(\"users\").authWithOAuth2({\n * provider: \"google\",\n * })\n * ```\n *\n * Note1: When creating the OAuth2 app in the provider dashboard\n * you have to configure `https://yourdomain.com/api/oauth2-redirect`\n * as redirect URL.\n *\n * Note2: Safari may block the default `urlCallback` popup because\n * it doesn't allow `window.open` calls as part of an `async` click functions.\n * To workaround this you can either change your click handler to not be marked as `async`\n * OR manually call `window.open` before your `async` function and use the\n * window reference in your own custom `urlCallback` (see https://github.com/pocketbase/pocketbase/discussions/2429#discussioncomment-5943061).\n * For example:\n * ```js\n * <button id=\"btn\">Login with Gitlab</button>\n * ...\n * document.getElementById(\"btn\").addEventListener(\"click\", () => {\n * pb.collection(\"users\").authWithOAuth2({\n * provider: \"gitlab\",\n * }).then((authData) => {\n * console.log(authData)\n * }).catch((err) => {\n * console.log(err, err.originalError);\n * });\n * })\n * ```\n *\n * @throws {ClientResponseError}\n */\n async authWithOAuth2<T = M>(\n options: OAuth2AuthConfig,\n ): Promise<RecordAuthResponse<T>>;\n\n authWithOAuth2<T = M>(...args: any): Promise<RecordAuthResponse<T>> {\n // fallback to legacy format\n if (args.length > 1 || typeof args?.[0] === \"string\") {\n console.warn(\n \"PocketBase: This form of authWithOAuth2() is deprecated and may get removed in the future. Please replace with authWithOAuth2Code() OR use the authWithOAuth2() realtime form as shown in https://pocketbase.io/docs/authentication/#oauth2-integration.\",\n );\n return this.authWithOAuth2Code<T>(\n args?.[0] || \"\",\n args?.[1] || \"\",\n args?.[2] || \"\",\n args?.[3] || \"\",\n args?.[4] || {},\n args?.[5] || {},\n args?.[6] || {},\n );\n }\n\n const config = args?.[0] || {};\n\n // open a new popup window in case config.urlCallback is not set\n //\n // note: it is opened before any async calls due to Safari restrictions\n // (see https://github.com/pocketbase/pocketbase/discussions/2429#discussioncomment-5943061)\n let eagerDefaultPopup: Window | null = null;\n if (!config.urlCallback) {\n eagerDefaultPopup = openBrowserPopup(undefined);\n }\n\n // initialize a one-off realtime service\n const realtime = new RealtimeService(this.client);\n\n function cleanup() {\n eagerDefaultPopup?.close();\n realtime.unsubscribe();\n }\n\n const requestKeyOptions: SendOptions = {};\n const requestKey = config.requestKey;\n if (requestKey) {\n requestKeyOptions.requestKey = requestKey;\n }\n\n return this.listAuthMethods(requestKeyOptions)\n .then((authMethods) => {\n const provider = authMethods.oauth2.providers.find(\n (p) => p.name === config.provider,\n );\n if (!provider) {\n throw new ClientResponseError(\n new Error(`Missing or invalid provider \"${config.provider}\".`),\n );\n }\n\n const redirectURL = this.client.buildURL(\"/api/oauth2-redirect\");\n\n // find the AbortController associated with the current request key (if any)\n const cancelController = requestKey\n ? this.client[\"cancelControllers\"]?.[requestKey]\n : undefined;\n if (cancelController) {\n cancelController.signal.onabort = () => {\n cleanup();\n };\n }\n\n return new Promise(async (resolve, reject) => {\n try {\n await realtime.subscribe(\"@oauth2\", async (e) => {\n const oldState = realtime.clientId;\n\n try {\n if (!e.state || oldState !== e.state) {\n throw new Error(\"State parameters don't match.\");\n }\n\n if (e.error || !e.code) {\n throw new Error(\n \"OAuth2 redirect error or missing code: \" +\n e.error,\n );\n }\n\n // clear the non SendOptions props\n const options = Object.assign({}, config);\n delete options.provider;\n delete options.scopes;\n delete options.createData;\n delete options.urlCallback;\n\n // reset the cancelController listener as it will be triggered by the next api call\n if (cancelController?.signal?.onabort) {\n cancelController.signal.onabort = null;\n }\n\n const authData = await this.authWithOAuth2Code<T>(\n provider.name,\n e.code,\n provider.codeVerifier,\n redirectURL,\n config.createData,\n options,\n );\n\n resolve(authData);\n } catch (err) {\n reject(new ClientResponseError(err));\n }\n\n cleanup();\n });\n\n const replacements: { [key: string]: any } = {\n state: realtime.clientId,\n };\n if (config.scopes?.length) {\n replacements[\"scope\"] = config.scopes.join(\" \");\n }\n\n const url = this._replaceQueryParams(\n provider.authURL + redirectURL,\n replacements,\n );\n\n let urlCallback =\n config.urlCallback ||\n function (url: string) {\n if (eagerDefaultPopup) {\n eagerDefaultPopup.location.href = url;\n } else {\n // it could have been blocked due to its empty initial url,\n // try again...\n eagerDefaultPopup = openBrowserPopup(url);\n }\n };\n\n await urlCallback(url);\n } catch (err) {\n cleanup();\n reject(new ClientResponseError(err));\n }\n });\n })\n .catch((err) => {\n cleanup();\n throw err; // rethrow\n }) as Promise<RecordAuthResponse<T>>;\n }\n\n /**\n * Refreshes the current authenticated record instance and\n * returns a new token and record data.\n *\n * On success this method also automatically updates the client's AuthStore.\n *\n * @throws {ClientResponseError}\n */\n async authRefresh<T = M>(options?: RecordOptions): Promise<RecordAuthResponse<T>>;\n\n /**\n * @deprecated\n * Consider using authRefresh(options?).\n */\n async authRefresh<T = M>(body?: any, query?: any): Promise<RecordAuthResponse<T>>;\n\n async authRefresh<T = M>(\n bodyOrOptions?: any,\n query?: any,\n ): Promise<RecordAuthResponse<T>> {\n let options: any = {\n method: \"POST\",\n };\n\n options = normalizeLegacyOptionsArgs(\n \"This form of authRefresh(body?, query?) is deprecated. Consider replacing it with authRefresh(options?).\",\n options,\n bodyOrOptions,\n query,\n );\n\n return this.client\n .send(this.baseCollectionPath + \"/auth-refresh\", options)\n .then((data) => this.authResponse<T>(data));\n }\n\n /**\n * Sends auth record password reset request.\n *\n * @throws {ClientResponseError}\n */\n async requestPasswordReset(email: string, options?: CommonOptions): Promise<boolean>;\n\n /**\n * @deprecated\n * Consider using requestPasswordReset(email, options?).\n */\n async requestPasswordReset(email: string, body?: any, query?: any): Promise<boolean>;\n\n async requestPasswordReset(\n email: string,\n bodyOrOptions?: any,\n query?: any,\n ): Promise<boolean> {\n let options: any = {\n method: \"POST\",\n body: {\n email: email,\n },\n };\n\n options = normalizeLegacyOptionsArgs(\n \"This form of requestPasswordReset(email, body?, query?) is deprecated. Consider replacing it with requestPasswordReset(email, options?).\",\n options,\n bodyOrOptions,\n query,\n );\n\n return this.client\n .send(this.baseCollectionPath + \"/request-password-reset\", options)\n .then(() => true);\n }\n\n /**\n * Confirms auth record password reset request.\n *\n * @throws {ClientResponseError}\n */\n async confirmPasswordReset(\n passwordResetToken: string,\n password: string,\n passwordConfirm: string,\n options?: CommonOptions,\n ): Promise<boolean>;\n\n /**\n * @deprecated\n * Consider using confirmPasswordReset(passwordResetToken, password, passwordConfirm, options?).\n */\n async confirmPasswordReset(\n passwordResetToken: string,\n password: string,\n passwordConfirm: string,\n body?: any,\n query?: any,\n ): Promise<boolean>;\n\n async confirmPasswordReset(\n passwordResetToken: string,\n password: string,\n passwordConfirm: string,\n bodyOrOptions?: any,\n query?: any,\n ): Promise<boolean> {\n let options: any = {\n method: \"POST\",\n body: {\n token: passwordResetToken,\n password: password,\n passwordConfirm: passwordConfirm,\n },\n };\n\n options = normalizeLegacyOptionsArgs(\n \"This form of confirmPasswordReset(token, password, passwordConfirm, body?, query?) is deprecated. Consider replacing it with confirmPasswordReset(token, password, passwordConfirm, options?).\",\n options,\n bodyOrOptions,\n query,\n );\n\n return this.client\n .send(this.baseCollectionPath + \"/confirm-password-reset\", options)\n .then(() => true);\n }\n\n /**\n * Sends auth record verification email request.\n *\n * @throws {ClientResponseError}\n */\n async requestVerification(email: string, options?: CommonOptions): Promise<boolean>;\n\n /**\n * @deprecated\n * Consider using requestVerification(email, options?).\n */\n async requestVerification(email: string, body?: any, query?: any): Promise<boolean>;\n\n async requestVerification(\n email: string,\n bodyOrOptions?: any,\n query?: any,\n ): Promise<boolean> {\n let options: any = {\n method: \"POST\",\n body: {\n email: email,\n },\n };\n\n options = normalizeLegacyOptionsArgs(\n \"This form of requestVerification(email, body?, query?) is deprecated. Consider replacing it with requestVerification(email, options?).\",\n options,\n bodyOrOptions,\n query,\n );\n\n return this.client\n .send(this.baseCollectionPath + \"/request-verification\", options)\n .then(() => true);\n }\n\n /**\n * Confirms auth record email verification request.\n *\n * If the current `client.authStore.record` matches with the auth record from the token,\n * then on success the `client.authStore.record.verified` will be updated to `true`.\n *\n * @throws {ClientResponseError}\n */\n async confirmVerification(\n verificationToken: string,\n options?: CommonOptions,\n ): Promise<boolean>;\n\n /**\n * @deprecated\n * Consider using confirmVerification(verificationToken, options?).\n */\n async confirmVerification(\n verificationToken: string,\n body?: any,\n query?: any,\n ): Promise<boolean>;\n\n async confirmVerification(\n verificationToken: string,\n bodyOrOptions?: any,\n query?: any,\n ): Promise<boolean> {\n let options: any = {\n method: \"POST\",\n body: {\n token: verificationToken,\n },\n };\n\n options = normalizeLegacyOptionsArgs(\n \"This form of confirmVerification(token, body?, query?) is deprecated. Consider replacing it with confirmVerification(token, options?).\",\n options,\n bodyOrOptions,\n query,\n );\n\n return this.client\n .send(this.baseCollectionPath + \"/confirm-verification\", options)\n .then(() => {\n // on success manually update the current auth record verified state\n const payload = getTokenPayload(verificationToken);\n const model = this.client.authStore.record;\n if (\n model &&\n !model.verified &&\n model.id === payload.id &&\n model.collectionId === payload.collectionId\n ) {\n model.verified = true;\n this.client.authStore.save(this.client.authStore.token, model);\n }\n\n return true;\n });\n }\n\n /**\n * Sends an email change request to the authenticated record model.\n *\n * @throws {ClientResponseError}\n */\n async requestEmailChange(newEmail: string, options?: CommonOptions): Promise<boolean>;\n\n /**\n * @deprecated\n * Consider using requestEmailChange(newEmail, options?).\n */\n async requestEmailChange(newEmail: string, body?: any, query?: any): Promise<boolean>;\n\n async requestEmailChange(\n newEmail: string,\n bodyOrOptions?: any,\n query?: any,\n ): Promise<boolean> {\n let options: any = {\n method: \"POST\",\n body: {\n newEmail: newEmail,\n },\n };\n\n options = normalizeLegacyOptionsArgs(\n \"This form of requestEmailChange(newEmail, body?, query?) is deprecated. Consider replacing it with requestEmailChange(newEmail, options?).\",\n options,\n bodyOrOptions,\n query,\n );\n\n return this.client\n .send(this.baseCollectionPath + \"/request-email-change\", options)\n .then(() => true);\n }\n\n /**\n * Confirms auth record's new email address.\n *\n * If the current `client.authStore.record` matches with the auth record from the token,\n * then on success the `client.authStore` will be cleared.\n *\n * @throws {ClientResponseError}\n */\n async confirmEmailChange(\n emailChangeToken: string,\n password: string,\n options?: CommonOptions,\n ): Promise<boolean>;\n\n /**\n * @deprecated\n * Consider using confirmEmailChange(emailChangeToken, password, options?).\n */\n async confirmEmailChange(\n emailChangeToken: string,\n password: string,\n body?: any,\n query?: any,\n ): Promise<boolean>;\n\n async confirmEmailChange(\n emailChangeToken: string,\n password: string,\n bodyOrOptions?: any,\n query?: any,\n ): Promise<boolean> {\n let options: any = {\n method: \"POST\",\n body: {\n token: emailChangeToken,\n password: password,\n },\n };\n\n options = normalizeLegacyOptionsArgs(\n \"This form of confirmEmailChange(token, password, body?, query?) is deprecated. Consider replacing it with confirmEmailChange(token, password, options?).\",\n options,\n bodyOrOptions,\n query,\n );\n\n return this.client\n .send(this.baseCollectionPath + \"/confirm-email-change\", options)\n .then(() => {\n const payload = getTokenPayload(emailChangeToken);\n const model = this.client.authStore.record;\n if (\n model &&\n model.id === payload.id &&\n model.collectionId === payload.collectionId\n ) {\n this.client.authStore.clear();\n }\n\n return true;\n });\n }\n\n /**\n * @deprecated use collection(\"_externalAuths\").*\n *\n * Lists all linked external auth providers for the specified auth record.\n *\n * @throws {ClientResponseError}\n */\n async listExternalAuths(\n recordId: string,\n options?: CommonOptions,\n ): Promise<Array<RecordModel>> {\n return this.client.collection(\"_externalAuths\").getFullList(\n Object.assign({}, options, {\n filter: this.client.filter(\"recordRef = {:id}\", { id: recordId }),\n }),\n );\n }\n\n /**\n * @deprecated use collection(\"_externalAuths\").*\n *\n * Unlink a single external auth provider from the specified auth record.\n *\n * @throws {ClientResponseError}\n */\n async unlinkExternalAuth(\n recordId: string,\n provider: string,\n options?: CommonOptions,\n ): Promise<boolean> {\n const ea = await this.client.collection(\"_externalAuths\").getFirstListItem(\n this.client.filter(\"recordRef = {:recordId} && provider = {:provider}\", {\n recordId,\n provider,\n }),\n );\n\n return this.client\n .collection(\"_externalAuths\")\n .delete(ea.id, options)\n .then(() => true);\n }\n\n /**\n * Sends auth record OTP to the provided email.\n *\n * @throws {ClientResponseError}\n */\n async requestOTP(email: string, options?: CommonOptions): Promise<OTPResponse> {\n options = Object.assign(\n {\n method: \"POST\",\n body: { email: email },\n },\n options,\n );\n\n return this.client.send(this.baseCollectionPath + \"/request-otp\", options);\n }\n\n /**\n * Authenticate a single auth collection record via OTP.\n *\n * On success, this method also automatically updates\n * the client's AuthStore data and returns:\n * - the authentication token\n * - the authenticated record model\n *\n * @throws {ClientResponseError}\n */\n async authWithOTP<T = M>(\n otpId: string,\n password: string,\n options?: CommonOptions,\n ): Promise<RecordAuthResponse<T>> {\n options = Object.assign(\n {\n method: \"POST\",\n body: { otpId, password },\n },\n options,\n );\n\n return this.client\n .send(this.baseCollectionPath + \"/auth-with-otp\", options)\n .then((data) => this.authResponse<T>(data));\n }\n\n /**\n * Impersonate authenticates with the specified recordId and\n * returns a new client with the received auth token in a memory store.\n *\n * If `duration` is 0 the generated auth token will fallback\n * to the default collection auth token duration.\n *\n * This action currently requires superusers privileges.\n *\n * @throws {ClientResponseError}\n */\n async impersonate(\n recordId: string,\n duration: number,\n options?: CommonOptions,\n ): Promise<Client> {\n options = Object.assign(\n {\n method: \"POST\",\n body: { duration: duration },\n },\n options,\n );\n options.headers = options.headers || {};\n if (!options.headers.Authorization) {\n options.headers.Authorization = this.client.authStore.token;\n }\n\n // create a new client loaded with the impersonated auth state\n // ---\n const client = new Client(\n this.client.baseURL,\n new BaseAuthStore(),\n this.client.lang,\n );\n\n const authData = await client.send(\n this.baseCollectionPath + \"/impersonate/\" + encodeURIComponent(recordId),\n options,\n );\n\n client.authStore.save(authData?.token, this.decode(authData?.record || {}));\n // ---\n\n return client;\n }\n\n // ---------------------------------------------------------------\n\n // very rudimentary url query params replacement because at the moment\n // URL (and URLSearchParams) doesn't seem to be fully supported in React Native\n //\n // note: for details behind some of the decode/encode parsing check https://unixpapa.com/js/querystring.html\n private _replaceQueryParams(\n url: string,\n replacements: { [key: string]: any } = {},\n ): string {\n let urlPath = url;\n let query = \"\";\n\n const queryIndex = url.indexOf(\"?\");\n if (queryIndex >= 0) {\n urlPath = url.substring(0, url.indexOf(\"?\"));\n query = url.substring(url.indexOf(\"?\") + 1);\n }\n\n const parsedParams: { [key: string]: string } = {};\n\n // parse the query parameters\n const rawParams = query.split(\"&\");\n for (const param of rawParams) {\n if (param == \"\") {\n continue;\n }\n\n const pair = param.split(\"=\");\n parsedParams[decodeURIComponent(pair[0].replace(/\\+/g, \" \"))] =\n decodeURIComponent((pair[1] || \"\").replace(/\\+/g, \" \"));\n }\n\n // apply the replacements\n for (let key in replacements) {\n if (!replacements.hasOwnProperty(key)) {\n continue;\n }\n\n if (replacements[key] == null) {\n delete parsedParams[key];\n } else {\n parsedParams[key] = replacements[key];\n }\n }\n\n // construct back the full query string\n query = \"\";\n for (let key in parsedParams) {\n if (!parsedParams.hasOwnProperty(key)) {\n continue;\n }\n\n if (query != \"\") {\n query += \"&\";\n }\n\n query +=\n encodeURIComponent(key.replace(/%20/g, \"+\")) +\n \"=\" +\n encodeURIComponent(parsedParams[key].replace(/%20/g, \"+\"));\n }\n\n return query != \"\" ? urlPath + \"?\" + query : urlPath;\n }\n}\n\nfunction openBrowserPopup(url?: string): Window | null {\n if (typeof window === \"undefined\" || !window?.open) {\n throw new ClientResponseError(\n new Error(\n `Not in a browser context - please pass a custom urlCallback function.`,\n ),\n );\n }\n\n let width = 1024;\n let height = 768;\n\n let windowWidth = window.innerWidth;\n let windowHeight = window.innerHeight;\n\n // normalize window size\n width = width > windowWidth ? windowWidth : width;\n height = height > windowHeight ? windowHeight : height;\n\n let left = windowWidth / 2 - width / 2;\n let top = windowHeight / 2 - height / 2;\n\n // note: we don't use the noopener and noreferrer attributes since\n // for some reason browser blocks such windows then url is undefined/blank\n return window.open(\n url,\n \"popup_window\",\n \"width=\" +\n width +\n \",height=\" +\n height +\n \",top=\" +\n top +\n \",left=\" +\n left +\n \",resizable,menubar=no\",\n );\n}\n","import { CrudService } from \"@/services/CrudService\";\nimport { CollectionModel } from \"@/tools/dtos\";\nimport { CommonOptions } from \"@/tools/options\";\n\nexport class CollectionService extends CrudService<CollectionModel> {\n /**\n * @inheritdoc\n */\n get baseCrudPath(): string {\n return \"/api/collections\";\n }\n\n /**\n * Imports the provided collections.\n *\n * If `deleteMissing` is `true`, all local collections and their fields,\n * that are not present in the imported configuration, WILL BE DELETED\n * (including their related records data)!\n *\n * @throws {ClientResponseError}\n */\n async import(\n collections: Array<CollectionModel>,\n deleteMissing: boolean = false,\n options?: CommonOptions,\n ): Promise<true> {\n options = Object.assign(\n {\n method: \"PUT\",\n body: {\n collections: collections,\n deleteMissing: deleteMissing,\n },\n },\n options,\n );\n\n return this.client.send(this.baseCrudPath + \"/import\", options).then(() => true);\n }\n\n /**\n * Returns type indexed map with scaffolded collection models\n * populated with their default field values.\n *\n * @throws {ClientResponseError}\n */\n async getScaffolds(\n options?: CommonOptions,\n ): Promise<{ [key: string]: CollectionModel }> {\n options = Object.assign(\n {\n method: \"GET\",\n },\n options,\n );\n\n return this.client.send(this.baseCrudPath + \"/meta/scaffolds\", options);\n }\n\n /**\n * Deletes all records associated with the specified collection.\n *\n * @throws {ClientResponseError}\n */\n async truncate(collectionIdOrName: string, options?: CommonOptions): Promise<true> {\n options = Object.assign(\n {\n method: \"DELETE\",\n },\n options,\n );\n\n return this.client\n .send(\n this.baseCrudPath +\n \"/\" +\n encodeURIComponent(collectionIdOrName) +\n \"/truncate\",\n options,\n )\n .then(() => true);\n }\n}\n","import { ClientResponseError } from \"@/ClientResponseError\";\nimport { BaseService } from \"@/services/BaseService\";\nimport { ListResult, LogModel } from \"@/tools/dtos\";\nimport { CommonOptions, ListOptions, LogStatsOptions } from \"@/tools/options\";\n\nexport interface HourlyStats {\n total: number;\n date: string;\n}\n\nexport class LogService extends BaseService {\n /**\n * Returns paginated logs list.\n *\n * @throws {ClientResponseError}\n */\n async getList(\n page = 1,\n perPage = 30,\n options?: ListOptions,\n ): Promise<ListResult<LogModel>> {\n options = Object.assign({ method: \"GET\" }, options);\n\n options.query = Object.assign(\n {\n page: page,\n perPage: perPage,\n },\n options.query,\n );\n\n return this.client.send(\"/api/logs\", options);\n }\n\n /**\n * Returns a single log by its id.\n *\n * If `id` is empty it will throw a 404 error.\n *\n * @throws {ClientResponseError}\n */\n async getOne(id: string, options?: CommonOptions): Promise<LogModel> {\n if (!id) {\n throw new ClientResponseError({\n url: this.client.buildURL(\"/api/logs/\"),\n status: 404,\n response: {\n code: 404,\n message: \"Missing required log id.\",\n data: {},\n },\n });\n }\n\n options = Object.assign(\n {\n method: \"GET\",\n },\n options,\n );\n\n return this.client.send(\"/api/logs/\" + encodeURIComponent(id), options);\n }\n\n /**\n * Returns logs statistics.\n *\n * @throws {ClientResponseError}\n */\n async getStats(options?: LogStatsOptions): Promise<Array<HourlyStats>> {\n options = Object.assign(\n {\n method: \"GET\",\n },\n options,\n );\n\n return this.client.send(\"/api/logs/stats\", options);\n }\n}\n","import { BaseService } from \"@/services/BaseService\";\nimport { CommonOptions } from \"@/tools/options\";\n\nexport interface HealthCheckResponse {\n code: number;\n message: string;\n data: { [key: string]: any };\n}\n\nexport class HealthService extends BaseService {\n /**\n * Checks the health status of the api.\n *\n * @throws {ClientResponseError}\n */\n async check(options?: CommonOptions): Promise<HealthCheckResponse> {\n options = Object.assign(\n {\n method: \"GET\",\n },\n options,\n );\n\n return this.client.send(\"/api/health\", options);\n }\n}\n","import { BaseService } from \"@/services/BaseService\";\nimport { CommonOptions, FileOptions } from \"@/tools/options\";\n\nexport class FileService extends BaseService {\n /**\n * @deprecated Please replace with `pb.files.getURL()`.\n */\n getUrl(\n record: { [key: string]: any },\n filename: string,\n queryParams: FileOptions = {},\n ): string {\n console.warn(\"Please replace pb.files.getUrl() with pb.files.getURL()\");\n return this.getURL(record, filename, queryParams);\n }\n\n /**\n * Builds and returns an absolute record file url for the provided filename.\n */\n getURL(\n record: { [key: string]: any },\n filename: string,\n queryParams: FileOptions = {},\n ): string {\n if (\n !filename ||\n !record?.id ||\n !(record?.collectionId || record?.collectionName)\n ) {\n return \"\";\n }\n\n const parts = [];\n parts.push(\"api\");\n parts.push(\"files\");\n parts.push(encodeURIComponent(record.collectionId || record.collectionName));\n parts.push(encodeURIComponent(record.id));\n parts.push(encodeURIComponent(filename));\n\n let result = this.client.buildURL(parts.join(\"/\"));\n\n if (Object.keys(queryParams).length) {\n // normalize the download query param for consistency with the Dart sdk\n if (queryParams.download === false) {\n delete queryParams.download;\n }\n\n const params = new URLSearchParams(queryParams);\n\n result += (result.includes(\"?\") ? \"&\" : \"?\") + params;\n }\n\n return result;\n }\n\n /**\n * Requests a new private file access token for the current auth model.\n *\n * @throws {ClientResponseError}\n */\n async getToken(options?: CommonOptions): Promise<string> {\n options = Object.assign(\n {\n method: \"POST\",\n },\n options,\n );\n\n return this.client\n .send(\"/api/files/token\", options)\n .then((data) => data?.token || \"\");\n }\n}\n","import { BaseService } from \"@/services/BaseService\";\nimport { CommonOptions } from \"@/tools/options\";\n\nexport interface BackupFileInfo {\n key: string;\n size: number;\n modified: string;\n}\n\nexport class BackupService extends BaseService {\n /**\n * Returns list with all available backup files.\n *\n * @throws {ClientResponseError}\n */\n async getFullList(options?: CommonOptions): Promise<Array<BackupFileInfo>> {\n options = Object.assign(\n {\n method: \"GET\",\n },\n options,\n );\n\n return this.client.send(\"/api/backups\", options);\n }\n\n /**\n * Initializes a new backup.\n *\n * @throws {ClientResponseError}\n */\n async create(basename: string, options?: CommonOptions): Promise<boolean> {\n options = Object.assign(\n {\n method: \"POST\",\n body: {\n name: basename,\n },\n },\n options,\n );\n\n return this.client.send(\"/api/backups\", options).then(() => true);\n }\n\n /**\n * Uploads an existing backup file.\n *\n * Example:\n *\n * ```js\n * await pb.backups.upload({\n * file: new Blob([...]),\n * });\n * ```\n *\n * @throws {ClientResponseError}\n */\n async upload(\n bodyParams: { [key: string]: any } | FormData,\n options?: CommonOptions,\n ): Promise<boolean> {\n options = Object.assign(\n {\n method: \"POST\",\n body: bodyParams,\n },\n options,\n );\n\n return this.client.send(\"/api/backups/upload\", options).then(() => true);\n }\n\n /**\n * Deletes a single backup file.\n *\n * @throws {ClientResponseError}\n */\n async delete(key: string, options?: CommonOptions): Promise<boolean> {\n options = Object.assign(\n {\n method: \"DELETE\",\n },\n options,\n );\n\n return this.client\n .send(`/api/backups/${encodeURIComponent(key)}`, options)\n .then(() => true);\n }\n\n /**\n * Initializes an app data restore from an existing backup.\n *\n * @throws {ClientResponseError}\n */\n async restore(key: string, options?: CommonOptions): Promise<boolean> {\n options = Object.assign(\n {\n method: \"POST\",\n },\n options,\n );\n\n return this.client\n .send(`/api/backups/${encodeURIComponent(key)}/restore`, options)\n .then(() => true);\n }\n\n /**\n * @deprecated Please use `getDownloadURL()`.\n */\n getDownloadUrl(token: string, key: string): string {\n console.warn(\n \"Please replace pb.backups.getDownloadUrl() with pb.backups.getDownloadURL()\",\n );\n return this.getDownloadURL(token, key);\n }\n\n /**\n * Builds a download url for a single existing backup using a\n * superuser file token and the backup file key.\n *\n * The file token can be generated via `pb.files.getToken()`.\n */\n getDownloadURL(token: string, key: string): string {\n return this.client.buildURL(\n `/api/backups/${encodeURIComponent(key)}?token=${encodeURIComponent(token)}`,\n );\n }\n}\n","import { BaseService } from \"@/services/BaseService\";\nimport { CommonOptions } from \"@/tools/options\";\n\nexport interface CronJob {\n id: string;\n expression: string;\n}\n\nexport class CronService extends BaseService {\n /**\n * Returns list with all registered cron jobs.\n *\n * @throws {ClientResponseError}\n */\n async getFullList(options?: CommonOptions): Promise<Array<CronJob>> {\n options = Object.assign(\n {\n method: \"GET\",\n },\n options,\n );\n\n return this.client.send(\"/api/crons\", options);\n }\n\n /**\n * Runs the specified cron job.\n *\n * @throws {ClientResponseError}\n */\n async run(jobId: string, options?: CommonOptions): Promise<boolean> {\n options = Object.assign(\n {\n method: \"POST\",\n },\n options,\n );\n\n return this.client\n .send(`/api/crons/${encodeURIComponent(jobId)}`, options)\n .then(() => true);\n }\n}\n","/**\n * Checks if the specified value is a file (aka. File, Blob, RN file object).\n */\nexport function isFile(val: any): boolean {\n return (\n (typeof Blob !== \"undefined\" && val instanceof Blob) ||\n (typeof File !== \"undefined\" && val instanceof File) ||\n // check for React Native file object format\n // (see https://github.com/pocketbase/pocketbase/discussions/2002#discussioncomment-5254168)\n (val !== null &&\n typeof val === \"object\" &&\n val.uri &&\n ((typeof navigator !== \"undefined\" && navigator.product === \"ReactNative\") ||\n (typeof global !== \"undefined\" && (global as any).HermesInternal)))\n );\n}\n\n/**\n * Loosely checks if the specified body is a FormData instance.\n */\nexport function isFormData(body: any): boolean {\n return (\n body &&\n // we are checking the constructor name because FormData\n // is not available natively in some environments and the\n // polyfill(s) may not be globally accessible\n (body.constructor.name === \"FormData\" ||\n // fallback to global FormData instance check\n // note: this is needed because the constructor.name could be different in case of\n // custom global FormData implementation, eg. React Native on Android/iOS\n (typeof FormData !== \"undefined\" && body instanceof FormData))\n );\n}\n\n/**\n * Checks if the submitted body object has at least one Blob/File field value.\n */\nexport function hasFileField(body: { [key: string]: any }): boolean {\n for (const key in body) {\n const values = Array.isArray(body[key]) ? body[key] : [body[key]];\n for (const v of values) {\n if (isFile(v)) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n/**\n * Converts analyzes the provided body and converts it to FormData\n * in case a plain object with File/Blob values is used.\n */\nexport function convertToFormDataIfNeeded(body: any): any {\n if (\n typeof FormData === \"undefined\" ||\n typeof body === \"undefined\" ||\n typeof body !== \"object\" ||\n body === null ||\n isFormData(body) ||\n !hasFileField(body)\n ) {\n return body;\n }\n\n const form = new FormData();\n\n for (const key in body) {\n const val = body[key];\n\n if (typeof val === \"object\" && !hasFileField({ data: val })) {\n // send json-like values as jsonPayload to avoid the implicit string value normalization\n let payload: { [key: string]: any } = {};\n payload[key] = val;\n form.append(\"@jsonPayload\", JSON.stringify(payload));\n } else {\n // in case of mixed string and file/blob\n const normalizedVal = Array.isArray(val) ? val : [val];\n for (let v of normalizedVal) {\n form.append(key, v);\n }\n }\n }\n\n return form;\n}\n\n/**\n * Converts the provided FormData instance into a plain object.\n *\n * For consistency with the server multipart/form-data inferring,\n * the following normalization rules are applied for plain multipart string values:\n * - \"true\" is converted to the json \"true\"\n * - \"false\" is converted to the json \"false\"\n * - numeric strings are converted to json number ONLY if the resulted\n * minimal number string representation is the same as the provided raw string\n * (aka. scientific notations, \"Infinity\", \"0.0\", \"0001\", etc. are kept as string)\n * - any other string (empty string too) is left as it is\n */\nexport function convertFormDataToObject(formData: FormData): { [key: string]: any } {\n let result: { [key: string]: any } = {};\n\n formData.forEach((v, k) => {\n if (k === \"@jsonPayload\" && typeof v == \"string\") {\n try {\n let parsed = JSON.parse(v);\n Object.assign(result, parsed);\n } catch (err) {\n console.warn(\"@jsonPayload error:\", err);\n }\n } else {\n if (typeof result[k] !== \"undefined\") {\n if (!Array.isArray(result[k])) {\n result[k] = [result[k]];\n }\n result[k].push(inferFormDataValue(v));\n } else {\n result[k] = inferFormDataValue(v);\n }\n }\n });\n\n return result;\n}\n\nconst inferNumberCharsRegex = /^[\\-\\.\\d]+$/;\n\nfunction inferFormDataValue(value: any): any {\n if (typeof value != \"string\") {\n return value;\n }\n\n if (value == \"true\") {\n return true;\n }\n\n if (value == \"false\") {\n return false;\n }\n\n // note: expects the provided raw string to match exactly with the minimal string representation of the parsed number\n if (\n (value[0] === \"-\" || (value[0] >= \"0\" && value[0] <= \"9\")) &&\n inferNumberCharsRegex.test(value)\n ) {\n let num = +value;\n if (\"\" + num === value) {\n return num;\n }\n }\n\n return value;\n}\n","import { BaseService } from \"@/services/BaseService\";\nimport { isFile, isFormData, convertFormDataToObject } from \"@/tools/formdata\";\nimport {\n SendOptions,\n RecordOptions,\n normalizeUnknownQueryParams,\n serializeQueryParams,\n} from \"@/tools/options\";\n\nexport interface BatchRequest {\n method: string;\n url: string;\n json?: { [key: string]: any };\n files?: { [key: string]: Array<any> };\n headers?: { [key: string]: string };\n}\n\nexport interface BatchRequestResult {\n status: number;\n body: any;\n}\n\nexport class BatchService extends BaseService {\n private requests: Array<BatchRequest> = [];\n private subs: { [key: string]: SubBatchService } = {};\n\n /**\n * Starts constructing a batch request entry for the specified collection.\n */\n collection(collectionIdOrName: string): SubBatchService {\n if (!this.subs[collectionIdOrName]) {\n this.subs[collectionIdOrName] = new SubBatchService(\n this.requests,\n collectionIdOrName,\n );\n }\n\n return this.subs[collectionIdOrName];\n }\n\n /**\n * Sends the batch requests.\n *\n * @throws {ClientResponseError}\n */\n async send(options?: SendOptions): Promise<Array<BatchRequestResult>> {\n const formData = new FormData();\n\n const jsonData = [];\n\n for (let i = 0; i < this.requests.length; i++) {\n const req = this.requests[i];\n\n jsonData.push({\n method: req.method,\n url: req.url,\n headers: req.headers,\n body: req.json,\n });\n\n if (req.files) {\n for (let key in req.files) {\n const files = req.files[key] || [];\n for (let file of files) {\n formData.append(\"requests.\" + i + \".\" + key, file);\n }\n }\n }\n }\n\n formData.append(\"@jsonPayload\", JSON.stringify({ requests: jsonData }));\n\n options = Object.assign(\n {\n method: \"POST\",\n body: formData,\n },\n options,\n );\n\n return this.client.send(\"/api/batch\", options);\n }\n}\n\nexport class SubBatchService {\n private requests: Array<BatchRequest> = [];\n private readonly collectionIdOrName: string;\n\n constructor(requests: Array<BatchRequest>, collectionIdOrName: string) {\n this.requests = requests;\n this.collectionIdOrName = collectionIdOrName;\n }\n\n /**\n * Registers a record upsert request into the current batch queue.\n *\n * The request will be executed as update if `bodyParams` have a valid existing record `id` value, otherwise - create.\n */\n upsert(\n bodyParams?: { [key: string]: any } | FormData,\n options?: RecordOptions,\n ): void {\n options = Object.assign(\n {\n body: bodyParams || {},\n },\n options,\n );\n\n const request: BatchRequest = {\n method: \"PUT\",\n url:\n \"/api/collections/\" +\n encodeURIComponent(this.collectionIdOrName) +\n \"/records\",\n };\n\n this.prepareRequest(request, options);\n\n this.requests.push(request);\n }\n\n /**\n * Registers a record create request into the current batch queue.\n */\n create(\n bodyParams?: { [key: string]: any } | FormData,\n options?: RecordOptions,\n ): void {\n options = Object.assign(\n {\n body: bodyParams || {},\n },\n options,\n );\n\n const request: BatchRequest = {\n method: \"POST\",\n url:\n \"/api/collections/\" +\n encodeURIComponent(this.collectionIdOrName) +\n \"/records\",\n };\n\n this.prepareRequest(request, options);\n\n this.requests.push(request);\n }\n\n /**\n * Registers a record update request into the current batch queue.\n */\n update(\n id: string,\n bodyParams?: { [key: string]: any } | FormData,\n options?: RecordOptions,\n ): void {\n options = Object.assign(\n {\n body: bodyParams || {},\n },\n options,\n );\n\n const request: BatchRequest = {\n method: \"PATCH\",\n url:\n \"/api/collections/\" +\n encodeURIComponent(this.collectionIdOrName) +\n \"/records/\" +\n encodeURIComponent(id),\n };\n\n this.prepareRequest(request, options);\n\n this.requests.push(request);\n }\n\n /**\n * Registers a record delete request into the current batch queue.\n */\n delete(id: string, options?: SendOptions): void {\n options = Object.assign({}, options);\n\n const request: BatchRequest = {\n method: \"DELETE\",\n url:\n \"/api/collections/\" +\n encodeURIComponent(this.collectionIdOrName) +\n \"/records/\" +\n encodeURIComponent(id),\n };\n\n this.prepareRequest(request, options);\n\n this.requests.push(request);\n }\n\n private prepareRequest(request: BatchRequest, options: SendOptions) {\n normalizeUnknownQueryParams(options);\n\n request.headers = options.headers;\n request.json = {};\n request.files = {};\n\n // serialize query parameters\n // -----------------------------------------------------------\n if (typeof options.query !== \"undefined\") {\n const query = serializeQueryParams(options.query);\n if (query) {\n request.url += (request.url.includes(\"?\") ? \"&\" : \"?\") + query;\n }\n }\n\n // extract json and files body data\n // -----------------------------------------------------------\n let body = options.body;\n if (isFormData(body)) {\n body = convertFormDataToObject(body);\n }\n\n for (const key in body) {\n const val = body[key];\n\n if (isFile(val)) {\n request.files[key] = request.files[key] || [];\n request.files[key].push(val);\n } else if (Array.isArray(val)) {\n const foundFiles = [];\n const foundRegular = [];\n for (const v of val) {\n if (isFile(v)) {\n foundFiles.push(v);\n } else {\n foundRegular.push(v);\n }\n }\n\n if (foundFiles.length > 0 && foundFiles.length == val.length) {\n // only files\n // ---\n request.files[key] = request.files[key] || [];\n for (let file of foundFiles) {\n request.files[key].push(file);\n }\n } else {\n // empty or mixed array (both regular and File/Blob values)\n // ---\n request.json[key] = foundRegular;\n\n if (foundFiles.length > 0) {\n // add \"+\" to append if not already since otherwise\n // the existing regular files will be deleted\n // (the mixed values order is preserved only within their corresponding groups)\n let fileKey = key;\n if (!key.startsWith(\"+\") && !key.endsWith(\"+\")) {\n fileKey += \"+\";\n }\n\n request.files[fileKey] = request.files[fileKey] || [];\n for (let file of foundFiles) {\n request.files[fileKey].push(file);\n }\n }\n }\n } else {\n request.json[key] = val;\n }\n }\n }\n}\n","import { ClientResponseError } from \"@/ClientResponseError\";\nimport { BaseAuthStore } from \"@/stores/BaseAuthStore\";\nimport { LocalAuthStore } from \"@/stores/LocalAuthStore\";\nimport { SettingsService } from \"@/services/SettingsService\";\nimport { RecordService } from \"@/services/RecordService\";\nimport { CollectionService } from \"@/services/CollectionService\";\nimport { LogService } from \"@/services/LogService\";\nimport { RealtimeService } from \"@/services/RealtimeService\";\nimport { HealthService } from \"@/services/HealthService\";\nimport { FileService } from \"@/services/FileService\";\nimport { BackupService } from \"@/services/BackupService\";\nimport { CronService } from \"@/services/CronService\";\nimport { BatchService } from \"@/services/BatchService\";\nimport { RecordModel } from \"@/tools/dtos\";\nimport {\n SendOptions,\n FileOptions,\n normalizeUnknownQueryParams,\n serializeQueryParams,\n} from \"@/tools/options\";\nimport { isFormData, convertToFormDataIfNeeded } from \"@/tools/formdata\";\n\nexport interface BeforeSendResult {\n [key: string]: any; // for backward compatibility\n url?: string;\n options?: { [key: string]: any };\n}\n\n/**\n * PocketBase JS Client.\n */\nexport default class Client {\n /**\n * The base PocketBase backend url address (eg. 'http://127.0.0.1.8090').\n */\n baseURL: string;\n\n /**\n * Legacy getter alias for baseURL.\n * @deprecated Please replace with baseURL.\n */\n get baseUrl(): string {\n return this.baseURL;\n }\n\n /**\n * Legacy setter alias for baseURL.\n * @deprecated Please replace with baseURL.\n */\n set baseUrl(v: string) {\n this.baseURL = v;\n }\n\n /**\n * Hook that get triggered right before sending the fetch request,\n * allowing you to inspect and modify the url and request options.\n *\n * For list of the possible options check https://developer.mozilla.org/en-US/docs/Web/API/fetch#options\n *\n * You can return a non-empty result object `{ url, options }` to replace the url and request options entirely.\n *\n * Example:\n * ```js\n * client.beforeSend = function (url, options) {\n * options.headers = Object.assign({}, options.headers, {\n * 'X-Custom-Header': 'example',\n * });\n *\n * return { url, options }\n * };\n * ```\n */\n beforeSend?: (\n url: string,\n options: SendOptions,\n ) => BeforeSendResult | Promise<BeforeSendResult>;\n\n /**\n * Hook that get triggered after successfully sending the fetch request,\n * allowing you to inspect/modify the response object and its parsed data.\n *\n * Returns the new Promise resolved `data` that will be returned to the client.\n *\n * Example:\n * ```js\n * client.afterSend = function (response, data, options) {\n * if (response.status != 200) {\n * throw new ClientResponseError({\n * url: response.url,\n * status: response.status,\n * response: { ... },\n * });\n * }\n *\n * return data;\n * };\n * ```\n */\n afterSend?: ((response: Response, data: any) => any) &\n ((response: Response, data: any, options: SendOptions) => any);\n\n /**\n * Optional language code (default to `en-US`) that will be sent\n * with the requests to the server as `Accept-Language` header.\n */\n lang: string;\n\n /**\n * A replaceable instance of the local auth store service.\n */\n authStore: BaseAuthStore;\n\n /**\n * An instance of the service that handles the **Settings APIs**.\n */\n readonly settings: SettingsService;\n\n /**\n * An instance of the service that handles the **Collection APIs**.\n */\n readonly collections: CollectionService;\n\n /**\n * An instance of the service that handles the **File APIs**.\n */\n readonly files: FileService;\n\n /**\n * An instance of the service that handles the **Log APIs**.\n */\n readonly logs: LogService;\n\n /**\n * An instance of the service that handles the **Realtime APIs**.\n */\n readonly realtime: RealtimeService;\n\n /**\n * An instance of the service that handles the **Health APIs**.\n */\n readonly health: HealthService;\n\n /**\n * An instance of the service that handles the **Backup APIs**.\n */\n readonly backups: BackupService;\n\n /**\n * An instance of the service that handles the **Cron APIs**.\n */\n readonly crons: CronService;\n\n private cancelControllers: { [key: string]: AbortController } = {};\n private recordServices: { [key: string]: RecordService } = {};\n private enableAutoCancellation: boolean = true;\n\n constructor(baseURL = \"/\", authStore?: BaseAuthStore | null, lang = \"en-US\") {\n this.baseURL = baseURL;\n this.lang = lang;\n\n if (authStore) {\n this.authStore = authStore;\n } else if (typeof window != \"undefined\" && !!(window as any).Deno) {\n // note: to avoid common security issues we fallback to runtime/memory store in case the code is running in Deno env\n this.authStore = new BaseAuthStore();\n } else {\n this.authStore = new LocalAuthStore();\n }\n\n // common services\n this.collections = new CollectionService(this);\n this.files = new FileService(this);\n this.logs = new LogService(this);\n this.settings = new SettingsService(this);\n this.realtime = new RealtimeService(this);\n this.health = new HealthService(this);\n this.backups = new BackupService(this);\n this.crons = new CronService(this);\n }\n\n /**\n * @deprecated\n * With PocketBase v0.23.0 admins are converted to a regular auth\n * collection named \"_superusers\", aka. you can use directly collection(\"_superusers\").\n */\n get admins(): RecordService {\n return this.collection(\"_superusers\");\n }\n\n /**\n * Creates a new batch handler for sending multiple transactional\n * create/update/upsert/delete collection requests in one network call.\n *\n * Example:\n * ```js\n * const batch = pb.createBatch();\n *\n * batch.collection(\"example1\").create({ ... })\n * batch.collection(\"example2\").update(\"RECORD_ID\", { ... })\n * batch.collection(\"example3\").delete(\"RECORD_ID\")\n * batch.collection(\"example4\").upsert({ ... })\n *\n * await batch.send()\n * ```\n */\n createBatch(): BatchService {\n return new BatchService(this);\n }\n\n /**\n * Returns the RecordService associated to the specified collection.\n */\n collection<M = RecordModel>(idOrName: string): RecordService<M> {\n if (!this.recordServices[idOrName]) {\n this.recordServices[idOrName] = new RecordService(this, idOrName);\n }\n\n return this.recordServices[idOrName];\n }\n\n /**\n * Globally enable or disable auto cancellation for pending duplicated requests.\n */\n autoCancellation(enable: boolean): Client {\n this.enableAutoCancellation = !!enable;\n\n return this;\n }\n\n /**\n * Cancels single request by its cancellation key.\n */\n cancelRequest(requestKey: string): Client {\n if (this.cancelControllers[requestKey]) {\n this.cancelControllers[requestKey].abort();\n delete this.cancelControllers[requestKey];\n }\n\n return this;\n }\n\n /**\n * Cancels all pending requests.\n */\n cancelAllRequests(): Client {\n for (let k in this.cancelControllers) {\n this.cancelControllers[k].abort();\n }\n\n this.cancelControllers = {};\n\n return this;\n }\n\n /**\n * Constructs a filter expression with placeholders populated from a parameters object.\n *\n * Placeholder parameters are defined with the `{:paramName}` notation.\n *\n * The following parameter values are supported:\n *\n * - `string` (_single quotes are autoescaped_)\n * - `number`\n * - `boolean`\n * - `Date` object (_stringified into the PocketBase datetime format_)\n * - `null`\n * - everything else is converted to a string using `JSON.stringify()`\n *\n * Example:\n *\n * ```js\n * pb.collection(\"example\").getFirstListItem(pb.filter(\n * 'title ~ {:title} && created >= {:created}',\n * { title: \"example\", created: new Date()}\n * ))\n * ```\n */\n filter(raw: string, params?: { [key: string]: any }): string {\n if (!params) {\n return raw;\n }\n\n for (let key in params) {\n let val = params[key];\n switch (typeof val) {\n case \"boolean\":\n case \"number\":\n val = \"\" + val;\n break;\n case \"string\":\n val = \"'\" + val.replace(/'/g, \"\\\\'\") + \"'\";\n break;\n default:\n if (val === null) {\n val = \"null\";\n } else if (val instanceof Date) {\n val = \"'\" + val.toISOString().replace(\"T\", \" \") + \"'\";\n } else {\n val = \"'\" + JSON.stringify(val).replace(/'/g, \"\\\\'\") + \"'\";\n }\n }\n raw = raw.replaceAll(\"{:\" + key + \"}\", val);\n }\n\n return raw;\n }\n\n /**\n * @deprecated Please use `pb.files.getURL()`.\n */\n getFileUrl(\n record: { [key: string]: any },\n filename: string,\n queryParams: FileOptions = {},\n ): string {\n console.warn(\"Please replace pb.getFileUrl() with pb.files.getURL()\");\n return this.files.getURL(record, filename, queryParams);\n }\n\n /**\n * @deprecated Please use `pb.buildURL()`.\n */\n buildUrl(path: string): string {\n console.warn(\"Please replace pb.buildUrl() with pb.buildURL()\");\n return this.buildURL(path);\n }\n\n /**\n * Builds a full client url by safely concatenating the provided path.\n */\n buildURL(path: string): string {\n let url = this.baseURL;\n\n // construct an absolute base url if in a browser environment\n if (\n typeof window !== \"undefined\" &&\n !!window.location &&\n !url.startsWith(\"https://\") &&\n !url.startsWith(\"http://\")\n ) {\n url = window.location.origin?.endsWith(\"/\")\n ? window.location.origin.substring(0, window.location.origin.length - 1)\n : window.location.origin || \"\";\n\n if (!this.baseURL.startsWith(\"/\")) {\n url += window.location.pathname || \"/\";\n url += url.endsWith(\"/\") ? \"\" : \"/\";\n }\n\n url += this.baseURL;\n }\n\n // concatenate the path\n if (path) {\n url += url.endsWith(\"/\") ? \"\" : \"/\"; // append trailing slash if missing\n url += path.startsWith(\"/\") ? path.substring(1) : path;\n }\n\n return url;\n }\n\n /**\n * Sends an api http request.\n *\n * @throws {ClientResponseError}\n */\n async send<T = any>(path: string, options: SendOptions): Promise<T> {\n options = this.initSendOptions(path, options);\n\n // build url + path\n let url = this.buildURL(path);\n\n if (this.beforeSend) {\n const result = Object.assign({}, await this.beforeSend(url, options));\n if (\n typeof result.url !== \"undefined\" ||\n typeof result.options !== \"undefined\"\n ) {\n url = result.url || url;\n options = result.options || options;\n } else if (Object.keys(result).length) {\n // legacy behavior\n options = result as SendOptions;\n console?.warn &&\n console.warn(\n \"Deprecated format of beforeSend return: please use `return { url, options }`, instead of `return options`.\",\n );\n }\n }\n\n // serialize the query parameters\n if (typeof options.query !== \"undefined\") {\n const query = serializeQueryParams(options.query);\n if (query) {\n url += (url.includes(\"?\") ? \"&\" : \"?\") + query;\n }\n delete options.query;\n }\n\n // ensures that the json body is serialized\n if (\n this.getHeader(options.headers, \"Content-Type\") == \"application/json\" &&\n options.body &&\n typeof options.body !== \"string\"\n ) {\n options.body = JSON.stringify(options.body);\n }\n\n const fetchFunc = options.fetch || fetch;\n\n // send the request\n return fetchFunc(url, options)\n .then(async (response) => {\n let data: any = {};\n\n try {\n data = await response.json();\n } catch (_) {\n // all api responses are expected to return json\n // with the exception of the realtime event and 204\n }\n\n if (this.afterSend) {\n data = await this.afterSend(response, data, options);\n }\n\n if (response.status >= 400) {\n throw new ClientResponseError({\n url: response.url,\n status: response.status,\n data: data,\n });\n }\n\n return data as T;\n })\n .catch((err) => {\n // wrap to normalize all errors\n throw new ClientResponseError(err);\n });\n }\n\n /**\n * Shallow copy the provided object and takes care to initialize\n * any options required to preserve the backward compatability.\n *\n * @param {SendOptions} options\n * @return {SendOptions}\n */\n private initSendOptions(path: string, options: SendOptions): SendOptions {\n options = Object.assign({ method: \"GET\" } as SendOptions, options);\n\n // auto convert the body to FormData, if needed\n options.body = convertToFormDataIfNeeded(options.body);\n\n // move unknown send options as query parameters\n normalizeUnknownQueryParams(options);\n\n // requestKey normalizations for backward-compatibility\n // ---\n options.query = Object.assign({}, options.params, options.query);\n if (typeof options.requestKey === \"undefined\") {\n if (options.$autoCancel === false || options.query.$autoCancel === false) {\n options.requestKey = null;\n } else if (options.$cancelKey || options.query.$cancelKey) {\n options.requestKey = options.$cancelKey || options.query.$cancelKey;\n }\n }\n // remove the deprecated special cancellation params from the other query params\n delete options.$autoCancel;\n delete options.query.$autoCancel;\n delete options.$cancelKey;\n delete options.query.$cancelKey;\n // ---\n\n // add the json header, if not explicitly set\n // (for FormData body the Content-Type header should be skipped since the boundary is autogenerated)\n if (\n this.getHeader(options.headers, \"Content-Type\") === null &&\n !isFormData(options.body)\n ) {\n options.headers = Object.assign({}, options.headers, {\n \"Content-Type\": \"application/json\",\n });\n }\n\n // add Accept-Language header, if not explicitly set\n if (this.getHeader(options.headers, \"Accept-Language\") === null) {\n options.headers = Object.assign({}, options.headers, {\n \"Accept-Language\": this.lang,\n });\n }\n\n // check if Authorization header can be added\n if (\n // has valid token\n this.authStore.token &&\n // auth header is not explicitly set\n this.getHeader(options.headers, \"Authorization\") === null\n ) {\n options.headers = Object.assign({}, options.headers, {\n Authorization: this.authStore.token,\n });\n }\n\n // handle auto cancelation for duplicated pending request\n if (this.enableAutoCancellation && options.requestKey !== null) {\n const requestKey = options.requestKey || (options.method || \"GET\") + path;\n\n delete options.requestKey;\n\n // cancel previous pending requests\n this.cancelRequest(requestKey);\n\n const controller = new AbortController();\n this.cancelControllers[requestKey] = controller;\n options.signal = controller.signal;\n }\n\n return options;\n }\n\n /**\n * Extracts the header with the provided name in case-insensitive manner.\n * Returns `null` if no header matching the name is found.\n */\n private getHeader(\n headers: { [key: string]: string } | undefined,\n name: string,\n ): string | null {\n headers = headers || {};\n name = name.toLowerCase();\n\n for (let key in headers) {\n if (key.toLowerCase() == name) {\n return headers[key];\n }\n }\n\n return null;\n }\n}\n","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","/**\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 { 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\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 }\n\n /**\n * Access a collection for CRUD operations.\n *\n * @example\n * ```ts\n * const posts = await pb.collection('posts').getList(1, 20)\n * ```\n */\n collection<T = RecordModel>(name: string): PicoBaseCollection<T> {\n return new PicoBaseCollection<T>(this.pb, name)\n }\n\n /**\n * Call a server-side function (PocketBase custom API endpoint).\n * Proxies to PocketBase's send() method.\n */\n async send<T = unknown>(path: string, options?: SendOptions): Promise<T> {\n return this.pb.send<T>(path, options ?? {})\n }\n\n /**\n * Call a remote procedure (RPC) - a convenience method for calling custom API endpoints.\n *\n * Maps Supabase-style RPC calls to PicoBase custom endpoints:\n * - `pb.rpc('my_function', params)` → `POST /api/rpc/my_function` with params as body\n *\n * @example\n * ```ts\n * // Simple RPC call\n * const result = await pb.rpc('calculate_total', { cart_id: '123' })\n *\n * // Complex RPC with typed response\n * interface DashboardStats {\n * posts: number\n * comments: number\n * followers: number\n * }\n * const stats = await pb.rpc<DashboardStats>('get_dashboard_stats', {\n * user_id: currentUser.id\n * })\n * ```\n *\n * @param functionName The name of the RPC function to call\n * @param params Optional parameters to pass to the function\n * @returns The function result\n */\n async rpc<T = unknown>(functionName: string, params?: Record<string, unknown>): Promise<T> {\n try {\n return await this.send<T>(`/api/rpc/${functionName}`, {\n method: 'POST',\n body: params ?? {},\n })\n } catch (err: unknown) {\n // Wrap errors with RpcError for better error messages\n const status = (err as { status?: number })?.status ?? 500\n const details = (err as { data?: unknown })?.data\n throw new RpcError(functionName, status, details)\n }\n }\n\n /**\n * Get the current auth token (if signed in), or empty string.\n */\n get token(): string {\n return this.pb.authStore.token\n }\n\n /**\n * Check if a user is currently authenticated.\n */\n get isAuthenticated(): boolean {\n return this.pb.authStore.isValid\n }\n\n /**\n * Monkey-patch pb.send to retry on 503 (cold start).\n *\n * When an instance is stopped or starting, the proxy returns 503.\n * The SDK automatically retries with exponential backoff so the developer\n * doesn't have to handle cold-start logic.\n */\n private _wrapSendWithRetry(): void {\n const originalSend = this.pb.send.bind(this.pb)\n const maxRetries = this.options.maxColdStartRetries\n\n this.pb.send = async <T>(path: string, options: SendOptions): Promise<T> => {\n let lastError: unknown\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await originalSend<T>(path, options)\n } catch (err: unknown) {\n lastError = err\n\n // Check if this is a 503 (instance starting up)\n const status = (err as { status?: number })?.status\n if (status === 503 && attempt < maxRetries) {\n // Exponential backoff: 2s, 4s, 8s\n const delay = Math.pow(2, attempt + 1) * 1000\n await new Promise(resolve => setTimeout(resolve, delay))\n continue\n }\n\n // Check if this is a 401 from our gateway (bad API key)\n if (status === 401) {\n const data = (err as { data?: { code?: string } })?.data\n if (data?.code === 'INVALID_API_KEY') {\n throw new AuthorizationError()\n }\n }\n\n // Detect collection-not-found for a clearer message\n if (status === 404) {\n const msg = (err as { message?: string })?.message ?? ''\n if (msg.toLowerCase().includes('missing collection') || msg.toLowerCase().includes('not found collection')) {\n const match = msg.match(/[\"']([^\"']+)[\"']/)\n throw new CollectionNotFoundError(match?.[1] ?? 'unknown')\n }\n }\n\n throw err\n }\n }\n\n throw new InstanceUnavailableError(\n `Instance unavailable after ${maxRetries} retries. ` +\n `Original error: ${lastError instanceof Error ? lastError.message : String(lastError)}`\n )\n }\n }\n}\n\n/**\n * Create a new PicoBase client.\n *\n * Can be called with explicit URL and API key, or with zero arguments to\n * auto-detect from environment variables (`PICOBASE_URL` / `NEXT_PUBLIC_PICOBASE_URL`\n * and `PICOBASE_API_KEY` / `NEXT_PUBLIC_PICOBASE_API_KEY`).\n *\n * @example\n * ```ts\n * import { createClient } from '@picobase_app/client'\n *\n * // Zero-config — reads from env vars\n * const pb = createClient()\n *\n * // Or explicit\n * const pb = createClient('https://myapp.picobase.com', 'pbk_abc123_secret')\n *\n * // Sign up a user\n * const user = await pb.auth.signUp({\n * email: 'user@example.com',\n * password: 'securepassword',\n * })\n *\n * // Query records\n * const posts = await pb.collection('posts').getList(1, 20, {\n * filter: 'published = true',\n * sort: '-created',\n * })\n * ```\n */\nexport function createClient(options?: PicoBaseClientOptions): PicoBaseClient\nexport function createClient(url: string, apiKey: string, options?: PicoBaseClientOptions): PicoBaseClient\nexport function createClient(\n urlOrOptions?: string | PicoBaseClientOptions,\n apiKeyOrUndefined?: string,\n options?: PicoBaseClientOptions,\n): PicoBaseClient {\n // Zero-arg / options-only: read from env\n if (typeof urlOrOptions !== 'string') {\n const env = typeof process !== 'undefined' ? process.env : {} as Record<string, string | undefined>\n const url = env.PICOBASE_URL || env.NEXT_PUBLIC_PICOBASE_URL\n const apiKey = env.PICOBASE_API_KEY || env.NEXT_PUBLIC_PICOBASE_API_KEY\n\n if (!url || !apiKey) {\n const missing = [\n !url && 'PICOBASE_URL (or NEXT_PUBLIC_PICOBASE_URL)',\n !apiKey && 'PICOBASE_API_KEY (or NEXT_PUBLIC_PICOBASE_API_KEY)',\n ].filter(Boolean).join(' and ')\n\n throw new ConfigurationError(\n `Missing environment variable${!url && !apiKey ? 's' : ''}: ${missing}`,\n 'Add them to your .env.local file:\\n\\n' +\n ' PICOBASE_URL=https://your-app.picobase.com\\n' +\n ' PICOBASE_API_KEY=pbk_your_key_here\\n\\n' +\n 'Or for Next.js (client-side access), prefix with NEXT_PUBLIC_:\\n\\n' +\n ' NEXT_PUBLIC_PICOBASE_URL=https://your-app.picobase.com\\n' +\n ' NEXT_PUBLIC_PICOBASE_API_KEY=pbk_your_key_here\\n\\n' +\n 'Get your URL and API key from: https://picobase.com/dashboard\\n' +\n 'Or run: picobase init',\n )\n }\n\n return new PicoBaseClient(url, apiKey, urlOrOptions)\n }\n\n return new PicoBaseClient(urlOrOptions, apiKeyOrUndefined!, options)\n}\n"]}
1
+ {"version":3,"sources":["../src/auth.ts","../src/collection.ts","../src/realtime.ts","../src/storage.ts","../src/admin.ts","../src/errors.ts","../src/client.ts"],"names":["PocketBase","url"],"mappings":"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","file":"index.js","sourcesContent":["import type PocketBase from 'pocketbase'\nimport type {\n AuthResponse,\n AuthStateChangeCallback,\n AuthEvent,\n SignUpOptions,\n SignInOptions,\n OAuthSignInOptions,\n RecordModel,\n} from './types'\n\n/**\n * Auth module — handles user sign-up, sign-in, OAuth, and session management.\n *\n * PicoBase uses PocketBase's built-in `users` collection for auth. Each\n * instance has its own isolated user pool.\n *\n * @example\n * ```ts\n * // Sign up\n * const { token, record } = await pb.auth.signUp({\n * email: 'user@example.com',\n * password: 'securepassword',\n * })\n *\n * // Sign in\n * const { token, record } = await pb.auth.signIn({\n * email: 'user@example.com',\n * password: 'securepassword',\n * })\n *\n * // Listen to auth changes\n * pb.auth.onStateChange((event, record) => {\n * console.log(event, record)\n * })\n * ```\n */\nexport class PicoBaseAuth {\n private pb: PocketBase\n private listeners: Set<AuthStateChangeCallback> = new Set()\n private _collection: string = 'users'\n\n constructor(pb: PocketBase) {\n this.pb = pb\n\n // Listen to PocketBase auth store changes and re-emit\n this.pb.authStore.onChange((token) => {\n const record = this.pb.authStore.record ?? null\n const event: AuthEvent = token ? 'SIGNED_IN' : 'SIGNED_OUT'\n this._notify(event, record)\n })\n }\n\n /**\n * Set which collection to authenticate against.\n * Defaults to 'users'. Use this if you have a custom auth collection.\n */\n setCollection(name: string): this {\n this._collection = name\n return this\n }\n\n /**\n * Create a new user account.\n */\n async signUp(options: SignUpOptions): Promise<AuthResponse> {\n const { email, password, passwordConfirm, ...rest } = options\n\n const record = await this.pb.collection(this._collection).create<RecordModel>({\n email,\n password,\n passwordConfirm: passwordConfirm ?? password,\n ...rest,\n })\n\n // Automatically sign in after sign-up\n const authResult = await this.pb\n .collection(this._collection)\n .authWithPassword<RecordModel>(email, password)\n\n return {\n token: authResult.token,\n record: authResult.record,\n }\n }\n\n /**\n * Sign in with email and password.\n */\n async signIn(options: SignInOptions): Promise<AuthResponse> {\n const result = await this.pb\n .collection(this._collection)\n .authWithPassword<RecordModel>(options.email, options.password)\n\n return {\n token: result.token,\n record: result.record,\n }\n }\n\n /**\n * Sign in with an OAuth2 provider (Google, GitHub, etc.).\n *\n * In browser environments this opens a popup/redirect to the provider.\n * Configure providers in your PicoBase dashboard.\n */\n async signInWithOAuth(options: OAuthSignInOptions): Promise<AuthResponse> {\n const result = await this.pb.collection(this._collection).authWithOAuth2({\n provider: options.provider,\n scopes: options.scopes,\n createData: options.createData,\n urlCallback: options.urlCallback,\n })\n\n return {\n token: result.token,\n record: result.record,\n }\n }\n\n /**\n * Refresh the current auth token.\n */\n async refreshToken(): Promise<AuthResponse> {\n const result = await this.pb.collection(this._collection).authRefresh<RecordModel>()\n this._notify('TOKEN_REFRESHED', result.record)\n return {\n token: result.token,\n record: result.record,\n }\n }\n\n /**\n * Send a password reset email.\n */\n async requestPasswordReset(email: string): Promise<void> {\n await this.pb.collection(this._collection).requestPasswordReset(email)\n }\n\n /**\n * Confirm a password reset with the token from the reset email.\n */\n async confirmPasswordReset(\n token: string,\n password: string,\n passwordConfirm?: string,\n ): Promise<void> {\n await this.pb\n .collection(this._collection)\n .confirmPasswordReset(token, password, passwordConfirm ?? password)\n }\n\n /**\n * Send an email verification email.\n */\n async requestVerification(email: string): Promise<void> {\n await this.pb.collection(this._collection).requestVerification(email)\n }\n\n /**\n * Confirm email verification with the token from the verification email.\n */\n async confirmVerification(token: string): Promise<void> {\n await this.pb.collection(this._collection).confirmVerification(token)\n }\n\n /**\n * Sign out the current user. Clears the local auth store.\n */\n signOut(): void {\n this.pb.authStore.clear()\n }\n\n /**\n * Get the currently authenticated user record, or `null` if not signed in.\n */\n get user(): RecordModel | null {\n return this.pb.authStore.record\n }\n\n /**\n * Get the current auth token, or empty string if not signed in.\n */\n get token(): string {\n return this.pb.authStore.token\n }\n\n /**\n * Check if the current auth session is valid (token exists and not expired).\n */\n get isValid(): boolean {\n return this.pb.authStore.isValid\n }\n\n /**\n * Listen to auth state changes. Returns an unsubscribe function.\n *\n * @example\n * ```ts\n * const unsubscribe = pb.auth.onStateChange((event, record) => {\n * if (event === 'SIGNED_IN') {\n * console.log('Welcome', record.email)\n * }\n * })\n *\n * // Later:\n * unsubscribe()\n * ```\n */\n onStateChange(callback: AuthStateChangeCallback): () => void {\n this.listeners.add(callback)\n return () => {\n this.listeners.delete(callback)\n }\n }\n\n private _notify(event: AuthEvent, record: RecordModel | null): void {\n for (const cb of this.listeners) {\n try {\n cb(event, record)\n } catch {\n // Don't let one listener crash others\n }\n }\n }\n}\n","import type PocketBase from 'pocketbase'\nimport type { RecordModel, ListResult } from 'pocketbase'\n\n/** Options for list queries. */\nexport interface ListOptions {\n sort?: string\n filter?: string\n expand?: string\n fields?: string\n skipTotal?: boolean\n [key: string]: unknown\n}\n\n/** Options for single record queries. */\nexport interface RecordQueryOptions {\n expand?: string\n fields?: string\n [key: string]: unknown\n}\n\n/**\n * Collection module — CRUD operations on a PocketBase collection.\n *\n * @example\n * ```ts\n * const posts = pb.collection('posts')\n *\n * // List with filtering, sorting, and pagination\n * const result = await posts.getList(1, 20, {\n * filter: 'published = true',\n * sort: '-created',\n * expand: 'author',\n * })\n *\n * // Get a single record\n * const post = await posts.getOne('record_id')\n *\n * // Create a record\n * const newPost = await posts.create({\n * title: 'Hello World',\n * content: 'My first post',\n * })\n *\n * // Update a record\n * const updated = await posts.update('record_id', { title: 'Updated' })\n *\n * // Delete a record\n * await posts.delete('record_id')\n * ```\n */\nexport class PicoBaseCollection<T = RecordModel> {\n private pb: PocketBase\n private name: string\n\n constructor(pb: PocketBase, name: string) {\n this.pb = pb\n this.name = name\n }\n\n /**\n * Fetch a paginated list of records.\n *\n * @param page - Page number (1-indexed). Default: 1.\n * @param perPage - Records per page. Default: 30.\n * @param options - Filter, sort, expand, fields.\n */\n async getList(page = 1, perPage = 30, options: ListOptions = {}): Promise<ListResult<T>> {\n return this.pb.collection(this.name).getList<T>(page, perPage, options)\n }\n\n /**\n * Fetch all records matching the filter (auto-paginates).\n *\n * **Warning:** Use with caution on large collections. Prefer `getList()` with pagination.\n */\n async getFullList(options: ListOptions = {}): Promise<T[]> {\n return this.pb.collection(this.name).getFullList<T>(options)\n }\n\n /**\n * Fetch a single record by ID.\n */\n async getOne(id: string, options: RecordQueryOptions = {}): Promise<T> {\n return this.pb.collection(this.name).getOne<T>(id, options)\n }\n\n /**\n * Fetch the first record matching a filter.\n *\n * @example\n * ```ts\n * const admin = await pb.collection('users').getFirstListItem('role = \"admin\"')\n * ```\n */\n async getFirstListItem(filter: string, options: RecordQueryOptions = {}): Promise<T> {\n return this.pb.collection(this.name).getFirstListItem<T>(filter, options)\n }\n\n /**\n * Create a new record.\n *\n * @param data - Record data. Can be a plain object or `FormData` (for file uploads).\n */\n async create(data: Record<string, unknown> | FormData, options: RecordQueryOptions = {}): Promise<T> {\n return this.pb.collection(this.name).create<T>(data, options)\n }\n\n /**\n * Update an existing record.\n *\n * @param id - Record ID.\n * @param data - Fields to update. Can be a plain object or `FormData`.\n */\n async update(id: string, data: Record<string, unknown> | FormData, options: RecordQueryOptions = {}): Promise<T> {\n return this.pb.collection(this.name).update<T>(id, data, options)\n }\n\n /**\n * Delete a record by ID.\n */\n async delete(id: string): Promise<boolean> {\n return this.pb.collection(this.name).delete(id)\n }\n\n /**\n * Subscribe to realtime changes on this collection.\n *\n * @param callback - Called on every create/update/delete event.\n * @param filter - Optional: only receive events matching this filter.\n * @returns Unsubscribe function.\n *\n * @example\n * ```ts\n * const unsubscribe = await pb.collection('posts').subscribe((e) => {\n * console.log(e.action, e.record)\n * })\n *\n * // Later:\n * await unsubscribe()\n * ```\n */\n async subscribe(\n callback: (data: { action: string; record: T }) => void,\n filter?: string,\n ): Promise<() => Promise<void>> {\n const topic = '*'\n await this.pb.collection(this.name).subscribe<T>(topic, callback, filter ? { filter } : undefined)\n return () => this.pb.collection(this.name).unsubscribe(topic)\n }\n\n /**\n * Subscribe to changes on a specific record.\n *\n * @param id - Record ID.\n * @param callback - Called on update/delete events.\n * @returns Unsubscribe function.\n */\n async subscribeOne(\n id: string,\n callback: (data: { action: string; record: T }) => void,\n ): Promise<() => Promise<void>> {\n await this.pb.collection(this.name).subscribe<T>(id, callback)\n return () => this.pb.collection(this.name).unsubscribe(id)\n }\n}\n","import type PocketBase from 'pocketbase'\nimport type { RecordModel, RecordSubscription } from './types'\n\n/**\n * Realtime module — manage global realtime subscriptions.\n *\n * For collection-level subscriptions, prefer `pb.collection('name').subscribe()`.\n * This module is for lower-level control over the SSE connection.\n *\n * @example\n * ```ts\n * // Subscribe to all changes on a collection\n * const unsub = await pb.realtime.subscribe('posts', (e) => {\n * console.log(e.action, e.record)\n * })\n *\n * // Unsubscribe\n * await unsub()\n *\n * // Disconnect all realtime connections\n * pb.realtime.disconnect()\n * ```\n */\nexport class PicoBaseRealtime {\n private pb: PocketBase\n\n constructor(pb: PocketBase) {\n this.pb = pb\n }\n\n /**\n * Subscribe to realtime events on a collection.\n *\n * @param collection - Collection name (e.g. 'posts').\n * @param callback - Called on every create/update/delete event.\n * @returns Unsubscribe function.\n */\n async subscribe<T = RecordModel>(\n collection: string,\n callback: (data: RecordSubscription<T>) => void,\n ): Promise<() => Promise<void>> {\n await this.pb.collection(collection).subscribe<T>('*', callback)\n return () => this.pb.collection(collection).unsubscribe('*')\n }\n\n /**\n * Subscribe to realtime events on a specific record.\n *\n * @param collection - Collection name.\n * @param recordId - Record ID.\n * @param callback - Called on update/delete events.\n * @returns Unsubscribe function.\n */\n async subscribeRecord<T = RecordModel>(\n collection: string,\n recordId: string,\n callback: (data: RecordSubscription<T>) => void,\n ): Promise<() => Promise<void>> {\n await this.pb.collection(collection).subscribe<T>(recordId, callback)\n return () => this.pb.collection(collection).unsubscribe(recordId)\n }\n\n /**\n * Unsubscribe from all realtime events on a collection.\n */\n async unsubscribe(collection: string): Promise<void> {\n await this.pb.collection(collection).unsubscribe()\n }\n\n /**\n * Unsubscribe from ALL realtime events. The SSE connection will be\n * automatically closed when there are no remaining subscriptions.\n */\n async disconnectAll(): Promise<void> {\n await this.pb.realtime.unsubscribe()\n }\n}\n","import type PocketBase from 'pocketbase'\nimport type { RecordModel, FileOptions } from './types'\n\n/**\n * Storage module — work with file fields on PocketBase records.\n *\n * PocketBase stores files as record fields. This module provides helpers\n * to get file URLs and generate access tokens for protected files.\n *\n * @example\n * ```ts\n * const user = await pb.collection('users').getOne('user_id')\n *\n * // Get the URL for the user's avatar\n * const avatarUrl = pb.storage.getFileUrl(user, 'avatar.jpg')\n *\n * // Get a thumbnail URL (100x100)\n * const thumbUrl = pb.storage.getFileUrl(user, 'avatar.jpg', {\n * thumb: '100x100',\n * })\n *\n * // Get a temporary token for protected files\n * const token = await pb.storage.getFileToken()\n * const protectedUrl = pb.storage.getFileUrl(user, 'document.pdf', { token })\n * ```\n */\nexport class PicoBaseStorage {\n private pb: PocketBase\n\n constructor(pb: PocketBase) {\n this.pb = pb\n }\n\n /**\n * Get the public URL for a file attached to a record.\n *\n * @param record - The record that owns the file.\n * @param filename - The filename (as stored in the record's file field).\n * @param options - Optional: thumb size, token for protected files, download flag.\n */\n getFileUrl(record: RecordModel, filename: string, options: FileOptions = {}): string {\n const queryParams: Record<string, string> = {}\n\n if (options.thumb) {\n queryParams['thumb'] = options.thumb\n }\n if (options.token) {\n queryParams['token'] = options.token\n }\n if (options.download) {\n queryParams['download'] = '1'\n }\n\n return this.pb.files.getURL(record, filename, queryParams)\n }\n\n /**\n * Generate a temporary file access token.\n *\n * Use this for accessing protected files. Tokens are short-lived.\n */\n async getFileToken(): Promise<string> {\n return this.pb.files.getToken()\n }\n}\n","import type PocketBase from 'pocketbase'\nimport type { CollectionModel } from './types' // Assuming types are updated\n\nexport class PicoBaseAdmin {\n private pb: PocketBase\n\n constructor(pb: PocketBase) {\n this.pb = pb\n }\n\n /**\n * Fetch a list of all collections.\n */\n async listCollections(): Promise<CollectionModel[]> {\n const result = await this.pb.send<{ items: CollectionModel[] }>('/api/collections', {\n method: 'GET',\n })\n return result.items || []\n }\n\n /**\n * Fetch a single collection by ID or name.\n */\n async getCollection(idOrName: string): Promise<CollectionModel> {\n return this.pb.send<CollectionModel>(`/api/collections/${idOrName}`, {\n method: 'GET',\n })\n }\n\n /**\n * Create a new collection.\n */\n async createCollection(data: Partial<CollectionModel>): Promise<CollectionModel> {\n return this.pb.send<CollectionModel>('/api/collections', {\n method: 'POST',\n body: data,\n })\n }\n\n /**\n * Update an existing collection.\n */\n async updateCollection(idOrName: string, data: Partial<CollectionModel>): Promise<CollectionModel> {\n return this.pb.send<CollectionModel>(`/api/collections/${idOrName}`, {\n method: 'PATCH',\n body: data,\n })\n }\n\n /**\n * Delete a collection.\n */\n async deleteCollection(idOrName: string): Promise<boolean> {\n try {\n await this.pb.send(`/api/collections/${idOrName}`, {\n method: 'DELETE',\n })\n return true\n } catch (e) {\n return false\n }\n }\n}\n","/**\n * Base error class for all PicoBase SDK errors.\n *\n * Every error includes a `code` for programmatic handling and a `fix`\n * suggestion so developers can resolve issues without digging through docs.\n */\nexport class PicoBaseError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly status?: number,\n public readonly details?: unknown,\n /** Actionable suggestion for how to fix this error. */\n public readonly fix?: string,\n ) {\n super(message)\n this.name = 'PicoBaseError'\n }\n\n /** Formatted error string including fix suggestion. */\n toString(): string {\n let s = `${this.name} [${this.code}]: ${this.message}`\n if (this.fix) s += `\\n Fix: ${this.fix}`\n return s\n }\n}\n\n/**\n * Thrown when the instance is not running and cold-start retries are exhausted.\n */\nexport class InstanceUnavailableError extends PicoBaseError {\n constructor(message = 'Instance is not available. It may be stopped or starting up.') {\n super(\n message,\n 'INSTANCE_UNAVAILABLE',\n 503,\n undefined,\n 'Check your instance status in the PicoBase dashboard, or wait a few seconds and retry. ' +\n 'If this persists, your instance may have been stopped — restart it with `picobase status`.',\n )\n this.name = 'InstanceUnavailableError'\n }\n}\n\n/**\n * Thrown when an API key is invalid or missing.\n */\nexport class AuthorizationError extends PicoBaseError {\n constructor(message = 'Invalid or missing API key.') {\n super(\n message,\n 'UNAUTHORIZED',\n 401,\n undefined,\n 'Make sure PICOBASE_API_KEY is set in your .env file and matches a valid key from your dashboard. ' +\n 'Keys start with \"pbk_\". You can generate a new key at https://picobase.com/dashboard.',\n )\n this.name = 'AuthorizationError'\n }\n}\n\n/**\n * Thrown when a collection is not found.\n */\nexport class CollectionNotFoundError extends PicoBaseError {\n constructor(collectionName: string) {\n super(\n `Collection \"${collectionName}\" not found.`,\n 'COLLECTION_NOT_FOUND',\n 404,\n { collection: collectionName },\n `Make sure the collection \"${collectionName}\" exists in your PicoBase instance. ` +\n 'Collections are auto-created when you first write data, or you can create them ' +\n 'manually in the PicoBase dashboard under Collections.',\n )\n this.name = 'CollectionNotFoundError'\n }\n}\n\n/**\n * Thrown when a record is not found.\n */\nexport class RecordNotFoundError extends PicoBaseError {\n constructor(collectionName: string, recordId: string) {\n super(\n `Record \"${recordId}\" not found in collection \"${collectionName}\".`,\n 'RECORD_NOT_FOUND',\n 404,\n { collection: collectionName, recordId },\n 'Check that the record ID is correct. IDs are 15-character alphanumeric strings (e.g., \"abc123def456789\").',\n )\n this.name = 'RecordNotFoundError'\n }\n}\n\n/**\n * Thrown when a PocketBase API request fails.\n */\nexport class RequestError extends PicoBaseError {\n constructor(message: string, status: number, details?: unknown) {\n const fix = requestErrorFix(status, message)\n super(message, 'REQUEST_FAILED', status, details, fix)\n this.name = 'RequestError'\n }\n}\n\n/**\n * Thrown when the SDK is misconfigured (bad URL, missing params, etc.).\n */\nexport class ConfigurationError extends PicoBaseError {\n constructor(message: string, fix: string) {\n super(message, 'CONFIGURATION_ERROR', undefined, undefined, fix)\n this.name = 'ConfigurationError'\n }\n}\n\n/**\n * Thrown when an RPC (remote procedure call) fails.\n */\nexport class RpcError extends PicoBaseError {\n constructor(functionName: string, status: number, details?: unknown) {\n const fix = rpcErrorFix(functionName, status)\n super(\n `RPC function \"${functionName}\" failed.`,\n 'RPC_ERROR',\n status,\n details,\n fix,\n )\n this.name = 'RpcError'\n }\n}\n\n/** Generate fix suggestions for RPC errors. */\nfunction rpcErrorFix(functionName: string, status: number): string {\n if (status === 404) {\n return `The RPC endpoint \"/api/rpc/${functionName}\" does not exist. ` +\n 'Create a custom route in your PocketBase instance to handle this RPC call. ' +\n 'See: https://pocketbase.io/docs/js-routing/'\n }\n if (status === 400) {\n return 'Check the parameters you are passing to this RPC function. ' +\n 'The function may be expecting different parameters or types.'\n }\n if (status === 403) {\n return 'You don\\'t have permission to call this RPC function. ' +\n 'Check the authentication requirements for this endpoint in your PocketBase routes.'\n }\n return 'Check your PicoBase instance logs for details about this RPC error. ' +\n 'Ensure the custom route is correctly implemented in your PocketBase setup.'\n}\n\n/** Map common HTTP statuses to actionable fixes. */\nfunction requestErrorFix(status: number, message: string): string {\n switch (status) {\n case 400:\n return 'Check the data you are sending — a required field may be missing or have the wrong type. ' +\n 'Run `picobase typegen` to regenerate types and check your field names.'\n case 403:\n return 'You don\\'t have permission for this action. Check your collection API rules in the dashboard. ' +\n 'By default, only authenticated users can read/write records.'\n case 404:\n if (message.toLowerCase().includes('collection'))\n return 'This collection does not exist yet. Write a record to auto-create it, or create it in the dashboard.'\n return 'The requested resource was not found. Double-check IDs and collection names.'\n case 413:\n return 'The request payload is too large. Check file upload size limits in your instance settings.'\n case 429:\n return 'Too many requests. Add a short delay between requests or implement client-side caching.'\n default:\n return 'If this error persists, check your PicoBase dashboard for instance health and logs.'\n }\n}\n","import PocketBase from 'pocketbase'\nimport { PicoBaseAuth } from './auth'\nimport { PicoBaseCollection } from './collection'\nimport { PicoBaseRealtime } from './realtime'\nimport { PicoBaseStorage } from './storage'\nimport { PicoBaseAdmin } from './admin'\nimport { InstanceUnavailableError, AuthorizationError, CollectionNotFoundError, RecordNotFoundError, ConfigurationError, RpcError } from './errors'\nimport type { PicoBaseClientOptions, RecordModel, SendOptions } from './types'\n\nconst DEFAULT_OPTIONS: Required<Omit<PicoBaseClientOptions, 'fetch'>> & { fetch?: typeof globalThis.fetch } = {\n timeout: 30_000,\n maxColdStartRetries: 3,\n lang: 'en-US',\n}\n\nexport class PicoBaseClient {\n /** The underlying PocketBase SDK instance. Exposed for advanced usage. */\n readonly pb: PocketBase\n /** Auth module — sign up, sign in, OAuth, session management. */\n readonly auth: PicoBaseAuth\n /** Realtime module — subscribe to record changes. */\n readonly realtime: PicoBaseRealtime\n /** Storage module — get file URLs and tokens. */\n readonly storage: PicoBaseStorage\n /** Admin module — manage collections (requires admin API key). */\n readonly admin: PicoBaseAdmin\n\n private readonly apiKey: string\n private readonly options: typeof DEFAULT_OPTIONS\n\n constructor(url: string, apiKey: string, options: PicoBaseClientOptions = {}) {\n // Validate inputs with clear messages\n if (!url) {\n throw new ConfigurationError(\n 'PicoBase URL is required.',\n 'Pass the URL as the first argument: createClient(\"https://myapp.picobase.com\", \"pbk_...\") ' +\n 'or set PICOBASE_URL in your .env file.',\n )\n }\n if (!apiKey) {\n throw new ConfigurationError(\n 'PicoBase API key is required.',\n 'Pass the API key as the second argument: createClient(\"https://...\", \"pbk_your_key\") ' +\n 'or set PICOBASE_API_KEY in your .env file. Get a key from your dashboard.',\n )\n }\n if (!url.startsWith('http://') && !url.startsWith('https://')) {\n throw new ConfigurationError(\n `Invalid URL: \"${url}\". Must start with http:// or https://.`,\n `Use the full URL: createClient(\"https://${url}\", \"...\")`,\n )\n }\n\n this.apiKey = apiKey\n this.options = { ...DEFAULT_OPTIONS, ...options }\n\n // Normalize URL — strip trailing slash\n const baseUrl = url.replace(/\\/+$/, '')\n\n this.pb = new PocketBase(baseUrl)\n this.pb.autoCancellation(false)\n\n if (this.options.lang) {\n this.pb.lang = this.options.lang\n }\n\n // Inject API key header into every request via beforeSend hook\n this.pb.beforeSend = (url, reqInit) => {\n const headers = reqInit.headers as Record<string, string> ?? {}\n headers['X-PicoBase-Key'] = this.apiKey\n reqInit.headers = headers\n return { url, options: reqInit }\n }\n\n // Wrap the send method for cold-start retry logic\n this._wrapSendWithRetry()\n\n // Initialize modules\n this.auth = new PicoBaseAuth(this.pb)\n this.realtime = new PicoBaseRealtime(this.pb)\n this.storage = new PicoBaseStorage(this.pb)\n this.admin = new PicoBaseAdmin(this.pb)\n }\n\n /**\n * Access a collection for CRUD operations.\n *\n * @example\n * ```ts\n * const posts = await pb.collection('posts').getList(1, 20)\n * ```\n */\n collection<T = RecordModel>(name: string): PicoBaseCollection<T> {\n return new PicoBaseCollection<T>(this.pb, name)\n }\n\n /**\n * Call a server-side function (PocketBase custom API endpoint).\n * Proxies to PocketBase's send() method.\n */\n async send<T = unknown>(path: string, options?: SendOptions): Promise<T> {\n return this.pb.send<T>(path, options ?? {})\n }\n\n /**\n * Call a remote procedure (RPC) - a convenience method for calling custom API endpoints.\n *\n * Maps Supabase-style RPC calls to PicoBase custom endpoints:\n * - `pb.rpc('my_function', params)` → `POST /api/rpc/my_function` with params as body\n *\n * @example\n * ```ts\n * // Simple RPC call\n * const result = await pb.rpc('calculate_total', { cart_id: '123' })\n *\n * // Complex RPC with typed response\n * interface DashboardStats {\n * posts: number\n * comments: number\n * followers: number\n * }\n * const stats = await pb.rpc<DashboardStats>('get_dashboard_stats', {\n * user_id: currentUser.id\n * })\n * ```\n *\n * @param functionName The name of the RPC function to call\n * @param params Optional parameters to pass to the function\n * @returns The function result\n */\n async rpc<T = unknown>(functionName: string, params?: Record<string, unknown>): Promise<T> {\n try {\n return await this.send<T>(`/api/rpc/${functionName}`, {\n method: 'POST',\n body: params ?? {},\n })\n } catch (err: unknown) {\n // Wrap errors with RpcError for better error messages\n const status = (err as { status?: number })?.status ?? 500\n const details = (err as { data?: unknown })?.data\n throw new RpcError(functionName, status, details)\n }\n }\n\n /**\n * 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"]}