buildx-sdk 1.0.4
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/LICENSE +21 -0
- package/README.md +514 -0
- package/dist/Buildx.d.ts +97 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.esm.js +2 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/services/ApiKeys.d.ts +36 -0
- package/dist/services/Auth.d.ts +141 -0
- package/dist/services/BaseService.d.ts +85 -0
- package/dist/services/BuildxObjects.d.ts +48 -0
- package/dist/services/Collections.d.ts +126 -0
- package/dist/services/Flows.d.ts +41 -0
- package/dist/services/Functions.d.ts +40 -0
- package/dist/services/Projects.d.ts +55 -0
- package/dist/services/Storage.d.ts +44 -0
- package/dist/services/Templates.d.ts +36 -0
- package/dist/types/index.d.ts +256 -0
- package/package.json +92 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/services/Auth.ts","../src/services/Projects.ts","../src/services/Collections.ts","../src/services/Storage.ts","../src/services/Flows.ts","../src/services/Templates.ts","../src/services/Functions.ts","../src/services/BuildxObjects.ts","../src/services/ApiKeys.ts","../src/services/BaseService.ts","../src/Buildx.ts"],"sourcesContent":["import { BaseService } from \"./BaseService\";\nimport {\n\tAuthUser,\n\tAuthResponse,\n\tLoginCredentials,\n\tGoogleCredentials,\n\tEotpRequest,\n\tEotpVerify,\n\tPasswordResetRequest,\n\tPasswordResetPayload,\n\tChangePasswordRequest,\n\tErrorResponse,\n\tSuccessResponse\n} from \"../types/index\";\n\n/**\n * Authentication service for Buildx\n * Handles user authentication, login, signup, and user management\n * \n * @example\n * ```typescript\n * const auth = buildx.auth();\n * \n * // Login with username and password\n * const result = await auth.login({ username: 'user', password: 'pass' });\n * \n * // Get current user\n * const user = await auth.getCurrentUser();\n * \n * // Sign up new user\n * const newUser = await auth.signup({ username: 'newuser', password: 'pass' });\n * ```\n */\nexport class Auth {\n\tprivate baseService: BaseService;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\t/**\n\t * Set the access token\n\t */\n\tsetAccessToken(token: string | null): void {\n\t\tthis.baseService.setAccessToken(token);\n\t}\n\n\t/**\n\t * Get the access token\n\t */\n\tgetAccessToken(): string | null {\n\t\treturn this.baseService.getAccessToken();\n\t}\n\n\t/**\n\t * Set the refresh token\n\t */\n\tsetRefreshToken(token: string | null): void {\n\t\tthis.baseService.setRefreshToken(token);\n\t}\n\n\t/**\n\t * Get the refresh token\n\t */\n\tgetRefreshToken(): string | null {\n\t\treturn this.baseService.getRefreshToken();\n\t}\n\n\t/**\n\t * Clear all stored tokens\n\t */\n\tclearTokens(): void {\n\t\tthis.baseService.clearTokens();\n\t}\n\n\t/**\n\t * Check if user is authenticated\n\t */\n\tisAuthenticated(): boolean {\n\t\treturn this.baseService.isAuthenticated();\n\t}\n\n\t/**\n\t * Store tokens from authentication response\n\t */\n\tprivate storeTokens(response: AuthResponse | AuthUser): void {\n\t\tif (\"access_token\" in response && response.access_token) {\n\t\t\tthis.baseService.setAccessToken(response.access_token);\n\t\t}\n\t\tif (\"refresh_token\" in response && response.refresh_token) {\n\t\t\tthis.baseService.setRefreshToken(response.refresh_token);\n\t\t}\n\t}\n\n\t/**\n\t * Check if response is an error response\n\t */\n\tprivate isErrorResponse(response: any): response is ErrorResponse {\n\t\treturn response && typeof response === \"object\" && \"success\" in response && response.success === false;\n\t}\n\n\tprivate hasProjectScope(): boolean {\n\t\tconst projectId = this.baseService.config.projectId;\n\t\treturn !!projectId && projectId !== \"default\";\n\t}\n\n\t/**\n\t * Login with username and password\n\t */\n\tasync login(credentials: LoginCredentials): Promise<AuthUser | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/auth/login\");\n\t\tconst response = await this.baseService.post<AuthResponse | AuthUser | ErrorResponse>(url, credentials);\n\n\t\t// Check if it's an error response\n\t\tif (this.isErrorResponse(response)) {\n\t\t\treturn response;\n\t\t}\n\n\t\t// Store tokens if they exist in the response\n\t\tthis.storeTokens(response as AuthResponse | AuthUser);\n\t\treturn response as AuthUser;\n\t}\n\n\t/**\n\t * Login with Google credentials\n\t */\n\tasync loginWithGoogle(credentials: GoogleCredentials): Promise<AuthUser | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/auth/google\");\n\t\tconst response = await this.baseService.post<AuthResponse | AuthUser | ErrorResponse>(url, credentials);\n\n\t\t// Check if it's an error response\n\t\tif (this.isErrorResponse(response)) {\n\t\t\treturn response;\n\t\t}\n\n\t\t// Store tokens if they exist in the response\n\t\tthis.storeTokens(response as AuthResponse | AuthUser);\n\t\treturn response as AuthUser;\n\t}\n\n\t/**\n\t * Sign up a new user\n\t */\n\tasync signup(credentials: LoginCredentials): Promise<AuthUser | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/auth/signup\");\n\t\tconst response = await this.baseService.post<AuthResponse | AuthUser | ErrorResponse>(url, credentials);\n\n\t\t// Check if it's an error response\n\t\tif (this.isErrorResponse(response)) {\n\t\t\treturn response;\n\t\t}\n\n\t\t// Store tokens if they exist in the response\n\t\tthis.storeTokens(response as AuthResponse | AuthUser);\n\t\treturn response as AuthUser;\n\t}\n\n\t/**\n\t * Request email OTP for authentication\n\t */\n\tasync requestEotp(request: EotpRequest): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/auth/eotp/auth/request\");\n\t\treturn await this.baseService.post(url, request);\n\t}\n\n\t/**\n\t * Request OTP for login (alias of requestEotp)\n\t */\n\tasync requestEotpAuth(request: EotpRequest): Promise<SuccessResponse | ErrorResponse> {\n\t\treturn this.requestEotp(request);\n\t}\n\n\t/**\n\t * Request OTP for login (alias of requestEotp)\n\t */\n\tasync requestOtpLogin(request: EotpRequest): Promise<SuccessResponse | ErrorResponse> {\n\t\treturn this.requestEotp(request);\n\t}\n\n\t/**\n\t * Verify email OTP\n\t */\n\tasync verifyEotp(verify: EotpVerify): Promise<AuthUser | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/auth/eotp/auth/verify\");\n\t\tconst response = await this.baseService.post<AuthResponse | AuthUser | ErrorResponse>(url, verify);\n\n\t\t// Check if it's an error response\n\t\tif (this.isErrorResponse(response)) {\n\t\t\treturn response;\n\t\t}\n\n\t\t// Store tokens if they exist in the response\n\t\tthis.storeTokens(response as AuthResponse | AuthUser);\n\t\treturn response as AuthUser;\n\t}\n\n\t/**\n\t * Verify OTP for login (alias of verifyEotp)\n\t */\n\tasync verifyEotpAuth(verify: EotpVerify): Promise<AuthUser | ErrorResponse> {\n\t\treturn this.verifyEotp(verify);\n\t}\n\n\t/**\n\t * Verify OTP for login (alias of verifyEotp)\n\t */\n\tasync verifyOtpLogin(verify: EotpVerify): Promise<AuthUser | ErrorResponse> {\n\t\treturn this.verifyEotp(verify);\n\t}\n\n\t/**\n\t * Get current authenticated user\n\t */\n\tasync getCurrentUser(): Promise<AuthUser | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/auth/me\");\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Refresh authentication token\n\t */\n\tasync refreshToken(): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/auth/token\");\n\t\tconst response = await this.baseService.post<AuthResponse | SuccessResponse | ErrorResponse>(url, {});\n\n\t\t// Check if it's an error response\n\t\tif (this.isErrorResponse(response)) {\n\t\t\treturn response;\n\t\t}\n\n\t\t// Store tokens if they exist in the response\n\t\tif (\"access_token\" in response && response.access_token) {\n\t\t\tthis.storeTokens(response as AuthResponse);\n\t\t}\n\n\t\treturn response as SuccessResponse;\n\t}\n\n\t/**\n\t * Update user password\n\t */\n\tasync updatePassword(password: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/auth/password/update\");\n\t\treturn await this.baseService.post(url, { password });\n\t}\n\n\t/**\n\t * Change current user password\n\t */\n\tasync changePassword(request: ChangePasswordRequest | string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/auth/password/update\");\n\t\tif (typeof request === \"string\") {\n\t\t\treturn await this.baseService.post(url, { password: request });\n\t\t}\n\n\t\tconst password = request.password ?? request.newPassword ?? request.new_password;\n\t\tconst payload: Record<string, any> = { ...request };\n\t\tif (password) {\n\t\t\tpayload.password = password;\n\t\t}\n\t\tif (request.currentPassword && !payload.current_password) {\n\t\t\tpayload.current_password = request.currentPassword;\n\t\t}\n\t\tif (request.newPassword && !payload.new_password) {\n\t\t\tpayload.new_password = request.newPassword;\n\t\t}\n\n\t\treturn await this.baseService.post(url, payload);\n\t}\n\n\t/**\n\t * Admin update user password\n\t */\n\tasync adminUpdatePassword(userId: string, password: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/auth/password/update\");\n\t\treturn await this.baseService.post(url, { user_id: userId, password });\n\t}\n\n\t/**\n\t * Request password reset email\n\t */\n\tasync requestPasswordReset(request: PasswordResetRequest): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.hasProjectScope()\n\t\t\t? this.baseService.buildProjectUrl(\"/auth/password/reset/request\")\n\t\t\t: \"/auth/password/reset/request\";\n\t\treturn await this.baseService.post(url, request);\n\t}\n\n\t/**\n\t * Reset password with token\n\t */\n\tasync resetPassword(payload: PasswordResetPayload): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.hasProjectScope()\n\t\t\t? this.baseService.buildProjectUrl(\"/auth/password/reset\")\n\t\t\t: \"/auth/password/reset\";\n\t\treturn await this.baseService.post(url, payload);\n\t}\n\n\t/**\n\t * Update push notification token\n\t */\n\tasync updatePushToken(token: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/users/push-tokens\");\n\t\treturn await this.baseService.post(url, { token });\n\t}\n\n\t/**\n\t * List all users (admin only)\n\t */\n\tasync listUsers(organizationId?: string): Promise<AuthUser[] | ErrorResponse> {\n\t\tconst url = organizationId\n\t\t\t? this.baseService.buildOrgUrl(\"/auth/users\")\n\t\t\t: \"/auth/users\";\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Lookup users (for autocomplete/search)\n\t */\n\tasync lookupUsers(organizationId?: string): Promise<AuthUser[] | ErrorResponse> {\n\t\tconst url = organizationId\n\t\t\t? this.baseService.buildOrgUrl(\"/auth/users/lookup\")\n\t\t\t: \"/auth/users/lookup\";\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Get user by ID\n\t */\n\tasync getUser(userId: string, organizationId?: string): Promise<AuthUser | ErrorResponse> {\n\t\tconst url = organizationId\n\t\t\t? this.baseService.buildOrgUrl(`/auth/user/${userId}`)\n\t\t\t: `/auth/user/${userId}`;\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Delete user (admin only)\n\t */\n\tasync deleteUser(userId: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/auth/user/${userId}/delete`);\n\t\treturn await this.baseService.post(url, {});\n\t}\n} \n","import { BaseService } from \"./BaseService\";\nimport { Project, ErrorResponse, SuccessResponse } from \"../types/index\";\n\n/**\n * Projects service for Buildx\n * Handles project management operations\n * \n * @example\n * ```typescript\n * const projects = buildx.projects();\n * \n * // List all projects\n * const projectList = await projects.list();\n * \n * // Create a new project\n * const newProject = await projects.create({\n * name: 'My Project',\n * description: 'A new project'\n * });\n * \n * // Get project by ID\n * const project = await projects.get('project-id');\n * ```\n */\nexport class Projects {\n\tprivate baseService: BaseService;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\t/**\n\t * List all projects\n\t */\n\tasync list(): Promise<Project[] | ErrorResponse> {\n\t\treturn await this.baseService.get(\"/projects\");\n\t}\n\n\t/**\n\t * Get project by ID\n\t */\n\tasync get(projectId: string): Promise<Project | ErrorResponse> {\n\t\treturn await this.baseService.get(`/project/${projectId}`);\n\t}\n\n\t/**\n\t * Create a new project\n\t */\n\tasync create(projectData: Partial<Project>): Promise<Project | ErrorResponse> {\n\t\treturn await this.baseService.post(\"/projects\", projectData);\n\t}\n\n\t/**\n\t * Update project\n\t */\n\tasync update(projectId: string, projectData: Partial<Project>): Promise<Project | ErrorResponse> {\n\t\treturn await this.baseService.patch(`/project/${projectId}`, projectData);\n\t}\n\n\t/**\n\t * Delete project\n\t */\n\tasync deleteById(projectId: string): Promise<SuccessResponse | ErrorResponse> {\n\t\treturn await this.baseService.delete(`/project/${projectId}`);\n\t}\n\n\t/**\n\t * Backup project\n\t */\n\tasync backup(projectId: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst response = await this.baseService.axiosInstance.get(`/project/${projectId}/backup`, {\n\t\t\tresponseType: \"blob\",\n\t\t\theaders: await this.baseService.getHeaders(),\n\t\t});\n\n\t\t// Create download link for browser\n\t\tif (typeof window !== \"undefined\") {\n\t\t\tconst url = window.URL.createObjectURL(response.data);\n\t\t\tconst link = document.createElement(\"a\");\n\t\t\tlink.href = url;\n\t\t\tlink.setAttribute(\"download\", `backup_${projectId}.buildx`);\n\t\t\tdocument.body.appendChild(link);\n\t\t\tlink.click();\n\t\t\tdocument.body.removeChild(link);\n\t\t\twindow.URL.revokeObjectURL(url);\n\t\t}\n\n\t\treturn { success: true, message: \"Backup downloaded successfully\" };\n\t}\n\n\t/**\n\t * Restore project from backup\n\t */\n\tasync restore(projectId: string, file: File): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst formData = new FormData();\n\t\tformData.append(\"new_project_id\", projectId);\n\t\tformData.append(\"backup_file\", file);\n\n\t\tconst headers = { ...(await this.baseService.getHeaders()), \"Content-Type\": \"multipart/form-data\" };\n\t\treturn await this.baseService.post(\"/project/import\", formData, { headers });\n\n\t}\n} ","import { BaseService } from \"./BaseService\";\nimport {\n\tCollection,\n\tDocument,\n\tQueryOptions,\n\tErrorResponse,\n\tSuccessResponse,\n\tImportMapping,\n\tPaginatedResult,\n\tRelationHydrationConfig,\n\tCollectionRealtimeHandlers,\n\tCollectionRealtimeSubscribeOptions,\n\tCollectionRealtimeSubscription,\n\tCollectionRealtimeEvent,\n\tPaginationWebSocketLike,\n} from \"../types/index\";\n\ntype UpdateDocumentOptions = {\n\tupdateOnly?: boolean;\n};\n\ntype CollectionWsResponse = {\n\tid?: string;\n\tok?: boolean;\n\tresult?: any;\n\terror?: string;\n};\n\nclass CollectionWsClient {\n\tprivate socket: PaginationWebSocketLike | null = null;\n\tprivate connectPromise: Promise<void> | null = null;\n\tprivate requestCounter = 0;\n\tprivate readonly pending = new Map<string, { resolve: (value: any) => void; reject: (error: any) => void; timeout: ReturnType<typeof setTimeout> }>();\n\n\tconstructor(\n\t\tprivate readonly baseService: BaseService,\n\t\tprivate readonly collectionId: string,\n\t\tprivate readonly wsFactory?: (url: string) => PaginationWebSocketLike\n\t) { }\n\n\tasync query(action: \"queryWithPagination\" | \"queryRaw\", payload: Record<string, any>, timeoutMs = 30000): Promise<any> {\n\t\tawait this.ensureConnected();\n\t\tif (!this.socket) {\n\t\t\tthrow new Error(\"WebSocket connection is unavailable\");\n\t\t}\n\n\t\tconst id = `${Date.now()}_${++this.requestCounter}`;\n\t\tconst resultPromise = new Promise<any>((resolve, reject) => {\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\tthis.pending.delete(id);\n\t\t\t\treject(new Error(\"WebSocket pagination timeout\"));\n\t\t\t}, timeoutMs);\n\t\t\tthis.pending.set(id, { resolve, reject, timeout });\n\t\t});\n\n\t\tthis.socket.send(JSON.stringify({\n\t\t\tid,\n\t\t\taction,\n\t\t\tpayload,\n\t\t}));\n\n\t\treturn resultPromise;\n\t}\n\n\tclose() {\n\t\tif (!this.socket) return;\n\t\ttry {\n\t\t\tthis.socket.close();\n\t\t} catch (_error) {\n\t\t\t// noop\n\t\t}\n\t\tthis.socket = null;\n\t\tthis.connectPromise = null;\n\t\tfor (const [, entry] of this.pending.entries()) {\n\t\t\tclearTimeout(entry.timeout);\n\t\t\tentry.reject(new Error(\"WebSocket closed\"));\n\t\t}\n\t\tthis.pending.clear();\n\t}\n\n\tprivate async ensureConnected() {\n\t\tif (this.socket && this.isSocketOpen(this.socket)) {\n\t\t\treturn;\n\t\t}\n\t\tif (this.connectPromise) {\n\t\t\treturn this.connectPromise;\n\t\t}\n\n\t\tthis.connectPromise = new Promise<void>((resolve, reject) => {\n\t\t\tconst GlobalWebSocket = (globalThis as any).WebSocket;\n\t\t\tif (!this.wsFactory && !GlobalWebSocket) {\n\t\t\t\treject(new Error(\"WebSocket is not available in this runtime\"));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst socket = this.wsFactory\n\t\t\t\t? this.wsFactory(this.buildSocketUrl())\n\t\t\t\t: new GlobalWebSocket(this.buildSocketUrl());\n\t\t\tthis.socket = socket;\n\t\t\tlet settled = false;\n\n\t\t\tconst onOpen = () => {\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tresolve();\n\t\t\t};\n\t\t\tconst onError = (error: any) => {\n\t\t\t\tif (!settled) {\n\t\t\t\t\tsettled = true;\n\t\t\t\t\treject(error);\n\t\t\t\t}\n\t\t\t\tthis.close();\n\t\t\t};\n\t\t\tconst onClose = () => {\n\t\t\t\tif (!settled) {\n\t\t\t\t\tsettled = true;\n\t\t\t\t\treject(new Error(\"WebSocket closed before connection is ready\"));\n\t\t\t\t}\n\t\t\t\tthis.close();\n\t\t\t};\n\t\t\tconst onMessage = (event: any) => {\n\t\t\t\tlet response: CollectionWsResponse;\n\t\t\t\ttry {\n\t\t\t\t\tresponse = JSON.parse(event?.data || \"{}\");\n\t\t\t\t} catch (_error) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst id = response?.id;\n\t\t\t\tif (!id) return;\n\t\t\t\tconst pending = this.pending.get(id);\n\t\t\t\tif (!pending) return;\n\t\t\t\tclearTimeout(pending.timeout);\n\t\t\t\tthis.pending.delete(id);\n\n\t\t\t\tif (response.ok && response.result) {\n\t\t\t\t\tpending.resolve(response.result);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tpending.reject(new Error(response.error || \"WebSocket pagination query failed\"));\n\t\t\t};\n\n\t\t\tif (socket.addEventListener) {\n\t\t\t\tsocket.addEventListener(\"open\", onOpen);\n\t\t\t\tsocket.addEventListener(\"error\", onError);\n\t\t\t\tsocket.addEventListener(\"close\", onClose);\n\t\t\t\tsocket.addEventListener(\"message\", onMessage);\n\t\t\t} else {\n\t\t\t\tsocket.onopen = onOpen;\n\t\t\t\tsocket.onerror = onError;\n\t\t\t\tsocket.onclose = onClose;\n\t\t\t\tsocket.onmessage = onMessage;\n\t\t\t}\n\t\t}).finally(() => {\n\t\t\tthis.connectPromise = null;\n\t\t});\n\n\t\treturn this.connectPromise;\n\t}\n\n\tprivate isSocketOpen(socket: PaginationWebSocketLike): boolean {\n\t\tconst openState = (globalThis as any).WebSocket?.OPEN ?? 1;\n\t\treturn socket.readyState === openState;\n\t}\n\n\tprivate buildSocketUrl() {\n\t\tconst endpoint = this.baseService.config.apiEndpoint.replace(/\\/$/, \"\");\n\t\tconst wsEndpoint = endpoint.replace(/^http:/i, \"ws:\").replace(/^https:/i, \"wss:\");\n\t\tconst path = this.baseService.buildProjectUrl(`/${this.collectionId}/data/pagination/ws`);\n\n\t\tconst params = new URLSearchParams();\n\t\tconst apiKey = this.baseService.config.apiKey;\n\t\tif (apiKey) params.set(\"api_key\", apiKey);\n\t\tconst token = this.baseService.getAccessToken();\n\t\tif (token) params.set(\"token\", token);\n\n\t\tconst qs = params.toString();\n\t\treturn `${wsEndpoint}${path}${qs ? `?${qs}` : \"\"}`;\n\t}\n}\n\n/**\n * Collections service for Buildx\n * Handles collection management, documents, and queries\n * \n * @example\n * ```typescript\n * const collections = buildx.collections();\n * \n * // Get all collections\n * const collectionsList = await collections.list();\n * \n * // Get collection schema\n * const schema = await collections.getSchema('collection-id');\n * \n * // Query documents\n * const docs = await collections.query('collection-id', {\n * filter: { status: 'active' },\n * limit: 10\n * });\n * ```\n */\nexport class Collections {\n\tprivate baseService: BaseService;\n\tprivate static readonly RELATION_QUERY_CHUNK_SIZE = 200;\n\tprivate collectionWsClient: CollectionWsClient | null = null;\n\tprivate collectionWsCollectionId: string | null = null;\n\tprivate collectionWsDisabledUntil = 0;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\t/**\n\t * List all collections in a project\n\t */\n\tasync list(withStats = false, withBuildx = false): Promise<Collection[] | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/collections\");\n\t\tconst queryParams: Record<string, any> = {};\n\n\t\tif (withStats) {\n\t\t\tqueryParams.with_stats = true;\n\t\t}\n\n\t\tconst queryString = this.baseService.buildQueryString(queryParams);\n\t\tconst fullUrl = queryString ? `${url}${queryString}` : url;\n\n\t\tconst collections = await this.baseService.get(fullUrl);\n\n\t\tif (Array.isArray(collections) && !withBuildx) {\n\t\t\treturn collections.filter(collection =>\n\t\t\t\tcollection.collection_id && !collection.collection_id.startsWith(\"buildx_\")\n\t\t\t);\n\t\t}\n\n\t\treturn collections;\n\t}\n\n\t/**\n\t * Get collection schema\n\t */\n\tasync getSchema(collectionId: string, depth = 1): Promise<Collection | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/collection/${collectionId}`);\n\t\tconst queryParams: Record<string, any> = {};\n\n\t\tif (depth > 1) {\n\t\t\tqueryParams.depth = depth;\n\t\t}\n\n\t\tconst queryString = this.baseService.buildQueryString(queryParams);\n\t\tconst fullUrl = queryString ? `${url}${queryString}` : url;\n\n\t\treturn await this.baseService.get(fullUrl);\n\t}\n\n\t/**\n\t * Create or update collection\n\t */\n\tasync set(collectionData: Partial<Collection>): Promise<Collection | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/collections\");\n\t\treturn await this.baseService.post(url, collectionData);\n\t}\n\n\t/**\n\t * Delete collection\n\t */\n\tasync deleteCollection(collectionId: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/collections/${collectionId}`);\n\t\treturn await this.baseService.delete(url);\n\t}\n\n\t/**\n\t * Query documents in a collection\n\t */\n\tasync query(collectionId: string, options?: QueryOptions): Promise<Document[] | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}`);\n\t\tconst noPopulate = options?.noPopulate ?? (!!options?.relations && options.relations.length > 0);\n\t\tconst queryParams = this.buildQueryParams({\n\t\t\t...options,\n\t\t\toptions: noPopulate\n\t\t\t\t? {\n\t\t\t\t\t...(options?.options || {}),\n\t\t\t\t\tnoPopulate: true,\n\t\t\t\t}\n\t\t\t\t: options?.options,\n\t\t});\n\t\tconst queryString = this.baseService.buildQueryString(queryParams);\n\t\tconst fullUrl = queryString ? `${url}${queryString}` : url;\n\n\t\tconst result = await this.baseService.get(fullUrl);\n\t\tif (!Array.isArray(result)) {\n\t\t\treturn result;\n\t\t}\n\n\t\tif (!options?.relations || options.relations.length === 0) {\n\t\t\treturn result;\n\t\t}\n\n\t\tconst preferWs = (options?.paginationTransport || \"auto\") !== \"http\";\n\t\treturn await this.hydrateRelations(result, options.relations, options.relationSelect, {\n\t\t\tpreferWs,\n\t\t\twsFactory: options.wsFactory,\n\t\t});\n\t}\n\n\t/**\n\t * Query documents without server-side populate.\n\t */\n\tasync queryRaw(collectionId: string, options?: QueryOptions): Promise<Document[] | ErrorResponse> {\n\t\tconst normalizedOptions: QueryOptions = {\n\t\t\t...options,\n\t\t\toptions: {\n\t\t\t\t...(options?.options || {}),\n\t\t\t\tnoPopulate: true,\n\t\t\t},\n\t\t};\n\t\tconst transport = normalizedOptions.paginationTransport || \"http\";\n\t\tif (transport !== \"http\" && Date.now() >= this.collectionWsDisabledUntil) {\n\t\t\ttry {\n\t\t\t\treturn await this.queryRawViaWs(collectionId, normalizedOptions);\n\t\t\t} catch (error: any) {\n\t\t\t\tconsole.warn(\"[buildx-sdk] WS raw query failed, fallback to HTTP\", error?.message || error);\n\t\t\t\tthis.collectionWsDisabledUntil = Date.now() + 30000;\n\t\t\t\tthis.resetCollectionWsClient();\n\t\t\t}\n\t\t}\n\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/raw`);\n\t\tconst queryParams = this.buildQueryParams(normalizedOptions);\n\t\tconst queryString = this.baseService.buildQueryString(queryParams);\n\t\tconst fullUrl = queryString ? `${url}${queryString}` : url;\n\n\t\treturn await this.baseService.get(fullUrl);\n\t}\n\n\t/**\n\t * Query documents with pagination metadata.\n\t */\n\tasync queryWithPagination(collectionId: string, options?: QueryOptions): Promise<PaginatedResult<Document> | ErrorResponse> {\n\t\tconst noPopulate = options?.noPopulate ?? (!!options?.relations && options.relations.length > 0);\n\t\tconst normalizedOptions: QueryOptions = {\n\t\t\t...options,\n\t\t\toptions: noPopulate\n\t\t\t\t? {\n\t\t\t\t\t...(options?.options || {}),\n\t\t\t\t\tnoPopulate: true,\n\t\t\t\t}\n\t\t\t\t: options?.options,\n\t\t};\n\n\t\tconst transport = normalizedOptions.paginationTransport || \"auto\";\n\t\tlet result: PaginatedResult<Document> | ErrorResponse;\n\t\tconst shouldTryWs = transport !== \"http\" && Date.now() >= this.collectionWsDisabledUntil;\n\t\tif (shouldTryWs) {\n\t\t\ttry {\n\t\t\t\tresult = await this.queryWithPaginationViaWs(collectionId, normalizedOptions);\n\t\t\t}\n\t\t\tcatch (error: any) {\n\t\t\t\t// Retry on HTTP endpoint for compatibility and temporarily disable WS attempts.\n\t\t\t\tconsole.warn(\"[buildx-sdk] WS pagination failed, fallback to HTTP\", error?.message || error);\n\t\t\t\tthis.collectionWsDisabledUntil = Date.now() + 30000;\n\t\t\t\tthis.resetCollectionWsClient();\n\t\t\t\tresult = await this.queryWithPaginationViaHttp(collectionId, normalizedOptions);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tresult = await this.queryWithPaginationViaHttp(collectionId, normalizedOptions);\n\t\t}\n\n\t\tif (!result || (result as ErrorResponse).success === false) {\n\t\t\treturn result as ErrorResponse;\n\t\t}\n\t\tif (!normalizedOptions?.relations || normalizedOptions.relations.length === 0) {\n\t\t\treturn result as PaginatedResult<Document>;\n\t\t}\n\n\t\tconst preferWs = transport !== \"http\";\n\t\tconst hydratedRows = await this.hydrateRelations((result as PaginatedResult<Document>).data || [], normalizedOptions.relations, normalizedOptions.relationSelect, {\n\t\t\tpreferWs,\n\t\t\twsFactory: normalizedOptions.wsFactory,\n\t\t});\n\t\tif (!Array.isArray(hydratedRows)) {\n\t\t\treturn hydratedRows;\n\t\t}\n\n\t\treturn {\n\t\t\t...(result as PaginatedResult<Document>),\n\t\t\tdata: hydratedRows,\n\t\t};\n\t}\n\n\tprivate async queryWithPaginationViaHttp(collectionId: string, options?: QueryOptions): Promise<PaginatedResult<Document> | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/data/pagination`);\n\t\tconst queryParams = this.buildQueryParams(options);\n\t\tconst queryString = this.baseService.buildQueryString(queryParams);\n\t\tconst fullUrl = queryString ? `${url}${queryString}` : url;\n\t\tconst result = await this.baseService.get(fullUrl);\n\t\tif (!result || (result as ErrorResponse).success === false) {\n\t\t\treturn result as ErrorResponse;\n\t\t}\n\t\treturn {\n\t\t\t...(result as PaginatedResult<Document>),\n\t\t\tmeta: {\n\t\t\t\t...((result as PaginatedResult<Document>).meta || {}),\n\t\t\t\ttransport: \"http\",\n\t\t\t},\n\t\t} as PaginatedResult<Document>;\n\t}\n\n\tprivate async queryWithPaginationViaWs(collectionId: string, options?: QueryOptions): Promise<PaginatedResult<Document> | ErrorResponse> {\n\t\tconst payload = this.buildQueryParams(options);\n\t\tconst client = this.getOrCreateCollectionWsClient(collectionId, options?.wsFactory);\n\t\tconst result = await client.query(\"queryWithPagination\", payload);\n\t\tif (!result || (result as ErrorResponse).success === false) {\n\t\t\treturn result as ErrorResponse;\n\t\t}\n\t\treturn {\n\t\t\t...(result as PaginatedResult<Document>),\n\t\t\tmeta: {\n\t\t\t\t...((result as PaginatedResult<Document>).meta || {}),\n\t\t\t\ttransport: \"ws\",\n\t\t\t},\n\t\t} as PaginatedResult<Document>;\n\t}\n\n\tprivate async queryRawViaWs(collectionId: string, options?: QueryOptions): Promise<Document[] | ErrorResponse> {\n\t\tconst payload = this.buildQueryParams(options);\n\t\tconst client = this.getOrCreateCollectionWsClient(collectionId, options?.wsFactory);\n\t\tconst result = await client.query(\"queryRaw\", payload);\n\t\tif (!result || (result as ErrorResponse).success === false) {\n\t\t\treturn result as ErrorResponse;\n\t\t}\n\t\treturn Array.isArray(result) ? result as Document[] : [];\n\t}\n\n\tprivate getOrCreateCollectionWsClient(collectionId: string, wsFactory?: (url: string) => PaginationWebSocketLike) {\n\t\tif (!this.collectionWsClient || this.collectionWsCollectionId !== collectionId) {\n\t\t\tthis.resetCollectionWsClient();\n\t\t\tthis.collectionWsClient = new CollectionWsClient(this.baseService, collectionId, wsFactory);\n\t\t\tthis.collectionWsCollectionId = collectionId;\n\t\t}\n\t\treturn this.collectionWsClient;\n\t}\n\n\tprivate resetCollectionWsClient() {\n\t\tif (this.collectionWsClient) {\n\t\t\tthis.collectionWsClient.close();\n\t\t}\n\t\tthis.collectionWsClient = null;\n\t\tthis.collectionWsCollectionId = null;\n\t}\n\n\t/**\n\t * Subscribe realtime data events for a collection via SSE endpoint.\n\t * Works in browser/EventSource-compatible runtimes.\n\t */\n\tsubscribeRealtime(\n\t\tcollectionId: string,\n\t\thandlers: CollectionRealtimeHandlers,\n\t\toptions?: CollectionRealtimeSubscribeOptions\n\t): CollectionRealtimeSubscription {\n\t\tconst endpoint = this.baseService.config.apiEndpoint.replace(/\\/$/, \"\");\n\t\tconst path = this.baseService.buildProjectUrl(`/${collectionId}/realtime/stream`);\n\n\t\tconst params = new URLSearchParams();\n\t\tconst apiKey = options?.apiKey || this.baseService.config.apiKey;\n\t\tif (apiKey) params.set(\"api_key\", apiKey);\n\t\tconst token = options?.token || this.baseService.getAccessToken();\n\t\tif (token) params.set(\"token\", token);\n\t\tif (options?.lastEventId) params.set(\"lastEventId\", options.lastEventId);\n\n\t\tconst qs = params.toString();\n\t\tconst url = `${endpoint}${path}${qs ? `?${qs}` : \"\"}`;\n\n\t\tconst factory = options?.eventSourceFactory || (globalThis as any).EventSource;\n\t\tif (!factory) {\n\t\t\tthrow new Error(\"EventSource is not available in this runtime. Provide eventSourceFactory in options.\");\n\t\t}\n\n\t\tconst source = factory(url);\n\t\tlet hasConnected = false;\n\t\tconst emitConnected = () => {\n\t\t\tif (hasConnected) return;\n\t\t\thasConnected = true;\n\t\t\thandlers.onConnected?.();\n\t\t};\n\t\tconst emitEvent = (event: any) => {\n\t\t\ttry {\n\t\t\t\tconst data = JSON.parse(event.data) as CollectionRealtimeEvent;\n\t\t\t\thandlers.onEvent?.(data);\n\t\t\t}\n\t\t\tcatch (error) {\n\t\t\t\thandlers.onError?.(error);\n\t\t\t}\n\t\t};\n\n\t\tsource.onopen = () => {\n\t\t\temitConnected();\n\t\t};\n\t\tsource.onmessage = (event: any) => emitEvent(event);\n\t\tsource.onerror = (error: any) => {\n\t\t\thandlers.onError?.(error);\n\t\t};\n\t\tsource.addEventListener?.(\"connected\", () => {\n\t\t\temitConnected();\n\t\t});\n\t\tsource.addEventListener?.(\"collection:data\", (event: any) => {\n\t\t\temitEvent(event);\n\t\t});\n\n\t\treturn {\n\t\t\tclose: () => source.close(),\n\t\t};\n\t}\n\n\t/**\n\t * Get lookup data for a collection (for dropdowns/autocomplete)\n\t */\n\tasync lookup(collectionId: string, options?: QueryOptions): Promise<Array<{ value: string; label: string }> | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}`);\n\t\tconst queryParams: Record<string, any> = {};\n\n\t\tif (options) {\n\t\t\tif (options.filter) {\n\t\t\t\tqueryParams.filter = options.filter;\n\t\t\t}\n\t\t\tif (options.jsonFilter) {\n\t\t\t\tqueryParams.jsonFilter = options.jsonFilter;\n\t\t\t}\n\t\t\tif (options.projection) {\n\t\t\t\tqueryParams.projection = options.projection;\n\t\t\t}\n\t\t\tif (options.options) {\n\t\t\t\tqueryParams.options = options.options;\n\t\t\t}\n\t\t}\n\n\t\tconst queryString = this.baseService.buildQueryString(queryParams);\n\t\tconst fullUrl = queryString ? `${url}${queryString}` : url;\n\n\t\tconst result = await this.baseService.get(fullUrl);\n\n\t\tif (Array.isArray(result)) {\n\t\t\treturn result.map(row => ({\n\t\t\t\tvalue: row._id,\n\t\t\t\tlabel: row._display || row.label || row.title || row.name || row.username || row.description || \"\"\n\t\t\t}));\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tprivate buildQueryParams(options?: QueryOptions): Record<string, any> {\n\t\tconst queryParams: Record<string, any> = {};\n\t\tif (!options) return queryParams;\n\n\t\tconst searchQuery = options.q || (options as any).searchQuery;\n\t\tif (searchQuery) {\n\t\t\tqueryParams.q = searchQuery;\n\t\t}\n\t\tif (options.quick_filter_fields) {\n\t\t\tqueryParams.quick_filter_fields = options.quick_filter_fields;\n\t\t}\n\t\tif (options.filter) {\n\t\t\tqueryParams.filter = options.filter;\n\t\t}\n\t\tif (options.jsonFilter) {\n\t\t\tqueryParams.jsonFilter = options.jsonFilter;\n\t\t}\n\t\tif (options.select) {\n\t\t\tqueryParams.select = Array.isArray(options.select)\n\t\t\t\t? options.select.join(\",\")\n\t\t\t\t: options.select;\n\t\t}\n\t\tif (options.projection) {\n\t\t\tqueryParams.projection = options.projection;\n\t\t}\n\t\tif (options.options) {\n\t\t\tqueryParams.options = options.options;\n\t\t}\n\t\tif (options.sort) {\n\t\t\tqueryParams.sort = options.sort;\n\t\t}\n\t\tif (typeof options.limit === \"number\") {\n\t\t\tqueryParams.limit = options.limit;\n\t\t}\n\t\tif (typeof options.skip === \"number\" && options.skip > 0) {\n\t\t\tqueryParams.skip = options.skip;\n\t\t}\n\n\t\treturn queryParams;\n\t}\n\n\tprivate async hydrateRelations(\n\t\trows: Document[],\n\t\trelations: RelationHydrationConfig[],\n\t\trelationSelect?: string | string[],\n\t\toptions?: {\n\t\t\tpreferWs?: boolean;\n\t\t\twsFactory?: (url: string) => PaginationWebSocketLike;\n\t\t}\n\t): Promise<Document[] | ErrorResponse> {\n\t\tconst enhancedRows = rows.map((row) => ({ ...row }));\n\t\tconst defaultSelect = relationSelect || \"_id,_display,name,title,username\";\n\n\t\tconst groupedByCollection = relations.reduce((acc, relation) => {\n\t\t\tif (!acc[relation.collectionId]) {\n\t\t\t\tacc[relation.collectionId] = [];\n\t\t\t}\n\t\t\tacc[relation.collectionId].push(relation);\n\t\t\treturn acc;\n\t\t}, {} as Record<string, RelationHydrationConfig[]>);\n\n\t\tconst relationCache = new Map<string, Document>();\n\n\t\tfor (const [refCollectionId, configs] of Object.entries(groupedByCollection)) {\n\t\t\tconst ids = new Set<string>();\n\t\t\tfor (const row of enhancedRows) {\n\t\t\t\tfor (const config of configs) {\n\t\t\t\t\tconst value = row[config.field];\n\t\t\t\t\tif (!value) continue;\n\t\t\t\t\tif (Array.isArray(value)) {\n\t\t\t\t\t\tfor (const item of value) {\n\t\t\t\t\t\t\tif (typeof item === \"string\") ids.add(item);\n\t\t\t\t\t\t\telse if (item && typeof item === \"object\" && item._id) ids.add(item._id);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (typeof value === \"string\") {\n\t\t\t\t\t\tids.add(value);\n\t\t\t\t\t} else if (value && typeof value === \"object\" && value._id) {\n\t\t\t\t\t\tids.add(value._id);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst missingIds = Array.from(ids).filter((id) => !relationCache.has(`${refCollectionId}:${id}`));\n\t\t\tif (missingIds.length > 0) {\n\t\t\t\tconst chunkSize = Collections.RELATION_QUERY_CHUNK_SIZE;\n\t\t\t\tfor (let i = 0; i < missingIds.length; i += chunkSize) {\n\t\t\t\t\tconst idChunk = missingIds.slice(i, i + chunkSize);\n\t\t\t\t\tconst relatedDocs = await this.queryRaw(refCollectionId, {\n\t\t\t\t\t\tfilter: { _id: { $in: idChunk } },\n\t\t\t\t\t\tselect: defaultSelect,\n\t\t\t\t\t\tpaginationTransport: options?.preferWs ? \"auto\" : \"http\",\n\t\t\t\t\t\twsFactory: options?.wsFactory,\n\t\t\t\t\t});\n\t\t\t\t\tif (!Array.isArray(relatedDocs)) {\n\t\t\t\t\t\treturn relatedDocs;\n\t\t\t\t\t}\n\t\t\t\t\tfor (const doc of relatedDocs) {\n\t\t\t\t\t\tif (doc?._id) {\n\t\t\t\t\t\t\trelationCache.set(`${refCollectionId}:${doc._id}`, doc);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const row of enhancedRows) {\n\t\t\t\tfor (const config of configs) {\n\t\t\t\t\tconst value = row[config.field];\n\t\t\t\t\tif (!value) continue;\n\n\t\t\t\t\tif (Array.isArray(value)) {\n\t\t\t\t\t\trow[config.field] = value.map((item) => {\n\t\t\t\t\t\t\tconst id = typeof item === \"string\" ? item : item?._id;\n\t\t\t\t\t\t\tif (!id) return item;\n\t\t\t\t\t\t\treturn relationCache.get(`${refCollectionId}:${id}`) || item;\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst id = typeof value === \"string\" ? value : value?._id;\n\t\t\t\t\t\tif (!id) continue;\n\t\t\t\t\t\trow[config.field] = relationCache.get(`${refCollectionId}:${id}`) || value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn enhancedRows;\n\t}\n\n\t/**\t\t\n\t * Get single document by ID\n\t */\n\tasync getDocument(collectionId: string, documentId: string, populate?: string[]): Promise<Document | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/${documentId}`);\n\t\tconst queryParams: Record<string, any> = {};\n\n\t\tif (populate && populate.length > 0) {\n\t\t\tqueryParams.populate = populate.join(\",\");\n\t\t}\n\n\t\tconst queryString = this.baseService.buildQueryString(queryParams);\n\t\tconst fullUrl = queryString ? `${url}${queryString}` : url;\n\n\t\treturn await this.baseService.get(fullUrl);\n\t}\n\n\t/**\n\t * Create new document\n\t */\n\tasync createDocument(collectionId: string, data: any): Promise<Document | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}`);\n\t\treturn await this.baseService.post(url, data);\n\t}\n\n\t/**\n\t * Update document\n\t */\n\tasync updateDocument(collectionId: string, documentId: string, data: any): Promise<Document | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/${documentId}`);\n\t\treturn await this.baseService.patch(url, data);\n\t}\n\n\t/**\n\t * Update document with optional mode flags.\n\t */\n\tasync updateDocumentWithOptions(\n\t\tcollectionId: string,\n\t\tdocumentId: string,\n\t\tdata: any,\n\t\toptions?: UpdateDocumentOptions\n\t): Promise<Document | ErrorResponse> {\n\t\tconst baseUrl = this.baseService.buildProjectUrl(`/${collectionId}/${documentId}`);\n\t\tconst url = options?.updateOnly ? `${baseUrl}?mode=updateOnly` : baseUrl;\n\t\treturn await this.baseService.patch(url, data);\n\t}\n\n\t/**\n\t * Get document revisions\n\t */\n\tasync getDocumentRevisions(collectionId: string, documentId: string): Promise<Document[] | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/${documentId}/revisions`);\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Delete document\n\t */\n\tasync deleteDocument(collectionId: string, documentId: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/${documentId}`);\n\t\treturn await this.baseService.delete(url);\n\t}\n\n\t/**\n\t * Delete documents by filter\n\t */\n\tasync deleteByFilter(collectionId: string, filter: any): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/delete`);\n\t\treturn await this.baseService.post(url, { filter });\n\t}\n\n\t/**\n\t * Import data to collection\n\t */\n\tasync import(collectionId: string, file: File, mapping: ImportMapping): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst formData = new FormData();\n\t\tformData.append(\"mapping\", JSON.stringify(mapping));\n\t\tformData.append(\"file\", file);\n\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/import`);\n\t\tconst headers = { ...(await this.baseService.getHeaders()), \"Content-Type\": \"multipart/form-data\" };\n\n\t\treturn await this.baseService.post(url, formData, { headers });\n\t}\n\n\t/**\n\t * Get collection data types\n\t */\n\tasync getDataTypes(): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/collections/types\");\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Validate collection data\n\t */\n\tasync validate(collectionId: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/validate`);\n\t\treturn await this.baseService.post(url, null);\n\t}\n\n\t/**\n\t * Migrate collection data\n\t */\n\tasync migrate(collectionId: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/migrate`);\n\t\treturn await this.baseService.post(url, null);\n\t}\n} \n","import { BaseService } from \"./BaseService\";\nimport { ErrorResponse, SuccessResponse } from \"../types/index\";\n\n/**\n * Storage service for Buildx\n * Handles file upload, download, and management\n * \n * @example\n * ```typescript\n * const storage = buildx.storage();\n * \n * // Upload file\n * const result = await storage.upload(file, 'uploads/');\n * \n * // List files in directory\n * const files = await storage.list('uploads/');\n * \n * // Delete file\n * await storage.delete('uploads/file.txt');\n * ```\n */\nexport class Storage {\n\tprivate baseService: BaseService;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\t/**\n\t * Upload file to storage\n\t */\n\tasync upload(file: File, prefix?: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst formData = new FormData();\n\t\tif (prefix && prefix !== \"\") {\n\t\t\tformData.append(\"prefix\", prefix);\n\t\t}\n\t\tformData.append(\"file\", file);\n\t\tformData.append(\"filename\", file.name || \"file\");\n\n\t\tconst url = this.baseService.buildProjectUrl(\"/storage/upload\");\n\t\tconst headers = { ...(await this.baseService.getHeaders()), \"Content-Type\": \"multipart/form-data; charset=utf-8\" };\n\n\t\treturn await this.baseService.post(url, formData, { headers });\n\t}\n\n\t/**\n\t * Upload file to collection storage\n\t */\n\tasync uploadToCollection(file: File, collectionId: string, prefix?: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst formData = new FormData();\n\t\tif (prefix && prefix !== \"\") {\n\t\t\tformData.append(\"prefix\", prefix);\n\t\t}\n\t\tformData.append(\"file\", file);\n\t\tformData.append(\"filename\", file.name || \"file\");\n\t\tformData.append(\"collection_id\", collectionId);\n\n\t\tconst url = this.baseService.buildProjectUrl(\"/storage/upload\");\n\t\tconst headers = { ...(await this.baseService.getHeaders()), \"Content-Type\": \"multipart/form-data; charset=utf-8\" };\n\n\t\treturn await this.baseService.post(url, formData, { headers });\n\t}\n\n\t/**\n\t * List files in directory\n\t */\n\tasync list(path: string): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/storage?path=${encodeURIComponent(path)}`);\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Get storage size for path\n\t */\n\tasync getSize(path: string): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/storage/size?path=${encodeURIComponent(path)}`);\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Delete file from storage\n\t */\n\tasync delete(path: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/storage?path=${encodeURIComponent(path)}`);\n\t\treturn await this.baseService.delete(url);\n\t}\n} ","import { BaseService } from \"./BaseService\";\nimport { ErrorResponse } from \"../types/index\";\n\n/**\n * Flows service for Buildx\n * Handles flow types and running flows\n * \n * @example\n * ```typescript\n * const flows = buildx.flows();\n * \n * // Get flow types\n * const types = await flows.getTypes();\n * \n * // Run a flow\n * const result = await flows.run('flow-id', 'session-id', 'root', { arg1: 'value' });\n * ```\n */\nexport class Flows {\n\tprivate baseService: BaseService;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\t/**\n\t * Get all flow types\n\t */\n\tasync getTypes(): Promise<any | ErrorResponse> {\n\t\t// Optionally use cache in the future\n\t\treturn await this.baseService.get(\"/flows/types\");\n\t}\n\n\t/**\n\t * Run a flow\n\t */\n\tasync run(flowId: string, sessionId: string | null = null, state: any = \"root\", args: any = {}): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/flows/${flowId}/run`);\n\t\treturn await this.baseService.post(url, { session_id: sessionId, state, args });\n\t}\n\n\t/**\n\t * Get GPT flow code suggestions\n\t */\n\tasync getGptFlowSuggestions(instruction: string): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/ai/gpt/flow/node\");\n\t\treturn await this.baseService.post<any>(url, { instruction });\n\t}\n\n\t/**\n\t * Get GPT collection suggestions\n\t */\n\tasync getGptCollectionSuggestions(instruction: string): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/ai/gpt/collections\");\n\t\treturn await this.baseService.post<any>(url, { instruction });\n\t}\n\n\t/**\n\t * Get GPT lifecycle suggestions\n\t */\n\tasync getGptLifecycleSuggestions(instruction: string): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/ai/gpt/lifecycle\");\n\t\treturn await this.baseService.post<any>(url, { instruction });\n\t}\n} ","import { BaseService } from \"./BaseService\";\nimport { ErrorResponse, SuccessResponse } from \"../types/index\";\n\n/**\n * Templates service for Buildx\n * Handles template rendering and preview\n * \n * @example\n * ```typescript\n * const templates = buildx.templates();\n * \n * // Preview a template\n * const preview = await templates.preview('template', { name: 'John' });\n * \n * // Render a template\n * const rendered = await templates.render('template-id', { name: 'John' });\n * \n * // Generate PDF\n * await templates.generatePDF('template-id', data);\n * ```\n */\nexport class Templates {\n\tprivate baseService: BaseService;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\t/**\n\t * Preview a template with data\n\t */\n\tasync preview(template: any, data: any): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/templates/preview\");\n\t\treturn await this.baseService.post(url, { template, data });\n\t}\n\n\t/**\n\t * Render a template by ID with data\n\t */\n\tasync render(templateId: string, data: any): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/templates/${templateId}/render`);\n\t\treturn await this.baseService.post(url, data);\n\t}\n\n\t/**\n\t * Render a template as PDF and download (browser only)\n\t */\n\tasync renderPDF(templateId: string, data: any): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/templates/${templateId}/pdf`);\n\t\tconst headers = { ...(await this.baseService.getHeaders()), responseType: \"blob\" };\n\t\tconst response = await this.baseService.axiosInstance.post(url, data, { headers });\n\n\t\t// Create download link for browser\n\t\tif (typeof window !== \"undefined\") {\n\t\t\tconst blobUrl = window.URL.createObjectURL(response.data);\n\t\t\tconst link = document.createElement(\"a\");\n\t\t\tlink.href = blobUrl;\n\t\t\tlink.setAttribute(\"download\", \"document.pdf\");\n\t\t\tdocument.body.appendChild(link);\n\t\t\tlink.click();\n\t\t\tdocument.body.removeChild(link);\n\t\t\twindow.URL.revokeObjectURL(blobUrl);\n\t\t}\n\n\t\treturn { success: true, message: \"PDF downloaded successfully\" };\n\n\t}\n} ","import { BaseService } from \"./BaseService\";\nimport { Function, FunctionLog, ErrorResponse } from \"../types/index\";\n\n/**\n * Functions service for Buildx\n * Handles serverless functions management\n * \n * @example\n * ```typescript\n * const functions = buildx.functions();\n * \n * // Get all functions\n * const funcs = await functions.list();\n * \n * // Get function by name\n * const func = await functions.getByName('function-name');\n * \n * // Update function\n * await functions.update('function-name', { code: 'new code' });\n * ```\n */\nexport class Functions {\n\tprivate baseService: BaseService;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\t/**\n\t * List all functions in a project\n\t */\n\tasync list(): Promise<Function[] | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/functions\");\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Get function by name\n\t */\n\tasync getByName(functionName: string): Promise<Function | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/functions/${functionName}`);\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Update function\n\t */\n\tasync update(functionName: string, data: Partial<Function>): Promise<Function | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/functions/${functionName}`);\n\t\treturn await this.baseService.post(url, data);\n\t}\n\n\t/**\n\t * Get function logs\n\t */\n\tasync getLogs(functionName: string): Promise<FunctionLog[] | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/functions/${functionName}/logs`);\n\t\treturn await this.baseService.get(url);\n\t}\n} ","import { BaseService } from \"./BaseService\";\nimport { BuildxObject, ErrorResponse, SuccessResponse } from \"../types/index\";\n\n/**\n * Buildx Objects service for Buildx\n * Handles Buildx-specific objects (users, roles, etc.)\n * \n * @example\n * ```typescript\n * const buildxObjects = buildx.buildxObjects();\n * \n * // Get Buildx collection\n * const collection = await buildxObjects.getCollection('users');\n * \n * // Get Buildx document\n * const doc = await buildxObjects.getDocument('users', 'user-id');\n * \n * // Query Buildx objects\n * const objects = await buildxObjects.query('users', { limit: 10 });\n * ```\n */\nexport class BuildxObjects {\n\tprivate baseService: BaseService;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\t/**\n\t * Get Buildx collection\n\t */\n\tasync getCollection(type: string): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/buildx/collection/${type}`);\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Get Buildx document by ID\n\t */\n\tasync getDocument(type: string, id: string): Promise<BuildxObject | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/buildx/${type}/${id}`);\n\t\tconst result = await this.baseService.get(url);\n\n\t\tif (typeof result === \"object\" && result !== null) {\n\t\t\tresult._display = result._display || result.label || result.title || result.name || result.username || result.description || \"\";\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Query Buildx objects\n\t */\n\tasync query(type: string, options?: any): Promise<BuildxObject[] | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/buildx/${type}`);\n\t\tconst queryParams: Record<string, any> = {};\n\n\t\tif (options) {\n\t\t\tif (options.filter) {\n\t\t\t\tqueryParams.filter = options.filter;\n\t\t\t}\n\t\t\tif (options.jsonFilter) {\n\t\t\t\tqueryParams.jsonFilter = options.jsonFilter;\n\t\t\t}\n\t\t\tif (options.select) {\n\t\t\t\tqueryParams.select = Array.isArray(options.select)\n\t\t\t\t\t? options.select.join(\",\")\n\t\t\t\t\t: options.select;\n\t\t\t}\n\t\t\tif (options.projection) {\n\t\t\t\tqueryParams.projection = options.projection;\n\t\t\t}\n\t\t\tif (options.options) {\n\t\t\t\tqueryParams.options = options.options;\n\t\t\t}\n\t\t\tif (options.sort) {\n\t\t\t\tqueryParams.sort = options.sort;\n\t\t\t}\n\t\t\tif (options.limit) {\n\t\t\t\tqueryParams.limit = options.limit;\n\t\t\t}\n\t\t}\n\n\t\tconst queryString = this.baseService.buildQueryString(queryParams);\n\t\tconst fullUrl = queryString ? `${url}${queryString}` : url;\n\n\t\tconst result = await this.baseService.get(fullUrl);\n\n\t\tif (Array.isArray(result)) {\n\t\t\tresult.forEach(row => {\n\t\t\t\trow._display = row._display || row.label || row.title || row.name || row.username || row.description || \"\";\n\t\t\t});\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Create Buildx object\n\t */\n\tasync create(type: string, data: any): Promise<BuildxObject | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/buildx/${type}`);\n\t\treturn await this.baseService.post(url, data);\n\t}\n\n\t/**\n\t * Update Buildx object\n\t */\n\tasync update(type: string, id: string, data: any): Promise<BuildxObject | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/buildx/${type}/${id}`);\n\t\treturn await this.baseService.patch(url, data);\n\t}\n\n\t/**\n\t * Delete Buildx object\n\t */\n\tasync deleteObject(type: string, id: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/buildx/${type}/${id}`);\n\t\treturn await this.baseService.delete(url);\n\t}\n} ","import { BaseService } from \"./BaseService\";\nimport { ApiKey, ErrorResponse } from \"../types/index\";\n\n/**\n * API Keys service for Buildx\n * Handles API key management\n * \n * @example\n * ```typescript\n * const apiKeys = buildx.apiKeys();\n * \n * // List API keys\n * const keys = await apiKeys.list();\n * \n * // Get API key by ID\n * const key = await apiKeys.get('key-id');\n * \n * // Get API key secret\n * const secret = await apiKeys.getSecret('key-id');\n * ```\n */\nexport class ApiKeys {\n\tprivate baseService: BaseService;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\t/**\n\t * List all API keys\n\t */\n\tasync list(organizationId?: string): Promise<ApiKey[] | ErrorResponse> {\n\t\tconst url = organizationId\n\t\t\t? this.baseService.buildOrgUrl(\"/auth/api-keys\")\n\t\t\t: \"/auth/api-keys\";\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Get API key by ID\n\t */\n\tasync get(apiKeyId: string, organizationId?: string): Promise<ApiKey | ErrorResponse> {\n\t\tconst url = organizationId\n\t\t\t? this.baseService.buildOrgUrl(`/auth/api-key/${apiKeyId}`)\n\t\t\t: `/auth/api-key/${apiKeyId}`;\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Get API key secret\n\t */\n\tasync getSecret(apiKeyId: string, organizationId?: string): Promise<any | ErrorResponse> {\n\t\tconst url = organizationId\n\t\t\t? this.baseService.buildOrgUrl(`/auth/api-key/${apiKeyId}/secret`)\n\t\t\t: `/auth/api-key/${apiKeyId}/secret`;\n\t\treturn await this.baseService.get(url);\n\t}\n} ","import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from \"axios\";\nimport { BuildxConfig, ApiHeaders, ErrorResponse } from \"../types\";\n\nconst DEFAULT_API_ENDPOINT = \"https://api.buildx.ai\";\nconst DEFAULT_PROJECT_ID = \"default\";\nlet instances: Record<string, BaseService> = {};\n\n/**\n * Base service class that provides common functionality for all Buildx services\n */\nexport class BaseService {\n\tpublic config: BuildxConfig;\n\tpublic axiosInstance: AxiosInstance;\n\tprivate _accessToken: string | null = null;\n\tprivate _refreshToken: string | null = null;\n\n\tstatic getInstance(apiKey: string, projectId?: string, apiEndpoint?: string): BaseService {\n\t\tif (!projectId) {\n\t\t\tprojectId = \"default\";\n\t\t}\n\n\t\tconst endpoint = (apiEndpoint || DEFAULT_API_ENDPOINT).replace(/\\/$/, \"\");\n\t\tif (!instances[projectId]) {\n\t\t\tinstances[projectId] = new BaseService({\n\t\t\t\tapiEndpoint: endpoint,\n\t\t\t\tprojectId: projectId,\n\t\t\t\tapiKey: apiKey,\n\t\t\t});\n\t\t} else {\n\t\t\tconst current = instances[projectId];\n\t\t\tif (current.config.apiEndpoint !== endpoint || current.config.apiKey !== apiKey) {\n\t\t\t\tcurrent.updateConfig({\n\t\t\t\t\t...current.config,\n\t\t\t\t\tapiEndpoint: endpoint,\n\t\t\t\t\tapiKey: apiKey,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn instances[projectId];\n\t}\n\n\tconstructor(config: BuildxConfig) {\n\t\tthis.config = config;\n\t\tthis.axiosInstance = axios.create({\n\t\t\tbaseURL: config.apiEndpoint,\n\t\t\ttimeout: 30000,\n\t\t});\n\n\t\t// Add request interceptor for authentication\n\t\tthis.axiosInstance.interceptors.request.use(\n\t\t\t(config) => {\n\t\t\t\t// Add API key to all requests\n\t\t\t\tconfig.headers[\"X-API-Key\"] = this.config.apiKey;\n\t\t\t\treturn config;\n\t\t\t},\n\t\t\t(error) => {\n\t\t\t\treturn Promise.reject(error);\n\t\t\t}\n\t\t);\n\n\t\t// Add response interceptor for error handling\n\t\tthis.axiosInstance.interceptors.response.use(\n\t\t\t(response) => response,\n\t\t\t(error) => {\n\t\t\t\treturn this.handleError(error);\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Update the service configuration\n\t */\n\tupdateConfig(config: BuildxConfig): void {\n\t\tthis.config = config;\n\t\tthis.axiosInstance.defaults.baseURL = config.apiEndpoint;\n\t}\n\n\t/**\n\t * Set the access token\n\t */\n\tpublic setAccessToken(token: string | null): void {\n\t\tthis._accessToken = token;\n\t}\n\n\t/**\n\t * Get the access token\n\t */\n\tpublic getAccessToken(): string | null {\n\t\treturn this._accessToken;\n\t}\n\n\t/**\n\t * Set the refresh token\n\t */\n\tpublic setRefreshToken(token: string | null): void {\n\t\tthis._refreshToken = token;\n\t}\n\n\t/**\n\t * Get the refresh token\n\t */\n\tpublic getRefreshToken(): string | null {\n\t\treturn this._refreshToken;\n\t}\n\n\t/**\n\t * Clear all stored tokens\n\t */\n\tpublic clearTokens(): void {\n\t\tthis._accessToken = null;\n\t\tthis._refreshToken = null;\n\t}\n\n\t/**\n\t * Check if user is authenticated (has access token)\n\t */\n\tpublic isAuthenticated(): boolean {\n\t\treturn this._accessToken !== null;\n\t}\n\n\t/**\n\t * Get default headers with authentication\n\t */\n\tpublic async getHeaders(useRefreshToken = false): Promise<ApiHeaders> {\n\t\tconst token = useRefreshToken ? this._refreshToken : this._accessToken;\n\n\t\tconst headers: ApiHeaders = {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\"X-API-Key\": this.config.apiKey,\n\t\t};\n\n\t\tif (token) {\n\t\t\theaders[\"Authorization\"] = `Bearer ${token}`;\n\t\t}\n\n\t\treturn headers;\n\t}\n\n\t/**\n\t * Get headers without authentication (for public endpoints)\n\t */\n\tpublic getPublicHeaders(): ApiHeaders {\n\t\treturn {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\"X-API-Key\": this.config.apiKey,\n\t\t};\n\t}\n\n\t/**\n\t * Make a GET request\n\t */\n\tpublic async get<T = any>(url: string, config?: AxiosRequestConfig): Promise<T> {\n\t\tconst headers = await this.getHeaders();\n\t\tconst response: AxiosResponse<T> = await this.axiosInstance.get(url, {\n\t\t\t...config,\n\t\t\theaders: { ...headers, ...config?.headers },\n\t\t});\n\t\treturn response.data;\n\t}\n\n\t/**\n\t * Make a POST request\n\t */\n\tpublic async post<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {\n\t\tconst headers = await this.getHeaders();\n\t\tconst response: AxiosResponse<T> = await this.axiosInstance.post(url, data, {\n\t\t\t...config,\n\t\t\theaders: { ...headers, ...config?.headers },\n\t\t});\n\t\treturn response.data;\n\t}\n\n\t/**\n\t * Make a PUT request\n\t */\n\tpublic async put<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {\n\t\tconst headers = await this.getHeaders();\n\t\tconst response: AxiosResponse<T> = await this.axiosInstance.put(url, data, {\n\t\t\t...config,\n\t\t\theaders: { ...headers, ...config?.headers },\n\t\t});\n\t\treturn response.data;\n\t}\n\n\t/**\n\t * Make a PATCH request\n\t */\n\tpublic async patch<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {\n\t\tconst headers = await this.getHeaders();\n\t\tconst response: AxiosResponse<T> = await this.axiosInstance.patch(url, data, {\n\t\t\t...config,\n\t\t\theaders: { ...headers, ...config?.headers },\n\t\t});\n\t\treturn response.data;\n\t}\n\n\t/**\n\t * Make a DELETE request\n\t */\n\tpublic async delete<T = any>(url: string, config?: AxiosRequestConfig): Promise<T> {\n\t\tconst headers = await this.getHeaders();\n\t\tconst response: AxiosResponse<T> = await this.axiosInstance.delete(url, {\n\t\t\t...config,\n\t\t\theaders: { ...headers, ...config?.headers },\n\t\t});\n\t\treturn response.data;\n\t}\n\n\t/**\n\t * Handle API errors\n\t */\n\tpublic handleError(error: any): ErrorResponse {\n\t\tif (error.response) {\n\t\t\tconst { status, data } = error.response;\n\n\t\t\tif (data && typeof data === \"object\") {\n\t\t\t\treturn {\n\t\t\t\t\terror: data.error || \"RequestError\",\n\t\t\t\t\tmessage: data.message || data.description || \"Something went wrong\",\n\t\t\t\t\tstatusCode: status,\n\t\t\t\t\tsuccess: false,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\terror: \"RequestError\",\n\t\t\t\tmessage: `Request failed with status ${status}`,\n\t\t\t\tstatusCode: status,\n\t\t\t\tsuccess: false,\n\t\t\t};\n\t\t}\n\n\t\tif (error.message === \"Network Error\") {\n\t\t\treturn {\n\t\t\t\terror: \"NetworkError\",\n\t\t\t\tmessage: \"Network connection failed\",\n\t\t\t\tstatusCode: 500,\n\t\t\t\tsuccess: false,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\terror: \"RequestError\",\n\t\t\tmessage: error.message || \"Unknown error occurred\",\n\t\t\tstatusCode: 500,\n\t\t\tsuccess: false,\n\t\t};\n\t}\n\n\t/**\n\t * Build URL with project ID\n\t */\n\tpublic buildProjectUrl(path = \"\"): string {\n\t\tconst pid = this.config.projectId;\n\t\tif (!pid || pid === DEFAULT_PROJECT_ID) {\n\t\t\tthrow new Error(\"Project ID is required\");\n\t\t}\n\t\treturn `/project/${pid}${path}`;\n\t}\n\n\t/**\n\t * Build URL with organization ID\n\t */\n\tpublic buildOrgUrl(path = \"\"): string {\n\t\tconst oid = this.config.organizationId || this.config.projectId;\n\t\tif (!oid) {\n\t\t\tthrow new Error(\"Organization ID is required\");\n\t\t}\n\t\treturn `/${oid}${path}`;\n\t}\n\n\t/**\n\t * Build query string from options\n\t */\n\tpublic buildQueryString(options: Record<string, any>): string {\n\t\tconst params = new URLSearchParams();\n\n\t\tObject.entries(options).forEach(([key, value]) => {\n\t\t\tif (value !== undefined && value !== null) {\n\t\t\t\tif (typeof value === \"object\") {\n\t\t\t\t\tparams.append(key, JSON.stringify(value));\n\t\t\t\t} else {\n\t\t\t\t\tparams.append(key, String(value));\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tconst queryString = params.toString();\n\t\treturn queryString ? `?${queryString}` : \"\";\n\t}\n}\n","import { BuildxConfig } from \"./types\";\nimport { Auth } from \"./services/Auth\";\nimport { Projects } from \"./services/Projects\";\nimport { Collections } from \"./services/Collections\";\nimport { Storage } from \"./services/Storage\";\nimport { Flows } from \"./services/Flows\";\nimport { Templates } from \"./services/Templates\";\nimport { Functions } from \"./services/Functions\";\nimport { BuildxObjects } from \"./services/BuildxObjects\";\nimport { ApiKeys } from \"./services/ApiKeys\";\nimport { BaseService } from \"./services/BaseService\";\n\n/**\n * Main Buildx SDK class\n * \n * @example\n * ```typescript\n * import { Buildx } from 'buildx-sdk';\n * \n * const buildx = new Buildx({\n * apiEndpoint: 'https://api.buildx.com',\n * apiKey: 'your-api-key',\n * projectId: 'your-project-id'\n * });\n * \n * // Use different services\n * const auth = buildx.auth();\n * const projects = buildx.projects();\n * const collections = buildx.collections();\n * ```\n */\nexport class Buildx {\n\tprivate config: BuildxConfig;\n\tprivate _auth: Auth;\n\tprivate _projects: Projects;\n\tprivate _collections: Collections;\n\tprivate _storage: Storage;\n\tprivate _flows: Flows;\n\tprivate _templates: Templates;\n\tprivate _functions: Functions;\n\tprivate _buildxObjects: BuildxObjects;\n\tprivate _apiKeys: ApiKeys;\n\n\tprivate _baseService: BaseService;\n\n\tconstructor(config: BuildxConfig) {\n\t\tthis.config = {\n\t\t\tapiEndpoint: config.apiEndpoint.replace(/\\/$/, \"\"), // Remove trailing slash\n\t\t\tapiKey: config.apiKey,\n\t\t\tprojectId: config.projectId,\n\t\t\torganizationId: config.organizationId,\n\t\t};\n\n\t\tthis._baseService = BaseService.getInstance(this.config.apiKey, this.config.projectId, this.config.apiEndpoint);\n\n\t\t// Initialize services\n\t\tthis._auth = new Auth(this._baseService);\n\t\tthis._projects = new Projects(this._baseService);\n\t\tthis._collections = new Collections(this._baseService);\n\t\tthis._storage = new Storage(this._baseService);\n\t\tthis._flows = new Flows(this._baseService);\n\t\tthis._templates = new Templates(this._baseService);\n\t\tthis._functions = new Functions(this._baseService);\n\t\tthis._buildxObjects = new BuildxObjects(this._baseService);\n\t\tthis._apiKeys = new ApiKeys(this._baseService);\n\t}\n\n\t/**\n\t * Get the current configuration\n\t */\n\tgetConfig(): BuildxConfig {\n\t\treturn { ...this.config };\n\t}\n\n\t/**\n\t * Update the configuration\n\t */\n\tupdateConfig(config: Partial<BuildxConfig>): void {\n\t\tthis.config = { ...this.config, ...config };\n\t\tthis._baseService.updateConfig(this.config);\n\t}\n\n\t/**\n\t * Authentication service\n\t * Handles user authentication, login, signup, and user management\n\t */\n\tauth(): Auth {\n\t\treturn this._auth;\n\t}\n\n\t/**\n\t * Projects service\n\t * Manages projects, including CRUD operations\n\t */\n\tprojects(): Projects {\n\t\treturn this._projects;\n\t}\n\n\t/**\n\t * Collections service\n\t * Manages data collections, documents, and queries\n\t */\n\tcollections(): Collections {\n\t\treturn this._collections;\n\t}\n\n\t/**\n\t * Storage service\n\t * Handles file upload, download, and management\n\t */\n\tstorage(): Storage {\n\t\treturn this._storage;\n\t}\n\n\t/**\n\t * Flows service\n\t * Manages workflow execution and flow types\n\t */\n\tflows(): Flows {\n\t\treturn this._flows;\n\t}\n\n\t/**\n\t * Templates service\n\t * Handles template rendering and preview\n\t */\n\ttemplates(): Templates {\n\t\treturn this._templates;\n\t}\n\n\t/**\n\t * Functions service\n\t * Manages serverless functions\n\t */\n\tfunctions(): Functions {\n\t\treturn this._functions;\n\t}\n\n\t/**\n\t * Buildx Objects service\n\t * Manages Buildx-specific objects (users, roles, etc.)\n\t */\n\tbuildxObjects(): BuildxObjects {\n\t\treturn this._buildxObjects;\n\t}\n\n\t/**\n\t * API Keys service\n\t * Manages API key operations\n\t */\n\tapiKeys(): ApiKeys {\n\t\treturn this._apiKeys;\n\t}\n}\n\n// Export the main class as default\nexport default Buildx;\n"],"names":["Auth","constructor","baseService","this","setAccessToken","token","getAccessToken","setRefreshToken","getRefreshToken","clearTokens","isAuthenticated","storeTokens","response","access_token","refresh_token","isErrorResponse","success","hasProjectScope","projectId","config","login","credentials","url","buildProjectUrl","post","loginWithGoogle","signup","requestEotp","request","requestEotpAuth","requestOtpLogin","verifyEotp","verify","verifyEotpAuth","verifyOtpLogin","getCurrentUser","get","refreshToken","updatePassword","password","changePassword","newPassword","new_password","payload","currentPassword","current_password","adminUpdatePassword","userId","user_id","requestPasswordReset","resetPassword","updatePushToken","listUsers","organizationId","buildOrgUrl","lookupUsers","getUser","deleteUser","Projects","list","create","projectData","update","patch","deleteById","delete","backup","axiosInstance","responseType","headers","getHeaders","window","URL","createObjectURL","data","link","document","createElement","href","setAttribute","body","appendChild","click","removeChild","revokeObjectURL","message","restore","file","formData","FormData","append","CollectionWsClient","collectionId","wsFactory","socket","connectPromise","requestCounter","pending","Map","query","action","timeoutMs","ensureConnected","Error","id","Date","now","resultPromise","Promise","resolve","reject","timeout","setTimeout","set","send","JSON","stringify","close","_error","entry","entries","clearTimeout","clear","isSocketOpen","GlobalWebSocket","globalThis","WebSocket","buildSocketUrl","settled","onOpen","onError","error","onClose","onMessage","event","parse","ok","result","addEventListener","onopen","onerror","onclose","onmessage","finally","openState","OPEN","readyState","wsEndpoint","apiEndpoint","replace","path","params","URLSearchParams","apiKey","qs","toString","Collections","collectionWsClient","collectionWsCollectionId","collectionWsDisabledUntil","withStats","withBuildx","queryParams","with_stats","queryString","buildQueryString","fullUrl","collections","Array","isArray","filter","collection","collection_id","startsWith","getSchema","depth","collectionData","deleteCollection","options","noPopulate","relations","length","buildQueryParams","preferWs","paginationTransport","hydrateRelations","relationSelect","queryRaw","normalizedOptions","queryRawViaWs","console","warn","resetCollectionWsClient","queryWithPagination","transport","queryWithPaginationViaWs","queryWithPaginationViaHttp","hydratedRows","meta","client","getOrCreateCollectionWsClient","subscribeRealtime","handlers","endpoint","lastEventId","factory","eventSourceFactory","EventSource","source","hasConnected","emitConnected","onConnected","emitEvent","onEvent","lookup","jsonFilter","projection","map","row","value","_id","label","_display","title","name","username","description","searchQuery","q","quick_filter_fields","select","join","sort","limit","skip","rows","enhancedRows","defaultSelect","groupedByCollection","reduce","acc","relation","push","relationCache","refCollectionId","configs","Object","ids","Set","field","item","add","missingIds","from","has","chunkSize","RELATION_QUERY_CHUNK_SIZE","i","idChunk","slice","relatedDocs","$in","doc","getDocument","documentId","populate","createDocument","updateDocument","updateDocumentWithOptions","baseUrl","updateOnly","getDocumentRevisions","deleteDocument","deleteByFilter","import","mapping","getDataTypes","validate","migrate","Storage","upload","prefix","uploadToCollection","encodeURIComponent","getSize","Flows","getTypes","run","flowId","sessionId","state","args","session_id","getGptFlowSuggestions","instruction","getGptCollectionSuggestions","getGptLifecycleSuggestions","Templates","preview","template","render","templateId","renderPDF","blobUrl","Functions","getByName","functionName","getLogs","BuildxObjects","getCollection","type","forEach","deleteObject","ApiKeys","apiKeyId","getSecret","instances","BaseService","getInstance","current","updateConfig","_accessToken","_refreshToken","axios","baseURL","interceptors","use","handleError","defaults","useRefreshToken","getPublicHeaders","put","status","statusCode","pid","oid","key","String","Buildx","_baseService","_auth","_projects","_collections","_storage","_flows","_templates","_functions","_buildxObjects","_apiKeys","getConfig","auth","projects","storage","flows","templates","functions","buildxObjects","apiKeys"],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { Buildx, default } from "./Buildx";
|
|
2
|
+
export { Auth } from "./services/Auth";
|
|
3
|
+
export { Projects } from "./services/Projects";
|
|
4
|
+
export { Collections } from "./services/Collections";
|
|
5
|
+
export { Storage } from "./services/Storage";
|
|
6
|
+
export { Flows } from "./services/Flows";
|
|
7
|
+
export { Templates } from "./services/Templates";
|
|
8
|
+
export { Functions } from "./services/Functions";
|
|
9
|
+
export { BuildxObjects } from "./services/BuildxObjects";
|
|
10
|
+
export { ApiKeys } from "./services/ApiKeys";
|
|
11
|
+
export * from "./types";
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import e from"axios";class t{constructor(e){this.baseService=e}setAccessToken(e){this.baseService.setAccessToken(e)}getAccessToken(){return this.baseService.getAccessToken()}setRefreshToken(e){this.baseService.setRefreshToken(e)}getRefreshToken(){return this.baseService.getRefreshToken()}clearTokens(){this.baseService.clearTokens()}isAuthenticated(){return this.baseService.isAuthenticated()}storeTokens(e){"access_token"in e&&e.access_token&&this.baseService.setAccessToken(e.access_token),"refresh_token"in e&&e.refresh_token&&this.baseService.setRefreshToken(e.refresh_token)}isErrorResponse(e){return e&&"object"==typeof e&&"success"in e&&!1===e.success}hasProjectScope(){const e=this.baseService.config.projectId;return!!e&&"default"!==e}async login(e){const t=this.baseService.buildProjectUrl("/auth/login"),s=await this.baseService.post(t,e);return this.isErrorResponse(s)||this.storeTokens(s),s}async loginWithGoogle(e){const t=this.baseService.buildProjectUrl("/auth/google"),s=await this.baseService.post(t,e);return this.isErrorResponse(s)||this.storeTokens(s),s}async signup(e){const t=this.baseService.buildProjectUrl("/auth/signup"),s=await this.baseService.post(t,e);return this.isErrorResponse(s)||this.storeTokens(s),s}async requestEotp(e){const t=this.baseService.buildProjectUrl("/auth/eotp/auth/request");return await this.baseService.post(t,e)}async requestEotpAuth(e){return this.requestEotp(e)}async requestOtpLogin(e){return this.requestEotp(e)}async verifyEotp(e){const t=this.baseService.buildProjectUrl("/auth/eotp/auth/verify"),s=await this.baseService.post(t,e);return this.isErrorResponse(s)||this.storeTokens(s),s}async verifyEotpAuth(e){return this.verifyEotp(e)}async verifyOtpLogin(e){return this.verifyEotp(e)}async getCurrentUser(){const e=this.baseService.buildProjectUrl("/auth/me");return await this.baseService.get(e)}async refreshToken(){const e=this.baseService.buildProjectUrl("/auth/token"),t=await this.baseService.post(e,{});return this.isErrorResponse(t)||"access_token"in t&&t.access_token&&this.storeTokens(t),t}async updatePassword(e){const t=this.baseService.buildProjectUrl("/auth/password/update");return await this.baseService.post(t,{password:e})}async changePassword(e){const t=this.baseService.buildProjectUrl("/auth/password/update");if("string"==typeof e)return await this.baseService.post(t,{password:e});const s=e.password??e.newPassword??e.new_password,i={...e};return s&&(i.password=s),e.currentPassword&&!i.current_password&&(i.current_password=e.currentPassword),e.newPassword&&!i.new_password&&(i.new_password=e.newPassword),await this.baseService.post(t,i)}async adminUpdatePassword(e,t){const s=this.baseService.buildProjectUrl("/auth/password/update");return await this.baseService.post(s,{user_id:e,password:t})}async requestPasswordReset(e){const t=this.hasProjectScope()?this.baseService.buildProjectUrl("/auth/password/reset/request"):"/auth/password/reset/request";return await this.baseService.post(t,e)}async resetPassword(e){const t=this.hasProjectScope()?this.baseService.buildProjectUrl("/auth/password/reset"):"/auth/password/reset";return await this.baseService.post(t,e)}async updatePushToken(e){const t=this.baseService.buildProjectUrl("/users/push-tokens");return await this.baseService.post(t,{token:e})}async listUsers(e){const t=e?this.baseService.buildOrgUrl("/auth/users"):"/auth/users";return await this.baseService.get(t)}async lookupUsers(e){const t=e?this.baseService.buildOrgUrl("/auth/users/lookup"):"/auth/users/lookup";return await this.baseService.get(t)}async getUser(e,t){const s=t?this.baseService.buildOrgUrl(`/auth/user/${e}`):`/auth/user/${e}`;return await this.baseService.get(s)}async deleteUser(e){const t=this.baseService.buildProjectUrl(`/auth/user/${e}/delete`);return await this.baseService.post(t,{})}}class s{constructor(e){this.baseService=e}async list(){return await this.baseService.get("/projects")}async get(e){return await this.baseService.get(`/project/${e}`)}async create(e){return await this.baseService.post("/projects",e)}async update(e,t){return await this.baseService.patch(`/project/${e}`,t)}async deleteById(e){return await this.baseService.delete(`/project/${e}`)}async backup(e){const t=await this.baseService.axiosInstance.get(`/project/${e}/backup`,{responseType:"blob",headers:await this.baseService.getHeaders()});if("undefined"!=typeof window){const s=window.URL.createObjectURL(t.data),i=document.createElement("a");i.href=s,i.setAttribute("download",`backup_${e}.buildx`),document.body.appendChild(i),i.click(),document.body.removeChild(i),window.URL.revokeObjectURL(s)}return{success:!0,message:"Backup downloaded successfully"}}async restore(e,t){const s=new FormData;s.append("new_project_id",e),s.append("backup_file",t);const i={...await this.baseService.getHeaders(),"Content-Type":"multipart/form-data"};return await this.baseService.post("/project/import",s,{headers:i})}}class i{constructor(e,t,s){this.baseService=e,this.collectionId=t,this.wsFactory=s,this.socket=null,this.connectPromise=null,this.requestCounter=0,this.pending=new Map}async query(e,t,s=3e4){if(await this.ensureConnected(),!this.socket)throw new Error("WebSocket connection is unavailable");const i=`${Date.now()}_${++this.requestCounter}`,r=new Promise((e,t)=>{const r=setTimeout(()=>{this.pending.delete(i),t(new Error("WebSocket pagination timeout"))},s);this.pending.set(i,{resolve:e,reject:t,timeout:r})});return this.socket.send(JSON.stringify({id:i,action:e,payload:t})),r}close(){if(this.socket){try{this.socket.close()}catch(e){}this.socket=null,this.connectPromise=null;for(const[,e]of this.pending.entries())clearTimeout(e.timeout),e.reject(new Error("WebSocket closed"));this.pending.clear()}}async ensureConnected(){if(!this.socket||!this.isSocketOpen(this.socket))return this.connectPromise||(this.connectPromise=new Promise((e,t)=>{const s=globalThis.WebSocket;if(!this.wsFactory&&!s)return void t(new Error("WebSocket is not available in this runtime"));const i=this.wsFactory?this.wsFactory(this.buildSocketUrl()):new s(this.buildSocketUrl());this.socket=i;let r=!1;const a=()=>{r||(r=!0,e())},n=e=>{r||(r=!0,t(e)),this.close()},o=()=>{r||(r=!0,t(new Error("WebSocket closed before connection is ready"))),this.close()},c=e=>{let t;try{t=JSON.parse(e?.data||"{}")}catch(e){return}const s=t?.id;if(!s)return;const i=this.pending.get(s);i&&(clearTimeout(i.timeout),this.pending.delete(s),t.ok&&t.result?i.resolve(t.result):i.reject(new Error(t.error||"WebSocket pagination query failed")))};i.addEventListener?(i.addEventListener("open",a),i.addEventListener("error",n),i.addEventListener("close",o),i.addEventListener("message",c)):(i.onopen=a,i.onerror=n,i.onclose=o,i.onmessage=c)}).finally(()=>{this.connectPromise=null})),this.connectPromise}isSocketOpen(e){const t=globalThis.WebSocket?.OPEN??1;return e.readyState===t}buildSocketUrl(){const e=this.baseService.config.apiEndpoint.replace(/\/$/,"").replace(/^http:/i,"ws:").replace(/^https:/i,"wss:"),t=this.baseService.buildProjectUrl(`/${this.collectionId}/data/pagination/ws`),s=new URLSearchParams,i=this.baseService.config.apiKey;i&&s.set("api_key",i);const r=this.baseService.getAccessToken();r&&s.set("token",r);const a=s.toString();return`${e}${t}${a?`?${a}`:""}`}}class r{constructor(e){this.collectionWsClient=null,this.collectionWsCollectionId=null,this.collectionWsDisabledUntil=0,this.baseService=e}async list(e=!1,t=!1){const s=this.baseService.buildProjectUrl("/collections"),i={};e&&(i.with_stats=!0);const r=this.baseService.buildQueryString(i),a=r?`${s}${r}`:s,n=await this.baseService.get(a);return Array.isArray(n)&&!t?n.filter(e=>e.collection_id&&!e.collection_id.startsWith("buildx_")):n}async getSchema(e,t=1){const s=this.baseService.buildProjectUrl(`/collection/${e}`),i={};t>1&&(i.depth=t);const r=this.baseService.buildQueryString(i),a=r?`${s}${r}`:s;return await this.baseService.get(a)}async set(e){const t=this.baseService.buildProjectUrl("/collections");return await this.baseService.post(t,e)}async deleteCollection(e){const t=this.baseService.buildProjectUrl(`/collections/${e}`);return await this.baseService.delete(t)}async query(e,t){const s=this.baseService.buildProjectUrl(`/${e}`),i=t?.noPopulate??(!!t?.relations&&t.relations.length>0),r=this.buildQueryParams({...t,options:i?{...t?.options||{},noPopulate:!0}:t?.options}),a=this.baseService.buildQueryString(r),n=a?`${s}${a}`:s,o=await this.baseService.get(n);if(!Array.isArray(o))return o;if(!t?.relations||0===t.relations.length)return o;const c="http"!==(t?.paginationTransport||"auto");return await this.hydrateRelations(o,t.relations,t.relationSelect,{preferWs:c,wsFactory:t.wsFactory})}async queryRaw(e,t){const s={...t,options:{...t?.options||{},noPopulate:!0}};if("http"!==(s.paginationTransport||"http")&&Date.now()>=this.collectionWsDisabledUntil)try{return await this.queryRawViaWs(e,s)}catch(e){console.warn("[buildx-sdk] WS raw query failed, fallback to HTTP",e?.message||e),this.collectionWsDisabledUntil=Date.now()+3e4,this.resetCollectionWsClient()}const i=this.baseService.buildProjectUrl(`/${e}/raw`),r=this.buildQueryParams(s),a=this.baseService.buildQueryString(r),n=a?`${i}${a}`:i;return await this.baseService.get(n)}async queryWithPagination(e,t){const s=t?.noPopulate??(!!t?.relations&&t.relations.length>0),i={...t,options:s?{...t?.options||{},noPopulate:!0}:t?.options},r=i.paginationTransport||"auto";let a;if("http"!==r&&Date.now()>=this.collectionWsDisabledUntil)try{a=await this.queryWithPaginationViaWs(e,i)}catch(t){console.warn("[buildx-sdk] WS pagination failed, fallback to HTTP",t?.message||t),this.collectionWsDisabledUntil=Date.now()+3e4,this.resetCollectionWsClient(),a=await this.queryWithPaginationViaHttp(e,i)}else a=await this.queryWithPaginationViaHttp(e,i);if(!a||!1===a.success)return a;if(!i?.relations||0===i.relations.length)return a;const n="http"!==r,o=await this.hydrateRelations(a.data||[],i.relations,i.relationSelect,{preferWs:n,wsFactory:i.wsFactory});return Array.isArray(o)?{...a,data:o}:o}async queryWithPaginationViaHttp(e,t){const s=this.baseService.buildProjectUrl(`/${e}/data/pagination`),i=this.buildQueryParams(t),r=this.baseService.buildQueryString(i),a=r?`${s}${r}`:s,n=await this.baseService.get(a);return n&&!1!==n.success?{...n,meta:{...n.meta||{},transport:"http"}}:n}async queryWithPaginationViaWs(e,t){const s=this.buildQueryParams(t),i=this.getOrCreateCollectionWsClient(e,t?.wsFactory),r=await i.query("queryWithPagination",s);return r&&!1!==r.success?{...r,meta:{...r.meta||{},transport:"ws"}}:r}async queryRawViaWs(e,t){const s=this.buildQueryParams(t),i=this.getOrCreateCollectionWsClient(e,t?.wsFactory),r=await i.query("queryRaw",s);return r&&!1!==r.success?Array.isArray(r)?r:[]:r}getOrCreateCollectionWsClient(e,t){return this.collectionWsClient&&this.collectionWsCollectionId===e||(this.resetCollectionWsClient(),this.collectionWsClient=new i(this.baseService,e,t),this.collectionWsCollectionId=e),this.collectionWsClient}resetCollectionWsClient(){this.collectionWsClient&&this.collectionWsClient.close(),this.collectionWsClient=null,this.collectionWsCollectionId=null}subscribeRealtime(e,t,s){const i=this.baseService.config.apiEndpoint.replace(/\/$/,""),r=this.baseService.buildProjectUrl(`/${e}/realtime/stream`),a=new URLSearchParams,n=s?.apiKey||this.baseService.config.apiKey;n&&a.set("api_key",n);const o=s?.token||this.baseService.getAccessToken();o&&a.set("token",o),s?.lastEventId&&a.set("lastEventId",s.lastEventId);const c=a.toString(),l=`${i}${r}${c?`?${c}`:""}`,u=s?.eventSourceFactory||globalThis.EventSource;if(!u)throw new Error("EventSource is not available in this runtime. Provide eventSourceFactory in options.");const h=u(l);let d=!1;const p=()=>{d||(d=!0,t.onConnected?.())},b=e=>{try{const s=JSON.parse(e.data);t.onEvent?.(s)}catch(e){t.onError?.(e)}};return h.onopen=()=>{p()},h.onmessage=e=>b(e),h.onerror=e=>{t.onError?.(e)},h.addEventListener?.("connected",()=>{p()}),h.addEventListener?.("collection:data",e=>{b(e)}),{close:()=>h.close()}}async lookup(e,t){const s=this.baseService.buildProjectUrl(`/${e}`),i={};t&&(t.filter&&(i.filter=t.filter),t.jsonFilter&&(i.jsonFilter=t.jsonFilter),t.projection&&(i.projection=t.projection),t.options&&(i.options=t.options));const r=this.baseService.buildQueryString(i),a=r?`${s}${r}`:s,n=await this.baseService.get(a);return Array.isArray(n)?n.map(e=>({value:e._id,label:e._display||e.label||e.title||e.name||e.username||e.description||""})):n}buildQueryParams(e){const t={};if(!e)return t;const s=e.q||e.searchQuery;return s&&(t.q=s),e.quick_filter_fields&&(t.quick_filter_fields=e.quick_filter_fields),e.filter&&(t.filter=e.filter),e.jsonFilter&&(t.jsonFilter=e.jsonFilter),e.select&&(t.select=Array.isArray(e.select)?e.select.join(","):e.select),e.projection&&(t.projection=e.projection),e.options&&(t.options=e.options),e.sort&&(t.sort=e.sort),"number"==typeof e.limit&&(t.limit=e.limit),"number"==typeof e.skip&&e.skip>0&&(t.skip=e.skip),t}async hydrateRelations(e,t,s,i){const a=e.map(e=>({...e})),n=s||"_id,_display,name,title,username",o=t.reduce((e,t)=>(e[t.collectionId]||(e[t.collectionId]=[]),e[t.collectionId].push(t),e),{}),c=new Map;for(const[e,t]of Object.entries(o)){const s=new Set;for(const e of a)for(const i of t){const t=e[i.field];if(t)if(Array.isArray(t))for(const e of t)"string"==typeof e?s.add(e):e&&"object"==typeof e&&e._id&&s.add(e._id);else"string"==typeof t?s.add(t):t&&"object"==typeof t&&t._id&&s.add(t._id)}const o=Array.from(s).filter(t=>!c.has(`${e}:${t}`));if(o.length>0){const t=r.RELATION_QUERY_CHUNK_SIZE;for(let s=0;s<o.length;s+=t){const r=o.slice(s,s+t),a=await this.queryRaw(e,{filter:{_id:{$in:r}},select:n,paginationTransport:i?.preferWs?"auto":"http",wsFactory:i?.wsFactory});if(!Array.isArray(a))return a;for(const t of a)t?._id&&c.set(`${e}:${t._id}`,t)}}for(const s of a)for(const i of t){const t=s[i.field];if(t)if(Array.isArray(t))s[i.field]=t.map(t=>{const s="string"==typeof t?t:t?._id;return s&&c.get(`${e}:${s}`)||t});else{const r="string"==typeof t?t:t?._id;if(!r)continue;s[i.field]=c.get(`${e}:${r}`)||t}}}return a}async getDocument(e,t,s){const i=this.baseService.buildProjectUrl(`/${e}/${t}`),r={};s&&s.length>0&&(r.populate=s.join(","));const a=this.baseService.buildQueryString(r),n=a?`${i}${a}`:i;return await this.baseService.get(n)}async createDocument(e,t){const s=this.baseService.buildProjectUrl(`/${e}`);return await this.baseService.post(s,t)}async updateDocument(e,t,s){const i=this.baseService.buildProjectUrl(`/${e}/${t}`);return await this.baseService.patch(i,s)}async updateDocumentWithOptions(e,t,s,i){const r=this.baseService.buildProjectUrl(`/${e}/${t}`),a=i?.updateOnly?`${r}?mode=updateOnly`:r;return await this.baseService.patch(a,s)}async getDocumentRevisions(e,t){const s=this.baseService.buildProjectUrl(`/${e}/${t}/revisions`);return await this.baseService.get(s)}async deleteDocument(e,t){const s=this.baseService.buildProjectUrl(`/${e}/${t}`);return await this.baseService.delete(s)}async deleteByFilter(e,t){const s=this.baseService.buildProjectUrl(`/${e}/delete`);return await this.baseService.post(s,{filter:t})}async import(e,t,s){const i=new FormData;i.append("mapping",JSON.stringify(s)),i.append("file",t);const r=this.baseService.buildProjectUrl(`/${e}/import`),a={...await this.baseService.getHeaders(),"Content-Type":"multipart/form-data"};return await this.baseService.post(r,i,{headers:a})}async getDataTypes(){const e=this.baseService.buildProjectUrl("/collections/types");return await this.baseService.get(e)}async validate(e){const t=this.baseService.buildProjectUrl(`/${e}/validate`);return await this.baseService.post(t,null)}async migrate(e){const t=this.baseService.buildProjectUrl(`/${e}/migrate`);return await this.baseService.post(t,null)}}r.RELATION_QUERY_CHUNK_SIZE=200;class a{constructor(e){this.baseService=e}async upload(e,t){const s=new FormData;t&&""!==t&&s.append("prefix",t),s.append("file",e),s.append("filename",e.name||"file");const i=this.baseService.buildProjectUrl("/storage/upload"),r={...await this.baseService.getHeaders(),"Content-Type":"multipart/form-data; charset=utf-8"};return await this.baseService.post(i,s,{headers:r})}async uploadToCollection(e,t,s){const i=new FormData;s&&""!==s&&i.append("prefix",s),i.append("file",e),i.append("filename",e.name||"file"),i.append("collection_id",t);const r=this.baseService.buildProjectUrl("/storage/upload"),a={...await this.baseService.getHeaders(),"Content-Type":"multipart/form-data; charset=utf-8"};return await this.baseService.post(r,i,{headers:a})}async list(e){const t=this.baseService.buildProjectUrl(`/storage?path=${encodeURIComponent(e)}`);return await this.baseService.get(t)}async getSize(e){const t=this.baseService.buildProjectUrl(`/storage/size?path=${encodeURIComponent(e)}`);return await this.baseService.get(t)}async delete(e){const t=this.baseService.buildProjectUrl(`/storage?path=${encodeURIComponent(e)}`);return await this.baseService.delete(t)}}class n{constructor(e){this.baseService=e}async getTypes(){return await this.baseService.get("/flows/types")}async run(e,t=null,s="root",i={}){const r=this.baseService.buildProjectUrl(`/flows/${e}/run`);return await this.baseService.post(r,{session_id:t,state:s,args:i})}async getGptFlowSuggestions(e){const t=this.baseService.buildProjectUrl("/ai/gpt/flow/node");return await this.baseService.post(t,{instruction:e})}async getGptCollectionSuggestions(e){const t=this.baseService.buildProjectUrl("/ai/gpt/collections");return await this.baseService.post(t,{instruction:e})}async getGptLifecycleSuggestions(e){const t=this.baseService.buildProjectUrl("/ai/gpt/lifecycle");return await this.baseService.post(t,{instruction:e})}}class o{constructor(e){this.baseService=e}async preview(e,t){const s=this.baseService.buildProjectUrl("/templates/preview");return await this.baseService.post(s,{template:e,data:t})}async render(e,t){const s=this.baseService.buildProjectUrl(`/templates/${e}/render`);return await this.baseService.post(s,t)}async renderPDF(e,t){const s=this.baseService.buildProjectUrl(`/templates/${e}/pdf`),i={...await this.baseService.getHeaders(),responseType:"blob"},r=await this.baseService.axiosInstance.post(s,t,{headers:i});if("undefined"!=typeof window){const e=window.URL.createObjectURL(r.data),t=document.createElement("a");t.href=e,t.setAttribute("download","document.pdf"),document.body.appendChild(t),t.click(),document.body.removeChild(t),window.URL.revokeObjectURL(e)}return{success:!0,message:"PDF downloaded successfully"}}}class c{constructor(e){this.baseService=e}async list(){const e=this.baseService.buildProjectUrl("/functions");return await this.baseService.get(e)}async getByName(e){const t=this.baseService.buildProjectUrl(`/functions/${e}`);return await this.baseService.get(t)}async update(e,t){const s=this.baseService.buildProjectUrl(`/functions/${e}`);return await this.baseService.post(s,t)}async getLogs(e){const t=this.baseService.buildProjectUrl(`/functions/${e}/logs`);return await this.baseService.get(t)}}class l{constructor(e){this.baseService=e}async getCollection(e){const t=this.baseService.buildProjectUrl(`/buildx/collection/${e}`);return await this.baseService.get(t)}async getDocument(e,t){const s=this.baseService.buildProjectUrl(`/buildx/${e}/${t}`),i=await this.baseService.get(s);return"object"==typeof i&&null!==i&&(i._display=i._display||i.label||i.title||i.name||i.username||i.description||""),i}async query(e,t){const s=this.baseService.buildProjectUrl(`/buildx/${e}`),i={};t&&(t.filter&&(i.filter=t.filter),t.jsonFilter&&(i.jsonFilter=t.jsonFilter),t.select&&(i.select=Array.isArray(t.select)?t.select.join(","):t.select),t.projection&&(i.projection=t.projection),t.options&&(i.options=t.options),t.sort&&(i.sort=t.sort),t.limit&&(i.limit=t.limit));const r=this.baseService.buildQueryString(i),a=r?`${s}${r}`:s,n=await this.baseService.get(a);return Array.isArray(n)&&n.forEach(e=>{e._display=e._display||e.label||e.title||e.name||e.username||e.description||""}),n}async create(e,t){const s=this.baseService.buildProjectUrl(`/buildx/${e}`);return await this.baseService.post(s,t)}async update(e,t,s){const i=this.baseService.buildProjectUrl(`/buildx/${e}/${t}`);return await this.baseService.patch(i,s)}async deleteObject(e,t){const s=this.baseService.buildProjectUrl(`/buildx/${e}/${t}`);return await this.baseService.delete(s)}}class u{constructor(e){this.baseService=e}async list(e){const t=e?this.baseService.buildOrgUrl("/auth/api-keys"):"/auth/api-keys";return await this.baseService.get(t)}async get(e,t){const s=t?this.baseService.buildOrgUrl(`/auth/api-key/${e}`):`/auth/api-key/${e}`;return await this.baseService.get(s)}async getSecret(e,t){const s=t?this.baseService.buildOrgUrl(`/auth/api-key/${e}/secret`):`/auth/api-key/${e}/secret`;return await this.baseService.get(s)}}let h={};class d{static getInstance(e,t,s){t||(t="default");const i=(s||"https://api.buildx.ai").replace(/\/$/,"");if(h[t]){const s=h[t];s.config.apiEndpoint===i&&s.config.apiKey===e||s.updateConfig({...s.config,apiEndpoint:i,apiKey:e})}else h[t]=new d({apiEndpoint:i,projectId:t,apiKey:e});return h[t]}constructor(t){this._accessToken=null,this._refreshToken=null,this.config=t,this.axiosInstance=e.create({baseURL:t.apiEndpoint,timeout:3e4}),this.axiosInstance.interceptors.request.use(e=>(e.headers["X-API-Key"]=this.config.apiKey,e),e=>Promise.reject(e)),this.axiosInstance.interceptors.response.use(e=>e,e=>this.handleError(e))}updateConfig(e){this.config=e,this.axiosInstance.defaults.baseURL=e.apiEndpoint}setAccessToken(e){this._accessToken=e}getAccessToken(){return this._accessToken}setRefreshToken(e){this._refreshToken=e}getRefreshToken(){return this._refreshToken}clearTokens(){this._accessToken=null,this._refreshToken=null}isAuthenticated(){return null!==this._accessToken}async getHeaders(e=!1){const t=e?this._refreshToken:this._accessToken,s={"Content-Type":"application/json","X-API-Key":this.config.apiKey};return t&&(s.Authorization=`Bearer ${t}`),s}getPublicHeaders(){return{"Content-Type":"application/json","X-API-Key":this.config.apiKey}}async get(e,t){const s=await this.getHeaders();return(await this.axiosInstance.get(e,{...t,headers:{...s,...t?.headers}})).data}async post(e,t,s){const i=await this.getHeaders();return(await this.axiosInstance.post(e,t,{...s,headers:{...i,...s?.headers}})).data}async put(e,t,s){const i=await this.getHeaders();return(await this.axiosInstance.put(e,t,{...s,headers:{...i,...s?.headers}})).data}async patch(e,t,s){const i=await this.getHeaders();return(await this.axiosInstance.patch(e,t,{...s,headers:{...i,...s?.headers}})).data}async delete(e,t){const s=await this.getHeaders();return(await this.axiosInstance.delete(e,{...t,headers:{...s,...t?.headers}})).data}handleError(e){if(e.response){const{status:t,data:s}=e.response;return s&&"object"==typeof s?{error:s.error||"RequestError",message:s.message||s.description||"Something went wrong",statusCode:t,success:!1}:{error:"RequestError",message:`Request failed with status ${t}`,statusCode:t,success:!1}}return"Network Error"===e.message?{error:"NetworkError",message:"Network connection failed",statusCode:500,success:!1}:{error:"RequestError",message:e.message||"Unknown error occurred",statusCode:500,success:!1}}buildProjectUrl(e=""){const t=this.config.projectId;if(!t||"default"===t)throw new Error("Project ID is required");return`/project/${t}${e}`}buildOrgUrl(e=""){const t=this.config.organizationId||this.config.projectId;if(!t)throw new Error("Organization ID is required");return`/${t}${e}`}buildQueryString(e){const t=new URLSearchParams;Object.entries(e).forEach(([e,s])=>{null!=s&&("object"==typeof s?t.append(e,JSON.stringify(s)):t.append(e,String(s)))});const s=t.toString();return s?`?${s}`:""}}class p{constructor(e){this.config={apiEndpoint:e.apiEndpoint.replace(/\/$/,""),apiKey:e.apiKey,projectId:e.projectId,organizationId:e.organizationId},this._baseService=d.getInstance(this.config.apiKey,this.config.projectId,this.config.apiEndpoint),this._auth=new t(this._baseService),this._projects=new s(this._baseService),this._collections=new r(this._baseService),this._storage=new a(this._baseService),this._flows=new n(this._baseService),this._templates=new o(this._baseService),this._functions=new c(this._baseService),this._buildxObjects=new l(this._baseService),this._apiKeys=new u(this._baseService)}getConfig(){return{...this.config}}updateConfig(e){this.config={...this.config,...e},this._baseService.updateConfig(this.config)}auth(){return this._auth}projects(){return this._projects}collections(){return this._collections}storage(){return this._storage}flows(){return this._flows}templates(){return this._templates}functions(){return this._functions}buildxObjects(){return this._buildxObjects}apiKeys(){return this._apiKeys}}export{u as ApiKeys,t as Auth,p as Buildx,l as BuildxObjects,r as Collections,n as Flows,c as Functions,s as Projects,a as Storage,o as Templates,p as default};
|
|
2
|
+
//# sourceMappingURL=index.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/services/Auth.ts","../src/services/Projects.ts","../src/services/Collections.ts","../src/services/Storage.ts","../src/services/Flows.ts","../src/services/Templates.ts","../src/services/Functions.ts","../src/services/BuildxObjects.ts","../src/services/ApiKeys.ts","../src/services/BaseService.ts","../src/Buildx.ts"],"sourcesContent":["import { BaseService } from \"./BaseService\";\nimport {\n\tAuthUser,\n\tAuthResponse,\n\tLoginCredentials,\n\tGoogleCredentials,\n\tEotpRequest,\n\tEotpVerify,\n\tPasswordResetRequest,\n\tPasswordResetPayload,\n\tChangePasswordRequest,\n\tErrorResponse,\n\tSuccessResponse\n} from \"../types/index\";\n\n/**\n * Authentication service for Buildx\n * Handles user authentication, login, signup, and user management\n * \n * @example\n * ```typescript\n * const auth = buildx.auth();\n * \n * // Login with username and password\n * const result = await auth.login({ username: 'user', password: 'pass' });\n * \n * // Get current user\n * const user = await auth.getCurrentUser();\n * \n * // Sign up new user\n * const newUser = await auth.signup({ username: 'newuser', password: 'pass' });\n * ```\n */\nexport class Auth {\n\tprivate baseService: BaseService;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\t/**\n\t * Set the access token\n\t */\n\tsetAccessToken(token: string | null): void {\n\t\tthis.baseService.setAccessToken(token);\n\t}\n\n\t/**\n\t * Get the access token\n\t */\n\tgetAccessToken(): string | null {\n\t\treturn this.baseService.getAccessToken();\n\t}\n\n\t/**\n\t * Set the refresh token\n\t */\n\tsetRefreshToken(token: string | null): void {\n\t\tthis.baseService.setRefreshToken(token);\n\t}\n\n\t/**\n\t * Get the refresh token\n\t */\n\tgetRefreshToken(): string | null {\n\t\treturn this.baseService.getRefreshToken();\n\t}\n\n\t/**\n\t * Clear all stored tokens\n\t */\n\tclearTokens(): void {\n\t\tthis.baseService.clearTokens();\n\t}\n\n\t/**\n\t * Check if user is authenticated\n\t */\n\tisAuthenticated(): boolean {\n\t\treturn this.baseService.isAuthenticated();\n\t}\n\n\t/**\n\t * Store tokens from authentication response\n\t */\n\tprivate storeTokens(response: AuthResponse | AuthUser): void {\n\t\tif (\"access_token\" in response && response.access_token) {\n\t\t\tthis.baseService.setAccessToken(response.access_token);\n\t\t}\n\t\tif (\"refresh_token\" in response && response.refresh_token) {\n\t\t\tthis.baseService.setRefreshToken(response.refresh_token);\n\t\t}\n\t}\n\n\t/**\n\t * Check if response is an error response\n\t */\n\tprivate isErrorResponse(response: any): response is ErrorResponse {\n\t\treturn response && typeof response === \"object\" && \"success\" in response && response.success === false;\n\t}\n\n\tprivate hasProjectScope(): boolean {\n\t\tconst projectId = this.baseService.config.projectId;\n\t\treturn !!projectId && projectId !== \"default\";\n\t}\n\n\t/**\n\t * Login with username and password\n\t */\n\tasync login(credentials: LoginCredentials): Promise<AuthUser | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/auth/login\");\n\t\tconst response = await this.baseService.post<AuthResponse | AuthUser | ErrorResponse>(url, credentials);\n\n\t\t// Check if it's an error response\n\t\tif (this.isErrorResponse(response)) {\n\t\t\treturn response;\n\t\t}\n\n\t\t// Store tokens if they exist in the response\n\t\tthis.storeTokens(response as AuthResponse | AuthUser);\n\t\treturn response as AuthUser;\n\t}\n\n\t/**\n\t * Login with Google credentials\n\t */\n\tasync loginWithGoogle(credentials: GoogleCredentials): Promise<AuthUser | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/auth/google\");\n\t\tconst response = await this.baseService.post<AuthResponse | AuthUser | ErrorResponse>(url, credentials);\n\n\t\t// Check if it's an error response\n\t\tif (this.isErrorResponse(response)) {\n\t\t\treturn response;\n\t\t}\n\n\t\t// Store tokens if they exist in the response\n\t\tthis.storeTokens(response as AuthResponse | AuthUser);\n\t\treturn response as AuthUser;\n\t}\n\n\t/**\n\t * Sign up a new user\n\t */\n\tasync signup(credentials: LoginCredentials): Promise<AuthUser | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/auth/signup\");\n\t\tconst response = await this.baseService.post<AuthResponse | AuthUser | ErrorResponse>(url, credentials);\n\n\t\t// Check if it's an error response\n\t\tif (this.isErrorResponse(response)) {\n\t\t\treturn response;\n\t\t}\n\n\t\t// Store tokens if they exist in the response\n\t\tthis.storeTokens(response as AuthResponse | AuthUser);\n\t\treturn response as AuthUser;\n\t}\n\n\t/**\n\t * Request email OTP for authentication\n\t */\n\tasync requestEotp(request: EotpRequest): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/auth/eotp/auth/request\");\n\t\treturn await this.baseService.post(url, request);\n\t}\n\n\t/**\n\t * Request OTP for login (alias of requestEotp)\n\t */\n\tasync requestEotpAuth(request: EotpRequest): Promise<SuccessResponse | ErrorResponse> {\n\t\treturn this.requestEotp(request);\n\t}\n\n\t/**\n\t * Request OTP for login (alias of requestEotp)\n\t */\n\tasync requestOtpLogin(request: EotpRequest): Promise<SuccessResponse | ErrorResponse> {\n\t\treturn this.requestEotp(request);\n\t}\n\n\t/**\n\t * Verify email OTP\n\t */\n\tasync verifyEotp(verify: EotpVerify): Promise<AuthUser | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/auth/eotp/auth/verify\");\n\t\tconst response = await this.baseService.post<AuthResponse | AuthUser | ErrorResponse>(url, verify);\n\n\t\t// Check if it's an error response\n\t\tif (this.isErrorResponse(response)) {\n\t\t\treturn response;\n\t\t}\n\n\t\t// Store tokens if they exist in the response\n\t\tthis.storeTokens(response as AuthResponse | AuthUser);\n\t\treturn response as AuthUser;\n\t}\n\n\t/**\n\t * Verify OTP for login (alias of verifyEotp)\n\t */\n\tasync verifyEotpAuth(verify: EotpVerify): Promise<AuthUser | ErrorResponse> {\n\t\treturn this.verifyEotp(verify);\n\t}\n\n\t/**\n\t * Verify OTP for login (alias of verifyEotp)\n\t */\n\tasync verifyOtpLogin(verify: EotpVerify): Promise<AuthUser | ErrorResponse> {\n\t\treturn this.verifyEotp(verify);\n\t}\n\n\t/**\n\t * Get current authenticated user\n\t */\n\tasync getCurrentUser(): Promise<AuthUser | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/auth/me\");\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Refresh authentication token\n\t */\n\tasync refreshToken(): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/auth/token\");\n\t\tconst response = await this.baseService.post<AuthResponse | SuccessResponse | ErrorResponse>(url, {});\n\n\t\t// Check if it's an error response\n\t\tif (this.isErrorResponse(response)) {\n\t\t\treturn response;\n\t\t}\n\n\t\t// Store tokens if they exist in the response\n\t\tif (\"access_token\" in response && response.access_token) {\n\t\t\tthis.storeTokens(response as AuthResponse);\n\t\t}\n\n\t\treturn response as SuccessResponse;\n\t}\n\n\t/**\n\t * Update user password\n\t */\n\tasync updatePassword(password: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/auth/password/update\");\n\t\treturn await this.baseService.post(url, { password });\n\t}\n\n\t/**\n\t * Change current user password\n\t */\n\tasync changePassword(request: ChangePasswordRequest | string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/auth/password/update\");\n\t\tif (typeof request === \"string\") {\n\t\t\treturn await this.baseService.post(url, { password: request });\n\t\t}\n\n\t\tconst password = request.password ?? request.newPassword ?? request.new_password;\n\t\tconst payload: Record<string, any> = { ...request };\n\t\tif (password) {\n\t\t\tpayload.password = password;\n\t\t}\n\t\tif (request.currentPassword && !payload.current_password) {\n\t\t\tpayload.current_password = request.currentPassword;\n\t\t}\n\t\tif (request.newPassword && !payload.new_password) {\n\t\t\tpayload.new_password = request.newPassword;\n\t\t}\n\n\t\treturn await this.baseService.post(url, payload);\n\t}\n\n\t/**\n\t * Admin update user password\n\t */\n\tasync adminUpdatePassword(userId: string, password: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/auth/password/update\");\n\t\treturn await this.baseService.post(url, { user_id: userId, password });\n\t}\n\n\t/**\n\t * Request password reset email\n\t */\n\tasync requestPasswordReset(request: PasswordResetRequest): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.hasProjectScope()\n\t\t\t? this.baseService.buildProjectUrl(\"/auth/password/reset/request\")\n\t\t\t: \"/auth/password/reset/request\";\n\t\treturn await this.baseService.post(url, request);\n\t}\n\n\t/**\n\t * Reset password with token\n\t */\n\tasync resetPassword(payload: PasswordResetPayload): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.hasProjectScope()\n\t\t\t? this.baseService.buildProjectUrl(\"/auth/password/reset\")\n\t\t\t: \"/auth/password/reset\";\n\t\treturn await this.baseService.post(url, payload);\n\t}\n\n\t/**\n\t * Update push notification token\n\t */\n\tasync updatePushToken(token: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/users/push-tokens\");\n\t\treturn await this.baseService.post(url, { token });\n\t}\n\n\t/**\n\t * List all users (admin only)\n\t */\n\tasync listUsers(organizationId?: string): Promise<AuthUser[] | ErrorResponse> {\n\t\tconst url = organizationId\n\t\t\t? this.baseService.buildOrgUrl(\"/auth/users\")\n\t\t\t: \"/auth/users\";\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Lookup users (for autocomplete/search)\n\t */\n\tasync lookupUsers(organizationId?: string): Promise<AuthUser[] | ErrorResponse> {\n\t\tconst url = organizationId\n\t\t\t? this.baseService.buildOrgUrl(\"/auth/users/lookup\")\n\t\t\t: \"/auth/users/lookup\";\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Get user by ID\n\t */\n\tasync getUser(userId: string, organizationId?: string): Promise<AuthUser | ErrorResponse> {\n\t\tconst url = organizationId\n\t\t\t? this.baseService.buildOrgUrl(`/auth/user/${userId}`)\n\t\t\t: `/auth/user/${userId}`;\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Delete user (admin only)\n\t */\n\tasync deleteUser(userId: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/auth/user/${userId}/delete`);\n\t\treturn await this.baseService.post(url, {});\n\t}\n} \n","import { BaseService } from \"./BaseService\";\nimport { Project, ErrorResponse, SuccessResponse } from \"../types/index\";\n\n/**\n * Projects service for Buildx\n * Handles project management operations\n * \n * @example\n * ```typescript\n * const projects = buildx.projects();\n * \n * // List all projects\n * const projectList = await projects.list();\n * \n * // Create a new project\n * const newProject = await projects.create({\n * name: 'My Project',\n * description: 'A new project'\n * });\n * \n * // Get project by ID\n * const project = await projects.get('project-id');\n * ```\n */\nexport class Projects {\n\tprivate baseService: BaseService;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\t/**\n\t * List all projects\n\t */\n\tasync list(): Promise<Project[] | ErrorResponse> {\n\t\treturn await this.baseService.get(\"/projects\");\n\t}\n\n\t/**\n\t * Get project by ID\n\t */\n\tasync get(projectId: string): Promise<Project | ErrorResponse> {\n\t\treturn await this.baseService.get(`/project/${projectId}`);\n\t}\n\n\t/**\n\t * Create a new project\n\t */\n\tasync create(projectData: Partial<Project>): Promise<Project | ErrorResponse> {\n\t\treturn await this.baseService.post(\"/projects\", projectData);\n\t}\n\n\t/**\n\t * Update project\n\t */\n\tasync update(projectId: string, projectData: Partial<Project>): Promise<Project | ErrorResponse> {\n\t\treturn await this.baseService.patch(`/project/${projectId}`, projectData);\n\t}\n\n\t/**\n\t * Delete project\n\t */\n\tasync deleteById(projectId: string): Promise<SuccessResponse | ErrorResponse> {\n\t\treturn await this.baseService.delete(`/project/${projectId}`);\n\t}\n\n\t/**\n\t * Backup project\n\t */\n\tasync backup(projectId: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst response = await this.baseService.axiosInstance.get(`/project/${projectId}/backup`, {\n\t\t\tresponseType: \"blob\",\n\t\t\theaders: await this.baseService.getHeaders(),\n\t\t});\n\n\t\t// Create download link for browser\n\t\tif (typeof window !== \"undefined\") {\n\t\t\tconst url = window.URL.createObjectURL(response.data);\n\t\t\tconst link = document.createElement(\"a\");\n\t\t\tlink.href = url;\n\t\t\tlink.setAttribute(\"download\", `backup_${projectId}.buildx`);\n\t\t\tdocument.body.appendChild(link);\n\t\t\tlink.click();\n\t\t\tdocument.body.removeChild(link);\n\t\t\twindow.URL.revokeObjectURL(url);\n\t\t}\n\n\t\treturn { success: true, message: \"Backup downloaded successfully\" };\n\t}\n\n\t/**\n\t * Restore project from backup\n\t */\n\tasync restore(projectId: string, file: File): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst formData = new FormData();\n\t\tformData.append(\"new_project_id\", projectId);\n\t\tformData.append(\"backup_file\", file);\n\n\t\tconst headers = { ...(await this.baseService.getHeaders()), \"Content-Type\": \"multipart/form-data\" };\n\t\treturn await this.baseService.post(\"/project/import\", formData, { headers });\n\n\t}\n} ","import { BaseService } from \"./BaseService\";\nimport {\n\tCollection,\n\tDocument,\n\tQueryOptions,\n\tErrorResponse,\n\tSuccessResponse,\n\tImportMapping,\n\tPaginatedResult,\n\tRelationHydrationConfig,\n\tCollectionRealtimeHandlers,\n\tCollectionRealtimeSubscribeOptions,\n\tCollectionRealtimeSubscription,\n\tCollectionRealtimeEvent,\n\tPaginationWebSocketLike,\n} from \"../types/index\";\n\ntype UpdateDocumentOptions = {\n\tupdateOnly?: boolean;\n};\n\ntype CollectionWsResponse = {\n\tid?: string;\n\tok?: boolean;\n\tresult?: any;\n\terror?: string;\n};\n\nclass CollectionWsClient {\n\tprivate socket: PaginationWebSocketLike | null = null;\n\tprivate connectPromise: Promise<void> | null = null;\n\tprivate requestCounter = 0;\n\tprivate readonly pending = new Map<string, { resolve: (value: any) => void; reject: (error: any) => void; timeout: ReturnType<typeof setTimeout> }>();\n\n\tconstructor(\n\t\tprivate readonly baseService: BaseService,\n\t\tprivate readonly collectionId: string,\n\t\tprivate readonly wsFactory?: (url: string) => PaginationWebSocketLike\n\t) { }\n\n\tasync query(action: \"queryWithPagination\" | \"queryRaw\", payload: Record<string, any>, timeoutMs = 30000): Promise<any> {\n\t\tawait this.ensureConnected();\n\t\tif (!this.socket) {\n\t\t\tthrow new Error(\"WebSocket connection is unavailable\");\n\t\t}\n\n\t\tconst id = `${Date.now()}_${++this.requestCounter}`;\n\t\tconst resultPromise = new Promise<any>((resolve, reject) => {\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\tthis.pending.delete(id);\n\t\t\t\treject(new Error(\"WebSocket pagination timeout\"));\n\t\t\t}, timeoutMs);\n\t\t\tthis.pending.set(id, { resolve, reject, timeout });\n\t\t});\n\n\t\tthis.socket.send(JSON.stringify({\n\t\t\tid,\n\t\t\taction,\n\t\t\tpayload,\n\t\t}));\n\n\t\treturn resultPromise;\n\t}\n\n\tclose() {\n\t\tif (!this.socket) return;\n\t\ttry {\n\t\t\tthis.socket.close();\n\t\t} catch (_error) {\n\t\t\t// noop\n\t\t}\n\t\tthis.socket = null;\n\t\tthis.connectPromise = null;\n\t\tfor (const [, entry] of this.pending.entries()) {\n\t\t\tclearTimeout(entry.timeout);\n\t\t\tentry.reject(new Error(\"WebSocket closed\"));\n\t\t}\n\t\tthis.pending.clear();\n\t}\n\n\tprivate async ensureConnected() {\n\t\tif (this.socket && this.isSocketOpen(this.socket)) {\n\t\t\treturn;\n\t\t}\n\t\tif (this.connectPromise) {\n\t\t\treturn this.connectPromise;\n\t\t}\n\n\t\tthis.connectPromise = new Promise<void>((resolve, reject) => {\n\t\t\tconst GlobalWebSocket = (globalThis as any).WebSocket;\n\t\t\tif (!this.wsFactory && !GlobalWebSocket) {\n\t\t\t\treject(new Error(\"WebSocket is not available in this runtime\"));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst socket = this.wsFactory\n\t\t\t\t? this.wsFactory(this.buildSocketUrl())\n\t\t\t\t: new GlobalWebSocket(this.buildSocketUrl());\n\t\t\tthis.socket = socket;\n\t\t\tlet settled = false;\n\n\t\t\tconst onOpen = () => {\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tresolve();\n\t\t\t};\n\t\t\tconst onError = (error: any) => {\n\t\t\t\tif (!settled) {\n\t\t\t\t\tsettled = true;\n\t\t\t\t\treject(error);\n\t\t\t\t}\n\t\t\t\tthis.close();\n\t\t\t};\n\t\t\tconst onClose = () => {\n\t\t\t\tif (!settled) {\n\t\t\t\t\tsettled = true;\n\t\t\t\t\treject(new Error(\"WebSocket closed before connection is ready\"));\n\t\t\t\t}\n\t\t\t\tthis.close();\n\t\t\t};\n\t\t\tconst onMessage = (event: any) => {\n\t\t\t\tlet response: CollectionWsResponse;\n\t\t\t\ttry {\n\t\t\t\t\tresponse = JSON.parse(event?.data || \"{}\");\n\t\t\t\t} catch (_error) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst id = response?.id;\n\t\t\t\tif (!id) return;\n\t\t\t\tconst pending = this.pending.get(id);\n\t\t\t\tif (!pending) return;\n\t\t\t\tclearTimeout(pending.timeout);\n\t\t\t\tthis.pending.delete(id);\n\n\t\t\t\tif (response.ok && response.result) {\n\t\t\t\t\tpending.resolve(response.result);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tpending.reject(new Error(response.error || \"WebSocket pagination query failed\"));\n\t\t\t};\n\n\t\t\tif (socket.addEventListener) {\n\t\t\t\tsocket.addEventListener(\"open\", onOpen);\n\t\t\t\tsocket.addEventListener(\"error\", onError);\n\t\t\t\tsocket.addEventListener(\"close\", onClose);\n\t\t\t\tsocket.addEventListener(\"message\", onMessage);\n\t\t\t} else {\n\t\t\t\tsocket.onopen = onOpen;\n\t\t\t\tsocket.onerror = onError;\n\t\t\t\tsocket.onclose = onClose;\n\t\t\t\tsocket.onmessage = onMessage;\n\t\t\t}\n\t\t}).finally(() => {\n\t\t\tthis.connectPromise = null;\n\t\t});\n\n\t\treturn this.connectPromise;\n\t}\n\n\tprivate isSocketOpen(socket: PaginationWebSocketLike): boolean {\n\t\tconst openState = (globalThis as any).WebSocket?.OPEN ?? 1;\n\t\treturn socket.readyState === openState;\n\t}\n\n\tprivate buildSocketUrl() {\n\t\tconst endpoint = this.baseService.config.apiEndpoint.replace(/\\/$/, \"\");\n\t\tconst wsEndpoint = endpoint.replace(/^http:/i, \"ws:\").replace(/^https:/i, \"wss:\");\n\t\tconst path = this.baseService.buildProjectUrl(`/${this.collectionId}/data/pagination/ws`);\n\n\t\tconst params = new URLSearchParams();\n\t\tconst apiKey = this.baseService.config.apiKey;\n\t\tif (apiKey) params.set(\"api_key\", apiKey);\n\t\tconst token = this.baseService.getAccessToken();\n\t\tif (token) params.set(\"token\", token);\n\n\t\tconst qs = params.toString();\n\t\treturn `${wsEndpoint}${path}${qs ? `?${qs}` : \"\"}`;\n\t}\n}\n\n/**\n * Collections service for Buildx\n * Handles collection management, documents, and queries\n * \n * @example\n * ```typescript\n * const collections = buildx.collections();\n * \n * // Get all collections\n * const collectionsList = await collections.list();\n * \n * // Get collection schema\n * const schema = await collections.getSchema('collection-id');\n * \n * // Query documents\n * const docs = await collections.query('collection-id', {\n * filter: { status: 'active' },\n * limit: 10\n * });\n * ```\n */\nexport class Collections {\n\tprivate baseService: BaseService;\n\tprivate static readonly RELATION_QUERY_CHUNK_SIZE = 200;\n\tprivate collectionWsClient: CollectionWsClient | null = null;\n\tprivate collectionWsCollectionId: string | null = null;\n\tprivate collectionWsDisabledUntil = 0;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\t/**\n\t * List all collections in a project\n\t */\n\tasync list(withStats = false, withBuildx = false): Promise<Collection[] | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/collections\");\n\t\tconst queryParams: Record<string, any> = {};\n\n\t\tif (withStats) {\n\t\t\tqueryParams.with_stats = true;\n\t\t}\n\n\t\tconst queryString = this.baseService.buildQueryString(queryParams);\n\t\tconst fullUrl = queryString ? `${url}${queryString}` : url;\n\n\t\tconst collections = await this.baseService.get(fullUrl);\n\n\t\tif (Array.isArray(collections) && !withBuildx) {\n\t\t\treturn collections.filter(collection =>\n\t\t\t\tcollection.collection_id && !collection.collection_id.startsWith(\"buildx_\")\n\t\t\t);\n\t\t}\n\n\t\treturn collections;\n\t}\n\n\t/**\n\t * Get collection schema\n\t */\n\tasync getSchema(collectionId: string, depth = 1): Promise<Collection | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/collection/${collectionId}`);\n\t\tconst queryParams: Record<string, any> = {};\n\n\t\tif (depth > 1) {\n\t\t\tqueryParams.depth = depth;\n\t\t}\n\n\t\tconst queryString = this.baseService.buildQueryString(queryParams);\n\t\tconst fullUrl = queryString ? `${url}${queryString}` : url;\n\n\t\treturn await this.baseService.get(fullUrl);\n\t}\n\n\t/**\n\t * Create or update collection\n\t */\n\tasync set(collectionData: Partial<Collection>): Promise<Collection | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/collections\");\n\t\treturn await this.baseService.post(url, collectionData);\n\t}\n\n\t/**\n\t * Delete collection\n\t */\n\tasync deleteCollection(collectionId: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/collections/${collectionId}`);\n\t\treturn await this.baseService.delete(url);\n\t}\n\n\t/**\n\t * Query documents in a collection\n\t */\n\tasync query(collectionId: string, options?: QueryOptions): Promise<Document[] | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}`);\n\t\tconst noPopulate = options?.noPopulate ?? (!!options?.relations && options.relations.length > 0);\n\t\tconst queryParams = this.buildQueryParams({\n\t\t\t...options,\n\t\t\toptions: noPopulate\n\t\t\t\t? {\n\t\t\t\t\t...(options?.options || {}),\n\t\t\t\t\tnoPopulate: true,\n\t\t\t\t}\n\t\t\t\t: options?.options,\n\t\t});\n\t\tconst queryString = this.baseService.buildQueryString(queryParams);\n\t\tconst fullUrl = queryString ? `${url}${queryString}` : url;\n\n\t\tconst result = await this.baseService.get(fullUrl);\n\t\tif (!Array.isArray(result)) {\n\t\t\treturn result;\n\t\t}\n\n\t\tif (!options?.relations || options.relations.length === 0) {\n\t\t\treturn result;\n\t\t}\n\n\t\tconst preferWs = (options?.paginationTransport || \"auto\") !== \"http\";\n\t\treturn await this.hydrateRelations(result, options.relations, options.relationSelect, {\n\t\t\tpreferWs,\n\t\t\twsFactory: options.wsFactory,\n\t\t});\n\t}\n\n\t/**\n\t * Query documents without server-side populate.\n\t */\n\tasync queryRaw(collectionId: string, options?: QueryOptions): Promise<Document[] | ErrorResponse> {\n\t\tconst normalizedOptions: QueryOptions = {\n\t\t\t...options,\n\t\t\toptions: {\n\t\t\t\t...(options?.options || {}),\n\t\t\t\tnoPopulate: true,\n\t\t\t},\n\t\t};\n\t\tconst transport = normalizedOptions.paginationTransport || \"http\";\n\t\tif (transport !== \"http\" && Date.now() >= this.collectionWsDisabledUntil) {\n\t\t\ttry {\n\t\t\t\treturn await this.queryRawViaWs(collectionId, normalizedOptions);\n\t\t\t} catch (error: any) {\n\t\t\t\tconsole.warn(\"[buildx-sdk] WS raw query failed, fallback to HTTP\", error?.message || error);\n\t\t\t\tthis.collectionWsDisabledUntil = Date.now() + 30000;\n\t\t\t\tthis.resetCollectionWsClient();\n\t\t\t}\n\t\t}\n\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/raw`);\n\t\tconst queryParams = this.buildQueryParams(normalizedOptions);\n\t\tconst queryString = this.baseService.buildQueryString(queryParams);\n\t\tconst fullUrl = queryString ? `${url}${queryString}` : url;\n\n\t\treturn await this.baseService.get(fullUrl);\n\t}\n\n\t/**\n\t * Query documents with pagination metadata.\n\t */\n\tasync queryWithPagination(collectionId: string, options?: QueryOptions): Promise<PaginatedResult<Document> | ErrorResponse> {\n\t\tconst noPopulate = options?.noPopulate ?? (!!options?.relations && options.relations.length > 0);\n\t\tconst normalizedOptions: QueryOptions = {\n\t\t\t...options,\n\t\t\toptions: noPopulate\n\t\t\t\t? {\n\t\t\t\t\t...(options?.options || {}),\n\t\t\t\t\tnoPopulate: true,\n\t\t\t\t}\n\t\t\t\t: options?.options,\n\t\t};\n\n\t\tconst transport = normalizedOptions.paginationTransport || \"auto\";\n\t\tlet result: PaginatedResult<Document> | ErrorResponse;\n\t\tconst shouldTryWs = transport !== \"http\" && Date.now() >= this.collectionWsDisabledUntil;\n\t\tif (shouldTryWs) {\n\t\t\ttry {\n\t\t\t\tresult = await this.queryWithPaginationViaWs(collectionId, normalizedOptions);\n\t\t\t}\n\t\t\tcatch (error: any) {\n\t\t\t\t// Retry on HTTP endpoint for compatibility and temporarily disable WS attempts.\n\t\t\t\tconsole.warn(\"[buildx-sdk] WS pagination failed, fallback to HTTP\", error?.message || error);\n\t\t\t\tthis.collectionWsDisabledUntil = Date.now() + 30000;\n\t\t\t\tthis.resetCollectionWsClient();\n\t\t\t\tresult = await this.queryWithPaginationViaHttp(collectionId, normalizedOptions);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tresult = await this.queryWithPaginationViaHttp(collectionId, normalizedOptions);\n\t\t}\n\n\t\tif (!result || (result as ErrorResponse).success === false) {\n\t\t\treturn result as ErrorResponse;\n\t\t}\n\t\tif (!normalizedOptions?.relations || normalizedOptions.relations.length === 0) {\n\t\t\treturn result as PaginatedResult<Document>;\n\t\t}\n\n\t\tconst preferWs = transport !== \"http\";\n\t\tconst hydratedRows = await this.hydrateRelations((result as PaginatedResult<Document>).data || [], normalizedOptions.relations, normalizedOptions.relationSelect, {\n\t\t\tpreferWs,\n\t\t\twsFactory: normalizedOptions.wsFactory,\n\t\t});\n\t\tif (!Array.isArray(hydratedRows)) {\n\t\t\treturn hydratedRows;\n\t\t}\n\n\t\treturn {\n\t\t\t...(result as PaginatedResult<Document>),\n\t\t\tdata: hydratedRows,\n\t\t};\n\t}\n\n\tprivate async queryWithPaginationViaHttp(collectionId: string, options?: QueryOptions): Promise<PaginatedResult<Document> | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/data/pagination`);\n\t\tconst queryParams = this.buildQueryParams(options);\n\t\tconst queryString = this.baseService.buildQueryString(queryParams);\n\t\tconst fullUrl = queryString ? `${url}${queryString}` : url;\n\t\tconst result = await this.baseService.get(fullUrl);\n\t\tif (!result || (result as ErrorResponse).success === false) {\n\t\t\treturn result as ErrorResponse;\n\t\t}\n\t\treturn {\n\t\t\t...(result as PaginatedResult<Document>),\n\t\t\tmeta: {\n\t\t\t\t...((result as PaginatedResult<Document>).meta || {}),\n\t\t\t\ttransport: \"http\",\n\t\t\t},\n\t\t} as PaginatedResult<Document>;\n\t}\n\n\tprivate async queryWithPaginationViaWs(collectionId: string, options?: QueryOptions): Promise<PaginatedResult<Document> | ErrorResponse> {\n\t\tconst payload = this.buildQueryParams(options);\n\t\tconst client = this.getOrCreateCollectionWsClient(collectionId, options?.wsFactory);\n\t\tconst result = await client.query(\"queryWithPagination\", payload);\n\t\tif (!result || (result as ErrorResponse).success === false) {\n\t\t\treturn result as ErrorResponse;\n\t\t}\n\t\treturn {\n\t\t\t...(result as PaginatedResult<Document>),\n\t\t\tmeta: {\n\t\t\t\t...((result as PaginatedResult<Document>).meta || {}),\n\t\t\t\ttransport: \"ws\",\n\t\t\t},\n\t\t} as PaginatedResult<Document>;\n\t}\n\n\tprivate async queryRawViaWs(collectionId: string, options?: QueryOptions): Promise<Document[] | ErrorResponse> {\n\t\tconst payload = this.buildQueryParams(options);\n\t\tconst client = this.getOrCreateCollectionWsClient(collectionId, options?.wsFactory);\n\t\tconst result = await client.query(\"queryRaw\", payload);\n\t\tif (!result || (result as ErrorResponse).success === false) {\n\t\t\treturn result as ErrorResponse;\n\t\t}\n\t\treturn Array.isArray(result) ? result as Document[] : [];\n\t}\n\n\tprivate getOrCreateCollectionWsClient(collectionId: string, wsFactory?: (url: string) => PaginationWebSocketLike) {\n\t\tif (!this.collectionWsClient || this.collectionWsCollectionId !== collectionId) {\n\t\t\tthis.resetCollectionWsClient();\n\t\t\tthis.collectionWsClient = new CollectionWsClient(this.baseService, collectionId, wsFactory);\n\t\t\tthis.collectionWsCollectionId = collectionId;\n\t\t}\n\t\treturn this.collectionWsClient;\n\t}\n\n\tprivate resetCollectionWsClient() {\n\t\tif (this.collectionWsClient) {\n\t\t\tthis.collectionWsClient.close();\n\t\t}\n\t\tthis.collectionWsClient = null;\n\t\tthis.collectionWsCollectionId = null;\n\t}\n\n\t/**\n\t * Subscribe realtime data events for a collection via SSE endpoint.\n\t * Works in browser/EventSource-compatible runtimes.\n\t */\n\tsubscribeRealtime(\n\t\tcollectionId: string,\n\t\thandlers: CollectionRealtimeHandlers,\n\t\toptions?: CollectionRealtimeSubscribeOptions\n\t): CollectionRealtimeSubscription {\n\t\tconst endpoint = this.baseService.config.apiEndpoint.replace(/\\/$/, \"\");\n\t\tconst path = this.baseService.buildProjectUrl(`/${collectionId}/realtime/stream`);\n\n\t\tconst params = new URLSearchParams();\n\t\tconst apiKey = options?.apiKey || this.baseService.config.apiKey;\n\t\tif (apiKey) params.set(\"api_key\", apiKey);\n\t\tconst token = options?.token || this.baseService.getAccessToken();\n\t\tif (token) params.set(\"token\", token);\n\t\tif (options?.lastEventId) params.set(\"lastEventId\", options.lastEventId);\n\n\t\tconst qs = params.toString();\n\t\tconst url = `${endpoint}${path}${qs ? `?${qs}` : \"\"}`;\n\n\t\tconst factory = options?.eventSourceFactory || (globalThis as any).EventSource;\n\t\tif (!factory) {\n\t\t\tthrow new Error(\"EventSource is not available in this runtime. Provide eventSourceFactory in options.\");\n\t\t}\n\n\t\tconst source = factory(url);\n\t\tlet hasConnected = false;\n\t\tconst emitConnected = () => {\n\t\t\tif (hasConnected) return;\n\t\t\thasConnected = true;\n\t\t\thandlers.onConnected?.();\n\t\t};\n\t\tconst emitEvent = (event: any) => {\n\t\t\ttry {\n\t\t\t\tconst data = JSON.parse(event.data) as CollectionRealtimeEvent;\n\t\t\t\thandlers.onEvent?.(data);\n\t\t\t}\n\t\t\tcatch (error) {\n\t\t\t\thandlers.onError?.(error);\n\t\t\t}\n\t\t};\n\n\t\tsource.onopen = () => {\n\t\t\temitConnected();\n\t\t};\n\t\tsource.onmessage = (event: any) => emitEvent(event);\n\t\tsource.onerror = (error: any) => {\n\t\t\thandlers.onError?.(error);\n\t\t};\n\t\tsource.addEventListener?.(\"connected\", () => {\n\t\t\temitConnected();\n\t\t});\n\t\tsource.addEventListener?.(\"collection:data\", (event: any) => {\n\t\t\temitEvent(event);\n\t\t});\n\n\t\treturn {\n\t\t\tclose: () => source.close(),\n\t\t};\n\t}\n\n\t/**\n\t * Get lookup data for a collection (for dropdowns/autocomplete)\n\t */\n\tasync lookup(collectionId: string, options?: QueryOptions): Promise<Array<{ value: string; label: string }> | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}`);\n\t\tconst queryParams: Record<string, any> = {};\n\n\t\tif (options) {\n\t\t\tif (options.filter) {\n\t\t\t\tqueryParams.filter = options.filter;\n\t\t\t}\n\t\t\tif (options.jsonFilter) {\n\t\t\t\tqueryParams.jsonFilter = options.jsonFilter;\n\t\t\t}\n\t\t\tif (options.projection) {\n\t\t\t\tqueryParams.projection = options.projection;\n\t\t\t}\n\t\t\tif (options.options) {\n\t\t\t\tqueryParams.options = options.options;\n\t\t\t}\n\t\t}\n\n\t\tconst queryString = this.baseService.buildQueryString(queryParams);\n\t\tconst fullUrl = queryString ? `${url}${queryString}` : url;\n\n\t\tconst result = await this.baseService.get(fullUrl);\n\n\t\tif (Array.isArray(result)) {\n\t\t\treturn result.map(row => ({\n\t\t\t\tvalue: row._id,\n\t\t\t\tlabel: row._display || row.label || row.title || row.name || row.username || row.description || \"\"\n\t\t\t}));\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tprivate buildQueryParams(options?: QueryOptions): Record<string, any> {\n\t\tconst queryParams: Record<string, any> = {};\n\t\tif (!options) return queryParams;\n\n\t\tconst searchQuery = options.q || (options as any).searchQuery;\n\t\tif (searchQuery) {\n\t\t\tqueryParams.q = searchQuery;\n\t\t}\n\t\tif (options.quick_filter_fields) {\n\t\t\tqueryParams.quick_filter_fields = options.quick_filter_fields;\n\t\t}\n\t\tif (options.filter) {\n\t\t\tqueryParams.filter = options.filter;\n\t\t}\n\t\tif (options.jsonFilter) {\n\t\t\tqueryParams.jsonFilter = options.jsonFilter;\n\t\t}\n\t\tif (options.select) {\n\t\t\tqueryParams.select = Array.isArray(options.select)\n\t\t\t\t? options.select.join(\",\")\n\t\t\t\t: options.select;\n\t\t}\n\t\tif (options.projection) {\n\t\t\tqueryParams.projection = options.projection;\n\t\t}\n\t\tif (options.options) {\n\t\t\tqueryParams.options = options.options;\n\t\t}\n\t\tif (options.sort) {\n\t\t\tqueryParams.sort = options.sort;\n\t\t}\n\t\tif (typeof options.limit === \"number\") {\n\t\t\tqueryParams.limit = options.limit;\n\t\t}\n\t\tif (typeof options.skip === \"number\" && options.skip > 0) {\n\t\t\tqueryParams.skip = options.skip;\n\t\t}\n\n\t\treturn queryParams;\n\t}\n\n\tprivate async hydrateRelations(\n\t\trows: Document[],\n\t\trelations: RelationHydrationConfig[],\n\t\trelationSelect?: string | string[],\n\t\toptions?: {\n\t\t\tpreferWs?: boolean;\n\t\t\twsFactory?: (url: string) => PaginationWebSocketLike;\n\t\t}\n\t): Promise<Document[] | ErrorResponse> {\n\t\tconst enhancedRows = rows.map((row) => ({ ...row }));\n\t\tconst defaultSelect = relationSelect || \"_id,_display,name,title,username\";\n\n\t\tconst groupedByCollection = relations.reduce((acc, relation) => {\n\t\t\tif (!acc[relation.collectionId]) {\n\t\t\t\tacc[relation.collectionId] = [];\n\t\t\t}\n\t\t\tacc[relation.collectionId].push(relation);\n\t\t\treturn acc;\n\t\t}, {} as Record<string, RelationHydrationConfig[]>);\n\n\t\tconst relationCache = new Map<string, Document>();\n\n\t\tfor (const [refCollectionId, configs] of Object.entries(groupedByCollection)) {\n\t\t\tconst ids = new Set<string>();\n\t\t\tfor (const row of enhancedRows) {\n\t\t\t\tfor (const config of configs) {\n\t\t\t\t\tconst value = row[config.field];\n\t\t\t\t\tif (!value) continue;\n\t\t\t\t\tif (Array.isArray(value)) {\n\t\t\t\t\t\tfor (const item of value) {\n\t\t\t\t\t\t\tif (typeof item === \"string\") ids.add(item);\n\t\t\t\t\t\t\telse if (item && typeof item === \"object\" && item._id) ids.add(item._id);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (typeof value === \"string\") {\n\t\t\t\t\t\tids.add(value);\n\t\t\t\t\t} else if (value && typeof value === \"object\" && value._id) {\n\t\t\t\t\t\tids.add(value._id);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst missingIds = Array.from(ids).filter((id) => !relationCache.has(`${refCollectionId}:${id}`));\n\t\t\tif (missingIds.length > 0) {\n\t\t\t\tconst chunkSize = Collections.RELATION_QUERY_CHUNK_SIZE;\n\t\t\t\tfor (let i = 0; i < missingIds.length; i += chunkSize) {\n\t\t\t\t\tconst idChunk = missingIds.slice(i, i + chunkSize);\n\t\t\t\t\tconst relatedDocs = await this.queryRaw(refCollectionId, {\n\t\t\t\t\t\tfilter: { _id: { $in: idChunk } },\n\t\t\t\t\t\tselect: defaultSelect,\n\t\t\t\t\t\tpaginationTransport: options?.preferWs ? \"auto\" : \"http\",\n\t\t\t\t\t\twsFactory: options?.wsFactory,\n\t\t\t\t\t});\n\t\t\t\t\tif (!Array.isArray(relatedDocs)) {\n\t\t\t\t\t\treturn relatedDocs;\n\t\t\t\t\t}\n\t\t\t\t\tfor (const doc of relatedDocs) {\n\t\t\t\t\t\tif (doc?._id) {\n\t\t\t\t\t\t\trelationCache.set(`${refCollectionId}:${doc._id}`, doc);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const row of enhancedRows) {\n\t\t\t\tfor (const config of configs) {\n\t\t\t\t\tconst value = row[config.field];\n\t\t\t\t\tif (!value) continue;\n\n\t\t\t\t\tif (Array.isArray(value)) {\n\t\t\t\t\t\trow[config.field] = value.map((item) => {\n\t\t\t\t\t\t\tconst id = typeof item === \"string\" ? item : item?._id;\n\t\t\t\t\t\t\tif (!id) return item;\n\t\t\t\t\t\t\treturn relationCache.get(`${refCollectionId}:${id}`) || item;\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst id = typeof value === \"string\" ? value : value?._id;\n\t\t\t\t\t\tif (!id) continue;\n\t\t\t\t\t\trow[config.field] = relationCache.get(`${refCollectionId}:${id}`) || value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn enhancedRows;\n\t}\n\n\t/**\t\t\n\t * Get single document by ID\n\t */\n\tasync getDocument(collectionId: string, documentId: string, populate?: string[]): Promise<Document | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/${documentId}`);\n\t\tconst queryParams: Record<string, any> = {};\n\n\t\tif (populate && populate.length > 0) {\n\t\t\tqueryParams.populate = populate.join(\",\");\n\t\t}\n\n\t\tconst queryString = this.baseService.buildQueryString(queryParams);\n\t\tconst fullUrl = queryString ? `${url}${queryString}` : url;\n\n\t\treturn await this.baseService.get(fullUrl);\n\t}\n\n\t/**\n\t * Create new document\n\t */\n\tasync createDocument(collectionId: string, data: any): Promise<Document | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}`);\n\t\treturn await this.baseService.post(url, data);\n\t}\n\n\t/**\n\t * Update document\n\t */\n\tasync updateDocument(collectionId: string, documentId: string, data: any): Promise<Document | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/${documentId}`);\n\t\treturn await this.baseService.patch(url, data);\n\t}\n\n\t/**\n\t * Update document with optional mode flags.\n\t */\n\tasync updateDocumentWithOptions(\n\t\tcollectionId: string,\n\t\tdocumentId: string,\n\t\tdata: any,\n\t\toptions?: UpdateDocumentOptions\n\t): Promise<Document | ErrorResponse> {\n\t\tconst baseUrl = this.baseService.buildProjectUrl(`/${collectionId}/${documentId}`);\n\t\tconst url = options?.updateOnly ? `${baseUrl}?mode=updateOnly` : baseUrl;\n\t\treturn await this.baseService.patch(url, data);\n\t}\n\n\t/**\n\t * Get document revisions\n\t */\n\tasync getDocumentRevisions(collectionId: string, documentId: string): Promise<Document[] | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/${documentId}/revisions`);\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Delete document\n\t */\n\tasync deleteDocument(collectionId: string, documentId: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/${documentId}`);\n\t\treturn await this.baseService.delete(url);\n\t}\n\n\t/**\n\t * Delete documents by filter\n\t */\n\tasync deleteByFilter(collectionId: string, filter: any): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/delete`);\n\t\treturn await this.baseService.post(url, { filter });\n\t}\n\n\t/**\n\t * Import data to collection\n\t */\n\tasync import(collectionId: string, file: File, mapping: ImportMapping): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst formData = new FormData();\n\t\tformData.append(\"mapping\", JSON.stringify(mapping));\n\t\tformData.append(\"file\", file);\n\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/import`);\n\t\tconst headers = { ...(await this.baseService.getHeaders()), \"Content-Type\": \"multipart/form-data\" };\n\n\t\treturn await this.baseService.post(url, formData, { headers });\n\t}\n\n\t/**\n\t * Get collection data types\n\t */\n\tasync getDataTypes(): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/collections/types\");\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Validate collection data\n\t */\n\tasync validate(collectionId: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/validate`);\n\t\treturn await this.baseService.post(url, null);\n\t}\n\n\t/**\n\t * Migrate collection data\n\t */\n\tasync migrate(collectionId: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/migrate`);\n\t\treturn await this.baseService.post(url, null);\n\t}\n} \n","import { BaseService } from \"./BaseService\";\nimport { ErrorResponse, SuccessResponse } from \"../types/index\";\n\n/**\n * Storage service for Buildx\n * Handles file upload, download, and management\n * \n * @example\n * ```typescript\n * const storage = buildx.storage();\n * \n * // Upload file\n * const result = await storage.upload(file, 'uploads/');\n * \n * // List files in directory\n * const files = await storage.list('uploads/');\n * \n * // Delete file\n * await storage.delete('uploads/file.txt');\n * ```\n */\nexport class Storage {\n\tprivate baseService: BaseService;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\t/**\n\t * Upload file to storage\n\t */\n\tasync upload(file: File, prefix?: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst formData = new FormData();\n\t\tif (prefix && prefix !== \"\") {\n\t\t\tformData.append(\"prefix\", prefix);\n\t\t}\n\t\tformData.append(\"file\", file);\n\t\tformData.append(\"filename\", file.name || \"file\");\n\n\t\tconst url = this.baseService.buildProjectUrl(\"/storage/upload\");\n\t\tconst headers = { ...(await this.baseService.getHeaders()), \"Content-Type\": \"multipart/form-data; charset=utf-8\" };\n\n\t\treturn await this.baseService.post(url, formData, { headers });\n\t}\n\n\t/**\n\t * Upload file to collection storage\n\t */\n\tasync uploadToCollection(file: File, collectionId: string, prefix?: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst formData = new FormData();\n\t\tif (prefix && prefix !== \"\") {\n\t\t\tformData.append(\"prefix\", prefix);\n\t\t}\n\t\tformData.append(\"file\", file);\n\t\tformData.append(\"filename\", file.name || \"file\");\n\t\tformData.append(\"collection_id\", collectionId);\n\n\t\tconst url = this.baseService.buildProjectUrl(\"/storage/upload\");\n\t\tconst headers = { ...(await this.baseService.getHeaders()), \"Content-Type\": \"multipart/form-data; charset=utf-8\" };\n\n\t\treturn await this.baseService.post(url, formData, { headers });\n\t}\n\n\t/**\n\t * List files in directory\n\t */\n\tasync list(path: string): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/storage?path=${encodeURIComponent(path)}`);\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Get storage size for path\n\t */\n\tasync getSize(path: string): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/storage/size?path=${encodeURIComponent(path)}`);\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Delete file from storage\n\t */\n\tasync delete(path: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/storage?path=${encodeURIComponent(path)}`);\n\t\treturn await this.baseService.delete(url);\n\t}\n} ","import { BaseService } from \"./BaseService\";\nimport { ErrorResponse } from \"../types/index\";\n\n/**\n * Flows service for Buildx\n * Handles flow types and running flows\n * \n * @example\n * ```typescript\n * const flows = buildx.flows();\n * \n * // Get flow types\n * const types = await flows.getTypes();\n * \n * // Run a flow\n * const result = await flows.run('flow-id', 'session-id', 'root', { arg1: 'value' });\n * ```\n */\nexport class Flows {\n\tprivate baseService: BaseService;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\t/**\n\t * Get all flow types\n\t */\n\tasync getTypes(): Promise<any | ErrorResponse> {\n\t\t// Optionally use cache in the future\n\t\treturn await this.baseService.get(\"/flows/types\");\n\t}\n\n\t/**\n\t * Run a flow\n\t */\n\tasync run(flowId: string, sessionId: string | null = null, state: any = \"root\", args: any = {}): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/flows/${flowId}/run`);\n\t\treturn await this.baseService.post(url, { session_id: sessionId, state, args });\n\t}\n\n\t/**\n\t * Get GPT flow code suggestions\n\t */\n\tasync getGptFlowSuggestions(instruction: string): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/ai/gpt/flow/node\");\n\t\treturn await this.baseService.post<any>(url, { instruction });\n\t}\n\n\t/**\n\t * Get GPT collection suggestions\n\t */\n\tasync getGptCollectionSuggestions(instruction: string): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/ai/gpt/collections\");\n\t\treturn await this.baseService.post<any>(url, { instruction });\n\t}\n\n\t/**\n\t * Get GPT lifecycle suggestions\n\t */\n\tasync getGptLifecycleSuggestions(instruction: string): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/ai/gpt/lifecycle\");\n\t\treturn await this.baseService.post<any>(url, { instruction });\n\t}\n} ","import { BaseService } from \"./BaseService\";\nimport { ErrorResponse, SuccessResponse } from \"../types/index\";\n\n/**\n * Templates service for Buildx\n * Handles template rendering and preview\n * \n * @example\n * ```typescript\n * const templates = buildx.templates();\n * \n * // Preview a template\n * const preview = await templates.preview('template', { name: 'John' });\n * \n * // Render a template\n * const rendered = await templates.render('template-id', { name: 'John' });\n * \n * // Generate PDF\n * await templates.generatePDF('template-id', data);\n * ```\n */\nexport class Templates {\n\tprivate baseService: BaseService;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\t/**\n\t * Preview a template with data\n\t */\n\tasync preview(template: any, data: any): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/templates/preview\");\n\t\treturn await this.baseService.post(url, { template, data });\n\t}\n\n\t/**\n\t * Render a template by ID with data\n\t */\n\tasync render(templateId: string, data: any): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/templates/${templateId}/render`);\n\t\treturn await this.baseService.post(url, data);\n\t}\n\n\t/**\n\t * Render a template as PDF and download (browser only)\n\t */\n\tasync renderPDF(templateId: string, data: any): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/templates/${templateId}/pdf`);\n\t\tconst headers = { ...(await this.baseService.getHeaders()), responseType: \"blob\" };\n\t\tconst response = await this.baseService.axiosInstance.post(url, data, { headers });\n\n\t\t// Create download link for browser\n\t\tif (typeof window !== \"undefined\") {\n\t\t\tconst blobUrl = window.URL.createObjectURL(response.data);\n\t\t\tconst link = document.createElement(\"a\");\n\t\t\tlink.href = blobUrl;\n\t\t\tlink.setAttribute(\"download\", \"document.pdf\");\n\t\t\tdocument.body.appendChild(link);\n\t\t\tlink.click();\n\t\t\tdocument.body.removeChild(link);\n\t\t\twindow.URL.revokeObjectURL(blobUrl);\n\t\t}\n\n\t\treturn { success: true, message: \"PDF downloaded successfully\" };\n\n\t}\n} ","import { BaseService } from \"./BaseService\";\nimport { Function, FunctionLog, ErrorResponse } from \"../types/index\";\n\n/**\n * Functions service for Buildx\n * Handles serverless functions management\n * \n * @example\n * ```typescript\n * const functions = buildx.functions();\n * \n * // Get all functions\n * const funcs = await functions.list();\n * \n * // Get function by name\n * const func = await functions.getByName('function-name');\n * \n * // Update function\n * await functions.update('function-name', { code: 'new code' });\n * ```\n */\nexport class Functions {\n\tprivate baseService: BaseService;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\t/**\n\t * List all functions in a project\n\t */\n\tasync list(): Promise<Function[] | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/functions\");\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Get function by name\n\t */\n\tasync getByName(functionName: string): Promise<Function | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/functions/${functionName}`);\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Update function\n\t */\n\tasync update(functionName: string, data: Partial<Function>): Promise<Function | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/functions/${functionName}`);\n\t\treturn await this.baseService.post(url, data);\n\t}\n\n\t/**\n\t * Get function logs\n\t */\n\tasync getLogs(functionName: string): Promise<FunctionLog[] | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/functions/${functionName}/logs`);\n\t\treturn await this.baseService.get(url);\n\t}\n} ","import { BaseService } from \"./BaseService\";\nimport { BuildxObject, ErrorResponse, SuccessResponse } from \"../types/index\";\n\n/**\n * Buildx Objects service for Buildx\n * Handles Buildx-specific objects (users, roles, etc.)\n * \n * @example\n * ```typescript\n * const buildxObjects = buildx.buildxObjects();\n * \n * // Get Buildx collection\n * const collection = await buildxObjects.getCollection('users');\n * \n * // Get Buildx document\n * const doc = await buildxObjects.getDocument('users', 'user-id');\n * \n * // Query Buildx objects\n * const objects = await buildxObjects.query('users', { limit: 10 });\n * ```\n */\nexport class BuildxObjects {\n\tprivate baseService: BaseService;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\t/**\n\t * Get Buildx collection\n\t */\n\tasync getCollection(type: string): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/buildx/collection/${type}`);\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Get Buildx document by ID\n\t */\n\tasync getDocument(type: string, id: string): Promise<BuildxObject | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/buildx/${type}/${id}`);\n\t\tconst result = await this.baseService.get(url);\n\n\t\tif (typeof result === \"object\" && result !== null) {\n\t\t\tresult._display = result._display || result.label || result.title || result.name || result.username || result.description || \"\";\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Query Buildx objects\n\t */\n\tasync query(type: string, options?: any): Promise<BuildxObject[] | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/buildx/${type}`);\n\t\tconst queryParams: Record<string, any> = {};\n\n\t\tif (options) {\n\t\t\tif (options.filter) {\n\t\t\t\tqueryParams.filter = options.filter;\n\t\t\t}\n\t\t\tif (options.jsonFilter) {\n\t\t\t\tqueryParams.jsonFilter = options.jsonFilter;\n\t\t\t}\n\t\t\tif (options.select) {\n\t\t\t\tqueryParams.select = Array.isArray(options.select)\n\t\t\t\t\t? options.select.join(\",\")\n\t\t\t\t\t: options.select;\n\t\t\t}\n\t\t\tif (options.projection) {\n\t\t\t\tqueryParams.projection = options.projection;\n\t\t\t}\n\t\t\tif (options.options) {\n\t\t\t\tqueryParams.options = options.options;\n\t\t\t}\n\t\t\tif (options.sort) {\n\t\t\t\tqueryParams.sort = options.sort;\n\t\t\t}\n\t\t\tif (options.limit) {\n\t\t\t\tqueryParams.limit = options.limit;\n\t\t\t}\n\t\t}\n\n\t\tconst queryString = this.baseService.buildQueryString(queryParams);\n\t\tconst fullUrl = queryString ? `${url}${queryString}` : url;\n\n\t\tconst result = await this.baseService.get(fullUrl);\n\n\t\tif (Array.isArray(result)) {\n\t\t\tresult.forEach(row => {\n\t\t\t\trow._display = row._display || row.label || row.title || row.name || row.username || row.description || \"\";\n\t\t\t});\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Create Buildx object\n\t */\n\tasync create(type: string, data: any): Promise<BuildxObject | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/buildx/${type}`);\n\t\treturn await this.baseService.post(url, data);\n\t}\n\n\t/**\n\t * Update Buildx object\n\t */\n\tasync update(type: string, id: string, data: any): Promise<BuildxObject | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/buildx/${type}/${id}`);\n\t\treturn await this.baseService.patch(url, data);\n\t}\n\n\t/**\n\t * Delete Buildx object\n\t */\n\tasync deleteObject(type: string, id: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/buildx/${type}/${id}`);\n\t\treturn await this.baseService.delete(url);\n\t}\n} ","import { BaseService } from \"./BaseService\";\nimport { ApiKey, ErrorResponse } from \"../types/index\";\n\n/**\n * API Keys service for Buildx\n * Handles API key management\n * \n * @example\n * ```typescript\n * const apiKeys = buildx.apiKeys();\n * \n * // List API keys\n * const keys = await apiKeys.list();\n * \n * // Get API key by ID\n * const key = await apiKeys.get('key-id');\n * \n * // Get API key secret\n * const secret = await apiKeys.getSecret('key-id');\n * ```\n */\nexport class ApiKeys {\n\tprivate baseService: BaseService;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\t/**\n\t * List all API keys\n\t */\n\tasync list(organizationId?: string): Promise<ApiKey[] | ErrorResponse> {\n\t\tconst url = organizationId\n\t\t\t? this.baseService.buildOrgUrl(\"/auth/api-keys\")\n\t\t\t: \"/auth/api-keys\";\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Get API key by ID\n\t */\n\tasync get(apiKeyId: string, organizationId?: string): Promise<ApiKey | ErrorResponse> {\n\t\tconst url = organizationId\n\t\t\t? this.baseService.buildOrgUrl(`/auth/api-key/${apiKeyId}`)\n\t\t\t: `/auth/api-key/${apiKeyId}`;\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Get API key secret\n\t */\n\tasync getSecret(apiKeyId: string, organizationId?: string): Promise<any | ErrorResponse> {\n\t\tconst url = organizationId\n\t\t\t? this.baseService.buildOrgUrl(`/auth/api-key/${apiKeyId}/secret`)\n\t\t\t: `/auth/api-key/${apiKeyId}/secret`;\n\t\treturn await this.baseService.get(url);\n\t}\n} ","import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from \"axios\";\nimport { BuildxConfig, ApiHeaders, ErrorResponse } from \"../types\";\n\nconst DEFAULT_API_ENDPOINT = \"https://api.buildx.ai\";\nconst DEFAULT_PROJECT_ID = \"default\";\nlet instances: Record<string, BaseService> = {};\n\n/**\n * Base service class that provides common functionality for all Buildx services\n */\nexport class BaseService {\n\tpublic config: BuildxConfig;\n\tpublic axiosInstance: AxiosInstance;\n\tprivate _accessToken: string | null = null;\n\tprivate _refreshToken: string | null = null;\n\n\tstatic getInstance(apiKey: string, projectId?: string, apiEndpoint?: string): BaseService {\n\t\tif (!projectId) {\n\t\t\tprojectId = \"default\";\n\t\t}\n\n\t\tconst endpoint = (apiEndpoint || DEFAULT_API_ENDPOINT).replace(/\\/$/, \"\");\n\t\tif (!instances[projectId]) {\n\t\t\tinstances[projectId] = new BaseService({\n\t\t\t\tapiEndpoint: endpoint,\n\t\t\t\tprojectId: projectId,\n\t\t\t\tapiKey: apiKey,\n\t\t\t});\n\t\t} else {\n\t\t\tconst current = instances[projectId];\n\t\t\tif (current.config.apiEndpoint !== endpoint || current.config.apiKey !== apiKey) {\n\t\t\t\tcurrent.updateConfig({\n\t\t\t\t\t...current.config,\n\t\t\t\t\tapiEndpoint: endpoint,\n\t\t\t\t\tapiKey: apiKey,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn instances[projectId];\n\t}\n\n\tconstructor(config: BuildxConfig) {\n\t\tthis.config = config;\n\t\tthis.axiosInstance = axios.create({\n\t\t\tbaseURL: config.apiEndpoint,\n\t\t\ttimeout: 30000,\n\t\t});\n\n\t\t// Add request interceptor for authentication\n\t\tthis.axiosInstance.interceptors.request.use(\n\t\t\t(config) => {\n\t\t\t\t// Add API key to all requests\n\t\t\t\tconfig.headers[\"X-API-Key\"] = this.config.apiKey;\n\t\t\t\treturn config;\n\t\t\t},\n\t\t\t(error) => {\n\t\t\t\treturn Promise.reject(error);\n\t\t\t}\n\t\t);\n\n\t\t// Add response interceptor for error handling\n\t\tthis.axiosInstance.interceptors.response.use(\n\t\t\t(response) => response,\n\t\t\t(error) => {\n\t\t\t\treturn this.handleError(error);\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Update the service configuration\n\t */\n\tupdateConfig(config: BuildxConfig): void {\n\t\tthis.config = config;\n\t\tthis.axiosInstance.defaults.baseURL = config.apiEndpoint;\n\t}\n\n\t/**\n\t * Set the access token\n\t */\n\tpublic setAccessToken(token: string | null): void {\n\t\tthis._accessToken = token;\n\t}\n\n\t/**\n\t * Get the access token\n\t */\n\tpublic getAccessToken(): string | null {\n\t\treturn this._accessToken;\n\t}\n\n\t/**\n\t * Set the refresh token\n\t */\n\tpublic setRefreshToken(token: string | null): void {\n\t\tthis._refreshToken = token;\n\t}\n\n\t/**\n\t * Get the refresh token\n\t */\n\tpublic getRefreshToken(): string | null {\n\t\treturn this._refreshToken;\n\t}\n\n\t/**\n\t * Clear all stored tokens\n\t */\n\tpublic clearTokens(): void {\n\t\tthis._accessToken = null;\n\t\tthis._refreshToken = null;\n\t}\n\n\t/**\n\t * Check if user is authenticated (has access token)\n\t */\n\tpublic isAuthenticated(): boolean {\n\t\treturn this._accessToken !== null;\n\t}\n\n\t/**\n\t * Get default headers with authentication\n\t */\n\tpublic async getHeaders(useRefreshToken = false): Promise<ApiHeaders> {\n\t\tconst token = useRefreshToken ? this._refreshToken : this._accessToken;\n\n\t\tconst headers: ApiHeaders = {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\"X-API-Key\": this.config.apiKey,\n\t\t};\n\n\t\tif (token) {\n\t\t\theaders[\"Authorization\"] = `Bearer ${token}`;\n\t\t}\n\n\t\treturn headers;\n\t}\n\n\t/**\n\t * Get headers without authentication (for public endpoints)\n\t */\n\tpublic getPublicHeaders(): ApiHeaders {\n\t\treturn {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\"X-API-Key\": this.config.apiKey,\n\t\t};\n\t}\n\n\t/**\n\t * Make a GET request\n\t */\n\tpublic async get<T = any>(url: string, config?: AxiosRequestConfig): Promise<T> {\n\t\tconst headers = await this.getHeaders();\n\t\tconst response: AxiosResponse<T> = await this.axiosInstance.get(url, {\n\t\t\t...config,\n\t\t\theaders: { ...headers, ...config?.headers },\n\t\t});\n\t\treturn response.data;\n\t}\n\n\t/**\n\t * Make a POST request\n\t */\n\tpublic async post<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {\n\t\tconst headers = await this.getHeaders();\n\t\tconst response: AxiosResponse<T> = await this.axiosInstance.post(url, data, {\n\t\t\t...config,\n\t\t\theaders: { ...headers, ...config?.headers },\n\t\t});\n\t\treturn response.data;\n\t}\n\n\t/**\n\t * Make a PUT request\n\t */\n\tpublic async put<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {\n\t\tconst headers = await this.getHeaders();\n\t\tconst response: AxiosResponse<T> = await this.axiosInstance.put(url, data, {\n\t\t\t...config,\n\t\t\theaders: { ...headers, ...config?.headers },\n\t\t});\n\t\treturn response.data;\n\t}\n\n\t/**\n\t * Make a PATCH request\n\t */\n\tpublic async patch<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {\n\t\tconst headers = await this.getHeaders();\n\t\tconst response: AxiosResponse<T> = await this.axiosInstance.patch(url, data, {\n\t\t\t...config,\n\t\t\theaders: { ...headers, ...config?.headers },\n\t\t});\n\t\treturn response.data;\n\t}\n\n\t/**\n\t * Make a DELETE request\n\t */\n\tpublic async delete<T = any>(url: string, config?: AxiosRequestConfig): Promise<T> {\n\t\tconst headers = await this.getHeaders();\n\t\tconst response: AxiosResponse<T> = await this.axiosInstance.delete(url, {\n\t\t\t...config,\n\t\t\theaders: { ...headers, ...config?.headers },\n\t\t});\n\t\treturn response.data;\n\t}\n\n\t/**\n\t * Handle API errors\n\t */\n\tpublic handleError(error: any): ErrorResponse {\n\t\tif (error.response) {\n\t\t\tconst { status, data } = error.response;\n\n\t\t\tif (data && typeof data === \"object\") {\n\t\t\t\treturn {\n\t\t\t\t\terror: data.error || \"RequestError\",\n\t\t\t\t\tmessage: data.message || data.description || \"Something went wrong\",\n\t\t\t\t\tstatusCode: status,\n\t\t\t\t\tsuccess: false,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\terror: \"RequestError\",\n\t\t\t\tmessage: `Request failed with status ${status}`,\n\t\t\t\tstatusCode: status,\n\t\t\t\tsuccess: false,\n\t\t\t};\n\t\t}\n\n\t\tif (error.message === \"Network Error\") {\n\t\t\treturn {\n\t\t\t\terror: \"NetworkError\",\n\t\t\t\tmessage: \"Network connection failed\",\n\t\t\t\tstatusCode: 500,\n\t\t\t\tsuccess: false,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\terror: \"RequestError\",\n\t\t\tmessage: error.message || \"Unknown error occurred\",\n\t\t\tstatusCode: 500,\n\t\t\tsuccess: false,\n\t\t};\n\t}\n\n\t/**\n\t * Build URL with project ID\n\t */\n\tpublic buildProjectUrl(path = \"\"): string {\n\t\tconst pid = this.config.projectId;\n\t\tif (!pid || pid === DEFAULT_PROJECT_ID) {\n\t\t\tthrow new Error(\"Project ID is required\");\n\t\t}\n\t\treturn `/project/${pid}${path}`;\n\t}\n\n\t/**\n\t * Build URL with organization ID\n\t */\n\tpublic buildOrgUrl(path = \"\"): string {\n\t\tconst oid = this.config.organizationId || this.config.projectId;\n\t\tif (!oid) {\n\t\t\tthrow new Error(\"Organization ID is required\");\n\t\t}\n\t\treturn `/${oid}${path}`;\n\t}\n\n\t/**\n\t * Build query string from options\n\t */\n\tpublic buildQueryString(options: Record<string, any>): string {\n\t\tconst params = new URLSearchParams();\n\n\t\tObject.entries(options).forEach(([key, value]) => {\n\t\t\tif (value !== undefined && value !== null) {\n\t\t\t\tif (typeof value === \"object\") {\n\t\t\t\t\tparams.append(key, JSON.stringify(value));\n\t\t\t\t} else {\n\t\t\t\t\tparams.append(key, String(value));\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tconst queryString = params.toString();\n\t\treturn queryString ? `?${queryString}` : \"\";\n\t}\n}\n","import { BuildxConfig } from \"./types\";\nimport { Auth } from \"./services/Auth\";\nimport { Projects } from \"./services/Projects\";\nimport { Collections } from \"./services/Collections\";\nimport { Storage } from \"./services/Storage\";\nimport { Flows } from \"./services/Flows\";\nimport { Templates } from \"./services/Templates\";\nimport { Functions } from \"./services/Functions\";\nimport { BuildxObjects } from \"./services/BuildxObjects\";\nimport { ApiKeys } from \"./services/ApiKeys\";\nimport { BaseService } from \"./services/BaseService\";\n\n/**\n * Main Buildx SDK class\n * \n * @example\n * ```typescript\n * import { Buildx } from 'buildx-sdk';\n * \n * const buildx = new Buildx({\n * apiEndpoint: 'https://api.buildx.com',\n * apiKey: 'your-api-key',\n * projectId: 'your-project-id'\n * });\n * \n * // Use different services\n * const auth = buildx.auth();\n * const projects = buildx.projects();\n * const collections = buildx.collections();\n * ```\n */\nexport class Buildx {\n\tprivate config: BuildxConfig;\n\tprivate _auth: Auth;\n\tprivate _projects: Projects;\n\tprivate _collections: Collections;\n\tprivate _storage: Storage;\n\tprivate _flows: Flows;\n\tprivate _templates: Templates;\n\tprivate _functions: Functions;\n\tprivate _buildxObjects: BuildxObjects;\n\tprivate _apiKeys: ApiKeys;\n\n\tprivate _baseService: BaseService;\n\n\tconstructor(config: BuildxConfig) {\n\t\tthis.config = {\n\t\t\tapiEndpoint: config.apiEndpoint.replace(/\\/$/, \"\"), // Remove trailing slash\n\t\t\tapiKey: config.apiKey,\n\t\t\tprojectId: config.projectId,\n\t\t\torganizationId: config.organizationId,\n\t\t};\n\n\t\tthis._baseService = BaseService.getInstance(this.config.apiKey, this.config.projectId, this.config.apiEndpoint);\n\n\t\t// Initialize services\n\t\tthis._auth = new Auth(this._baseService);\n\t\tthis._projects = new Projects(this._baseService);\n\t\tthis._collections = new Collections(this._baseService);\n\t\tthis._storage = new Storage(this._baseService);\n\t\tthis._flows = new Flows(this._baseService);\n\t\tthis._templates = new Templates(this._baseService);\n\t\tthis._functions = new Functions(this._baseService);\n\t\tthis._buildxObjects = new BuildxObjects(this._baseService);\n\t\tthis._apiKeys = new ApiKeys(this._baseService);\n\t}\n\n\t/**\n\t * Get the current configuration\n\t */\n\tgetConfig(): BuildxConfig {\n\t\treturn { ...this.config };\n\t}\n\n\t/**\n\t * Update the configuration\n\t */\n\tupdateConfig(config: Partial<BuildxConfig>): void {\n\t\tthis.config = { ...this.config, ...config };\n\t\tthis._baseService.updateConfig(this.config);\n\t}\n\n\t/**\n\t * Authentication service\n\t * Handles user authentication, login, signup, and user management\n\t */\n\tauth(): Auth {\n\t\treturn this._auth;\n\t}\n\n\t/**\n\t * Projects service\n\t * Manages projects, including CRUD operations\n\t */\n\tprojects(): Projects {\n\t\treturn this._projects;\n\t}\n\n\t/**\n\t * Collections service\n\t * Manages data collections, documents, and queries\n\t */\n\tcollections(): Collections {\n\t\treturn this._collections;\n\t}\n\n\t/**\n\t * Storage service\n\t * Handles file upload, download, and management\n\t */\n\tstorage(): Storage {\n\t\treturn this._storage;\n\t}\n\n\t/**\n\t * Flows service\n\t * Manages workflow execution and flow types\n\t */\n\tflows(): Flows {\n\t\treturn this._flows;\n\t}\n\n\t/**\n\t * Templates service\n\t * Handles template rendering and preview\n\t */\n\ttemplates(): Templates {\n\t\treturn this._templates;\n\t}\n\n\t/**\n\t * Functions service\n\t * Manages serverless functions\n\t */\n\tfunctions(): Functions {\n\t\treturn this._functions;\n\t}\n\n\t/**\n\t * Buildx Objects service\n\t * Manages Buildx-specific objects (users, roles, etc.)\n\t */\n\tbuildxObjects(): BuildxObjects {\n\t\treturn this._buildxObjects;\n\t}\n\n\t/**\n\t * API Keys service\n\t * Manages API key operations\n\t */\n\tapiKeys(): ApiKeys {\n\t\treturn this._apiKeys;\n\t}\n}\n\n// Export the main class as default\nexport default Buildx;\n"],"names":["Auth","constructor","baseService","this","setAccessToken","token","getAccessToken","setRefreshToken","getRefreshToken","clearTokens","isAuthenticated","storeTokens","response","access_token","refresh_token","isErrorResponse","success","hasProjectScope","projectId","config","login","credentials","url","buildProjectUrl","post","loginWithGoogle","signup","requestEotp","request","requestEotpAuth","requestOtpLogin","verifyEotp","verify","verifyEotpAuth","verifyOtpLogin","getCurrentUser","get","refreshToken","updatePassword","password","changePassword","newPassword","new_password","payload","currentPassword","current_password","adminUpdatePassword","userId","user_id","requestPasswordReset","resetPassword","updatePushToken","listUsers","organizationId","buildOrgUrl","lookupUsers","getUser","deleteUser","Projects","list","create","projectData","update","patch","deleteById","delete","backup","axiosInstance","responseType","headers","getHeaders","window","URL","createObjectURL","data","link","document","createElement","href","setAttribute","body","appendChild","click","removeChild","revokeObjectURL","message","restore","file","formData","FormData","append","CollectionWsClient","collectionId","wsFactory","socket","connectPromise","requestCounter","pending","Map","query","action","timeoutMs","ensureConnected","Error","id","Date","now","resultPromise","Promise","resolve","reject","timeout","setTimeout","set","send","JSON","stringify","close","_error","entry","entries","clearTimeout","clear","isSocketOpen","GlobalWebSocket","globalThis","WebSocket","buildSocketUrl","settled","onOpen","onError","error","onClose","onMessage","event","parse","ok","result","addEventListener","onopen","onerror","onclose","onmessage","finally","openState","OPEN","readyState","wsEndpoint","apiEndpoint","replace","path","params","URLSearchParams","apiKey","qs","toString","Collections","collectionWsClient","collectionWsCollectionId","collectionWsDisabledUntil","withStats","withBuildx","queryParams","with_stats","queryString","buildQueryString","fullUrl","collections","Array","isArray","filter","collection","collection_id","startsWith","getSchema","depth","collectionData","deleteCollection","options","noPopulate","relations","length","buildQueryParams","preferWs","paginationTransport","hydrateRelations","relationSelect","queryRaw","normalizedOptions","queryRawViaWs","console","warn","resetCollectionWsClient","queryWithPagination","transport","queryWithPaginationViaWs","queryWithPaginationViaHttp","hydratedRows","meta","client","getOrCreateCollectionWsClient","subscribeRealtime","handlers","endpoint","lastEventId","factory","eventSourceFactory","EventSource","source","hasConnected","emitConnected","onConnected","emitEvent","onEvent","lookup","jsonFilter","projection","map","row","value","_id","label","_display","title","name","username","description","searchQuery","q","quick_filter_fields","select","join","sort","limit","skip","rows","enhancedRows","defaultSelect","groupedByCollection","reduce","acc","relation","push","relationCache","refCollectionId","configs","Object","ids","Set","field","item","add","missingIds","from","has","chunkSize","RELATION_QUERY_CHUNK_SIZE","i","idChunk","slice","relatedDocs","$in","doc","getDocument","documentId","populate","createDocument","updateDocument","updateDocumentWithOptions","baseUrl","updateOnly","getDocumentRevisions","deleteDocument","deleteByFilter","import","mapping","getDataTypes","validate","migrate","Storage","upload","prefix","uploadToCollection","encodeURIComponent","getSize","Flows","getTypes","run","flowId","sessionId","state","args","session_id","getGptFlowSuggestions","instruction","getGptCollectionSuggestions","getGptLifecycleSuggestions","Templates","preview","template","render","templateId","renderPDF","blobUrl","Functions","getByName","functionName","getLogs","BuildxObjects","getCollection","type","forEach","deleteObject","ApiKeys","apiKeyId","getSecret","instances","BaseService","getInstance","current","updateConfig","_accessToken","_refreshToken","axios","baseURL","interceptors","use","handleError","defaults","useRefreshToken","getPublicHeaders","put","status","statusCode","pid","oid","key","String","Buildx","_baseService","_auth","_projects","_collections","_storage","_flows","_templates","_functions","_buildxObjects","_apiKeys","getConfig","auth","projects","storage","flows","templates","functions","buildxObjects","apiKeys"],"mappings":"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"}
|