@boltic/sdk 0.0.4 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/databases/index.d.ts +72 -0
- package/dist/databases/index.js +1 -1
- package/dist/databases/index.js.map +1 -1
- package/dist/databases/index.mjs +5 -5
- package/dist/databases/index.mjs.map +1 -1
- package/dist/databases/test-client-DfOmma3t.js +2 -0
- package/dist/databases/test-client-DfOmma3t.js.map +1 -0
- package/dist/databases/{test-client-BffJwqJq.mjs → test-client-rQ1AmTo6.mjs} +229 -4
- package/dist/databases/test-client-rQ1AmTo6.mjs.map +1 -0
- package/dist/databases/testing.d.ts +68 -0
- package/dist/databases/testing.js +1 -1
- package/dist/databases/testing.mjs +1 -1
- package/dist/sdk.js +219 -0
- package/dist/sdk.js.map +1 -1
- package/dist/sdk.mjs +219 -0
- package/dist/sdk.mjs.map +1 -1
- package/dist/types/index.d.ts +68 -0
- package/package.json +1 -1
- package/dist/databases/test-client-BI3VkYA6.js +0 -2
- package/dist/databases/test-client-BI3VkYA6.js.map +0 -1
- package/dist/databases/test-client-BffJwqJq.mjs.map +0 -1
package/dist/sdk.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk.js","sources":["../src/errors/index.ts","../src/auth/auth-manager.ts","../src/services/databases/src/errors/utils.ts","../src/services/databases/src/client/core/auth-manager.ts","../src/services/databases/src/utils/http/axios-adapter.ts","../src/services/databases/src/utils/http/fetch-adapter.ts","../src/services/databases/src/utils/http/client-factory.ts","../src/services/databases/src/client/core/interceptors.ts","../src/services/databases/src/client/core/base-client.ts","../src/services/databases/src/types/config/environment.ts","../src/services/databases/src/client/core/config.ts","../src/services/databases/src/utils/common/index.ts","../src/services/databases/src/api/endpoints/columns.ts","../src/services/databases/src/types/api/column.ts","../src/services/databases/src/api/transformers/columns.ts","../src/services/databases/src/api/clients/columns-api-client.ts","../src/services/databases/src/api/endpoints/tables.ts","../src/services/databases/src/utils/filters/filter-mapper.ts","../src/services/databases/src/api/transformers/tables.ts","../src/services/databases/src/api/clients/tables-api-client.ts","../src/services/databases/src/types/common/responses.ts","../src/services/databases/src/client/core/base-resource.ts","../src/services/databases/src/client/resources/table.ts","../src/services/databases/src/client/resources/column.ts","../src/services/databases/src/api/endpoints/records.ts","../src/services/databases/src/api/transformers/records.ts","../src/services/databases/src/api/clients/records-api-client.ts","../src/services/databases/src/client/resources/record.ts","../src/services/databases/src/client/resources/record-builder.ts","../src/services/databases/src/api/endpoints/sql.ts","../src/services/databases/src/api/clients/base-api-client.ts","../src/services/databases/src/api/clients/sql-api-client.ts","../src/services/databases/src/api/transformers/sql.ts","../src/services/databases/src/client/resources/sql.ts","../src/services/databases/src/client/resources/table-builder.ts","../src/services/databases/src/client/boltic-client.ts","../src/services/databases/src/client/index.ts","../src/index.ts"],"sourcesContent":["/**\n * Utility functions for working with standard Error classes\n */\n\n/**\n * Creates a structured error object with additional context\n */\nexport function createErrorWithContext(\n message: string,\n context?: Record<string, unknown>\n): Error {\n const error = new Error(message);\n if (context) {\n // Add context as a property for debugging\n (error as Error & { context?: Record<string, unknown> }).context = context;\n }\n return error;\n}\n\n/**\n * Checks if an error is a network/HTTP related error\n */\nexport function isNetworkError(error: unknown): error is Error {\n return (\n error instanceof Error &&\n (error.message.includes('network') ||\n error.message.includes('fetch') ||\n error.message.includes('timeout') ||\n error.name === 'AbortError')\n );\n}\n\n/**\n * Extracts HTTP status code from axios or fetch errors\n */\nexport function getHttpStatusCode(error: unknown): number | null {\n if (error && typeof error === 'object') {\n // Axios error structure\n if (\n 'response' in error &&\n error.response &&\n typeof error.response === 'object'\n ) {\n const response = error.response as { status?: number };\n if ('status' in response && typeof response.status === 'number') {\n return response.status;\n }\n }\n // Fetch Response error\n if (\n 'status' in error &&\n typeof (error as { status?: number }).status === 'number'\n ) {\n return (error as { status: number }).status;\n }\n }\n return null;\n}\n\n/**\n * Formats error for logging/debugging\n */\nexport function formatError(error: unknown): string {\n if (error instanceof Error) {\n const context = (error as Error & { context?: Record<string, unknown> })\n .context;\n const statusCode = getHttpStatusCode(error);\n\n let formatted = `${error.name}: ${error.message}`;\n\n if (statusCode) {\n formatted += ` (HTTP ${statusCode})`;\n }\n\n if (context) {\n formatted += `\\nContext: ${JSON.stringify(context, null, 2)}`;\n }\n\n return formatted;\n }\n\n return String(error);\n}\n\n// Re-export standard Error types for convenience\n// These are available globally in JavaScript/TypeScript\n","import { createErrorWithContext } from '../errors';\nimport { AuthConfig, AuthHeaders, TokenInfo } from '../types/auth';\n\nexport class AuthManager {\n private config: AuthConfig;\n private tokenInfo: TokenInfo | null = null;\n\n constructor(config: AuthConfig) {\n this.config = config;\n this.validateApiKey(config.apiKey);\n }\n\n private validateApiKey(apiKey: string): void {\n if (!apiKey || typeof apiKey !== 'string' || apiKey.trim().length === 0) {\n throw createErrorWithContext(\n 'API key is required and must be a non-empty string',\n {\n name: 'AuthenticationError',\n code: 'INVALID_API_KEY',\n }\n );\n }\n\n // Basic format validation (adjust based on actual key format)\n if (apiKey.length < 10) {\n throw createErrorWithContext(\n 'API key appears to be invalid (too short)',\n {\n name: 'AuthenticationError',\n code: 'INVALID_API_KEY_FORMAT',\n }\n );\n }\n }\n\n getAuthHeaders(): AuthHeaders {\n return {\n 'x-boltic-token': this.config.apiKey,\n };\n }\n\n updateApiKey(newApiKey: string): void {\n this.validateApiKey(newApiKey);\n this.config.apiKey = newApiKey;\n this.tokenInfo = null; // Reset token info\n }\n\n isAuthenticated(): boolean {\n return !!this.config.apiKey;\n }\n\n async validateApiKeyAsync(): Promise<boolean> {\n // TODO: Implement actual API key validation endpoint call\n // For now, return basic validation\n try {\n this.validateApiKey(this.config.apiKey);\n return true;\n } catch {\n return false;\n }\n }\n\n getTokenInfo(): TokenInfo | null {\n return this.tokenInfo ? { ...this.tokenInfo } : null;\n }\n\n // Generic method to get headers for any Boltic service\n getServiceHeaders(service?: string): AuthHeaders {\n const headers = this.getAuthHeaders();\n\n if (service) {\n headers['x-boltic-service'] = service;\n }\n\n return headers;\n }\n\n // Method to validate API key for specific service\n async validateForService(): Promise<boolean> {\n try {\n const isValid = await this.validateApiKeyAsync();\n if (isValid) {\n // TODO: Add service-specific validation logic\n return true;\n }\n return false;\n } catch {\n return false;\n }\n }\n}\n","/**\n * Utility functions for working with standard Error classes\n */\n\nexport interface ValidationFailure {\n field: string;\n message: string;\n}\n\n/**\n * Validation error for input validation failures\n */\nexport class ValidationError extends Error {\n public readonly failures: ValidationFailure[];\n\n constructor(message: string, failures: ValidationFailure[] = []) {\n super(message);\n this.name = 'ValidationError';\n this.failures = failures;\n }\n}\n\n/**\n * API error for HTTP/API related failures\n */\nexport class ApiError extends Error {\n public readonly statusCode: number;\n public readonly response?: unknown;\n\n constructor(message: string, statusCode: number, response?: unknown) {\n super(message);\n this.name = 'ApiError';\n this.statusCode = statusCode;\n this.response = response;\n }\n}\n\n/**\n * Creates a structured error object with additional context\n */\nexport function createErrorWithContext(\n message: string,\n context?: Record<string, unknown>\n): Error {\n const error = new Error(message);\n if (context) {\n // Add context as a property for debugging\n (error as Error & { context: Record<string, unknown> }).context = context;\n }\n return error;\n}\n\n/**\n * Checks if an error is a network/HTTP related error\n */\nexport function isNetworkError(error: unknown): error is Error {\n return (\n error instanceof Error &&\n (error.message.includes('network') ||\n error.message.includes('fetch') ||\n error.message.includes('timeout') ||\n error.name === 'AbortError')\n );\n}\n\n/**\n * Extracts HTTP status code from axios or fetch errors\n */\nexport function getHttpStatusCode(error: unknown): number | null {\n if (error && typeof error === 'object') {\n // Axios error structure\n if (\n 'response' in error &&\n error.response &&\n typeof error.response === 'object'\n ) {\n const response = error.response as { status?: unknown };\n if ('status' in response && typeof response.status === 'number') {\n return response.status;\n }\n }\n // Fetch Response error\n if (\n 'status' in error &&\n typeof (error as { status: unknown }).status === 'number'\n ) {\n return (error as { status: number }).status;\n }\n }\n return null;\n}\n\n/**\n * Formats error for logging/debugging\n */\nexport function formatError(error: unknown): string {\n if (error instanceof Error) {\n const context = (error as Error & { context?: Record<string, unknown> })\n .context;\n const statusCode = getHttpStatusCode(error);\n\n let formatted = `${error.name}: ${error.message}`;\n\n if (statusCode) {\n formatted += ` (HTTP ${statusCode})`;\n }\n\n if (context) {\n formatted += `\\nContext: ${JSON.stringify(context, null, 2)}`;\n }\n\n return formatted;\n }\n\n return String(error);\n}\n","import { createErrorWithContext } from '../../errors';\nimport { AuthConfig, AuthHeaders, TokenInfo } from '../../types/config/auth';\n\nexport class AuthManager {\n private config: AuthConfig;\n private tokenInfo: TokenInfo | null = null;\n\n constructor(config: AuthConfig) {\n this.config = {\n maxRetries: 3,\n ...config,\n };\n this.validateApiKey(config.apiKey);\n }\n\n private validateApiKey(apiKey: string): void {\n if (!apiKey || typeof apiKey !== 'string' || apiKey.trim().length === 0) {\n throw createErrorWithContext(\n 'API key is required and must be a non-empty string',\n {\n name: 'AuthenticationError',\n code: 'INVALID_API_KEY',\n }\n );\n }\n\n // Basic format validation (adjust based on actual key format)\n if (apiKey.length < 10) {\n throw createErrorWithContext(\n 'API key appears to be invalid (too short)',\n {\n name: 'AuthenticationError',\n code: 'INVALID_API_KEY_FORMAT',\n }\n );\n }\n }\n\n getAuthHeaders(): AuthHeaders {\n return {\n 'x-boltic-token': this.config.apiKey,\n };\n }\n\n updateApiKey(newApiKey: string): void {\n this.validateApiKey(newApiKey);\n this.config.apiKey = newApiKey;\n this.tokenInfo = null; // Reset token info\n }\n\n isAuthenticated(): boolean {\n return !!this.config.apiKey;\n }\n\n async validateApiKeyAsync(): Promise<boolean> {\n // TODO: Implement actual API key validation endpoint call\n // For now, return basic validation\n try {\n this.validateApiKey(this.config.apiKey);\n return true;\n } catch {\n return false;\n }\n }\n\n getTokenInfo(): TokenInfo | null {\n return this.tokenInfo ? { ...this.tokenInfo } : null;\n }\n\n getMaxRetries(): number {\n return this.config.maxRetries || 3;\n }\n\n // Security methods to prevent API key exposure\n toString(): string {\n return `AuthManager { authenticated: ${this.isAuthenticated()}, maxRetries: ${this.getMaxRetries()} }`;\n }\n\n toJSON(): object {\n return {\n authenticated: this.isAuthenticated(),\n maxRetries: this.getMaxRetries(),\n };\n }\n\n // Custom inspect method for Node.js console logging\n [Symbol.for('nodejs.util.inspect.custom')](): string {\n return this.toString();\n }\n}\n","import { createErrorWithContext } from '../../errors';\nimport { HttpAdapter, HttpRequestConfig, HttpResponse } from './adapter';\n\ninterface AxiosInstance {\n (config: unknown): Promise<{\n data: unknown;\n status: number;\n statusText: string;\n headers: Record<string, string>;\n }>;\n}\n\nexport class AxiosAdapter implements HttpAdapter {\n private axios: AxiosInstance;\n\n constructor() {\n try {\n // Dynamic import for optional axios dependency\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n this.axios = require('axios');\n } catch (error) {\n throw createErrorWithContext(\n 'Axios is required for Node.js < 18. Please install axios: npm install axios',\n { error }\n );\n }\n }\n\n async request<T = unknown>(\n config: HttpRequestConfig\n ): Promise<HttpResponse<T>> {\n try {\n const axiosConfig = {\n url: config.url,\n method: config.method.toLowerCase(),\n headers: config.headers,\n params: config.params,\n data: config.data,\n timeout: config.timeout,\n signal: config.signal,\n validateStatus: () => true, // Don't throw on non-2xx status codes\n };\n\n const response = await this.axios(axiosConfig);\n\n return {\n data: response.data as T,\n status: response.status,\n statusText: response.statusText,\n headers: response.headers || {},\n };\n } catch (error: unknown) {\n const axiosError = error as {\n code?: string;\n message?: string;\n name?: string;\n };\n\n // Handle timeout errors\n if (\n axiosError.code === 'ECONNABORTED' ||\n axiosError.message?.includes('timeout')\n ) {\n throw createErrorWithContext('Request timeout', {\n url: config.url,\n method: config.method,\n timeout: config.timeout,\n });\n }\n\n // Handle VPN and network connectivity issues\n if (\n axiosError.code === 'ERR_NETWORK' ||\n axiosError.code === 'ENOTFOUND' ||\n axiosError.code === 'ECONNREFUSED' ||\n axiosError.code === 'EHOSTUNREACH' ||\n axiosError.code === 'ETIMEDOUT' ||\n axiosError.code === 'ERR_INTERNET_DISCONNECTED' ||\n axiosError.message?.includes('network') ||\n axiosError.message?.includes('internet') ||\n axiosError.message?.includes('connection') ||\n axiosError.message?.includes('resolve')\n ) {\n throw createErrorWithContext(\n 'Network connection failed. Please check your internet connection or VPN settings.',\n {\n url: config.url,\n method: config.method,\n networkError: true,\n errorCode: axiosError.code,\n originalMessage: axiosError.message,\n }\n );\n }\n\n // Handle request cancellation\n if (\n axiosError.name === 'AbortError' ||\n axiosError.code === 'ERR_CANCELED'\n ) {\n throw createErrorWithContext('Request was aborted', {\n url: config.url,\n method: config.method,\n });\n }\n\n // Generic HTTP error fallback\n throw createErrorWithContext(\n `HTTP request failed: ${axiosError.message || 'Unknown error'}`,\n {\n url: config.url,\n method: config.method,\n originalError: error,\n }\n );\n }\n }\n}\n","import { createErrorWithContext } from '../../errors';\nimport { HttpAdapter, HttpRequestConfig, HttpResponse } from './adapter';\n\nexport class FetchAdapter implements HttpAdapter {\n async request<T = unknown>(\n config: HttpRequestConfig\n ): Promise<HttpResponse<T>> {\n const url = new URL(config.url);\n\n // Add query parameters\n if (config.params) {\n Object.entries(config.params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n url.searchParams.append(key, String(value));\n }\n });\n }\n\n const init: RequestInit = {\n method: config.method,\n headers: {\n 'Content-Type': 'application/json',\n ...config.headers,\n },\n signal: config.signal,\n };\n\n if (\n config.data &&\n ['POST', 'PUT', 'PATCH', 'DELETE'].includes(config.method)\n ) {\n init.body = JSON.stringify(config.data);\n }\n\n try {\n const controller = new AbortController();\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n // Set up timeout if specified\n if (config.timeout) {\n timeoutId = setTimeout(() => controller.abort(), config.timeout);\n init.signal = config.signal\n ? (() => {\n const combinedController = new AbortController();\n config.signal.addEventListener('abort', () =>\n combinedController.abort()\n );\n controller.signal.addEventListener('abort', () =>\n combinedController.abort()\n );\n return combinedController.signal;\n })()\n : controller.signal;\n }\n\n const response = await fetch(url.toString(), init);\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n\n const contentType = response.headers.get('content-type');\n let data: T;\n\n if (contentType?.includes('application/json')) {\n data = await response.json();\n } else {\n data = (await response.text()) as T;\n }\n\n const headers: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n headers[key] = value;\n });\n\n const httpResponse: HttpResponse<T> = {\n data,\n status: response.status,\n statusText: response.statusText,\n headers,\n };\n\n // For non-2xx responses, we still return the response but the caller can check status\n return httpResponse;\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n throw createErrorWithContext('Request was aborted', {\n type: 'AbortError',\n url: config.url,\n method: config.method,\n });\n }\n\n // Handle VPN and network connectivity issues\n if (error instanceof Error) {\n const errorMessage = error.message.toLowerCase();\n if (\n error.name === 'TypeError' &&\n (errorMessage.includes('network') ||\n errorMessage.includes('fetch') ||\n errorMessage.includes('failed to fetch') ||\n errorMessage.includes('internet') ||\n errorMessage.includes('connection') ||\n errorMessage.includes('resolve') ||\n errorMessage.includes('unreachable'))\n ) {\n throw createErrorWithContext(\n 'Network connection failed. Please check your internet connection or VPN settings.',\n {\n url: config.url,\n method: config.method,\n networkError: true,\n originalMessage: error.message,\n }\n );\n }\n }\n\n throw createErrorWithContext(\n `HTTP request failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n {\n url: config.url,\n method: config.method,\n originalError: error,\n }\n );\n }\n }\n}\n","import { createErrorWithContext } from '../../errors';\nimport { HttpAdapter } from './adapter';\nimport { AxiosAdapter } from './axios-adapter';\nimport { FetchAdapter } from './fetch-adapter';\n\nexport function createHttpAdapter(): HttpAdapter {\n // Check if fetch is available (browser or Node.js >= 18)\n if (typeof fetch !== 'undefined') {\n return new FetchAdapter();\n }\n\n // Fallback to axios for older Node.js versions\n try {\n return new AxiosAdapter();\n } catch (error) {\n throw createErrorWithContext(\n 'No suitable HTTP adapter found. Please use Node.js >= 18 or install axios: npm install axios',\n { error }\n );\n }\n}\n","import { HttpRequestConfig, HttpResponse } from '../../utils/http/adapter';\n\nexport type RequestInterceptor = (\n config: HttpRequestConfig\n) => HttpRequestConfig | Promise<HttpRequestConfig>;\n\nexport type ResponseInterceptor = (\n response: HttpResponse\n) => HttpResponse | Promise<HttpResponse>;\n\nexport type ErrorInterceptor = (error: unknown) => unknown | Promise<unknown>;\n\nexport interface InterceptorManager {\n request: {\n use(interceptor: RequestInterceptor): number;\n eject(id: number): void;\n };\n response: {\n use(\n onFulfilled?: ResponseInterceptor,\n onRejected?: ErrorInterceptor\n ): number;\n eject(id: number): void;\n };\n}\n\nexport class InterceptorManagerImpl implements InterceptorManager {\n private requestInterceptors: Map<number, RequestInterceptor> = new Map();\n private responseInterceptors: Map<\n number,\n { fulfilled?: ResponseInterceptor; rejected?: ErrorInterceptor }\n > = new Map();\n private nextId = 0;\n\n request = {\n use: (interceptor: RequestInterceptor): number => {\n const id = this.nextId++;\n this.requestInterceptors.set(id, interceptor);\n return id;\n },\n eject: (id: number): void => {\n this.requestInterceptors.delete(id);\n },\n };\n\n response = {\n use: (\n onFulfilled?: ResponseInterceptor,\n onRejected?: ErrorInterceptor\n ): number => {\n const id = this.nextId++;\n this.responseInterceptors.set(id, {\n fulfilled: onFulfilled,\n rejected: onRejected,\n });\n return id;\n },\n eject: (id: number): void => {\n this.responseInterceptors.delete(id);\n },\n };\n\n async executeRequestInterceptors(\n config: HttpRequestConfig\n ): Promise<HttpRequestConfig> {\n let result = config;\n for (const interceptor of this.requestInterceptors.values()) {\n result = await interceptor(result);\n }\n return result;\n }\n\n async executeResponseInterceptors(\n response: HttpResponse\n ): Promise<HttpResponse> {\n let result = response;\n for (const { fulfilled } of this.responseInterceptors.values()) {\n if (fulfilled) {\n result = await fulfilled(result);\n }\n }\n return result;\n }\n\n async executeErrorInterceptors(error: unknown): Promise<unknown> {\n let result = error;\n for (const { rejected } of this.responseInterceptors.values()) {\n if (rejected) {\n result = await rejected(result);\n }\n }\n return result;\n }\n}\n","import { createErrorWithContext, getHttpStatusCode } from '../../errors';\nimport {\n HttpAdapter,\n HttpRequestConfig,\n HttpResponse,\n createHttpAdapter,\n} from '../../utils/http';\nimport { AuthManager } from './auth-manager';\nimport { ClientConfig } from './config';\nimport { InterceptorManagerImpl } from './interceptors';\n\nexport class BaseClient {\n private httpAdapter: HttpAdapter;\n private authManager: AuthManager;\n private interceptors: InterceptorManagerImpl;\n private config: ClientConfig;\n\n constructor(config: ClientConfig, authManager: AuthManager) {\n this.config = config;\n this.authManager = authManager;\n this.httpAdapter = createHttpAdapter();\n this.interceptors = new InterceptorManagerImpl();\n\n this.setupDefaultInterceptors();\n }\n\n private setupDefaultInterceptors(): void {\n // Default request interceptor - add auth headers\n this.interceptors.request.use((config) => {\n const authHeaders = this.authManager.getAuthHeaders();\n config.headers = {\n ...config.headers,\n ...authHeaders,\n ...this.config.headers,\n };\n return config;\n });\n\n // Default response interceptor - handle common errors\n this.interceptors.response.use(\n (response) => {\n if (this.config.debug) {\n // eslint-disable-next-line no-console\n console.log('HTTP Response:', response);\n }\n return response;\n },\n (error) => {\n return this.handleError(error);\n }\n );\n }\n\n private handleError(error: unknown): never {\n if (this.config.debug) {\n // eslint-disable-next-line no-console\n console.error('HTTP Error:', error);\n }\n\n // Check if it's already our wrapped error\n if (\n error instanceof Error &&\n (error as Error & { context?: unknown }).context\n ) {\n throw error;\n }\n\n const statusCode = getHttpStatusCode(error);\n\n // Network errors (no response)\n if (!statusCode) {\n throw createErrorWithContext('Network request failed', {\n name: 'NetworkError',\n originalError: error,\n });\n }\n\n // API errors with status codes\n const errorData =\n (error as { response?: { data?: unknown }; data?: unknown }).response\n ?.data || (error as { data?: unknown }).data;\n const message =\n (errorData as { message?: string; error?: string })?.message ||\n (errorData as { message?: string; error?: string })?.error ||\n `HTTP ${statusCode} error`;\n\n throw createErrorWithContext(message, {\n name: 'ApiError',\n statusCode,\n response: errorData,\n isClientError: statusCode >= 400 && statusCode < 500,\n isServerError: statusCode >= 500,\n isAuthError: statusCode === 401 || statusCode === 403,\n isNotFoundError: statusCode === 404,\n isRateLimitError: statusCode === 429,\n });\n }\n\n async request<T = unknown>(\n config: HttpRequestConfig\n ): Promise<HttpResponse<T>> {\n let lastError: unknown;\n const maxRetries = this.config.maxRetries;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n // Add base URL if not absolute\n if (!config.url.startsWith('http')) {\n config.url = `${this.config.baseURL}${config.url}`;\n }\n\n // Set default timeout\n if (!config.timeout) {\n config.timeout = this.config.timeout;\n }\n\n // Execute request interceptors\n const requestConfig =\n await this.interceptors.executeRequestInterceptors(config);\n\n // Make the request\n const response = await this.httpAdapter.request<T>(requestConfig);\n\n // Check for HTTP errors (non-2xx status codes)\n if (response.status >= 400) {\n const error = createErrorWithContext(\n `HTTP ${response.status} error`,\n {\n name: 'ApiError',\n statusCode: response.status,\n response: response.data,\n statusText: response.statusText,\n }\n );\n throw await this.interceptors.executeErrorInterceptors(error);\n }\n\n // Execute response interceptors\n return (await this.interceptors.executeResponseInterceptors(\n response\n )) as HttpResponse<T>;\n } catch (error) {\n lastError = error;\n\n // Don't retry on client errors (4xx) or if we've exhausted retries\n if (attempt === maxRetries) {\n break;\n }\n\n const statusCode = getHttpStatusCode(error);\n if (statusCode && statusCode >= 400 && statusCode < 500) {\n // Don't retry client errors\n break;\n }\n\n // Wait before retrying (exponential backoff)\n if (attempt < maxRetries) {\n const delay = this.config.retryDelay * Math.pow(2, attempt);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n }\n\n // Execute error interceptors and throw the last error\n throw await this.interceptors.executeErrorInterceptors(lastError);\n }\n\n get<T = unknown>(\n url: string,\n config?: Partial<HttpRequestConfig>\n ): Promise<HttpResponse<T>> {\n return this.request<T>({ ...config, method: 'GET', url });\n }\n\n post<T = unknown>(\n url: string,\n data?: unknown,\n config?: Partial<HttpRequestConfig>\n ): Promise<HttpResponse<T>> {\n return this.request<T>({ ...config, method: 'POST', url, data });\n }\n\n put<T = unknown>(\n url: string,\n data?: unknown,\n config?: Partial<HttpRequestConfig>\n ): Promise<HttpResponse<T>> {\n return this.request<T>({ ...config, method: 'PUT', url, data });\n }\n\n patch<T = unknown>(\n url: string,\n data?: unknown,\n config?: Partial<HttpRequestConfig>\n ): Promise<HttpResponse<T>> {\n return this.request<T>({ ...config, method: 'PATCH', url, data });\n }\n\n delete<T = unknown>(\n url: string,\n config?: Partial<HttpRequestConfig>\n ): Promise<HttpResponse<T>> {\n return this.request<T>({ ...config, method: 'DELETE', url });\n }\n\n getInterceptors(): InterceptorManagerImpl {\n return this.interceptors;\n }\n\n updateConfig(updates: Partial<ClientConfig>): void {\n this.config = { ...this.config, ...updates };\n }\n\n getConfig(): ClientConfig {\n return { ...this.config };\n }\n}\n","export type Region = 'asia-south1' | 'us-central1';\nexport type Environment = 'local' | 'sit' | 'uat' | 'prod';\n\nexport interface EnvironmentConfig {\n baseURL: string;\n timeout: number;\n retryAttempts?: number;\n debug?: boolean;\n}\n\nexport const REGION_CONFIGS: Record<\n Region,\n Record<Environment, EnvironmentConfig>\n> = {\n 'asia-south1': {\n local: {\n baseURL: 'http://localhost:8000',\n timeout: 30000,\n debug: true,\n },\n sit: {\n baseURL: 'https://asia-south1.api.fcz0.de/service/sdk/boltic-tables',\n timeout: 15000,\n },\n uat: {\n baseURL: 'https://asia-south1.api.uat.fcz0.de/service/sdk/boltic-tables',\n timeout: 15000,\n },\n prod: {\n baseURL: 'https://asia-south1.api.boltic.io/service/sdk/boltic-tables',\n timeout: 10000,\n },\n },\n 'us-central1': {\n local: {\n baseURL: 'http://localhost:8000',\n timeout: 30000,\n debug: true,\n },\n sit: {\n baseURL: 'https://us-central1.api.fcz0.de/service/sdk/boltic-tables',\n timeout: 15000,\n },\n uat: {\n baseURL: 'https://us-central1.api.uat.fcz0.de/service/sdk/boltic-tables',\n timeout: 15000,\n },\n prod: {\n baseURL: 'https://us-central1.api.boltic.io/service/sdk/boltic-tables',\n timeout: 10000,\n },\n },\n};\n\n// Legacy support - default to asia-south1\nexport const ENV_CONFIGS: Record<Environment, EnvironmentConfig> =\n REGION_CONFIGS['asia-south1'];\n","import {\n Environment,\n EnvironmentConfig,\n Region,\n REGION_CONFIGS,\n} from '../../types/config/environment';\n\nexport interface ClientConfig extends EnvironmentConfig {\n apiKey: string;\n environment: Environment;\n region: Region;\n headers?: Record<string, string>;\n retryAttempts: number;\n retryDelay: number;\n maxRetries: number;\n}\n\nexport class ConfigManager {\n private config: ClientConfig;\n\n constructor(\n apiKey: string,\n environment: Environment = 'prod',\n region: Region = 'asia-south1',\n overrides?: Partial<\n EnvironmentConfig & {\n retryAttempts?: number;\n retryDelay?: number;\n maxRetries?: number;\n headers?: Record<string, string>;\n }\n >\n ) {\n const envConfig = REGION_CONFIGS[region][environment];\n this.config = {\n apiKey,\n environment,\n region,\n retryAttempts: 3,\n retryDelay: 1000,\n maxRetries: 3,\n debug: false,\n headers: {},\n ...envConfig,\n ...overrides,\n };\n }\n\n getConfig(): ClientConfig {\n return { ...this.config };\n }\n\n updateConfig(updates: Partial<ClientConfig>): void {\n this.config = { ...this.config, ...updates };\n }\n\n // Security methods to prevent API key exposure\n toString(): string {\n return `ConfigManager { environment: \"${this.config.environment}\", region: \"${this.config.region}\", debug: ${this.config.debug} }`;\n }\n\n toJSON(): object {\n const safeConfig = { ...this.config };\n delete (safeConfig as Record<string, unknown>).apiKey;\n return safeConfig;\n }\n\n // Custom inspect method for Node.js console logging\n [Symbol.for('nodejs.util.inspect.custom')](): string {\n return this.toString();\n }\n}\n","/**\n * Common utility functions for the Boltic SDK\n */\n\n/**\n * Filters an object to only include specified fields\n * @param obj - The object to filter\n * @param fields - Array of field names to include. If empty or undefined, returns the original object\n * @returns Filtered object with only the specified fields\n */\nexport function filterObjectFields<T extends Record<string, unknown>>(\n obj: T,\n fields?: string[]\n): Partial<T> {\n // If no fields specified or empty array, return original object\n if (!fields || fields.length === 0) {\n return obj;\n }\n\n // Filter the object to only include specified fields\n const filtered: Partial<T> = {};\n for (const field of fields) {\n if (field in obj) {\n (filtered as Record<string, unknown>)[field] = obj[field];\n }\n }\n\n return filtered;\n}\n\n/**\n * Filters an array of objects to only include specified fields\n * @param arr - Array of objects to filter\n * @param fields - Array of field names to include. If empty or undefined, returns the original array\n * @returns Array of filtered objects with only the specified fields\n */\nexport function filterArrayFields<T extends Record<string, unknown>>(\n arr: T[],\n fields?: string[]\n): Partial<T>[] {\n // If no fields specified or empty array, return original array\n if (!fields || fields.length === 0) {\n return arr;\n }\n\n // Filter each object in the array\n return arr.map((obj) => filterObjectFields(obj, fields));\n}\n","export interface ApiEndpoint {\n path: string;\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n authenticated: boolean;\n rateLimit?: {\n requests: number;\n window: number; // in milliseconds\n };\n}\n\nexport interface ColumnEndpoints {\n list: ApiEndpoint;\n create: ApiEndpoint;\n get: ApiEndpoint;\n update: ApiEndpoint;\n delete: ApiEndpoint;\n}\n\nexport const COLUMN_ENDPOINTS: ColumnEndpoints = {\n list: {\n path: '/tables/{table_id}/fields/list',\n method: 'POST',\n authenticated: true,\n rateLimit: { requests: 200, window: 60000 },\n },\n create: {\n path: '/tables/{table_id}/fields',\n method: 'POST',\n authenticated: true,\n },\n get: {\n path: '/tables/{table_id}/fields/{field_id}',\n method: 'GET',\n authenticated: true,\n rateLimit: { requests: 300, window: 60000 },\n },\n update: {\n path: '/tables/{table_id}/fields/{field_id}',\n method: 'PATCH',\n authenticated: true,\n },\n delete: {\n path: '/tables/{table_id}/fields/{field_id}',\n method: 'DELETE',\n authenticated: true,\n },\n};\n\nexport const buildEndpointPath = (\n endpoint: ApiEndpoint,\n params: Record<string, string> = {}\n): string => {\n let path = endpoint.path;\n\n // Replace path parameters\n Object.entries(params).forEach(([key, value]) => {\n path = path.replace(`{${key}}`, encodeURIComponent(value));\n });\n\n // Check for unreplaced parameters\n const unreplacedParams = path.match(/\\{([^}]+)\\}/g);\n if (unreplacedParams) {\n throw new Error(`Missing path parameters: ${unreplacedParams.join(', ')}`);\n }\n\n return path;\n};\n","import { FieldDefinition, FieldType } from './table';\n\n// Alignment types\nexport type AlignmentType = 'left' | 'center' | 'right';\n\n// Decimal types for number and currency fields\nexport type DecimalType =\n | '00'\n | '0.0'\n | '0.00'\n | '0.000'\n | '0.0000'\n | '0.00000'\n | '0.000000';\n\n// Phone format types\nexport type PhoneFormatType =\n | '+91 123 456 7890'\n | '(123) 456-7890'\n | '+1 (123) 456-7890'\n | '+91 12 3456 7890';\n\n// Date format enum for user-friendly values\nexport const DateFormatEnum = Object.freeze({\n MMDDYY: '%m/%d/%y',\n MMDDYYYY: '%m/%d/%Y',\n MM_DD_YYYY: '%m-%d-%Y',\n DD_MM_YYYY: '%d-%m-%Y',\n DDMMYYYY: '%d/%m/%Y',\n DDMMYY: '%d/%m/%y',\n YYYY_MM_DD: '%Y-%m-%d',\n MMMM__DD__YYYY: '%B %d %Y',\n MMM__DD__YYYY: '%b %d %Y',\n ddd__MMM__DD__YYYY: '%a %b %d %Y',\n});\n\n// Time format enum for user-friendly values\nexport const TimeFormatEnum = Object.freeze({\n HH_mm_ss: '%H:%M:%S',\n HH_mm_ssZ: '%H:%M:%SZ',\n HH_mm_ss_SSS: '%H:%M:%S.%f',\n HH_mm_ss__Z: '%H:%M:%S %Z',\n HH_mm__AMPM: '%I:%M %p', // 12-hour format with AM/PM\n HH_mm_ss__AMPM: '%I:%M:%S %p',\n});\n\n// Field type enum for validation\nexport enum FieldTypeEnum {\n TEXT = 'text',\n EMAIL = 'email',\n LONG_TEXT = 'long-text',\n DATE_TIME = 'date-time',\n NUMBER = 'number',\n CURRENCY = 'currency',\n CHECKBOX = 'checkbox',\n DROPDOWN = 'dropdown',\n PHONE_NUMBER = 'phone-number',\n LINK = 'link',\n JSON = 'json',\n VECTOR = 'vector',\n SPARSEVECTOR = 'sparsevec',\n HALFVECTOR = 'halfvec',\n}\n\n// Allowed field type conversions\nexport const ALLOWED_FIELD_TYPE_CONVERSIONS = {\n [FieldTypeEnum.TEXT]: [\n FieldTypeEnum.EMAIL,\n FieldTypeEnum.LONG_TEXT,\n FieldTypeEnum.DATE_TIME,\n FieldTypeEnum.NUMBER,\n FieldTypeEnum.CURRENCY,\n FieldTypeEnum.CHECKBOX,\n FieldTypeEnum.PHONE_NUMBER,\n FieldTypeEnum.LINK,\n FieldTypeEnum.JSON,\n FieldTypeEnum.VECTOR,\n FieldTypeEnum.SPARSEVECTOR,\n FieldTypeEnum.HALFVECTOR,\n ],\n [FieldTypeEnum.EMAIL]: [\n FieldTypeEnum.TEXT,\n FieldTypeEnum.LONG_TEXT,\n FieldTypeEnum.DATE_TIME,\n FieldTypeEnum.NUMBER,\n FieldTypeEnum.CURRENCY,\n FieldTypeEnum.CHECKBOX,\n FieldTypeEnum.PHONE_NUMBER,\n FieldTypeEnum.LINK,\n FieldTypeEnum.JSON,\n FieldTypeEnum.VECTOR,\n FieldTypeEnum.SPARSEVECTOR,\n FieldTypeEnum.HALFVECTOR,\n ],\n [FieldTypeEnum.LONG_TEXT]: [\n FieldTypeEnum.TEXT,\n FieldTypeEnum.EMAIL,\n FieldTypeEnum.DATE_TIME,\n FieldTypeEnum.NUMBER,\n FieldTypeEnum.CURRENCY,\n FieldTypeEnum.CHECKBOX,\n FieldTypeEnum.PHONE_NUMBER,\n FieldTypeEnum.LINK,\n FieldTypeEnum.JSON,\n FieldTypeEnum.VECTOR,\n FieldTypeEnum.SPARSEVECTOR,\n FieldTypeEnum.HALFVECTOR,\n ],\n [FieldTypeEnum.DATE_TIME]: [\n FieldTypeEnum.TEXT,\n FieldTypeEnum.EMAIL,\n FieldTypeEnum.LONG_TEXT,\n FieldTypeEnum.PHONE_NUMBER,\n FieldTypeEnum.LINK,\n ],\n [FieldTypeEnum.NUMBER]: [\n FieldTypeEnum.TEXT,\n FieldTypeEnum.EMAIL,\n FieldTypeEnum.LONG_TEXT,\n FieldTypeEnum.CURRENCY,\n FieldTypeEnum.PHONE_NUMBER,\n FieldTypeEnum.LINK,\n ],\n [FieldTypeEnum.CURRENCY]: [\n FieldTypeEnum.TEXT,\n FieldTypeEnum.EMAIL,\n FieldTypeEnum.LONG_TEXT,\n FieldTypeEnum.NUMBER,\n FieldTypeEnum.PHONE_NUMBER,\n FieldTypeEnum.LINK,\n ],\n [FieldTypeEnum.CHECKBOX]: [\n FieldTypeEnum.TEXT,\n FieldTypeEnum.EMAIL,\n FieldTypeEnum.LONG_TEXT,\n FieldTypeEnum.PHONE_NUMBER,\n FieldTypeEnum.LINK,\n ],\n [FieldTypeEnum.DROPDOWN]: [],\n [FieldTypeEnum.PHONE_NUMBER]: [\n FieldTypeEnum.TEXT,\n FieldTypeEnum.EMAIL,\n FieldTypeEnum.LONG_TEXT,\n FieldTypeEnum.DATE_TIME,\n FieldTypeEnum.NUMBER,\n FieldTypeEnum.CURRENCY,\n FieldTypeEnum.CHECKBOX,\n FieldTypeEnum.LINK,\n FieldTypeEnum.JSON,\n FieldTypeEnum.VECTOR,\n FieldTypeEnum.SPARSEVECTOR,\n FieldTypeEnum.HALFVECTOR,\n ],\n [FieldTypeEnum.LINK]: [\n FieldTypeEnum.TEXT,\n FieldTypeEnum.EMAIL,\n FieldTypeEnum.LONG_TEXT,\n FieldTypeEnum.NUMBER,\n FieldTypeEnum.CURRENCY,\n FieldTypeEnum.CHECKBOX,\n FieldTypeEnum.PHONE_NUMBER,\n FieldTypeEnum.JSON,\n FieldTypeEnum.VECTOR,\n FieldTypeEnum.SPARSEVECTOR,\n FieldTypeEnum.HALFVECTOR,\n ],\n [FieldTypeEnum.JSON]: [\n FieldTypeEnum.TEXT,\n FieldTypeEnum.EMAIL,\n FieldTypeEnum.LONG_TEXT,\n FieldTypeEnum.PHONE_NUMBER,\n FieldTypeEnum.LINK,\n ],\n [FieldTypeEnum.VECTOR]: [\n FieldTypeEnum.TEXT,\n FieldTypeEnum.EMAIL,\n FieldTypeEnum.LONG_TEXT,\n FieldTypeEnum.PHONE_NUMBER,\n FieldTypeEnum.LINK,\n FieldTypeEnum.HALFVECTOR,\n FieldTypeEnum.SPARSEVECTOR,\n FieldTypeEnum.VECTOR,\n ],\n [FieldTypeEnum.SPARSEVECTOR]: [\n FieldTypeEnum.TEXT,\n FieldTypeEnum.EMAIL,\n FieldTypeEnum.LONG_TEXT,\n FieldTypeEnum.PHONE_NUMBER,\n FieldTypeEnum.LINK,\n FieldTypeEnum.VECTOR,\n FieldTypeEnum.HALFVECTOR,\n FieldTypeEnum.SPARSEVECTOR,\n ],\n [FieldTypeEnum.HALFVECTOR]: [\n FieldTypeEnum.TEXT,\n FieldTypeEnum.EMAIL,\n FieldTypeEnum.LONG_TEXT,\n FieldTypeEnum.PHONE_NUMBER,\n FieldTypeEnum.LINK,\n FieldTypeEnum.VECTOR,\n FieldTypeEnum.SPARSEVECTOR,\n FieldTypeEnum.HALFVECTOR,\n ],\n};\n\n// Field-specific validation keys map\nexport const FIELD_SPECIFIC_KEYS_MAP = {\n [FieldTypeEnum.TEXT]: [],\n [FieldTypeEnum.EMAIL]: [],\n [FieldTypeEnum.LONG_TEXT]: [],\n [FieldTypeEnum.NUMBER]: ['decimals'],\n [FieldTypeEnum.CURRENCY]: ['decimals', 'currency_format'],\n [FieldTypeEnum.CHECKBOX]: [],\n [FieldTypeEnum.DROPDOWN]: [\n 'selection_source',\n 'selectable_items',\n 'multiple_selections',\n ],\n [FieldTypeEnum.DATE_TIME]: ['timezone', 'date_format', 'time_format'],\n [FieldTypeEnum.PHONE_NUMBER]: ['phone_format'],\n [FieldTypeEnum.LINK]: [],\n [FieldTypeEnum.JSON]: [],\n [FieldTypeEnum.VECTOR]: ['vector_dimension'],\n [FieldTypeEnum.SPARSEVECTOR]: ['vector_dimension'],\n [FieldTypeEnum.HALFVECTOR]: ['vector_dimension'],\n};\n\nexport interface ColumnCreateRequest {\n columns: FieldDefinition[];\n fields?: Array<keyof ColumnDetails>;\n}\n\nexport interface ColumnUpdateRequest {\n name?: string;\n type?: FieldType;\n description?: string;\n is_nullable?: boolean;\n is_unique?: boolean;\n is_indexed?: boolean;\n is_visible?: boolean;\n is_primary_key?: boolean;\n is_readonly?: boolean;\n default_value?: unknown;\n field_order?: number;\n fields?: Array<keyof ColumnDetails>;\n\n // Type-specific properties that can be updated\n alignment?: AlignmentType;\n decimals?: DecimalType;\n currency_format?: string; // Use Currency API for validation\n selection_source?: 'provide-static-list';\n selectable_items?: string[];\n multiple_selections?: boolean;\n phone_format?: PhoneFormatType;\n date_format?: keyof typeof DateFormatEnum;\n time_format?: keyof typeof TimeFormatEnum;\n timezone?: string;\n vector_dimension?: number;\n}\n\nexport interface ColumnRecord {\n id: string;\n}\n\n// Full column details interface for when complete column data is returned\nexport interface ColumnDetails {\n id: string;\n name: string;\n table_id: string;\n type: FieldType;\n description?: string;\n is_nullable: boolean;\n is_primary_key: boolean;\n is_unique: boolean;\n is_indexed: boolean;\n is_visible: boolean;\n is_readonly: boolean;\n field_order: number;\n default_value?: unknown;\n created_at: string;\n updated_at: string;\n\n // Type-specific properties\n alignment?: AlignmentType;\n timezone?: string;\n date_format?: string;\n time_format?: string;\n decimals?: number | string;\n currency_format?: string;\n selection_source?: string;\n selectable_items?: string[];\n multiple_selections?: boolean;\n phone_format?: string;\n vector_dimension?: number;\n}\n\nexport interface ColumnQueryOptions {\n where?: {\n id?: string;\n name?: string;\n table_id?: string;\n type?: FieldType;\n is_nullable?: boolean;\n is_unique?: boolean;\n is_indexed?: boolean;\n is_primary_key?: boolean;\n };\n fields?: Array<keyof ColumnDetails>;\n sort?: Array<{\n field: keyof ColumnDetails;\n order: 'asc' | 'desc';\n }>;\n limit?: number;\n offset?: number;\n}\n\nexport interface ColumnDeleteOptions {\n where: {\n id?: string;\n name?: string;\n };\n}\n\nexport interface ColumnListResponse {\n columns: ColumnDetails[];\n pagination: {\n total: number;\n page: number;\n limit: number;\n pages: number;\n };\n}\n\nexport interface ColumnUpdateOptions {\n set: ColumnUpdateRequest;\n where: {\n id?: string;\n name?: string;\n };\n}\n","import {\n ColumnDetails,\n ColumnQueryOptions,\n ColumnRecord,\n ColumnUpdateRequest,\n DateFormatEnum,\n TimeFormatEnum,\n} from '../../types/api/column';\nimport { FieldDefinition, FieldType } from '../../types/api/table';\nimport { ApiFilter } from '../../utils/filters/filter-mapper';\n\nexport interface ColumnCreateApiRequest {\n field: FieldDefinition;\n}\n\nexport interface ColumnListApiRequest {\n page?: {\n page_no: number;\n page_size: number;\n };\n sort?: Array<{\n field: string;\n direction: 'asc' | 'desc';\n }>;\n filters?: ApiFilter[];\n}\n\nexport interface ColumnUpdateApiRequest {\n id?: string;\n name?: string;\n type?: string;\n description?: string;\n is_nullable?: boolean;\n is_unique?: boolean;\n is_indexed?: boolean;\n is_primary_key?: boolean;\n is_visible?: boolean;\n is_readonly?: boolean;\n default_value?: unknown;\n field_order?: number;\n alignment?: 'left' | 'center' | 'right';\n decimals?: string;\n currency_format?: string;\n selection_source?: string;\n selectable_items?: string[];\n multiple_selections?: boolean;\n phone_format?: string;\n date_format?: string;\n time_format?: string;\n timezone?: string;\n vector_dimension?: number;\n}\n\nexport interface ColumnApiResponse {\n data: {\n id: string;\n name: string;\n original_name: string;\n table_id: string;\n table_name: string;\n type: string;\n description?: string;\n is_nullable: boolean;\n is_primary_key: boolean;\n is_unique: boolean;\n is_indexed: boolean;\n is_visible: boolean;\n is_readonly: boolean;\n field_order: number;\n default_value?: unknown;\n created_at: string;\n updated_at: string;\n alignment?: string;\n timezone?: string;\n date_format?: string;\n time_format?: string;\n decimals?: string;\n currency_format?: string;\n selection_source?: string;\n selectable_items?: string[];\n multiple_selections?: boolean;\n phone_format?: string;\n vector_dimension?: number;\n };\n}\n\nexport interface ColumnListApiResponse {\n data: ColumnDetails[];\n pagination: {\n total_count: number;\n total_pages: number;\n current_page: number;\n per_page: number;\n type: string;\n };\n}\n\n/**\n * Transform SDK column create request to API format\n */\nexport function transformColumnCreateRequest(\n request: FieldDefinition\n): FieldDefinition {\n // Validate the single column data\n if (!request || typeof request !== 'object') {\n throw new Error('Invalid request: single column data is required');\n }\n\n if (!request.name || !request.type) {\n throw new Error('Column name and type are required');\n }\n\n // Transform the single column\n return transformFieldDefinition(request);\n}\n\n/**\n * Transform field definition to API format\n */\nfunction transformFieldDefinition(field: FieldDefinition): FieldDefinition {\n return {\n name: field.name,\n type: field.type,\n is_nullable: field.is_nullable ?? true,\n is_primary_key: field.is_primary_key ?? false,\n is_unique: field.is_unique ?? false,\n is_visible: field.is_visible ?? true,\n is_readonly: field.is_readonly ?? false,\n is_indexed: field.is_indexed ?? false,\n field_order: field.field_order ?? 1,\n alignment: field.alignment ?? 'left',\n timezone: field.timezone ?? undefined,\n date_format: field.date_format\n ? transformDateFormat(field.date_format as keyof typeof DateFormatEnum)\n : undefined,\n time_format: field.time_format\n ? transformTimeFormat(field.time_format as keyof typeof TimeFormatEnum)\n : undefined,\n decimals: field.decimals ?? undefined,\n currency_format: field.currency_format ?? undefined,\n selection_source:\n field.type === 'dropdown' && !field.selection_source\n ? 'provide-static-list'\n : (field.selection_source ?? undefined),\n selectable_items: field.selectable_items ?? undefined,\n multiple_selections: field.multiple_selections ?? undefined,\n phone_format: field.phone_format ?? undefined,\n vector_dimension: field.vector_dimension ?? undefined,\n description: field.description ?? undefined,\n default_value: field.default_value ?? undefined,\n };\n}\n\n/**\n * Transform SDK column list request to API format\n */\nexport function transformColumnListRequest(\n options: ColumnQueryOptions & {\n page?: number;\n pageSize?: number;\n } = {}\n): ColumnListApiRequest {\n const request: ColumnListApiRequest = {};\n\n // Add pagination\n if (options.page !== undefined || options.pageSize !== undefined) {\n request.page = {\n page_no: options.page || 1,\n page_size: options.pageSize || 1000,\n };\n }\n\n // Add sorting\n if (options.sort?.length) {\n request.sort = options.sort.map((s) => ({\n field: s.field as string,\n direction: s.order,\n }));\n }\n\n // Add filters\n if (options.where) {\n const filters: ApiFilter[] = [];\n\n Object.entries(options.where).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n filters.push({\n field: key,\n operator: '=',\n values: [value],\n });\n }\n });\n\n if (filters.length > 0) {\n request.filters = filters;\n }\n }\n\n return request;\n}\n\n/**\n * Transform SDK column update request to API format\n */\nexport function transformColumnUpdateRequest(\n updates: ColumnUpdateRequest\n): ColumnUpdateApiRequest {\n const apiRequest: ColumnUpdateApiRequest = {};\n\n if (updates.name !== undefined) apiRequest.name = updates.name;\n if (updates.type !== undefined) apiRequest.type = updates.type;\n if (updates.description !== undefined)\n apiRequest.description = updates.description;\n if (updates.is_nullable !== undefined)\n apiRequest.is_nullable = updates.is_nullable;\n if (updates.is_unique !== undefined) apiRequest.is_unique = updates.is_unique;\n if (updates.is_primary_key !== undefined)\n apiRequest.is_primary_key = updates.is_primary_key;\n if (updates.is_indexed !== undefined)\n apiRequest.is_indexed = updates.is_indexed;\n if (updates.is_visible !== undefined)\n apiRequest.is_visible = updates.is_visible;\n if (updates.is_readonly !== undefined)\n apiRequest.is_readonly = updates.is_readonly;\n if (updates.default_value !== undefined)\n apiRequest.default_value = updates.default_value;\n if (updates.field_order !== undefined)\n apiRequest.field_order = updates.field_order;\n\n // Type-specific fields\n if (updates.alignment !== undefined) apiRequest.alignment = updates.alignment;\n if (updates.decimals !== undefined) apiRequest.decimals = updates.decimals;\n if (updates.currency_format !== undefined)\n apiRequest.currency_format = updates.currency_format;\n\n // Handle selection_source for dropdown columns\n // Set to \"provide-static-list\" when:\n // 1. Changing type to dropdown\n // 2. Updating selectable_items (implies dropdown behavior)\n // 3. Explicitly setting selection_source\n if (updates.type === 'dropdown') {\n // When changing type to dropdown, always set selection_source\n apiRequest.selection_source = 'provide-static-list';\n } else if (updates.selectable_items !== undefined) {\n // When updating selectable_items, ensure selection_source is set\n apiRequest.selection_source = 'provide-static-list';\n } else if (updates.selection_source !== undefined) {\n // When explicitly setting selection_source, use the provided value\n apiRequest.selection_source = updates.selection_source;\n }\n // If none of the above, don't modify selection_source (preserve existing)\n\n if (updates.selectable_items !== undefined)\n apiRequest.selectable_items = updates.selectable_items;\n if (updates.multiple_selections !== undefined)\n apiRequest.multiple_selections = updates.multiple_selections;\n if (updates.phone_format !== undefined)\n apiRequest.phone_format = updates.phone_format;\n if (updates.timezone !== undefined) apiRequest.timezone = updates.timezone;\n if (updates.vector_dimension !== undefined)\n apiRequest.vector_dimension = updates.vector_dimension;\n\n // Transform date and time formats\n if (updates.date_format !== undefined) {\n apiRequest.date_format = transformDateFormat(updates.date_format);\n }\n if (updates.time_format !== undefined) {\n apiRequest.time_format = transformTimeFormat(updates.time_format);\n }\n\n return apiRequest;\n}\n\n/**\n * Transform API column response to SDK format\n */\nexport function transformColumnResponse(\n response: ColumnApiResponse\n): ColumnDetails {\n return {\n id: response.data.id,\n name: response.data.name,\n table_id: response.data.table_id,\n type: response.data.type as FieldType,\n description: response.data.description,\n is_nullable: response.data.is_nullable,\n is_primary_key: response.data.is_primary_key,\n is_unique: response.data.is_unique,\n is_indexed: response.data.is_indexed,\n is_visible: response.data.is_visible,\n is_readonly: response.data.is_readonly,\n field_order: response.data.field_order,\n default_value: response.data.default_value,\n created_at: response.data.created_at,\n updated_at: response.data.updated_at,\n alignment: response.data.alignment as 'left' | 'center' | 'right',\n timezone: response.data.timezone,\n date_format: response.data.date_format,\n time_format: response.data.time_format,\n decimals: response.data.decimals,\n currency_format: response.data.currency_format,\n selection_source: response.data.selection_source,\n selectable_items: response.data.selectable_items,\n multiple_selections: response.data.multiple_selections,\n phone_format: response.data.phone_format,\n vector_dimension: response.data.vector_dimension,\n };\n}\n\n/**\n * Transform API column create response to SDK format\n * For create operations, the API returns only the id\n */\nexport function transformColumnCreateResponse(response: {\n data: { id: string };\n message?: string;\n}): ColumnRecord {\n return {\n id: response.data.id,\n };\n}\n\n/**\n * Transform API column list response to SDK format\n */\nexport function transformColumnListResponse(response: ColumnListApiResponse): {\n columns: ColumnDetails[];\n pagination: {\n total_count: number;\n total_pages: number;\n current_page: number;\n per_page: number;\n type: string;\n };\n} {\n return {\n columns: response.data,\n pagination: {\n total_count: response.pagination?.total_count,\n total_pages: response.pagination?.total_pages,\n current_page: response.pagination?.current_page,\n per_page: response.pagination?.per_page,\n type: response.pagination?.type,\n },\n };\n}\n\n/**\n * Transform date format from user-friendly enum to API format\n */\nfunction transformDateFormat(dateFormat: keyof typeof DateFormatEnum): string {\n return DateFormatEnum[dateFormat] || dateFormat;\n}\n\n/**\n * Transform time format from user-friendly enum to API format\n */\nfunction transformTimeFormat(timeFormat: keyof typeof TimeFormatEnum): string {\n return TimeFormatEnum[timeFormat] || timeFormat;\n}\n","import {\n ColumnCreateRequest,\n ColumnDetails,\n ColumnQueryOptions,\n ColumnRecord,\n ColumnUpdateRequest,\n} from '../../types/api/column';\nimport { FieldDefinition } from '../../types/api/table';\nimport type { Environment, Region } from '../../types/config/environment';\nimport { REGION_CONFIGS } from '../../types/config/environment';\nimport { filterArrayFields, filterObjectFields } from '../../utils/common';\nimport { createHttpAdapter } from '../../utils/http';\nimport { HttpAdapter } from '../../utils/http/adapter';\nimport { buildEndpointPath, COLUMN_ENDPOINTS } from '../endpoints/columns';\nimport {\n transformColumnCreateRequest,\n transformColumnUpdateRequest,\n} from '../transformers/columns';\n\nexport interface ColumnsApiClientConfig {\n apiKey: string;\n environment?: Environment;\n region?: Region;\n timeout?: number;\n debug?: boolean;\n retryAttempts?: number;\n retryDelay?: number;\n headers?: Record<string, string>;\n}\n\nexport interface ColumnListOptions extends ColumnQueryOptions {\n page?: number;\n pageSize?: number;\n}\n\n// API request format interfaces\nexport interface ApiFilter {\n field: string;\n operator: string;\n values: unknown[];\n}\n\nexport interface ApiSort {\n field: string;\n direction: 'asc' | 'desc';\n}\n\nexport interface ColumnApiListRequest {\n page: {\n page_no: number;\n page_size: number;\n };\n filters: ApiFilter[];\n sort: ApiSort[];\n}\n\n// Boltic API Response Structure interfaces\ninterface BolticSuccessResponse<T = unknown> {\n data: T;\n message?: string;\n}\n\ninterface BolticListResponse<T = unknown> {\n data: T[];\n pagination?: {\n total_count: number;\n total_pages: number;\n current_page: number;\n per_page: number;\n type: string;\n };\n message?: string;\n}\n\ninterface BolticErrorResponse {\n data?: never;\n error: {\n code?: string;\n message?: string;\n meta?: string[];\n };\n}\n\n/**\n * Columns API Client - handles all column-related API operations\n */\nexport class ColumnsApiClient {\n private httpAdapter: HttpAdapter;\n private config: ColumnsApiClientConfig;\n private baseURL: string;\n\n constructor(\n apiKey: string,\n config: Omit<ColumnsApiClientConfig, 'apiKey'> = {}\n ) {\n this.config = { apiKey, ...config };\n this.httpAdapter = createHttpAdapter();\n\n // Set baseURL based on environment and region\n const environment = config.environment || 'prod';\n const region = config.region || 'asia-south1'; // Default to asia-south1 for legacy support\n this.baseURL = this.getBaseURL(environment, region);\n }\n\n private getBaseURL(environment: Environment, region: Region): string {\n const regionConfig = REGION_CONFIGS[region];\n if (!regionConfig) {\n throw new Error(`Unsupported region: ${region}`);\n }\n\n const envConfig = regionConfig[environment];\n if (!envConfig) {\n throw new Error(\n `Unsupported environment: ${environment} for region: ${region}`\n );\n }\n\n return `${envConfig.baseURL}/v1`;\n }\n\n /**\n * Create a single column in a table\n */\n async createColumn(\n tableId: string,\n request: FieldDefinition\n ): Promise<BolticSuccessResponse<ColumnRecord> | BolticErrorResponse> {\n try {\n const endpoint = COLUMN_ENDPOINTS.create;\n const url = `${this.baseURL}${buildEndpointPath(endpoint, { table_id: tableId })}`;\n\n // Transform the request to ensure proper formatting (e.g., selection_source for dropdowns)\n const transformedRequest = transformColumnCreateRequest(request);\n\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n data: transformedRequest,\n timeout: this.config.timeout,\n });\n\n if (this.config.debug) {\n console.log(\n 'Column API Response:',\n JSON.stringify(response.data, null, 2)\n );\n }\n\n // Return raw response without transformation\n return response.data as BolticSuccessResponse<ColumnRecord>;\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n /**\n * Create multiple columns in a table (one by one)\n */\n async createColumns(\n tableId: string,\n request: ColumnCreateRequest\n ): Promise<BolticListResponse<ColumnRecord> | BolticErrorResponse> {\n try {\n const columns = request.columns;\n const createdColumns: ColumnRecord[] = [];\n\n for (const column of columns) {\n const result = await this.createColumn(tableId, column);\n\n if ('error' in result) {\n return result;\n }\n\n createdColumns.push(result.data);\n }\n\n // Apply field filtering if fields are specified\n if (request.fields && createdColumns.length > 0) {\n const filteredColumns = filterArrayFields(\n createdColumns as unknown as Record<string, unknown>[],\n request.fields as string[]\n ) as unknown as ColumnRecord[];\n createdColumns.splice(0, createdColumns.length, ...filteredColumns);\n }\n\n // Return in Boltic list format\n return {\n data: createdColumns,\n message: 'Columns created successfully',\n };\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n /**\n * List columns in a table with filtering and pagination\n */\n async listColumns(\n tableId: string,\n options: ColumnListOptions = {}\n ): Promise<BolticListResponse<ColumnDetails> | BolticErrorResponse> {\n try {\n const endpoint = COLUMN_ENDPOINTS.list;\n const url = `${this.baseURL}${buildEndpointPath(endpoint, { table_id: tableId })}?no_cache=true`;\n\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n data: options,\n timeout: this.config.timeout,\n });\n\n // Apply field filtering if fields are specified\n const responseData = response.data as BolticListResponse<ColumnDetails>;\n if (options.fields && responseData.data) {\n responseData.data = filterArrayFields(\n responseData.data as unknown as Record<string, unknown>[],\n options.fields as string[]\n ) as unknown as ColumnDetails[];\n }\n\n return responseData;\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n /**\n * Get a single column by ID\n */\n async getColumn(\n tableId: string,\n columnId: string,\n options: { fields?: Array<keyof ColumnDetails> } = {}\n ): Promise<BolticSuccessResponse<ColumnDetails> | BolticErrorResponse> {\n try {\n const endpoint = COLUMN_ENDPOINTS.get;\n const url = `${this.baseURL}${buildEndpointPath(endpoint, {\n table_id: tableId,\n field_id: columnId,\n })}`;\n\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n timeout: this.config.timeout,\n });\n\n if (this.config.debug) {\n console.log(\n 'Column API Response:',\n JSON.stringify(response.data, null, 2)\n );\n }\n\n // Apply field filtering if fields are specified\n const responseData =\n response.data as BolticSuccessResponse<ColumnDetails>;\n if (options.fields && responseData.data) {\n responseData.data = filterObjectFields(\n responseData.data as unknown as Record<string, unknown>,\n options.fields as string[]\n ) as unknown as ColumnDetails;\n }\n\n return responseData;\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n /**\n * Update a column\n */\n async updateColumn(\n tableId: string,\n columnId: string,\n updates: ColumnUpdateRequest\n ): Promise<BolticSuccessResponse<ColumnDetails> | BolticErrorResponse> {\n try {\n const endpoint = COLUMN_ENDPOINTS.update;\n const url = `${this.baseURL}${buildEndpointPath(endpoint, {\n table_id: tableId,\n field_id: columnId,\n })}`;\n\n // Transform the updates to API format\n const transformedUpdates = transformColumnUpdateRequest(updates);\n\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n data: transformedUpdates,\n timeout: this.config.timeout,\n });\n\n // Apply field filtering if fields are specified\n const responseData =\n response.data as BolticSuccessResponse<ColumnDetails>;\n if (updates.fields && responseData.data) {\n responseData.data = filterObjectFields(\n responseData.data as unknown as Record<string, unknown>,\n updates.fields as string[]\n ) as unknown as ColumnDetails;\n }\n\n return responseData;\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n /**\n * Delete a column\n */\n async deleteColumn(\n tableId: string,\n columnId: string\n ): Promise<BolticSuccessResponse<{ message: string }> | BolticErrorResponse> {\n try {\n const endpoint = COLUMN_ENDPOINTS.delete;\n const url = `${this.baseURL}${buildEndpointPath(endpoint, {\n table_id: tableId,\n field_id: columnId,\n })}`;\n\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n timeout: this.config.timeout,\n });\n\n // Return raw response without transformation\n return response.data as BolticSuccessResponse<{ message: string }>;\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n /**\n * Find column by name in a table\n */\n async findColumnByName(\n tableId: string,\n columnName: string\n ): Promise<\n BolticSuccessResponse<ColumnDetails | null> | BolticErrorResponse\n > {\n try {\n // Transform to API format\n const apiRequest = {\n page: { page_no: 1, page_size: 1 },\n filters: [\n {\n field: 'name',\n operator: '=',\n values: [columnName],\n },\n ],\n sort: [],\n };\n\n const listResult = await this.listColumns(\n tableId,\n apiRequest as unknown as ColumnListOptions\n );\n if ('error' in listResult) {\n return listResult;\n }\n const column = listResult.data[0] || null;\n return {\n data: column,\n message: column ? 'Column found' : 'Column not found',\n };\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n /**\n * Helper function to convert ColumnDetails to ColumnUpdateRequest format\n */\n private convertColumnDetailsToUpdateRequest(\n columnDetails: ColumnDetails\n ): Record<string, unknown> {\n return {\n name: columnDetails.name,\n type: columnDetails.type,\n description: columnDetails.description,\n is_nullable: columnDetails.is_nullable,\n is_unique: columnDetails.is_unique,\n is_indexed: columnDetails.is_indexed,\n is_visible: columnDetails.is_visible,\n is_primary_key: columnDetails.is_primary_key,\n is_readonly: columnDetails.is_readonly,\n default_value: columnDetails.default_value,\n field_order: columnDetails.field_order,\n alignment: columnDetails.alignment,\n decimals: columnDetails.decimals,\n currency_format: columnDetails.currency_format,\n selection_source: columnDetails.selection_source,\n selectable_items: columnDetails.selectable_items,\n multiple_selections: columnDetails.multiple_selections,\n phone_format: columnDetails.phone_format,\n date_format: columnDetails.date_format,\n time_format: columnDetails.time_format,\n timezone: columnDetails.timezone,\n vector_dimension: columnDetails.vector_dimension,\n };\n }\n\n /**\n * Update a column by name\n */\n async updateColumnByName(\n tableId: string,\n columnName: string,\n updates: ColumnUpdateRequest\n ): Promise<BolticSuccessResponse<ColumnDetails> | BolticErrorResponse> {\n try {\n // First find the column to get its current data\n const findResult = await this.findColumnByName(tableId, columnName);\n\n if ('error' in findResult) {\n return findResult;\n }\n\n if (!findResult.data) {\n return {\n error: {\n code: 'COLUMN_NOT_FOUND',\n message: `Column '${columnName}' not found in table`,\n meta: ['404'],\n },\n };\n }\n\n // Convert existing column details to update request format\n const existingColumnAsUpdate = this.convertColumnDetailsToUpdateRequest(\n findResult.data\n );\n\n // Merge existing data with updates (updates override existing values)\n const mergedUpdates: ColumnUpdateRequest = {\n ...existingColumnAsUpdate,\n ...updates,\n } as ColumnUpdateRequest;\n\n // Update using the column ID with merged data\n return await this.updateColumn(\n tableId,\n findResult.data.id,\n mergedUpdates\n );\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n /**\n * Delete column by name\n */\n async deleteColumnByName(\n tableId: string,\n columnName: string\n ): Promise<BolticSuccessResponse<{ message: string }> | BolticErrorResponse> {\n try {\n // First find the column to get its ID\n const findResult = await this.findColumnByName(tableId, columnName);\n\n if ('error' in findResult) {\n return findResult;\n }\n\n if (!findResult.data) {\n return {\n error: {\n code: 'COLUMN_NOT_FOUND',\n message: `Column '${columnName}' not found in table`,\n meta: ['Column not found'],\n },\n };\n }\n\n // Delete using the column ID\n return await this.deleteColumn(tableId, findResult.data.id);\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n private buildHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'x-boltic-token': this.config.apiKey,\n };\n }\n\n private formatErrorResponse(error: unknown): BolticErrorResponse {\n if (this.config.debug) {\n console.error('Columns API Error:', error);\n }\n\n // Handle different error types following Boltic format\n if (error && typeof error === 'object' && 'response' in error) {\n const apiError = error as {\n response?: {\n data?: BolticErrorResponse;\n status?: number;\n };\n };\n\n // If API already returned Boltic format, use it\n if (apiError.response?.data?.error) {\n return apiError.response.data;\n }\n\n // Otherwise format it to Boltic structure\n return {\n error: {\n code: 'API_ERROR',\n message: (error as unknown as Error).message || 'Unknown API error',\n meta: [`Status: ${apiError.response?.status || 'unknown'}`],\n },\n };\n }\n\n if (error && typeof error === 'object' && 'message' in error) {\n return {\n error: {\n code: 'CLIENT_ERROR',\n message: (error as Error).message,\n meta: ['Client-side error occurred'],\n },\n };\n }\n\n return {\n error: {\n code: 'UNKNOWN_ERROR',\n message: 'An unexpected error occurred',\n meta: ['Unknown error type'],\n },\n };\n }\n}\n","export interface ApiEndpoint {\n path: string;\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n authenticated: boolean;\n rateLimit?: {\n requests: number;\n window: number; // in milliseconds\n };\n}\n\nexport interface TableEndpoints {\n list: ApiEndpoint;\n create: ApiEndpoint;\n get: ApiEndpoint;\n update: ApiEndpoint;\n delete: ApiEndpoint;\n}\n\nexport const TABLE_ENDPOINTS: TableEndpoints = {\n list: {\n path: '/tables/list',\n method: 'POST',\n authenticated: true,\n rateLimit: { requests: 200, window: 60000 },\n },\n create: {\n path: '/tables',\n method: 'POST',\n authenticated: true,\n },\n get: {\n path: '/tables/{table_id}',\n method: 'GET',\n authenticated: true,\n rateLimit: { requests: 300, window: 60000 },\n },\n update: {\n path: '/tables/{table_id}',\n method: 'PATCH',\n authenticated: true,\n },\n delete: {\n path: '/tables/{table_id}',\n method: 'DELETE',\n authenticated: true,\n },\n};\n\nexport const buildEndpointPath = (\n endpoint: ApiEndpoint,\n params: Record<string, string> = {}\n): string => {\n let path = endpoint.path;\n\n // Replace path parameters\n Object.entries(params).forEach(([key, value]) => {\n path = path.replace(`{${key}}`, encodeURIComponent(value));\n });\n\n // Check for unreplaced parameters\n const unreplacedParams = path.match(/\\{([^}]+)\\}/g);\n if (unreplacedParams) {\n throw new Error(`Missing path parameters: ${unreplacedParams.join(', ')}`);\n }\n\n return path;\n};\n","/**\n * Filter structure according to Tables Module PRD and backend buildWhereClause function\n */\nexport interface ApiFilter {\n field: string;\n operator: string;\n values: unknown[];\n}\n\nexport interface WhereCondition {\n [field: string]: unknown;\n}\n\n/**\n * Comprehensive filter operators based on backend buildWhereClause function\n */\nexport const FILTER_OPERATORS = {\n // Relational operators\n EQUALS: '=',\n NOT_EQUALS: '!=',\n GREATER_THAN: '>',\n GREATER_THAN_EQUAL: '>=',\n LESS_THAN: '<',\n LESS_THAN_EQUAL: '<=',\n\n // String operators\n LIKE: 'LIKE', // contains (case-sensitive)\n ILIKE: 'ILIKE', // contains (case-insensitive)\n STARTS_WITH: 'STARTS WITH',\n\n // Array/Set operators\n IN: 'IN', // is one of\n NOT_IN: 'NOT IN', // is not one of\n\n // Special operators\n IS_EMPTY: 'IS EMPTY',\n IS_NULL: 'IS NULL',\n IS_NOT_NULL: 'IS NOT NULL',\n BETWEEN: 'BETWEEN',\n\n // Dropdown/Array specific operators\n ARRAY_CONTAINS: '@>', // is exactly for dropdown\n ARRAY_NOT_CONTAINS: 'NOT @>', // is different from for dropdown\n ANY: 'ANY', // contains (case-sensitive) for dropdown\n IS_ONE_OF_ARRAY: 'IS ONE OF', // is one of for dropdown\n DROPDOWN_ITEM_STARTS_WITH: 'DROPDOWN ITEM STARTS WITH',\n\n // Date operators\n WITHIN: 'WITHIN', // date range operator\n} as const;\n\n/**\n * Map SDK where clause operators to API filter operators\n */\nconst OPERATOR_MAPPING: Record<string, string> = {\n // Basic comparisons\n $eq: FILTER_OPERATORS.EQUALS,\n $ne: FILTER_OPERATORS.NOT_EQUALS,\n $gt: FILTER_OPERATORS.GREATER_THAN,\n $gte: FILTER_OPERATORS.GREATER_THAN_EQUAL,\n $lt: FILTER_OPERATORS.LESS_THAN,\n $lte: FILTER_OPERATORS.LESS_THAN_EQUAL,\n\n // String operations\n $like: FILTER_OPERATORS.LIKE,\n $ilike: FILTER_OPERATORS.ILIKE,\n $startsWith: FILTER_OPERATORS.STARTS_WITH,\n\n // Array operations\n $in: FILTER_OPERATORS.IN,\n $notIn: FILTER_OPERATORS.NOT_IN,\n\n // Special operations\n $between: FILTER_OPERATORS.BETWEEN,\n $isEmpty: FILTER_OPERATORS.IS_EMPTY,\n $isNull: FILTER_OPERATORS.IS_NULL,\n $isNotNull: FILTER_OPERATORS.IS_NOT_NULL,\n\n // Array/dropdown operations\n $arrayContains: FILTER_OPERATORS.ARRAY_CONTAINS,\n $arrayNotContains: FILTER_OPERATORS.ARRAY_NOT_CONTAINS,\n $any: FILTER_OPERATORS.ANY,\n $isOneOfArray: FILTER_OPERATORS.IS_ONE_OF_ARRAY,\n $dropdownItemStartsWith: FILTER_OPERATORS.DROPDOWN_ITEM_STARTS_WITH,\n\n // Date operations\n $within: FILTER_OPERATORS.WITHIN,\n};\n\n/**\n * Convert direct filter array format to SDK format\n * This handles the case where filters are passed directly as an array\n */\nexport function normalizeFilters(\n filters: ApiFilter[] | Record<string, unknown>[] | WhereCondition\n): ApiFilter[] {\n if (Array.isArray(filters)) {\n // Check if it's already ApiFilter format\n if (\n filters.length > 0 &&\n typeof filters[0] === 'object' &&\n 'field' in filters[0] &&\n 'operator' in filters[0] &&\n 'values' in filters[0]\n ) {\n return filters as ApiFilter[];\n }\n // Handle legacy Record<string, unknown>[] format\n // For now, treat it as an empty array since this format is deprecated\n console.warn(\n 'Legacy Record<string, unknown>[] filter format detected. Please migrate to the new filter format.'\n );\n return [];\n }\n return mapWhereToFilters(filters);\n}\n\n/**\n * Map SDK where clause to API filters format\n */\nexport function mapWhereToFilters(where: WhereCondition): ApiFilter[] {\n const filters: ApiFilter[] = [];\n\n Object.entries(where).forEach(([field, condition]) => {\n if (\n typeof condition !== 'object' ||\n Array.isArray(condition) ||\n condition === null\n ) {\n // Direct value comparison\n filters.push({\n field,\n operator: FILTER_OPERATORS.EQUALS,\n values: [condition],\n });\n return;\n }\n\n // Handle operator-based conditions\n Object.entries(condition).forEach(([operator, value]) => {\n const apiOperator = OPERATOR_MAPPING[operator];\n if (!apiOperator) {\n throw new Error(`Unsupported operator: ${operator}`);\n }\n\n let values: unknown[];\n\n // Handle different operator value formats\n if (\n apiOperator === FILTER_OPERATORS.BETWEEN &&\n Array.isArray(value) &&\n value.length === 2\n ) {\n values = value;\n } else if (\n (apiOperator === FILTER_OPERATORS.IN ||\n apiOperator === FILTER_OPERATORS.NOT_IN ||\n apiOperator === FILTER_OPERATORS.IS_ONE_OF_ARRAY) &&\n Array.isArray(value)\n ) {\n values = value;\n } else if (\n apiOperator === FILTER_OPERATORS.IS_NULL ||\n apiOperator === FILTER_OPERATORS.IS_NOT_NULL ||\n apiOperator === FILTER_OPERATORS.IS_EMPTY\n ) {\n values = [];\n } else {\n values = [value];\n }\n\n filters.push({\n field,\n operator: apiOperator,\n values,\n });\n });\n });\n\n return filters;\n}\n\n/**\n * Build API filters with validation based on backend buildWhereClause\n */\nexport function buildApiFilters(\n whereOrFilters: WhereCondition | ApiFilter[],\n whereOperator: 'AND' | 'OR' = 'AND'\n): { filters: ApiFilter[]; whereOperator: string } {\n const filters = normalizeFilters(whereOrFilters);\n\n // Validate filters\n filters.forEach((filter, index) => {\n if (!filter.field) {\n throw new Error(`Filter at index ${index} missing required field`);\n }\n if (!filter.operator) {\n throw new Error(`Filter at index ${index} missing required operator`);\n }\n if (!Array.isArray(filter.values)) {\n throw new Error(`Filter at index ${index} values must be an array`);\n }\n });\n\n return {\n filters,\n whereOperator,\n };\n}\n\n/**\n * Convert API filters back to SDK where clause\n */\nexport function mapFiltersToWhere(filters: ApiFilter[]): WhereCondition {\n const where: WhereCondition = {};\n\n filters.forEach((filter) => {\n const reverseMapping: Record<string, string> = {};\n Object.entries(OPERATOR_MAPPING).forEach(([sdkOp, apiOp]) => {\n reverseMapping[apiOp] = sdkOp;\n });\n\n const sdkOperator = reverseMapping[filter.operator];\n if (!sdkOperator) {\n throw new Error(`Unsupported API operator: ${filter.operator}`);\n }\n\n if (!where[filter.field]) {\n where[filter.field] = {};\n }\n\n const fieldCondition = where[filter.field] as Record<string, unknown>;\n\n if (sdkOperator === '$between' && filter.values.length === 2) {\n fieldCondition[sdkOperator] = filter.values;\n } else if (\n sdkOperator === '$in' ||\n sdkOperator === '$notIn' ||\n sdkOperator === '$isOneOfArray'\n ) {\n fieldCondition[sdkOperator] = filter.values;\n } else if (\n sdkOperator === '$isNull' ||\n sdkOperator === '$isNotNull' ||\n sdkOperator === '$isEmpty'\n ) {\n fieldCondition[sdkOperator] = true;\n } else {\n fieldCondition[sdkOperator] = filter.values[0];\n }\n });\n\n return where;\n}\n\n/**\n * Validate filter values based on operator\n */\nexport function validateFilterValues(\n operator: string,\n values: unknown[]\n): boolean {\n switch (operator) {\n case FILTER_OPERATORS.BETWEEN:\n return values.length === 2;\n case FILTER_OPERATORS.IS_NULL:\n case FILTER_OPERATORS.IS_NOT_NULL:\n case FILTER_OPERATORS.IS_EMPTY:\n return values.length === 0;\n case FILTER_OPERATORS.IN:\n case FILTER_OPERATORS.NOT_IN:\n case FILTER_OPERATORS.IS_ONE_OF_ARRAY:\n return values.length > 0;\n default:\n return values.length === 1;\n }\n}\n\n/**\n * Create filter helper for building complex filter conditions\n */\nexport class FilterBuilder {\n private filters: ApiFilter[] = [];\n\n equals(field: string, value: unknown): FilterBuilder {\n this.filters.push({\n field,\n operator: FILTER_OPERATORS.EQUALS,\n values: [value],\n });\n return this;\n }\n\n notEquals(field: string, value: unknown): FilterBuilder {\n this.filters.push({\n field,\n operator: FILTER_OPERATORS.NOT_EQUALS,\n values: [value],\n });\n return this;\n }\n\n greaterThan(field: string, value: unknown): FilterBuilder {\n this.filters.push({\n field,\n operator: FILTER_OPERATORS.GREATER_THAN,\n values: [value],\n });\n return this;\n }\n\n lessThan(field: string, value: unknown): FilterBuilder {\n this.filters.push({\n field,\n operator: FILTER_OPERATORS.LESS_THAN,\n values: [value],\n });\n return this;\n }\n\n between(field: string, start: unknown, end: unknown): FilterBuilder {\n this.filters.push({\n field,\n operator: FILTER_OPERATORS.BETWEEN,\n values: [start, end],\n });\n return this;\n }\n\n in(field: string, values: unknown[]): FilterBuilder {\n this.filters.push({\n field,\n operator: FILTER_OPERATORS.IN,\n values,\n });\n return this;\n }\n\n like(field: string, value: unknown): FilterBuilder {\n this.filters.push({\n field,\n operator: FILTER_OPERATORS.LIKE,\n values: [value],\n });\n return this;\n }\n\n startsWith(field: string, value: unknown): FilterBuilder {\n this.filters.push({\n field,\n operator: FILTER_OPERATORS.STARTS_WITH,\n values: [value],\n });\n return this;\n }\n\n isEmpty(field: string): FilterBuilder {\n this.filters.push({\n field,\n operator: FILTER_OPERATORS.IS_EMPTY,\n values: [],\n });\n return this;\n }\n\n isNull(field: string): FilterBuilder {\n this.filters.push({\n field,\n operator: FILTER_OPERATORS.IS_NULL,\n values: [],\n });\n return this;\n }\n\n arrayContains(field: string, value: unknown): FilterBuilder {\n this.filters.push({\n field,\n operator: FILTER_OPERATORS.ARRAY_CONTAINS,\n values: [value],\n });\n return this;\n }\n\n build(): ApiFilter[] {\n return [...this.filters];\n }\n\n clear(): FilterBuilder {\n this.filters = [];\n return this;\n }\n}\n\n/**\n * Helper function to create a new filter builder\n */\nexport function createFilter(): FilterBuilder {\n return new FilterBuilder();\n}\n","import {\n FieldDefinition,\n TableCreateRequest,\n TableQueryOptions,\n TableRecord,\n} from '../../types/api/table';\nimport { ApiFilter, buildApiFilters } from '../../utils/filters/filter-mapper';\n\nexport interface TableCreateApiRequest {\n name: string;\n description?: string;\n fields: FieldDefinition[];\n is_ai_generated_schema?: boolean;\n is_template?: boolean;\n}\n\nexport interface TableListApiRequest {\n page?: {\n page_no: number;\n page_size: number;\n };\n sort?: Array<{\n field: string;\n direction: 'asc' | 'desc';\n }>;\n filters?: ApiFilter[];\n is_shared?: boolean;\n}\n\nexport interface TableUpdateApiRequest {\n name?: string;\n description?: string;\n is_shared?: boolean;\n}\n\nexport interface TableListApiResponse {\n data: TableRecord[];\n pagination: {\n total_count: number;\n total_pages: number;\n current_page: number;\n per_page: number;\n type: string;\n };\n}\n\n/**\n * Transform SDK table create request to API format\n */\nexport function transformTableCreateRequest(\n request: TableCreateRequest,\n options: {\n is_ai_generated_schema?: boolean;\n is_template?: boolean;\n } = {}\n): TableCreateApiRequest {\n return {\n name: request.name,\n description: request.description,\n fields: request.fields.map(transformFieldDefinition),\n is_ai_generated_schema: options.is_ai_generated_schema || false,\n is_template: options.is_template || false,\n };\n}\n\n/**\n * Transform field definition to API format\n */\nfunction transformFieldDefinition(field: FieldDefinition): FieldDefinition {\n return {\n name: field.name,\n type: field.type,\n is_nullable: field.is_nullable ?? true,\n is_primary_key: field.is_primary_key ?? false,\n is_unique: field.is_unique ?? false,\n is_indexed: field.is_indexed ?? false,\n is_visible: field.is_visible ?? true,\n is_readonly: field.is_readonly ?? false,\n field_order: field.field_order ?? 1,\n alignment: field.alignment ?? 'left',\n timezone: field.timezone ?? undefined,\n date_format: field.date_format ?? undefined,\n time_format: field.time_format ?? undefined,\n decimals: field.decimals ?? undefined,\n currency_format: field.currency_format ?? undefined,\n selection_source:\n field.type === 'dropdown' && !field.selection_source\n ? 'provide-static-list'\n : (field.selection_source ?? undefined),\n selectable_items: field.selectable_items ?? undefined,\n multiple_selections: field.multiple_selections ?? false,\n phone_format: field.phone_format ?? undefined,\n vector_dimension: field.vector_dimension ?? undefined,\n description: field.description,\n default_value: field.default_value,\n };\n}\n\n/**\n * Transform SDK table query options to API list request\n */\nexport function transformTableListRequest(\n options: TableQueryOptions & {\n page?: number;\n pageSize?: number;\n isShared?: boolean;\n } = {}\n): TableListApiRequest {\n const request: TableListApiRequest = {};\n\n // Add pagination\n if (options.page !== undefined || options.pageSize !== undefined) {\n request.page = {\n page_no: options.page ?? 1,\n page_size: options.pageSize ?? options.limit ?? 1000,\n };\n } else if (options.limit !== undefined) {\n request.page = {\n page_no: Math.floor((options.offset ?? 0) / options.limit) + 1,\n page_size: options.limit,\n };\n }\n\n // Add sorting\n if (options.sort?.length) {\n request.sort = options.sort.map((s) => ({\n field: s.field as string,\n direction: s.order,\n }));\n }\n\n // Add filters\n if (options.where) {\n const { filters } = buildApiFilters(options.where);\n request.filters = filters;\n }\n\n // Add shared filter\n if (options.isShared !== undefined) {\n request.is_shared = options.isShared;\n }\n\n return request;\n}\n\n/**\n * Transform SDK table update request to API format\n */\nexport function transformTableUpdateRequest(updates: {\n name?: string;\n description?: string;\n is_shared?: boolean;\n}): TableUpdateApiRequest {\n const request: TableUpdateApiRequest = {};\n\n if (updates.name !== undefined) {\n request.name = updates.name;\n }\n\n if (updates.description !== undefined) {\n request.description = updates.description;\n }\n\n if (updates.is_shared !== undefined) {\n request.is_shared = updates.is_shared;\n }\n\n return request;\n}\n\n/**\n * Transform API table list response to SDK format\n */\nexport function transformTableListResponse(response: TableListApiResponse): {\n tables: TableRecord[];\n pagination: {\n total_count: number;\n total_pages: number;\n current_page: number;\n per_page: number;\n type: string;\n };\n} {\n return {\n tables: response.data,\n pagination: {\n total_count: response.pagination?.total_count,\n total_pages: response.pagination?.total_pages,\n current_page: response.pagination?.current_page,\n per_page: response.pagination?.per_page,\n type: response.pagination?.type,\n },\n };\n}\n","import {\n TableCreateRequest,\n TableCreateResponse,\n TableQueryOptions,\n TableRecord,\n} from '../../types/api/table';\nimport type { Environment, Region } from '../../types/config/environment';\nimport { REGION_CONFIGS } from '../../types/config/environment';\nimport { filterArrayFields, filterObjectFields } from '../../utils/common';\nimport { createHttpAdapter } from '../../utils/http';\nimport { HttpAdapter } from '../../utils/http/adapter';\nimport { buildEndpointPath, TABLE_ENDPOINTS } from '../endpoints/tables';\nimport { transformTableCreateRequest } from '../transformers/tables';\n\nexport interface TablesApiClientConfig {\n apiKey: string;\n environment?: Environment;\n region?: Region;\n timeout?: number;\n debug?: boolean;\n retryAttempts?: number;\n retryDelay?: number;\n headers?: Record<string, string>;\n}\n\nexport interface TableCreateOptions {\n is_ai_generated_schema?: boolean;\n is_template?: boolean;\n}\n\nexport interface TableListOptions extends TableQueryOptions {\n page?: number;\n pageSize?: number;\n isShared?: boolean;\n}\n\n// Boltic API Response Structure interfaces\ninterface BolticSuccessResponse<T = unknown> {\n data: T;\n message?: string;\n}\n\ninterface BolticListResponse<T = unknown> {\n data: T[];\n pagination?: {\n total_count: number;\n total_pages: number;\n current_page: number;\n per_page: number;\n type: string;\n };\n message?: string;\n}\n\ninterface BolticErrorResponse {\n data?: never;\n error: {\n code?: string;\n message?: string;\n meta?: string[];\n };\n}\n\n/**\n * Tables API Client - handles all table-related API operations\n */\nexport class TablesApiClient {\n private httpAdapter: HttpAdapter;\n private config: TablesApiClientConfig;\n private baseURL: string;\n\n constructor(\n apiKey: string,\n config: Omit<TablesApiClientConfig, 'apiKey'> = {}\n ) {\n this.config = { apiKey, ...config };\n this.httpAdapter = createHttpAdapter();\n\n // Set baseURL based on environment and region\n const environment = config.environment || 'prod';\n const region = config.region || 'asia-south1'; // Default to asia-south1 for legacy support\n this.baseURL = this.getBaseURL(environment, region);\n }\n\n private getBaseURL(environment: Environment, region: Region): string {\n const regionConfig = REGION_CONFIGS[region];\n if (!regionConfig) {\n throw new Error(`Unsupported region: ${region}`);\n }\n\n const envConfig = regionConfig[environment];\n if (!envConfig) {\n throw new Error(\n `Unsupported environment: ${environment} for region: ${region}`\n );\n }\n\n return `${envConfig.baseURL}/v1`;\n }\n\n /**\n * Create a new table\n */\n async createTable(\n request: TableCreateRequest,\n options: TableCreateOptions = {}\n ): Promise<BolticSuccessResponse<TableCreateResponse> | BolticErrorResponse> {\n try {\n const endpoint = TABLE_ENDPOINTS.create;\n const url = `${this.baseURL}${endpoint.path}`;\n\n // Transform the request to ensure proper formatting (e.g., selection_source for dropdowns)\n const transformedRequest = transformTableCreateRequest(request, options);\n\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n data: transformedRequest,\n timeout: this.config.timeout,\n });\n\n // Note: TableCreateResponse only contains id and message, so field filtering is not applicable\n // Return raw response without transformation\n return response.data as BolticSuccessResponse<TableCreateResponse>;\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n /**\n * List tables with filtering and pagination\n */\n async listTables(\n options: TableListOptions = {}\n ): Promise<BolticListResponse<TableRecord> | BolticErrorResponse> {\n try {\n const endpoint = TABLE_ENDPOINTS.list;\n const url = `${this.baseURL}${endpoint.path}`;\n\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n data: options,\n timeout: this.config.timeout,\n });\n\n // Apply field filtering if fields are specified\n const responseData = response.data as BolticListResponse<TableRecord>;\n if (options.fields && responseData.data) {\n responseData.data = filterArrayFields(\n responseData.data as unknown as Record<string, unknown>[],\n options.fields\n ) as unknown as TableRecord[];\n }\n\n return responseData;\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n /**\n * Get a specific table by ID\n */\n async getTable(\n tableId: string,\n options: { fields?: Array<keyof TableRecord> } = {}\n ): Promise<BolticSuccessResponse<TableRecord> | BolticErrorResponse> {\n try {\n const endpoint = TABLE_ENDPOINTS.get;\n const url = `${this.baseURL}${buildEndpointPath(endpoint, { table_id: tableId })}`;\n\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n timeout: this.config.timeout,\n });\n\n // Apply field filtering if fields are specified\n const responseData = response.data as BolticSuccessResponse<TableRecord>;\n if (options.fields && responseData.data) {\n responseData.data = filterObjectFields(\n responseData.data as unknown as Record<string, unknown>,\n options.fields as string[]\n ) as unknown as TableRecord;\n }\n\n return responseData;\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n /**\n * Update an existing table\n */\n async updateTable(\n tableId: string,\n updates: {\n name?: string;\n description?: string;\n is_shared?: boolean;\n fields?: Array<keyof TableRecord>;\n }\n ): Promise<BolticSuccessResponse<TableRecord> | BolticErrorResponse> {\n try {\n const { fields, ...updateData } = updates;\n const endpoint = TABLE_ENDPOINTS.update;\n const url = `${this.baseURL}${buildEndpointPath(endpoint, { table_id: tableId })}`;\n\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n data: updateData,\n timeout: this.config.timeout,\n });\n\n // Apply field filtering if fields are specified\n const responseData = response.data as BolticSuccessResponse<TableRecord>;\n if (fields && responseData.data) {\n responseData.data = filterObjectFields(\n responseData.data as unknown as Record<string, unknown>,\n fields as string[]\n ) as unknown as TableRecord;\n }\n\n return responseData;\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n /**\n * Delete a table\n */\n async deleteTable(\n tableId: string\n ): Promise<BolticSuccessResponse<{ message: string }> | BolticErrorResponse> {\n try {\n const endpoint = TABLE_ENDPOINTS.delete;\n const url = `${this.baseURL}${buildEndpointPath(endpoint, { table_id: tableId })}`;\n\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n timeout: this.config.timeout,\n });\n\n // Return raw response without transformation\n return response.data as BolticSuccessResponse<{ message: string }>;\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n // Private helper methods\n\n private buildHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'x-boltic-token': this.config.apiKey,\n };\n }\n\n private formatErrorResponse(error: unknown): BolticErrorResponse {\n if (this.config.debug) {\n console.error('Tables API Error:', error);\n }\n\n // Handle different error types following Boltic format\n if (error && typeof error === 'object' && 'response' in error) {\n const apiError = error as {\n response?: {\n data?: BolticErrorResponse;\n status?: number;\n };\n };\n\n // If API already returned Boltic format, use it\n if (apiError.response?.data?.error) {\n return apiError.response.data;\n }\n\n // Otherwise format it to Boltic structure\n return {\n error: {\n code: 'API_ERROR',\n message: (error as unknown as Error).message || 'Unknown API error',\n meta: [`Status: ${apiError.response?.status || 'unknown'}`],\n },\n };\n }\n\n if (error && typeof error === 'object' && 'message' in error) {\n return {\n error: {\n code: 'CLIENT_ERROR',\n message: (error as Error).message,\n meta: ['Client-side error occurred'],\n },\n };\n }\n\n return {\n error: {\n code: 'UNKNOWN_ERROR',\n message: 'An unexpected error occurred',\n meta: ['Unknown error type'],\n },\n };\n }\n}\n","import { PaginationInfo } from './operations';\n\n// Boltic API Response Structure\nexport interface BolticSuccessResponse<T> {\n data: T;\n message?: string;\n error?: {\n code?: string;\n message?: string;\n meta?: string[];\n };\n}\n\nexport interface BolticListResponse<T> {\n data: T[];\n pagination?: {\n total_count: number;\n total_pages: number;\n current_page: number;\n per_page: number;\n type: string;\n };\n message?: string;\n error?: {\n code?: string;\n message?: string;\n meta?: string[];\n };\n}\n\nexport interface BolticErrorResponse {\n data?: never;\n message?: string;\n error: {\n code?: string;\n message?: string;\n meta?: string[];\n };\n}\n\n// Union type for all possible responses\nexport type ApiResponse<T> =\n | BolticSuccessResponse<T>\n | BolticListResponse<T>\n | BolticErrorResponse;\n\n// Helper type to check if response is an error\nexport function isErrorResponse<T>(\n response: ApiResponse<T>\n): response is BolticErrorResponse {\n return 'error' in response && response.error !== undefined;\n}\n\n// Helper type to check if response is a list response\nexport function isListResponse<T>(\n response: ApiResponse<T>\n): response is BolticListResponse<T> {\n return 'pagination' in response;\n}\n\n// Legacy interfaces for backwards compatibility (to be deprecated)\nexport interface SuccessResponse<T> {\n data: T;\n error?: never;\n pagination?: PaginationInfo;\n}\n\nexport interface ErrorResponse {\n data?: never;\n error: string;\n details?: unknown;\n code?: string;\n}\n\nexport interface BulkResponse<T> {\n success: T[];\n failed: Array<{\n item: unknown;\n error: string;\n }>;\n summary: {\n total: number;\n successful: number;\n failed: number;\n };\n}\n\nexport interface QueryOptions {\n fields?: string[];\n sort?: Array<{ field: string; order: 'asc' | 'desc' }>;\n limit?: number;\n offset?: number;\n where?: Record<string, unknown>;\n}\n","import { formatError } from '../../errors';\nimport { ApiResponse, QueryOptions } from '../../types/common/responses';\nimport { HttpResponse } from '../../utils/http/adapter';\nimport { BaseClient } from './base-client';\n\nexport abstract class BaseResource {\n protected client: BaseClient;\n protected basePath: string;\n\n constructor(client: BaseClient, basePath: string) {\n this.client = client;\n this.basePath = basePath;\n }\n\n // Public getter for basePath\n getBasePath(): string {\n return this.basePath;\n }\n\n protected async makeRequest<T>(\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE',\n path: string,\n data?: unknown,\n options?: { params?: Record<string, unknown> }\n ): Promise<ApiResponse<T>> {\n const url = `${this.basePath}${path}`;\n\n try {\n let response: HttpResponse<ApiResponse<T>>;\n\n switch (method) {\n case 'GET':\n response = await this.client.get<ApiResponse<T>>(url, {\n params: options?.params,\n });\n break;\n case 'POST':\n response = await this.client.post<ApiResponse<T>>(url, data, {\n params: options?.params,\n });\n break;\n case 'PUT':\n response = await this.client.put<ApiResponse<T>>(url, data, {\n params: options?.params,\n });\n break;\n case 'PATCH':\n response = await this.client.patch<ApiResponse<T>>(url, data, {\n params: options?.params,\n });\n break;\n case 'DELETE':\n response = await this.client.delete<ApiResponse<T>>(url, {\n params: options?.params,\n });\n break;\n }\n\n return response.data;\n } catch (error) {\n // Return error response in Boltic format\n return {\n error: {\n code: 'CLIENT_ERROR',\n message: formatError(error),\n meta: ['Request failed'],\n },\n };\n }\n }\n\n protected buildQueryParams(\n options: QueryOptions = {}\n ): Record<string, unknown> {\n const params: Record<string, unknown> = {};\n\n if (options.fields?.length) {\n params.fields = options.fields.join(',');\n }\n\n if (options.sort?.length) {\n params.sort = options.sort.map((s) => `${s.field}:${s.order}`).join(',');\n }\n\n if (options.limit !== undefined) {\n params.limit = options.limit;\n }\n\n if (options.offset !== undefined) {\n params.offset = options.offset;\n }\n\n if (options.where) {\n // Convert where conditions to query parameters\n Object.entries(options.where).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n params[`where[${key}]`] =\n typeof value === 'object' ? JSON.stringify(value) : value;\n }\n });\n }\n\n return params;\n }\n\n protected handleResponse<T>(response: ApiResponse<T>): ApiResponse<T> {\n if ('error' in response) {\n // Log error if debug mode is on\n if (this.client.getConfig().debug) {\n // eslint-disable-next-line no-console\n console.error('API Error:', response.error);\n }\n }\n return response;\n }\n}\n","import { TablesApiClient } from '../../api/clients/tables-api-client';\nimport { ApiError, ValidationError } from '../../errors';\nimport {\n FieldDefinition,\n TableCreateRequest,\n TableCreateResponse,\n TableQueryOptions,\n TableRecord,\n TableUpdateRequest,\n} from '../../types/api/table';\nimport {\n ApiResponse,\n BolticSuccessResponse,\n isErrorResponse,\n isListResponse,\n} from '../../types/common/responses';\nimport { BaseClient } from '../core/base-client';\nimport { BaseResource } from '../core/base-resource';\n\nexport class TableResource extends BaseResource {\n private tablesApiClient: TablesApiClient;\n\n constructor(client: BaseClient) {\n super(client, '/v1/tables');\n\n // Initialize the API client\n const config = client.getConfig();\n this.tablesApiClient = new TablesApiClient(config.apiKey, {\n environment: config.environment,\n region: config.region,\n timeout: config.timeout,\n debug: config.debug,\n retryAttempts: config.retryAttempts,\n retryDelay: config.retryDelay,\n headers: config.headers,\n });\n }\n\n /**\n * Create a new table\n */\n async create(\n data: TableCreateRequest\n ): Promise<BolticSuccessResponse<TableCreateResponse>> {\n try {\n // Process fields with defaults if any are provided\n const processedData = { ...data };\n if (data.fields && data.fields.length > 0) {\n processedData.fields = await this.processFieldsDefaults(data.fields);\n }\n\n const result = await this.tablesApiClient.createTable(processedData);\n\n if (isErrorResponse(result)) {\n throw new ApiError(\n result.error.message || 'Create table failed',\n 400,\n result.error\n );\n }\n\n return result as BolticSuccessResponse<TableCreateResponse>;\n } catch (error) {\n throw error instanceof ApiError\n ? error\n : new ApiError(this.formatError(error), 500);\n }\n }\n\n /**\n * Process fields with defaults for table creation\n */\n private async processFieldsDefaults(\n fields: FieldDefinition[]\n ): Promise<FieldDefinition[]> {\n const processedFields: FieldDefinition[] = [];\n\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n const processedField: FieldDefinition = { ...field };\n\n // Set default values for optional fields if not provided\n if (processedField.is_primary_key === undefined) {\n processedField.is_primary_key = false;\n }\n if (processedField.is_unique === undefined) {\n processedField.is_unique = false;\n }\n if (processedField.is_nullable === undefined) {\n processedField.is_nullable = true;\n }\n if (processedField.is_indexed === undefined) {\n processedField.is_indexed = false;\n }\n\n // Auto-generate field_order if not provided (sequential for table creation)\n if (processedField.field_order === undefined) {\n processedField.field_order = i + 1;\n }\n\n // Validate field_order is within acceptable range\n if (\n processedField.field_order <= 0 ||\n processedField.field_order >= 2147483647\n ) {\n throw new Error(\n 'Field order must be a number greater than 0 and less than 2147483647'\n );\n }\n\n processedFields.push(processedField);\n }\n\n return processedFields;\n }\n\n /**\n * Transform SDK TableQueryOptions to API request format\n */\n private transformTableQueryToApiRequest(options: TableQueryOptions): unknown {\n const apiRequest: {\n page: { page_no: number; page_size: number };\n filters: Array<{ field: string; operator: string; values: unknown[] }>;\n sort: Array<{ field: string; direction: string }>;\n } = {\n page: {\n page_no: 1,\n page_size: options.limit || 100,\n },\n filters: [],\n sort: [],\n };\n\n // Handle pagination\n if (options.offset && options.limit) {\n const pageNo = Math.floor(options.offset / options.limit) + 1;\n apiRequest.page.page_no = pageNo;\n }\n\n // Transform where clause to filters\n if (options.where) {\n Object.entries(options.where).forEach(([field, value]) => {\n if (value !== undefined && value !== null) {\n apiRequest.filters.push({\n field,\n operator: '=',\n values: [value],\n });\n }\n });\n }\n\n // Transform sort\n if (options.sort) {\n apiRequest.sort = options.sort.map((s) => ({\n field: s.field,\n direction: s.order,\n }));\n }\n\n return apiRequest;\n }\n\n /**\n * Find all tables with optional filtering\n */\n async findAll(\n options: TableQueryOptions = {}\n ): Promise<ApiResponse<TableRecord>> {\n try {\n // Transform SDK format to API format\n const apiRequest = this.transformTableQueryToApiRequest(options);\n\n const result = await this.tablesApiClient.listTables(\n apiRequest as unknown as TableQueryOptions\n );\n\n if (isErrorResponse(result)) {\n throw new ApiError(\n result.error.message || 'List tables failed',\n 400,\n result.error\n );\n }\n\n return result;\n } catch (error) {\n throw error instanceof ApiError\n ? error\n : new ApiError(this.formatError(error), 500);\n }\n }\n\n /**\n * Find a single table by ID or name\n */\n async findOne(\n options: TableQueryOptions\n ): Promise<\n | BolticSuccessResponse<TableRecord | null>\n | import('../../types/common/responses').BolticErrorResponse\n > {\n try {\n if (!options.where?.id && !options.where?.name) {\n throw new ValidationError(\n 'Either id or name must be provided in where clause'\n );\n }\n\n if (options.where?.id) {\n // Find by ID\n const result = await this.tablesApiClient.getTable(\n options.where.id as string\n );\n\n if (isErrorResponse(result)) {\n if (result.error.code === 'TABLE_NOT_FOUND') {\n return {\n data: null,\n message: 'Table not found',\n };\n }\n throw new ApiError(\n result.error.message || 'Get table failed',\n 400,\n result.error\n );\n }\n\n return result as BolticSuccessResponse<TableRecord>;\n } else {\n // Find by name - transform to API format\n const apiRequest = {\n page: { page_no: 1, page_size: 1 },\n filters: [\n {\n field: 'name',\n operator: '=',\n values: [options.where!.name],\n },\n ],\n sort: [],\n };\n\n const listResult = await this.tablesApiClient.listTables(\n apiRequest as unknown as TableQueryOptions\n );\n\n if (isErrorResponse(listResult)) {\n throw new ApiError(\n listResult.error.message || 'Find table by name failed',\n 400,\n listResult.error\n );\n }\n\n const table = isListResponse(listResult)\n ? (listResult.data[0] as TableRecord)\n : null;\n return {\n data: table || null,\n message: table ? 'Table found' : 'Table not found',\n };\n }\n } catch (error) {\n throw error instanceof ApiError || error instanceof ValidationError\n ? error\n : new ApiError(this.formatError(error), 500);\n }\n }\n\n /**\n * Find a single table by name\n */\n async findByName(\n name: string\n ): Promise<\n | BolticSuccessResponse<TableRecord | null>\n | import('../../types/common/responses').BolticErrorResponse\n > {\n return this.findOne({ where: { name } });\n }\n\n /**\n * Find a single table by ID\n */\n async findById(\n id: string\n ): Promise<\n | BolticSuccessResponse<TableRecord | null>\n | import('../../types/common/responses').BolticErrorResponse\n > {\n return this.findOne({ where: { id } });\n }\n\n /**\n * Update a table by name\n */\n async update(\n name: string,\n data: TableUpdateRequest\n ): Promise<\n | BolticSuccessResponse<TableRecord>\n | import('../../types/common/responses').BolticErrorResponse\n > {\n try {\n // First find the table to get its ID\n const tableResult = await this.findByName(name);\n\n if (!tableResult.data) {\n throw new ApiError(`Table '${name}' not found`, 404);\n }\n\n // Check if the table is a snapshot and prevent updates\n if (tableResult.data.snapshot_url) {\n throw new ApiError(\n `Cannot update snapshot table '${name}'. Snapshots are read-only and cannot be modified.`,\n 400\n );\n }\n\n const result = await this.tablesApiClient.updateTable(\n tableResult.data.id,\n data\n );\n\n if (isErrorResponse(result)) {\n throw new ApiError(\n result.error.message || 'Update table failed',\n 400,\n result.error\n );\n }\n\n return result as BolticSuccessResponse<TableRecord>;\n } catch (error) {\n throw error instanceof ApiError\n ? error\n : new ApiError(this.formatError(error), 500);\n }\n }\n\n /**\n * Delete a table by name\n */\n async delete(\n name: string\n ): Promise<\n | BolticSuccessResponse<{ message: string }>\n | import('../../types/common/responses').BolticErrorResponse\n > {\n try {\n // First find the table to get its ID\n const tableResult = await this.findByName(name);\n\n if (!tableResult.data) {\n throw new ApiError(`Table '${name}' not found`, 404);\n }\n\n // Check if the table is a snapshot and prevent deletion\n if (tableResult.data.snapshot_url) {\n throw new ApiError(\n `Cannot delete snapshot table '${name}'. Snapshots are read-only and cannot be deleted.`,\n 400\n );\n }\n\n const result = await this.tablesApiClient.deleteTable(\n tableResult.data.id\n );\n\n if (isErrorResponse(result)) {\n throw new ApiError(\n result.error.message || 'Delete table failed',\n 400,\n result.error\n );\n }\n\n return result as BolticSuccessResponse<{ message: string }>;\n } catch (error) {\n throw error instanceof ApiError\n ? error\n : new ApiError(this.formatError(error), 500);\n }\n }\n\n /**\n * Rename a table\n */\n async rename(\n oldName: string,\n newName: string\n ): Promise<BolticSuccessResponse<TableRecord>> {\n try {\n const result = await this.update(oldName, {\n name: newName,\n });\n // update throws on error, so cast to success\n return result as BolticSuccessResponse<TableRecord>;\n } catch (error) {\n throw error instanceof ApiError\n ? error\n : new ApiError(this.formatError(error), 500);\n }\n }\n\n /**\n * Set table access permissions\n */\n async setAccess(request: {\n table_name: string;\n is_shared: boolean;\n }): Promise<BolticSuccessResponse<TableRecord>> {\n try {\n // Update the table with the new access settings\n const result = await this.update(request.table_name, {\n is_shared: request.is_shared,\n });\n // update throws on error, so cast to success\n return result as BolticSuccessResponse<TableRecord>;\n } catch (error) {\n throw error instanceof ApiError\n ? error\n : new ApiError(this.formatError(error), 500);\n }\n }\n\n // Helper method to format generic errors\n private formatError(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === 'string') {\n return error;\n }\n return 'An unexpected error occurred';\n }\n}\n","import { ColumnsApiClient } from '../../api/clients/columns-api-client';\nimport { TablesApiClient } from '../../api/clients/tables-api-client';\nimport {\n ColumnDetails,\n ColumnQueryOptions,\n ColumnRecord,\n ColumnUpdateRequest,\n} from '../../types/api/column';\nimport { FieldDefinition } from '../../types/api/table';\nimport {\n BolticErrorResponse,\n BolticListResponse,\n BolticSuccessResponse,\n isErrorResponse,\n} from '../../types/common/responses';\nimport { BaseClient } from '../core/base-client';\nimport { BaseResource } from '../core/base-resource';\nimport { TableResource } from './table';\n\nexport class ColumnResource extends BaseResource {\n private columnsApiClient: ColumnsApiClient;\n private tablesApiClient: TablesApiClient;\n\n constructor(client: BaseClient) {\n super(client, '/v1/tables');\n\n // Initialize the API clients\n const config = client.getConfig();\n this.columnsApiClient = new ColumnsApiClient(config.apiKey, {\n environment: config.environment,\n region: config.region,\n timeout: config.timeout,\n debug: config.debug,\n retryAttempts: config.retryAttempts,\n retryDelay: config.retryDelay,\n headers: config.headers,\n });\n\n this.tablesApiClient = new TablesApiClient(config.apiKey, {\n environment: config.environment,\n region: config.region,\n timeout: config.timeout,\n debug: config.debug,\n retryAttempts: config.retryAttempts,\n retryDelay: config.retryDelay,\n headers: config.headers,\n });\n }\n\n /**\n * Create a single column in a table\n */\n async create(\n tableName: string,\n column: FieldDefinition\n ): Promise<BolticSuccessResponse<ColumnRecord> | BolticErrorResponse> {\n try {\n // Get table information first\n const tableInfo = await this.getTableInfo(tableName);\n if (!tableInfo) {\n return {\n error: {\n code: 'TABLE_NOT_FOUND',\n message: `Table '${tableName}' not found`,\n },\n };\n }\n\n // Apply defaults and auto-generate field_order\n const processedColumn = await this.processColumnDefaults(\n tableInfo.id,\n column\n );\n\n const result = await this.columnsApiClient.createColumn(\n tableInfo.id,\n processedColumn\n );\n\n if (isErrorResponse(result)) {\n return result;\n }\n\n return result as BolticSuccessResponse<ColumnRecord>;\n } catch (error) {\n return {\n error: {\n code: 'CREATE_COLUMN_ERROR',\n message:\n error instanceof Error ? error.message : 'Unknown error occurred',\n },\n };\n }\n }\n\n /**\n * Process column defaults and auto-generate field_order\n */\n private async processColumnDefaults(\n tableId: string,\n column: FieldDefinition\n ): Promise<FieldDefinition> {\n const processedColumn: FieldDefinition = { ...column };\n\n // Set default values for optional fields if not provided\n if (processedColumn.is_primary_key === undefined) {\n processedColumn.is_primary_key = false;\n }\n if (processedColumn.is_unique === undefined) {\n processedColumn.is_unique = false;\n }\n if (processedColumn.is_nullable === undefined) {\n processedColumn.is_nullable = true;\n }\n if (processedColumn.is_indexed === undefined) {\n processedColumn.is_indexed = false;\n }\n\n // Auto-generate field_order if not provided\n if (processedColumn.field_order === undefined) {\n processedColumn.field_order = await this.generateFieldOrder(tableId);\n }\n\n // Validate field_order is within acceptable range\n if (\n processedColumn.field_order <= 0 ||\n processedColumn.field_order >= 2147483647\n ) {\n throw new Error(\n 'Field order must be a number greater than 0 and less than 2147483647'\n );\n }\n\n return processedColumn;\n }\n\n /**\n * Generate the next available field_order for a table\n */\n private async generateFieldOrder(tableId: string): Promise<number> {\n try {\n // Get existing columns to find the highest field_order\n const existingColumns = await this.columnsApiClient.listColumns(tableId);\n\n let maxOrder = 0;\n if (\n !isErrorResponse(existingColumns) &&\n existingColumns.data &&\n Array.isArray(existingColumns.data)\n ) {\n for (const col of existingColumns.data) {\n if (col.field_order && col.field_order > maxOrder) {\n maxOrder = col.field_order;\n }\n }\n }\n\n // Return next available number (starting from 1 if no columns exist)\n return maxOrder + 1;\n } catch (error) {\n // Fallback to timestamp-based order if there's an error\n return Math.floor(Date.now() / 1000) % 2147483647;\n }\n }\n\n /**\n * Transform SDK ColumnQueryOptions to API request format\n */\n private transformColumnQueryToApiRequest(\n options: ColumnQueryOptions\n ): unknown {\n const apiRequest: {\n page: { page_no: number; page_size: number };\n filters: Array<{ field: string; operator: string; values: unknown[] }>;\n sort: Array<{ field: string; direction: string }>;\n } = {\n page: {\n page_no: 1,\n page_size: options.limit || 100,\n },\n filters: [],\n sort: [],\n };\n\n // Handle pagination\n if (options.offset && options.limit) {\n const pageNo = Math.floor(options.offset / options.limit) + 1;\n apiRequest.page.page_no = pageNo;\n }\n\n // Transform where clause to filters\n if (options.where) {\n Object.entries(options.where).forEach(([field, value]) => {\n if (value !== undefined && value !== null) {\n apiRequest.filters.push({\n field,\n operator: '=',\n values: [value],\n });\n }\n });\n }\n\n // Transform sort\n if (options.sort) {\n apiRequest.sort = options.sort.map((s) => ({\n field: s.field,\n direction: s.order,\n }));\n }\n\n return apiRequest;\n }\n\n /**\n * Add multiple columns to existing table\n */\n async createMany(\n tableName: string,\n columns: FieldDefinition[]\n ): Promise<BolticListResponse<ColumnRecord> | BolticErrorResponse> {\n try {\n // Get table information first\n const tableInfo = await this.getTableInfo(tableName);\n if (!tableInfo) {\n return {\n error: {\n code: 'TABLE_NOT_FOUND',\n message: `Table '${tableName}' not found`,\n },\n };\n }\n\n // Process all columns with defaults and auto-generate field_order\n const processedColumns: FieldDefinition[] = [];\n for (const column of columns) {\n const processedColumn = await this.processColumnDefaults(\n tableInfo.id,\n column\n );\n processedColumns.push(processedColumn);\n }\n\n const result = await this.columnsApiClient.createColumns(tableInfo.id, {\n columns: processedColumns,\n });\n\n if (isErrorResponse(result)) {\n return result;\n }\n\n return result as BolticListResponse<ColumnRecord>;\n } catch (error) {\n return {\n error: {\n code: 'CREATE_COLUMNS_ERROR',\n message:\n error instanceof Error ? error.message : 'Unknown error occurred',\n },\n };\n }\n }\n\n /**\n * Find all columns in a table (replaces list functionality)\n */\n async findAll(\n tableName: string,\n options: ColumnQueryOptions = {}\n ): Promise<BolticListResponse<ColumnDetails> | BolticErrorResponse> {\n try {\n // Get table information first\n const tableInfo = await this.getTableInfo(tableName);\n if (!tableInfo) {\n return {\n error: {\n code: 'TABLE_NOT_FOUND',\n message: `Table '${tableName}' not found`,\n },\n };\n }\n\n // Transform SDK format to API format\n const apiRequest = this.transformColumnQueryToApiRequest(options);\n\n const result = await this.columnsApiClient.listColumns(\n tableInfo.id,\n apiRequest as unknown as ColumnQueryOptions\n );\n\n if (isErrorResponse(result)) {\n return result;\n }\n\n return result as BolticListResponse<ColumnDetails>;\n } catch (error) {\n return {\n error: {\n code: 'LIST_COLUMNS_ERROR',\n message:\n error instanceof Error ? error.message : 'Unknown error occurred',\n },\n };\n }\n }\n\n /**\n * Get a single column by name\n */\n async get(\n tableName: string,\n columnName: string\n ): Promise<BolticSuccessResponse<ColumnDetails> | BolticErrorResponse> {\n try {\n // Get table information first\n const tableInfo = await this.getTableInfo(tableName);\n if (!tableInfo) {\n return {\n error: {\n code: 'TABLE_NOT_FOUND',\n message: `Table '${tableName}' not found`,\n },\n };\n }\n\n const result = await this.columnsApiClient.findColumnByName(\n tableInfo.id,\n columnName\n );\n\n if (isErrorResponse(result)) {\n return result;\n }\n\n if (!result.data) {\n return {\n error: {\n code: 'COLUMN_NOT_FOUND',\n message: `Column '${columnName}' not found in table '${tableName}'`,\n },\n };\n }\n\n return {\n data: result.data as ColumnDetails,\n message: 'Column found successfully',\n };\n } catch (error) {\n return {\n error: {\n code: 'GET_COLUMN_ERROR',\n message:\n error instanceof Error ? error.message : 'Unknown error occurred',\n },\n };\n }\n }\n\n async findById(\n tableName: string,\n columnId: string\n ): Promise<BolticSuccessResponse<ColumnDetails> | BolticErrorResponse> {\n try {\n // Get table information first\n const tableInfo = await this.getTableInfo(tableName);\n if (!tableInfo) {\n return {\n error: {\n code: 'TABLE_NOT_FOUND',\n message: `Table '${tableName}' not found`,\n },\n };\n }\n\n // Use the direct getColumn API method\n const result = await this.columnsApiClient.getColumn(\n tableInfo.id,\n columnId\n );\n\n if (isErrorResponse(result)) {\n return result;\n }\n\n return result as BolticSuccessResponse<ColumnDetails>;\n } catch (error) {\n return {\n error: {\n code: 'FIND_COLUMN_BY_ID_ERROR',\n message:\n error instanceof Error ? error.message : 'Unknown error occurred',\n },\n };\n }\n }\n\n /**\n * Update a column by name\n */\n async update(\n tableName: string,\n columnName: string,\n updates: ColumnUpdateRequest\n ): Promise<BolticSuccessResponse<ColumnDetails> | BolticErrorResponse> {\n try {\n // Get table information first\n const tableInfo = await this.getTableInfo(tableName);\n if (!tableInfo) {\n return {\n error: {\n code: 'TABLE_NOT_FOUND',\n message: `Table '${tableName}' not found`,\n },\n };\n }\n\n const result = await this.columnsApiClient.updateColumnByName(\n tableInfo.id,\n columnName,\n updates\n );\n\n if (isErrorResponse(result)) {\n return result;\n }\n\n return result as BolticSuccessResponse<ColumnDetails>;\n } catch (error) {\n return {\n error: {\n code: 'UPDATE_COLUMN_ERROR',\n message:\n error instanceof Error ? error.message : 'Unknown error occurred',\n },\n };\n }\n }\n\n /**\n * Delete a column by name\n */\n async delete(\n tableName: string,\n columnName: string\n ): Promise<\n | BolticSuccessResponse<{ success: boolean; message?: string }>\n | BolticErrorResponse\n > {\n try {\n // Get table information first\n const tableInfo = await this.getTableInfo(tableName);\n if (!tableInfo) {\n return {\n error: {\n code: 'TABLE_NOT_FOUND',\n message: `Table '${tableName}' not found`,\n },\n };\n }\n\n const result = await this.columnsApiClient.deleteColumnByName(\n tableInfo.id,\n columnName\n );\n\n if (isErrorResponse(result)) {\n return result;\n }\n\n return {\n data: {\n success: true,\n message: 'Column deleted successfully',\n },\n };\n } catch (error) {\n return {\n error: {\n code: 'DELETE_COLUMN_ERROR',\n message:\n error instanceof Error ? error.message : 'Unknown error occurred',\n },\n };\n }\n }\n\n /**\n * Helper method to get table information by name\n */\n private async getTableInfo(\n tableName: string\n ): Promise<{ id: string; snapshot_url?: string } | null> {\n try {\n // Use the table resource to find the table by name\n const tableResource = new TableResource(this.client);\n const tableResult = await tableResource.findByName(tableName);\n\n if (tableResult.data) {\n return {\n id: tableResult.data.id,\n snapshot_url: tableResult.data.snapshot_url,\n };\n }\n\n return null;\n } catch (error) {\n console.error('Error getting table info:', error);\n return null;\n }\n }\n\n /**\n * Helper method to get table ID by name (deprecated, use getTableInfo instead)\n */\n private async getTableId(tableName: string): Promise<string | null> {\n const tableInfo = await this.getTableInfo(tableName);\n return tableInfo?.id || null;\n }\n}\n","export interface RecordApiEndpoint {\n path: string;\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n authenticated: boolean;\n rateLimit?: {\n requests: number;\n window: number; // in milliseconds\n };\n}\n\nexport interface RecordEndpoints {\n insert: RecordApiEndpoint;\n insertMany: RecordApiEndpoint;\n list: RecordApiEndpoint;\n get: RecordApiEndpoint;\n update: RecordApiEndpoint;\n updateById: RecordApiEndpoint;\n delete: RecordApiEndpoint;\n}\n\nexport const RECORD_ENDPOINTS: RecordEndpoints = {\n insert: {\n path: '/tables/{table_id}/records',\n method: 'POST',\n authenticated: true,\n },\n insertMany: {\n path: '/tables/{table_id}/records/bulk-insert',\n method: 'POST',\n authenticated: true,\n },\n list: {\n path: '/tables/{table_id}/records/list',\n method: 'POST',\n authenticated: true,\n rateLimit: { requests: 200, window: 60000 },\n },\n get: {\n path: '/tables/{table_id}/records/{record_id}',\n method: 'GET',\n authenticated: true,\n rateLimit: { requests: 200, window: 60000 },\n },\n update: {\n path: '/tables/{table_id}/records',\n method: 'PATCH',\n authenticated: true,\n },\n updateById: {\n path: '/tables/{table_id}/records/{record_id}',\n method: 'PATCH',\n authenticated: true,\n },\n\n delete: {\n path: '/tables/{table_id}/records/list',\n method: 'DELETE',\n authenticated: true,\n },\n};\n\nexport const buildRecordEndpointPath = (\n endpoint: RecordApiEndpoint,\n params: Record<string, string> = {}\n): string => {\n let path = endpoint.path;\n\n // Replace path parameters\n Object.entries(params).forEach(([key, value]) => {\n path = path.replace(`{${key}}`, encodeURIComponent(value));\n });\n\n // Check for unreplaced parameters\n const unreplacedParams = path.match(/\\{([^}]+)\\}/g);\n if (unreplacedParams) {\n throw new Error(`Missing path parameters: ${unreplacedParams.join(', ')}`);\n }\n\n return path;\n};\n","import {\n RecordData,\n RecordDeleteOptions,\n RecordDeleteResponse,\n RecordQueryOptions,\n RecordUpdateByIdOptions,\n RecordUpdateOptions,\n RecordWithId,\n} from '../../types/api/record';\nimport {\n ApiFilter,\n mapWhereToFilters,\n normalizeFilters,\n} from '../../utils/filters/filter-mapper';\n\n// API Request/Response interfaces\nexport interface RecordApiRequest {\n data?: RecordData;\n filters?: ApiFilter[];\n page?: {\n page_no: number;\n page_size: number;\n };\n sort?: Record<string, unknown>[];\n}\n\nexport interface RecordApiResponse {\n data: RecordWithId[];\n pagination: {\n total_count: number;\n total_pages: number;\n current_page: number;\n per_page: number;\n type: string;\n };\n}\n\nexport interface RecordInsertApiRequest {\n data: RecordData;\n}\n\nexport interface RecordInsertApiResponse {\n data: RecordWithId;\n}\n\nexport interface RecordUpdateApiRequest {\n set: RecordData;\n filters: ApiFilter[];\n}\n\nexport interface RecordUpdateApiResponse {\n data: RecordWithId[];\n}\n\nexport interface RecordUpdateByIdApiRequest {\n data: RecordData;\n}\n\nexport interface RecordUpdateByIdApiResponse {\n data: RecordWithId;\n}\n\nexport interface RecordDeleteApiRequest {\n filters?: ApiFilter[];\n record_ids?: string[];\n}\n\nexport interface RecordDeleteApiResponse {\n message: string;\n}\n\n// Transform SDK request to API format\nexport function transformInsertRequest(\n sdkRequest: RecordData\n): RecordInsertApiRequest {\n return {\n data: sdkRequest,\n };\n}\n\nexport function transformListRequest(\n sdkRequest: RecordQueryOptions\n): RecordApiRequest {\n return {\n filters: sdkRequest.filters\n ? normalizeFilters(sdkRequest.filters)\n : undefined,\n page: sdkRequest.page,\n sort: sdkRequest.sort,\n };\n}\n\nexport function transformUpdateRequest(\n sdkRequest: RecordUpdateOptions\n): RecordUpdateApiRequest {\n return {\n set: sdkRequest.set,\n filters: normalizeFilters(sdkRequest.filters),\n };\n}\n\nexport function transformUpdateByIdRequest(\n sdkRequest: RecordUpdateByIdOptions\n): RecordUpdateByIdApiRequest {\n return {\n data: sdkRequest.set,\n };\n}\n\n/**\n * Unified delete transformer that handles both record_ids and filters\n */\nexport function transformDeleteRequest(\n sdkRequest: RecordDeleteOptions & { table_id?: string }\n): RecordDeleteApiRequest {\n const result: RecordDeleteApiRequest = {};\n\n // Handle record_ids deletion\n if (sdkRequest.record_ids && sdkRequest.record_ids.length > 0) {\n result.record_ids = sdkRequest.record_ids;\n }\n\n // Handle filters deletion\n if (sdkRequest.filters) {\n if (Array.isArray(sdkRequest.filters)) {\n // If filters is already an array of filters, check if it's ApiFilter or needs conversion\n if (\n sdkRequest.filters.length > 0 &&\n typeof sdkRequest.filters[0] === 'object' &&\n 'field' in sdkRequest.filters[0] &&\n 'operator' in sdkRequest.filters[0] &&\n 'values' in sdkRequest.filters[0]\n ) {\n // Already ApiFilter format\n result.filters = sdkRequest.filters;\n } else {\n // Legacy Record<string, unknown>[] format - convert silently\n console.warn(\n 'Legacy Record<string, unknown>[] filter format detected. Please migrate to the new filter format.'\n );\n // For now, pass through and let backend handle\n result.filters = sdkRequest.filters as ApiFilter[];\n }\n } else {\n // If filters is a where clause object, convert it to API filter format\n result.filters = mapWhereToFilters(sdkRequest.filters);\n }\n }\n\n return result;\n}\n\n// Transform API response to SDK format\nexport function transformInsertResponse(\n apiResponse: RecordInsertApiResponse\n): RecordWithId {\n return apiResponse.data;\n}\n\nexport function transformListResponse(apiResponse: RecordApiResponse): {\n data: RecordWithId[];\n pagination: {\n total_count: number;\n total_pages: number;\n current_page: number;\n per_page: number;\n type: string;\n };\n} {\n return {\n data: apiResponse.data,\n pagination: apiResponse.pagination,\n };\n}\n\nexport function transformUpdateResponse(\n apiResponse: RecordUpdateApiResponse\n): RecordWithId[] {\n return apiResponse.data;\n}\n\nexport function transformUpdateByIdResponse(\n apiResponse: RecordUpdateByIdApiResponse\n): RecordWithId {\n return apiResponse.data;\n}\n\nexport function transformDeleteResponse(\n apiResponse: RecordDeleteApiResponse\n): RecordDeleteResponse {\n return {\n message: apiResponse.message,\n };\n}\n","import {\n RecordBulkInsertOptions,\n RecordBulkInsertResponse,\n RecordData,\n RecordDeleteOptions,\n RecordQueryOptions,\n RecordUpdateByIdOptions,\n RecordUpdateOptions,\n RecordWithId,\n} from '../../types/api/record';\nimport type { Environment, Region } from '../../types/config/environment';\nimport { REGION_CONFIGS } from '../../types/config/environment';\nimport { filterArrayFields, filterObjectFields } from '../../utils/common';\nimport { createHttpAdapter } from '../../utils/http';\nimport { HttpAdapter } from '../../utils/http/adapter';\nimport {\n buildRecordEndpointPath,\n RECORD_ENDPOINTS,\n} from '../endpoints/records';\nimport { transformDeleteRequest } from '../transformers/records';\n\nexport interface RecordsApiClientConfig {\n apiKey: string;\n environment?: Environment;\n region?: Region;\n timeout?: number;\n debug?: boolean;\n retryAttempts?: number;\n retryDelay?: number;\n headers?: Record<string, string>;\n}\n\n// Boltic API Response Structure interfaces\ninterface BolticSuccessResponse<T = unknown> {\n data: T;\n message?: string;\n}\n\ninterface BolticListResponse<T = unknown> {\n data: T[];\n pagination?: {\n total_count: number;\n total_pages: number;\n current_page: number;\n per_page: number;\n type: string;\n };\n message?: string;\n}\n\ninterface BolticErrorResponse {\n data?: never;\n error: {\n code?: string;\n message?: string;\n meta?: string[];\n };\n}\n\n/**\n * Records API Client - handles all record-related API operations\n */\nexport class RecordsApiClient {\n private httpAdapter: HttpAdapter;\n private config: RecordsApiClientConfig;\n private baseURL: string;\n\n constructor(\n apiKey: string,\n config: Omit<RecordsApiClientConfig, 'apiKey'> = {}\n ) {\n this.config = { apiKey, ...config };\n this.httpAdapter = createHttpAdapter();\n\n // Set baseURL based on environment and region\n const environment = config.environment || 'prod';\n const region = config.region || 'asia-south1'; // Default to asia-south1 for legacy support\n this.baseURL = this.getBaseURL(environment, region);\n }\n\n private getBaseURL(environment: Environment, region: Region): string {\n const regionConfig = REGION_CONFIGS[region];\n if (!regionConfig) {\n throw new Error(`Unsupported region: ${region}`);\n }\n\n const envConfig = regionConfig[environment];\n if (!envConfig) {\n throw new Error(\n `Unsupported environment: ${environment} for region: ${region}`\n );\n }\n\n return `${envConfig.baseURL}/v1`;\n }\n\n /**\n * Insert a single record\n */\n async insertRecord(\n request: RecordData & { table_id?: string }\n ): Promise<BolticSuccessResponse<RecordWithId> | BolticErrorResponse> {\n try {\n const { table_id, fields, ...recordData } = request;\n\n if (!table_id) {\n return this.formatErrorResponse(\n new Error('table_id is required for insert operation')\n );\n }\n\n const endpoint = RECORD_ENDPOINTS.insert;\n const url = `${this.baseURL}${buildRecordEndpointPath(endpoint, { table_id })}`;\n\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n data: recordData,\n timeout: this.config.timeout,\n });\n\n // Apply field filtering if fields are specified\n const responseData = response.data as BolticSuccessResponse<RecordWithId>;\n if (fields && responseData.data) {\n responseData.data = filterObjectFields(\n responseData.data,\n fields\n ) as RecordWithId;\n }\n\n return responseData;\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n /**\n * Insert multiple records in bulk\n */\n async insertManyRecords(\n records: RecordData[],\n tableId: string,\n options: RecordBulkInsertOptions = { validation: true }\n ): Promise<RecordBulkInsertResponse | BolticErrorResponse> {\n try {\n if (!tableId) {\n return this.formatErrorResponse(\n new Error('table_id is required for bulk insert operation')\n );\n }\n\n if (!records || !Array.isArray(records) || records.length === 0) {\n return this.formatErrorResponse(\n new Error('records array is required and cannot be empty')\n );\n }\n\n const endpoint = RECORD_ENDPOINTS.insertMany;\n let url = `${this.baseURL}${buildRecordEndpointPath(endpoint, { table_id: tableId })}`;\n\n // Add validation query parameter\n const queryParams = new URLSearchParams();\n if (options.validation !== undefined) {\n queryParams.append('validation', options.validation.toString());\n }\n\n if (queryParams.toString()) {\n url += `?${queryParams.toString()}`;\n }\n\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n data: records,\n timeout: this.config.timeout,\n });\n\n return response.data as RecordBulkInsertResponse;\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n /**\n * Get a single record by ID\n */\n async getRecord(\n recordId: string,\n tableId: string,\n options: { fields?: string[] } = {}\n ): Promise<BolticSuccessResponse<RecordWithId> | BolticErrorResponse> {\n try {\n if (!tableId) {\n return this.formatErrorResponse(\n new Error('table_id is required for get operation')\n );\n }\n\n const endpoint = RECORD_ENDPOINTS.get;\n const url = `${this.baseURL}${buildRecordEndpointPath(endpoint, {\n table_id: tableId,\n record_id: recordId,\n })}`;\n\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n timeout: this.config.timeout,\n });\n\n // Apply field filtering if fields are specified\n const responseData = response.data as BolticSuccessResponse<RecordWithId>;\n if (options.fields && responseData.data) {\n responseData.data = filterObjectFields(\n responseData.data,\n options.fields\n ) as RecordWithId;\n }\n\n return responseData;\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n /**\n * List records with filtering and pagination\n */\n async listRecords(\n options: RecordQueryOptions & { table_id?: string } = {}\n ): Promise<BolticListResponse<RecordWithId> | BolticErrorResponse> {\n try {\n const { table_id, ...queryOptions } = options;\n\n if (!table_id) {\n return this.formatErrorResponse(\n new Error('table_id is required for list operation')\n );\n }\n\n const endpoint = RECORD_ENDPOINTS.list;\n const url = `${this.baseURL}${buildRecordEndpointPath(endpoint, { table_id })}`;\n\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n data: queryOptions,\n timeout: this.config.timeout,\n });\n\n // Apply field filtering if fields are specified\n const responseData = response.data as BolticListResponse<RecordWithId>;\n if (queryOptions.fields && responseData.data) {\n responseData.data = filterArrayFields(\n responseData.data,\n queryOptions.fields\n ) as RecordWithId[];\n }\n\n return responseData;\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n /**\n * Update records by filters\n */\n async updateRecords(\n request: RecordUpdateOptions & { table_id?: string }\n ): Promise<BolticListResponse<RecordWithId> | BolticErrorResponse> {\n try {\n const { table_id, ...updateOptions } = request;\n\n if (!table_id) {\n return this.formatErrorResponse(\n new Error('table_id is required for update operation')\n );\n }\n\n const endpoint = RECORD_ENDPOINTS.update;\n const url = `${this.baseURL}${buildRecordEndpointPath(endpoint, { table_id })}`;\n\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n data: updateOptions,\n timeout: this.config.timeout,\n });\n\n // Apply field filtering if fields are specified in the request\n const responseData = response.data as BolticListResponse<RecordWithId>;\n if (updateOptions.fields && responseData.data) {\n responseData.data = filterArrayFields(\n responseData.data,\n updateOptions.fields\n ) as RecordWithId[];\n }\n\n return responseData;\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n /**\n * Update a single record by ID\n */\n async updateRecordById(\n recordId: string,\n request: RecordUpdateByIdOptions & { table_id?: string }\n ): Promise<BolticSuccessResponse<RecordWithId> | BolticErrorResponse> {\n try {\n const { table_id, ...updateOptions } = request;\n\n if (!table_id) {\n return this.formatErrorResponse(\n new Error('table_id is required for updateById operation')\n );\n }\n\n const endpoint = RECORD_ENDPOINTS.updateById;\n const url = `${this.baseURL}${buildRecordEndpointPath(endpoint, {\n record_id: recordId,\n table_id,\n })}`;\n\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n data: updateOptions.set,\n timeout: this.config.timeout,\n });\n\n // Apply field filtering if fields are specified\n const responseData = response.data as BolticSuccessResponse<RecordWithId>;\n if (updateOptions.fields && responseData.data) {\n responseData.data = filterObjectFields(\n responseData.data,\n updateOptions.fields\n ) as RecordWithId;\n }\n\n return responseData;\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n /**\n * Unified delete records method that supports both record_ids and filters\n */\n async deleteRecords(\n request: RecordDeleteOptions & { table_id?: string }\n ): Promise<BolticSuccessResponse<{ message: string }> | BolticErrorResponse> {\n try {\n const { table_id } = request;\n\n if (!table_id) {\n return this.formatErrorResponse(\n new Error('table_id is required for delete operation')\n );\n }\n\n // Transform the request to API format\n const transformedRequest = transformDeleteRequest(request);\n\n const endpoint = RECORD_ENDPOINTS.delete;\n const url = `${this.baseURL}${buildRecordEndpointPath(endpoint, { table_id })}`;\n\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n data: transformedRequest,\n timeout: this.config.timeout,\n });\n\n // Return raw response without transformation\n return response.data as BolticSuccessResponse<{ message: string }>;\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n /**\n * Delete a single record by ID\n */\n async deleteRecordById(\n recordId: string,\n request: { table_id?: string }\n ): Promise<BolticSuccessResponse<{ message: string }> | BolticErrorResponse> {\n // Use deleteRecords with a single ID\n return this.deleteRecords({\n record_ids: [recordId],\n table_id: request.table_id,\n });\n }\n\n private buildHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'x-boltic-token': this.config.apiKey,\n };\n }\n\n private formatErrorResponse(error: unknown): BolticErrorResponse {\n if (this.config.debug) {\n console.error('Records API Error:', error);\n }\n\n // Handle different error types following Boltic format\n if (error && typeof error === 'object' && 'response' in error) {\n const apiError = error as {\n response?: {\n data?: BolticErrorResponse;\n status?: number;\n };\n };\n\n // If API already returned Boltic format, use it\n if (apiError.response?.data?.error) {\n return apiError.response.data;\n }\n\n // Otherwise format it to Boltic structure\n return {\n error: {\n code: 'API_ERROR',\n message: (error as unknown as Error).message || 'Unknown API error',\n meta: [`Status: ${apiError.response?.status || 'unknown'}`],\n },\n };\n }\n\n if (error && typeof error === 'object' && 'message' in error) {\n return {\n error: {\n code: 'CLIENT_ERROR',\n message: (error as Error).message,\n meta: ['Client-side error occurred'],\n },\n };\n }\n\n return {\n error: {\n code: 'UNKNOWN_ERROR',\n message: 'An unexpected error occurred',\n meta: ['Unknown error type'],\n },\n };\n }\n}\n","import { RecordsApiClient } from '../../api/clients/records-api-client';\nimport { TablesApiClient } from '../../api/clients/tables-api-client';\nimport {\n RecordBulkInsertOptions,\n RecordBulkInsertResponse,\n RecordData,\n RecordDeleteOptions,\n RecordQueryOptions,\n RecordUpdateByIdOptions,\n RecordUpdateOptions,\n RecordWithId,\n} from '../../types/api/record';\nimport { BaseClient } from '../core/base-client';\nimport { ColumnResource } from './column';\nimport { TableResource } from './table';\n\nimport {\n BolticErrorResponse,\n BolticListResponse,\n BolticSuccessResponse,\n isErrorResponse,\n} from '../../types/common/responses';\n\nexport class RecordResource {\n private apiClient: RecordsApiClient;\n private tablesApiClient: TablesApiClient;\n private client: BaseClient;\n\n constructor(client: BaseClient) {\n this.client = client;\n // Initialize the API client with the client's configuration\n this.apiClient = new RecordsApiClient(client.getConfig().apiKey, {\n environment: client.getConfig().environment,\n region: client.getConfig().region,\n timeout: client.getConfig().timeout,\n debug: client.getConfig().debug,\n });\n\n // Initialize the tables API client for getting table IDs\n this.tablesApiClient = new TablesApiClient(client.getConfig().apiKey, {\n environment: client.getConfig().environment,\n region: client.getConfig().region,\n timeout: client.getConfig().timeout,\n debug: client.getConfig().debug,\n });\n }\n\n /**\n * Insert a single record\n */\n async insert(\n tableName: string,\n data: RecordData\n ): Promise<BolticSuccessResponse<RecordWithId> | BolticErrorResponse> {\n try {\n // Get table information first\n const tableInfo = await this.getTableInfo(tableName);\n if (!tableInfo) {\n return {\n error: {\n code: 'TABLE_NOT_FOUND',\n message: `Table '${tableName}' not found`,\n },\n };\n }\n\n // Get table columns to determine which fields might be missing\n const completeDataResult = await this.ensureCompleteRecordData(\n tableName,\n data\n );\n if ('error' in completeDataResult && completeDataResult.error) {\n return completeDataResult as BolticErrorResponse;\n }\n\n // Include table_id in the request payload\n const requestData = {\n ...(completeDataResult as RecordData),\n table_id: tableInfo.id,\n };\n const result = await this.apiClient.insertRecord(requestData);\n\n if (isErrorResponse(result)) {\n return result;\n }\n\n return result as BolticSuccessResponse<RecordWithId>;\n } catch (error) {\n return {\n error: {\n code: 'INSERT_ERROR',\n message:\n error instanceof Error ? error.message : 'Unknown error occurred',\n },\n };\n }\n }\n\n /**\n * Insert multiple records in bulk\n */\n async insertMany(\n tableName: string,\n records: RecordData[],\n options: RecordBulkInsertOptions = { validation: true }\n ): Promise<RecordBulkInsertResponse | BolticErrorResponse> {\n try {\n // Validate input\n if (!records || !Array.isArray(records) || records.length === 0) {\n return {\n error: {\n code: 'INVALID_INPUT',\n message: 'Records array is required and cannot be empty',\n },\n };\n }\n\n // Get table information first\n const tableInfo = await this.getTableInfo(tableName);\n if (!tableInfo) {\n return {\n error: {\n code: 'TABLE_NOT_FOUND',\n message: `Table '${tableName}' not found`,\n },\n };\n }\n\n // Send records as-is to API with validation parameter\n const result = await this.apiClient.insertManyRecords(\n records,\n tableInfo.id,\n options\n );\n\n if (isErrorResponse(result)) {\n return result;\n }\n\n return result as RecordBulkInsertResponse;\n } catch (error) {\n return {\n error: {\n code: 'INSERT_MANY_ERROR',\n message:\n error instanceof Error ? error.message : 'Unknown error occurred',\n },\n };\n }\n }\n\n /**\n * Get a single record by ID\n */\n async get(\n tableName: string,\n recordId: string\n ): Promise<BolticSuccessResponse<RecordWithId> | BolticErrorResponse> {\n try {\n // Get table information first\n const tableInfo = await this.getTableInfo(tableName);\n if (!tableInfo) {\n return {\n error: {\n code: 'TABLE_NOT_FOUND',\n message: `Table '${tableName}' not found`,\n },\n };\n }\n\n const result = await this.apiClient.getRecord(recordId, tableInfo.id);\n\n if (isErrorResponse(result)) {\n return result;\n }\n\n return result as BolticSuccessResponse<RecordWithId>;\n } catch (error) {\n return {\n error: {\n code: 'GET_ERROR',\n message:\n error instanceof Error ? error.message : 'Unknown error occurred',\n },\n };\n }\n }\n\n /**\n * List records with filtering and pagination\n */\n async list(\n tableName: string,\n options: RecordQueryOptions = {}\n ): Promise<BolticListResponse<RecordWithId> | BolticErrorResponse> {\n try {\n // Get table information first\n const tableInfo = await this.getTableInfo(tableName);\n if (!tableInfo) {\n return {\n error: {\n code: 'TABLE_NOT_FOUND',\n message: `Table '${tableName}' not found`,\n },\n };\n }\n\n // Include table_id in the request payload\n const requestOptions = { ...options, table_id: tableInfo.id };\n const result = await this.apiClient.listRecords(requestOptions);\n\n if (isErrorResponse(result)) {\n return result;\n }\n\n return result as BolticListResponse<RecordWithId>;\n } catch (error) {\n return {\n error: {\n code: 'LIST_ERROR',\n message:\n error instanceof Error ? error.message : 'Unknown error occurred',\n },\n };\n }\n }\n\n /**\n * Update records by filters\n */\n async update(\n tableName: string,\n options: RecordUpdateOptions\n ): Promise<BolticListResponse<RecordWithId> | BolticErrorResponse> {\n try {\n // Get table information first\n const tableInfo = await this.getTableInfo(tableName);\n if (!tableInfo) {\n return {\n error: {\n code: 'TABLE_NOT_FOUND',\n message: `Table '${tableName}' not found`,\n },\n };\n }\n\n // Include table_id in the request payload\n const requestOptions = { ...options, table_id: tableInfo.id };\n const result = await this.apiClient.updateRecords(requestOptions);\n\n if (isErrorResponse(result)) {\n return result;\n }\n\n return result as BolticListResponse<RecordWithId>;\n } catch (error) {\n return {\n error: {\n code: 'UPDATE_ERROR',\n message:\n error instanceof Error ? error.message : 'Unknown error occurred',\n },\n };\n }\n }\n\n /**\n * Update a single record by ID\n */\n async updateById(\n tableName: string,\n recordId: string,\n data: RecordData\n ): Promise<BolticSuccessResponse<RecordWithId> | BolticErrorResponse> {\n try {\n // Get table information first\n const tableInfo = await this.getTableInfo(tableName);\n if (!tableInfo) {\n return {\n error: {\n code: 'TABLE_NOT_FOUND',\n message: `Table '${tableName}' not found`,\n },\n };\n }\n\n // Include table_id in the request payload\n const requestOptions: RecordUpdateByIdOptions & { table_id: string } = {\n id: recordId,\n set: data,\n table_id: tableInfo.id,\n };\n const result = await this.apiClient.updateRecordById(\n recordId,\n requestOptions\n );\n\n if (isErrorResponse(result)) {\n return result;\n }\n\n return result as BolticSuccessResponse<RecordWithId>;\n } catch (error) {\n return {\n error: {\n code: 'UPDATE_BY_ID_ERROR',\n message:\n error instanceof Error ? error.message : 'Unknown error occurred',\n },\n };\n }\n }\n\n /**\n * Unified delete method that supports both record IDs and filters\n */\n async delete(\n tableName: string,\n options: RecordDeleteOptions\n ): Promise<BolticSuccessResponse<{ message: string }> | BolticErrorResponse> {\n try {\n // Get table information first\n const tableInfo = await this.getTableInfo(tableName);\n if (!tableInfo) {\n return {\n error: {\n code: 'TABLE_NOT_FOUND',\n message: `Table '${tableName}' not found`,\n },\n };\n }\n\n // Include table_id in the request payload\n const requestOptions = { ...options, table_id: tableInfo.id };\n const result = await this.apiClient.deleteRecords(requestOptions);\n\n if (isErrorResponse(result)) {\n return result;\n }\n\n return result as BolticSuccessResponse<{ message: string }>;\n } catch (error) {\n return {\n error: {\n code: 'DELETE_ERROR',\n message:\n error instanceof Error ? error.message : 'Unknown error occurred',\n },\n };\n }\n }\n\n /**\n * Delete a single record by ID\n */\n async deleteById(\n tableName: string,\n recordId: string\n ): Promise<BolticSuccessResponse<{ message: string }> | BolticErrorResponse> {\n try {\n // Get table information first\n const tableInfo = await this.getTableInfo(tableName);\n if (!tableInfo) {\n return {\n error: {\n code: 'TABLE_NOT_FOUND',\n message: `Table '${tableName}' not found`,\n },\n };\n }\n\n const result = await this.apiClient.deleteRecordById(recordId, {\n table_id: tableInfo.id,\n });\n\n if (isErrorResponse(result)) {\n return result;\n }\n\n return result as BolticSuccessResponse<{ message: string }>;\n } catch (error) {\n return {\n error: {\n code: 'DELETE_BY_ID_ERROR',\n message:\n error instanceof Error ? error.message : 'Unknown error occurred',\n },\n };\n }\n }\n\n /**\n * Helper method to get table information by name\n */\n private async getTableInfo(\n tableName: string\n ): Promise<{ id: string; snapshot_url?: string } | null> {\n try {\n // Use the table resource to find the table by name\n const tableResource = new TableResource(this.client);\n const tableResult = await tableResource.findByName(tableName);\n\n if (tableResult.data) {\n return {\n id: tableResult.data.id,\n snapshot_url: tableResult.data.snapshot_url,\n };\n }\n\n return null;\n } catch (error) {\n console.error('Error getting table info:', error);\n return null;\n }\n }\n\n /**\n * Helper method to ensure all required fields for a record are present,\n * filling missing ones with null.\n */\n private async ensureCompleteRecordData(\n tableName: string,\n data: RecordData\n ): Promise<RecordData | BolticErrorResponse> {\n try {\n const columnResource = new ColumnResource(this.client);\n const columnsResult = await columnResource.findAll(tableName);\n\n if (isErrorResponse(columnsResult)) {\n return columnsResult;\n }\n\n // Get the actual columns array from the response\n const columns = Array.isArray(columnsResult.data)\n ? columnsResult.data\n : [];\n\n // Create complete data object with all table columns\n const completeData: RecordData = { ...data };\n\n // Set missing fields to null (only for columns that are not system-generated)\n for (const column of columns) {\n // Skip system columns that are auto-generated\n if (\n column.name === 'id' ||\n column.name === 'created_at' ||\n column.name === 'updated_at'\n ) {\n continue;\n }\n\n // If field is missing from provided data, set it to null\n if (!(column.name in data)) {\n completeData[column.name] = null;\n }\n }\n\n return completeData;\n } catch (error) {\n return {\n error: {\n code: 'COMPLETE_DATA_ERROR',\n message:\n error instanceof Error ? error.message : 'Unknown error occurred',\n },\n };\n }\n }\n}\n","import {\n RecordData,\n RecordQueryOptions,\n RecordUpdateOptions,\n RecordWithId,\n} from '../../types/api/record';\nimport {\n BolticErrorResponse,\n BolticListResponse,\n BolticSuccessResponse,\n} from '../../types/common/responses';\nimport { RecordResource } from './record';\n\nexport interface RecordBuilderOptions {\n tableName: string;\n recordResource: RecordResource;\n}\n\n/**\n * Record Builder - provides a fluent interface for building record queries and operations\n */\nexport class RecordBuilder {\n private tableName: string;\n private recordResource: RecordResource;\n private queryOptions: RecordQueryOptions = {};\n private updateData: RecordData = {};\n\n constructor(options: RecordBuilderOptions) {\n this.tableName = options.tableName;\n this.recordResource = options.recordResource;\n }\n\n /**\n * Add filter conditions\n */\n where(conditions: Record<string, unknown>): RecordBuilder {\n if (!this.queryOptions.filters) {\n this.queryOptions.filters = [];\n }\n\n // Convert conditions to filter format\n Object.entries(conditions).forEach(([field, value]) => {\n this.queryOptions.filters!.push({\n field,\n operator: 'equals',\n values: [value],\n });\n });\n\n return this;\n }\n\n /**\n * Set sorting\n */\n orderBy(field: string, direction: 'asc' | 'desc' = 'asc'): RecordBuilder {\n if (!this.queryOptions.sort) {\n this.queryOptions.sort = [];\n }\n this.queryOptions.sort.push({ field, order: direction });\n return this;\n }\n\n /**\n * Set limit (using page)\n */\n limit(count: number): RecordBuilder {\n if (!this.queryOptions.page) {\n this.queryOptions.page = { page_no: 1, page_size: count };\n } else {\n this.queryOptions.page.page_size = count;\n }\n return this;\n }\n\n /**\n * Set offset (using page)\n */\n offset(count: number): RecordBuilder {\n if (!this.queryOptions.page) {\n this.queryOptions.page = {\n page_no: Math.floor(count / 50) + 1,\n page_size: 50,\n };\n } else {\n // Calculate page number based on offset and page size\n const pageSize = this.queryOptions.page.page_size || 50;\n this.queryOptions.page.page_no = Math.floor(count / pageSize) + 1;\n }\n return this;\n }\n\n /**\n * Set fields to select\n */\n select(fields: string[]): RecordBuilder {\n this.queryOptions.fields = fields;\n return this;\n }\n\n /**\n * Set data for update operations\n */\n set(data: RecordData): RecordBuilder {\n this.updateData = { ...this.updateData, ...data };\n return this;\n }\n\n /**\n * Set pagination\n */\n page(pageNo: number, pageSize: number = 50): RecordBuilder {\n this.queryOptions.page = {\n page_no: pageNo,\n page_size: pageSize,\n };\n return this;\n }\n\n /**\n * Execute list operation (was findAll)\n */\n async list(): Promise<\n BolticListResponse<RecordWithId> | BolticErrorResponse\n > {\n return this.recordResource.list(this.tableName, this.queryOptions);\n }\n\n /**\n * Execute findAll operation (alias for list)\n */\n async findAll(): Promise<\n BolticListResponse<RecordWithId> | BolticErrorResponse\n > {\n return this.recordResource.list(this.tableName, this.queryOptions);\n }\n\n /**\n * Execute findOne operation by getting first result from list\n */\n async findOne(): Promise<\n BolticSuccessResponse<RecordWithId | null> | BolticErrorResponse\n > {\n // Use limit 1 to get just one record\n const queryOptions = { ...this.queryOptions, limit: 1 };\n const result = await this.recordResource.list(this.tableName, queryOptions);\n\n if ('error' in result) {\n return result as BolticErrorResponse;\n }\n\n // Return the first record or null in success format\n const record = result.data.length > 0 ? result.data[0] : null;\n return {\n data: record,\n message: record ? 'Record found' : 'No record found',\n };\n }\n\n /**\n * Build where conditions from filters for API consumption\n */\n private buildWhereConditions(): Record<string, unknown> {\n const where: Record<string, unknown> = {};\n\n if (this.queryOptions.filters) {\n this.queryOptions.filters.forEach((filter) => {\n // Handle both ApiFilter and legacy Record<string, unknown> formats\n if ('field' in filter && 'values' in filter) {\n // ApiFilter format\n const apiFilter = filter as {\n field: string;\n operator: string;\n values: unknown[];\n };\n const fieldName = String(apiFilter.field);\n if (apiFilter.operator === 'equals') {\n where[fieldName] = apiFilter.values[0];\n } else if (apiFilter.operator === 'contains') {\n where[fieldName] = { $like: `%${String(apiFilter.values[0])}%` };\n } else {\n // For other operators, convert them appropriately\n where[fieldName] = apiFilter.values[0];\n }\n } else {\n // Legacy Record<string, unknown> format\n Object.assign(where, filter);\n }\n });\n }\n\n return where;\n }\n\n /**\n * Execute update operation - requires filters or record IDs\n */\n async update(): Promise<\n BolticListResponse<RecordWithId> | BolticErrorResponse\n > {\n if (!this.updateData) {\n return {\n error: {\n code: 'MISSING_UPDATE_DATA',\n message: 'Update data is required for update operation',\n },\n } as unknown as BolticErrorResponse;\n }\n\n const updateOptions: RecordUpdateOptions = {\n set: this.updateData,\n filters: this.queryOptions.filters || [],\n };\n\n return this.recordResource.update(this.tableName, updateOptions);\n }\n\n /**\n * Execute update by ID operation\n */\n async updateById(\n id: string\n ): Promise<BolticSuccessResponse<RecordWithId> | BolticErrorResponse> {\n return this.recordResource.updateById(this.tableName, id, this.updateData);\n }\n\n /**\n * Execute delete by single ID operation\n */\n async deleteById(\n id: string\n ): Promise<BolticSuccessResponse<{ message: string }> | BolticErrorResponse> {\n return this.recordResource.deleteById(this.tableName, id);\n }\n\n /**\n * Execute delete by IDs operation\n */\n async deleteByIds(\n ids: string[]\n ): Promise<BolticSuccessResponse<{ message: string }> | BolticErrorResponse> {\n return this.recordResource.delete(this.tableName, { record_ids: ids });\n }\n\n /**\n * Execute delete operation using filters\n */\n async delete(): Promise<\n BolticSuccessResponse<{ message: string }> | BolticErrorResponse\n > {\n if (!this.queryOptions.filters || this.queryOptions.filters.length === 0) {\n return {\n error: {\n code: 'MISSING_DELETE_CONDITIONS',\n message:\n 'Filter conditions are required for delete operation. Use where() to specify conditions.',\n },\n };\n }\n\n const deleteOptions = {\n filters: this.buildWhereConditions(),\n };\n\n return this.recordResource.delete(this.tableName, deleteOptions);\n }\n\n /**\n * Get the built query options (for debugging)\n */\n getQueryOptions(): RecordQueryOptions {\n return { ...this.queryOptions };\n }\n\n /**\n * Get the update data (for debugging)\n */\n getUpdateData(): RecordData {\n return { ...this.updateData };\n }\n\n /**\n * Execute insert operation\n */\n async insert(\n data: RecordData\n ): Promise<BolticSuccessResponse<RecordWithId> | BolticErrorResponse> {\n return this.recordResource.insert(this.tableName, data);\n }\n}\n\n/**\n * Create a new record builder\n */\nexport function createRecordBuilder(\n options: RecordBuilderOptions\n): RecordBuilder {\n return new RecordBuilder(options);\n}\n","export interface ApiEndpoint {\n path: string;\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n authenticated: boolean;\n rateLimit?: {\n requests: number;\n window: number; // in milliseconds\n };\n}\n\nexport interface SqlEndpoints {\n textToSQL: ApiEndpoint;\n executeSQL: ApiEndpoint;\n}\n\nexport const SQL_ENDPOINTS: SqlEndpoints = {\n textToSQL: {\n path: '/tables/query/text-to-sql',\n method: 'POST',\n authenticated: true,\n rateLimit: { requests: 100, window: 60000 }, // Limited due to AI processing\n },\n executeSQL: {\n path: '/tables/query/execute',\n method: 'POST',\n authenticated: true,\n rateLimit: { requests: 200, window: 60000 },\n },\n};\n\n/**\n * Build SQL endpoint path - all SQL endpoints are simple paths without parameters\n */\nexport const buildSqlEndpointPath = (\n endpoint: ApiEndpoint,\n params: Record<string, string> = {}\n): string => {\n let path = endpoint.path;\n\n // Replace path parameters if any (though SQL endpoints don't currently use them)\n Object.entries(params).forEach(([key, value]) => {\n path = path.replace(`{${key}}`, encodeURIComponent(value));\n });\n\n return path;\n};\n","import { BolticErrorResponse } from '../../types/common/responses';\nimport type { Environment, Region } from '../../types/config/environment';\nimport { REGION_CONFIGS } from '../../types/config/environment';\nimport { HttpAdapter, createHttpAdapter } from '../../utils/http';\n\nexport interface BaseApiClientConfig {\n apiKey: string;\n environment?: Environment;\n region?: Region;\n timeout?: number;\n debug?: boolean;\n retryAttempts?: number;\n retryDelay?: number;\n headers?: Record<string, string>;\n}\n\n/**\n * Base API Client - provides common functionality for all API clients\n */\nexport abstract class BaseApiClient {\n protected httpAdapter: HttpAdapter;\n protected config: BaseApiClientConfig;\n protected baseURL: string;\n\n constructor(\n apiKey: string,\n config: Omit<BaseApiClientConfig, 'apiKey'> = {}\n ) {\n this.config = { apiKey, ...config };\n this.httpAdapter = createHttpAdapter();\n\n // Set baseURL based on environment and region\n const environment = config.environment || 'prod';\n const region = config.region || 'asia-south1'; // Default to asia-south1 for legacy support\n this.baseURL = this.getBaseURL(environment, region);\n }\n\n private getBaseURL(environment: Environment, region: Region): string {\n const regionConfig = REGION_CONFIGS[region];\n if (!regionConfig) {\n throw new Error(`Unsupported region: ${region}`);\n }\n\n const envConfig = regionConfig[environment];\n if (!envConfig) {\n throw new Error(\n `Unsupported environment: ${environment} for region: ${region}`\n );\n }\n\n return `${envConfig.baseURL}/v1`;\n }\n\n protected buildHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'x-boltic-token': this.config.apiKey,\n ...this.config.headers,\n };\n }\n\n protected formatErrorResponse(\n error: unknown,\n prefix = 'API'\n ): BolticErrorResponse {\n if (this.config.debug) {\n console.error(`${prefix} Error:`, error);\n }\n\n // Handle different error types following Boltic format\n if (error && typeof error === 'object' && 'response' in error) {\n const apiError = error as {\n response?: {\n data?: BolticErrorResponse;\n status?: number;\n };\n };\n\n // If API already returned Boltic format, use it\n if (apiError.response?.data?.error) {\n return apiError.response.data;\n }\n\n // Otherwise format it to Boltic structure\n return {\n error: {\n code: `${prefix}_ERROR`,\n message:\n (error as unknown as Error).message || `Unknown ${prefix} error`,\n meta: [`Status: ${apiError.response?.status || 'unknown'}`],\n },\n };\n }\n\n if (error && typeof error === 'object' && 'message' in error) {\n return {\n error: {\n code: `${prefix}_CLIENT_ERROR`,\n message: (error as Error).message,\n meta: [`${prefix} client-side error occurred`],\n },\n };\n }\n\n return {\n error: {\n code: `${prefix}_UNKNOWN_ERROR`,\n message: `An unexpected ${prefix} error occurred`,\n meta: [`Unknown ${prefix} error type`],\n },\n };\n }\n\n // Security methods to prevent API key exposure\n toString(): string {\n return `${this.constructor.name} { environment: \"${this.config.environment || 'prod'}\", debug: ${this.config.debug || false} }`;\n }\n\n toJSON(): object {\n const safeConfig = { ...this.config };\n delete (safeConfig as Record<string, unknown>).apiKey;\n return {\n client: this.constructor.name,\n config: safeConfig,\n };\n }\n\n // Custom inspect method for Node.js console logging\n [Symbol.for('nodejs.util.inspect.custom')](): string {\n return this.toString();\n }\n}\n","import {\n ExecuteSQLApiRequest,\n ExecuteSQLApiResponse,\n TextToSQLApiRequest,\n TextToSQLApiResponse,\n} from '../../types/api/sql';\nimport { BolticErrorResponse } from '../../types/common/responses';\nimport { SQL_ENDPOINTS, buildSqlEndpointPath } from '../endpoints/sql';\nimport { BaseApiClient, BaseApiClientConfig } from './base-api-client';\n\nexport interface SqlApiClientConfig extends BaseApiClientConfig {}\n\n/**\n * SQL API Client - handles all SQL-related API operations\n */\nexport class SqlApiClient extends BaseApiClient {\n constructor(apiKey: string, config: Omit<SqlApiClientConfig, 'apiKey'> = {}) {\n super(apiKey, config);\n }\n\n /**\n * Convert natural language to SQL query (streaming)\n */\n async textToSQL(\n request: TextToSQLApiRequest\n ): Promise<AsyncIterable<string> | BolticErrorResponse> {\n try {\n const endpoint = SQL_ENDPOINTS.textToSQL;\n const url = `${this.baseURL}${buildSqlEndpointPath(endpoint)}`;\n\n // For now, make a regular request and simulate streaming\n // TODO: Implement proper streaming when backend supports it\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n data: request,\n timeout: this.config.timeout,\n });\n\n // Check for error response\n if (response.status >= 400) {\n return this.formatErrorResponse(\n {\n response: { data: response.data, status: response.status },\n },\n 'SQL'\n );\n }\n\n // Convert to AsyncIterable for streaming interface\n const sqlResponse = response.data as TextToSQLApiResponse;\n return this.createAsyncIterable(sqlResponse.data);\n } catch (error) {\n return this.formatErrorResponse(error, 'SQL');\n }\n }\n\n /**\n * Execute SQL query\n */\n async executeSQL(\n request: ExecuteSQLApiRequest\n ): Promise<ExecuteSQLApiResponse | BolticErrorResponse> {\n try {\n const endpoint = SQL_ENDPOINTS.executeSQL;\n const url = `${this.baseURL}${buildSqlEndpointPath(endpoint)}`;\n\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n data: request,\n timeout: this.config.timeout,\n });\n\n // Check for error response\n if (response.status >= 400) {\n return this.formatErrorResponse(\n {\n response: { data: response.data, status: response.status },\n },\n 'SQL'\n );\n }\n\n // Return raw response without transformation\n return response.data as ExecuteSQLApiResponse;\n } catch (error) {\n return this.formatErrorResponse(error, 'SQL');\n }\n }\n\n /**\n * Helper method to create AsyncIterable from string data\n * TODO: Replace with proper streaming implementation when backend supports it\n */\n private async *createAsyncIterable(data: string): AsyncIterable<string> {\n // For now, just yield the complete string\n // In the future, this could be replaced with actual streaming chunks\n yield data;\n }\n}\n","import { TextToSQLApiRequest } from '../../types/api/sql';\nimport { TextToSQLOptions } from '../../types/sql';\n\n/**\n * Transform SDK text-to-SQL options to API request\n */\nexport function transformTextToSQLRequest(\n prompt: string,\n options: TextToSQLOptions = {}\n): TextToSQLApiRequest {\n return {\n prompt,\n current_query: options.currentQuery,\n };\n}\n","import { SqlApiClient } from '../../api/clients/sql-api-client';\nimport { transformTextToSQLRequest } from '../../api/transformers/sql';\nimport { ExecuteSQLApiResponse } from '../../types/api/sql';\nimport { isErrorResponse } from '../../types/common/responses';\nimport { TextToSQLOptions } from '../../types/sql';\nimport { BaseClient } from '../core/base-client';\n\nexport class SqlResource {\n private sqlApiClient: SqlApiClient;\n\n constructor(client: BaseClient) {\n // Initialize the SQL API client with the client's configuration\n const config = client.getConfig();\n this.sqlApiClient = new SqlApiClient(config.apiKey, {\n environment: config.environment,\n region: config.region,\n timeout: config.timeout,\n debug: config.debug,\n retryAttempts: config.retryAttempts,\n retryDelay: config.retryDelay,\n headers: config.headers,\n });\n }\n\n /**\n * Convert natural language to SQL query\n * Returns streaming results for real-time query generation\n *\n * @param prompt - Natural language description of the desired query\n * @param options - Optional parameters including currentQuery for refinement\n * @returns AsyncIterable<string> for streaming SQL generation\n *\n */\n async textToSQL(\n prompt: string,\n options: TextToSQLOptions = {}\n ): Promise<AsyncIterable<string>> {\n const request = transformTextToSQLRequest(prompt, options);\n const response = await this.sqlApiClient.textToSQL(request);\n\n // Check if response is an error by checking for the error property\n if ('error' in response && response.error !== undefined) {\n throw response; // Throw the API response directly\n }\n\n return response as AsyncIterable<string>;\n }\n\n /**\n * Execute SQL query with built-in safety measures and performance optimization\n *\n * @param query - SQL query string to execute\n * @returns Promise<ExecuteSQLApiResponse> with raw API response following Boltic API Response Structure\n *\n */\n async executeSQL(\n query: string\n ): Promise<\n | ExecuteSQLApiResponse\n | import('../../types/common/responses').BolticErrorResponse\n > {\n const response = await this.sqlApiClient.executeSQL({ query });\n\n if (isErrorResponse(response)) {\n return response; // Return error response for caller to handle\n }\n\n return response; // Return raw API response following Boltic API Response Structure\n }\n}\n","import { TablesApiClient } from '../../api/clients/tables-api-client';\nimport { ValidationError } from '../../errors/utils';\nimport {\n FieldDefinition,\n TableCreateRequest,\n TableCreateResponse,\n} from '../../types/api/table';\nimport {\n BolticErrorResponse,\n BolticSuccessResponse,\n} from '../../types/common/responses';\n\nexport interface TableBuilderOptions {\n name: string;\n description?: string;\n is_ai_generated_schema?: boolean;\n}\n\n/**\n * Table Builder - provides a fluent interface for creating tables\n */\nexport class TableBuilder {\n private tableName: string;\n private description?: string;\n private isPublic: boolean = false;\n private fields: FieldDefinition[] = [];\n private tablesApiClient?: TablesApiClient;\n\n constructor(options: TableBuilderOptions, tablesApiClient?: TablesApiClient) {\n this.tableName = options.name;\n this.description = options.description;\n this.tablesApiClient = tablesApiClient;\n }\n\n /**\n * Set table name\n */\n name(name: string): TableBuilder {\n this.tableName = name;\n return this;\n }\n\n /**\n * Set table description\n */\n describe(description: string): TableBuilder {\n this.description = description;\n return this;\n }\n\n /**\n * Set if table is public\n */\n public(isPublic: boolean = true): TableBuilder {\n this.isPublic = isPublic;\n return this;\n }\n\n /**\n * Add a text field\n */\n text(\n name: string,\n options: {\n nullable?: boolean;\n unique?: boolean;\n indexed?: boolean;\n defaultValue?: string;\n description?: string;\n alignment?: 'left' | 'center' | 'right';\n } = {}\n ): TableBuilder {\n this.fields.push({\n name,\n type: 'text',\n is_nullable: options.nullable ?? true,\n is_unique: options.unique ?? false,\n is_indexed: options.indexed ?? false,\n is_primary_key: false,\n default_value: options.defaultValue,\n description: options.description,\n alignment: options.alignment || 'left',\n field_order: this.fields.length + 1,\n });\n return this;\n }\n\n /**\n * Add a long text field\n */\n longText(\n name: string,\n options: {\n nullable?: boolean;\n description?: string;\n alignment?: 'left' | 'center' | 'right';\n } = {}\n ): TableBuilder {\n this.fields.push({\n name,\n type: 'long-text',\n is_nullable: options.nullable ?? true,\n is_unique: false,\n is_indexed: false,\n is_primary_key: false,\n description: options.description,\n alignment: options.alignment || 'left',\n field_order: this.fields.length + 1,\n });\n return this;\n }\n\n /**\n * Add a number field\n */\n number(\n name: string,\n options: {\n nullable?: boolean;\n unique?: boolean;\n indexed?: boolean;\n defaultValue?: number;\n description?: string;\n decimals?: string;\n alignment?: 'left' | 'center' | 'right';\n } = {}\n ): TableBuilder {\n this.fields.push({\n name,\n type: 'number',\n is_nullable: options.nullable ?? true,\n is_unique: options.unique ?? false,\n is_indexed: options.indexed ?? false,\n is_primary_key: false,\n default_value: options.defaultValue,\n description: options.description,\n decimals: options.decimals,\n alignment: options.alignment || 'right',\n field_order: this.fields.length + 1,\n });\n return this;\n }\n\n /**\n * Add a currency field\n */\n currency(\n name: string,\n options: {\n nullable?: boolean;\n defaultValue?: number;\n description?: string;\n currencyFormat?: string;\n decimals?: string;\n } = {}\n ): TableBuilder {\n this.fields.push({\n name,\n type: 'currency',\n is_nullable: options.nullable ?? true,\n is_unique: false,\n is_indexed: false,\n is_primary_key: false,\n default_value: options.defaultValue,\n description: options.description,\n currency_format: options.currencyFormat,\n decimals: options.decimals,\n alignment: 'right',\n field_order: this.fields.length + 1,\n });\n return this;\n }\n\n /**\n * Add a checkbox field\n */\n checkbox(\n name: string,\n options: {\n nullable?: boolean;\n defaultValue?: boolean;\n description?: string;\n } = {}\n ): TableBuilder {\n this.fields.push({\n name,\n type: 'checkbox',\n is_nullable: options.nullable ?? true,\n is_unique: false,\n is_indexed: false,\n is_primary_key: false,\n default_value: options.defaultValue,\n description: options.description,\n alignment: 'center',\n field_order: this.fields.length + 1,\n });\n return this;\n }\n\n /**\n * Add a dropdown field\n */\n dropdown(\n name: string,\n items: string[],\n options: {\n nullable?: boolean;\n multiple?: boolean;\n defaultValue?: string | string[];\n description?: string;\n } = {}\n ): TableBuilder {\n this.fields.push({\n name,\n type: 'dropdown',\n is_nullable: options.nullable ?? true,\n is_unique: false,\n is_indexed: false,\n is_primary_key: false,\n default_value: options.defaultValue,\n description: options.description,\n selection_source: 'provide-static-list',\n selectable_items: items,\n multiple_selections: options.multiple ?? false,\n alignment: 'left',\n field_order: this.fields.length + 1,\n });\n return this;\n }\n\n /**\n * Add an email field\n */\n email(\n name: string,\n options: {\n nullable?: boolean;\n unique?: boolean;\n indexed?: boolean;\n description?: string;\n } = {}\n ): TableBuilder {\n this.fields.push({\n name,\n type: 'email',\n is_nullable: options.nullable ?? true,\n is_unique: options.unique ?? false,\n is_indexed: options.indexed ?? false,\n is_primary_key: false,\n description: options.description,\n alignment: 'left',\n field_order: this.fields.length + 1,\n });\n return this;\n }\n\n /**\n * Add a phone number field\n */\n phone(\n name: string,\n options: {\n nullable?: boolean;\n description?: string;\n format?: string;\n } = {}\n ): TableBuilder {\n this.fields.push({\n name,\n type: 'phone-number',\n is_nullable: options.nullable ?? true,\n is_unique: false,\n is_indexed: false,\n is_primary_key: false,\n description: options.description,\n phone_format: options.format,\n alignment: 'left',\n field_order: this.fields.length + 1,\n });\n return this;\n }\n\n /**\n * Add a link field\n */\n link(\n name: string,\n options: {\n nullable?: boolean;\n description?: string;\n } = {}\n ): TableBuilder {\n this.fields.push({\n name,\n type: 'link',\n is_nullable: options.nullable ?? true,\n is_unique: false,\n is_indexed: false,\n is_primary_key: false,\n description: options.description,\n alignment: 'left',\n field_order: this.fields.length + 1,\n });\n return this;\n }\n\n /**\n * Add a JSON field\n */\n json(\n name: string,\n options: {\n nullable?: boolean;\n description?: string;\n } = {}\n ): TableBuilder {\n this.fields.push({\n name,\n type: 'json',\n is_nullable: options.nullable ?? true,\n is_unique: false,\n is_indexed: false,\n is_primary_key: false,\n description: options.description,\n alignment: 'left',\n field_order: this.fields.length + 1,\n });\n return this;\n }\n\n /**\n * Add a date-time field\n */\n dateTime(\n name: string,\n options: {\n nullable?: boolean;\n description?: string;\n dateFormat?: string;\n timeFormat?: string;\n timezone?: string;\n } = {}\n ): TableBuilder {\n this.fields.push({\n name,\n type: 'date-time',\n is_nullable: options.nullable ?? true,\n is_unique: false,\n is_indexed: false,\n is_primary_key: false,\n description: options.description,\n date_format: options.dateFormat,\n time_format: options.timeFormat,\n timezone: options.timezone,\n alignment: 'left',\n field_order: this.fields.length + 1,\n });\n return this;\n }\n\n /**\n * Add a vector field\n */\n vector(\n name: string,\n dimension: number,\n options: {\n nullable?: boolean;\n description?: string;\n } = {}\n ): TableBuilder {\n this.fields.push({\n name,\n type: 'vector',\n is_nullable: options.nullable ?? true,\n is_unique: false,\n is_indexed: false,\n is_primary_key: false,\n description: options.description,\n vector_dimension: dimension,\n alignment: 'left',\n field_order: this.fields.length + 1,\n });\n return this;\n }\n\n /**\n * Add a custom field\n */\n addField(field: FieldDefinition): TableBuilder {\n this.fields.push({\n ...field,\n field_order: field.field_order || this.fields.length + 1,\n });\n return this;\n }\n\n /**\n * Remove a field by name\n */\n removeField(name: string): TableBuilder {\n this.fields = this.fields.filter((field) => field.name !== name);\n // Reorder remaining fields\n this.fields.forEach((field, index) => {\n field.field_order = index + 1;\n });\n return this;\n }\n\n /**\n * Get current fields\n */\n getFields(): FieldDefinition[] {\n return [...this.fields];\n }\n\n /**\n * Get current table name\n */\n getName(): string {\n return this.tableName;\n }\n\n /**\n * Get current description\n */\n getDescription(): string | undefined {\n return this.description;\n }\n\n /**\n * Build the table request object\n */\n build(): TableCreateRequest {\n if (!this.tableName) {\n throw new ValidationError('Table name is required', [\n { field: 'name', message: 'Table name cannot be empty' },\n ]);\n }\n\n if (this.fields.length === 0) {\n throw new ValidationError('At least one field is required', [\n { field: 'fields', message: 'Table must have at least one field' },\n ]);\n }\n\n return {\n name: this.tableName,\n description: this.description,\n fields: this.fields,\n };\n }\n\n /**\n * Build and create the table (requires API client)\n */\n async create(\n options: { is_ai_generated_schema?: boolean; is_template?: boolean } = {}\n ): Promise<BolticSuccessResponse<TableCreateResponse> | BolticErrorResponse> {\n if (!this.tablesApiClient) {\n throw new Error('TablesApiClient is required for table creation');\n }\n const request = this.build();\n return this.tablesApiClient.createTable(request, options);\n }\n}\n\n/**\n * Create a new table builder\n */\nexport function createTableBuilder(\n options: TableBuilderOptions,\n tablesApiClient?: TablesApiClient\n): TableBuilder {\n return new TableBuilder(options, tablesApiClient);\n}\n","import { ColumnQueryOptions, ColumnUpdateRequest } from '../types/api/column';\nimport {\n RecordData,\n RecordDeleteOptions,\n RecordQueryOptions,\n RecordUpdateOptions,\n} from '../types/api/record';\nimport {\n FieldDefinition,\n TableCreateRequest,\n TableQueryOptions,\n TableUpdateRequest,\n} from '../types/api/table';\nimport { Environment, EnvironmentConfig } from '../types/config/environment';\nimport { TextToSQLOptions } from '../types/sql';\nimport { HttpRequestConfig, HttpResponse } from '../utils/http/adapter';\nimport { AuthManager } from './core/auth-manager';\nimport { BaseClient } from './core/base-client';\nimport { ClientConfig, ConfigManager } from './core/config';\nimport { ColumnResource } from './resources/column';\nimport { RecordResource } from './resources/record';\nimport { createRecordBuilder, RecordBuilder } from './resources/record-builder';\nimport { SqlResource } from './resources/sql';\nimport { TableResource } from './resources/table';\nimport { createTableBuilder, TableBuilder } from './resources/table-builder';\n\nexport interface ClientOptions extends Partial<EnvironmentConfig> {\n environment?: Environment;\n region?: 'asia-south1' | 'us-central1';\n debug?: boolean;\n retryAttempts?: number;\n retryDelay?: number;\n}\n\ninterface DatabaseContext {\n databaseName: string;\n}\n\nexport class BolticClient {\n private configManager: ConfigManager;\n private authManager: AuthManager;\n private baseClient: BaseClient;\n private tableResource: TableResource;\n private columnResource: ColumnResource;\n private recordResource: RecordResource;\n private sqlResource: SqlResource;\n private currentDatabase: DatabaseContext | null = null;\n private clientOptions: ClientOptions;\n\n constructor(apiKey: string, options: ClientOptions = {}) {\n // Store client options\n this.clientOptions = options;\n\n // Initialize configuration\n this.configManager = new ConfigManager(\n apiKey,\n options.environment || 'prod',\n options.region || 'asia-south1',\n options\n );\n const config = this.configManager.getConfig();\n\n // Initialize authentication\n this.authManager = new AuthManager({\n apiKey: config.apiKey,\n maxRetries: config.maxRetries,\n });\n\n // Initialize HTTP client\n this.baseClient = new BaseClient(config, this.authManager);\n\n // Initialize table operations\n this.tableResource = new TableResource(this.baseClient);\n\n // Initialize column operations\n this.columnResource = new ColumnResource(this.baseClient);\n\n // Initialize record operations\n this.recordResource = new RecordResource(this.baseClient);\n\n // Initialize SQL operations\n this.sqlResource = new SqlResource(this.baseClient);\n\n // Set default database context\n this.currentDatabase = {\n databaseName: 'Default',\n };\n }\n\n getCurrentDatabase(): DatabaseContext | null {\n return this.currentDatabase;\n }\n\n // Direct table operations\n get tables() {\n return {\n create: (data: TableCreateRequest) => this.tableResource.create(data),\n findAll: (options?: TableQueryOptions) =>\n this.tableResource.findAll(options),\n findById: (id: string) => this.tableResource.findById(id),\n findByName: (name: string) => this.tableResource.findByName(name),\n findOne: (options: TableQueryOptions) =>\n this.tableResource.findOne(options),\n update: (name: string, data: TableUpdateRequest) =>\n this.tableResource.update(name, data),\n delete: (name: string) => this.tableResource.delete(name),\n rename: (oldName: string, newName: string) =>\n this.tableResource.rename(oldName, newName),\n setAccess: (request: { table_name: string; is_shared: boolean }) =>\n this.tableResource.setAccess(request),\n };\n }\n\n // Direct column operations\n get columns() {\n return {\n create: (tableName: string, column: FieldDefinition) =>\n this.columnResource.create(tableName, column),\n createMany: (tableName: string, columns: FieldDefinition[]) =>\n this.columnResource.createMany(tableName, columns),\n findAll: (tableName: string, options?: ColumnQueryOptions) =>\n this.columnResource.findAll(tableName, options),\n findOne: (tableName: string, columnName: string) =>\n this.columnResource.get(tableName, columnName),\n findById: (tableName: string, columnId: string) =>\n this.columnResource.findById(tableName, columnId),\n update: (\n tableName: string,\n columnName: string,\n updates: ColumnUpdateRequest\n ) => this.columnResource.update(tableName, columnName, updates),\n delete: (tableName: string, columnName: string) =>\n this.columnResource.delete(tableName, columnName),\n };\n }\n\n // Fluent table operations\n table(name: string): TableBuilder {\n const tableBuilder = createTableBuilder({ name });\n return tableBuilder;\n }\n\n // Method 3: Table-scoped operations\n from(tableName: string) {\n return {\n // Column operations for this table\n columns: () => ({\n create: (column: FieldDefinition) =>\n this.columnResource.create(tableName, column),\n findAll: (options?: ColumnQueryOptions) =>\n this.columnResource.findAll(tableName, options),\n get: (columnName: string) =>\n this.columnResource.get(tableName, columnName),\n update: (columnName: string, updates: ColumnUpdateRequest) =>\n this.columnResource.update(tableName, columnName, updates),\n delete: (columnName: string) =>\n this.columnResource.delete(tableName, columnName),\n }),\n\n // Record operations for this table\n records: () => ({\n insert: (data: RecordData) =>\n this.recordResource.insert(tableName, data),\n insertMany: (\n records: RecordData[],\n options?: { validation?: boolean }\n ) => this.recordResource.insertMany(tableName, records, options),\n findOne: (recordId: string) =>\n this.recordResource.get(tableName, recordId),\n update: (options: RecordUpdateOptions) =>\n this.recordResource.update(tableName, options),\n updateById: (recordId: string, data: RecordData) =>\n this.recordResource.updateById(tableName, recordId, data),\n\n // Unified delete method\n delete: (options: RecordDeleteOptions) =>\n this.recordResource.delete(tableName, options),\n\n // Single record delete method\n deleteById: (recordId: string) =>\n this.recordResource.deleteById(tableName, recordId),\n }),\n\n // Fluent record builder for this table\n record: () =>\n createRecordBuilder({\n tableName,\n recordResource: this.recordResource,\n }),\n };\n }\n\n // Direct record operations\n get records() {\n return {\n insert: (tableName: string, data: RecordData) =>\n this.recordResource.insert(tableName, data),\n insertMany: (\n tableName: string,\n records: RecordData[],\n options?: { validation?: boolean }\n ) => this.recordResource.insertMany(tableName, records, options),\n findAll: (tableName: string, options?: RecordQueryOptions) =>\n this.recordResource.list(tableName, options),\n findOne: (tableName: string, recordId: string) =>\n this.recordResource.get(tableName, recordId),\n update: (tableName: string, options: RecordUpdateOptions) =>\n this.recordResource.update(tableName, options),\n updateById: (tableName: string, recordId: string, data: RecordData) =>\n this.recordResource.updateById(tableName, recordId, data),\n delete: (tableName: string, options: RecordDeleteOptions) =>\n this.recordResource.delete(tableName, options),\n deleteById: (tableName: string, recordId: string) =>\n this.recordResource.deleteById(tableName, recordId),\n };\n }\n\n // Method 4: Create fluent record builder\n record(tableName: string): RecordBuilder {\n return createRecordBuilder({\n tableName,\n recordResource: this.recordResource,\n });\n }\n\n // Direct SQL operations\n get sql() {\n return {\n textToSQL: (prompt: string, options?: TextToSQLOptions) =>\n this.sqlResource.textToSQL(prompt, options),\n executeSQL: (query: string) => this.sqlResource.executeSQL(query),\n };\n }\n\n // SQL resource access for testing\n getSqlResource(): SqlResource {\n return this.sqlResource;\n }\n\n // Configuration management\n updateApiKey(newApiKey: string): void {\n this.configManager.updateConfig({ apiKey: newApiKey });\n this.authManager.updateApiKey(newApiKey);\n }\n\n updateConfig(updates: Partial<ClientConfig>): void {\n this.configManager.updateConfig(updates);\n this.baseClient.updateConfig(this.configManager.getConfig());\n this.updateAllResourcesConfig();\n }\n\n getConfig(): ClientConfig {\n return this.configManager.getConfig();\n }\n\n // Authentication management\n async validateApiKey(): Promise<boolean> {\n return this.authManager.validateApiKeyAsync();\n }\n\n isAuthenticated(): boolean {\n return this.authManager.isAuthenticated();\n }\n\n // HTTP client access\n getHttpClient(): BaseClient {\n return this.baseClient;\n }\n\n // Interceptor management\n addRequestInterceptor(\n interceptor: (\n config: HttpRequestConfig\n ) => HttpRequestConfig | Promise<HttpRequestConfig>\n ): number {\n return this.baseClient.getInterceptors().request.use(interceptor);\n }\n\n addResponseInterceptor(\n onFulfilled?: (\n response: HttpResponse\n ) => HttpResponse | Promise<HttpResponse>,\n onRejected?: (error: unknown) => unknown\n ): number {\n return this.baseClient\n .getInterceptors()\n .response.use(onFulfilled, onRejected);\n }\n\n ejectRequestInterceptor(id: number): void {\n this.baseClient.getInterceptors().request.eject(id);\n }\n\n ejectResponseInterceptor(id: number): void {\n this.baseClient.getInterceptors().response.eject(id);\n }\n\n // Connection testing\n async testConnection(): Promise<boolean> {\n try {\n return await this.authManager.validateApiKeyAsync();\n } catch (error) {\n return false;\n }\n }\n\n // Get client version\n getVersion(): string {\n return '1.0.0';\n }\n\n // Environment helpers\n getEnvironment(): Environment {\n return this.configManager.getConfig().environment;\n }\n\n getRegion(): string {\n return this.configManager.getConfig().region;\n }\n\n // Debug helpers\n enableDebug(): void {\n this.configManager.updateConfig({ debug: true });\n this.baseClient.updateConfig(this.configManager.getConfig());\n this.updateAllResourcesConfig();\n }\n\n disableDebug(): void {\n this.configManager.updateConfig({ debug: false });\n this.baseClient.updateConfig(this.configManager.getConfig());\n this.updateAllResourcesConfig();\n }\n\n isDebugEnabled(): boolean {\n return this.configManager.getConfig().debug || false;\n }\n\n // Private method to update all resource configurations\n private updateAllResourcesConfig(): void {\n // Recreate all resources with updated config\n this.tableResource = new TableResource(this.baseClient);\n this.columnResource = new ColumnResource(this.baseClient);\n this.recordResource = new RecordResource(this.baseClient);\n this.sqlResource = new SqlResource(this.baseClient);\n }\n\n // Security methods to prevent API key exposure\n toString(): string {\n const config = this.getConfig();\n return `BolticClient { environment: \"${config.environment}\", region: \"${config.region}\", debug: ${config.debug} }`;\n }\n\n toJSON(): object {\n const config = this.getConfig();\n return {\n environment: config.environment,\n region: config.region,\n debug: config.debug,\n timeout: config.timeout,\n version: this.getVersion(),\n };\n }\n\n // Custom inspect method for Node.js console logging\n [Symbol.for('nodejs.util.inspect.custom')](): string {\n return this.toString();\n }\n}\n","import { BolticClient, ClientOptions } from './boltic-client';\n\nexport function createClient(\n apiKey: string,\n options: ClientOptions = {}\n): BolticClient {\n return new BolticClient(apiKey, options);\n}\n\nexport type { Region } from '../types/config/environment';\nexport * from './core/auth-manager';\nexport * from './core/base-client';\nexport * from './core/base-resource';\nexport * from './core/config';\nexport * from './resources/record';\nexport * from './resources/record-builder';\nexport * from './resources/table';\nexport {\n createTableBuilder,\n TableBuilder,\n type TableBuilderOptions,\n} from './resources/table-builder';\nexport { BolticClient };\nexport type { ClientOptions };\n","// Main SDK exports - Boltic SDK for databases\nexport * from './auth';\nexport * from './errors';\n\n// Export databases module - Primary functionality\nexport { BolticClient, createClient } from './services/databases/src/client';\nexport type { ClientOptions, Region } from './services/databases/src/client';\n\n// Export response helpers - Essential for error handling\nexport {\n isErrorResponse,\n isListResponse,\n} from './services/databases/src/types/common/responses';\nexport type {\n ApiResponse,\n BolticErrorResponse,\n BolticListResponse,\n BolticSuccessResponse,\n} from './services/databases/src/types/common/responses';\n\n// Export common types\nexport type {\n FieldDefinition,\n FieldType,\n QueryOperator,\n RecordData,\n RecordWithId,\n TableCreateRequest,\n TableRecord,\n WhereCondition,\n} from './services/databases/src/types';\n\n// Version information\nexport const VERSION = '1.0.0';\n"],"names":["createErrorWithContext","getHttpStatusCode","formatError","AuthManager","buildEndpointPath","transformFieldDefinition"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sdk.js","sources":["../src/errors/index.ts","../src/auth/auth-manager.ts","../src/services/databases/src/errors/utils.ts","../src/services/databases/src/client/core/auth-manager.ts","../src/services/databases/src/utils/http/axios-adapter.ts","../src/services/databases/src/utils/http/fetch-adapter.ts","../src/services/databases/src/utils/http/client-factory.ts","../src/services/databases/src/client/core/interceptors.ts","../src/services/databases/src/client/core/base-client.ts","../src/services/databases/src/types/config/environment.ts","../src/services/databases/src/client/core/config.ts","../src/services/databases/src/utils/common/index.ts","../src/services/databases/src/api/endpoints/columns.ts","../src/services/databases/src/types/api/column.ts","../src/services/databases/src/api/transformers/columns.ts","../src/services/databases/src/api/clients/columns-api-client.ts","../src/services/databases/src/api/endpoints/tables.ts","../src/services/databases/src/utils/filters/filter-mapper.ts","../src/services/databases/src/api/transformers/tables.ts","../src/services/databases/src/api/clients/tables-api-client.ts","../src/services/databases/src/types/common/responses.ts","../src/services/databases/src/client/core/base-resource.ts","../src/services/databases/src/client/resources/table.ts","../src/services/databases/src/client/resources/column.ts","../src/services/databases/src/api/endpoints/indexes.ts","../src/services/databases/src/api/clients/indexes-api-client.ts","../src/services/databases/src/client/resources/indexes.ts","../src/services/databases/src/api/endpoints/records.ts","../src/services/databases/src/api/transformers/records.ts","../src/services/databases/src/api/clients/records-api-client.ts","../src/services/databases/src/client/resources/record.ts","../src/services/databases/src/client/resources/record-builder.ts","../src/services/databases/src/api/endpoints/sql.ts","../src/services/databases/src/api/clients/base-api-client.ts","../src/services/databases/src/api/clients/sql-api-client.ts","../src/services/databases/src/api/transformers/sql.ts","../src/services/databases/src/client/resources/sql.ts","../src/services/databases/src/client/resources/table-builder.ts","../src/services/databases/src/client/boltic-client.ts","../src/services/databases/src/client/index.ts","../src/index.ts"],"sourcesContent":["/**\n * Utility functions for working with standard Error classes\n */\n\n/**\n * Creates a structured error object with additional context\n */\nexport function createErrorWithContext(\n message: string,\n context?: Record<string, unknown>\n): Error {\n const error = new Error(message);\n if (context) {\n // Add context as a property for debugging\n (error as Error & { context?: Record<string, unknown> }).context = context;\n }\n return error;\n}\n\n/**\n * Checks if an error is a network/HTTP related error\n */\nexport function isNetworkError(error: unknown): error is Error {\n return (\n error instanceof Error &&\n (error.message.includes('network') ||\n error.message.includes('fetch') ||\n error.message.includes('timeout') ||\n error.name === 'AbortError')\n );\n}\n\n/**\n * Extracts HTTP status code from axios or fetch errors\n */\nexport function getHttpStatusCode(error: unknown): number | null {\n if (error && typeof error === 'object') {\n // Axios error structure\n if (\n 'response' in error &&\n error.response &&\n typeof error.response === 'object'\n ) {\n const response = error.response as { status?: number };\n if ('status' in response && typeof response.status === 'number') {\n return response.status;\n }\n }\n // Fetch Response error\n if (\n 'status' in error &&\n typeof (error as { status?: number }).status === 'number'\n ) {\n return (error as { status: number }).status;\n }\n }\n return null;\n}\n\n/**\n * Formats error for logging/debugging\n */\nexport function formatError(error: unknown): string {\n if (error instanceof Error) {\n const context = (error as Error & { context?: Record<string, unknown> })\n .context;\n const statusCode = getHttpStatusCode(error);\n\n let formatted = `${error.name}: ${error.message}`;\n\n if (statusCode) {\n formatted += ` (HTTP ${statusCode})`;\n }\n\n if (context) {\n formatted += `\\nContext: ${JSON.stringify(context, null, 2)}`;\n }\n\n return formatted;\n }\n\n return String(error);\n}\n\n// Re-export standard Error types for convenience\n// These are available globally in JavaScript/TypeScript\n","import { createErrorWithContext } from '../errors';\nimport { AuthConfig, AuthHeaders, TokenInfo } from '../types/auth';\n\nexport class AuthManager {\n private config: AuthConfig;\n private tokenInfo: TokenInfo | null = null;\n\n constructor(config: AuthConfig) {\n this.config = config;\n this.validateApiKey(config.apiKey);\n }\n\n private validateApiKey(apiKey: string): void {\n if (!apiKey || typeof apiKey !== 'string' || apiKey.trim().length === 0) {\n throw createErrorWithContext(\n 'API key is required and must be a non-empty string',\n {\n name: 'AuthenticationError',\n code: 'INVALID_API_KEY',\n }\n );\n }\n\n // Basic format validation (adjust based on actual key format)\n if (apiKey.length < 10) {\n throw createErrorWithContext(\n 'API key appears to be invalid (too short)',\n {\n name: 'AuthenticationError',\n code: 'INVALID_API_KEY_FORMAT',\n }\n );\n }\n }\n\n getAuthHeaders(): AuthHeaders {\n return {\n 'x-boltic-token': this.config.apiKey,\n };\n }\n\n updateApiKey(newApiKey: string): void {\n this.validateApiKey(newApiKey);\n this.config.apiKey = newApiKey;\n this.tokenInfo = null; // Reset token info\n }\n\n isAuthenticated(): boolean {\n return !!this.config.apiKey;\n }\n\n async validateApiKeyAsync(): Promise<boolean> {\n // TODO: Implement actual API key validation endpoint call\n // For now, return basic validation\n try {\n this.validateApiKey(this.config.apiKey);\n return true;\n } catch {\n return false;\n }\n }\n\n getTokenInfo(): TokenInfo | null {\n return this.tokenInfo ? { ...this.tokenInfo } : null;\n }\n\n // Generic method to get headers for any Boltic service\n getServiceHeaders(service?: string): AuthHeaders {\n const headers = this.getAuthHeaders();\n\n if (service) {\n headers['x-boltic-service'] = service;\n }\n\n return headers;\n }\n\n // Method to validate API key for specific service\n async validateForService(): Promise<boolean> {\n try {\n const isValid = await this.validateApiKeyAsync();\n if (isValid) {\n // TODO: Add service-specific validation logic\n return true;\n }\n return false;\n } catch {\n return false;\n }\n }\n}\n","/**\n * Utility functions for working with standard Error classes\n */\n\nexport interface ValidationFailure {\n field: string;\n message: string;\n}\n\n/**\n * Validation error for input validation failures\n */\nexport class ValidationError extends Error {\n public readonly failures: ValidationFailure[];\n\n constructor(message: string, failures: ValidationFailure[] = []) {\n super(message);\n this.name = 'ValidationError';\n this.failures = failures;\n }\n}\n\n/**\n * API error for HTTP/API related failures\n */\nexport class ApiError extends Error {\n public readonly statusCode: number;\n public readonly response?: unknown;\n\n constructor(message: string, statusCode: number, response?: unknown) {\n super(message);\n this.name = 'ApiError';\n this.statusCode = statusCode;\n this.response = response;\n }\n}\n\n/**\n * Creates a structured error object with additional context\n */\nexport function createErrorWithContext(\n message: string,\n context?: Record<string, unknown>\n): Error {\n const error = new Error(message);\n if (context) {\n // Add context as a property for debugging\n (error as Error & { context: Record<string, unknown> }).context = context;\n }\n return error;\n}\n\n/**\n * Checks if an error is a network/HTTP related error\n */\nexport function isNetworkError(error: unknown): error is Error {\n return (\n error instanceof Error &&\n (error.message.includes('network') ||\n error.message.includes('fetch') ||\n error.message.includes('timeout') ||\n error.name === 'AbortError')\n );\n}\n\n/**\n * Extracts HTTP status code from axios or fetch errors\n */\nexport function getHttpStatusCode(error: unknown): number | null {\n if (error && typeof error === 'object') {\n // Axios error structure\n if (\n 'response' in error &&\n error.response &&\n typeof error.response === 'object'\n ) {\n const response = error.response as { status?: unknown };\n if ('status' in response && typeof response.status === 'number') {\n return response.status;\n }\n }\n // Fetch Response error\n if (\n 'status' in error &&\n typeof (error as { status: unknown }).status === 'number'\n ) {\n return (error as { status: number }).status;\n }\n }\n return null;\n}\n\n/**\n * Formats error for logging/debugging\n */\nexport function formatError(error: unknown): string {\n if (error instanceof Error) {\n const context = (error as Error & { context?: Record<string, unknown> })\n .context;\n const statusCode = getHttpStatusCode(error);\n\n let formatted = `${error.name}: ${error.message}`;\n\n if (statusCode) {\n formatted += ` (HTTP ${statusCode})`;\n }\n\n if (context) {\n formatted += `\\nContext: ${JSON.stringify(context, null, 2)}`;\n }\n\n return formatted;\n }\n\n return String(error);\n}\n","import { createErrorWithContext } from '../../errors';\nimport { AuthConfig, AuthHeaders, TokenInfo } from '../../types/config/auth';\n\nexport class AuthManager {\n private config: AuthConfig;\n private tokenInfo: TokenInfo | null = null;\n\n constructor(config: AuthConfig) {\n this.config = {\n maxRetries: 3,\n ...config,\n };\n this.validateApiKey(config.apiKey);\n }\n\n private validateApiKey(apiKey: string): void {\n if (!apiKey || typeof apiKey !== 'string' || apiKey.trim().length === 0) {\n throw createErrorWithContext(\n 'API key is required and must be a non-empty string',\n {\n name: 'AuthenticationError',\n code: 'INVALID_API_KEY',\n }\n );\n }\n\n // Basic format validation (adjust based on actual key format)\n if (apiKey.length < 10) {\n throw createErrorWithContext(\n 'API key appears to be invalid (too short)',\n {\n name: 'AuthenticationError',\n code: 'INVALID_API_KEY_FORMAT',\n }\n );\n }\n }\n\n getAuthHeaders(): AuthHeaders {\n return {\n 'x-boltic-token': this.config.apiKey,\n };\n }\n\n updateApiKey(newApiKey: string): void {\n this.validateApiKey(newApiKey);\n this.config.apiKey = newApiKey;\n this.tokenInfo = null; // Reset token info\n }\n\n isAuthenticated(): boolean {\n return !!this.config.apiKey;\n }\n\n async validateApiKeyAsync(): Promise<boolean> {\n // TODO: Implement actual API key validation endpoint call\n // For now, return basic validation\n try {\n this.validateApiKey(this.config.apiKey);\n return true;\n } catch {\n return false;\n }\n }\n\n getTokenInfo(): TokenInfo | null {\n return this.tokenInfo ? { ...this.tokenInfo } : null;\n }\n\n getMaxRetries(): number {\n return this.config.maxRetries || 3;\n }\n\n // Security methods to prevent API key exposure\n toString(): string {\n return `AuthManager { authenticated: ${this.isAuthenticated()}, maxRetries: ${this.getMaxRetries()} }`;\n }\n\n toJSON(): object {\n return {\n authenticated: this.isAuthenticated(),\n maxRetries: this.getMaxRetries(),\n };\n }\n\n // Custom inspect method for Node.js console logging\n [Symbol.for('nodejs.util.inspect.custom')](): string {\n return this.toString();\n }\n}\n","import { createErrorWithContext } from '../../errors';\nimport { HttpAdapter, HttpRequestConfig, HttpResponse } from './adapter';\n\ninterface AxiosInstance {\n (config: unknown): Promise<{\n data: unknown;\n status: number;\n statusText: string;\n headers: Record<string, string>;\n }>;\n}\n\nexport class AxiosAdapter implements HttpAdapter {\n private axios: AxiosInstance;\n\n constructor() {\n try {\n // Dynamic import for optional axios dependency\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n this.axios = require('axios');\n } catch (error) {\n throw createErrorWithContext(\n 'Axios is required for Node.js < 18. Please install axios: npm install axios',\n { error }\n );\n }\n }\n\n async request<T = unknown>(\n config: HttpRequestConfig\n ): Promise<HttpResponse<T>> {\n try {\n const axiosConfig = {\n url: config.url,\n method: config.method.toLowerCase(),\n headers: config.headers,\n params: config.params,\n data: config.data,\n timeout: config.timeout,\n signal: config.signal,\n validateStatus: () => true, // Don't throw on non-2xx status codes\n };\n\n const response = await this.axios(axiosConfig);\n\n return {\n data: response.data as T,\n status: response.status,\n statusText: response.statusText,\n headers: response.headers || {},\n };\n } catch (error: unknown) {\n const axiosError = error as {\n code?: string;\n message?: string;\n name?: string;\n };\n\n // Handle timeout errors\n if (\n axiosError.code === 'ECONNABORTED' ||\n axiosError.message?.includes('timeout')\n ) {\n throw createErrorWithContext('Request timeout', {\n url: config.url,\n method: config.method,\n timeout: config.timeout,\n });\n }\n\n // Handle VPN and network connectivity issues\n if (\n axiosError.code === 'ERR_NETWORK' ||\n axiosError.code === 'ENOTFOUND' ||\n axiosError.code === 'ECONNREFUSED' ||\n axiosError.code === 'EHOSTUNREACH' ||\n axiosError.code === 'ETIMEDOUT' ||\n axiosError.code === 'ERR_INTERNET_DISCONNECTED' ||\n axiosError.message?.includes('network') ||\n axiosError.message?.includes('internet') ||\n axiosError.message?.includes('connection') ||\n axiosError.message?.includes('resolve')\n ) {\n throw createErrorWithContext(\n 'Network connection failed. Please check your internet connection or VPN settings.',\n {\n url: config.url,\n method: config.method,\n networkError: true,\n errorCode: axiosError.code,\n originalMessage: axiosError.message,\n }\n );\n }\n\n // Handle request cancellation\n if (\n axiosError.name === 'AbortError' ||\n axiosError.code === 'ERR_CANCELED'\n ) {\n throw createErrorWithContext('Request was aborted', {\n url: config.url,\n method: config.method,\n });\n }\n\n // Generic HTTP error fallback\n throw createErrorWithContext(\n `HTTP request failed: ${axiosError.message || 'Unknown error'}`,\n {\n url: config.url,\n method: config.method,\n originalError: error,\n }\n );\n }\n }\n}\n","import { createErrorWithContext } from '../../errors';\nimport { HttpAdapter, HttpRequestConfig, HttpResponse } from './adapter';\n\nexport class FetchAdapter implements HttpAdapter {\n async request<T = unknown>(\n config: HttpRequestConfig\n ): Promise<HttpResponse<T>> {\n const url = new URL(config.url);\n\n // Add query parameters\n if (config.params) {\n Object.entries(config.params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n url.searchParams.append(key, String(value));\n }\n });\n }\n\n const init: RequestInit = {\n method: config.method,\n headers: {\n 'Content-Type': 'application/json',\n ...config.headers,\n },\n signal: config.signal,\n };\n\n if (\n config.data &&\n ['POST', 'PUT', 'PATCH', 'DELETE'].includes(config.method)\n ) {\n init.body = JSON.stringify(config.data);\n }\n\n try {\n const controller = new AbortController();\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n // Set up timeout if specified\n if (config.timeout) {\n timeoutId = setTimeout(() => controller.abort(), config.timeout);\n init.signal = config.signal\n ? (() => {\n const combinedController = new AbortController();\n config.signal.addEventListener('abort', () =>\n combinedController.abort()\n );\n controller.signal.addEventListener('abort', () =>\n combinedController.abort()\n );\n return combinedController.signal;\n })()\n : controller.signal;\n }\n\n const response = await fetch(url.toString(), init);\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n\n const contentType = response.headers.get('content-type');\n let data: T;\n\n if (contentType?.includes('application/json')) {\n data = await response.json();\n } else {\n data = (await response.text()) as T;\n }\n\n const headers: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n headers[key] = value;\n });\n\n const httpResponse: HttpResponse<T> = {\n data,\n status: response.status,\n statusText: response.statusText,\n headers,\n };\n\n // For non-2xx responses, we still return the response but the caller can check status\n return httpResponse;\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n throw createErrorWithContext('Request was aborted', {\n type: 'AbortError',\n url: config.url,\n method: config.method,\n });\n }\n\n // Handle VPN and network connectivity issues\n if (error instanceof Error) {\n const errorMessage = error.message.toLowerCase();\n if (\n error.name === 'TypeError' &&\n (errorMessage.includes('network') ||\n errorMessage.includes('fetch') ||\n errorMessage.includes('failed to fetch') ||\n errorMessage.includes('internet') ||\n errorMessage.includes('connection') ||\n errorMessage.includes('resolve') ||\n errorMessage.includes('unreachable'))\n ) {\n throw createErrorWithContext(\n 'Network connection failed. Please check your internet connection or VPN settings.',\n {\n url: config.url,\n method: config.method,\n networkError: true,\n originalMessage: error.message,\n }\n );\n }\n }\n\n throw createErrorWithContext(\n `HTTP request failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n {\n url: config.url,\n method: config.method,\n originalError: error,\n }\n );\n }\n }\n}\n","import { createErrorWithContext } from '../../errors';\nimport { HttpAdapter } from './adapter';\nimport { AxiosAdapter } from './axios-adapter';\nimport { FetchAdapter } from './fetch-adapter';\n\nexport function createHttpAdapter(): HttpAdapter {\n // Check if fetch is available (browser or Node.js >= 18)\n if (typeof fetch !== 'undefined') {\n return new FetchAdapter();\n }\n\n // Fallback to axios for older Node.js versions\n try {\n return new AxiosAdapter();\n } catch (error) {\n throw createErrorWithContext(\n 'No suitable HTTP adapter found. Please use Node.js >= 18 or install axios: npm install axios',\n { error }\n );\n }\n}\n","import { HttpRequestConfig, HttpResponse } from '../../utils/http/adapter';\n\nexport type RequestInterceptor = (\n config: HttpRequestConfig\n) => HttpRequestConfig | Promise<HttpRequestConfig>;\n\nexport type ResponseInterceptor = (\n response: HttpResponse\n) => HttpResponse | Promise<HttpResponse>;\n\nexport type ErrorInterceptor = (error: unknown) => unknown | Promise<unknown>;\n\nexport interface InterceptorManager {\n request: {\n use(interceptor: RequestInterceptor): number;\n eject(id: number): void;\n };\n response: {\n use(\n onFulfilled?: ResponseInterceptor,\n onRejected?: ErrorInterceptor\n ): number;\n eject(id: number): void;\n };\n}\n\nexport class InterceptorManagerImpl implements InterceptorManager {\n private requestInterceptors: Map<number, RequestInterceptor> = new Map();\n private responseInterceptors: Map<\n number,\n { fulfilled?: ResponseInterceptor; rejected?: ErrorInterceptor }\n > = new Map();\n private nextId = 0;\n\n request = {\n use: (interceptor: RequestInterceptor): number => {\n const id = this.nextId++;\n this.requestInterceptors.set(id, interceptor);\n return id;\n },\n eject: (id: number): void => {\n this.requestInterceptors.delete(id);\n },\n };\n\n response = {\n use: (\n onFulfilled?: ResponseInterceptor,\n onRejected?: ErrorInterceptor\n ): number => {\n const id = this.nextId++;\n this.responseInterceptors.set(id, {\n fulfilled: onFulfilled,\n rejected: onRejected,\n });\n return id;\n },\n eject: (id: number): void => {\n this.responseInterceptors.delete(id);\n },\n };\n\n async executeRequestInterceptors(\n config: HttpRequestConfig\n ): Promise<HttpRequestConfig> {\n let result = config;\n for (const interceptor of this.requestInterceptors.values()) {\n result = await interceptor(result);\n }\n return result;\n }\n\n async executeResponseInterceptors(\n response: HttpResponse\n ): Promise<HttpResponse> {\n let result = response;\n for (const { fulfilled } of this.responseInterceptors.values()) {\n if (fulfilled) {\n result = await fulfilled(result);\n }\n }\n return result;\n }\n\n async executeErrorInterceptors(error: unknown): Promise<unknown> {\n let result = error;\n for (const { rejected } of this.responseInterceptors.values()) {\n if (rejected) {\n result = await rejected(result);\n }\n }\n return result;\n }\n}\n","import { createErrorWithContext, getHttpStatusCode } from '../../errors';\nimport {\n HttpAdapter,\n HttpRequestConfig,\n HttpResponse,\n createHttpAdapter,\n} from '../../utils/http';\nimport { AuthManager } from './auth-manager';\nimport { ClientConfig } from './config';\nimport { InterceptorManagerImpl } from './interceptors';\n\nexport class BaseClient {\n private httpAdapter: HttpAdapter;\n private authManager: AuthManager;\n private interceptors: InterceptorManagerImpl;\n private config: ClientConfig;\n\n constructor(config: ClientConfig, authManager: AuthManager) {\n this.config = config;\n this.authManager = authManager;\n this.httpAdapter = createHttpAdapter();\n this.interceptors = new InterceptorManagerImpl();\n\n this.setupDefaultInterceptors();\n }\n\n private setupDefaultInterceptors(): void {\n // Default request interceptor - add auth headers\n this.interceptors.request.use((config) => {\n const authHeaders = this.authManager.getAuthHeaders();\n config.headers = {\n ...config.headers,\n ...authHeaders,\n ...this.config.headers,\n };\n return config;\n });\n\n // Default response interceptor - handle common errors\n this.interceptors.response.use(\n (response) => {\n if (this.config.debug) {\n // eslint-disable-next-line no-console\n console.log('HTTP Response:', response);\n }\n return response;\n },\n (error) => {\n return this.handleError(error);\n }\n );\n }\n\n private handleError(error: unknown): never {\n if (this.config.debug) {\n // eslint-disable-next-line no-console\n console.error('HTTP Error:', error);\n }\n\n // Check if it's already our wrapped error\n if (\n error instanceof Error &&\n (error as Error & { context?: unknown }).context\n ) {\n throw error;\n }\n\n const statusCode = getHttpStatusCode(error);\n\n // Network errors (no response)\n if (!statusCode) {\n throw createErrorWithContext('Network request failed', {\n name: 'NetworkError',\n originalError: error,\n });\n }\n\n // API errors with status codes\n const errorData =\n (error as { response?: { data?: unknown }; data?: unknown }).response\n ?.data || (error as { data?: unknown }).data;\n const message =\n (errorData as { message?: string; error?: string })?.message ||\n (errorData as { message?: string; error?: string })?.error ||\n `HTTP ${statusCode} error`;\n\n throw createErrorWithContext(message, {\n name: 'ApiError',\n statusCode,\n response: errorData,\n isClientError: statusCode >= 400 && statusCode < 500,\n isServerError: statusCode >= 500,\n isAuthError: statusCode === 401 || statusCode === 403,\n isNotFoundError: statusCode === 404,\n isRateLimitError: statusCode === 429,\n });\n }\n\n async request<T = unknown>(\n config: HttpRequestConfig\n ): Promise<HttpResponse<T>> {\n let lastError: unknown;\n const maxRetries = this.config.maxRetries;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n // Add base URL if not absolute\n if (!config.url.startsWith('http')) {\n config.url = `${this.config.baseURL}${config.url}`;\n }\n\n // Set default timeout\n if (!config.timeout) {\n config.timeout = this.config.timeout;\n }\n\n // Execute request interceptors\n const requestConfig =\n await this.interceptors.executeRequestInterceptors(config);\n\n // Make the request\n const response = await this.httpAdapter.request<T>(requestConfig);\n\n // Check for HTTP errors (non-2xx status codes)\n if (response.status >= 400) {\n const error = createErrorWithContext(\n `HTTP ${response.status} error`,\n {\n name: 'ApiError',\n statusCode: response.status,\n response: response.data,\n statusText: response.statusText,\n }\n );\n throw await this.interceptors.executeErrorInterceptors(error);\n }\n\n // Execute response interceptors\n return (await this.interceptors.executeResponseInterceptors(\n response\n )) as HttpResponse<T>;\n } catch (error) {\n lastError = error;\n\n // Don't retry on client errors (4xx) or if we've exhausted retries\n if (attempt === maxRetries) {\n break;\n }\n\n const statusCode = getHttpStatusCode(error);\n if (statusCode && statusCode >= 400 && statusCode < 500) {\n // Don't retry client errors\n break;\n }\n\n // Wait before retrying (exponential backoff)\n if (attempt < maxRetries) {\n const delay = this.config.retryDelay * Math.pow(2, attempt);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n }\n\n // Execute error interceptors and throw the last error\n throw await this.interceptors.executeErrorInterceptors(lastError);\n }\n\n get<T = unknown>(\n url: string,\n config?: Partial<HttpRequestConfig>\n ): Promise<HttpResponse<T>> {\n return this.request<T>({ ...config, method: 'GET', url });\n }\n\n post<T = unknown>(\n url: string,\n data?: unknown,\n config?: Partial<HttpRequestConfig>\n ): Promise<HttpResponse<T>> {\n return this.request<T>({ ...config, method: 'POST', url, data });\n }\n\n put<T = unknown>(\n url: string,\n data?: unknown,\n config?: Partial<HttpRequestConfig>\n ): Promise<HttpResponse<T>> {\n return this.request<T>({ ...config, method: 'PUT', url, data });\n }\n\n patch<T = unknown>(\n url: string,\n data?: unknown,\n config?: Partial<HttpRequestConfig>\n ): Promise<HttpResponse<T>> {\n return this.request<T>({ ...config, method: 'PATCH', url, data });\n }\n\n delete<T = unknown>(\n url: string,\n config?: Partial<HttpRequestConfig>\n ): Promise<HttpResponse<T>> {\n return this.request<T>({ ...config, method: 'DELETE', url });\n }\n\n getInterceptors(): InterceptorManagerImpl {\n return this.interceptors;\n }\n\n updateConfig(updates: Partial<ClientConfig>): void {\n this.config = { ...this.config, ...updates };\n }\n\n getConfig(): ClientConfig {\n return { ...this.config };\n }\n}\n","export type Region = 'asia-south1' | 'us-central1';\nexport type Environment = 'local' | 'sit' | 'uat' | 'prod';\n\nexport interface EnvironmentConfig {\n baseURL: string;\n timeout: number;\n retryAttempts?: number;\n debug?: boolean;\n}\n\nexport const REGION_CONFIGS: Record<\n Region,\n Record<Environment, EnvironmentConfig>\n> = {\n 'asia-south1': {\n local: {\n baseURL: 'http://localhost:8000',\n timeout: 30000,\n debug: true,\n },\n sit: {\n baseURL: 'https://asia-south1.api.fcz0.de/service/sdk/boltic-tables',\n timeout: 15000,\n },\n uat: {\n baseURL: 'https://asia-south1.api.uat.fcz0.de/service/sdk/boltic-tables',\n timeout: 15000,\n },\n prod: {\n baseURL: 'https://asia-south1.api.boltic.io/service/sdk/boltic-tables',\n timeout: 10000,\n },\n },\n 'us-central1': {\n local: {\n baseURL: 'http://localhost:8000',\n timeout: 30000,\n debug: true,\n },\n sit: {\n baseURL: 'https://us-central1.api.fcz0.de/service/sdk/boltic-tables',\n timeout: 15000,\n },\n uat: {\n baseURL: 'https://us-central1.api.uat.fcz0.de/service/sdk/boltic-tables',\n timeout: 15000,\n },\n prod: {\n baseURL: 'https://us-central1.api.boltic.io/service/sdk/boltic-tables',\n timeout: 10000,\n },\n },\n};\n\n// Legacy support - default to asia-south1\nexport const ENV_CONFIGS: Record<Environment, EnvironmentConfig> =\n REGION_CONFIGS['asia-south1'];\n","import {\n Environment,\n EnvironmentConfig,\n Region,\n REGION_CONFIGS,\n} from '../../types/config/environment';\n\nexport interface ClientConfig extends EnvironmentConfig {\n apiKey: string;\n environment: Environment;\n region: Region;\n headers?: Record<string, string>;\n retryAttempts: number;\n retryDelay: number;\n maxRetries: number;\n}\n\nexport class ConfigManager {\n private config: ClientConfig;\n\n constructor(\n apiKey: string,\n environment: Environment = 'prod',\n region: Region = 'asia-south1',\n overrides?: Partial<\n EnvironmentConfig & {\n retryAttempts?: number;\n retryDelay?: number;\n maxRetries?: number;\n headers?: Record<string, string>;\n }\n >\n ) {\n const envConfig = REGION_CONFIGS[region][environment];\n this.config = {\n apiKey,\n environment,\n region,\n retryAttempts: 3,\n retryDelay: 1000,\n maxRetries: 3,\n debug: false,\n headers: {},\n ...envConfig,\n ...overrides,\n };\n }\n\n getConfig(): ClientConfig {\n return { ...this.config };\n }\n\n updateConfig(updates: Partial<ClientConfig>): void {\n this.config = { ...this.config, ...updates };\n }\n\n // Security methods to prevent API key exposure\n toString(): string {\n return `ConfigManager { environment: \"${this.config.environment}\", region: \"${this.config.region}\", debug: ${this.config.debug} }`;\n }\n\n toJSON(): object {\n const safeConfig = { ...this.config };\n delete (safeConfig as Record<string, unknown>).apiKey;\n return safeConfig;\n }\n\n // Custom inspect method for Node.js console logging\n [Symbol.for('nodejs.util.inspect.custom')](): string {\n return this.toString();\n }\n}\n","/**\n * Common utility functions for the Boltic SDK\n */\n\n/**\n * Filters an object to only include specified fields\n * @param obj - The object to filter\n * @param fields - Array of field names to include. If empty or undefined, returns the original object\n * @returns Filtered object with only the specified fields\n */\nexport function filterObjectFields<T extends Record<string, unknown>>(\n obj: T,\n fields?: string[]\n): Partial<T> {\n // If no fields specified or empty array, return original object\n if (!fields || fields.length === 0) {\n return obj;\n }\n\n // Filter the object to only include specified fields\n const filtered: Partial<T> = {};\n for (const field of fields) {\n if (field in obj) {\n (filtered as Record<string, unknown>)[field] = obj[field];\n }\n }\n\n return filtered;\n}\n\n/**\n * Filters an array of objects to only include specified fields\n * @param arr - Array of objects to filter\n * @param fields - Array of field names to include. If empty or undefined, returns the original array\n * @returns Array of filtered objects with only the specified fields\n */\nexport function filterArrayFields<T extends Record<string, unknown>>(\n arr: T[],\n fields?: string[]\n): Partial<T>[] {\n // If no fields specified or empty array, return original array\n if (!fields || fields.length === 0) {\n return arr;\n }\n\n // Filter each object in the array\n return arr.map((obj) => filterObjectFields(obj, fields));\n}\n","export interface ApiEndpoint {\n path: string;\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n authenticated: boolean;\n rateLimit?: {\n requests: number;\n window: number; // in milliseconds\n };\n}\n\nexport interface ColumnEndpoints {\n list: ApiEndpoint;\n create: ApiEndpoint;\n get: ApiEndpoint;\n update: ApiEndpoint;\n delete: ApiEndpoint;\n}\n\nexport const COLUMN_ENDPOINTS: ColumnEndpoints = {\n list: {\n path: '/tables/{table_id}/fields/list',\n method: 'POST',\n authenticated: true,\n rateLimit: { requests: 200, window: 60000 },\n },\n create: {\n path: '/tables/{table_id}/fields',\n method: 'POST',\n authenticated: true,\n },\n get: {\n path: '/tables/{table_id}/fields/{field_id}',\n method: 'GET',\n authenticated: true,\n rateLimit: { requests: 300, window: 60000 },\n },\n update: {\n path: '/tables/{table_id}/fields/{field_id}',\n method: 'PATCH',\n authenticated: true,\n },\n delete: {\n path: '/tables/{table_id}/fields/{field_id}',\n method: 'DELETE',\n authenticated: true,\n },\n};\n\nexport const buildEndpointPath = (\n endpoint: ApiEndpoint,\n params: Record<string, string> = {}\n): string => {\n let path = endpoint.path;\n\n // Replace path parameters\n Object.entries(params).forEach(([key, value]) => {\n path = path.replace(`{${key}}`, encodeURIComponent(value));\n });\n\n // Check for unreplaced parameters\n const unreplacedParams = path.match(/\\{([^}]+)\\}/g);\n if (unreplacedParams) {\n throw new Error(`Missing path parameters: ${unreplacedParams.join(', ')}`);\n }\n\n return path;\n};\n","import { FieldDefinition, FieldType } from './table';\n\n// Alignment types\nexport type AlignmentType = 'left' | 'center' | 'right';\n\n// Decimal types for number and currency fields\nexport type DecimalType =\n | '00'\n | '0.0'\n | '0.00'\n | '0.000'\n | '0.0000'\n | '0.00000'\n | '0.000000';\n\n// Phone format types\nexport type PhoneFormatType =\n | '+91 123 456 7890'\n | '(123) 456-7890'\n | '+1 (123) 456-7890'\n | '+91 12 3456 7890';\n\n// Date format enum for user-friendly values\nexport const DateFormatEnum = Object.freeze({\n MMDDYY: '%m/%d/%y',\n MMDDYYYY: '%m/%d/%Y',\n MM_DD_YYYY: '%m-%d-%Y',\n DD_MM_YYYY: '%d-%m-%Y',\n DDMMYYYY: '%d/%m/%Y',\n DDMMYY: '%d/%m/%y',\n YYYY_MM_DD: '%Y-%m-%d',\n MMMM__DD__YYYY: '%B %d %Y',\n MMM__DD__YYYY: '%b %d %Y',\n ddd__MMM__DD__YYYY: '%a %b %d %Y',\n});\n\n// Time format enum for user-friendly values\nexport const TimeFormatEnum = Object.freeze({\n HH_mm_ss: '%H:%M:%S',\n HH_mm_ssZ: '%H:%M:%SZ',\n HH_mm_ss_SSS: '%H:%M:%S.%f',\n HH_mm_ss__Z: '%H:%M:%S %Z',\n HH_mm__AMPM: '%I:%M %p', // 12-hour format with AM/PM\n HH_mm_ss__AMPM: '%I:%M:%S %p',\n});\n\n// Field type enum for validation\nexport enum FieldTypeEnum {\n TEXT = 'text',\n EMAIL = 'email',\n LONG_TEXT = 'long-text',\n DATE_TIME = 'date-time',\n NUMBER = 'number',\n CURRENCY = 'currency',\n CHECKBOX = 'checkbox',\n DROPDOWN = 'dropdown',\n PHONE_NUMBER = 'phone-number',\n LINK = 'link',\n JSON = 'json',\n VECTOR = 'vector',\n SPARSEVECTOR = 'sparsevec',\n HALFVECTOR = 'halfvec',\n}\n\n// Allowed field type conversions\nexport const ALLOWED_FIELD_TYPE_CONVERSIONS = {\n [FieldTypeEnum.TEXT]: [\n FieldTypeEnum.EMAIL,\n FieldTypeEnum.LONG_TEXT,\n FieldTypeEnum.DATE_TIME,\n FieldTypeEnum.NUMBER,\n FieldTypeEnum.CURRENCY,\n FieldTypeEnum.CHECKBOX,\n FieldTypeEnum.PHONE_NUMBER,\n FieldTypeEnum.LINK,\n FieldTypeEnum.JSON,\n FieldTypeEnum.VECTOR,\n FieldTypeEnum.SPARSEVECTOR,\n FieldTypeEnum.HALFVECTOR,\n ],\n [FieldTypeEnum.EMAIL]: [\n FieldTypeEnum.TEXT,\n FieldTypeEnum.LONG_TEXT,\n FieldTypeEnum.DATE_TIME,\n FieldTypeEnum.NUMBER,\n FieldTypeEnum.CURRENCY,\n FieldTypeEnum.CHECKBOX,\n FieldTypeEnum.PHONE_NUMBER,\n FieldTypeEnum.LINK,\n FieldTypeEnum.JSON,\n FieldTypeEnum.VECTOR,\n FieldTypeEnum.SPARSEVECTOR,\n FieldTypeEnum.HALFVECTOR,\n ],\n [FieldTypeEnum.LONG_TEXT]: [\n FieldTypeEnum.TEXT,\n FieldTypeEnum.EMAIL,\n FieldTypeEnum.DATE_TIME,\n FieldTypeEnum.NUMBER,\n FieldTypeEnum.CURRENCY,\n FieldTypeEnum.CHECKBOX,\n FieldTypeEnum.PHONE_NUMBER,\n FieldTypeEnum.LINK,\n FieldTypeEnum.JSON,\n FieldTypeEnum.VECTOR,\n FieldTypeEnum.SPARSEVECTOR,\n FieldTypeEnum.HALFVECTOR,\n ],\n [FieldTypeEnum.DATE_TIME]: [\n FieldTypeEnum.TEXT,\n FieldTypeEnum.EMAIL,\n FieldTypeEnum.LONG_TEXT,\n FieldTypeEnum.PHONE_NUMBER,\n FieldTypeEnum.LINK,\n ],\n [FieldTypeEnum.NUMBER]: [\n FieldTypeEnum.TEXT,\n FieldTypeEnum.EMAIL,\n FieldTypeEnum.LONG_TEXT,\n FieldTypeEnum.CURRENCY,\n FieldTypeEnum.PHONE_NUMBER,\n FieldTypeEnum.LINK,\n ],\n [FieldTypeEnum.CURRENCY]: [\n FieldTypeEnum.TEXT,\n FieldTypeEnum.EMAIL,\n FieldTypeEnum.LONG_TEXT,\n FieldTypeEnum.NUMBER,\n FieldTypeEnum.PHONE_NUMBER,\n FieldTypeEnum.LINK,\n ],\n [FieldTypeEnum.CHECKBOX]: [\n FieldTypeEnum.TEXT,\n FieldTypeEnum.EMAIL,\n FieldTypeEnum.LONG_TEXT,\n FieldTypeEnum.PHONE_NUMBER,\n FieldTypeEnum.LINK,\n ],\n [FieldTypeEnum.DROPDOWN]: [],\n [FieldTypeEnum.PHONE_NUMBER]: [\n FieldTypeEnum.TEXT,\n FieldTypeEnum.EMAIL,\n FieldTypeEnum.LONG_TEXT,\n FieldTypeEnum.DATE_TIME,\n FieldTypeEnum.NUMBER,\n FieldTypeEnum.CURRENCY,\n FieldTypeEnum.CHECKBOX,\n FieldTypeEnum.LINK,\n FieldTypeEnum.JSON,\n FieldTypeEnum.VECTOR,\n FieldTypeEnum.SPARSEVECTOR,\n FieldTypeEnum.HALFVECTOR,\n ],\n [FieldTypeEnum.LINK]: [\n FieldTypeEnum.TEXT,\n FieldTypeEnum.EMAIL,\n FieldTypeEnum.LONG_TEXT,\n FieldTypeEnum.NUMBER,\n FieldTypeEnum.CURRENCY,\n FieldTypeEnum.CHECKBOX,\n FieldTypeEnum.PHONE_NUMBER,\n FieldTypeEnum.JSON,\n FieldTypeEnum.VECTOR,\n FieldTypeEnum.SPARSEVECTOR,\n FieldTypeEnum.HALFVECTOR,\n ],\n [FieldTypeEnum.JSON]: [\n FieldTypeEnum.TEXT,\n FieldTypeEnum.EMAIL,\n FieldTypeEnum.LONG_TEXT,\n FieldTypeEnum.PHONE_NUMBER,\n FieldTypeEnum.LINK,\n ],\n [FieldTypeEnum.VECTOR]: [\n FieldTypeEnum.TEXT,\n FieldTypeEnum.EMAIL,\n FieldTypeEnum.LONG_TEXT,\n FieldTypeEnum.PHONE_NUMBER,\n FieldTypeEnum.LINK,\n FieldTypeEnum.HALFVECTOR,\n FieldTypeEnum.SPARSEVECTOR,\n FieldTypeEnum.VECTOR,\n ],\n [FieldTypeEnum.SPARSEVECTOR]: [\n FieldTypeEnum.TEXT,\n FieldTypeEnum.EMAIL,\n FieldTypeEnum.LONG_TEXT,\n FieldTypeEnum.PHONE_NUMBER,\n FieldTypeEnum.LINK,\n FieldTypeEnum.VECTOR,\n FieldTypeEnum.HALFVECTOR,\n FieldTypeEnum.SPARSEVECTOR,\n ],\n [FieldTypeEnum.HALFVECTOR]: [\n FieldTypeEnum.TEXT,\n FieldTypeEnum.EMAIL,\n FieldTypeEnum.LONG_TEXT,\n FieldTypeEnum.PHONE_NUMBER,\n FieldTypeEnum.LINK,\n FieldTypeEnum.VECTOR,\n FieldTypeEnum.SPARSEVECTOR,\n FieldTypeEnum.HALFVECTOR,\n ],\n};\n\n// Field-specific validation keys map\nexport const FIELD_SPECIFIC_KEYS_MAP = {\n [FieldTypeEnum.TEXT]: [],\n [FieldTypeEnum.EMAIL]: [],\n [FieldTypeEnum.LONG_TEXT]: [],\n [FieldTypeEnum.NUMBER]: ['decimals'],\n [FieldTypeEnum.CURRENCY]: ['decimals', 'currency_format'],\n [FieldTypeEnum.CHECKBOX]: [],\n [FieldTypeEnum.DROPDOWN]: [\n 'selection_source',\n 'selectable_items',\n 'multiple_selections',\n ],\n [FieldTypeEnum.DATE_TIME]: ['timezone', 'date_format', 'time_format'],\n [FieldTypeEnum.PHONE_NUMBER]: ['phone_format'],\n [FieldTypeEnum.LINK]: [],\n [FieldTypeEnum.JSON]: [],\n [FieldTypeEnum.VECTOR]: ['vector_dimension'],\n [FieldTypeEnum.SPARSEVECTOR]: ['vector_dimension'],\n [FieldTypeEnum.HALFVECTOR]: ['vector_dimension'],\n};\n\nexport interface ColumnCreateRequest {\n columns: FieldDefinition[];\n fields?: Array<keyof ColumnDetails>;\n}\n\nexport interface ColumnUpdateRequest {\n name?: string;\n type?: FieldType;\n description?: string;\n is_nullable?: boolean;\n is_unique?: boolean;\n is_indexed?: boolean;\n is_visible?: boolean;\n is_primary_key?: boolean;\n is_readonly?: boolean;\n default_value?: unknown;\n field_order?: number;\n fields?: Array<keyof ColumnDetails>;\n\n // Type-specific properties that can be updated\n alignment?: AlignmentType;\n decimals?: DecimalType;\n currency_format?: string; // Use Currency API for validation\n selection_source?: 'provide-static-list';\n selectable_items?: string[];\n multiple_selections?: boolean;\n phone_format?: PhoneFormatType;\n date_format?: keyof typeof DateFormatEnum;\n time_format?: keyof typeof TimeFormatEnum;\n timezone?: string;\n vector_dimension?: number;\n}\n\nexport interface ColumnRecord {\n id: string;\n}\n\n// Full column details interface for when complete column data is returned\nexport interface ColumnDetails {\n id: string;\n name: string;\n table_id: string;\n type: FieldType;\n description?: string;\n is_nullable: boolean;\n is_primary_key: boolean;\n is_unique: boolean;\n is_indexed: boolean;\n is_visible: boolean;\n is_readonly: boolean;\n field_order: number;\n default_value?: unknown;\n created_at: string;\n updated_at: string;\n\n // Type-specific properties\n alignment?: AlignmentType;\n timezone?: string;\n date_format?: string;\n time_format?: string;\n decimals?: number | string;\n currency_format?: string;\n selection_source?: string;\n selectable_items?: string[];\n multiple_selections?: boolean;\n phone_format?: string;\n vector_dimension?: number;\n}\n\nexport interface ColumnQueryOptions {\n where?: {\n id?: string;\n name?: string;\n table_id?: string;\n type?: FieldType;\n is_nullable?: boolean;\n is_unique?: boolean;\n is_indexed?: boolean;\n is_primary_key?: boolean;\n };\n fields?: Array<keyof ColumnDetails>;\n sort?: Array<{\n field: keyof ColumnDetails;\n order: 'asc' | 'desc';\n }>;\n limit?: number;\n offset?: number;\n}\n\nexport interface ColumnDeleteOptions {\n where: {\n id?: string;\n name?: string;\n };\n}\n\nexport interface ColumnListResponse {\n columns: ColumnDetails[];\n pagination: {\n total: number;\n page: number;\n limit: number;\n pages: number;\n };\n}\n\nexport interface ColumnUpdateOptions {\n set: ColumnUpdateRequest;\n where: {\n id?: string;\n name?: string;\n };\n}\n","import {\n ColumnDetails,\n ColumnQueryOptions,\n ColumnRecord,\n ColumnUpdateRequest,\n DateFormatEnum,\n TimeFormatEnum,\n} from '../../types/api/column';\nimport { FieldDefinition, FieldType } from '../../types/api/table';\nimport { ApiFilter } from '../../utils/filters/filter-mapper';\n\nexport interface ColumnCreateApiRequest {\n field: FieldDefinition;\n}\n\nexport interface ColumnListApiRequest {\n page?: {\n page_no: number;\n page_size: number;\n };\n sort?: Array<{\n field: string;\n direction: 'asc' | 'desc';\n }>;\n filters?: ApiFilter[];\n}\n\nexport interface ColumnUpdateApiRequest {\n id?: string;\n name?: string;\n type?: string;\n description?: string;\n is_nullable?: boolean;\n is_unique?: boolean;\n is_indexed?: boolean;\n is_primary_key?: boolean;\n is_visible?: boolean;\n is_readonly?: boolean;\n default_value?: unknown;\n field_order?: number;\n alignment?: 'left' | 'center' | 'right';\n decimals?: string;\n currency_format?: string;\n selection_source?: string;\n selectable_items?: string[];\n multiple_selections?: boolean;\n phone_format?: string;\n date_format?: string;\n time_format?: string;\n timezone?: string;\n vector_dimension?: number;\n}\n\nexport interface ColumnApiResponse {\n data: {\n id: string;\n name: string;\n original_name: string;\n table_id: string;\n table_name: string;\n type: string;\n description?: string;\n is_nullable: boolean;\n is_primary_key: boolean;\n is_unique: boolean;\n is_indexed: boolean;\n is_visible: boolean;\n is_readonly: boolean;\n field_order: number;\n default_value?: unknown;\n created_at: string;\n updated_at: string;\n alignment?: string;\n timezone?: string;\n date_format?: string;\n time_format?: string;\n decimals?: string;\n currency_format?: string;\n selection_source?: string;\n selectable_items?: string[];\n multiple_selections?: boolean;\n phone_format?: string;\n vector_dimension?: number;\n };\n}\n\nexport interface ColumnListApiResponse {\n data: ColumnDetails[];\n pagination: {\n total_count: number;\n total_pages: number;\n current_page: number;\n per_page: number;\n type: string;\n };\n}\n\n/**\n * Transform SDK column create request to API format\n */\nexport function transformColumnCreateRequest(\n request: FieldDefinition\n): FieldDefinition {\n // Validate the single column data\n if (!request || typeof request !== 'object') {\n throw new Error('Invalid request: single column data is required');\n }\n\n if (!request.name || !request.type) {\n throw new Error('Column name and type are required');\n }\n\n // Transform the single column\n return transformFieldDefinition(request);\n}\n\n/**\n * Transform field definition to API format\n */\nfunction transformFieldDefinition(field: FieldDefinition): FieldDefinition {\n return {\n name: field.name,\n type: field.type,\n is_nullable: field.is_nullable ?? true,\n is_primary_key: field.is_primary_key ?? false,\n is_unique: field.is_unique ?? false,\n is_visible: field.is_visible ?? true,\n is_readonly: field.is_readonly ?? false,\n is_indexed: field.is_indexed ?? false,\n field_order: field.field_order ?? 1,\n alignment: field.alignment ?? 'left',\n timezone: field.timezone ?? undefined,\n date_format: field.date_format\n ? transformDateFormat(field.date_format as keyof typeof DateFormatEnum)\n : undefined,\n time_format: field.time_format\n ? transformTimeFormat(field.time_format as keyof typeof TimeFormatEnum)\n : undefined,\n decimals: field.decimals ?? undefined,\n currency_format: field.currency_format ?? undefined,\n selection_source:\n field.type === 'dropdown' && !field.selection_source\n ? 'provide-static-list'\n : (field.selection_source ?? undefined),\n selectable_items: field.selectable_items ?? undefined,\n multiple_selections: field.multiple_selections ?? undefined,\n phone_format: field.phone_format ?? undefined,\n vector_dimension: field.vector_dimension ?? undefined,\n description: field.description ?? undefined,\n default_value: field.default_value ?? undefined,\n };\n}\n\n/**\n * Transform SDK column list request to API format\n */\nexport function transformColumnListRequest(\n options: ColumnQueryOptions & {\n page?: number;\n pageSize?: number;\n } = {}\n): ColumnListApiRequest {\n const request: ColumnListApiRequest = {};\n\n // Add pagination\n if (options.page !== undefined || options.pageSize !== undefined) {\n request.page = {\n page_no: options.page || 1,\n page_size: options.pageSize || 1000,\n };\n }\n\n // Add sorting\n if (options.sort?.length) {\n request.sort = options.sort.map((s) => ({\n field: s.field as string,\n direction: s.order,\n }));\n }\n\n // Add filters\n if (options.where) {\n const filters: ApiFilter[] = [];\n\n Object.entries(options.where).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n filters.push({\n field: key,\n operator: '=',\n values: [value],\n });\n }\n });\n\n if (filters.length > 0) {\n request.filters = filters;\n }\n }\n\n return request;\n}\n\n/**\n * Transform SDK column update request to API format\n */\nexport function transformColumnUpdateRequest(\n updates: ColumnUpdateRequest\n): ColumnUpdateApiRequest {\n const apiRequest: ColumnUpdateApiRequest = {};\n\n if (updates.name !== undefined) apiRequest.name = updates.name;\n if (updates.type !== undefined) apiRequest.type = updates.type;\n if (updates.description !== undefined)\n apiRequest.description = updates.description;\n if (updates.is_nullable !== undefined)\n apiRequest.is_nullable = updates.is_nullable;\n if (updates.is_unique !== undefined) apiRequest.is_unique = updates.is_unique;\n if (updates.is_primary_key !== undefined)\n apiRequest.is_primary_key = updates.is_primary_key;\n if (updates.is_indexed !== undefined)\n apiRequest.is_indexed = updates.is_indexed;\n if (updates.is_visible !== undefined)\n apiRequest.is_visible = updates.is_visible;\n if (updates.is_readonly !== undefined)\n apiRequest.is_readonly = updates.is_readonly;\n if (updates.default_value !== undefined)\n apiRequest.default_value = updates.default_value;\n if (updates.field_order !== undefined)\n apiRequest.field_order = updates.field_order;\n\n // Type-specific fields\n if (updates.alignment !== undefined) apiRequest.alignment = updates.alignment;\n if (updates.decimals !== undefined) apiRequest.decimals = updates.decimals;\n if (updates.currency_format !== undefined)\n apiRequest.currency_format = updates.currency_format;\n\n // Handle selection_source for dropdown columns\n // Set to \"provide-static-list\" when:\n // 1. Changing type to dropdown\n // 2. Updating selectable_items (implies dropdown behavior)\n // 3. Explicitly setting selection_source\n if (updates.type === 'dropdown') {\n // When changing type to dropdown, always set selection_source\n apiRequest.selection_source = 'provide-static-list';\n } else if (updates.selectable_items !== undefined) {\n // When updating selectable_items, ensure selection_source is set\n apiRequest.selection_source = 'provide-static-list';\n } else if (updates.selection_source !== undefined) {\n // When explicitly setting selection_source, use the provided value\n apiRequest.selection_source = updates.selection_source;\n }\n // If none of the above, don't modify selection_source (preserve existing)\n\n if (updates.selectable_items !== undefined)\n apiRequest.selectable_items = updates.selectable_items;\n if (updates.multiple_selections !== undefined)\n apiRequest.multiple_selections = updates.multiple_selections;\n if (updates.phone_format !== undefined)\n apiRequest.phone_format = updates.phone_format;\n if (updates.timezone !== undefined) apiRequest.timezone = updates.timezone;\n if (updates.vector_dimension !== undefined)\n apiRequest.vector_dimension = updates.vector_dimension;\n\n // Transform date and time formats\n if (updates.date_format !== undefined) {\n apiRequest.date_format = transformDateFormat(updates.date_format);\n }\n if (updates.time_format !== undefined) {\n apiRequest.time_format = transformTimeFormat(updates.time_format);\n }\n\n return apiRequest;\n}\n\n/**\n * Transform API column response to SDK format\n */\nexport function transformColumnResponse(\n response: ColumnApiResponse\n): ColumnDetails {\n return {\n id: response.data.id,\n name: response.data.name,\n table_id: response.data.table_id,\n type: response.data.type as FieldType,\n description: response.data.description,\n is_nullable: response.data.is_nullable,\n is_primary_key: response.data.is_primary_key,\n is_unique: response.data.is_unique,\n is_indexed: response.data.is_indexed,\n is_visible: response.data.is_visible,\n is_readonly: response.data.is_readonly,\n field_order: response.data.field_order,\n default_value: response.data.default_value,\n created_at: response.data.created_at,\n updated_at: response.data.updated_at,\n alignment: response.data.alignment as 'left' | 'center' | 'right',\n timezone: response.data.timezone,\n date_format: response.data.date_format,\n time_format: response.data.time_format,\n decimals: response.data.decimals,\n currency_format: response.data.currency_format,\n selection_source: response.data.selection_source,\n selectable_items: response.data.selectable_items,\n multiple_selections: response.data.multiple_selections,\n phone_format: response.data.phone_format,\n vector_dimension: response.data.vector_dimension,\n };\n}\n\n/**\n * Transform API column create response to SDK format\n * For create operations, the API returns only the id\n */\nexport function transformColumnCreateResponse(response: {\n data: { id: string };\n message?: string;\n}): ColumnRecord {\n return {\n id: response.data.id,\n };\n}\n\n/**\n * Transform API column list response to SDK format\n */\nexport function transformColumnListResponse(response: ColumnListApiResponse): {\n columns: ColumnDetails[];\n pagination: {\n total_count: number;\n total_pages: number;\n current_page: number;\n per_page: number;\n type: string;\n };\n} {\n return {\n columns: response.data,\n pagination: {\n total_count: response.pagination?.total_count,\n total_pages: response.pagination?.total_pages,\n current_page: response.pagination?.current_page,\n per_page: response.pagination?.per_page,\n type: response.pagination?.type,\n },\n };\n}\n\n/**\n * Transform date format from user-friendly enum to API format\n */\nfunction transformDateFormat(dateFormat: keyof typeof DateFormatEnum): string {\n return DateFormatEnum[dateFormat] || dateFormat;\n}\n\n/**\n * Transform time format from user-friendly enum to API format\n */\nfunction transformTimeFormat(timeFormat: keyof typeof TimeFormatEnum): string {\n return TimeFormatEnum[timeFormat] || timeFormat;\n}\n","import {\n ColumnCreateRequest,\n ColumnDetails,\n ColumnQueryOptions,\n ColumnRecord,\n ColumnUpdateRequest,\n} from '../../types/api/column';\nimport { FieldDefinition } from '../../types/api/table';\nimport type { Environment, Region } from '../../types/config/environment';\nimport { REGION_CONFIGS } from '../../types/config/environment';\nimport { filterArrayFields, filterObjectFields } from '../../utils/common';\nimport { createHttpAdapter } from '../../utils/http';\nimport { HttpAdapter } from '../../utils/http/adapter';\nimport { buildEndpointPath, COLUMN_ENDPOINTS } from '../endpoints/columns';\nimport {\n transformColumnCreateRequest,\n transformColumnUpdateRequest,\n} from '../transformers/columns';\n\nexport interface ColumnsApiClientConfig {\n apiKey: string;\n environment?: Environment;\n region?: Region;\n timeout?: number;\n debug?: boolean;\n retryAttempts?: number;\n retryDelay?: number;\n headers?: Record<string, string>;\n}\n\nexport interface ColumnListOptions extends ColumnQueryOptions {\n page?: number;\n pageSize?: number;\n}\n\n// API request format interfaces\nexport interface ApiFilter {\n field: string;\n operator: string;\n values: unknown[];\n}\n\nexport interface ApiSort {\n field: string;\n direction: 'asc' | 'desc';\n}\n\nexport interface ColumnApiListRequest {\n page: {\n page_no: number;\n page_size: number;\n };\n filters: ApiFilter[];\n sort: ApiSort[];\n}\n\n// Boltic API Response Structure interfaces\ninterface BolticSuccessResponse<T = unknown> {\n data: T;\n message?: string;\n}\n\ninterface BolticListResponse<T = unknown> {\n data: T[];\n pagination?: {\n total_count: number;\n total_pages: number;\n current_page: number;\n per_page: number;\n type: string;\n };\n message?: string;\n}\n\ninterface BolticErrorResponse {\n data?: never;\n error: {\n code?: string;\n message?: string;\n meta?: string[];\n };\n}\n\n/**\n * Columns API Client - handles all column-related API operations\n */\nexport class ColumnsApiClient {\n private httpAdapter: HttpAdapter;\n private config: ColumnsApiClientConfig;\n private baseURL: string;\n\n constructor(\n apiKey: string,\n config: Omit<ColumnsApiClientConfig, 'apiKey'> = {}\n ) {\n this.config = { apiKey, ...config };\n this.httpAdapter = createHttpAdapter();\n\n // Set baseURL based on environment and region\n const environment = config.environment || 'prod';\n const region = config.region || 'asia-south1'; // Default to asia-south1 for legacy support\n this.baseURL = this.getBaseURL(environment, region);\n }\n\n private getBaseURL(environment: Environment, region: Region): string {\n const regionConfig = REGION_CONFIGS[region];\n if (!regionConfig) {\n throw new Error(`Unsupported region: ${region}`);\n }\n\n const envConfig = regionConfig[environment];\n if (!envConfig) {\n throw new Error(\n `Unsupported environment: ${environment} for region: ${region}`\n );\n }\n\n return `${envConfig.baseURL}/v1`;\n }\n\n /**\n * Create a single column in a table\n */\n async createColumn(\n tableId: string,\n request: FieldDefinition\n ): Promise<BolticSuccessResponse<ColumnRecord> | BolticErrorResponse> {\n try {\n const endpoint = COLUMN_ENDPOINTS.create;\n const url = `${this.baseURL}${buildEndpointPath(endpoint, { table_id: tableId })}`;\n\n // Transform the request to ensure proper formatting (e.g., selection_source for dropdowns)\n const transformedRequest = transformColumnCreateRequest(request);\n\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n data: transformedRequest,\n timeout: this.config.timeout,\n });\n\n if (this.config.debug) {\n console.log(\n 'Column API Response:',\n JSON.stringify(response.data, null, 2)\n );\n }\n\n // Return raw response without transformation\n return response.data as BolticSuccessResponse<ColumnRecord>;\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n /**\n * Create multiple columns in a table (one by one)\n */\n async createColumns(\n tableId: string,\n request: ColumnCreateRequest\n ): Promise<BolticListResponse<ColumnRecord> | BolticErrorResponse> {\n try {\n const columns = request.columns;\n const createdColumns: ColumnRecord[] = [];\n\n for (const column of columns) {\n const result = await this.createColumn(tableId, column);\n\n if ('error' in result) {\n return result;\n }\n\n createdColumns.push(result.data);\n }\n\n // Apply field filtering if fields are specified\n if (request.fields && createdColumns.length > 0) {\n const filteredColumns = filterArrayFields(\n createdColumns as unknown as Record<string, unknown>[],\n request.fields as string[]\n ) as unknown as ColumnRecord[];\n createdColumns.splice(0, createdColumns.length, ...filteredColumns);\n }\n\n // Return in Boltic list format\n return {\n data: createdColumns,\n message: 'Columns created successfully',\n };\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n /**\n * List columns in a table with filtering and pagination\n */\n async listColumns(\n tableId: string,\n options: ColumnListOptions = {}\n ): Promise<BolticListResponse<ColumnDetails> | BolticErrorResponse> {\n try {\n const endpoint = COLUMN_ENDPOINTS.list;\n const url = `${this.baseURL}${buildEndpointPath(endpoint, { table_id: tableId })}?no_cache=true`;\n\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n data: options,\n timeout: this.config.timeout,\n });\n\n // Apply field filtering if fields are specified\n const responseData = response.data as BolticListResponse<ColumnDetails>;\n if (options.fields && responseData.data) {\n responseData.data = filterArrayFields(\n responseData.data as unknown as Record<string, unknown>[],\n options.fields as string[]\n ) as unknown as ColumnDetails[];\n }\n\n return responseData;\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n /**\n * Get a single column by ID\n */\n async getColumn(\n tableId: string,\n columnId: string,\n options: { fields?: Array<keyof ColumnDetails> } = {}\n ): Promise<BolticSuccessResponse<ColumnDetails> | BolticErrorResponse> {\n try {\n const endpoint = COLUMN_ENDPOINTS.get;\n const url = `${this.baseURL}${buildEndpointPath(endpoint, {\n table_id: tableId,\n field_id: columnId,\n })}`;\n\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n timeout: this.config.timeout,\n });\n\n if (this.config.debug) {\n console.log(\n 'Column API Response:',\n JSON.stringify(response.data, null, 2)\n );\n }\n\n // Apply field filtering if fields are specified\n const responseData =\n response.data as BolticSuccessResponse<ColumnDetails>;\n if (options.fields && responseData.data) {\n responseData.data = filterObjectFields(\n responseData.data as unknown as Record<string, unknown>,\n options.fields as string[]\n ) as unknown as ColumnDetails;\n }\n\n return responseData;\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n /**\n * Update a column\n */\n async updateColumn(\n tableId: string,\n columnId: string,\n updates: ColumnUpdateRequest\n ): Promise<BolticSuccessResponse<ColumnDetails> | BolticErrorResponse> {\n try {\n const endpoint = COLUMN_ENDPOINTS.update;\n const url = `${this.baseURL}${buildEndpointPath(endpoint, {\n table_id: tableId,\n field_id: columnId,\n })}`;\n\n // Transform the updates to API format\n const transformedUpdates = transformColumnUpdateRequest(updates);\n\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n data: transformedUpdates,\n timeout: this.config.timeout,\n });\n\n // Apply field filtering if fields are specified\n const responseData =\n response.data as BolticSuccessResponse<ColumnDetails>;\n if (updates.fields && responseData.data) {\n responseData.data = filterObjectFields(\n responseData.data as unknown as Record<string, unknown>,\n updates.fields as string[]\n ) as unknown as ColumnDetails;\n }\n\n return responseData;\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n /**\n * Delete a column\n */\n async deleteColumn(\n tableId: string,\n columnId: string\n ): Promise<BolticSuccessResponse<{ message: string }> | BolticErrorResponse> {\n try {\n const endpoint = COLUMN_ENDPOINTS.delete;\n const url = `${this.baseURL}${buildEndpointPath(endpoint, {\n table_id: tableId,\n field_id: columnId,\n })}`;\n\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n timeout: this.config.timeout,\n });\n\n // Return raw response without transformation\n return response.data as BolticSuccessResponse<{ message: string }>;\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n /**\n * Find column by name in a table\n */\n async findColumnByName(\n tableId: string,\n columnName: string\n ): Promise<\n BolticSuccessResponse<ColumnDetails | null> | BolticErrorResponse\n > {\n try {\n // Transform to API format\n const apiRequest = {\n page: { page_no: 1, page_size: 1 },\n filters: [\n {\n field: 'name',\n operator: '=',\n values: [columnName],\n },\n ],\n sort: [],\n };\n\n const listResult = await this.listColumns(\n tableId,\n apiRequest as unknown as ColumnListOptions\n );\n if ('error' in listResult) {\n return listResult;\n }\n const column = listResult.data[0] || null;\n return {\n data: column,\n message: column ? 'Column found' : 'Column not found',\n };\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n /**\n * Helper function to convert ColumnDetails to ColumnUpdateRequest format\n */\n private convertColumnDetailsToUpdateRequest(\n columnDetails: ColumnDetails\n ): Record<string, unknown> {\n return {\n name: columnDetails.name,\n type: columnDetails.type,\n description: columnDetails.description,\n is_nullable: columnDetails.is_nullable,\n is_unique: columnDetails.is_unique,\n is_indexed: columnDetails.is_indexed,\n is_visible: columnDetails.is_visible,\n is_primary_key: columnDetails.is_primary_key,\n is_readonly: columnDetails.is_readonly,\n default_value: columnDetails.default_value,\n field_order: columnDetails.field_order,\n alignment: columnDetails.alignment,\n decimals: columnDetails.decimals,\n currency_format: columnDetails.currency_format,\n selection_source: columnDetails.selection_source,\n selectable_items: columnDetails.selectable_items,\n multiple_selections: columnDetails.multiple_selections,\n phone_format: columnDetails.phone_format,\n date_format: columnDetails.date_format,\n time_format: columnDetails.time_format,\n timezone: columnDetails.timezone,\n vector_dimension: columnDetails.vector_dimension,\n };\n }\n\n /**\n * Update a column by name\n */\n async updateColumnByName(\n tableId: string,\n columnName: string,\n updates: ColumnUpdateRequest\n ): Promise<BolticSuccessResponse<ColumnDetails> | BolticErrorResponse> {\n try {\n // First find the column to get its current data\n const findResult = await this.findColumnByName(tableId, columnName);\n\n if ('error' in findResult) {\n return findResult;\n }\n\n if (!findResult.data) {\n return {\n error: {\n code: 'COLUMN_NOT_FOUND',\n message: `Column '${columnName}' not found in table`,\n meta: ['404'],\n },\n };\n }\n\n // Convert existing column details to update request format\n const existingColumnAsUpdate = this.convertColumnDetailsToUpdateRequest(\n findResult.data\n );\n\n // Merge existing data with updates (updates override existing values)\n const mergedUpdates: ColumnUpdateRequest = {\n ...existingColumnAsUpdate,\n ...updates,\n } as ColumnUpdateRequest;\n\n // Update using the column ID with merged data\n return await this.updateColumn(\n tableId,\n findResult.data.id,\n mergedUpdates\n );\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n /**\n * Delete column by name\n */\n async deleteColumnByName(\n tableId: string,\n columnName: string\n ): Promise<BolticSuccessResponse<{ message: string }> | BolticErrorResponse> {\n try {\n // First find the column to get its ID\n const findResult = await this.findColumnByName(tableId, columnName);\n\n if ('error' in findResult) {\n return findResult;\n }\n\n if (!findResult.data) {\n return {\n error: {\n code: 'COLUMN_NOT_FOUND',\n message: `Column '${columnName}' not found in table`,\n meta: ['Column not found'],\n },\n };\n }\n\n // Delete using the column ID\n return await this.deleteColumn(tableId, findResult.data.id);\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n private buildHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'x-boltic-token': this.config.apiKey,\n };\n }\n\n private formatErrorResponse(error: unknown): BolticErrorResponse {\n if (this.config.debug) {\n console.error('Columns API Error:', error);\n }\n\n // Handle different error types following Boltic format\n if (error && typeof error === 'object' && 'response' in error) {\n const apiError = error as {\n response?: {\n data?: BolticErrorResponse;\n status?: number;\n };\n };\n\n // If API already returned Boltic format, use it\n if (apiError.response?.data?.error) {\n return apiError.response.data;\n }\n\n // Otherwise format it to Boltic structure\n return {\n error: {\n code: 'API_ERROR',\n message: (error as unknown as Error).message || 'Unknown API error',\n meta: [`Status: ${apiError.response?.status || 'unknown'}`],\n },\n };\n }\n\n if (error && typeof error === 'object' && 'message' in error) {\n return {\n error: {\n code: 'CLIENT_ERROR',\n message: (error as Error).message,\n meta: ['Client-side error occurred'],\n },\n };\n }\n\n return {\n error: {\n code: 'UNKNOWN_ERROR',\n message: 'An unexpected error occurred',\n meta: ['Unknown error type'],\n },\n };\n }\n}\n","export interface ApiEndpoint {\n path: string;\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n authenticated: boolean;\n rateLimit?: {\n requests: number;\n window: number; // in milliseconds\n };\n}\n\nexport interface TableEndpoints {\n list: ApiEndpoint;\n create: ApiEndpoint;\n get: ApiEndpoint;\n update: ApiEndpoint;\n delete: ApiEndpoint;\n}\n\nexport const TABLE_ENDPOINTS: TableEndpoints = {\n list: {\n path: '/tables/list',\n method: 'POST',\n authenticated: true,\n rateLimit: { requests: 200, window: 60000 },\n },\n create: {\n path: '/tables',\n method: 'POST',\n authenticated: true,\n },\n get: {\n path: '/tables/{table_id}',\n method: 'GET',\n authenticated: true,\n rateLimit: { requests: 300, window: 60000 },\n },\n update: {\n path: '/tables/{table_id}',\n method: 'PATCH',\n authenticated: true,\n },\n delete: {\n path: '/tables/{table_id}',\n method: 'DELETE',\n authenticated: true,\n },\n};\n\nexport const buildEndpointPath = (\n endpoint: ApiEndpoint,\n params: Record<string, string> = {}\n): string => {\n let path = endpoint.path;\n\n // Replace path parameters\n Object.entries(params).forEach(([key, value]) => {\n path = path.replace(`{${key}}`, encodeURIComponent(value));\n });\n\n // Check for unreplaced parameters\n const unreplacedParams = path.match(/\\{([^}]+)\\}/g);\n if (unreplacedParams) {\n throw new Error(`Missing path parameters: ${unreplacedParams.join(', ')}`);\n }\n\n return path;\n};\n","/**\n * Filter structure according to Tables Module PRD and backend buildWhereClause function\n */\nexport interface ApiFilter {\n field: string;\n operator: string;\n values: unknown[];\n}\n\nexport interface WhereCondition {\n [field: string]: unknown;\n}\n\n/**\n * Comprehensive filter operators based on backend buildWhereClause function\n */\nexport const FILTER_OPERATORS = {\n // Relational operators\n EQUALS: '=',\n NOT_EQUALS: '!=',\n GREATER_THAN: '>',\n GREATER_THAN_EQUAL: '>=',\n LESS_THAN: '<',\n LESS_THAN_EQUAL: '<=',\n\n // String operators\n LIKE: 'LIKE', // contains (case-sensitive)\n ILIKE: 'ILIKE', // contains (case-insensitive)\n STARTS_WITH: 'STARTS WITH',\n\n // Array/Set operators\n IN: 'IN', // is one of\n NOT_IN: 'NOT IN', // is not one of\n\n // Special operators\n IS_EMPTY: 'IS EMPTY',\n IS_NULL: 'IS NULL',\n IS_NOT_NULL: 'IS NOT NULL',\n BETWEEN: 'BETWEEN',\n\n // Dropdown/Array specific operators\n ARRAY_CONTAINS: '@>', // is exactly for dropdown\n ARRAY_NOT_CONTAINS: 'NOT @>', // is different from for dropdown\n ANY: 'ANY', // contains (case-sensitive) for dropdown\n IS_ONE_OF_ARRAY: 'IS ONE OF', // is one of for dropdown\n DROPDOWN_ITEM_STARTS_WITH: 'DROPDOWN ITEM STARTS WITH',\n\n // Date operators\n WITHIN: 'WITHIN', // date range operator\n} as const;\n\n/**\n * Map SDK where clause operators to API filter operators\n */\nconst OPERATOR_MAPPING: Record<string, string> = {\n // Basic comparisons\n $eq: FILTER_OPERATORS.EQUALS,\n $ne: FILTER_OPERATORS.NOT_EQUALS,\n $gt: FILTER_OPERATORS.GREATER_THAN,\n $gte: FILTER_OPERATORS.GREATER_THAN_EQUAL,\n $lt: FILTER_OPERATORS.LESS_THAN,\n $lte: FILTER_OPERATORS.LESS_THAN_EQUAL,\n\n // String operations\n $like: FILTER_OPERATORS.LIKE,\n $ilike: FILTER_OPERATORS.ILIKE,\n $startsWith: FILTER_OPERATORS.STARTS_WITH,\n\n // Array operations\n $in: FILTER_OPERATORS.IN,\n $notIn: FILTER_OPERATORS.NOT_IN,\n\n // Special operations\n $between: FILTER_OPERATORS.BETWEEN,\n $isEmpty: FILTER_OPERATORS.IS_EMPTY,\n $isNull: FILTER_OPERATORS.IS_NULL,\n $isNotNull: FILTER_OPERATORS.IS_NOT_NULL,\n\n // Array/dropdown operations\n $arrayContains: FILTER_OPERATORS.ARRAY_CONTAINS,\n $arrayNotContains: FILTER_OPERATORS.ARRAY_NOT_CONTAINS,\n $any: FILTER_OPERATORS.ANY,\n $isOneOfArray: FILTER_OPERATORS.IS_ONE_OF_ARRAY,\n $dropdownItemStartsWith: FILTER_OPERATORS.DROPDOWN_ITEM_STARTS_WITH,\n\n // Date operations\n $within: FILTER_OPERATORS.WITHIN,\n};\n\n/**\n * Convert direct filter array format to SDK format\n * This handles the case where filters are passed directly as an array\n */\nexport function normalizeFilters(\n filters: ApiFilter[] | Record<string, unknown>[] | WhereCondition\n): ApiFilter[] {\n if (Array.isArray(filters)) {\n // Check if it's already ApiFilter format\n if (\n filters.length > 0 &&\n typeof filters[0] === 'object' &&\n 'field' in filters[0] &&\n 'operator' in filters[0] &&\n 'values' in filters[0]\n ) {\n return filters as ApiFilter[];\n }\n // Handle legacy Record<string, unknown>[] format\n // For now, treat it as an empty array since this format is deprecated\n console.warn(\n 'Legacy Record<string, unknown>[] filter format detected. Please migrate to the new filter format.'\n );\n return [];\n }\n return mapWhereToFilters(filters);\n}\n\n/**\n * Map SDK where clause to API filters format\n */\nexport function mapWhereToFilters(where: WhereCondition): ApiFilter[] {\n const filters: ApiFilter[] = [];\n\n Object.entries(where).forEach(([field, condition]) => {\n if (\n typeof condition !== 'object' ||\n Array.isArray(condition) ||\n condition === null\n ) {\n // Direct value comparison\n filters.push({\n field,\n operator: FILTER_OPERATORS.EQUALS,\n values: [condition],\n });\n return;\n }\n\n // Handle operator-based conditions\n Object.entries(condition).forEach(([operator, value]) => {\n const apiOperator = OPERATOR_MAPPING[operator];\n if (!apiOperator) {\n throw new Error(`Unsupported operator: ${operator}`);\n }\n\n let values: unknown[];\n\n // Handle different operator value formats\n if (\n apiOperator === FILTER_OPERATORS.BETWEEN &&\n Array.isArray(value) &&\n value.length === 2\n ) {\n values = value;\n } else if (\n (apiOperator === FILTER_OPERATORS.IN ||\n apiOperator === FILTER_OPERATORS.NOT_IN ||\n apiOperator === FILTER_OPERATORS.IS_ONE_OF_ARRAY) &&\n Array.isArray(value)\n ) {\n values = value;\n } else if (\n apiOperator === FILTER_OPERATORS.IS_NULL ||\n apiOperator === FILTER_OPERATORS.IS_NOT_NULL ||\n apiOperator === FILTER_OPERATORS.IS_EMPTY\n ) {\n values = [];\n } else {\n values = [value];\n }\n\n filters.push({\n field,\n operator: apiOperator,\n values,\n });\n });\n });\n\n return filters;\n}\n\n/**\n * Build API filters with validation based on backend buildWhereClause\n */\nexport function buildApiFilters(\n whereOrFilters: WhereCondition | ApiFilter[],\n whereOperator: 'AND' | 'OR' = 'AND'\n): { filters: ApiFilter[]; whereOperator: string } {\n const filters = normalizeFilters(whereOrFilters);\n\n // Validate filters\n filters.forEach((filter, index) => {\n if (!filter.field) {\n throw new Error(`Filter at index ${index} missing required field`);\n }\n if (!filter.operator) {\n throw new Error(`Filter at index ${index} missing required operator`);\n }\n if (!Array.isArray(filter.values)) {\n throw new Error(`Filter at index ${index} values must be an array`);\n }\n });\n\n return {\n filters,\n whereOperator,\n };\n}\n\n/**\n * Convert API filters back to SDK where clause\n */\nexport function mapFiltersToWhere(filters: ApiFilter[]): WhereCondition {\n const where: WhereCondition = {};\n\n filters.forEach((filter) => {\n const reverseMapping: Record<string, string> = {};\n Object.entries(OPERATOR_MAPPING).forEach(([sdkOp, apiOp]) => {\n reverseMapping[apiOp] = sdkOp;\n });\n\n const sdkOperator = reverseMapping[filter.operator];\n if (!sdkOperator) {\n throw new Error(`Unsupported API operator: ${filter.operator}`);\n }\n\n if (!where[filter.field]) {\n where[filter.field] = {};\n }\n\n const fieldCondition = where[filter.field] as Record<string, unknown>;\n\n if (sdkOperator === '$between' && filter.values.length === 2) {\n fieldCondition[sdkOperator] = filter.values;\n } else if (\n sdkOperator === '$in' ||\n sdkOperator === '$notIn' ||\n sdkOperator === '$isOneOfArray'\n ) {\n fieldCondition[sdkOperator] = filter.values;\n } else if (\n sdkOperator === '$isNull' ||\n sdkOperator === '$isNotNull' ||\n sdkOperator === '$isEmpty'\n ) {\n fieldCondition[sdkOperator] = true;\n } else {\n fieldCondition[sdkOperator] = filter.values[0];\n }\n });\n\n return where;\n}\n\n/**\n * Validate filter values based on operator\n */\nexport function validateFilterValues(\n operator: string,\n values: unknown[]\n): boolean {\n switch (operator) {\n case FILTER_OPERATORS.BETWEEN:\n return values.length === 2;\n case FILTER_OPERATORS.IS_NULL:\n case FILTER_OPERATORS.IS_NOT_NULL:\n case FILTER_OPERATORS.IS_EMPTY:\n return values.length === 0;\n case FILTER_OPERATORS.IN:\n case FILTER_OPERATORS.NOT_IN:\n case FILTER_OPERATORS.IS_ONE_OF_ARRAY:\n return values.length > 0;\n default:\n return values.length === 1;\n }\n}\n\n/**\n * Create filter helper for building complex filter conditions\n */\nexport class FilterBuilder {\n private filters: ApiFilter[] = [];\n\n equals(field: string, value: unknown): FilterBuilder {\n this.filters.push({\n field,\n operator: FILTER_OPERATORS.EQUALS,\n values: [value],\n });\n return this;\n }\n\n notEquals(field: string, value: unknown): FilterBuilder {\n this.filters.push({\n field,\n operator: FILTER_OPERATORS.NOT_EQUALS,\n values: [value],\n });\n return this;\n }\n\n greaterThan(field: string, value: unknown): FilterBuilder {\n this.filters.push({\n field,\n operator: FILTER_OPERATORS.GREATER_THAN,\n values: [value],\n });\n return this;\n }\n\n lessThan(field: string, value: unknown): FilterBuilder {\n this.filters.push({\n field,\n operator: FILTER_OPERATORS.LESS_THAN,\n values: [value],\n });\n return this;\n }\n\n between(field: string, start: unknown, end: unknown): FilterBuilder {\n this.filters.push({\n field,\n operator: FILTER_OPERATORS.BETWEEN,\n values: [start, end],\n });\n return this;\n }\n\n in(field: string, values: unknown[]): FilterBuilder {\n this.filters.push({\n field,\n operator: FILTER_OPERATORS.IN,\n values,\n });\n return this;\n }\n\n like(field: string, value: unknown): FilterBuilder {\n this.filters.push({\n field,\n operator: FILTER_OPERATORS.LIKE,\n values: [value],\n });\n return this;\n }\n\n startsWith(field: string, value: unknown): FilterBuilder {\n this.filters.push({\n field,\n operator: FILTER_OPERATORS.STARTS_WITH,\n values: [value],\n });\n return this;\n }\n\n isEmpty(field: string): FilterBuilder {\n this.filters.push({\n field,\n operator: FILTER_OPERATORS.IS_EMPTY,\n values: [],\n });\n return this;\n }\n\n isNull(field: string): FilterBuilder {\n this.filters.push({\n field,\n operator: FILTER_OPERATORS.IS_NULL,\n values: [],\n });\n return this;\n }\n\n arrayContains(field: string, value: unknown): FilterBuilder {\n this.filters.push({\n field,\n operator: FILTER_OPERATORS.ARRAY_CONTAINS,\n values: [value],\n });\n return this;\n }\n\n build(): ApiFilter[] {\n return [...this.filters];\n }\n\n clear(): FilterBuilder {\n this.filters = [];\n return this;\n }\n}\n\n/**\n * Helper function to create a new filter builder\n */\nexport function createFilter(): FilterBuilder {\n return new FilterBuilder();\n}\n","import {\n FieldDefinition,\n TableCreateRequest,\n TableQueryOptions,\n TableRecord,\n} from '../../types/api/table';\nimport { ApiFilter, buildApiFilters } from '../../utils/filters/filter-mapper';\n\nexport interface TableCreateApiRequest {\n name: string;\n description?: string;\n fields: FieldDefinition[];\n is_ai_generated_schema?: boolean;\n is_template?: boolean;\n}\n\nexport interface TableListApiRequest {\n page?: {\n page_no: number;\n page_size: number;\n };\n sort?: Array<{\n field: string;\n direction: 'asc' | 'desc';\n }>;\n filters?: ApiFilter[];\n is_shared?: boolean;\n}\n\nexport interface TableUpdateApiRequest {\n name?: string;\n description?: string;\n is_shared?: boolean;\n}\n\nexport interface TableListApiResponse {\n data: TableRecord[];\n pagination: {\n total_count: number;\n total_pages: number;\n current_page: number;\n per_page: number;\n type: string;\n };\n}\n\n/**\n * Transform SDK table create request to API format\n */\nexport function transformTableCreateRequest(\n request: TableCreateRequest,\n options: {\n is_ai_generated_schema?: boolean;\n is_template?: boolean;\n } = {}\n): TableCreateApiRequest {\n return {\n name: request.name,\n description: request.description,\n fields: request.fields.map(transformFieldDefinition),\n is_ai_generated_schema: options.is_ai_generated_schema || false,\n is_template: options.is_template || false,\n };\n}\n\n/**\n * Transform field definition to API format\n */\nfunction transformFieldDefinition(field: FieldDefinition): FieldDefinition {\n return {\n name: field.name,\n type: field.type,\n is_nullable: field.is_nullable ?? true,\n is_primary_key: field.is_primary_key ?? false,\n is_unique: field.is_unique ?? false,\n is_indexed: field.is_indexed ?? false,\n is_visible: field.is_visible ?? true,\n is_readonly: field.is_readonly ?? false,\n field_order: field.field_order ?? 1,\n alignment: field.alignment ?? 'left',\n timezone: field.timezone ?? undefined,\n date_format: field.date_format ?? undefined,\n time_format: field.time_format ?? undefined,\n decimals: field.decimals ?? undefined,\n currency_format: field.currency_format ?? undefined,\n selection_source:\n field.type === 'dropdown' && !field.selection_source\n ? 'provide-static-list'\n : (field.selection_source ?? undefined),\n selectable_items: field.selectable_items ?? undefined,\n multiple_selections: field.multiple_selections ?? false,\n phone_format: field.phone_format ?? undefined,\n vector_dimension: field.vector_dimension ?? undefined,\n description: field.description,\n default_value: field.default_value,\n };\n}\n\n/**\n * Transform SDK table query options to API list request\n */\nexport function transformTableListRequest(\n options: TableQueryOptions & {\n page?: number;\n pageSize?: number;\n isShared?: boolean;\n } = {}\n): TableListApiRequest {\n const request: TableListApiRequest = {};\n\n // Add pagination\n if (options.page !== undefined || options.pageSize !== undefined) {\n request.page = {\n page_no: options.page ?? 1,\n page_size: options.pageSize ?? options.limit ?? 1000,\n };\n } else if (options.limit !== undefined) {\n request.page = {\n page_no: Math.floor((options.offset ?? 0) / options.limit) + 1,\n page_size: options.limit,\n };\n }\n\n // Add sorting\n if (options.sort?.length) {\n request.sort = options.sort.map((s) => ({\n field: s.field as string,\n direction: s.order,\n }));\n }\n\n // Add filters\n if (options.where) {\n const { filters } = buildApiFilters(options.where);\n request.filters = filters;\n }\n\n // Add shared filter\n if (options.isShared !== undefined) {\n request.is_shared = options.isShared;\n }\n\n return request;\n}\n\n/**\n * Transform SDK table update request to API format\n */\nexport function transformTableUpdateRequest(updates: {\n name?: string;\n description?: string;\n is_shared?: boolean;\n}): TableUpdateApiRequest {\n const request: TableUpdateApiRequest = {};\n\n if (updates.name !== undefined) {\n request.name = updates.name;\n }\n\n if (updates.description !== undefined) {\n request.description = updates.description;\n }\n\n if (updates.is_shared !== undefined) {\n request.is_shared = updates.is_shared;\n }\n\n return request;\n}\n\n/**\n * Transform API table list response to SDK format\n */\nexport function transformTableListResponse(response: TableListApiResponse): {\n tables: TableRecord[];\n pagination: {\n total_count: number;\n total_pages: number;\n current_page: number;\n per_page: number;\n type: string;\n };\n} {\n return {\n tables: response.data,\n pagination: {\n total_count: response.pagination?.total_count,\n total_pages: response.pagination?.total_pages,\n current_page: response.pagination?.current_page,\n per_page: response.pagination?.per_page,\n type: response.pagination?.type,\n },\n };\n}\n","import {\n TableCreateRequest,\n TableCreateResponse,\n TableQueryOptions,\n TableRecord,\n} from '../../types/api/table';\nimport type { Environment, Region } from '../../types/config/environment';\nimport { REGION_CONFIGS } from '../../types/config/environment';\nimport { filterArrayFields, filterObjectFields } from '../../utils/common';\nimport { createHttpAdapter } from '../../utils/http';\nimport { HttpAdapter } from '../../utils/http/adapter';\nimport { buildEndpointPath, TABLE_ENDPOINTS } from '../endpoints/tables';\nimport { transformTableCreateRequest } from '../transformers/tables';\n\nexport interface TablesApiClientConfig {\n apiKey: string;\n environment?: Environment;\n region?: Region;\n timeout?: number;\n debug?: boolean;\n retryAttempts?: number;\n retryDelay?: number;\n headers?: Record<string, string>;\n}\n\nexport interface TableCreateOptions {\n is_ai_generated_schema?: boolean;\n is_template?: boolean;\n}\n\nexport interface TableListOptions extends TableQueryOptions {\n page?: number;\n pageSize?: number;\n isShared?: boolean;\n}\n\n// Boltic API Response Structure interfaces\ninterface BolticSuccessResponse<T = unknown> {\n data: T;\n message?: string;\n}\n\ninterface BolticListResponse<T = unknown> {\n data: T[];\n pagination?: {\n total_count: number;\n total_pages: number;\n current_page: number;\n per_page: number;\n type: string;\n };\n message?: string;\n}\n\ninterface BolticErrorResponse {\n data?: never;\n error: {\n code?: string;\n message?: string;\n meta?: string[];\n };\n}\n\n/**\n * Tables API Client - handles all table-related API operations\n */\nexport class TablesApiClient {\n private httpAdapter: HttpAdapter;\n private config: TablesApiClientConfig;\n private baseURL: string;\n\n constructor(\n apiKey: string,\n config: Omit<TablesApiClientConfig, 'apiKey'> = {}\n ) {\n this.config = { apiKey, ...config };\n this.httpAdapter = createHttpAdapter();\n\n // Set baseURL based on environment and region\n const environment = config.environment || 'prod';\n const region = config.region || 'asia-south1'; // Default to asia-south1 for legacy support\n this.baseURL = this.getBaseURL(environment, region);\n }\n\n private getBaseURL(environment: Environment, region: Region): string {\n const regionConfig = REGION_CONFIGS[region];\n if (!regionConfig) {\n throw new Error(`Unsupported region: ${region}`);\n }\n\n const envConfig = regionConfig[environment];\n if (!envConfig) {\n throw new Error(\n `Unsupported environment: ${environment} for region: ${region}`\n );\n }\n\n return `${envConfig.baseURL}/v1`;\n }\n\n /**\n * Create a new table\n */\n async createTable(\n request: TableCreateRequest,\n options: TableCreateOptions = {}\n ): Promise<BolticSuccessResponse<TableCreateResponse> | BolticErrorResponse> {\n try {\n const endpoint = TABLE_ENDPOINTS.create;\n const url = `${this.baseURL}${endpoint.path}`;\n\n // Transform the request to ensure proper formatting (e.g., selection_source for dropdowns)\n const transformedRequest = transformTableCreateRequest(request, options);\n\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n data: transformedRequest,\n timeout: this.config.timeout,\n });\n\n // Note: TableCreateResponse only contains id and message, so field filtering is not applicable\n // Return raw response without transformation\n return response.data as BolticSuccessResponse<TableCreateResponse>;\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n /**\n * List tables with filtering and pagination\n */\n async listTables(\n options: TableListOptions = {}\n ): Promise<BolticListResponse<TableRecord> | BolticErrorResponse> {\n try {\n const endpoint = TABLE_ENDPOINTS.list;\n const url = `${this.baseURL}${endpoint.path}`;\n\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n data: options,\n timeout: this.config.timeout,\n });\n\n // Apply field filtering if fields are specified\n const responseData = response.data as BolticListResponse<TableRecord>;\n if (options.fields && responseData.data) {\n responseData.data = filterArrayFields(\n responseData.data as unknown as Record<string, unknown>[],\n options.fields\n ) as unknown as TableRecord[];\n }\n\n return responseData;\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n /**\n * Get a specific table by ID\n */\n async getTable(\n tableId: string,\n options: { fields?: Array<keyof TableRecord> } = {}\n ): Promise<BolticSuccessResponse<TableRecord> | BolticErrorResponse> {\n try {\n const endpoint = TABLE_ENDPOINTS.get;\n const url = `${this.baseURL}${buildEndpointPath(endpoint, { table_id: tableId })}`;\n\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n timeout: this.config.timeout,\n });\n\n // Apply field filtering if fields are specified\n const responseData = response.data as BolticSuccessResponse<TableRecord>;\n if (options.fields && responseData.data) {\n responseData.data = filterObjectFields(\n responseData.data as unknown as Record<string, unknown>,\n options.fields as string[]\n ) as unknown as TableRecord;\n }\n\n return responseData;\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n /**\n * Update an existing table\n */\n async updateTable(\n tableId: string,\n updates: {\n name?: string;\n description?: string;\n is_shared?: boolean;\n fields?: Array<keyof TableRecord>;\n }\n ): Promise<BolticSuccessResponse<TableRecord> | BolticErrorResponse> {\n try {\n const { fields, ...updateData } = updates;\n const endpoint = TABLE_ENDPOINTS.update;\n const url = `${this.baseURL}${buildEndpointPath(endpoint, { table_id: tableId })}`;\n\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n data: updateData,\n timeout: this.config.timeout,\n });\n\n // Apply field filtering if fields are specified\n const responseData = response.data as BolticSuccessResponse<TableRecord>;\n if (fields && responseData.data) {\n responseData.data = filterObjectFields(\n responseData.data as unknown as Record<string, unknown>,\n fields as string[]\n ) as unknown as TableRecord;\n }\n\n return responseData;\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n /**\n * Delete a table\n */\n async deleteTable(\n tableId: string\n ): Promise<BolticSuccessResponse<{ message: string }> | BolticErrorResponse> {\n try {\n const endpoint = TABLE_ENDPOINTS.delete;\n const url = `${this.baseURL}${buildEndpointPath(endpoint, { table_id: tableId })}`;\n\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n timeout: this.config.timeout,\n });\n\n // Return raw response without transformation\n return response.data as BolticSuccessResponse<{ message: string }>;\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n // Private helper methods\n\n private buildHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'x-boltic-token': this.config.apiKey,\n };\n }\n\n private formatErrorResponse(error: unknown): BolticErrorResponse {\n if (this.config.debug) {\n console.error('Tables API Error:', error);\n }\n\n // Handle different error types following Boltic format\n if (error && typeof error === 'object' && 'response' in error) {\n const apiError = error as {\n response?: {\n data?: BolticErrorResponse;\n status?: number;\n };\n };\n\n // If API already returned Boltic format, use it\n if (apiError.response?.data?.error) {\n return apiError.response.data;\n }\n\n // Otherwise format it to Boltic structure\n return {\n error: {\n code: 'API_ERROR',\n message: (error as unknown as Error).message || 'Unknown API error',\n meta: [`Status: ${apiError.response?.status || 'unknown'}`],\n },\n };\n }\n\n if (error && typeof error === 'object' && 'message' in error) {\n return {\n error: {\n code: 'CLIENT_ERROR',\n message: (error as Error).message,\n meta: ['Client-side error occurred'],\n },\n };\n }\n\n return {\n error: {\n code: 'UNKNOWN_ERROR',\n message: 'An unexpected error occurred',\n meta: ['Unknown error type'],\n },\n };\n }\n}\n","import { PaginationInfo } from './operations';\n\n// Boltic API Response Structure\nexport interface BolticSuccessResponse<T> {\n data: T;\n message?: string;\n error?: {\n code?: string;\n message?: string;\n meta?: string[];\n };\n}\n\nexport interface BolticListResponse<T> {\n data: T[];\n pagination?: {\n total_count: number;\n total_pages: number;\n current_page: number;\n per_page: number;\n type: string;\n };\n message?: string;\n error?: {\n code?: string;\n message?: string;\n meta?: string[];\n };\n}\n\nexport interface BolticErrorResponse {\n data?: never;\n message?: string;\n error: {\n code?: string;\n message?: string;\n meta?: string[];\n };\n}\n\n// Union type for all possible responses\nexport type ApiResponse<T> =\n | BolticSuccessResponse<T>\n | BolticListResponse<T>\n | BolticErrorResponse;\n\n// Helper type to check if response is an error\nexport function isErrorResponse<T>(\n response: ApiResponse<T>\n): response is BolticErrorResponse {\n return 'error' in response && response.error !== undefined;\n}\n\n// Helper type to check if response is a list response\nexport function isListResponse<T>(\n response: ApiResponse<T>\n): response is BolticListResponse<T> {\n return 'pagination' in response;\n}\n\n// Legacy interfaces for backwards compatibility (to be deprecated)\nexport interface SuccessResponse<T> {\n data: T;\n error?: never;\n pagination?: PaginationInfo;\n}\n\nexport interface ErrorResponse {\n data?: never;\n error: string;\n details?: unknown;\n code?: string;\n}\n\nexport interface BulkResponse<T> {\n success: T[];\n failed: Array<{\n item: unknown;\n error: string;\n }>;\n summary: {\n total: number;\n successful: number;\n failed: number;\n };\n}\n\nexport interface QueryOptions {\n fields?: string[];\n sort?: Array<{ field: string; order: 'asc' | 'desc' }>;\n limit?: number;\n offset?: number;\n where?: Record<string, unknown>;\n}\n","import { formatError } from '../../errors';\nimport { ApiResponse, QueryOptions } from '../../types/common/responses';\nimport { HttpResponse } from '../../utils/http/adapter';\nimport { BaseClient } from './base-client';\n\nexport abstract class BaseResource {\n protected client: BaseClient;\n protected basePath: string;\n\n constructor(client: BaseClient, basePath: string) {\n this.client = client;\n this.basePath = basePath;\n }\n\n // Public getter for basePath\n getBasePath(): string {\n return this.basePath;\n }\n\n protected async makeRequest<T>(\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE',\n path: string,\n data?: unknown,\n options?: { params?: Record<string, unknown> }\n ): Promise<ApiResponse<T>> {\n const url = `${this.basePath}${path}`;\n\n try {\n let response: HttpResponse<ApiResponse<T>>;\n\n switch (method) {\n case 'GET':\n response = await this.client.get<ApiResponse<T>>(url, {\n params: options?.params,\n });\n break;\n case 'POST':\n response = await this.client.post<ApiResponse<T>>(url, data, {\n params: options?.params,\n });\n break;\n case 'PUT':\n response = await this.client.put<ApiResponse<T>>(url, data, {\n params: options?.params,\n });\n break;\n case 'PATCH':\n response = await this.client.patch<ApiResponse<T>>(url, data, {\n params: options?.params,\n });\n break;\n case 'DELETE':\n response = await this.client.delete<ApiResponse<T>>(url, {\n params: options?.params,\n });\n break;\n }\n\n return response.data;\n } catch (error) {\n // Return error response in Boltic format\n return {\n error: {\n code: 'CLIENT_ERROR',\n message: formatError(error),\n meta: ['Request failed'],\n },\n };\n }\n }\n\n protected buildQueryParams(\n options: QueryOptions = {}\n ): Record<string, unknown> {\n const params: Record<string, unknown> = {};\n\n if (options.fields?.length) {\n params.fields = options.fields.join(',');\n }\n\n if (options.sort?.length) {\n params.sort = options.sort.map((s) => `${s.field}:${s.order}`).join(',');\n }\n\n if (options.limit !== undefined) {\n params.limit = options.limit;\n }\n\n if (options.offset !== undefined) {\n params.offset = options.offset;\n }\n\n if (options.where) {\n // Convert where conditions to query parameters\n Object.entries(options.where).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n params[`where[${key}]`] =\n typeof value === 'object' ? JSON.stringify(value) : value;\n }\n });\n }\n\n return params;\n }\n\n protected handleResponse<T>(response: ApiResponse<T>): ApiResponse<T> {\n if ('error' in response) {\n // Log error if debug mode is on\n if (this.client.getConfig().debug) {\n // eslint-disable-next-line no-console\n console.error('API Error:', response.error);\n }\n }\n return response;\n }\n}\n","import { TablesApiClient } from '../../api/clients/tables-api-client';\nimport { ApiError, ValidationError } from '../../errors';\nimport {\n FieldDefinition,\n TableCreateRequest,\n TableCreateResponse,\n TableQueryOptions,\n TableRecord,\n TableUpdateRequest,\n} from '../../types/api/table';\nimport {\n ApiResponse,\n BolticSuccessResponse,\n isErrorResponse,\n isListResponse,\n} from '../../types/common/responses';\nimport { BaseClient } from '../core/base-client';\nimport { BaseResource } from '../core/base-resource';\n\nexport class TableResource extends BaseResource {\n private tablesApiClient: TablesApiClient;\n\n constructor(client: BaseClient) {\n super(client, '/v1/tables');\n\n // Initialize the API client\n const config = client.getConfig();\n this.tablesApiClient = new TablesApiClient(config.apiKey, {\n environment: config.environment,\n region: config.region,\n timeout: config.timeout,\n debug: config.debug,\n retryAttempts: config.retryAttempts,\n retryDelay: config.retryDelay,\n headers: config.headers,\n });\n }\n\n /**\n * Create a new table\n */\n async create(\n data: TableCreateRequest\n ): Promise<BolticSuccessResponse<TableCreateResponse>> {\n try {\n // Process fields with defaults if any are provided\n const processedData = { ...data };\n if (data.fields && data.fields.length > 0) {\n processedData.fields = await this.processFieldsDefaults(data.fields);\n }\n\n const result = await this.tablesApiClient.createTable(processedData);\n\n if (isErrorResponse(result)) {\n throw new ApiError(\n result.error.message || 'Create table failed',\n 400,\n result.error\n );\n }\n\n return result as BolticSuccessResponse<TableCreateResponse>;\n } catch (error) {\n throw error instanceof ApiError\n ? error\n : new ApiError(this.formatError(error), 500);\n }\n }\n\n /**\n * Process fields with defaults for table creation\n */\n private async processFieldsDefaults(\n fields: FieldDefinition[]\n ): Promise<FieldDefinition[]> {\n const processedFields: FieldDefinition[] = [];\n\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n const processedField: FieldDefinition = { ...field };\n\n // Set default values for optional fields if not provided\n if (processedField.is_primary_key === undefined) {\n processedField.is_primary_key = false;\n }\n if (processedField.is_unique === undefined) {\n processedField.is_unique = false;\n }\n if (processedField.is_nullable === undefined) {\n processedField.is_nullable = true;\n }\n if (processedField.is_indexed === undefined) {\n processedField.is_indexed = false;\n }\n\n // Auto-generate field_order if not provided (sequential for table creation)\n if (processedField.field_order === undefined) {\n processedField.field_order = i + 1;\n }\n\n // Validate field_order is within acceptable range\n if (\n processedField.field_order <= 0 ||\n processedField.field_order >= 2147483647\n ) {\n throw new Error(\n 'Field order must be a number greater than 0 and less than 2147483647'\n );\n }\n\n processedFields.push(processedField);\n }\n\n return processedFields;\n }\n\n /**\n * Transform SDK TableQueryOptions to API request format\n */\n private transformTableQueryToApiRequest(options: TableQueryOptions): unknown {\n const apiRequest: {\n page: { page_no: number; page_size: number };\n filters: Array<{ field: string; operator: string; values: unknown[] }>;\n sort: Array<{ field: string; direction: string }>;\n } = {\n page: {\n page_no: 1,\n page_size: options.limit || 100,\n },\n filters: [],\n sort: [],\n };\n\n // Handle pagination\n if (options.offset && options.limit) {\n const pageNo = Math.floor(options.offset / options.limit) + 1;\n apiRequest.page.page_no = pageNo;\n }\n\n // Transform where clause to filters\n if (options.where) {\n Object.entries(options.where).forEach(([field, value]) => {\n if (value !== undefined && value !== null) {\n apiRequest.filters.push({\n field,\n operator: '=',\n values: [value],\n });\n }\n });\n }\n\n // Transform sort\n if (options.sort) {\n apiRequest.sort = options.sort.map((s) => ({\n field: s.field,\n direction: s.order,\n }));\n }\n\n return apiRequest;\n }\n\n /**\n * Find all tables with optional filtering\n */\n async findAll(\n options: TableQueryOptions = {}\n ): Promise<ApiResponse<TableRecord>> {\n try {\n // Transform SDK format to API format\n const apiRequest = this.transformTableQueryToApiRequest(options);\n\n const result = await this.tablesApiClient.listTables(\n apiRequest as unknown as TableQueryOptions\n );\n\n if (isErrorResponse(result)) {\n throw new ApiError(\n result.error.message || 'List tables failed',\n 400,\n result.error\n );\n }\n\n return result;\n } catch (error) {\n throw error instanceof ApiError\n ? error\n : new ApiError(this.formatError(error), 500);\n }\n }\n\n /**\n * Find a single table by ID or name\n */\n async findOne(\n options: TableQueryOptions\n ): Promise<\n | BolticSuccessResponse<TableRecord | null>\n | import('../../types/common/responses').BolticErrorResponse\n > {\n try {\n if (!options.where?.id && !options.where?.name) {\n throw new ValidationError(\n 'Either id or name must be provided in where clause'\n );\n }\n\n if (options.where?.id) {\n // Find by ID\n const result = await this.tablesApiClient.getTable(\n options.where.id as string\n );\n\n if (isErrorResponse(result)) {\n if (result.error.code === 'TABLE_NOT_FOUND') {\n return {\n data: null,\n message: 'Table not found',\n };\n }\n throw new ApiError(\n result.error.message || 'Get table failed',\n 400,\n result.error\n );\n }\n\n return result as BolticSuccessResponse<TableRecord>;\n } else {\n // Find by name - transform to API format\n const apiRequest = {\n page: { page_no: 1, page_size: 1 },\n filters: [\n {\n field: 'name',\n operator: '=',\n values: [options.where!.name],\n },\n ],\n sort: [],\n };\n\n const listResult = await this.tablesApiClient.listTables(\n apiRequest as unknown as TableQueryOptions\n );\n\n if (isErrorResponse(listResult)) {\n throw new ApiError(\n listResult.error.message || 'Find table by name failed',\n 400,\n listResult.error\n );\n }\n\n const table = isListResponse(listResult)\n ? (listResult.data[0] as TableRecord)\n : null;\n return {\n data: table || null,\n message: table ? 'Table found' : 'Table not found',\n };\n }\n } catch (error) {\n throw error instanceof ApiError || error instanceof ValidationError\n ? error\n : new ApiError(this.formatError(error), 500);\n }\n }\n\n /**\n * Find a single table by name\n */\n async findByName(\n name: string\n ): Promise<\n | BolticSuccessResponse<TableRecord | null>\n | import('../../types/common/responses').BolticErrorResponse\n > {\n return this.findOne({ where: { name } });\n }\n\n /**\n * Find a single table by ID\n */\n async findById(\n id: string\n ): Promise<\n | BolticSuccessResponse<TableRecord | null>\n | import('../../types/common/responses').BolticErrorResponse\n > {\n return this.findOne({ where: { id } });\n }\n\n /**\n * Update a table by name\n */\n async update(\n name: string,\n data: TableUpdateRequest\n ): Promise<\n | BolticSuccessResponse<TableRecord>\n | import('../../types/common/responses').BolticErrorResponse\n > {\n try {\n // First find the table to get its ID\n const tableResult = await this.findByName(name);\n\n if (!tableResult.data) {\n throw new ApiError(`Table '${name}' not found`, 404);\n }\n\n // Check if the table is a snapshot and prevent updates\n if (tableResult.data.snapshot_url) {\n throw new ApiError(\n `Cannot update snapshot table '${name}'. Snapshots are read-only and cannot be modified.`,\n 400\n );\n }\n\n const result = await this.tablesApiClient.updateTable(\n tableResult.data.id,\n data\n );\n\n if (isErrorResponse(result)) {\n throw new ApiError(\n result.error.message || 'Update table failed',\n 400,\n result.error\n );\n }\n\n return result as BolticSuccessResponse<TableRecord>;\n } catch (error) {\n throw error instanceof ApiError\n ? error\n : new ApiError(this.formatError(error), 500);\n }\n }\n\n /**\n * Delete a table by name\n */\n async delete(\n name: string\n ): Promise<\n | BolticSuccessResponse<{ message: string }>\n | import('../../types/common/responses').BolticErrorResponse\n > {\n try {\n // First find the table to get its ID\n const tableResult = await this.findByName(name);\n\n if (!tableResult.data) {\n throw new ApiError(`Table '${name}' not found`, 404);\n }\n\n // Check if the table is a snapshot and prevent deletion\n if (tableResult.data.snapshot_url) {\n throw new ApiError(\n `Cannot delete snapshot table '${name}'. Snapshots are read-only and cannot be deleted.`,\n 400\n );\n }\n\n const result = await this.tablesApiClient.deleteTable(\n tableResult.data.id\n );\n\n if (isErrorResponse(result)) {\n throw new ApiError(\n result.error.message || 'Delete table failed',\n 400,\n result.error\n );\n }\n\n return result as BolticSuccessResponse<{ message: string }>;\n } catch (error) {\n throw error instanceof ApiError\n ? error\n : new ApiError(this.formatError(error), 500);\n }\n }\n\n /**\n * Rename a table\n */\n async rename(\n oldName: string,\n newName: string\n ): Promise<BolticSuccessResponse<TableRecord>> {\n try {\n const result = await this.update(oldName, {\n name: newName,\n });\n // update throws on error, so cast to success\n return result as BolticSuccessResponse<TableRecord>;\n } catch (error) {\n throw error instanceof ApiError\n ? error\n : new ApiError(this.formatError(error), 500);\n }\n }\n\n /**\n * Set table access permissions\n */\n async setAccess(request: {\n table_name: string;\n is_shared: boolean;\n }): Promise<BolticSuccessResponse<TableRecord>> {\n try {\n // Update the table with the new access settings\n const result = await this.update(request.table_name, {\n is_shared: request.is_shared,\n });\n // update throws on error, so cast to success\n return result as BolticSuccessResponse<TableRecord>;\n } catch (error) {\n throw error instanceof ApiError\n ? error\n : new ApiError(this.formatError(error), 500);\n }\n }\n\n // Helper method to format generic errors\n private formatError(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === 'string') {\n return error;\n }\n return 'An unexpected error occurred';\n }\n}\n","import { ColumnsApiClient } from '../../api/clients/columns-api-client';\nimport { TablesApiClient } from '../../api/clients/tables-api-client';\nimport {\n ColumnDetails,\n ColumnQueryOptions,\n ColumnRecord,\n ColumnUpdateRequest,\n} from '../../types/api/column';\nimport { FieldDefinition } from '../../types/api/table';\nimport {\n BolticErrorResponse,\n BolticListResponse,\n BolticSuccessResponse,\n isErrorResponse,\n} from '../../types/common/responses';\nimport { BaseClient } from '../core/base-client';\nimport { BaseResource } from '../core/base-resource';\nimport { TableResource } from './table';\n\nexport class ColumnResource extends BaseResource {\n private columnsApiClient: ColumnsApiClient;\n private tablesApiClient: TablesApiClient;\n\n constructor(client: BaseClient) {\n super(client, '/v1/tables');\n\n // Initialize the API clients\n const config = client.getConfig();\n this.columnsApiClient = new ColumnsApiClient(config.apiKey, {\n environment: config.environment,\n region: config.region,\n timeout: config.timeout,\n debug: config.debug,\n retryAttempts: config.retryAttempts,\n retryDelay: config.retryDelay,\n headers: config.headers,\n });\n\n this.tablesApiClient = new TablesApiClient(config.apiKey, {\n environment: config.environment,\n region: config.region,\n timeout: config.timeout,\n debug: config.debug,\n retryAttempts: config.retryAttempts,\n retryDelay: config.retryDelay,\n headers: config.headers,\n });\n }\n\n /**\n * Create a single column in a table\n */\n async create(\n tableName: string,\n column: FieldDefinition\n ): Promise<BolticSuccessResponse<ColumnRecord> | BolticErrorResponse> {\n try {\n // Get table information first\n const tableInfo = await this.getTableInfo(tableName);\n if (!tableInfo) {\n return {\n error: {\n code: 'TABLE_NOT_FOUND',\n message: `Table '${tableName}' not found`,\n },\n };\n }\n\n // Apply defaults and auto-generate field_order\n const processedColumn = await this.processColumnDefaults(\n tableInfo.id,\n column\n );\n\n const result = await this.columnsApiClient.createColumn(\n tableInfo.id,\n processedColumn\n );\n\n if (isErrorResponse(result)) {\n return result;\n }\n\n return result as BolticSuccessResponse<ColumnRecord>;\n } catch (error) {\n return {\n error: {\n code: 'CREATE_COLUMN_ERROR',\n message:\n error instanceof Error ? error.message : 'Unknown error occurred',\n },\n };\n }\n }\n\n /**\n * Process column defaults and auto-generate field_order\n */\n private async processColumnDefaults(\n tableId: string,\n column: FieldDefinition\n ): Promise<FieldDefinition> {\n const processedColumn: FieldDefinition = { ...column };\n\n // Set default values for optional fields if not provided\n if (processedColumn.is_primary_key === undefined) {\n processedColumn.is_primary_key = false;\n }\n if (processedColumn.is_unique === undefined) {\n processedColumn.is_unique = false;\n }\n if (processedColumn.is_nullable === undefined) {\n processedColumn.is_nullable = true;\n }\n if (processedColumn.is_indexed === undefined) {\n processedColumn.is_indexed = false;\n }\n\n // Auto-generate field_order if not provided\n if (processedColumn.field_order === undefined) {\n processedColumn.field_order = await this.generateFieldOrder(tableId);\n }\n\n // Validate field_order is within acceptable range\n if (\n processedColumn.field_order <= 0 ||\n processedColumn.field_order >= 2147483647\n ) {\n throw new Error(\n 'Field order must be a number greater than 0 and less than 2147483647'\n );\n }\n\n return processedColumn;\n }\n\n /**\n * Generate the next available field_order for a table\n */\n private async generateFieldOrder(tableId: string): Promise<number> {\n try {\n // Get existing columns to find the highest field_order\n const existingColumns = await this.columnsApiClient.listColumns(tableId);\n\n let maxOrder = 0;\n if (\n !isErrorResponse(existingColumns) &&\n existingColumns.data &&\n Array.isArray(existingColumns.data)\n ) {\n for (const col of existingColumns.data) {\n if (col.field_order && col.field_order > maxOrder) {\n maxOrder = col.field_order;\n }\n }\n }\n\n // Return next available number (starting from 1 if no columns exist)\n return maxOrder + 1;\n } catch (error) {\n // Fallback to timestamp-based order if there's an error\n return Math.floor(Date.now() / 1000) % 2147483647;\n }\n }\n\n /**\n * Transform SDK ColumnQueryOptions to API request format\n */\n private transformColumnQueryToApiRequest(\n options: ColumnQueryOptions\n ): unknown {\n const apiRequest: {\n page: { page_no: number; page_size: number };\n filters: Array<{ field: string; operator: string; values: unknown[] }>;\n sort: Array<{ field: string; direction: string }>;\n } = {\n page: {\n page_no: 1,\n page_size: options.limit || 100,\n },\n filters: [],\n sort: [],\n };\n\n // Handle pagination\n if (options.offset && options.limit) {\n const pageNo = Math.floor(options.offset / options.limit) + 1;\n apiRequest.page.page_no = pageNo;\n }\n\n // Transform where clause to filters\n if (options.where) {\n Object.entries(options.where).forEach(([field, value]) => {\n if (value !== undefined && value !== null) {\n apiRequest.filters.push({\n field,\n operator: '=',\n values: [value],\n });\n }\n });\n }\n\n // Transform sort\n if (options.sort) {\n apiRequest.sort = options.sort.map((s) => ({\n field: s.field,\n direction: s.order,\n }));\n }\n\n return apiRequest;\n }\n\n /**\n * Add multiple columns to existing table\n */\n async createMany(\n tableName: string,\n columns: FieldDefinition[]\n ): Promise<BolticListResponse<ColumnRecord> | BolticErrorResponse> {\n try {\n // Get table information first\n const tableInfo = await this.getTableInfo(tableName);\n if (!tableInfo) {\n return {\n error: {\n code: 'TABLE_NOT_FOUND',\n message: `Table '${tableName}' not found`,\n },\n };\n }\n\n // Process all columns with defaults and auto-generate field_order\n const processedColumns: FieldDefinition[] = [];\n for (const column of columns) {\n const processedColumn = await this.processColumnDefaults(\n tableInfo.id,\n column\n );\n processedColumns.push(processedColumn);\n }\n\n const result = await this.columnsApiClient.createColumns(tableInfo.id, {\n columns: processedColumns,\n });\n\n if (isErrorResponse(result)) {\n return result;\n }\n\n return result as BolticListResponse<ColumnRecord>;\n } catch (error) {\n return {\n error: {\n code: 'CREATE_COLUMNS_ERROR',\n message:\n error instanceof Error ? error.message : 'Unknown error occurred',\n },\n };\n }\n }\n\n /**\n * Find all columns in a table (replaces list functionality)\n */\n async findAll(\n tableName: string,\n options: ColumnQueryOptions = {}\n ): Promise<BolticListResponse<ColumnDetails> | BolticErrorResponse> {\n try {\n // Get table information first\n const tableInfo = await this.getTableInfo(tableName);\n if (!tableInfo) {\n return {\n error: {\n code: 'TABLE_NOT_FOUND',\n message: `Table '${tableName}' not found`,\n },\n };\n }\n\n // Transform SDK format to API format\n const apiRequest = this.transformColumnQueryToApiRequest(options);\n\n const result = await this.columnsApiClient.listColumns(\n tableInfo.id,\n apiRequest as unknown as ColumnQueryOptions\n );\n\n if (isErrorResponse(result)) {\n return result;\n }\n\n return result as BolticListResponse<ColumnDetails>;\n } catch (error) {\n return {\n error: {\n code: 'LIST_COLUMNS_ERROR',\n message:\n error instanceof Error ? error.message : 'Unknown error occurred',\n },\n };\n }\n }\n\n /**\n * Get a single column by name\n */\n async get(\n tableName: string,\n columnName: string\n ): Promise<BolticSuccessResponse<ColumnDetails> | BolticErrorResponse> {\n try {\n // Get table information first\n const tableInfo = await this.getTableInfo(tableName);\n if (!tableInfo) {\n return {\n error: {\n code: 'TABLE_NOT_FOUND',\n message: `Table '${tableName}' not found`,\n },\n };\n }\n\n const result = await this.columnsApiClient.findColumnByName(\n tableInfo.id,\n columnName\n );\n\n if (isErrorResponse(result)) {\n return result;\n }\n\n if (!result.data) {\n return {\n error: {\n code: 'COLUMN_NOT_FOUND',\n message: `Column '${columnName}' not found in table '${tableName}'`,\n },\n };\n }\n\n return {\n data: result.data as ColumnDetails,\n message: 'Column found successfully',\n };\n } catch (error) {\n return {\n error: {\n code: 'GET_COLUMN_ERROR',\n message:\n error instanceof Error ? error.message : 'Unknown error occurred',\n },\n };\n }\n }\n\n async findById(\n tableName: string,\n columnId: string\n ): Promise<BolticSuccessResponse<ColumnDetails> | BolticErrorResponse> {\n try {\n // Get table information first\n const tableInfo = await this.getTableInfo(tableName);\n if (!tableInfo) {\n return {\n error: {\n code: 'TABLE_NOT_FOUND',\n message: `Table '${tableName}' not found`,\n },\n };\n }\n\n // Use the direct getColumn API method\n const result = await this.columnsApiClient.getColumn(\n tableInfo.id,\n columnId\n );\n\n if (isErrorResponse(result)) {\n return result;\n }\n\n return result as BolticSuccessResponse<ColumnDetails>;\n } catch (error) {\n return {\n error: {\n code: 'FIND_COLUMN_BY_ID_ERROR',\n message:\n error instanceof Error ? error.message : 'Unknown error occurred',\n },\n };\n }\n }\n\n /**\n * Update a column by name\n */\n async update(\n tableName: string,\n columnName: string,\n updates: ColumnUpdateRequest\n ): Promise<BolticSuccessResponse<ColumnDetails> | BolticErrorResponse> {\n try {\n // Get table information first\n const tableInfo = await this.getTableInfo(tableName);\n if (!tableInfo) {\n return {\n error: {\n code: 'TABLE_NOT_FOUND',\n message: `Table '${tableName}' not found`,\n },\n };\n }\n\n const result = await this.columnsApiClient.updateColumnByName(\n tableInfo.id,\n columnName,\n updates\n );\n\n if (isErrorResponse(result)) {\n return result;\n }\n\n return result as BolticSuccessResponse<ColumnDetails>;\n } catch (error) {\n return {\n error: {\n code: 'UPDATE_COLUMN_ERROR',\n message:\n error instanceof Error ? error.message : 'Unknown error occurred',\n },\n };\n }\n }\n\n /**\n * Delete a column by name\n */\n async delete(\n tableName: string,\n columnName: string\n ): Promise<\n | BolticSuccessResponse<{ success: boolean; message?: string }>\n | BolticErrorResponse\n > {\n try {\n // Get table information first\n const tableInfo = await this.getTableInfo(tableName);\n if (!tableInfo) {\n return {\n error: {\n code: 'TABLE_NOT_FOUND',\n message: `Table '${tableName}' not found`,\n },\n };\n }\n\n const result = await this.columnsApiClient.deleteColumnByName(\n tableInfo.id,\n columnName\n );\n\n if (isErrorResponse(result)) {\n return result;\n }\n\n return {\n data: {\n success: true,\n message: 'Column deleted successfully',\n },\n };\n } catch (error) {\n return {\n error: {\n code: 'DELETE_COLUMN_ERROR',\n message:\n error instanceof Error ? error.message : 'Unknown error occurred',\n },\n };\n }\n }\n\n /**\n * Helper method to get table information by name\n */\n private async getTableInfo(\n tableName: string\n ): Promise<{ id: string; snapshot_url?: string } | null> {\n try {\n // Use the table resource to find the table by name\n const tableResource = new TableResource(this.client);\n const tableResult = await tableResource.findByName(tableName);\n\n if (tableResult.data) {\n return {\n id: tableResult.data.id,\n snapshot_url: tableResult.data.snapshot_url,\n };\n }\n\n return null;\n } catch (error) {\n console.error('Error getting table info:', error);\n return null;\n }\n }\n\n /**\n * Helper method to get table ID by name (deprecated, use getTableInfo instead)\n */\n private async getTableId(tableName: string): Promise<string | null> {\n const tableInfo = await this.getTableInfo(tableName);\n return tableInfo?.id || null;\n }\n}\n","export interface IndexApiEndpoint {\n path: string;\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n authenticated: boolean;\n rateLimit?: {\n requests: number;\n window: number;\n };\n}\n\nexport interface IndexEndpoints {\n create: IndexApiEndpoint;\n list: IndexApiEndpoint;\n delete: IndexApiEndpoint;\n}\n\nexport const INDEX_ENDPOINTS: IndexEndpoints = {\n create: {\n path: '/tables/indexes/{table_id}',\n method: 'POST',\n authenticated: true,\n },\n list: {\n path: '/tables/indexes/{table_id}/list',\n method: 'POST',\n authenticated: true,\n },\n delete: {\n path: '/tables/indexes/{table_id}',\n method: 'DELETE',\n authenticated: true,\n },\n};\n\nexport const buildIndexEndpointPath = (\n endpoint: IndexApiEndpoint,\n params: Record<string, string> = {}\n): string => {\n let path = endpoint.path;\n\n Object.entries(params).forEach(([key, value]) => {\n path = path.replace(`{${key}}`, encodeURIComponent(value));\n });\n\n const unreplacedParams = path.match(/\\{([^}]+)\\}/g);\n if (unreplacedParams) {\n throw new Error(`Missing path parameters: ${unreplacedParams.join(', ')}`);\n }\n\n return path;\n};\n","import {\n AddIndexRequest,\n AddIndexResponse,\n DeleteIndexRequest,\n DeleteIndexResponse,\n ListIndexesQuery,\n ListIndexesResponse,\n} from '../../types/api/index';\nimport type { Environment, Region } from '../../types/config/environment';\nimport { REGION_CONFIGS } from '../../types/config/environment';\nimport { createHttpAdapter } from '../../utils/http';\nimport { HttpAdapter } from '../../utils/http/adapter';\nimport { buildIndexEndpointPath, INDEX_ENDPOINTS } from '../endpoints/indexes';\n\nexport interface IndexesApiClientConfig {\n apiKey: string;\n environment?: Environment;\n region?: Region;\n timeout?: number;\n debug?: boolean;\n retryAttempts?: number;\n retryDelay?: number;\n headers?: Record<string, string>;\n}\n\ninterface BolticSuccessResponse<T = unknown> {\n data: T;\n message?: string;\n}\n\n// Note: No BolticListResponse needed in this client; API returns wrapped success lists\n\ninterface BolticErrorResponse {\n data?: never;\n error: {\n code?: string;\n message?: string;\n meta?: string[];\n };\n}\n\nexport class IndexesApiClient {\n private httpAdapter: HttpAdapter;\n private config: IndexesApiClientConfig;\n private baseURL: string;\n\n constructor(\n apiKey: string,\n config: Omit<IndexesApiClientConfig, 'apiKey'> = {}\n ) {\n this.config = { apiKey, ...config };\n this.httpAdapter = createHttpAdapter();\n\n const environment = config.environment || 'prod';\n const region = config.region || 'asia-south1';\n this.baseURL = this.getBaseURL(environment, region);\n }\n\n private getBaseURL(environment: Environment, region: Region): string {\n const regionConfig = REGION_CONFIGS[region];\n if (!regionConfig) {\n throw new Error(`Unsupported region: ${region}`);\n }\n\n const envConfig = regionConfig[environment];\n if (!envConfig) {\n throw new Error(\n `Unsupported environment: ${environment} for region: ${region}`\n );\n }\n\n return `${envConfig.baseURL}/v1`;\n }\n\n async addIndex(\n tableId: string,\n request: AddIndexRequest\n ): Promise<BolticSuccessResponse<AddIndexResponse> | BolticErrorResponse> {\n try {\n const endpoint = INDEX_ENDPOINTS.create;\n const url = `${this.baseURL}${buildIndexEndpointPath(endpoint, { table_id: tableId })}`;\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n data: request,\n timeout: this.config.timeout,\n });\n return response.data as BolticSuccessResponse<AddIndexResponse>;\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n async listIndexes(\n tableId: string,\n query: ListIndexesQuery\n ): Promise<BolticSuccessResponse<ListIndexesResponse> | BolticErrorResponse> {\n try {\n const endpoint = INDEX_ENDPOINTS.list;\n const url = `${this.baseURL}${buildIndexEndpointPath(endpoint, { table_id: tableId })}`;\n\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n data: query,\n timeout: this.config.timeout,\n });\n\n return response.data as BolticSuccessResponse<ListIndexesResponse>;\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n async deleteIndex(\n tableId: string,\n request: DeleteIndexRequest\n ): Promise<BolticSuccessResponse<DeleteIndexResponse> | BolticErrorResponse> {\n try {\n const endpoint = INDEX_ENDPOINTS.delete;\n const url = `${this.baseURL}${buildIndexEndpointPath(endpoint, { table_id: tableId })}`;\n\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n data: request,\n timeout: this.config.timeout,\n });\n\n return response.data as BolticSuccessResponse<DeleteIndexResponse>;\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n private buildHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'x-boltic-token': this.config.apiKey,\n };\n }\n\n private formatErrorResponse(error: unknown): BolticErrorResponse {\n if (this.config.debug) {\n console.error('Indexes API Error:', error);\n }\n\n // Handle different error types following Boltic format\n if (error && typeof error === 'object' && 'response' in error) {\n const apiError = error as {\n response?: {\n data?: BolticErrorResponse;\n status?: number;\n };\n };\n\n // If API already returned Boltic format, use it\n if (apiError.response?.data?.error) {\n return apiError.response.data;\n }\n\n // Otherwise format it to Boltic structure\n return {\n error: {\n code: 'API_ERROR',\n message: (error as unknown as Error).message || 'Unknown API error',\n meta: [`Status: ${apiError.response?.status || 'unknown'}`],\n },\n };\n }\n\n if (error && typeof error === 'object' && 'message' in error) {\n return {\n error: {\n code: 'CLIENT_ERROR',\n message: (error as Error).message,\n meta: ['Client-side error occurred'],\n },\n };\n }\n\n return {\n error: {\n code: 'UNKNOWN_ERROR',\n message: 'An unexpected error occurred',\n meta: ['Unknown error type'],\n },\n };\n }\n}\n","import { IndexesApiClient } from '../../api/clients/indexes-api-client';\nimport {\n AddIndexRequest,\n AddIndexResponse,\n DeleteIndexRequest,\n DeleteIndexResponse,\n ListIndexesQuery,\n ListIndexesResponse,\n} from '../../types/api/index';\nimport { BaseClient } from '../core/base-client';\nimport { TableResource } from './table';\n\nimport {\n BolticErrorResponse,\n BolticSuccessResponse,\n} from '../../types/common/responses';\n\nexport class IndexResource {\n private apiClient: IndexesApiClient;\n private tableResource: TableResource;\n private client: BaseClient;\n\n constructor(client: BaseClient) {\n this.client = client;\n\n const config = client.getConfig();\n this.apiClient = new IndexesApiClient(config.apiKey, {\n environment: config.environment,\n region: config.region,\n timeout: config.timeout,\n debug: config.debug,\n retryAttempts: config.retryAttempts,\n retryDelay: config.retryDelay,\n headers: config.headers,\n });\n\n this.tableResource = new TableResource(client);\n }\n\n private async resolveTableId(tableName: string): Promise<string> {\n const tableResult = await this.tableResource.findByName(tableName);\n if (!tableResult.data) throw new Error(`Table not found: ${tableName}`);\n return tableResult.data.id;\n }\n\n async addIndex(\n tableName: string,\n request: AddIndexRequest\n ): Promise<BolticSuccessResponse<AddIndexResponse> | BolticErrorResponse> {\n try {\n const tableId = await this.resolveTableId(tableName);\n return await this.apiClient.addIndex(tableId, request);\n } catch (error) {\n return {\n error: {\n code: 'CLIENT_ERROR',\n message: (error as Error)?.message || 'Failed to add index',\n meta: ['IndexResource.addIndex'],\n },\n };\n }\n }\n\n async listIndexes(\n tableName: string,\n query: ListIndexesQuery\n ): Promise<BolticSuccessResponse<ListIndexesResponse> | BolticErrorResponse> {\n try {\n const tableId = await this.resolveTableId(tableName);\n return await this.apiClient.listIndexes(tableId, query);\n } catch (error) {\n return {\n error: {\n code: 'CLIENT_ERROR',\n message: (error as Error)?.message || 'Failed to list indexes',\n meta: ['IndexResource.listIndexes'],\n },\n };\n }\n }\n\n async deleteIndex(\n tableName: string,\n indexName: string\n ): Promise<BolticSuccessResponse<DeleteIndexResponse> | BolticErrorResponse> {\n try {\n const tableId = await this.resolveTableId(tableName);\n const request: DeleteIndexRequest = { index_name: indexName };\n return await this.apiClient.deleteIndex(tableId, request);\n } catch (error) {\n return {\n error: {\n code: 'CLIENT_ERROR',\n message: (error as Error)?.message || 'Failed to delete index',\n meta: ['IndexResource.deleteIndex'],\n },\n };\n }\n }\n}\n","export interface RecordApiEndpoint {\n path: string;\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n authenticated: boolean;\n rateLimit?: {\n requests: number;\n window: number; // in milliseconds\n };\n}\n\nexport interface RecordEndpoints {\n insert: RecordApiEndpoint;\n insertMany: RecordApiEndpoint;\n list: RecordApiEndpoint;\n get: RecordApiEndpoint;\n update: RecordApiEndpoint;\n updateById: RecordApiEndpoint;\n delete: RecordApiEndpoint;\n}\n\nexport const RECORD_ENDPOINTS: RecordEndpoints = {\n insert: {\n path: '/tables/{table_id}/records',\n method: 'POST',\n authenticated: true,\n },\n insertMany: {\n path: '/tables/{table_id}/records/bulk-insert',\n method: 'POST',\n authenticated: true,\n },\n list: {\n path: '/tables/{table_id}/records/list',\n method: 'POST',\n authenticated: true,\n rateLimit: { requests: 200, window: 60000 },\n },\n get: {\n path: '/tables/{table_id}/records/{record_id}',\n method: 'GET',\n authenticated: true,\n rateLimit: { requests: 200, window: 60000 },\n },\n update: {\n path: '/tables/{table_id}/records',\n method: 'PATCH',\n authenticated: true,\n },\n updateById: {\n path: '/tables/{table_id}/records/{record_id}',\n method: 'PATCH',\n authenticated: true,\n },\n\n delete: {\n path: '/tables/{table_id}/records/list',\n method: 'DELETE',\n authenticated: true,\n },\n};\n\nexport const buildRecordEndpointPath = (\n endpoint: RecordApiEndpoint,\n params: Record<string, string> = {}\n): string => {\n let path = endpoint.path;\n\n // Replace path parameters\n Object.entries(params).forEach(([key, value]) => {\n path = path.replace(`{${key}}`, encodeURIComponent(value));\n });\n\n // Check for unreplaced parameters\n const unreplacedParams = path.match(/\\{([^}]+)\\}/g);\n if (unreplacedParams) {\n throw new Error(`Missing path parameters: ${unreplacedParams.join(', ')}`);\n }\n\n return path;\n};\n","import {\n RecordData,\n RecordDeleteOptions,\n RecordDeleteResponse,\n RecordQueryOptions,\n RecordUpdateByIdOptions,\n RecordUpdateOptions,\n RecordWithId,\n} from '../../types/api/record';\nimport {\n ApiFilter,\n mapWhereToFilters,\n normalizeFilters,\n} from '../../utils/filters/filter-mapper';\n\n// API Request/Response interfaces\nexport interface RecordApiRequest {\n data?: RecordData;\n filters?: ApiFilter[];\n page?: {\n page_no: number;\n page_size: number;\n };\n sort?: Record<string, unknown>[];\n}\n\nexport interface RecordApiResponse {\n data: RecordWithId[];\n pagination: {\n total_count: number;\n total_pages: number;\n current_page: number;\n per_page: number;\n type: string;\n };\n}\n\nexport interface RecordInsertApiRequest {\n data: RecordData;\n}\n\nexport interface RecordInsertApiResponse {\n data: RecordWithId;\n}\n\nexport interface RecordUpdateApiRequest {\n set: RecordData;\n filters: ApiFilter[];\n}\n\nexport interface RecordUpdateApiResponse {\n data: RecordWithId[];\n}\n\nexport interface RecordUpdateByIdApiRequest {\n data: RecordData;\n}\n\nexport interface RecordUpdateByIdApiResponse {\n data: RecordWithId;\n}\n\nexport interface RecordDeleteApiRequest {\n filters?: ApiFilter[];\n record_ids?: string[];\n}\n\nexport interface RecordDeleteApiResponse {\n message: string;\n}\n\n// Transform SDK request to API format\nexport function transformInsertRequest(\n sdkRequest: RecordData\n): RecordInsertApiRequest {\n return {\n data: sdkRequest,\n };\n}\n\nexport function transformListRequest(\n sdkRequest: RecordQueryOptions\n): RecordApiRequest {\n return {\n filters: sdkRequest.filters\n ? normalizeFilters(sdkRequest.filters)\n : undefined,\n page: sdkRequest.page,\n sort: sdkRequest.sort,\n };\n}\n\nexport function transformUpdateRequest(\n sdkRequest: RecordUpdateOptions\n): RecordUpdateApiRequest {\n return {\n set: sdkRequest.set,\n filters: normalizeFilters(sdkRequest.filters),\n };\n}\n\nexport function transformUpdateByIdRequest(\n sdkRequest: RecordUpdateByIdOptions\n): RecordUpdateByIdApiRequest {\n return {\n data: sdkRequest.set,\n };\n}\n\n/**\n * Unified delete transformer that handles both record_ids and filters\n */\nexport function transformDeleteRequest(\n sdkRequest: RecordDeleteOptions & { table_id?: string }\n): RecordDeleteApiRequest {\n const result: RecordDeleteApiRequest = {};\n\n // Handle record_ids deletion\n if (sdkRequest.record_ids && sdkRequest.record_ids.length > 0) {\n result.record_ids = sdkRequest.record_ids;\n }\n\n // Handle filters deletion\n if (sdkRequest.filters) {\n if (Array.isArray(sdkRequest.filters)) {\n // If filters is already an array of filters, check if it's ApiFilter or needs conversion\n if (\n sdkRequest.filters.length > 0 &&\n typeof sdkRequest.filters[0] === 'object' &&\n 'field' in sdkRequest.filters[0] &&\n 'operator' in sdkRequest.filters[0] &&\n 'values' in sdkRequest.filters[0]\n ) {\n // Already ApiFilter format\n result.filters = sdkRequest.filters;\n } else {\n // Legacy Record<string, unknown>[] format - convert silently\n console.warn(\n 'Legacy Record<string, unknown>[] filter format detected. Please migrate to the new filter format.'\n );\n // For now, pass through and let backend handle\n result.filters = sdkRequest.filters as ApiFilter[];\n }\n } else {\n // If filters is a where clause object, convert it to API filter format\n result.filters = mapWhereToFilters(sdkRequest.filters);\n }\n }\n\n return result;\n}\n\n// Transform API response to SDK format\nexport function transformInsertResponse(\n apiResponse: RecordInsertApiResponse\n): RecordWithId {\n return apiResponse.data;\n}\n\nexport function transformListResponse(apiResponse: RecordApiResponse): {\n data: RecordWithId[];\n pagination: {\n total_count: number;\n total_pages: number;\n current_page: number;\n per_page: number;\n type: string;\n };\n} {\n return {\n data: apiResponse.data,\n pagination: apiResponse.pagination,\n };\n}\n\nexport function transformUpdateResponse(\n apiResponse: RecordUpdateApiResponse\n): RecordWithId[] {\n return apiResponse.data;\n}\n\nexport function transformUpdateByIdResponse(\n apiResponse: RecordUpdateByIdApiResponse\n): RecordWithId {\n return apiResponse.data;\n}\n\nexport function transformDeleteResponse(\n apiResponse: RecordDeleteApiResponse\n): RecordDeleteResponse {\n return {\n message: apiResponse.message,\n };\n}\n","import {\n RecordBulkInsertOptions,\n RecordBulkInsertResponse,\n RecordData,\n RecordDeleteOptions,\n RecordQueryOptions,\n RecordUpdateByIdOptions,\n RecordUpdateOptions,\n RecordWithId,\n} from '../../types/api/record';\nimport type { Environment, Region } from '../../types/config/environment';\nimport { REGION_CONFIGS } from '../../types/config/environment';\nimport { filterArrayFields, filterObjectFields } from '../../utils/common';\nimport { createHttpAdapter } from '../../utils/http';\nimport { HttpAdapter } from '../../utils/http/adapter';\nimport {\n buildRecordEndpointPath,\n RECORD_ENDPOINTS,\n} from '../endpoints/records';\nimport { transformDeleteRequest } from '../transformers/records';\n\nexport interface RecordsApiClientConfig {\n apiKey: string;\n environment?: Environment;\n region?: Region;\n timeout?: number;\n debug?: boolean;\n retryAttempts?: number;\n retryDelay?: number;\n headers?: Record<string, string>;\n}\n\n// Boltic API Response Structure interfaces\ninterface BolticSuccessResponse<T = unknown> {\n data: T;\n message?: string;\n}\n\ninterface BolticListResponse<T = unknown> {\n data: T[];\n pagination?: {\n total_count: number;\n total_pages: number;\n current_page: number;\n per_page: number;\n type: string;\n };\n message?: string;\n}\n\ninterface BolticErrorResponse {\n data?: never;\n error: {\n code?: string;\n message?: string;\n meta?: string[];\n };\n}\n\n/**\n * Records API Client - handles all record-related API operations\n */\nexport class RecordsApiClient {\n private httpAdapter: HttpAdapter;\n private config: RecordsApiClientConfig;\n private baseURL: string;\n\n constructor(\n apiKey: string,\n config: Omit<RecordsApiClientConfig, 'apiKey'> = {}\n ) {\n this.config = { apiKey, ...config };\n this.httpAdapter = createHttpAdapter();\n\n // Set baseURL based on environment and region\n const environment = config.environment || 'prod';\n const region = config.region || 'asia-south1'; // Default to asia-south1 for legacy support\n this.baseURL = this.getBaseURL(environment, region);\n }\n\n private getBaseURL(environment: Environment, region: Region): string {\n const regionConfig = REGION_CONFIGS[region];\n if (!regionConfig) {\n throw new Error(`Unsupported region: ${region}`);\n }\n\n const envConfig = regionConfig[environment];\n if (!envConfig) {\n throw new Error(\n `Unsupported environment: ${environment} for region: ${region}`\n );\n }\n\n return `${envConfig.baseURL}/v1`;\n }\n\n /**\n * Insert a single record\n */\n async insertRecord(\n request: RecordData & { table_id?: string }\n ): Promise<BolticSuccessResponse<RecordWithId> | BolticErrorResponse> {\n try {\n const { table_id, fields, ...recordData } = request;\n\n if (!table_id) {\n return this.formatErrorResponse(\n new Error('table_id is required for insert operation')\n );\n }\n\n const endpoint = RECORD_ENDPOINTS.insert;\n const url = `${this.baseURL}${buildRecordEndpointPath(endpoint, { table_id })}`;\n\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n data: recordData,\n timeout: this.config.timeout,\n });\n\n // Apply field filtering if fields are specified\n const responseData = response.data as BolticSuccessResponse<RecordWithId>;\n if (fields && responseData.data) {\n responseData.data = filterObjectFields(\n responseData.data,\n fields\n ) as RecordWithId;\n }\n\n return responseData;\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n /**\n * Insert multiple records in bulk\n */\n async insertManyRecords(\n records: RecordData[],\n tableId: string,\n options: RecordBulkInsertOptions = { validation: true }\n ): Promise<RecordBulkInsertResponse | BolticErrorResponse> {\n try {\n if (!tableId) {\n return this.formatErrorResponse(\n new Error('table_id is required for bulk insert operation')\n );\n }\n\n if (!records || !Array.isArray(records) || records.length === 0) {\n return this.formatErrorResponse(\n new Error('records array is required and cannot be empty')\n );\n }\n\n const endpoint = RECORD_ENDPOINTS.insertMany;\n let url = `${this.baseURL}${buildRecordEndpointPath(endpoint, { table_id: tableId })}`;\n\n // Add validation query parameter\n const queryParams = new URLSearchParams();\n if (options.validation !== undefined) {\n queryParams.append('validation', options.validation.toString());\n }\n\n if (queryParams.toString()) {\n url += `?${queryParams.toString()}`;\n }\n\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n data: records,\n timeout: this.config.timeout,\n });\n\n return response.data as RecordBulkInsertResponse;\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n /**\n * Get a single record by ID\n */\n async getRecord(\n recordId: string,\n tableId: string,\n options: { fields?: string[] } = {}\n ): Promise<BolticSuccessResponse<RecordWithId> | BolticErrorResponse> {\n try {\n if (!tableId) {\n return this.formatErrorResponse(\n new Error('table_id is required for get operation')\n );\n }\n\n const endpoint = RECORD_ENDPOINTS.get;\n const url = `${this.baseURL}${buildRecordEndpointPath(endpoint, {\n table_id: tableId,\n record_id: recordId,\n })}`;\n\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n timeout: this.config.timeout,\n });\n\n // Apply field filtering if fields are specified\n const responseData = response.data as BolticSuccessResponse<RecordWithId>;\n if (options.fields && responseData.data) {\n responseData.data = filterObjectFields(\n responseData.data,\n options.fields\n ) as RecordWithId;\n }\n\n return responseData;\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n /**\n * List records with filtering and pagination\n */\n async listRecords(\n options: RecordQueryOptions & { table_id?: string } = {}\n ): Promise<BolticListResponse<RecordWithId> | BolticErrorResponse> {\n try {\n const { table_id, ...queryOptions } = options;\n\n if (!table_id) {\n return this.formatErrorResponse(\n new Error('table_id is required for list operation')\n );\n }\n\n const endpoint = RECORD_ENDPOINTS.list;\n const url = `${this.baseURL}${buildRecordEndpointPath(endpoint, { table_id })}`;\n\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n data: queryOptions,\n timeout: this.config.timeout,\n });\n\n // Apply field filtering if fields are specified\n const responseData = response.data as BolticListResponse<RecordWithId>;\n if (queryOptions.fields && responseData.data) {\n responseData.data = filterArrayFields(\n responseData.data,\n queryOptions.fields\n ) as RecordWithId[];\n }\n\n return responseData;\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n /**\n * Update records by filters\n */\n async updateRecords(\n request: RecordUpdateOptions & { table_id?: string }\n ): Promise<BolticListResponse<RecordWithId> | BolticErrorResponse> {\n try {\n const { table_id, ...updateOptions } = request;\n\n if (!table_id) {\n return this.formatErrorResponse(\n new Error('table_id is required for update operation')\n );\n }\n\n const endpoint = RECORD_ENDPOINTS.update;\n const url = `${this.baseURL}${buildRecordEndpointPath(endpoint, { table_id })}`;\n\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n data: updateOptions,\n timeout: this.config.timeout,\n });\n\n // Apply field filtering if fields are specified in the request\n const responseData = response.data as BolticListResponse<RecordWithId>;\n if (updateOptions.fields && responseData.data) {\n responseData.data = filterArrayFields(\n responseData.data,\n updateOptions.fields\n ) as RecordWithId[];\n }\n\n return responseData;\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n /**\n * Update a single record by ID\n */\n async updateRecordById(\n recordId: string,\n request: RecordUpdateByIdOptions & { table_id?: string }\n ): Promise<BolticSuccessResponse<RecordWithId> | BolticErrorResponse> {\n try {\n const { table_id, ...updateOptions } = request;\n\n if (!table_id) {\n return this.formatErrorResponse(\n new Error('table_id is required for updateById operation')\n );\n }\n\n const endpoint = RECORD_ENDPOINTS.updateById;\n const url = `${this.baseURL}${buildRecordEndpointPath(endpoint, {\n record_id: recordId,\n table_id,\n })}`;\n\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n data: updateOptions.set,\n timeout: this.config.timeout,\n });\n\n // Apply field filtering if fields are specified\n const responseData = response.data as BolticSuccessResponse<RecordWithId>;\n if (updateOptions.fields && responseData.data) {\n responseData.data = filterObjectFields(\n responseData.data,\n updateOptions.fields\n ) as RecordWithId;\n }\n\n return responseData;\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n /**\n * Unified delete records method that supports both record_ids and filters\n */\n async deleteRecords(\n request: RecordDeleteOptions & { table_id?: string }\n ): Promise<BolticSuccessResponse<{ message: string }> | BolticErrorResponse> {\n try {\n const { table_id } = request;\n\n if (!table_id) {\n return this.formatErrorResponse(\n new Error('table_id is required for delete operation')\n );\n }\n\n // Transform the request to API format\n const transformedRequest = transformDeleteRequest(request);\n\n const endpoint = RECORD_ENDPOINTS.delete;\n const url = `${this.baseURL}${buildRecordEndpointPath(endpoint, { table_id })}`;\n\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n data: transformedRequest,\n timeout: this.config.timeout,\n });\n\n // Return raw response without transformation\n return response.data as BolticSuccessResponse<{ message: string }>;\n } catch (error) {\n return this.formatErrorResponse(error);\n }\n }\n\n /**\n * Delete a single record by ID\n */\n async deleteRecordById(\n recordId: string,\n request: { table_id?: string }\n ): Promise<BolticSuccessResponse<{ message: string }> | BolticErrorResponse> {\n // Use deleteRecords with a single ID\n return this.deleteRecords({\n record_ids: [recordId],\n table_id: request.table_id,\n });\n }\n\n private buildHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'x-boltic-token': this.config.apiKey,\n };\n }\n\n private formatErrorResponse(error: unknown): BolticErrorResponse {\n if (this.config.debug) {\n console.error('Records API Error:', error);\n }\n\n // Handle different error types following Boltic format\n if (error && typeof error === 'object' && 'response' in error) {\n const apiError = error as {\n response?: {\n data?: BolticErrorResponse;\n status?: number;\n };\n };\n\n // If API already returned Boltic format, use it\n if (apiError.response?.data?.error) {\n return apiError.response.data;\n }\n\n // Otherwise format it to Boltic structure\n return {\n error: {\n code: 'API_ERROR',\n message: (error as unknown as Error).message || 'Unknown API error',\n meta: [`Status: ${apiError.response?.status || 'unknown'}`],\n },\n };\n }\n\n if (error && typeof error === 'object' && 'message' in error) {\n return {\n error: {\n code: 'CLIENT_ERROR',\n message: (error as Error).message,\n meta: ['Client-side error occurred'],\n },\n };\n }\n\n return {\n error: {\n code: 'UNKNOWN_ERROR',\n message: 'An unexpected error occurred',\n meta: ['Unknown error type'],\n },\n };\n }\n}\n","import { RecordsApiClient } from '../../api/clients/records-api-client';\nimport { TablesApiClient } from '../../api/clients/tables-api-client';\nimport {\n RecordBulkInsertOptions,\n RecordBulkInsertResponse,\n RecordData,\n RecordDeleteOptions,\n RecordQueryOptions,\n RecordUpdateByIdOptions,\n RecordUpdateOptions,\n RecordWithId,\n} from '../../types/api/record';\nimport { BaseClient } from '../core/base-client';\nimport { ColumnResource } from './column';\nimport { TableResource } from './table';\n\nimport {\n BolticErrorResponse,\n BolticListResponse,\n BolticSuccessResponse,\n isErrorResponse,\n} from '../../types/common/responses';\n\nexport class RecordResource {\n private apiClient: RecordsApiClient;\n private tablesApiClient: TablesApiClient;\n private client: BaseClient;\n\n constructor(client: BaseClient) {\n this.client = client;\n // Initialize the API client with the client's configuration\n this.apiClient = new RecordsApiClient(client.getConfig().apiKey, {\n environment: client.getConfig().environment,\n region: client.getConfig().region,\n timeout: client.getConfig().timeout,\n debug: client.getConfig().debug,\n });\n\n // Initialize the tables API client for getting table IDs\n this.tablesApiClient = new TablesApiClient(client.getConfig().apiKey, {\n environment: client.getConfig().environment,\n region: client.getConfig().region,\n timeout: client.getConfig().timeout,\n debug: client.getConfig().debug,\n });\n }\n\n /**\n * Insert a single record\n */\n async insert(\n tableName: string,\n data: RecordData\n ): Promise<BolticSuccessResponse<RecordWithId> | BolticErrorResponse> {\n try {\n // Get table information first\n const tableInfo = await this.getTableInfo(tableName);\n if (!tableInfo) {\n return {\n error: {\n code: 'TABLE_NOT_FOUND',\n message: `Table '${tableName}' not found`,\n },\n };\n }\n\n // Get table columns to determine which fields might be missing\n const completeDataResult = await this.ensureCompleteRecordData(\n tableName,\n data\n );\n if ('error' in completeDataResult && completeDataResult.error) {\n return completeDataResult as BolticErrorResponse;\n }\n\n // Include table_id in the request payload\n const requestData = {\n ...(completeDataResult as RecordData),\n table_id: tableInfo.id,\n };\n const result = await this.apiClient.insertRecord(requestData);\n\n if (isErrorResponse(result)) {\n return result;\n }\n\n return result as BolticSuccessResponse<RecordWithId>;\n } catch (error) {\n return {\n error: {\n code: 'INSERT_ERROR',\n message:\n error instanceof Error ? error.message : 'Unknown error occurred',\n },\n };\n }\n }\n\n /**\n * Insert multiple records in bulk\n */\n async insertMany(\n tableName: string,\n records: RecordData[],\n options: RecordBulkInsertOptions = { validation: true }\n ): Promise<RecordBulkInsertResponse | BolticErrorResponse> {\n try {\n // Validate input\n if (!records || !Array.isArray(records) || records.length === 0) {\n return {\n error: {\n code: 'INVALID_INPUT',\n message: 'Records array is required and cannot be empty',\n },\n };\n }\n\n // Get table information first\n const tableInfo = await this.getTableInfo(tableName);\n if (!tableInfo) {\n return {\n error: {\n code: 'TABLE_NOT_FOUND',\n message: `Table '${tableName}' not found`,\n },\n };\n }\n\n // Send records as-is to API with validation parameter\n const result = await this.apiClient.insertManyRecords(\n records,\n tableInfo.id,\n options\n );\n\n if (isErrorResponse(result)) {\n return result;\n }\n\n return result as RecordBulkInsertResponse;\n } catch (error) {\n return {\n error: {\n code: 'INSERT_MANY_ERROR',\n message:\n error instanceof Error ? error.message : 'Unknown error occurred',\n },\n };\n }\n }\n\n /**\n * Get a single record by ID\n */\n async get(\n tableName: string,\n recordId: string\n ): Promise<BolticSuccessResponse<RecordWithId> | BolticErrorResponse> {\n try {\n // Get table information first\n const tableInfo = await this.getTableInfo(tableName);\n if (!tableInfo) {\n return {\n error: {\n code: 'TABLE_NOT_FOUND',\n message: `Table '${tableName}' not found`,\n },\n };\n }\n\n const result = await this.apiClient.getRecord(recordId, tableInfo.id);\n\n if (isErrorResponse(result)) {\n return result;\n }\n\n return result as BolticSuccessResponse<RecordWithId>;\n } catch (error) {\n return {\n error: {\n code: 'GET_ERROR',\n message:\n error instanceof Error ? error.message : 'Unknown error occurred',\n },\n };\n }\n }\n\n /**\n * List records with filtering and pagination\n */\n async list(\n tableName: string,\n options: RecordQueryOptions = {}\n ): Promise<BolticListResponse<RecordWithId> | BolticErrorResponse> {\n try {\n // Get table information first\n const tableInfo = await this.getTableInfo(tableName);\n if (!tableInfo) {\n return {\n error: {\n code: 'TABLE_NOT_FOUND',\n message: `Table '${tableName}' not found`,\n },\n };\n }\n\n // Include table_id in the request payload\n const requestOptions = { ...options, table_id: tableInfo.id };\n const result = await this.apiClient.listRecords(requestOptions);\n\n if (isErrorResponse(result)) {\n return result;\n }\n\n return result as BolticListResponse<RecordWithId>;\n } catch (error) {\n return {\n error: {\n code: 'LIST_ERROR',\n message:\n error instanceof Error ? error.message : 'Unknown error occurred',\n },\n };\n }\n }\n\n /**\n * Update records by filters\n */\n async update(\n tableName: string,\n options: RecordUpdateOptions\n ): Promise<BolticListResponse<RecordWithId> | BolticErrorResponse> {\n try {\n // Get table information first\n const tableInfo = await this.getTableInfo(tableName);\n if (!tableInfo) {\n return {\n error: {\n code: 'TABLE_NOT_FOUND',\n message: `Table '${tableName}' not found`,\n },\n };\n }\n\n // Include table_id in the request payload\n const requestOptions = { ...options, table_id: tableInfo.id };\n const result = await this.apiClient.updateRecords(requestOptions);\n\n if (isErrorResponse(result)) {\n return result;\n }\n\n return result as BolticListResponse<RecordWithId>;\n } catch (error) {\n return {\n error: {\n code: 'UPDATE_ERROR',\n message:\n error instanceof Error ? error.message : 'Unknown error occurred',\n },\n };\n }\n }\n\n /**\n * Update a single record by ID\n */\n async updateById(\n tableName: string,\n recordId: string,\n data: RecordData\n ): Promise<BolticSuccessResponse<RecordWithId> | BolticErrorResponse> {\n try {\n // Get table information first\n const tableInfo = await this.getTableInfo(tableName);\n if (!tableInfo) {\n return {\n error: {\n code: 'TABLE_NOT_FOUND',\n message: `Table '${tableName}' not found`,\n },\n };\n }\n\n // Include table_id in the request payload\n const requestOptions: RecordUpdateByIdOptions & { table_id: string } = {\n id: recordId,\n set: data,\n table_id: tableInfo.id,\n };\n const result = await this.apiClient.updateRecordById(\n recordId,\n requestOptions\n );\n\n if (isErrorResponse(result)) {\n return result;\n }\n\n return result as BolticSuccessResponse<RecordWithId>;\n } catch (error) {\n return {\n error: {\n code: 'UPDATE_BY_ID_ERROR',\n message:\n error instanceof Error ? error.message : 'Unknown error occurred',\n },\n };\n }\n }\n\n /**\n * Unified delete method that supports both record IDs and filters\n */\n async delete(\n tableName: string,\n options: RecordDeleteOptions\n ): Promise<BolticSuccessResponse<{ message: string }> | BolticErrorResponse> {\n try {\n // Get table information first\n const tableInfo = await this.getTableInfo(tableName);\n if (!tableInfo) {\n return {\n error: {\n code: 'TABLE_NOT_FOUND',\n message: `Table '${tableName}' not found`,\n },\n };\n }\n\n // Include table_id in the request payload\n const requestOptions = { ...options, table_id: tableInfo.id };\n const result = await this.apiClient.deleteRecords(requestOptions);\n\n if (isErrorResponse(result)) {\n return result;\n }\n\n return result as BolticSuccessResponse<{ message: string }>;\n } catch (error) {\n return {\n error: {\n code: 'DELETE_ERROR',\n message:\n error instanceof Error ? error.message : 'Unknown error occurred',\n },\n };\n }\n }\n\n /**\n * Delete a single record by ID\n */\n async deleteById(\n tableName: string,\n recordId: string\n ): Promise<BolticSuccessResponse<{ message: string }> | BolticErrorResponse> {\n try {\n // Get table information first\n const tableInfo = await this.getTableInfo(tableName);\n if (!tableInfo) {\n return {\n error: {\n code: 'TABLE_NOT_FOUND',\n message: `Table '${tableName}' not found`,\n },\n };\n }\n\n const result = await this.apiClient.deleteRecordById(recordId, {\n table_id: tableInfo.id,\n });\n\n if (isErrorResponse(result)) {\n return result;\n }\n\n return result as BolticSuccessResponse<{ message: string }>;\n } catch (error) {\n return {\n error: {\n code: 'DELETE_BY_ID_ERROR',\n message:\n error instanceof Error ? error.message : 'Unknown error occurred',\n },\n };\n }\n }\n\n /**\n * Helper method to get table information by name\n */\n private async getTableInfo(\n tableName: string\n ): Promise<{ id: string; snapshot_url?: string } | null> {\n try {\n // Use the table resource to find the table by name\n const tableResource = new TableResource(this.client);\n const tableResult = await tableResource.findByName(tableName);\n\n if (tableResult.data) {\n return {\n id: tableResult.data.id,\n snapshot_url: tableResult.data.snapshot_url,\n };\n }\n\n return null;\n } catch (error) {\n console.error('Error getting table info:', error);\n return null;\n }\n }\n\n /**\n * Helper method to ensure all required fields for a record are present,\n * filling missing ones with null.\n */\n private async ensureCompleteRecordData(\n tableName: string,\n data: RecordData\n ): Promise<RecordData | BolticErrorResponse> {\n try {\n const columnResource = new ColumnResource(this.client);\n const columnsResult = await columnResource.findAll(tableName);\n\n if (isErrorResponse(columnsResult)) {\n return columnsResult;\n }\n\n // Get the actual columns array from the response\n const columns = Array.isArray(columnsResult.data)\n ? columnsResult.data\n : [];\n\n // Create complete data object with all table columns\n const completeData: RecordData = { ...data };\n\n // Set missing fields to null (only for columns that are not system-generated)\n for (const column of columns) {\n // Skip system columns that are auto-generated\n if (\n column.name === 'id' ||\n column.name === 'created_at' ||\n column.name === 'updated_at'\n ) {\n continue;\n }\n\n // If field is missing from provided data, set it to null\n if (!(column.name in data)) {\n completeData[column.name] = null;\n }\n }\n\n return completeData;\n } catch (error) {\n return {\n error: {\n code: 'COMPLETE_DATA_ERROR',\n message:\n error instanceof Error ? error.message : 'Unknown error occurred',\n },\n };\n }\n }\n}\n","import {\n RecordData,\n RecordQueryOptions,\n RecordUpdateOptions,\n RecordWithId,\n} from '../../types/api/record';\nimport {\n BolticErrorResponse,\n BolticListResponse,\n BolticSuccessResponse,\n} from '../../types/common/responses';\nimport { RecordResource } from './record';\n\nexport interface RecordBuilderOptions {\n tableName: string;\n recordResource: RecordResource;\n}\n\n/**\n * Record Builder - provides a fluent interface for building record queries and operations\n */\nexport class RecordBuilder {\n private tableName: string;\n private recordResource: RecordResource;\n private queryOptions: RecordQueryOptions = {};\n private updateData: RecordData = {};\n\n constructor(options: RecordBuilderOptions) {\n this.tableName = options.tableName;\n this.recordResource = options.recordResource;\n }\n\n /**\n * Add filter conditions\n */\n where(conditions: Record<string, unknown>): RecordBuilder {\n if (!this.queryOptions.filters) {\n this.queryOptions.filters = [];\n }\n\n // Convert conditions to filter format\n Object.entries(conditions).forEach(([field, value]) => {\n this.queryOptions.filters!.push({\n field,\n operator: 'equals',\n values: [value],\n });\n });\n\n return this;\n }\n\n /**\n * Set sorting\n */\n orderBy(field: string, direction: 'asc' | 'desc' = 'asc'): RecordBuilder {\n if (!this.queryOptions.sort) {\n this.queryOptions.sort = [];\n }\n this.queryOptions.sort.push({ field, order: direction });\n return this;\n }\n\n /**\n * Set limit (using page)\n */\n limit(count: number): RecordBuilder {\n if (!this.queryOptions.page) {\n this.queryOptions.page = { page_no: 1, page_size: count };\n } else {\n this.queryOptions.page.page_size = count;\n }\n return this;\n }\n\n /**\n * Set offset (using page)\n */\n offset(count: number): RecordBuilder {\n if (!this.queryOptions.page) {\n this.queryOptions.page = {\n page_no: Math.floor(count / 50) + 1,\n page_size: 50,\n };\n } else {\n // Calculate page number based on offset and page size\n const pageSize = this.queryOptions.page.page_size || 50;\n this.queryOptions.page.page_no = Math.floor(count / pageSize) + 1;\n }\n return this;\n }\n\n /**\n * Set fields to select\n */\n select(fields: string[]): RecordBuilder {\n this.queryOptions.fields = fields;\n return this;\n }\n\n /**\n * Set data for update operations\n */\n set(data: RecordData): RecordBuilder {\n this.updateData = { ...this.updateData, ...data };\n return this;\n }\n\n /**\n * Set pagination\n */\n page(pageNo: number, pageSize: number = 50): RecordBuilder {\n this.queryOptions.page = {\n page_no: pageNo,\n page_size: pageSize,\n };\n return this;\n }\n\n /**\n * Execute list operation (was findAll)\n */\n async list(): Promise<\n BolticListResponse<RecordWithId> | BolticErrorResponse\n > {\n return this.recordResource.list(this.tableName, this.queryOptions);\n }\n\n /**\n * Execute findAll operation (alias for list)\n */\n async findAll(): Promise<\n BolticListResponse<RecordWithId> | BolticErrorResponse\n > {\n return this.recordResource.list(this.tableName, this.queryOptions);\n }\n\n /**\n * Execute findOne operation by getting first result from list\n */\n async findOne(): Promise<\n BolticSuccessResponse<RecordWithId | null> | BolticErrorResponse\n > {\n // Use limit 1 to get just one record\n const queryOptions = { ...this.queryOptions, limit: 1 };\n const result = await this.recordResource.list(this.tableName, queryOptions);\n\n if ('error' in result) {\n return result as BolticErrorResponse;\n }\n\n // Return the first record or null in success format\n const record = result.data.length > 0 ? result.data[0] : null;\n return {\n data: record,\n message: record ? 'Record found' : 'No record found',\n };\n }\n\n /**\n * Build where conditions from filters for API consumption\n */\n private buildWhereConditions(): Record<string, unknown> {\n const where: Record<string, unknown> = {};\n\n if (this.queryOptions.filters) {\n this.queryOptions.filters.forEach((filter) => {\n // Handle both ApiFilter and legacy Record<string, unknown> formats\n if ('field' in filter && 'values' in filter) {\n // ApiFilter format\n const apiFilter = filter as {\n field: string;\n operator: string;\n values: unknown[];\n };\n const fieldName = String(apiFilter.field);\n if (apiFilter.operator === 'equals') {\n where[fieldName] = apiFilter.values[0];\n } else if (apiFilter.operator === 'contains') {\n where[fieldName] = { $like: `%${String(apiFilter.values[0])}%` };\n } else {\n // For other operators, convert them appropriately\n where[fieldName] = apiFilter.values[0];\n }\n } else {\n // Legacy Record<string, unknown> format\n Object.assign(where, filter);\n }\n });\n }\n\n return where;\n }\n\n /**\n * Execute update operation - requires filters or record IDs\n */\n async update(): Promise<\n BolticListResponse<RecordWithId> | BolticErrorResponse\n > {\n if (!this.updateData) {\n return {\n error: {\n code: 'MISSING_UPDATE_DATA',\n message: 'Update data is required for update operation',\n },\n } as unknown as BolticErrorResponse;\n }\n\n const updateOptions: RecordUpdateOptions = {\n set: this.updateData,\n filters: this.queryOptions.filters || [],\n };\n\n return this.recordResource.update(this.tableName, updateOptions);\n }\n\n /**\n * Execute update by ID operation\n */\n async updateById(\n id: string\n ): Promise<BolticSuccessResponse<RecordWithId> | BolticErrorResponse> {\n return this.recordResource.updateById(this.tableName, id, this.updateData);\n }\n\n /**\n * Execute delete by single ID operation\n */\n async deleteById(\n id: string\n ): Promise<BolticSuccessResponse<{ message: string }> | BolticErrorResponse> {\n return this.recordResource.deleteById(this.tableName, id);\n }\n\n /**\n * Execute delete by IDs operation\n */\n async deleteByIds(\n ids: string[]\n ): Promise<BolticSuccessResponse<{ message: string }> | BolticErrorResponse> {\n return this.recordResource.delete(this.tableName, { record_ids: ids });\n }\n\n /**\n * Execute delete operation using filters\n */\n async delete(): Promise<\n BolticSuccessResponse<{ message: string }> | BolticErrorResponse\n > {\n if (!this.queryOptions.filters || this.queryOptions.filters.length === 0) {\n return {\n error: {\n code: 'MISSING_DELETE_CONDITIONS',\n message:\n 'Filter conditions are required for delete operation. Use where() to specify conditions.',\n },\n };\n }\n\n const deleteOptions = {\n filters: this.buildWhereConditions(),\n };\n\n return this.recordResource.delete(this.tableName, deleteOptions);\n }\n\n /**\n * Get the built query options (for debugging)\n */\n getQueryOptions(): RecordQueryOptions {\n return { ...this.queryOptions };\n }\n\n /**\n * Get the update data (for debugging)\n */\n getUpdateData(): RecordData {\n return { ...this.updateData };\n }\n\n /**\n * Execute insert operation\n */\n async insert(\n data: RecordData\n ): Promise<BolticSuccessResponse<RecordWithId> | BolticErrorResponse> {\n return this.recordResource.insert(this.tableName, data);\n }\n}\n\n/**\n * Create a new record builder\n */\nexport function createRecordBuilder(\n options: RecordBuilderOptions\n): RecordBuilder {\n return new RecordBuilder(options);\n}\n","export interface ApiEndpoint {\n path: string;\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n authenticated: boolean;\n rateLimit?: {\n requests: number;\n window: number; // in milliseconds\n };\n}\n\nexport interface SqlEndpoints {\n textToSQL: ApiEndpoint;\n executeSQL: ApiEndpoint;\n}\n\nexport const SQL_ENDPOINTS: SqlEndpoints = {\n textToSQL: {\n path: '/tables/query/text-to-sql',\n method: 'POST',\n authenticated: true,\n rateLimit: { requests: 100, window: 60000 }, // Limited due to AI processing\n },\n executeSQL: {\n path: '/tables/query/execute',\n method: 'POST',\n authenticated: true,\n rateLimit: { requests: 200, window: 60000 },\n },\n};\n\n/**\n * Build SQL endpoint path - all SQL endpoints are simple paths without parameters\n */\nexport const buildSqlEndpointPath = (\n endpoint: ApiEndpoint,\n params: Record<string, string> = {}\n): string => {\n let path = endpoint.path;\n\n // Replace path parameters if any (though SQL endpoints don't currently use them)\n Object.entries(params).forEach(([key, value]) => {\n path = path.replace(`{${key}}`, encodeURIComponent(value));\n });\n\n return path;\n};\n","import { BolticErrorResponse } from '../../types/common/responses';\nimport type { Environment, Region } from '../../types/config/environment';\nimport { REGION_CONFIGS } from '../../types/config/environment';\nimport { HttpAdapter, createHttpAdapter } from '../../utils/http';\n\nexport interface BaseApiClientConfig {\n apiKey: string;\n environment?: Environment;\n region?: Region;\n timeout?: number;\n debug?: boolean;\n retryAttempts?: number;\n retryDelay?: number;\n headers?: Record<string, string>;\n}\n\n/**\n * Base API Client - provides common functionality for all API clients\n */\nexport abstract class BaseApiClient {\n protected httpAdapter: HttpAdapter;\n protected config: BaseApiClientConfig;\n protected baseURL: string;\n\n constructor(\n apiKey: string,\n config: Omit<BaseApiClientConfig, 'apiKey'> = {}\n ) {\n this.config = { apiKey, ...config };\n this.httpAdapter = createHttpAdapter();\n\n // Set baseURL based on environment and region\n const environment = config.environment || 'prod';\n const region = config.region || 'asia-south1'; // Default to asia-south1 for legacy support\n this.baseURL = this.getBaseURL(environment, region);\n }\n\n private getBaseURL(environment: Environment, region: Region): string {\n const regionConfig = REGION_CONFIGS[region];\n if (!regionConfig) {\n throw new Error(`Unsupported region: ${region}`);\n }\n\n const envConfig = regionConfig[environment];\n if (!envConfig) {\n throw new Error(\n `Unsupported environment: ${environment} for region: ${region}`\n );\n }\n\n return `${envConfig.baseURL}/v1`;\n }\n\n protected buildHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'x-boltic-token': this.config.apiKey,\n ...this.config.headers,\n };\n }\n\n protected formatErrorResponse(\n error: unknown,\n prefix = 'API'\n ): BolticErrorResponse {\n if (this.config.debug) {\n console.error(`${prefix} Error:`, error);\n }\n\n // Handle different error types following Boltic format\n if (error && typeof error === 'object' && 'response' in error) {\n const apiError = error as {\n response?: {\n data?: BolticErrorResponse;\n status?: number;\n };\n };\n\n // If API already returned Boltic format, use it\n if (apiError.response?.data?.error) {\n return apiError.response.data;\n }\n\n // Otherwise format it to Boltic structure\n return {\n error: {\n code: `${prefix}_ERROR`,\n message:\n (error as unknown as Error).message || `Unknown ${prefix} error`,\n meta: [`Status: ${apiError.response?.status || 'unknown'}`],\n },\n };\n }\n\n if (error && typeof error === 'object' && 'message' in error) {\n return {\n error: {\n code: `${prefix}_CLIENT_ERROR`,\n message: (error as Error).message,\n meta: [`${prefix} client-side error occurred`],\n },\n };\n }\n\n return {\n error: {\n code: `${prefix}_UNKNOWN_ERROR`,\n message: `An unexpected ${prefix} error occurred`,\n meta: [`Unknown ${prefix} error type`],\n },\n };\n }\n\n // Security methods to prevent API key exposure\n toString(): string {\n return `${this.constructor.name} { environment: \"${this.config.environment || 'prod'}\", debug: ${this.config.debug || false} }`;\n }\n\n toJSON(): object {\n const safeConfig = { ...this.config };\n delete (safeConfig as Record<string, unknown>).apiKey;\n return {\n client: this.constructor.name,\n config: safeConfig,\n };\n }\n\n // Custom inspect method for Node.js console logging\n [Symbol.for('nodejs.util.inspect.custom')](): string {\n return this.toString();\n }\n}\n","import {\n ExecuteSQLApiRequest,\n ExecuteSQLApiResponse,\n TextToSQLApiRequest,\n TextToSQLApiResponse,\n} from '../../types/api/sql';\nimport { BolticErrorResponse } from '../../types/common/responses';\nimport { SQL_ENDPOINTS, buildSqlEndpointPath } from '../endpoints/sql';\nimport { BaseApiClient, BaseApiClientConfig } from './base-api-client';\n\nexport interface SqlApiClientConfig extends BaseApiClientConfig {}\n\n/**\n * SQL API Client - handles all SQL-related API operations\n */\nexport class SqlApiClient extends BaseApiClient {\n constructor(apiKey: string, config: Omit<SqlApiClientConfig, 'apiKey'> = {}) {\n super(apiKey, config);\n }\n\n /**\n * Convert natural language to SQL query (streaming)\n */\n async textToSQL(\n request: TextToSQLApiRequest\n ): Promise<AsyncIterable<string> | BolticErrorResponse> {\n try {\n const endpoint = SQL_ENDPOINTS.textToSQL;\n const url = `${this.baseURL}${buildSqlEndpointPath(endpoint)}`;\n\n // For now, make a regular request and simulate streaming\n // TODO: Implement proper streaming when backend supports it\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n data: request,\n timeout: this.config.timeout,\n });\n\n // Check for error response\n if (response.status >= 400) {\n return this.formatErrorResponse(\n {\n response: { data: response.data, status: response.status },\n },\n 'SQL'\n );\n }\n\n // Convert to AsyncIterable for streaming interface\n const sqlResponse = response.data as TextToSQLApiResponse;\n return this.createAsyncIterable(sqlResponse.data);\n } catch (error) {\n return this.formatErrorResponse(error, 'SQL');\n }\n }\n\n /**\n * Execute SQL query\n */\n async executeSQL(\n request: ExecuteSQLApiRequest\n ): Promise<ExecuteSQLApiResponse | BolticErrorResponse> {\n try {\n const endpoint = SQL_ENDPOINTS.executeSQL;\n const url = `${this.baseURL}${buildSqlEndpointPath(endpoint)}`;\n\n const response = await this.httpAdapter.request({\n url,\n method: endpoint.method,\n headers: this.buildHeaders(),\n data: request,\n timeout: this.config.timeout,\n });\n\n // Check for error response\n if (response.status >= 400) {\n return this.formatErrorResponse(\n {\n response: { data: response.data, status: response.status },\n },\n 'SQL'\n );\n }\n\n // Return raw response without transformation\n return response.data as ExecuteSQLApiResponse;\n } catch (error) {\n return this.formatErrorResponse(error, 'SQL');\n }\n }\n\n /**\n * Helper method to create AsyncIterable from string data\n * TODO: Replace with proper streaming implementation when backend supports it\n */\n private async *createAsyncIterable(data: string): AsyncIterable<string> {\n // For now, just yield the complete string\n // In the future, this could be replaced with actual streaming chunks\n yield data;\n }\n}\n","import { TextToSQLApiRequest } from '../../types/api/sql';\nimport { TextToSQLOptions } from '../../types/sql';\n\n/**\n * Transform SDK text-to-SQL options to API request\n */\nexport function transformTextToSQLRequest(\n prompt: string,\n options: TextToSQLOptions = {}\n): TextToSQLApiRequest {\n return {\n prompt,\n current_query: options.currentQuery,\n };\n}\n","import { SqlApiClient } from '../../api/clients/sql-api-client';\nimport { transformTextToSQLRequest } from '../../api/transformers/sql';\nimport { ExecuteSQLApiResponse } from '../../types/api/sql';\nimport { isErrorResponse } from '../../types/common/responses';\nimport { TextToSQLOptions } from '../../types/sql';\nimport { BaseClient } from '../core/base-client';\n\nexport class SqlResource {\n private sqlApiClient: SqlApiClient;\n\n constructor(client: BaseClient) {\n // Initialize the SQL API client with the client's configuration\n const config = client.getConfig();\n this.sqlApiClient = new SqlApiClient(config.apiKey, {\n environment: config.environment,\n region: config.region,\n timeout: config.timeout,\n debug: config.debug,\n retryAttempts: config.retryAttempts,\n retryDelay: config.retryDelay,\n headers: config.headers,\n });\n }\n\n /**\n * Convert natural language to SQL query\n * Returns streaming results for real-time query generation\n *\n * @param prompt - Natural language description of the desired query\n * @param options - Optional parameters including currentQuery for refinement\n * @returns AsyncIterable<string> for streaming SQL generation\n *\n */\n async textToSQL(\n prompt: string,\n options: TextToSQLOptions = {}\n ): Promise<AsyncIterable<string>> {\n const request = transformTextToSQLRequest(prompt, options);\n const response = await this.sqlApiClient.textToSQL(request);\n\n // Check if response is an error by checking for the error property\n if ('error' in response && response.error !== undefined) {\n throw response; // Throw the API response directly\n }\n\n return response as AsyncIterable<string>;\n }\n\n /**\n * Execute SQL query with built-in safety measures and performance optimization\n *\n * @param query - SQL query string to execute\n * @returns Promise<ExecuteSQLApiResponse> with raw API response following Boltic API Response Structure\n *\n */\n async executeSQL(\n query: string\n ): Promise<\n | ExecuteSQLApiResponse\n | import('../../types/common/responses').BolticErrorResponse\n > {\n const response = await this.sqlApiClient.executeSQL({ query });\n\n if (isErrorResponse(response)) {\n return response; // Return error response for caller to handle\n }\n\n return response; // Return raw API response following Boltic API Response Structure\n }\n}\n","import { TablesApiClient } from '../../api/clients/tables-api-client';\nimport { ValidationError } from '../../errors/utils';\nimport {\n FieldDefinition,\n TableCreateRequest,\n TableCreateResponse,\n} from '../../types/api/table';\nimport {\n BolticErrorResponse,\n BolticSuccessResponse,\n} from '../../types/common/responses';\n\nexport interface TableBuilderOptions {\n name: string;\n description?: string;\n is_ai_generated_schema?: boolean;\n}\n\n/**\n * Table Builder - provides a fluent interface for creating tables\n */\nexport class TableBuilder {\n private tableName: string;\n private description?: string;\n private isPublic: boolean = false;\n private fields: FieldDefinition[] = [];\n private tablesApiClient?: TablesApiClient;\n\n constructor(options: TableBuilderOptions, tablesApiClient?: TablesApiClient) {\n this.tableName = options.name;\n this.description = options.description;\n this.tablesApiClient = tablesApiClient;\n }\n\n /**\n * Set table name\n */\n name(name: string): TableBuilder {\n this.tableName = name;\n return this;\n }\n\n /**\n * Set table description\n */\n describe(description: string): TableBuilder {\n this.description = description;\n return this;\n }\n\n /**\n * Set if table is public\n */\n public(isPublic: boolean = true): TableBuilder {\n this.isPublic = isPublic;\n return this;\n }\n\n /**\n * Add a text field\n */\n text(\n name: string,\n options: {\n nullable?: boolean;\n unique?: boolean;\n indexed?: boolean;\n defaultValue?: string;\n description?: string;\n alignment?: 'left' | 'center' | 'right';\n } = {}\n ): TableBuilder {\n this.fields.push({\n name,\n type: 'text',\n is_nullable: options.nullable ?? true,\n is_unique: options.unique ?? false,\n is_indexed: options.indexed ?? false,\n is_primary_key: false,\n default_value: options.defaultValue,\n description: options.description,\n alignment: options.alignment || 'left',\n field_order: this.fields.length + 1,\n });\n return this;\n }\n\n /**\n * Add a long text field\n */\n longText(\n name: string,\n options: {\n nullable?: boolean;\n description?: string;\n alignment?: 'left' | 'center' | 'right';\n } = {}\n ): TableBuilder {\n this.fields.push({\n name,\n type: 'long-text',\n is_nullable: options.nullable ?? true,\n is_unique: false,\n is_indexed: false,\n is_primary_key: false,\n description: options.description,\n alignment: options.alignment || 'left',\n field_order: this.fields.length + 1,\n });\n return this;\n }\n\n /**\n * Add a number field\n */\n number(\n name: string,\n options: {\n nullable?: boolean;\n unique?: boolean;\n indexed?: boolean;\n defaultValue?: number;\n description?: string;\n decimals?: string;\n alignment?: 'left' | 'center' | 'right';\n } = {}\n ): TableBuilder {\n this.fields.push({\n name,\n type: 'number',\n is_nullable: options.nullable ?? true,\n is_unique: options.unique ?? false,\n is_indexed: options.indexed ?? false,\n is_primary_key: false,\n default_value: options.defaultValue,\n description: options.description,\n decimals: options.decimals,\n alignment: options.alignment || 'right',\n field_order: this.fields.length + 1,\n });\n return this;\n }\n\n /**\n * Add a currency field\n */\n currency(\n name: string,\n options: {\n nullable?: boolean;\n defaultValue?: number;\n description?: string;\n currencyFormat?: string;\n decimals?: string;\n } = {}\n ): TableBuilder {\n this.fields.push({\n name,\n type: 'currency',\n is_nullable: options.nullable ?? true,\n is_unique: false,\n is_indexed: false,\n is_primary_key: false,\n default_value: options.defaultValue,\n description: options.description,\n currency_format: options.currencyFormat,\n decimals: options.decimals,\n alignment: 'right',\n field_order: this.fields.length + 1,\n });\n return this;\n }\n\n /**\n * Add a checkbox field\n */\n checkbox(\n name: string,\n options: {\n nullable?: boolean;\n defaultValue?: boolean;\n description?: string;\n } = {}\n ): TableBuilder {\n this.fields.push({\n name,\n type: 'checkbox',\n is_nullable: options.nullable ?? true,\n is_unique: false,\n is_indexed: false,\n is_primary_key: false,\n default_value: options.defaultValue,\n description: options.description,\n alignment: 'center',\n field_order: this.fields.length + 1,\n });\n return this;\n }\n\n /**\n * Add a dropdown field\n */\n dropdown(\n name: string,\n items: string[],\n options: {\n nullable?: boolean;\n multiple?: boolean;\n defaultValue?: string | string[];\n description?: string;\n } = {}\n ): TableBuilder {\n this.fields.push({\n name,\n type: 'dropdown',\n is_nullable: options.nullable ?? true,\n is_unique: false,\n is_indexed: false,\n is_primary_key: false,\n default_value: options.defaultValue,\n description: options.description,\n selection_source: 'provide-static-list',\n selectable_items: items,\n multiple_selections: options.multiple ?? false,\n alignment: 'left',\n field_order: this.fields.length + 1,\n });\n return this;\n }\n\n /**\n * Add an email field\n */\n email(\n name: string,\n options: {\n nullable?: boolean;\n unique?: boolean;\n indexed?: boolean;\n description?: string;\n } = {}\n ): TableBuilder {\n this.fields.push({\n name,\n type: 'email',\n is_nullable: options.nullable ?? true,\n is_unique: options.unique ?? false,\n is_indexed: options.indexed ?? false,\n is_primary_key: false,\n description: options.description,\n alignment: 'left',\n field_order: this.fields.length + 1,\n });\n return this;\n }\n\n /**\n * Add a phone number field\n */\n phone(\n name: string,\n options: {\n nullable?: boolean;\n description?: string;\n format?: string;\n } = {}\n ): TableBuilder {\n this.fields.push({\n name,\n type: 'phone-number',\n is_nullable: options.nullable ?? true,\n is_unique: false,\n is_indexed: false,\n is_primary_key: false,\n description: options.description,\n phone_format: options.format,\n alignment: 'left',\n field_order: this.fields.length + 1,\n });\n return this;\n }\n\n /**\n * Add a link field\n */\n link(\n name: string,\n options: {\n nullable?: boolean;\n description?: string;\n } = {}\n ): TableBuilder {\n this.fields.push({\n name,\n type: 'link',\n is_nullable: options.nullable ?? true,\n is_unique: false,\n is_indexed: false,\n is_primary_key: false,\n description: options.description,\n alignment: 'left',\n field_order: this.fields.length + 1,\n });\n return this;\n }\n\n /**\n * Add a JSON field\n */\n json(\n name: string,\n options: {\n nullable?: boolean;\n description?: string;\n } = {}\n ): TableBuilder {\n this.fields.push({\n name,\n type: 'json',\n is_nullable: options.nullable ?? true,\n is_unique: false,\n is_indexed: false,\n is_primary_key: false,\n description: options.description,\n alignment: 'left',\n field_order: this.fields.length + 1,\n });\n return this;\n }\n\n /**\n * Add a date-time field\n */\n dateTime(\n name: string,\n options: {\n nullable?: boolean;\n description?: string;\n dateFormat?: string;\n timeFormat?: string;\n timezone?: string;\n } = {}\n ): TableBuilder {\n this.fields.push({\n name,\n type: 'date-time',\n is_nullable: options.nullable ?? true,\n is_unique: false,\n is_indexed: false,\n is_primary_key: false,\n description: options.description,\n date_format: options.dateFormat,\n time_format: options.timeFormat,\n timezone: options.timezone,\n alignment: 'left',\n field_order: this.fields.length + 1,\n });\n return this;\n }\n\n /**\n * Add a vector field\n */\n vector(\n name: string,\n dimension: number,\n options: {\n nullable?: boolean;\n description?: string;\n } = {}\n ): TableBuilder {\n this.fields.push({\n name,\n type: 'vector',\n is_nullable: options.nullable ?? true,\n is_unique: false,\n is_indexed: false,\n is_primary_key: false,\n description: options.description,\n vector_dimension: dimension,\n alignment: 'left',\n field_order: this.fields.length + 1,\n });\n return this;\n }\n\n /**\n * Add a custom field\n */\n addField(field: FieldDefinition): TableBuilder {\n this.fields.push({\n ...field,\n field_order: field.field_order || this.fields.length + 1,\n });\n return this;\n }\n\n /**\n * Remove a field by name\n */\n removeField(name: string): TableBuilder {\n this.fields = this.fields.filter((field) => field.name !== name);\n // Reorder remaining fields\n this.fields.forEach((field, index) => {\n field.field_order = index + 1;\n });\n return this;\n }\n\n /**\n * Get current fields\n */\n getFields(): FieldDefinition[] {\n return [...this.fields];\n }\n\n /**\n * Get current table name\n */\n getName(): string {\n return this.tableName;\n }\n\n /**\n * Get current description\n */\n getDescription(): string | undefined {\n return this.description;\n }\n\n /**\n * Build the table request object\n */\n build(): TableCreateRequest {\n if (!this.tableName) {\n throw new ValidationError('Table name is required', [\n { field: 'name', message: 'Table name cannot be empty' },\n ]);\n }\n\n if (this.fields.length === 0) {\n throw new ValidationError('At least one field is required', [\n { field: 'fields', message: 'Table must have at least one field' },\n ]);\n }\n\n return {\n name: this.tableName,\n description: this.description,\n fields: this.fields,\n };\n }\n\n /**\n * Build and create the table (requires API client)\n */\n async create(\n options: { is_ai_generated_schema?: boolean; is_template?: boolean } = {}\n ): Promise<BolticSuccessResponse<TableCreateResponse> | BolticErrorResponse> {\n if (!this.tablesApiClient) {\n throw new Error('TablesApiClient is required for table creation');\n }\n const request = this.build();\n return this.tablesApiClient.createTable(request, options);\n }\n}\n\n/**\n * Create a new table builder\n */\nexport function createTableBuilder(\n options: TableBuilderOptions,\n tablesApiClient?: TablesApiClient\n): TableBuilder {\n return new TableBuilder(options, tablesApiClient);\n}\n","import { ColumnQueryOptions, ColumnUpdateRequest } from '../types/api/column';\nimport { AddIndexRequest, ListIndexesQuery } from '../types/api/index';\nimport {\n RecordData,\n RecordDeleteOptions,\n RecordQueryOptions,\n RecordUpdateOptions,\n} from '../types/api/record';\nimport {\n FieldDefinition,\n TableCreateRequest,\n TableQueryOptions,\n TableUpdateRequest,\n} from '../types/api/table';\nimport { Environment, EnvironmentConfig } from '../types/config/environment';\nimport { TextToSQLOptions } from '../types/sql';\nimport { HttpRequestConfig, HttpResponse } from '../utils/http/adapter';\nimport { AuthManager } from './core/auth-manager';\nimport { BaseClient } from './core/base-client';\nimport { ClientConfig, ConfigManager } from './core/config';\nimport { ColumnResource } from './resources/column';\nimport { IndexResource } from './resources/indexes';\nimport { RecordResource } from './resources/record';\nimport { createRecordBuilder, RecordBuilder } from './resources/record-builder';\nimport { SqlResource } from './resources/sql';\nimport { TableResource } from './resources/table';\nimport { createTableBuilder, TableBuilder } from './resources/table-builder';\n\nexport interface ClientOptions extends Partial<EnvironmentConfig> {\n environment?: Environment;\n region?: 'asia-south1' | 'us-central1';\n debug?: boolean;\n retryAttempts?: number;\n retryDelay?: number;\n}\n\ninterface DatabaseContext {\n databaseName: string;\n}\n\nexport class BolticClient {\n private configManager: ConfigManager;\n private authManager: AuthManager;\n private baseClient: BaseClient;\n private tableResource: TableResource;\n private columnResource: ColumnResource;\n private recordResource: RecordResource;\n private sqlResource: SqlResource;\n private indexResource: IndexResource;\n private currentDatabase: DatabaseContext | null = null;\n private clientOptions: ClientOptions;\n\n constructor(apiKey: string, options: ClientOptions = {}) {\n // Store client options\n this.clientOptions = options;\n\n // Initialize configuration\n this.configManager = new ConfigManager(\n apiKey,\n options.environment || 'prod',\n options.region || 'asia-south1',\n options\n );\n const config = this.configManager.getConfig();\n\n // Initialize authentication\n this.authManager = new AuthManager({\n apiKey: config.apiKey,\n maxRetries: config.maxRetries,\n });\n\n // Initialize HTTP client\n this.baseClient = new BaseClient(config, this.authManager);\n\n // Initialize table operations\n this.tableResource = new TableResource(this.baseClient);\n\n // Initialize column operations\n this.columnResource = new ColumnResource(this.baseClient);\n\n // Initialize record operations\n this.recordResource = new RecordResource(this.baseClient);\n\n // Initialize SQL operations\n this.sqlResource = new SqlResource(this.baseClient);\n\n // Initialize Index operations\n this.indexResource = new IndexResource(this.baseClient);\n\n // Set default database context\n this.currentDatabase = {\n databaseName: 'Default',\n };\n }\n\n getCurrentDatabase(): DatabaseContext | null {\n return this.currentDatabase;\n }\n\n // Direct table operations\n get tables() {\n return {\n create: (data: TableCreateRequest) => this.tableResource.create(data),\n findAll: (options?: TableQueryOptions) =>\n this.tableResource.findAll(options),\n findById: (id: string) => this.tableResource.findById(id),\n findByName: (name: string) => this.tableResource.findByName(name),\n findOne: (options: TableQueryOptions) =>\n this.tableResource.findOne(options),\n update: (name: string, data: TableUpdateRequest) =>\n this.tableResource.update(name, data),\n delete: (name: string) => this.tableResource.delete(name),\n rename: (oldName: string, newName: string) =>\n this.tableResource.rename(oldName, newName),\n setAccess: (request: { table_name: string; is_shared: boolean }) =>\n this.tableResource.setAccess(request),\n };\n }\n\n // Direct column operations\n get columns() {\n return {\n create: (tableName: string, column: FieldDefinition) =>\n this.columnResource.create(tableName, column),\n createMany: (tableName: string, columns: FieldDefinition[]) =>\n this.columnResource.createMany(tableName, columns),\n findAll: (tableName: string, options?: ColumnQueryOptions) =>\n this.columnResource.findAll(tableName, options),\n findOne: (tableName: string, columnName: string) =>\n this.columnResource.get(tableName, columnName),\n findById: (tableName: string, columnId: string) =>\n this.columnResource.findById(tableName, columnId),\n update: (\n tableName: string,\n columnName: string,\n updates: ColumnUpdateRequest\n ) => this.columnResource.update(tableName, columnName, updates),\n delete: (tableName: string, columnName: string) =>\n this.columnResource.delete(tableName, columnName),\n };\n }\n\n // Direct index operations\n get indexes() {\n return {\n addIndex: (tableName: string, payload: AddIndexRequest) =>\n this.indexResource.addIndex(tableName, payload),\n listIndexes: (tableName: string, query: ListIndexesQuery) =>\n this.indexResource.listIndexes(tableName, query),\n deleteIndex: (tableName: string, indexName: string) =>\n this.indexResource.deleteIndex(tableName, indexName),\n };\n }\n\n // Fluent table operations\n table(name: string): TableBuilder {\n const tableBuilder = createTableBuilder({ name });\n return tableBuilder;\n }\n\n // Method 3: Table-scoped operations\n from(tableName: string) {\n return {\n // Column operations for this table\n columns: () => ({\n create: (column: FieldDefinition) =>\n this.columnResource.create(tableName, column),\n findAll: (options?: ColumnQueryOptions) =>\n this.columnResource.findAll(tableName, options),\n get: (columnName: string) =>\n this.columnResource.get(tableName, columnName),\n update: (columnName: string, updates: ColumnUpdateRequest) =>\n this.columnResource.update(tableName, columnName, updates),\n delete: (columnName: string) =>\n this.columnResource.delete(tableName, columnName),\n }),\n\n // Record operations for this table\n records: () => ({\n insert: (data: RecordData) =>\n this.recordResource.insert(tableName, data),\n insertMany: (\n records: RecordData[],\n options?: { validation?: boolean }\n ) => this.recordResource.insertMany(tableName, records, options),\n findOne: (recordId: string) =>\n this.recordResource.get(tableName, recordId),\n update: (options: RecordUpdateOptions) =>\n this.recordResource.update(tableName, options),\n updateById: (recordId: string, data: RecordData) =>\n this.recordResource.updateById(tableName, recordId, data),\n\n // Unified delete method\n delete: (options: RecordDeleteOptions) =>\n this.recordResource.delete(tableName, options),\n\n // Single record delete method\n deleteById: (recordId: string) =>\n this.recordResource.deleteById(tableName, recordId),\n }),\n\n // Fluent record builder for this table\n record: () =>\n createRecordBuilder({\n tableName,\n recordResource: this.recordResource,\n }),\n\n // Indexes - Method 2: Function chaining under from(tableName)\n indexes: () => ({\n addIndex: (payload: AddIndexRequest) =>\n this.indexResource.addIndex(tableName, payload),\n listIndexes: (query: ListIndexesQuery) =>\n this.indexResource.listIndexes(tableName, query),\n deleteIndex: (indexName: string) =>\n this.indexResource.deleteIndex(tableName, indexName),\n }),\n };\n }\n\n // Direct record operations\n get records() {\n return {\n insert: (tableName: string, data: RecordData) =>\n this.recordResource.insert(tableName, data),\n insertMany: (\n tableName: string,\n records: RecordData[],\n options?: { validation?: boolean }\n ) => this.recordResource.insertMany(tableName, records, options),\n findAll: (tableName: string, options?: RecordQueryOptions) =>\n this.recordResource.list(tableName, options),\n findOne: (tableName: string, recordId: string) =>\n this.recordResource.get(tableName, recordId),\n update: (tableName: string, options: RecordUpdateOptions) =>\n this.recordResource.update(tableName, options),\n updateById: (tableName: string, recordId: string, data: RecordData) =>\n this.recordResource.updateById(tableName, recordId, data),\n delete: (tableName: string, options: RecordDeleteOptions) =>\n this.recordResource.delete(tableName, options),\n deleteById: (tableName: string, recordId: string) =>\n this.recordResource.deleteById(tableName, recordId),\n };\n }\n\n // Method 4: Create fluent record builder\n record(tableName: string): RecordBuilder {\n return createRecordBuilder({\n tableName,\n recordResource: this.recordResource,\n });\n }\n\n // Direct SQL operations\n get sql() {\n return {\n textToSQL: (prompt: string, options?: TextToSQLOptions) =>\n this.sqlResource.textToSQL(prompt, options),\n executeSQL: (query: string) => this.sqlResource.executeSQL(query),\n };\n }\n\n // SQL resource access for testing\n getSqlResource(): SqlResource {\n return this.sqlResource;\n }\n\n // Configuration management\n updateApiKey(newApiKey: string): void {\n this.configManager.updateConfig({ apiKey: newApiKey });\n this.authManager.updateApiKey(newApiKey);\n }\n\n updateConfig(updates: Partial<ClientConfig>): void {\n this.configManager.updateConfig(updates);\n this.baseClient.updateConfig(this.configManager.getConfig());\n this.updateAllResourcesConfig();\n }\n\n getConfig(): ClientConfig {\n return this.configManager.getConfig();\n }\n\n // Authentication management\n async validateApiKey(): Promise<boolean> {\n return this.authManager.validateApiKeyAsync();\n }\n\n isAuthenticated(): boolean {\n return this.authManager.isAuthenticated();\n }\n\n // HTTP client access\n getHttpClient(): BaseClient {\n return this.baseClient;\n }\n\n // Interceptor management\n addRequestInterceptor(\n interceptor: (\n config: HttpRequestConfig\n ) => HttpRequestConfig | Promise<HttpRequestConfig>\n ): number {\n return this.baseClient.getInterceptors().request.use(interceptor);\n }\n\n addResponseInterceptor(\n onFulfilled?: (\n response: HttpResponse\n ) => HttpResponse | Promise<HttpResponse>,\n onRejected?: (error: unknown) => unknown\n ): number {\n return this.baseClient\n .getInterceptors()\n .response.use(onFulfilled, onRejected);\n }\n\n ejectRequestInterceptor(id: number): void {\n this.baseClient.getInterceptors().request.eject(id);\n }\n\n ejectResponseInterceptor(id: number): void {\n this.baseClient.getInterceptors().response.eject(id);\n }\n\n // Connection testing\n async testConnection(): Promise<boolean> {\n try {\n return await this.authManager.validateApiKeyAsync();\n } catch (error) {\n return false;\n }\n }\n\n // Get client version\n getVersion(): string {\n return '1.0.0';\n }\n\n // Environment helpers\n getEnvironment(): Environment {\n return this.configManager.getConfig().environment;\n }\n\n getRegion(): string {\n return this.configManager.getConfig().region;\n }\n\n // Debug helpers\n enableDebug(): void {\n this.configManager.updateConfig({ debug: true });\n this.baseClient.updateConfig(this.configManager.getConfig());\n this.updateAllResourcesConfig();\n }\n\n disableDebug(): void {\n this.configManager.updateConfig({ debug: false });\n this.baseClient.updateConfig(this.configManager.getConfig());\n this.updateAllResourcesConfig();\n }\n\n isDebugEnabled(): boolean {\n return this.configManager.getConfig().debug || false;\n }\n\n // Private method to update all resource configurations\n private updateAllResourcesConfig(): void {\n // Recreate all resources with updated config\n this.tableResource = new TableResource(this.baseClient);\n this.columnResource = new ColumnResource(this.baseClient);\n this.recordResource = new RecordResource(this.baseClient);\n this.sqlResource = new SqlResource(this.baseClient);\n this.indexResource = new IndexResource(this.baseClient);\n }\n\n // Security methods to prevent API key exposure\n toString(): string {\n const config = this.getConfig();\n return `BolticClient { environment: \"${config.environment}\", region: \"${config.region}\", debug: ${config.debug} }`;\n }\n\n toJSON(): object {\n const config = this.getConfig();\n return {\n environment: config.environment,\n region: config.region,\n debug: config.debug,\n timeout: config.timeout,\n version: this.getVersion(),\n };\n }\n\n // Custom inspect method for Node.js console logging\n [Symbol.for('nodejs.util.inspect.custom')](): string {\n return this.toString();\n }\n}\n","import { BolticClient, ClientOptions } from './boltic-client';\n\nexport function createClient(\n apiKey: string,\n options: ClientOptions = {}\n): BolticClient {\n return new BolticClient(apiKey, options);\n}\n\nexport type { Region } from '../types/config/environment';\nexport * from './core/auth-manager';\nexport * from './core/base-client';\nexport * from './core/base-resource';\nexport * from './core/config';\nexport * from './resources/record';\nexport * from './resources/record-builder';\nexport * from './resources/table';\nexport {\n createTableBuilder,\n TableBuilder,\n type TableBuilderOptions,\n} from './resources/table-builder';\nexport { BolticClient };\nexport type { ClientOptions };\n","// Main SDK exports - Boltic SDK for databases\nexport * from './auth';\nexport * from './errors';\n\n// Export databases module - Primary functionality\nexport { BolticClient, createClient } from './services/databases/src/client';\nexport type { ClientOptions, Region } from './services/databases/src/client';\n\n// Export response helpers - Essential for error handling\nexport {\n isErrorResponse,\n isListResponse,\n} from './services/databases/src/types/common/responses';\nexport type {\n ApiResponse,\n BolticErrorResponse,\n BolticListResponse,\n BolticSuccessResponse,\n} from './services/databases/src/types/common/responses';\n\n// Export common types\nexport type {\n FieldDefinition,\n FieldType,\n QueryOperator,\n RecordData,\n RecordWithId,\n TableCreateRequest,\n TableRecord,\n WhereCondition,\n} from './services/databases/src/types';\n\n// Version information\nexport const VERSION = '1.0.0';\n"],"names":["createErrorWithContext","getHttpStatusCode","formatError","AuthManager","buildEndpointPath","transformFieldDefinition"],"mappings":"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"}
|