@scarletdb/sdk 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +55 -65
- package/dist/index.d.mts +50 -73
- package/dist/index.d.ts +50 -73
- package/dist/index.js +234 -168
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +234 -169
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -3
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/client.ts","../src/modules/data.ts","../src/modules/storage.ts","../src/modules/email.ts","../src/modules/ai.ts","../src/modules/sql.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\r\n * Scarlet SDK - Error Classes\r\n */\r\n\r\nexport class ScarletError extends Error {\r\n public readonly status: number;\r\n public readonly code: string;\r\n public readonly details?: unknown;\r\n\r\n constructor(message: string, status: number, code: string, details?: unknown) {\r\n super(message);\r\n this.name = 'ScarletError';\r\n this.status = status;\r\n this.code = code;\r\n this.details = details;\r\n\r\n // Maintains proper stack trace for where error was thrown\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, ScarletError);\r\n }\r\n }\r\n\r\n toJSON() {\r\n return {\r\n name: this.name,\r\n message: this.message,\r\n status: this.status,\r\n code: this.code,\r\n details: this.details,\r\n };\r\n }\r\n}\r\n\r\nexport class NetworkError extends ScarletError {\r\n constructor(message: string, details?: unknown) {\r\n super(message, 0, 'NETWORK_ERROR', details);\r\n this.name = 'NetworkError';\r\n }\r\n}\r\n\r\nexport class AuthenticationError extends ScarletError {\r\n constructor(message = 'Invalid or missing API key') {\r\n super(message, 401, 'AUTHENTICATION_ERROR');\r\n this.name = 'AuthenticationError';\r\n }\r\n}\r\n\r\nexport class NotFoundError extends ScarletError {\r\n constructor(resource: string) {\r\n super(`${resource} not found`, 404, 'NOT_FOUND');\r\n this.name = 'NotFoundError';\r\n }\r\n}\r\n\r\nexport class ValidationError extends ScarletError {\r\n constructor(message: string, details?: unknown) {\r\n super(message, 400, 'VALIDATION_ERROR', details);\r\n this.name = 'ValidationError';\r\n }\r\n}\r\n\r\nexport class RateLimitError extends ScarletError {\r\n public readonly retryAfter?: number;\r\n\r\n constructor(retryAfter?: number) {\r\n super('Rate limit exceeded', 429, 'RATE_LIMIT');\r\n this.name = 'RateLimitError';\r\n this.retryAfter = retryAfter;\r\n }\r\n}\r\n","/**\r\n * Scarlet SDK - HTTP Client\r\n * Fetch-based HTTP client with error handling\r\n */\r\n\r\nimport {\r\n ScarletError,\r\n NetworkError,\r\n AuthenticationError,\r\n RateLimitError\r\n} from './errors';\r\nimport type { RequestOptions, APIResponse } from './types';\r\n\r\nexport interface ClientConfig {\r\n apiKey: string;\r\n baseUrl: string;\r\n timeout: number;\r\n}\r\n\r\nexport class HttpClient {\r\n private readonly config: ClientConfig;\r\n\r\n constructor(config: ClientConfig) {\r\n this.config = config;\r\n }\r\n\r\n async request<T>(options: RequestOptions): Promise<APIResponse<T>> {\r\n const { method, path, body, headers = {}, params } = options;\r\n\r\n // Build URL with query params\r\n let url = `${this.config.baseUrl}${path}`;\r\n if (params) {\r\n const searchParams = new URLSearchParams();\r\n Object.entries(params).forEach(([key, value]) => {\r\n if (value !== undefined) {\r\n searchParams.set(key, String(value));\r\n }\r\n });\r\n const queryString = searchParams.toString();\r\n if (queryString) {\r\n url += `?${queryString}`;\r\n }\r\n }\r\n\r\n // Setup headers\r\n const requestHeaders: Record<string, string> = {\r\n 'Authorization': `Bearer ${this.config.apiKey}`,\r\n 'Content-Type': 'application/json',\r\n 'Accept': 'application/json',\r\n ...headers,\r\n };\r\n\r\n // Create abort controller for timeout\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method,\r\n headers: requestHeaders,\r\n body: body ? JSON.stringify(body) : undefined,\r\n signal: controller.signal,\r\n });\r\n\r\n clearTimeout(timeoutId);\r\n\r\n // Parse response\r\n const contentType = response.headers.get('content-type');\r\n let data: T;\r\n\r\n if (contentType?.includes('application/json')) {\r\n data = await response.json() as T;\r\n } else {\r\n data = await response.text() as unknown as T;\r\n }\r\n\r\n // Handle errors\r\n if (!response.ok) {\r\n this.handleErrorResponse(response.status, data);\r\n }\r\n\r\n return {\r\n data,\r\n status: response.status,\r\n headers: response.headers,\r\n };\r\n } catch (error) {\r\n clearTimeout(timeoutId);\r\n\r\n if (error instanceof ScarletError) {\r\n throw error;\r\n }\r\n\r\n if (error instanceof Error) {\r\n if (error.name === 'AbortError') {\r\n throw new NetworkError(`Request timeout after ${this.config.timeout}ms`);\r\n }\r\n throw new NetworkError(error.message, error);\r\n }\r\n\r\n throw new NetworkError('Unknown network error');\r\n }\r\n }\r\n\r\n private handleErrorResponse(status: number, data: unknown): never {\r\n const errorData = data as { error?: string; message?: string; code?: string; details?: unknown };\r\n const message = errorData?.error || errorData?.message || 'Unknown error';\r\n const code = errorData?.code || 'UNKNOWN';\r\n const details = errorData?.details;\r\n\r\n switch (status) {\r\n case 401:\r\n throw new AuthenticationError(message);\r\n case 429:\r\n throw new RateLimitError();\r\n default:\r\n throw new ScarletError(message, status, code, details);\r\n }\r\n }\r\n\r\n // Convenience methods\r\n async get<T>(path: string, params?: Record<string, string | number | boolean | undefined>): Promise<T> {\r\n const response = await this.request<T>({ method: 'GET', path, params });\r\n return response.data;\r\n }\r\n\r\n async post<T>(path: string, body?: unknown): Promise<T> {\r\n const response = await this.request<T>({ method: 'POST', path, body });\r\n return response.data;\r\n }\r\n\r\n async patch<T>(path: string, body?: unknown): Promise<T> {\r\n const response = await this.request<T>({ method: 'PATCH', path, body });\r\n return response.data;\r\n }\r\n\r\n async put<T>(path: string, body?: unknown): Promise<T> {\r\n const response = await this.request<T>({ method: 'PUT', path, body });\r\n return response.data;\r\n }\r\n\r\n async delete<T>(path: string, body?: unknown): Promise<T> {\r\n const response = await this.request<T>({ method: 'DELETE', path, body });\r\n return response.data;\r\n }\r\n\r\n /**\r\n * Upload file using multipart/form-data\r\n */\r\n async upload<T>(path: string, file: Blob, fileName?: string): Promise<T> {\r\n const formData = new FormData();\r\n formData.append('file', file, fileName);\r\n\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout * 2); // Double timeout for uploads\r\n\r\n try {\r\n const response = await fetch(`${this.config.baseUrl}${path}`, {\r\n method: 'POST',\r\n headers: {\r\n 'Authorization': `Bearer ${this.config.apiKey}`,\r\n },\r\n body: formData,\r\n signal: controller.signal,\r\n });\r\n\r\n clearTimeout(timeoutId);\r\n\r\n const data = await response.json() as T;\r\n\r\n if (!response.ok) {\r\n this.handleErrorResponse(response.status, data);\r\n }\r\n\r\n return data;\r\n } catch (error) {\r\n clearTimeout(timeoutId);\r\n if (error instanceof ScarletError) throw error;\r\n throw new NetworkError('Upload failed', error);\r\n }\r\n }\r\n}\r\n","/**\r\n * Scarlet SDK - Data API Module\r\n * Fluent query builder for CRUD operations\r\n */\r\n\r\nimport type { HttpClient } from '../client';\r\nimport type {\r\n WhereCondition,\r\n OrderDirection,\r\n QueryResult,\r\n InsertResult,\r\n UpdateResult,\r\n DeleteResult\r\n} from '../types';\r\n\r\nexport class DataModule {\r\n constructor(private readonly client: HttpClient) { }\r\n\r\n /**\r\n * Start a query on a table\r\n */\r\n from<T = Record<string, unknown>>(table: string): QueryBuilder<T> {\r\n return new QueryBuilder<T>(this.client, table);\r\n }\r\n}\r\n\r\nexport class QueryBuilder<T = Record<string, unknown>> {\r\n private _columns: string[] = [];\r\n private _where: WhereCondition = {};\r\n private _orderBy?: { column: string; direction: OrderDirection };\r\n private _limit?: number;\r\n private _offset?: number;\r\n\r\n constructor(\r\n private readonly client: HttpClient,\r\n private readonly table: string\r\n ) { }\r\n\r\n /**\r\n * Select specific columns (default: all)\r\n */\r\n select(...columns: (keyof T & string)[]): this {\r\n this._columns = columns;\r\n return this;\r\n }\r\n\r\n /**\r\n * Add where conditions\r\n */\r\n where(conditions: Partial<{ [K in keyof T]: T[K] | WhereCondition[string] }>): this {\r\n this._where = { ...this._where, ...conditions } as WhereCondition;\r\n return this;\r\n }\r\n\r\n /**\r\n * Add equality condition\r\n */\r\n eq<K extends keyof T & string>(column: K, value: T[K]): this {\r\n this._where[column] = value as WhereCondition[string];\r\n return this;\r\n }\r\n\r\n /**\r\n * Order results\r\n */\r\n orderBy(column: keyof T & string, direction: OrderDirection = 'asc'): this {\r\n this._orderBy = { column, direction };\r\n return this;\r\n }\r\n\r\n /**\r\n * Limit results\r\n */\r\n limit(count: number): this {\r\n this._limit = count;\r\n return this;\r\n }\r\n\r\n /**\r\n * Offset results (for pagination)\r\n */\r\n offset(count: number): this {\r\n this._offset = count;\r\n return this;\r\n }\r\n\r\n /**\r\n * Execute SELECT query\r\n */\r\n async execute(): Promise<QueryResult<T>> {\r\n const params: Record<string, string | number | boolean | undefined> = {};\r\n\r\n if (this._limit !== undefined) params.limit = this._limit;\r\n if (this._offset !== undefined) params.offset = this._offset;\r\n if (this._orderBy) {\r\n params.sortBy = this._orderBy.column;\r\n params.sortDir = this._orderBy.direction;\r\n }\r\n if (Object.keys(this._where).length > 0) {\r\n params.search = JSON.stringify(this._where);\r\n }\r\n\r\n return this.client.get<QueryResult<T>>(\r\n `/tables/${this.table}/rows`,\r\n params\r\n );\r\n }\r\n\r\n /**\r\n * Execute and return all rows\r\n */\r\n async then<TResult = T[]>(\r\n resolve?: (value: T[]) => TResult | PromiseLike<TResult>\r\n ): Promise<TResult> {\r\n const result = await this.execute();\r\n const resolved = resolve ? resolve(result.rows) : result.rows as unknown as TResult;\r\n return resolved;\r\n }\r\n\r\n /**\r\n * Get single result (or null)\r\n */\r\n async single(): Promise<T | null> {\r\n this._limit = 1;\r\n const result = await this.execute();\r\n return result.rows[0] ?? null;\r\n }\r\n\r\n /**\r\n * Insert data\r\n */\r\n async insert(data: Partial<T> | Partial<T>[]): Promise<InsertResult<T>> {\r\n return this.client.post<InsertResult<T>>(\r\n `/tables/${this.table}/rows`,\r\n Array.isArray(data) ? { rows: data } : data\r\n );\r\n }\r\n\r\n /**\r\n * Update data (requires where clause)\r\n */\r\n async update(data: Partial<T>): Promise<UpdateResult> {\r\n if (Object.keys(this._where).length === 0) {\r\n throw new Error('Update requires at least one where condition for safety');\r\n }\r\n return this.client.patch<UpdateResult>(\r\n `/tables/${this.table}/rows`,\r\n { filters: this._where, data }\r\n );\r\n }\r\n\r\n /**\r\n * Delete data (requires where clause)\r\n */\r\n async delete(): Promise<DeleteResult> {\r\n if (Object.keys(this._where).length === 0) {\r\n throw new Error('Delete requires at least one where condition for safety');\r\n }\r\n return this.client.delete<DeleteResult>(\r\n `/tables/${this.table}/rows`,\r\n { filters: this._where }\r\n );\r\n }\r\n}\r\n","/**\r\n * Scarlet SDK - Storage Module\r\n * File storage operations\r\n */\r\n\r\nimport type { HttpClient } from '../client';\r\nimport type {\r\n StorageBucket,\r\n StorageFile,\r\n UploadOptions,\r\n ListFilesOptions\r\n} from '../types';\r\n\r\nexport class StorageModule {\r\n private readonly baseUrl: string;\r\n\r\n constructor(\r\n private readonly client: HttpClient,\r\n baseUrl: string\r\n ) {\r\n this.baseUrl = baseUrl;\r\n }\r\n\r\n /**\r\n * Create a new storage bucket\r\n */\r\n async createBucket(name: string, options?: { publicAccess?: boolean }): Promise<StorageBucket> {\r\n return this.client.post<StorageBucket>('/storage/buckets', {\r\n name,\r\n publicAccess: options?.publicAccess ?? false,\r\n });\r\n }\r\n\r\n /**\r\n * List all buckets\r\n */\r\n async listBuckets(): Promise<StorageBucket[]> {\r\n return this.client.get<StorageBucket[]>('/storage/buckets');\r\n }\r\n\r\n /**\r\n * Upload a file to a bucket\r\n */\r\n async upload(\r\n bucket: string,\r\n file: Blob | File,\r\n options?: UploadOptions\r\n ): Promise<StorageFile> {\r\n const fileName = options?.fileName || (file instanceof File ? file.name : 'file');\r\n return this.client.upload<StorageFile>(\r\n `/storage/buckets/${bucket}/upload`,\r\n file,\r\n fileName\r\n );\r\n }\r\n\r\n /**\r\n * List files in a bucket\r\n */\r\n async list(bucket: string, options?: ListFilesOptions): Promise<StorageFile[]> {\r\n const params: Record<string, string | number | undefined> = {};\r\n if (options?.limit) params.limit = options.limit;\r\n if (options?.offset) params.offset = options.offset;\r\n if (options?.prefix) params.prefix = options.prefix;\r\n\r\n return this.client.get<StorageFile[]>(`/storage/buckets/${bucket}/files`, params);\r\n }\r\n\r\n /**\r\n * Get a signed URL for private file access\r\n */\r\n async getSignedUrl(bucket: string, fileName: string): Promise<string> {\r\n const result = await this.client.get<{ url: string }>(\r\n `/storage/buckets/${bucket}/files/${encodeURIComponent(fileName)}/url`\r\n );\r\n return result.url;\r\n }\r\n\r\n /**\r\n * Get public URL for a file (bucket must be public)\r\n */\r\n getPublicUrl(bucket: string, fileName: string): string {\r\n return `${this.baseUrl}/storage/buckets/${bucket}/files/${encodeURIComponent(fileName)}`;\r\n }\r\n\r\n /**\r\n * Delete a file\r\n */\r\n async delete(bucket: string, fileName: string): Promise<{ success: boolean }> {\r\n return this.client.delete<{ success: boolean }>(\r\n `/storage/buckets/${bucket}/files/${encodeURIComponent(fileName)}`\r\n );\r\n }\r\n\r\n /**\r\n * Get storage statistics\r\n */\r\n async getStats(): Promise<{ size_bytes: number; object_count: number }> {\r\n return this.client.get<{ size_bytes: number; object_count: number }>('/storage/stats');\r\n }\r\n}\r\n","/**\r\n * Scarlet SDK - Email Module\r\n * Transactional email sending\r\n */\r\n\r\nimport type { HttpClient } from '../client';\r\nimport type { SendEmailOptions, EmailDomain, EmailLog } from '../types';\r\n\r\nexport class EmailModule {\r\n constructor(private readonly client: HttpClient) { }\r\n\r\n /**\r\n * Send a transactional email\r\n */\r\n async send(options: SendEmailOptions): Promise<{ success: boolean; messageId?: string }> {\r\n return this.client.post<{ success: boolean; messageId?: string }>('/email/send', options);\r\n }\r\n\r\n /**\r\n * Add a custom email domain\r\n */\r\n async addDomain(domain: string): Promise<EmailDomain> {\r\n const result = await this.client.post<{ domain: EmailDomain }>('/email/domains', { domain });\r\n return result.domain;\r\n }\r\n\r\n /**\r\n * List configured email domains\r\n */\r\n async listDomains(): Promise<EmailDomain[]> {\r\n const result = await this.client.get<{ domains: EmailDomain[] }>('/email/domains');\r\n return result.domains;\r\n }\r\n\r\n /**\r\n * Verify domain DNS records\r\n */\r\n async verifyDomain(domainId: string): Promise<{ verified: boolean; error?: string }> {\r\n return this.client.post<{ verified: boolean; error?: string }>(\r\n `/email/domains/${domainId}/verify`\r\n );\r\n }\r\n\r\n /**\r\n * Get email send logs\r\n */\r\n async getLogs(options?: { limit?: number }): Promise<EmailLog[]> {\r\n const params = options?.limit ? { limit: options.limit } : undefined;\r\n const result = await this.client.get<{ logs: EmailLog[] }>('/email/logs', params);\r\n return result.logs;\r\n }\r\n}\r\n","/**\r\n * Scarlet SDK - AI Module\r\n * Natural language query processing\r\n */\r\n\r\nimport type { HttpClient } from '../client';\r\nimport type { AIQueryResult } from '../types';\r\n\r\nexport class AIModule {\r\n constructor(private readonly client: HttpClient) { }\r\n\r\n /**\r\n * Execute a natural language query\r\n * Converts natural language to SQL and executes it\r\n * \r\n * @example\r\n * const result = await db.ai.query('Show me all users who signed up last week');\r\n * console.log(result.sql); // Generated SQL\r\n * console.log(result.rows); // Query results\r\n */\r\n async query(prompt: string): Promise<AIQueryResult> {\r\n return this.client.post<AIQueryResult>('/ai/query', { prompt });\r\n }\r\n\r\n /**\r\n * Generate SQL from natural language without executing\r\n */\r\n async generateSQL(prompt: string): Promise<{ sql: string; explanation: string }> {\r\n return this.client.post<{ sql: string; explanation: string }>('/ai/generate', { prompt });\r\n }\r\n}\r\n","/**\r\n * Scarlet SDK - SQL Module\r\n * Raw SQL query execution\r\n */\r\n\r\nimport type { HttpClient } from '../client';\r\nimport type { SQLResult } from '../types';\r\n\r\nexport class SQLModule {\r\n constructor(private readonly client: HttpClient) { }\r\n\r\n /**\r\n * Execute a parameterized SQL query\r\n * \r\n * @example\r\n * const result = await db.sql.query(\r\n * 'SELECT * FROM users WHERE created_at > $1',\r\n * [new Date('2024-01-01')]\r\n * );\r\n */\r\n async query<T = Record<string, unknown>>(\r\n sql: string,\r\n params: unknown[] = []\r\n ): Promise<SQLResult<T>> {\r\n return this.client.post<SQLResult<T>>('/query', { query: sql, params });\r\n }\r\n\r\n /**\r\n * Execute raw SQL without parameter binding\r\n * ⚠️ Use with caution - ensure input is sanitized\r\n */\r\n async unsafe<T = Record<string, unknown>>(sql: string): Promise<SQLResult<T>> {\r\n return this.client.post<SQLResult<T>>('/query', { query: sql, params: [] });\r\n }\r\n}\r\n\r\n/**\r\n * SQL template tag for parameterized queries\r\n * \r\n * @example\r\n * const userId = 123;\r\n * const result = await db.sql`SELECT * FROM users WHERE id = ${userId}`;\r\n */\r\nexport function createSqlTag(client: HttpClient) {\r\n return async function sql<T = Record<string, unknown>>(\r\n strings: TemplateStringsArray,\r\n ...values: unknown[]\r\n ): Promise<SQLResult<T>> {\r\n // Build parameterized query\r\n let query = '';\r\n const params: unknown[] = [];\r\n\r\n strings.forEach((str, i) => {\r\n query += str;\r\n if (i < values.length) {\r\n params.push(values[i]);\r\n query += `$${i + 1}`;\r\n }\r\n });\r\n\r\n return client.post<SQLResult<T>>('/query', { query, params });\r\n };\r\n}\r\n","/**\r\n * @scarletdb/sdk\r\n * Official TypeScript SDK for Scarlet DB\r\n * \r\n * @example\r\n * ```typescript\r\n * import { Scarlet } from '@scarletdb/sdk';\r\n * \r\n * const db = new Scarlet({ apiKey: 'sk_live_...' });\r\n * \r\n * // Query data\r\n * const users = await db.from('users').select().limit(10);\r\n * \r\n * // Storage\r\n * await db.storage.upload('avatars', file);\r\n * \r\n * // Email\r\n * await db.email.send({ from: '...', to: '...', subject: '...', html: '...' });\r\n * \r\n * // AI Query\r\n * const result = await db.ai.query('Show me active users');\r\n * \r\n * // Raw SQL\r\n * const result = await db.sql.query('SELECT * FROM users WHERE id = $1', [1]);\r\n * ```\r\n */\r\n\r\nimport { HttpClient } from './client';\r\nimport { DataModule, QueryBuilder } from './modules/data';\r\nimport { StorageModule } from './modules/storage';\r\nimport { EmailModule } from './modules/email';\r\nimport { AIModule } from './modules/ai';\r\nimport { SQLModule, createSqlTag } from './modules/sql';\r\nimport type { ScarletConfig, SQLResult } from './types';\r\n\r\n// Default configuration\r\nconst DEFAULT_BASE_URL = 'https://api.scarletdb.space/api/v1';\r\nconst DEFAULT_TIMEOUT = 30000;\r\n\r\n/**\r\n * Main Scarlet SDK client\r\n */\r\nexport class Scarlet {\r\n private readonly client: HttpClient;\r\n private readonly _data: DataModule;\r\n\r\n /** Storage module for file operations */\r\n public readonly storage: StorageModule;\r\n\r\n /** Email module for sending transactional emails */\r\n public readonly email: EmailModule;\r\n\r\n /** AI module for natural language queries */\r\n public readonly ai: AIModule;\r\n\r\n /** SQL module for raw queries */\r\n public readonly sql: SQLModule & {\r\n <T = Record<string, unknown>>(\r\n strings: TemplateStringsArray,\r\n ...values: unknown[]\r\n ): Promise<SQLResult<T>>;\r\n };\r\n\r\n constructor(config: ScarletConfig) {\r\n if (!config.apiKey) {\r\n throw new Error('API key is required');\r\n }\r\n\r\n const baseUrl = config.baseUrl || DEFAULT_BASE_URL;\r\n const timeout = config.timeout || DEFAULT_TIMEOUT;\r\n\r\n this.client = new HttpClient({\r\n apiKey: config.apiKey,\r\n baseUrl,\r\n timeout,\r\n });\r\n\r\n // Initialize modules\r\n this._data = new DataModule(this.client);\r\n this.storage = new StorageModule(this.client, baseUrl);\r\n this.email = new EmailModule(this.client);\r\n this.ai = new AIModule(this.client);\r\n\r\n // SQL module with template tag support\r\n const sqlModule = new SQLModule(this.client);\r\n const sqlTag = createSqlTag(this.client);\r\n\r\n // Merge module methods with template tag function\r\n this.sql = Object.assign(sqlTag, sqlModule) as typeof this.sql;\r\n }\r\n\r\n /**\r\n * Start a query on a table\r\n * \r\n * @example\r\n * const users = await db.from('users').select().where({ active: true }).limit(10);\r\n */\r\n from<T = Record<string, unknown>>(table: string): QueryBuilder<T> {\r\n return this._data.from<T>(table);\r\n }\r\n}\r\n\r\n// Re-export types\r\nexport * from './types';\r\nexport * from './errors';\r\nexport { QueryBuilder } from './modules/data';\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/client.ts","../src/modules/data.ts","../src/modules/storage.ts","../src/modules/email.ts","../src/modules/ai.ts","../src/dpop.ts","../src/index.ts"],"names":["created"],"mappings":";AAIO,IAAM,YAAA,GAAN,MAAM,aAAA,SAAqB,KAAA,CAAM;AAAA,EACpB,MAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EAEhB,WAAA,CAAY,OAAA,EAAiB,MAAA,EAAgB,IAAA,EAAc,OAAA,EAAmB;AAC1E,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAGf,IAAA,IAAI,MAAM,iBAAA,EAAmB;AACzB,MAAA,KAAA,CAAM,iBAAA,CAAkB,MAAM,aAAY,CAAA;AAAA,IAC9C;AAAA,EACJ;AAAA,EAEA,MAAA,GAAS;AACL,IAAA,OAAO;AAAA,MACH,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAS,IAAA,CAAK;AAAA,KAClB;AAAA,EACJ;AACJ;AAEO,IAAM,YAAA,GAAN,cAA2B,YAAA,CAAa;AAAA,EAC3C,WAAA,CAAY,SAAiB,OAAA,EAAmB;AAC5C,IAAA,KAAA,CAAM,OAAA,EAAS,CAAA,EAAG,eAAA,EAAiB,OAAO,CAAA;AAC1C,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AAAA,EAChB;AACJ;AAEO,IAAM,mBAAA,GAAN,cAAkC,YAAA,CAAa;AAAA,EAClD,WAAA,CAAY,UAAU,4BAAA,EAA8B;AAChD,IAAA,KAAA,CAAM,OAAA,EAAS,KAAK,sBAAsB,CAAA;AAC1C,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AAAA,EAChB;AACJ;AAEO,IAAM,aAAA,GAAN,cAA4B,YAAA,CAAa;AAAA,EAC5C,YAAY,QAAA,EAAkB;AAC1B,IAAA,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA,UAAA,CAAA,EAAc,GAAA,EAAK,WAAW,CAAA;AAC/C,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AAAA,EAChB;AACJ;AAEO,IAAM,eAAA,GAAN,cAA8B,YAAA,CAAa;AAAA,EAC9C,WAAA,CAAY,SAAiB,OAAA,EAAmB;AAC5C,IAAA,KAAA,CAAM,OAAA,EAAS,GAAA,EAAK,kBAAA,EAAoB,OAAO,CAAA;AAC/C,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EAChB;AACJ;AAEO,IAAM,cAAA,GAAN,cAA6B,YAAA,CAAa;AAAA,EAC7B,UAAA;AAAA,EAEhB,YAAY,UAAA,EAAqB;AAC7B,IAAA,KAAA,CAAM,qBAAA,EAAuB,KAAK,YAAY,CAAA;AAC9C,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AACZ,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,EACtB;AACJ;;;AClDO,IAAM,aAAN,MAAiB;AAAA,EACH,MAAA;AAAA,EAEjB,YAAY,MAAA,EAAsB;AAC9B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAClB;AAAA,EAEA,MAAM,QAAW,OAAA,EAAkD;AAC/D,IAAA,MAAM,EAAE,QAAQ,IAAA,EAAM,IAAA,EAAM,UAAU,EAAC,EAAG,QAAO,GAAI,OAAA;AAGrD,IAAA,IAAI,MAAM,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,OAAO,GAAG,IAAI,CAAA,CAAA;AACvC,IAAA,IAAI,MAAA,EAAQ;AACR,MAAA,MAAM,YAAA,GAAe,IAAI,eAAA,EAAgB;AACzC,MAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAC7C,QAAA,IAAI,UAAU,MAAA,EAAW;AACrB,UAAA,YAAA,CAAa,GAAA,CAAI,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QACvC;AAAA,MACJ,CAAC,CAAA;AACD,MAAA,MAAM,WAAA,GAAc,aAAa,QAAA,EAAS;AAC1C,MAAA,IAAI,WAAA,EAAa;AACb,QAAA,GAAA,IAAO,IAAI,WAAW,CAAA,CAAA;AAAA,MAC1B;AAAA,IACJ;AAEA,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,MAAA,CAAO,eAAe,EAAE,MAAA,EAAQ,KAAK,CAAA;AACpE,IAAA,MAAM,cAAA,GAAyC;AAAA,MAC3C,MAAA,EAAQ,kBAAA;AAAA,MACR,GAAG,WAAA;AAAA,MACH,GAAG;AAAA,KACP;AACA,IAAA,MAAM,UAAA,GAAa,OAAO,QAAA,KAAa,WAAA,IAAe,IAAA,YAAgB,QAAA;AACtE,IAAA,IAAI,IAAA,KAAS,MAAA,IAAa,CAAC,UAAA,EAAY;AACnC,MAAA,cAAA,CAAe,cAAc,CAAA,GAAI,cAAA,CAAe,cAAc,CAAA,IAAK,kBAAA;AAAA,IACvE;AAGA,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,SAAA,GAAY,WAAW,MAAM,UAAA,CAAW,OAAM,EAAG,IAAA,CAAK,OAAO,OAAO,CAAA;AAE1E,IAAA,IAAI;AACA,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAC9B,MAAA;AAAA,QACA,OAAA,EAAS,cAAA;AAAA,QACT,MAAM,IAAA,GACC,UAAA,GAAc,OAA+B,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GACjE,KAAA,CAAA;AAAA,QACN,QAAQ,UAAA,CAAW;AAAA,OACtB,CAAA;AAED,MAAA,YAAA,CAAa,SAAS,CAAA;AAGtB,MAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA;AACvD,MAAA,IAAI,IAAA;AAEJ,MAAA,IAAI,WAAA,EAAa,QAAA,CAAS,kBAAkB,CAAA,EAAG;AAC3C,QAAA,IAAA,GAAO,MAAM,SAAS,IAAA,EAAK;AAAA,MAC/B,CAAA,MAAO;AACH,QAAA,IAAA,GAAO,MAAM,SAAS,IAAA,EAAK;AAAA,MAC/B;AAGA,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AACd,QAAA,IAAA,CAAK,mBAAA,CAAoB,QAAA,CAAS,MAAA,EAAQ,IAAI,CAAA;AAAA,MAClD;AAEA,MAAA,OAAO;AAAA,QACH,IAAA;AAAA,QACA,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,SAAS,QAAA,CAAS;AAAA,OACtB;AAAA,IACJ,SAAS,KAAA,EAAO;AACZ,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,IAAI,iBAAiB,YAAA,EAAc;AAC/B,QAAA,MAAM,KAAA;AAAA,MACV;AAEA,MAAA,IAAI,iBAAiB,KAAA,EAAO;AACxB,QAAA,IAAI,KAAA,CAAM,SAAS,YAAA,EAAc;AAC7B,UAAA,MAAM,IAAI,YAAA,CAAa,CAAA,sBAAA,EAAyB,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,EAAA,CAAI,CAAA;AAAA,QAC3E;AACA,QAAA,MAAM,IAAI,YAAA,CAAa,KAAA,CAAM,OAAA,EAAS,KAAK,CAAA;AAAA,MAC/C;AAEA,MAAA,MAAM,IAAI,aAAa,uBAAuB,CAAA;AAAA,IAClD;AAAA,EACJ;AAAA,EAEQ,mBAAA,CAAoB,QAAgB,IAAA,EAAsB;AAC9D,IAAA,MAAM,SAAA,GAAY,IAAA;AAClB,IAAA,MAAM,OAAA,GAAU,SAAA,EAAW,KAAA,IAAS,SAAA,EAAW,OAAA,IAAW,eAAA;AAC1D,IAAA,MAAM,IAAA,GAAO,WAAW,IAAA,IAAQ,SAAA;AAChC,IAAA,MAAM,UAAU,SAAA,EAAW,OAAA;AAE3B,IAAA,QAAQ,MAAA;AAAQ,MACZ,KAAK,GAAA;AACD,QAAA,MAAM,IAAI,oBAAoB,OAAO,CAAA;AAAA,MACzC,KAAK,GAAA;AACD,QAAA,MAAM,IAAI,cAAA,EAAe;AAAA,MAC7B;AACI,QAAA,MAAM,IAAI,YAAA,CAAa,OAAA,EAAS,MAAA,EAAQ,MAAM,OAAO,CAAA;AAAA;AAC7D,EACJ;AAAA;AAAA,EAGA,MAAM,GAAA,CAAO,IAAA,EAAc,MAAA,EAAgE,OAAA,EAA8C;AACrI,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAW,EAAE,QAAQ,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,CAAA;AAC/E,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EACpB;AAAA,EAEA,MAAM,IAAA,CAAQ,IAAA,EAAc,IAAA,EAAgB,OAAA,EAA8C;AACtF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAW,EAAE,QAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,CAAA;AAC9E,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EACpB;AAAA,EAEA,MAAM,KAAA,CAAS,IAAA,EAAc,IAAA,EAAgB,OAAA,EAA8C;AACvF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAW,EAAE,QAAQ,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,CAAA;AAC/E,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EACpB;AAAA,EAEA,MAAM,GAAA,CAAO,IAAA,EAAc,IAAA,EAAgB,OAAA,EAA8C;AACrF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAW,EAAE,QAAQ,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,CAAA;AAC7E,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EACpB;AAAA,EAEA,MAAM,MAAA,CAAU,IAAA,EAAc,IAAA,EAAgB,OAAA,EAA8C;AACxF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAW,EAAE,QAAQ,QAAA,EAAU,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,CAAA;AAChF,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EACpB;AAAA,EAEA,MAAM,QAAA,CAAY,IAAA,EAAc,IAAA,EAA4B;AACxD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAW,EAAE,QAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,CAAA;AAC3E,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EACpB;AACJ,CAAA;;;AClIO,IAAM,aAAN,MAAiB;AAAA,EACpB,YAA6B,MAAA,EAAoB;AAApB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAsB;AAAA;AAAA;AAAA;AAAA,EAKnD,KAAkC,KAAA,EAAgC;AAC9D,IAAA,OAAO,IAAI,YAAA,CAAgB,IAAA,CAAK,MAAA,EAAQ,KAAK,CAAA;AAAA,EACjD;AACJ,CAAA;AAEO,IAAM,eAAN,MAAgD;AAAA,EAOnD,WAAA,CACqB,QACA,KAAA,EACnB;AAFmB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAAA,EACjB;AAAA,EATI,UAAoB,EAAC;AAAA,EACrB,WAA2B,EAAC;AAAA,EAC5B,KAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA;AAAA;AAAA;AAAA,EAUR,UAAU,OAAA,EAAqC;AAC3C,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,EAA8E;AAChF,IAAA,IAAA,CAAK,WAAW,EAAE,GAAG,IAAA,CAAK,QAAA,EAAU,GAAG,UAAA,EAAW;AAClD,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,EAAA,CAA+B,QAAW,KAAA,EAAmB;AACzD,IAAA,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,GAAI,KAAA;AACxB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,CAAQ,MAAA,EAA0B,SAAA,GAA4B,KAAA,EAAa;AACvE,IAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,MAAA,EAAQ,SAAA,EAAU;AACjC,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,KAAK,IAAA,EAAoB;AACrB,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,EAAqB;AACvB,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEQ,gBAAA,GAAmB;AACvB,IAAA,MAAM,SAAgE,EAAC;AAEvE,IAAA,MAAM,IAAA,GAAO,KAAK,KAAA,IAAS,CAAA;AAC3B,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,IAAU,MAAA;AAE7B,IAAA,MAAA,CAAO,IAAA,GAAO,IAAA;AACd,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,MAAA,CAAO,KAAA,GAAQ,KAAA;AAExC,IAAA,IAAI,KAAK,KAAA,EAAO;AACZ,MAAA,MAAA,CAAO,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,SAAA,KAAc,MAAA,GACjC,CAAA,CAAA,EAAI,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA,CAAA,GACrB,IAAA,CAAK,KAAA,CAAM,MAAA;AAAA,IACrB;AAEA,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AACzB,MAAA,MAAA,CAAO,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA;AAAA,IACzC;AAEA,IAAA,KAAA,MAAW,CAAC,OAAO,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA,EAAG;AACxD,MAAA,IAAI,UAAU,MAAA,EAAW;AACzB,MAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC7D,QAAA,KAAA,MAAW,CAAC,EAAA,EAAI,OAAO,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC/C,UAAA,MAAA,CAAO,UAAU,KAAK,CAAA,EAAA,EAAK,EAAE,CAAA,CAAA,CAAG,CAAA,GAAI,OAAO,OAAO,CAAA;AAAA,QACtD;AAAA,MACJ,CAAA,MAAO;AACH,QAAA,MAAA,CAAO,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA,CAAG,CAAA,GAAI,OAAO,KAAK,CAAA;AAAA,MAC7C;AAAA,IACJ;AAEA,IAAA,OAAO,MAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,GAAmC;AACrC,IAAA,MAAM,MAAA,GAAS,KAAK,gBAAA,EAAiB;AACrC,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,MAAA,CAAO,GAAA;AAAA,MAC1B,CAAA,CAAA,EAAI,KAAK,KAAK,CAAA,CAAA;AAAA,MACd;AAAA,KACJ;AACA,IAAA,MAAM,MAAA,GAAA,CAAA,CAAW,IAAI,IAAA,CAAK,IAAA,IAAQ,KAAK,CAAA,KAAM,GAAA,CAAI,KAAK,KAAA,IAAS,CAAA,CAAA;AAC/D,IAAA,OAAO;AAAA,MACH,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,KAAA,EAAO,IAAI,IAAA,CAAK,KAAA;AAAA,MAChB,KAAA,EAAO,IAAI,IAAA,CAAK,KAAA;AAAA,MAChB,MAAA;AAAA,MACA,OAAA,EAAS,GAAA,CAAI,IAAA,CAAK,IAAA,GAAO,IAAI,IAAA,CAAK;AAAA,KACtC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KACF,OAAA,EACgB;AAChB,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,EAAQ;AAClC,IAAA,MAAM,WAAW,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,IAAI,IAAI,MAAA,CAAO,IAAA;AACzD,IAAA,OAAO,QAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,GAA4B;AAC9B,IAAA,IAAA,CAAK,MAAA,GAAS,CAAA;AACd,IAAA,IAAA,CAAK,KAAA,GAAQ,CAAA;AACb,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,EAAQ;AAClC,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,IAAA,EAA2D;AACpE,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACrB,MAAA,MAAMA,WAAU,MAAM,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,IAAI,CAAC,GAAA,KAAQ,IAAA,CAAK,MAAA,CAAO,KAAkB,CAAA,CAAA,EAAI,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,GAAG,CAAC,CAAC,CAAA;AACzG,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAMA,QAAAA,CAAQ,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,EAAE;AAAA,IAC7D;AACA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,MAAA,CAAO,KAAkB,CAAA,CAAA,EAAI,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA;AAC1E,IAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,GAAA,EAAK,QAAQ,IAAA,EAAK;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,IAAA,EAAyC;AAClD,IAAA,MAAM,EAAA,GAAM,IAAA,CAAK,QAAA,CAAqC,IAAI,CAAA;AAC1D,IAAA,IAAI,CAAC,EAAA,EAAI;AACL,MAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,IAClD;AACA,IAAA,MAAM,KAAK,MAAA,CAAO,KAAA;AAAA,MACd,CAAA,CAAA,EAAI,KAAK,KAAK,CAAA,CAAA,EAAI,mBAAmB,MAAA,CAAO,EAAE,CAAC,CAAC,CAAA,CAAA;AAAA,MAChD;AAAA,KACJ;AACA,IAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,CAAA,EAAE;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,GAAgC;AAClC,IAAA,MAAM,EAAA,GAAM,IAAA,CAAK,QAAA,CAAqC,IAAI,CAAA;AAC1D,IAAA,IAAI,CAAC,EAAA,EAAI;AACL,MAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,IAClD;AACA,IAAA,MAAM,IAAA,CAAK,MAAA,CAAO,MAAA,CAA6B,CAAA,CAAA,EAAI,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,kBAAA,CAAmB,MAAA,CAAO,EAAE,CAAC,CAAC,CAAA,CAAE,CAAA;AACjG,IAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,CAAA,EAAE;AAAA,EACrC;AACJ;;;AC/LO,IAAM,gBAAN,MAAoB;AAAA,EACvB,WAAA,CACqB,QACA,SAAA,EACnB;AAFmB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKJ,MAAM,YAAA,CAAa,IAAA,EAAc,OAAA,EAA8D;AAC3F,IAAA,OAAO,KAAK,MAAA,CAAO,IAAA,CAAoB,CAAA,SAAA,EAAY,IAAA,CAAK,SAAS,CAAA,QAAA,CAAA,EAAY;AAAA,MACzE,IAAA;AAAA,MACA,YAAA,EAAc,SAAS,YAAA,IAAgB;AAAA,KAC1C,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,GAAwC;AAC1C,IAAA,OAAO,KAAK,MAAA,CAAO,GAAA,CAAqB,CAAA,SAAA,EAAY,IAAA,CAAK,SAAS,CAAA,QAAA,CAAU,CAAA;AAAA,EAChF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,CACF,MAAA,EACA,IAAA,EACA,OAAA,EACuF;AACvF,IAAA,MAAM,IAAA,GAAO,IAAI,QAAA,EAAS;AAC1B,IAAA,MAAM,WAAW,OAAA,EAAS,QAAA,KAAa,IAAA,YAAgB,IAAA,GAAO,KAAK,IAAA,GAAO,MAAA,CAAA;AAC1E,IAAA,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AAClC,IAAA,IAAI,OAAA,EAAS,aAAa,MAAA,EAAW,IAAA,CAAK,OAAO,UAAA,EAAY,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAC,CAAA;AACrF,IAAA,IAAI,OAAA,EAAS,kBAAkB,MAAA,EAAW,IAAA,CAAK,OAAO,eAAA,EAAiB,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAC,CAAA;AAEpG,IAAA,OAAO,KAAK,MAAA,CAAO,QAAA;AAAA,MACf,CAAA,SAAA,EAAY,IAAA,CAAK,SAAS,CAAA,SAAA,EAAY,MAAM,CAAA,OAAA,CAAA;AAAA,MAC5C;AAAA,KACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,CAAK,MAAA,EAAgB,OAAA,EAAoD;AAC3E,IAAA,MAAM,SAAsD,EAAC;AAC7D,IAAA,IAAI,OAAA,EAAS,KAAA,EAAO,MAAA,CAAO,KAAA,GAAQ,OAAA,CAAQ,KAAA;AAC3C,IAAA,IAAI,OAAA,EAAS,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,OAAA,CAAQ,MAAA;AAC7C,IAAA,IAAI,OAAA,EAAS,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,OAAA,CAAQ,MAAA;AAE7C,IAAA,OAAO,IAAA,CAAK,OAAO,GAAA,CAAmB,CAAA,SAAA,EAAY,KAAK,SAAS,CAAA,SAAA,EAAY,MAAM,CAAA,MAAA,CAAA,EAAU,MAAM,CAAA;AAAA,EACtG;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,CAAa,MAAA,EAAgB,QAAA,EAAmC;AAClE,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,GAAA;AAAA,MAC7B,CAAA,SAAA,EAAY,KAAK,SAAS,CAAA,SAAA,EAAY,MAAM,CAAA,OAAA,EAAU,kBAAA,CAAmB,QAAQ,CAAC,CAAA,IAAA;AAAA,KACtF;AACA,IAAA,OAAO,MAAA,CAAO,GAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,MAAA,CAAO,MAAA,EAAgB,QAAA,EAAiD;AAC1E,IAAA,OAAO,KAAK,MAAA,CAAO,MAAA;AAAA,MACf,CAAA,SAAA,EAAY,KAAK,SAAS,CAAA,SAAA,EAAY,MAAM,CAAA,OAAA,EAAU,kBAAA,CAAmB,QAAQ,CAAC,CAAA;AAAA,KACtF;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,GAAkE;AACpE,IAAA,OAAO,KAAK,MAAA,CAAO,GAAA,CAAkD,CAAA,SAAA,EAAY,IAAA,CAAK,SAAS,CAAA,MAAA,CAAQ,CAAA;AAAA,EAC3G;AACJ,CAAA;;;ACxFO,IAAM,cAAN,MAAkB;AAAA,EACrB,WAAA,CAA6B,QAAqC,SAAA,EAAmB;AAAxD,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAqC,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EAAqB;AAAA,EAE/E,OAAA,GAAU;AACd,IAAA,OAAO,EAAE,cAAA,EAAgB,IAAA,CAAK,SAAA,EAAU;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,OAAA,EAA8E;AACrF,IAAA,OAAO,KAAK,MAAA,CAAO,IAAA,CAA+C,eAAe,OAAA,EAAS,IAAA,CAAK,SAAS,CAAA;AAAA,EAC5G;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,MAAA,EAAsC;AAClD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAA8B,gBAAA,EAAkB,EAAE,MAAA,EAAO,EAAG,IAAA,CAAK,OAAA,EAAS,CAAA;AAC3G,IAAA,OAAO,MAAA,CAAO,MAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,GAAsC;AACxC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,IAAgC,gBAAA,EAAkB,MAAA,EAAW,IAAA,CAAK,OAAA,EAAS,CAAA;AAC5G,IAAA,OAAO,MAAA,CAAO,OAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,QAAA,EAAkE;AACjF,IAAA,OAAO,KAAK,MAAA,CAAO,IAAA;AAAA,MACf,kBAAkB,QAAQ,CAAA,OAAA,CAAA;AAAA,MAC1B,EAAC;AAAA,MACD,KAAK,OAAA;AAAQ,KACjB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,OAAA,EAAmD;AAC7D,IAAA,MAAM,SAAS,OAAA,EAAS,KAAA,GAAQ,EAAE,KAAA,EAAO,OAAA,CAAQ,OAAM,GAAI,MAAA;AAC3D,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,IAA0B,aAAA,EAAe,MAAA,EAAQ,IAAA,CAAK,OAAA,EAAS,CAAA;AAChG,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAClB;AACJ,CAAA;;;ACjDO,IAAM,WAAN,MAAe;AAAA,EAClB,WAAA,CAA6B,QAAqC,SAAA,EAAmB;AAAxD,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAqC,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWvF,MAAM,MAAM,MAAA,EAAwC;AAChD,IAAA,OAAO,IAAA,CAAK,OAAO,IAAA,CAAoB,CAAA,IAAA,EAAO,KAAK,SAAS,CAAA,MAAA,CAAA,EAAU,EAAE,MAAA,EAAQ,CAAA;AAAA,EACpF;AAAA,EAEA,MAAM,YAAY,MAAA,EAA+D;AAC7E,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AACtC,IAAA,OAAO,EAAE,GAAA,EAAK,MAAA,CAAO,GAAA,EAAK,WAAA,EAAa,OAAO,WAAA,EAAY;AAAA,EAC9D;AACJ,CAAA;;;AC5BA,SAAS,gBAAgB,IAAA,EAAkB;AACvC,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAA,EAAK,GAAA,IAAO,MAAA,CAAO,YAAA,CAAa,IAAA,CAAK,CAAC,CAAC,CAAA;AACxE,EAAA,MAAM,GAAA,GAAM,OAAO,IAAA,KAAS,WAAA,GACtB,IAAA,CAAK,GAAG,CAAA,GACR,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,QAAA,CAAS,QAAQ,CAAA;AACzC,EAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AACvE;AAEA,SAAS,oBAAoB,KAAA,EAAgB;AACzC,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AACjC,EAAA,MAAM,KAAA,GAAQ,IAAI,WAAA,EAAY,CAAE,OAAO,IAAI,CAAA;AAC3C,EAAA,OAAO,gBAAgB,KAAK,CAAA;AAChC;AAEA,SAAS,QAAA,GAAW;AAChB,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,EAAE,CAAA;AAC/B,EAAA,MAAA,CAAO,gBAAgB,KAAK,CAAA;AAC5B,EAAA,OAAO,MAAM,IAAA,CAAK,KAAK,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,CAAS,EAAE,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AAChF;AAOA,eAAsB,aAAA,GAAkC;AACpD,EAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,MAAA,CAAO,WAAA;AAAA,IAChC,EAAE,IAAA,EAAM,OAAA,EAAS,UAAA,EAAY,OAAA,EAAQ;AAAA,IACrC,IAAA;AAAA,IACA,CAAC,QAAQ,QAAQ;AAAA,GACrB;AACA,EAAA,MAAM,YAAY,MAAM,MAAA,CAAO,OAAO,SAAA,CAAU,KAAA,EAAO,QAAQ,SAAS,CAAA;AACxE,EAAA,OAAO,EAAE,SAAS,SAAA,EAAU;AAChC;AAEA,eAAsB,gBAAgB,MAAA,EAAiE;AACnG,EAAA,MAAM,MAAA,GAAS;AAAA,IACX,GAAA,EAAK,UAAA;AAAA,IACL,GAAA,EAAK,OAAA;AAAA,IACL,GAAA,EAAK,MAAM,MAAA,CAAO,MAAA,CAAO,UAAU,KAAA,EAAO,MAAA,CAAO,QAAQ,SAAS;AAAA,GACtE;AACA,EAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AACxC,EAAA,MAAM,OAAA,GAAU;AAAA,IACZ,GAAA,EAAK,MAAA,CAAO,MAAA,CAAO,WAAA,EAAY;AAAA,IAC/B,KAAK,IAAI,GAAA,CAAI,MAAA,CAAO,GAAG,EAAE,QAAA,EAAS;AAAA,IAClC,GAAA,EAAK,GAAA;AAAA,IACL,KAAK,QAAA,EAAS;AAAA,IACd,GAAA,EAAK,cAAA;AAAA,IACL,GAAA,EAAK;AAAA,GACT;AAEA,EAAA,MAAM,aAAA,GAAgB,oBAAoB,MAAM,CAAA;AAChD,EAAA,MAAM,cAAA,GAAiB,oBAAoB,OAAO,CAAA;AAClD,EAAA,MAAM,YAAA,GAAe,CAAA,EAAG,aAAa,CAAA,CAAA,EAAI,cAAc,CAAA,CAAA;AACvD,EAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,MAAA,CAAO,IAAA;AAAA,IAClC,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAA,EAAU;AAAA,IACjC,OAAO,OAAA,CAAQ,UAAA;AAAA,IACf,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,YAAY;AAAA,GACzC;AACA,EAAA,OAAO,CAAA,EAAG,YAAY,CAAA,CAAA,EAAI,eAAA,CAAgB,IAAI,UAAA,CAAW,SAAS,CAAC,CAAC,CAAA,CAAA;AACxE;;;AC1BA,IAAM,WAAA,GAAc,6BAAA;AACpB,IAAM,eAAA,GAAkB,GAAA;AAKjB,IAAM,UAAN,MAAc;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA;AAAA,EAGD,OAAA;AAAA;AAAA,EAGA,KAAA;AAAA;AAAA,EAGA,EAAA;AAAA,EACA,SAAA;AAAA,EAEhB,YAAY,MAAA,EAAuB;AAC/B,IAAA,IAAI,CAAC,MAAA,CAAO,SAAA,EAAW,MAAM,IAAI,MAAM,uBAAuB,CAAA;AAC9D,IAAA,IAAA,CAAK,YAAY,MAAA,CAAO,SAAA;AAExB,IAAA,MAAM,GAAA,GAAM,OAAO,GAAA,IAAO,WAAA;AAC1B,IAAA,MAAM,WAAA,GAAc,IAAI,MAAA,CAAO,OAAA,IAAW,KAAK,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,OAAA,CAAA;AACjE,IAAA,MAAM,aAAA,GAAgB,CAAA,EAAA,CAAI,MAAA,CAAO,SAAA,IAAa,GAAA,EAAK,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,QAAA,EAAW,IAAA,CAAK,SAAS,CAAA,CAAA;AAC9F,IAAA,MAAM,OAAA,GAAU,OAAO,OAAA,IAAW,eAAA;AAElC,IAAA,MAAM,UAAA,GAAmD,EAAE,KAAA,EAAO,EAAA,EAAI,WAAW,CAAA,EAAE;AACnF,IAAA,IAAI,OAAA,GAA0B,IAAA;AAE9B,IAAA,MAAM,WAAW,YAAY;AACzB,MAAA,IAAI,MAAA,CAAO,KAAA,EAAO,OAAO,MAAA,CAAO,KAAA;AAChC,MAAA,IAAI,MAAA,CAAO,QAAA,EAAU,OAAO,MAAA,CAAO,QAAA,EAAS;AAC5C,MAAA,IAAI,OAAO,aAAA,IAAiB,MAAA,CAAO,cAAA,IAAkB,CAAC,OAAO,MAAA,EAAQ;AACjE,QAAA,MAAM,QAAA,GAAW,MAAA,CAAO,aAAA,KAAkB,MAAA,CAAO,iBAAiB,yBAAA,GAA4B,iBAAA,CAAA;AAC9F,QAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,QAAA,IAAI,UAAA,CAAW,KAAA,IAAS,UAAA,CAAW,SAAA,GAAY,MAAM,GAAA,EAAQ;AACzD,UAAA,OAAO,UAAA,CAAW,KAAA;AAAA,QACtB;AACA,QAAA,IAAI,MAAA,CAAO,UAAA,IAAc,CAAC,OAAA,EAAS;AAC/B,UAAA,OAAA,GAAU,MAAM,aAAA,EAAc;AAAA,QAClC;AACA,QAAA,MAAM,MAAM,MAAM,KAAA,CAAM,GAAG,WAAW,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI;AAAA,UACjD,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS;AAAA,YACL,cAAA,EAAgB,kBAAA;AAAA,YAChB,GAAI,OAAO,cAAA,GAAiB,EAAE,qBAAqB,MAAA,CAAO,cAAA,KAAmB;AAAC,WAClF;AAAA,UACA,WAAA,EAAa,MAAA,CAAO,cAAA,GAAiB,MAAA,GAAS,SAAA;AAAA,UAC9C,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,YACjB,WAAW,IAAA,CAAK,SAAA;AAAA,YAChB,SAAS,OAAA,EAAS;AAAA,WACrB;AAAA,SACJ,CAAA;AACD,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AAC9C,QAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACT,UAAA,MAAM,IAAI,OAAO,OAAO,IAAA,CAAK,UAAU,QAAA,GAAW,IAAA,CAAK,KAAA,GAAQ,EAAA,KAAO,uBAAuB,CAAA;AAAA,QACjG;AACA,QAAA,UAAA,CAAW,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,KAAA,IAAS,EAAE,CAAA;AAC1C,QAAA,UAAA,CAAW,SAAA,GAAY,KAAK,GAAA,EAAI,GAAI,OAAO,IAAA,CAAK,SAAA,IAAa,CAAC,CAAA,GAAI,GAAA;AAClE,QAAA,OAAO,UAAA,CAAW,KAAA;AAAA,MACtB;AACA,MAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,IAC3D,CAAA;AAEA,IAAA,MAAM,cAAA,GAAiB,OAAO,MAAA,KAA4C;AACtE,MAAA,IAAI,OAAO,MAAA,EAAQ;AACf,QAAA,OAAO,EAAE,WAAA,EAAa,MAAA,CAAO,MAAA,EAAO;AAAA,MACxC;AACA,MAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,EAAS;AAC7B,MAAA,MAAM,OAAA,GAAkC,EAAE,aAAA,EAAe,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA,EAAG;AAC3E,MAAA,IAAI,OAAO,UAAA,EAAY;AACnB,QAAA,IAAI,CAAC,OAAA,EAAS,OAAA,GAAU,MAAM,aAAA,EAAc;AAC5C,QAAA,OAAA,CAAQ,MAAM,CAAA,GAAI,MAAM,eAAA,CAAgB,EAAE,OAAA,EAAS,OAAA,CAAQ,OAAA,EAAS,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAQ,GAAA,EAAK,MAAA,CAAO,KAAK,CAAA;AAAA,MAChH;AACA,MAAA,OAAO,OAAA;AAAA,IACX,CAAA;AAGA,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,UAAA,CAAW,EAAE,SAAS,aAAA,EAAe,OAAA,EAAS,gBAAgB,CAAA;AACtF,IAAA,IAAA,CAAK,UAAA,GAAa,IAAI,UAAA,CAAW,EAAE,SAAS,WAAA,EAAa,OAAA,EAAS,gBAAgB,CAAA;AAElF,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,UAAA,CAAW,IAAA,CAAK,YAAY,CAAA;AAC7C,IAAA,IAAA,CAAK,UAAU,IAAI,aAAA,CAAc,IAAA,CAAK,UAAA,EAAY,KAAK,SAAS,CAAA;AAChE,IAAA,IAAA,CAAK,QAAQ,IAAI,WAAA,CAAY,IAAA,CAAK,UAAA,EAAY,KAAK,SAAS,CAAA;AAC5D,IAAA,IAAA,CAAK,KAAK,IAAI,QAAA,CAAS,IAAA,CAAK,UAAA,EAAY,KAAK,SAAS,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,KAAkC,KAAA,EAAgC;AAC9D,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAQ,KAAK,CAAA;AAAA,EACnC;AACJ;AAEO,SAAS,cAAc,MAAA,EAAuB;AACjD,EAAA,OAAO,IAAI,QAAQ,MAAM,CAAA;AAC7B","file":"index.mjs","sourcesContent":["/**\r\n * Scarlet SDK - Error Classes\r\n */\r\n\r\nexport class ScarletError extends Error {\r\n public readonly status: number;\r\n public readonly code: string;\r\n public readonly details?: unknown;\r\n\r\n constructor(message: string, status: number, code: string, details?: unknown) {\r\n super(message);\r\n this.name = 'ScarletError';\r\n this.status = status;\r\n this.code = code;\r\n this.details = details;\r\n\r\n // Maintains proper stack trace for where error was thrown\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, ScarletError);\r\n }\r\n }\r\n\r\n toJSON() {\r\n return {\r\n name: this.name,\r\n message: this.message,\r\n status: this.status,\r\n code: this.code,\r\n details: this.details,\r\n };\r\n }\r\n}\r\n\r\nexport class NetworkError extends ScarletError {\r\n constructor(message: string, details?: unknown) {\r\n super(message, 0, 'NETWORK_ERROR', details);\r\n this.name = 'NetworkError';\r\n }\r\n}\r\n\r\nexport class AuthenticationError extends ScarletError {\r\n constructor(message = 'Invalid or missing API key') {\r\n super(message, 401, 'AUTHENTICATION_ERROR');\r\n this.name = 'AuthenticationError';\r\n }\r\n}\r\n\r\nexport class NotFoundError extends ScarletError {\r\n constructor(resource: string) {\r\n super(`${resource} not found`, 404, 'NOT_FOUND');\r\n this.name = 'NotFoundError';\r\n }\r\n}\r\n\r\nexport class ValidationError extends ScarletError {\r\n constructor(message: string, details?: unknown) {\r\n super(message, 400, 'VALIDATION_ERROR', details);\r\n this.name = 'ValidationError';\r\n }\r\n}\r\n\r\nexport class RateLimitError extends ScarletError {\r\n public readonly retryAfter?: number;\r\n\r\n constructor(retryAfter?: number) {\r\n super('Rate limit exceeded', 429, 'RATE_LIMIT');\r\n this.name = 'RateLimitError';\r\n this.retryAfter = retryAfter;\r\n }\r\n}\r\n","/**\r\n * Scarlet SDK - HTTP Client\r\n * Fetch-based HTTP client with error handling\r\n */\r\n\r\nimport {\r\n ScarletError,\r\n NetworkError,\r\n AuthenticationError,\r\n RateLimitError\r\n} from './errors';\r\nimport type { RequestOptions, APIResponse } from './types';\r\n\r\nexport interface ClientConfig {\r\n baseUrl: string;\r\n timeout: number;\r\n getAuthHeaders: (params: { method: string; url: string }) => Promise<Record<string, string>>;\r\n}\r\n\r\nexport class HttpClient {\r\n private readonly config: ClientConfig;\r\n\r\n constructor(config: ClientConfig) {\r\n this.config = config;\r\n }\r\n\r\n async request<T>(options: RequestOptions): Promise<APIResponse<T>> {\r\n const { method, path, body, headers = {}, params } = options;\r\n\r\n // Build URL with query params\r\n let url = `${this.config.baseUrl}${path}`;\r\n if (params) {\r\n const searchParams = new URLSearchParams();\r\n Object.entries(params).forEach(([key, value]) => {\r\n if (value !== undefined) {\r\n searchParams.set(key, String(value));\r\n }\r\n });\r\n const queryString = searchParams.toString();\r\n if (queryString) {\r\n url += `?${queryString}`;\r\n }\r\n }\r\n\r\n const authHeaders = await this.config.getAuthHeaders({ method, url });\r\n const requestHeaders: Record<string, string> = {\r\n Accept: 'application/json',\r\n ...authHeaders,\r\n ...headers,\r\n };\r\n const isFormData = typeof FormData !== 'undefined' && body instanceof FormData;\r\n if (body !== undefined && !isFormData) {\r\n requestHeaders['Content-Type'] = requestHeaders['Content-Type'] || 'application/json';\r\n }\r\n\r\n // Create abort controller for timeout\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method,\r\n headers: requestHeaders,\r\n body: body\r\n ? (isFormData ? (body as unknown as BodyInit) : JSON.stringify(body))\r\n : undefined,\r\n signal: controller.signal,\r\n });\r\n\r\n clearTimeout(timeoutId);\r\n\r\n // Parse response\r\n const contentType = response.headers.get('content-type');\r\n let data: T;\r\n\r\n if (contentType?.includes('application/json')) {\r\n data = await response.json() as T;\r\n } else {\r\n data = await response.text() as unknown as T;\r\n }\r\n\r\n // Handle errors\r\n if (!response.ok) {\r\n this.handleErrorResponse(response.status, data);\r\n }\r\n\r\n return {\r\n data,\r\n status: response.status,\r\n headers: response.headers,\r\n };\r\n } catch (error) {\r\n clearTimeout(timeoutId);\r\n\r\n if (error instanceof ScarletError) {\r\n throw error;\r\n }\r\n\r\n if (error instanceof Error) {\r\n if (error.name === 'AbortError') {\r\n throw new NetworkError(`Request timeout after ${this.config.timeout}ms`);\r\n }\r\n throw new NetworkError(error.message, error);\r\n }\r\n\r\n throw new NetworkError('Unknown network error');\r\n }\r\n }\r\n\r\n private handleErrorResponse(status: number, data: unknown): never {\r\n const errorData = data as { error?: string; message?: string; code?: string; details?: unknown };\r\n const message = errorData?.error || errorData?.message || 'Unknown error';\r\n const code = errorData?.code || 'UNKNOWN';\r\n const details = errorData?.details;\r\n\r\n switch (status) {\r\n case 401:\r\n throw new AuthenticationError(message);\r\n case 429:\r\n throw new RateLimitError();\r\n default:\r\n throw new ScarletError(message, status, code, details);\r\n }\r\n }\r\n\r\n // Convenience methods\r\n async get<T>(path: string, params?: Record<string, string | number | boolean | undefined>, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.request<T>({ method: 'GET', path, params, headers });\r\n return response.data;\r\n }\r\n\r\n async post<T>(path: string, body?: unknown, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.request<T>({ method: 'POST', path, body, headers });\r\n return response.data;\r\n }\r\n\r\n async patch<T>(path: string, body?: unknown, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.request<T>({ method: 'PATCH', path, body, headers });\r\n return response.data;\r\n }\r\n\r\n async put<T>(path: string, body?: unknown, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.request<T>({ method: 'PUT', path, body, headers });\r\n return response.data;\r\n }\r\n\r\n async delete<T>(path: string, body?: unknown, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.request<T>({ method: 'DELETE', path, body, headers });\r\n return response.data;\r\n }\r\n\r\n async postForm<T>(path: string, form: FormData): Promise<T> {\r\n const response = await this.request<T>({ method: 'POST', path, body: form });\r\n return response.data;\r\n }\r\n}\r\n","/**\r\n * Scarlet SDK - Data API Module\r\n * Fluent query builder for CRUD operations\r\n */\r\n\r\nimport type { HttpClient } from '../client';\r\nimport type {\r\n WhereCondition,\r\n OrderDirection,\r\n QueryResult,\r\n InsertResult,\r\n UpdateResult,\r\n DeleteResult\r\n} from '../types';\r\n\r\ntype DynamicListResponse<T> = {\r\n data: T[];\r\n meta: {\r\n total: number;\r\n page: number;\r\n limit: number;\r\n totalPages: number;\r\n };\r\n};\r\n\r\nexport class DataModule {\r\n constructor(private readonly client: HttpClient) { }\r\n\r\n /**\r\n * Start a query on a table\r\n */\r\n from<T = Record<string, unknown>>(table: string): QueryBuilder<T> {\r\n return new QueryBuilder<T>(this.client, table);\r\n }\r\n}\r\n\r\nexport class QueryBuilder<T = Record<string, unknown>> {\r\n private _fields: string[] = [];\r\n private _filters: WhereCondition = {};\r\n private _sort?: { column: string; direction: OrderDirection };\r\n private _page?: number;\r\n private _limit?: number;\r\n\r\n constructor(\r\n private readonly client: HttpClient,\r\n private readonly table: string\r\n ) { }\r\n\r\n /**\r\n * Select specific columns (default: all)\r\n */\r\n select(...columns: (keyof T & string)[]): this {\r\n this._fields = columns;\r\n return this;\r\n }\r\n\r\n /**\r\n * Add where conditions\r\n */\r\n where(conditions: Partial<{ [K in keyof T]: T[K] | WhereCondition[string] }>): this {\r\n this._filters = { ...this._filters, ...conditions } as WhereCondition;\r\n return this;\r\n }\r\n\r\n /**\r\n * Add equality condition\r\n */\r\n eq<K extends keyof T & string>(column: K, value: T[K]): this {\r\n this._filters[column] = value as WhereCondition[string];\r\n return this;\r\n }\r\n\r\n /**\r\n * Order results\r\n */\r\n orderBy(column: keyof T & string, direction: OrderDirection = 'asc'): this {\r\n this._sort = { column, direction };\r\n return this;\r\n }\r\n\r\n page(page: number): this {\r\n this._page = page;\r\n return this;\r\n }\r\n\r\n /**\r\n * Limit results\r\n */\r\n limit(count: number): this {\r\n this._limit = count;\r\n return this;\r\n }\r\n\r\n private buildQueryParams() {\r\n const params: Record<string, string | number | boolean | undefined> = {};\r\n\r\n const page = this._page ?? 1;\r\n const limit = this._limit ?? undefined;\r\n\r\n params.page = page;\r\n if (limit !== undefined) params.limit = limit;\r\n\r\n if (this._sort) {\r\n params.sort = this._sort.direction === 'desc'\r\n ? `-${this._sort.column}`\r\n : this._sort.column;\r\n }\r\n\r\n if (this._fields.length > 0) {\r\n params.fields = this._fields.join(',');\r\n }\r\n\r\n for (const [field, value] of Object.entries(this._filters)) {\r\n if (value === undefined) continue;\r\n if (value && typeof value === 'object' && !Array.isArray(value)) {\r\n for (const [op, opValue] of Object.entries(value)) {\r\n params[`filter[${field}][${op}]`] = String(opValue);\r\n }\r\n } else {\r\n params[`filter[${field}]`] = String(value);\r\n }\r\n }\r\n\r\n return params;\r\n }\r\n\r\n /**\r\n * Execute SELECT query\r\n */\r\n async execute(): Promise<QueryResult<T>> {\r\n const params = this.buildQueryParams();\r\n const res = await this.client.get<DynamicListResponse<T>>(\r\n `/${this.table}`,\r\n params\r\n );\r\n const offset = ((res.meta.page || 1) - 1) * (res.meta.limit || 0);\r\n return {\r\n rows: res.data,\r\n total: res.meta.total,\r\n limit: res.meta.limit,\r\n offset,\r\n hasMore: res.meta.page < res.meta.totalPages,\r\n };\r\n }\r\n\r\n /**\r\n * Execute and return all rows\r\n */\r\n async then<TResult = T[]>(\r\n resolve?: (value: T[]) => TResult | PromiseLike<TResult>\r\n ): Promise<TResult> {\r\n const result = await this.execute();\r\n const resolved = resolve ? resolve(result.rows) : result.rows as unknown as TResult;\r\n return resolved;\r\n }\r\n\r\n /**\r\n * Get single result (or null)\r\n */\r\n async single(): Promise<T | null> {\r\n this._limit = 1;\r\n this._page = 1;\r\n const result = await this.execute();\r\n return result.rows[0] ?? null;\r\n }\r\n\r\n /**\r\n * Insert data\r\n */\r\n async insert(data: Partial<T> | Partial<T>[]): Promise<InsertResult<T>> {\r\n if (Array.isArray(data)) {\r\n const created = await Promise.all(data.map((row) => this.client.post<{ data: T }>(`/${this.table}`, row)));\r\n return { success: true, rows: created.map((r) => r.data) };\r\n }\r\n const created = await this.client.post<{ data: T }>(`/${this.table}`, data);\r\n return { success: true, row: created.data };\r\n }\r\n\r\n /**\r\n * Update data (requires where clause)\r\n */\r\n async update(data: Partial<T>): Promise<UpdateResult> {\r\n const id = (this._filters as Record<string, unknown>)['id'];\r\n if (!id) {\r\n throw new Error('Update requires an id filter');\r\n }\r\n await this.client.patch<{ data: T }>(\r\n `/${this.table}/${encodeURIComponent(String(id))}`,\r\n data\r\n );\r\n return { success: true, count: 1 };\r\n }\r\n\r\n /**\r\n * Delete data (requires where clause)\r\n */\r\n async delete(): Promise<DeleteResult> {\r\n const id = (this._filters as Record<string, unknown>)['id'];\r\n if (!id) {\r\n throw new Error('Delete requires an id filter');\r\n }\r\n await this.client.delete<{ deleted: boolean }>(`/${this.table}/${encodeURIComponent(String(id))}`);\r\n return { success: true, count: 1 };\r\n }\r\n}\r\n","/**\r\n * Scarlet SDK - Storage Module\r\n * File storage operations\r\n */\r\n\r\nimport type { HttpClient } from '../client';\r\nimport type {\r\n StorageBucket,\r\n StorageFile,\r\n UploadOptions,\r\n ListFilesOptions\r\n} from '../types';\r\n\r\nexport class StorageModule {\r\n constructor(\r\n private readonly client: HttpClient,\r\n private readonly projectId: string\n ) { }\n\r\n /**\r\n * Create a new storage bucket\r\n */\r\n async createBucket(name: string, options?: { publicAccess?: boolean }): Promise<StorageBucket> {\r\n return this.client.post<StorageBucket>(`/storage/${this.projectId}/buckets`, {\n name,\r\n publicAccess: options?.publicAccess ?? false,\r\n });\r\n }\r\n\r\n /**\r\n * List all buckets\r\n */\r\n async listBuckets(): Promise<StorageBucket[]> {\r\n return this.client.get<StorageBucket[]>(`/storage/${this.projectId}/buckets`);\n }\r\n\r\n /**\r\n * Upload a file to a bucket\r\n */\r\n async upload(\r\n bucket: string,\r\n file: Blob | File,\r\n options?: UploadOptions & { randomId?: boolean; cacheDuration?: number }\n ): Promise<{ fileId: string; url: string; key: string; bucket: string; fileName: string }> {\n const form = new FormData();\n const fileName = options?.fileName || (file instanceof File ? file.name : 'file');\n form.append('file', file, fileName);\n if (options?.randomId !== undefined) form.append('randomId', String(options.randomId));\n if (options?.cacheDuration !== undefined) form.append('cacheDuration', String(options.cacheDuration));\n\n return this.client.postForm(\n `/storage/${this.projectId}/buckets/${bucket}/upload`,\n form\n );\n }\r\n\r\n /**\r\n * List files in a bucket\r\n */\r\n async list(bucket: string, options?: ListFilesOptions): Promise<StorageFile[]> {\r\n const params: Record<string, string | number | undefined> = {};\r\n if (options?.limit) params.limit = options.limit;\r\n if (options?.offset) params.offset = options.offset;\r\n if (options?.prefix) params.prefix = options.prefix;\r\n\r\n return this.client.get<StorageFile[]>(`/storage/${this.projectId}/buckets/${bucket}/files`, params);\n }\r\n\r\n /**\r\n * Get a signed URL for private file access\r\n */\r\n async getSignedUrl(bucket: string, fileName: string): Promise<string> {\r\n const result = await this.client.get<{ url: string }>(\r\n `/storage/${this.projectId}/buckets/${bucket}/files/${encodeURIComponent(fileName)}/url`\n );\r\n return result.url;\r\n }\r\n\r\n /**\r\n * Get public URL for a file (bucket must be public)\r\n */\r\n /**\r\n * Delete a file\r\n */\r\n async delete(bucket: string, fileName: string): Promise<{ success: boolean }> {\r\n return this.client.delete<{ success: boolean }>(\r\n `/storage/${this.projectId}/buckets/${bucket}/files/${encodeURIComponent(fileName)}`\n );\r\n }\r\n\r\n /**\r\n * Get storage statistics\r\n */\r\n async getStats(): Promise<{ size_bytes: number; object_count: number }> {\r\n return this.client.get<{ size_bytes: number; object_count: number }>(`/storage/${this.projectId}/stats`);\n }\r\n}\r\n","/**\r\n * Scarlet SDK - Email Module\r\n * Transactional email sending\r\n */\r\n\r\nimport type { HttpClient } from '../client';\r\nimport type { SendEmailOptions, EmailDomain, EmailLog } from '../types';\r\n\r\nexport class EmailModule {\r\n constructor(private readonly client: HttpClient, private readonly projectId: string) { }\n\n private headers() {\n return { 'x-project-id': this.projectId };\n }\n\r\n /**\r\n * Send a transactional email\r\n */\r\n async send(options: SendEmailOptions): Promise<{ success: boolean; messageId?: string }> {\r\n return this.client.post<{ success: boolean; messageId?: string }>('/email/send', options, this.headers());\n }\r\n\r\n /**\r\n * Add a custom email domain\r\n */\r\n async addDomain(domain: string): Promise<EmailDomain> {\r\n const result = await this.client.post<{ domain: EmailDomain }>('/email/domains', { domain }, this.headers());\n return result.domain;\r\n }\r\n\r\n /**\r\n * List configured email domains\r\n */\r\n async listDomains(): Promise<EmailDomain[]> {\r\n const result = await this.client.get<{ domains: EmailDomain[] }>('/email/domains', undefined, this.headers());\n return result.domains;\r\n }\r\n\r\n /**\r\n * Verify domain DNS records\r\n */\r\n async verifyDomain(domainId: string): Promise<{ verified: boolean; error?: string }> {\r\n return this.client.post<{ verified: boolean; error?: string }>(\r\n `/email/domains/${domainId}/verify`,\n {},\n this.headers()\n );\r\n }\r\n\r\n /**\r\n * Get email send logs\r\n */\r\n async getLogs(options?: { limit?: number }): Promise<EmailLog[]> {\r\n const params = options?.limit ? { limit: options.limit } : undefined;\r\n const result = await this.client.get<{ logs: EmailLog[] }>('/email/logs', params, this.headers());\n return result.logs;\r\n }\r\n}\r\n","/**\r\n * Scarlet SDK - AI Module\r\n * Natural language query processing\r\n */\r\n\r\nimport type { HttpClient } from '../client';\r\nimport type { AIQueryResult } from '../types';\r\n\r\nexport class AIModule {\r\n constructor(private readonly client: HttpClient, private readonly projectId: string) { }\n\r\n /**\r\n * Execute a natural language query\r\n * Converts natural language to SQL and executes it\r\n * \r\n * @example\r\n * const result = await db.ai.query('Show me all users who signed up last week');\r\n * console.log(result.sql); // Generated SQL\r\n * console.log(result.rows); // Query results\r\n */\r\n async query(prompt: string): Promise<AIQueryResult> {\r\n return this.client.post<AIQueryResult>(`/ai/${this.projectId}/query`, { prompt });\n }\r\n\r\n async generateSQL(prompt: string): Promise<{ sql: string; explanation: string }> {\n const result = await this.query(prompt);\n return { sql: result.sql, explanation: result.explanation };\n }\n}\r\n","function base64urlEncode(data: Uint8Array) {\n let str = '';\n for (let i = 0; i < data.length; i++) str += String.fromCharCode(data[i]);\n const b64 = typeof btoa !== 'undefined'\n ? btoa(str)\n : Buffer.from(data).toString('base64');\n return b64.replace(/=/g, '').replace(/\\+/g, '-').replace(/\\//g, '_');\n}\n\nfunction base64urlEncodeJson(value: unknown) {\n const json = JSON.stringify(value);\n const bytes = new TextEncoder().encode(json);\n return base64urlEncode(bytes);\n}\n\nfunction randomId() {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n return Array.from(bytes).map((b) => b.toString(16).padStart(2, '0')).join('');\n}\n\nexport type DpopKey = {\n keyPair: CryptoKeyPair;\n publicJwk: JsonWebKey;\n};\n\nexport async function createDpopKey(): Promise<DpopKey> {\n const keyPair = await crypto.subtle.generateKey(\n { name: 'ECDSA', namedCurve: 'P-256' },\n true,\n ['sign', 'verify']\n );\n const publicJwk = await crypto.subtle.exportKey('jwk', keyPair.publicKey);\n return { keyPair, publicJwk };\n}\n\nexport async function createDpopProof(params: { keyPair: CryptoKeyPair; method: string; url: string }) {\n const header = {\n typ: 'dpop+jwt',\n alg: 'ES256',\n jwk: await crypto.subtle.exportKey('jwk', params.keyPair.publicKey),\n };\n const now = Math.floor(Date.now() / 1000);\n const payload = {\n htm: params.method.toUpperCase(),\n htu: new URL(params.url).toString(),\n iat: now,\n jti: randomId(),\n iss: 'scarlet-dpop',\n aud: 'scarlet-sdk',\n };\n\n const encodedHeader = base64urlEncodeJson(header);\n const encodedPayload = base64urlEncodeJson(payload);\n const signingInput = `${encodedHeader}.${encodedPayload}`;\n const signature = await crypto.subtle.sign(\n { name: 'ECDSA', hash: 'SHA-256' },\n params.keyPair.privateKey,\n new TextEncoder().encode(signingInput)\n );\n return `${signingInput}.${base64urlEncode(new Uint8Array(signature))}`;\n}\n\n","/**\n * @scarletdb/sdk\n * Official TypeScript SDK for Scarlet DB\n * \n * @example\n * ```typescript\n * import { Scarlet } from '@scarletdb/sdk';\n * \n * const db = new Scarlet({ apiKey: 'sk_live_...' });\n * \n * // Query data\n * const users = await db.from('users').select().limit(10);\n * \n * // Storage\n * await db.storage.upload('avatars', file);\n * \n * // Email\n * await db.email.send({ from: '...', to: '...', subject: '...', html: '...' });\n * \n * // AI Query\n * const result = await db.ai.query('Show me active users');\n * \n * // Raw SQL\n * const result = await db.sql.query('SELECT * FROM users WHERE id = $1', [1]);\n * ```\n */\n\nimport { HttpClient } from './client';\nimport { DataModule, QueryBuilder } from './modules/data';\nimport { StorageModule } from './modules/storage';\nimport { EmailModule } from './modules/email';\nimport { AIModule } from './modules/ai';\nimport type { ScarletConfig } from './types';\nimport { createDpopKey, createDpopProof, type DpopKey } from './dpop';\n\nconst DEFAULT_URL = 'https://api.scarletdb.space';\nconst DEFAULT_TIMEOUT = 30000;\n\n/**\n * Main Scarlet SDK client\n */\nexport class Scarlet {\n private readonly engineClient: HttpClient;\n private readonly coreClient: HttpClient;\n private readonly _data: DataModule;\n\n /** Storage module for file operations */\n public readonly storage: StorageModule;\n\n /** Email module for sending transactional emails */\n public readonly email: EmailModule;\n\n /** AI module for natural language queries */\n public readonly ai: AIModule;\n public readonly projectId: string;\n\n constructor(config: ScarletConfig) {\n if (!config.projectId) throw new Error('projectId is required');\n this.projectId = config.projectId;\n\n const url = config.url || DEFAULT_URL;\n const coreBaseUrl = `${(config.coreUrl || url).replace(/\\/$/, '')}/api/v1`;\n const engineBaseUrl = `${(config.engineUrl || url).replace(/\\/$/, '')}/api/db/${this.projectId}`;\n const timeout = config.timeout || DEFAULT_TIMEOUT;\n\n const tokenState: { value: string; expiresAt: number } = { value: '', expiresAt: 0 };\n let dpopKey: DpopKey | null = null;\n\n const getToken = async () => {\n if (config.token) return config.token;\n if (config.getToken) return config.getToken();\n if (config.tokenEndpoint || config.publishableKey || !config.apiKey) {\n const endpoint = config.tokenEndpoint || (config.publishableKey ? '/auth/publishable-token' : '/auth/sdk-token');\n const now = Date.now();\n if (tokenState.value && tokenState.expiresAt > now + 10_000) {\n return tokenState.value;\n }\n if (config.enableDpop && !dpopKey) {\n dpopKey = await createDpopKey();\n }\n const res = await fetch(`${coreBaseUrl}${endpoint}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(config.publishableKey ? { 'X-Publishable-Key': config.publishableKey } : {}),\n },\n credentials: config.publishableKey ? 'omit' : 'include',\n body: JSON.stringify({\n projectId: this.projectId,\n dpopJwk: dpopKey?.publicJwk,\n }),\n });\n const json = await res.json().catch(() => ({})) as { token?: unknown; expiresIn?: unknown; error?: unknown };\n if (!res.ok) {\n throw new Error((typeof json.error === 'string' ? json.error : '') || 'Failed to fetch token');\n }\n tokenState.value = String(json.token || '');\n tokenState.expiresAt = Date.now() + Number(json.expiresIn || 0) * 1000;\n return tokenState.value;\n }\n throw new Error('Missing apiKey or token configuration');\n };\n\n const getAuthHeaders = async (params: { method: string; url: string }) => {\n if (config.apiKey) {\n return { 'X-API-Key': config.apiKey };\n }\n const token = await getToken();\n const headers: Record<string, string> = { Authorization: `Bearer ${token}` };\n if (config.enableDpop) {\n if (!dpopKey) dpopKey = await createDpopKey();\n headers['DPoP'] = await createDpopProof({ keyPair: dpopKey.keyPair, method: params.method, url: params.url });\n }\n return headers;\n };\n\n // Initialize modules\n this.engineClient = new HttpClient({ baseUrl: engineBaseUrl, timeout, getAuthHeaders });\n this.coreClient = new HttpClient({ baseUrl: coreBaseUrl, timeout, getAuthHeaders });\n\n this._data = new DataModule(this.engineClient);\n this.storage = new StorageModule(this.coreClient, this.projectId);\n this.email = new EmailModule(this.coreClient, this.projectId);\n this.ai = new AIModule(this.coreClient, this.projectId);\n }\n\n /**\n * Start a query on a table\n * \n * @example\n * const users = await db.from('users').select().where({ active: true }).limit(10);\n */\n from<T = Record<string, unknown>>(table: string): QueryBuilder<T> {\n return this._data.from<T>(table);\n }\n}\n\nexport function createScarlet(config: ScarletConfig) {\n return new Scarlet(config);\n}\n\n// Re-export types\nexport * from './types';\nexport * from './errors';\nexport { QueryBuilder } from './modules/data';\n"]}
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@scarletdb/sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Official TypeScript SDK for Scarlet DB - The modern Backend-as-a-Service platform",
|
|
5
5
|
"author": "Scarlet Team",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|
|
8
8
|
"type": "git",
|
|
9
|
-
"url": "https://github.com/scarlet-db/sdk.git"
|
|
9
|
+
"url": "git+https://github.com/scarlet-db/sdk.git"
|
|
10
10
|
},
|
|
11
11
|
"homepage": "https://scarletdb.space",
|
|
12
12
|
"keywords": [
|
|
@@ -52,6 +52,8 @@
|
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
|
54
54
|
"@types/node": "^20.10.0",
|
|
55
|
+
"@typescript-eslint/eslint-plugin": "^8.27.0",
|
|
56
|
+
"@typescript-eslint/parser": "^8.27.0",
|
|
55
57
|
"eslint": "^8.55.0",
|
|
56
58
|
"tsup": "^8.0.1",
|
|
57
59
|
"typescript": "^5.3.2",
|
|
@@ -60,4 +62,4 @@
|
|
|
60
62
|
"engines": {
|
|
61
63
|
"node": ">=18.0.0"
|
|
62
64
|
}
|
|
63
|
-
}
|
|
65
|
+
}
|