@parsrun/database 0.1.15 → 0.1.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -116,8 +116,8 @@ declare function escapeLike(value: string): string;
116
116
  declare function buildSearchPattern(value: string, mode?: "contains" | "startsWith" | "endsWith"): string;
117
117
 
118
118
  /**
119
- * @parsrun/database
120
- * Database utilities for Pars - Drizzle ORM helpers, multi-runtime support
119
+ * @module
120
+ * Database utilities for Pars - Drizzle ORM helpers, multi-runtime support.
121
121
  *
122
122
  * Supports:
123
123
  * - PostgreSQL (via postgres.js)
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts","../src/adapters/postgres.ts","../src/adapters/neon.ts","../src/adapters/d1.ts","../src/index.ts","../src/utils.ts"],"sourcesContent":["/**\n * @parsrun/database - Type Definitions\n * Database types and interfaces\n */\n\n/**\n * Database adapter type\n */\nexport type DatabaseAdapterType = \"postgres\" | \"neon\" | \"d1\" | \"custom\";\n\n/**\n * Base database configuration\n */\nexport interface BaseDatabaseConfig {\n /** Adapter type */\n type: DatabaseAdapterType;\n /** Enable query logging */\n logging?: boolean | undefined;\n /** Connection pool size */\n poolSize?: number | undefined;\n}\n\n/**\n * PostgreSQL configuration\n */\nexport interface PostgresConfig extends BaseDatabaseConfig {\n type: \"postgres\";\n /** Database host */\n host: string;\n /** Database port */\n port: number;\n /** Database user */\n user: string;\n /** Database password */\n password: string;\n /** Database name */\n database: string;\n /** SSL configuration */\n ssl?: boolean | { rejectUnauthorized: boolean } | undefined;\n}\n\n/**\n * Neon serverless configuration\n */\nexport interface NeonConfig extends BaseDatabaseConfig {\n type: \"neon\";\n /** Connection string */\n connectionString: string;\n /** Use pooled connection */\n pooled?: boolean | undefined;\n}\n\n/**\n * Cloudflare D1 configuration\n */\nexport interface D1Config extends BaseDatabaseConfig {\n type: \"d1\";\n /** D1 binding */\n binding: D1Database;\n}\n\n/**\n * Cloudflare D1 Database binding type\n */\nexport interface D1Database {\n prepare(query: string): D1PreparedStatement;\n batch<T>(statements: D1PreparedStatement[]): Promise<D1Result<T>[]>;\n dump(): Promise<ArrayBuffer>;\n exec<T>(query: string): Promise<D1Result<T>>;\n}\n\ninterface D1PreparedStatement {\n bind(...values: unknown[]): D1PreparedStatement;\n first<T = unknown>(column?: string): Promise<T | null>;\n run<T = unknown>(): Promise<D1Result<T>>;\n all<T = unknown>(): Promise<D1Result<T>>;\n raw<T = unknown>(): Promise<T[]>;\n}\n\ninterface D1Result<T> {\n results?: T[];\n success: boolean;\n error?: string;\n meta?: D1Meta;\n}\n\ninterface D1Meta {\n duration: number;\n rows_read: number;\n rows_written: number;\n}\n\n/**\n * Combined database configuration\n */\nexport type DatabaseConfig = PostgresConfig | NeonConfig | D1Config;\n\n/**\n * Migration status\n */\nexport interface MigrationStatus {\n /** Whether migrations need to be run */\n needsMigration: boolean;\n /** Whether database is up to date */\n upToDate: boolean;\n /** Number of pending migrations */\n pendingCount: number;\n /** Number of applied migrations */\n appliedCount: number;\n /** Error message if check failed */\n error?: string | undefined;\n}\n\n/**\n * Migration result\n */\nexport interface MigrationResult {\n /** Whether migration succeeded */\n success: boolean;\n /** Number of migrations applied */\n appliedCount?: number | undefined;\n /** Error message if migration failed */\n error?: string | undefined;\n}\n\n/**\n * Transaction options\n */\nexport interface TransactionOptions {\n /** Isolation level */\n isolationLevel?: \"read uncommitted\" | \"read committed\" | \"repeatable read\" | \"serializable\" | undefined;\n /** Access mode */\n accessMode?: \"read only\" | \"read write\" | undefined;\n /** Deferrable (PostgreSQL) */\n deferrable?: boolean | undefined;\n}\n\n/**\n * Query options\n */\nexport interface QueryOptions {\n /** Query timeout in milliseconds */\n timeout?: number | undefined;\n /** Transform result rows */\n transform?: \"camelCase\" | \"snakeCase\" | undefined;\n}\n\n/**\n * Database health status\n */\nexport interface DatabaseHealth {\n /** Whether database is healthy */\n healthy: boolean;\n /** Connection latency in milliseconds */\n latencyMs: number;\n /** Database version */\n version?: string | undefined;\n /** Error message if unhealthy */\n error?: string | undefined;\n}\n\n/**\n * Database adapter interface\n */\nexport interface DatabaseAdapter {\n /** Adapter type */\n readonly type: DatabaseAdapterType;\n\n /**\n * Execute raw SQL query\n */\n execute<T = unknown>(sql: string): Promise<T[]>;\n\n /**\n * Check connection health\n */\n ping(): Promise<boolean>;\n\n /**\n * Get connection health with details\n */\n health(): Promise<DatabaseHealth>;\n\n /**\n * Get the underlying Drizzle instance\n */\n drizzle(): unknown;\n\n /**\n * Close database connection\n */\n close(): Promise<void>;\n}\n\n/**\n * Database error\n */\nexport class DatabaseError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly cause?: unknown\n ) {\n super(message);\n this.name = \"DatabaseError\";\n }\n}\n\n/**\n * Common database error codes\n */\nexport const DatabaseErrorCodes = {\n CONNECTION_FAILED: \"CONNECTION_FAILED\",\n QUERY_FAILED: \"QUERY_FAILED\",\n TRANSACTION_FAILED: \"TRANSACTION_FAILED\",\n MIGRATION_FAILED: \"MIGRATION_FAILED\",\n INVALID_CONFIG: \"INVALID_CONFIG\",\n ADAPTER_NOT_AVAILABLE: \"ADAPTER_NOT_AVAILABLE\",\n TIMEOUT: \"TIMEOUT\",\n CONSTRAINT_VIOLATION: \"CONSTRAINT_VIOLATION\",\n NOT_FOUND: \"NOT_FOUND\",\n} as const;\n","/**\n * @parsrun/database - PostgreSQL Adapter\n * PostgreSQL adapter using postgres.js\n */\n\nimport { drizzle, type PostgresJsDatabase } from \"drizzle-orm/postgres-js\";\nimport type {\n DatabaseAdapter,\n DatabaseHealth,\n PostgresConfig,\n} from \"../types.js\";\nimport { DatabaseError, DatabaseErrorCodes } from \"../types.js\";\n\n/**\n * PostgreSQL Database Adapter\n *\n * @example\n * ```typescript\n * const db = await createPostgresAdapter({\n * type: 'postgres',\n * host: 'localhost',\n * port: 5432,\n * user: 'postgres',\n * password: 'password',\n * database: 'mydb',\n * });\n *\n * // Execute queries\n * const users = await db.drizzle().select().from(usersTable);\n *\n * // Close when done\n * await db.close();\n * ```\n */\nexport class PostgresAdapter implements DatabaseAdapter {\n readonly type = \"postgres\" as const;\n\n private client: unknown = null;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private db: PostgresJsDatabase<any> | null = null;\n private config: PostgresConfig;\n\n constructor(config: PostgresConfig) {\n this.config = config;\n }\n\n /**\n * Initialize the connection\n */\n async connect(): Promise<void> {\n if (this.client) return;\n\n try {\n const postgresModule = await import(\"postgres\");\n const postgres = postgresModule.default;\n\n // Build SSL config\n type SSLMode = boolean | \"require\" | \"allow\" | \"prefer\" | \"verify-full\" | { rejectUnauthorized: boolean };\n let sslConfig: SSLMode = false;\n\n if (this.config.ssl === true) {\n sslConfig = \"require\";\n } else if (typeof this.config.ssl === \"object\") {\n sslConfig = this.config.ssl;\n }\n\n this.client = postgres({\n host: this.config.host,\n port: this.config.port,\n user: this.config.user,\n password: this.config.password,\n database: this.config.database,\n ssl: sslConfig,\n max: this.config.poolSize ?? 10,\n });\n\n // Build drizzle config - use any to avoid complex type issues\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const drizzleOpts: any = {};\n if (this.config.logging !== undefined) {\n drizzleOpts.logger = this.config.logging;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.db = drizzle(this.client as any, drizzleOpts);\n } catch (err) {\n throw new DatabaseError(\n `Failed to connect to PostgreSQL: ${err instanceof Error ? err.message : \"Unknown error\"}`,\n DatabaseErrorCodes.CONNECTION_FAILED,\n err\n );\n }\n }\n\n async execute<T = unknown>(sql: string): Promise<T[]> {\n if (!this.client) {\n await this.connect();\n }\n\n try {\n const client = this.client as { unsafe: (sql: string) => Promise<unknown[]> };\n const result = await client.unsafe(sql);\n return result as T[];\n } catch (err) {\n throw new DatabaseError(\n `Query failed: ${err instanceof Error ? err.message : \"Unknown error\"}`,\n DatabaseErrorCodes.QUERY_FAILED,\n err\n );\n }\n }\n\n async ping(): Promise<boolean> {\n try {\n await this.execute(\"SELECT 1\");\n return true;\n } catch {\n return false;\n }\n }\n\n async health(): Promise<DatabaseHealth> {\n const start = Date.now();\n\n try {\n if (!this.client) {\n await this.connect();\n }\n\n const result = await this.execute<{ version: string }>(\"SELECT version()\");\n const latencyMs = Date.now() - start;\n\n return {\n healthy: true,\n latencyMs,\n version: result[0]?.version,\n };\n } catch (err) {\n return {\n healthy: false,\n latencyMs: Date.now() - start,\n error: err instanceof Error ? err.message : \"Unknown error\",\n };\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n drizzle(): PostgresJsDatabase<any> {\n if (!this.db) {\n throw new DatabaseError(\n \"Database not connected. Call connect() first.\",\n DatabaseErrorCodes.CONNECTION_FAILED\n );\n }\n return this.db;\n }\n\n async close(): Promise<void> {\n if (this.client) {\n const client = this.client as { end: () => Promise<void> };\n await client.end();\n this.client = null;\n this.db = null;\n }\n }\n\n /**\n * Get the raw postgres client\n */\n getClient(): unknown {\n return this.client;\n }\n}\n\n/**\n * Create a PostgreSQL adapter\n */\nexport async function createPostgresAdapter(\n config: PostgresConfig\n): Promise<PostgresAdapter> {\n const adapter = new PostgresAdapter(config);\n await adapter.connect();\n return adapter;\n}\n\n/**\n * Create a PostgreSQL adapter from connection string\n */\nexport async function createPostgresFromUrl(\n connectionString: string,\n options?: Omit<PostgresConfig, \"type\" | \"host\" | \"port\" | \"user\" | \"password\" | \"database\">\n): Promise<PostgresAdapter> {\n const url = new URL(connectionString);\n\n const config: PostgresConfig = {\n type: \"postgres\",\n host: url.hostname,\n port: parseInt(url.port || \"5432\", 10),\n user: url.username,\n password: url.password,\n database: url.pathname.slice(1),\n ssl: url.searchParams.get(\"sslmode\") === \"require\",\n ...options,\n };\n\n return createPostgresAdapter(config);\n}\n","/**\n * @parsrun/database - Neon Serverless Adapter\n * Neon serverless PostgreSQL adapter - perfect for edge environments\n */\n\nimport { drizzle } from \"drizzle-orm/neon-http\";\nimport type {\n DatabaseAdapter,\n DatabaseHealth,\n NeonConfig,\n} from \"../types.js\";\nimport { DatabaseError, DatabaseErrorCodes } from \"../types.js\";\n\n// Type for Neon client\ntype NeonClient = ReturnType<typeof import(\"@neondatabase/serverless\").neon>;\n\n/**\n * Neon Serverless Database Adapter\n * Optimized for edge environments (Cloudflare Workers, Vercel Edge, etc.)\n *\n * @example\n * ```typescript\n * const db = await createNeonAdapter({\n * type: 'neon',\n * connectionString: process.env.DATABASE_URL,\n * });\n *\n * // Execute queries\n * const users = await db.drizzle().select().from(usersTable);\n * ```\n */\nexport class NeonAdapter implements DatabaseAdapter {\n readonly type = \"neon\" as const;\n\n private client: NeonClient | null = null;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private db: any = null;\n private config: NeonConfig;\n\n constructor(config: NeonConfig) {\n this.config = config;\n }\n\n /**\n * Initialize the connection\n */\n async connect(): Promise<void> {\n if (this.client) return;\n\n try {\n const { neon } = await import(\"@neondatabase/serverless\");\n\n this.client = neon(this.config.connectionString, {\n fetchOptions: {\n cache: \"no-store\",\n },\n });\n\n // Build drizzle config - use any to avoid complex type issues\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const drizzleOpts: any = {};\n if (this.config.logging !== undefined) {\n drizzleOpts.logger = this.config.logging;\n }\n\n this.db = drizzle(this.client, drizzleOpts);\n } catch (err) {\n throw new DatabaseError(\n `Failed to connect to Neon: ${err instanceof Error ? err.message : \"Unknown error\"}`,\n DatabaseErrorCodes.CONNECTION_FAILED,\n err\n );\n }\n }\n\n async execute<T = unknown>(sql: string): Promise<T[]> {\n if (!this.client) {\n await this.connect();\n }\n\n try {\n const result = await this.client!(sql);\n // Neon can return different formats depending on how it's called\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (Array.isArray(result) && (result as any).rows) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (result as any).rows as T[];\n }\n return result as T[];\n } catch (err) {\n throw new DatabaseError(\n `Query failed: ${err instanceof Error ? err.message : \"Unknown error\"}`,\n DatabaseErrorCodes.QUERY_FAILED,\n err\n );\n }\n }\n\n async ping(): Promise<boolean> {\n try {\n await this.execute(\"SELECT 1\");\n return true;\n } catch {\n return false;\n }\n }\n\n async health(): Promise<DatabaseHealth> {\n const start = Date.now();\n\n try {\n if (!this.client) {\n await this.connect();\n }\n\n const result = await this.execute<{ version: string }>(\"SELECT version()\");\n const latencyMs = Date.now() - start;\n\n return {\n healthy: true,\n latencyMs,\n version: result[0]?.version,\n };\n } catch (err) {\n return {\n healthy: false,\n latencyMs: Date.now() - start,\n error: err instanceof Error ? err.message : \"Unknown error\",\n };\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n drizzle(): any {\n if (!this.db) {\n throw new DatabaseError(\n \"Database not connected. Call connect() first.\",\n DatabaseErrorCodes.CONNECTION_FAILED\n );\n }\n return this.db;\n }\n\n async close(): Promise<void> {\n // Neon serverless connections are stateless, nothing to close\n this.client = null;\n this.db = null;\n }\n\n /**\n * Get the raw Neon client\n */\n getClient(): NeonClient | null {\n return this.client;\n }\n}\n\n/**\n * Create a Neon adapter\n */\nexport async function createNeonAdapter(\n config: NeonConfig\n): Promise<NeonAdapter> {\n const adapter = new NeonAdapter(config);\n await adapter.connect();\n return adapter;\n}\n\n/**\n * Create a Neon adapter from connection string\n */\nexport async function createNeonFromUrl(\n connectionString: string,\n options?: Omit<NeonConfig, \"type\" | \"connectionString\">\n): Promise<NeonAdapter> {\n return createNeonAdapter({\n type: \"neon\",\n connectionString,\n ...options,\n });\n}\n","/**\n * @parsrun/database - Cloudflare D1 Adapter\n * Cloudflare D1 (SQLite) adapter - native edge database\n */\n\nimport { drizzle } from \"drizzle-orm/d1\";\nimport type {\n D1Config,\n D1Database,\n DatabaseAdapter,\n DatabaseHealth,\n} from \"../types.js\";\nimport { DatabaseError, DatabaseErrorCodes } from \"../types.js\";\n\n/**\n * Cloudflare D1 Database Adapter\n * Native SQLite database for Cloudflare Workers\n *\n * @example\n * ```typescript\n * // In Cloudflare Worker\n * export default {\n * async fetch(request, env) {\n * const db = createD1Adapter({\n * type: 'd1',\n * binding: env.DB, // D1 binding from wrangler.toml\n * });\n *\n * const users = await db.drizzle().select().from(usersTable);\n * return new Response(JSON.stringify(users));\n * }\n * }\n * ```\n */\nexport class D1Adapter implements DatabaseAdapter {\n readonly type = \"d1\" as const;\n\n private binding: D1Database;\n private db: ReturnType<typeof drizzle>;\n\n constructor(config: D1Config) {\n this.binding = config.binding;\n\n const drizzleConfig: Parameters<typeof drizzle>[1] = {};\n if (config.logging !== undefined) {\n drizzleConfig.logger = config.logging;\n }\n\n this.db = drizzle(this.binding as Parameters<typeof drizzle>[0], drizzleConfig);\n }\n\n async execute<T = unknown>(sql: string): Promise<T[]> {\n try {\n const result = await this.binding.exec<T>(sql);\n return result.results ?? [];\n } catch (err) {\n throw new DatabaseError(\n `Query failed: ${err instanceof Error ? err.message : \"Unknown error\"}`,\n DatabaseErrorCodes.QUERY_FAILED,\n err\n );\n }\n }\n\n async ping(): Promise<boolean> {\n try {\n await this.binding.prepare(\"SELECT 1\").first();\n return true;\n } catch {\n return false;\n }\n }\n\n async health(): Promise<DatabaseHealth> {\n const start = Date.now();\n\n try {\n await this.binding.prepare(\"SELECT 1\").first();\n const latencyMs = Date.now() - start;\n\n // Get SQLite version\n const versionResult = await this.binding\n .prepare(\"SELECT sqlite_version() as version\")\n .first<{ version: string }>();\n\n return {\n healthy: true,\n latencyMs,\n version: versionResult ? `SQLite ${versionResult.version}` : undefined,\n };\n } catch (err) {\n return {\n healthy: false,\n latencyMs: Date.now() - start,\n error: err instanceof Error ? err.message : \"Unknown error\",\n };\n }\n }\n\n drizzle(): ReturnType<typeof drizzle> {\n return this.db;\n }\n\n async close(): Promise<void> {\n // D1 bindings are managed by Cloudflare, nothing to close\n }\n\n /**\n * Get the raw D1 binding\n */\n getBinding(): D1Database {\n return this.binding;\n }\n\n /**\n * Execute a batch of statements\n */\n async batch<T = unknown>(\n statements: Array<{ sql: string; params?: unknown[] }>\n ): Promise<T[][]> {\n try {\n const prepared = statements.map((stmt) => {\n const p = this.binding.prepare(stmt.sql);\n return stmt.params ? p.bind(...stmt.params) : p;\n });\n\n const results = await this.binding.batch<T>(prepared);\n return results.map((r) => r.results ?? []);\n } catch (err) {\n throw new DatabaseError(\n `Batch execution failed: ${err instanceof Error ? err.message : \"Unknown error\"}`,\n DatabaseErrorCodes.QUERY_FAILED,\n err\n );\n }\n }\n}\n\n/**\n * Create a D1 adapter\n */\nexport function createD1Adapter(config: D1Config): D1Adapter {\n return new D1Adapter(config);\n}\n","/**\n * @parsrun/database\n * Database utilities for Pars - Drizzle ORM helpers, multi-runtime support\n *\n * Supports:\n * - PostgreSQL (via postgres.js)\n * - Neon Serverless (edge-compatible)\n * - Cloudflare D1 (SQLite)\n *\n * @example\n * ```typescript\n * import { createDatabase } from '@parsrun/database';\n *\n * // PostgreSQL\n * const db = await createDatabase({\n * type: 'postgres',\n * host: 'localhost',\n * port: 5432,\n * user: 'postgres',\n * password: 'password',\n * database: 'mydb',\n * });\n *\n * // Neon Serverless\n * const db = await createDatabase({\n * type: 'neon',\n * connectionString: process.env.DATABASE_URL,\n * });\n *\n * // Cloudflare D1\n * const db = createDatabase({\n * type: 'd1',\n * binding: env.DB,\n * });\n *\n * // Use with Drizzle ORM\n * const users = await db.drizzle().select().from(usersTable);\n * ```\n */\n\n// Types\nexport {\n type DatabaseAdapterType,\n type BaseDatabaseConfig,\n type PostgresConfig,\n type NeonConfig,\n type D1Config,\n type D1Database,\n type DatabaseConfig,\n type MigrationStatus,\n type MigrationResult,\n type TransactionOptions,\n type QueryOptions,\n type DatabaseHealth,\n type DatabaseAdapter,\n DatabaseError,\n DatabaseErrorCodes,\n} from \"./types.js\";\n\n// Adapters\nexport {\n PostgresAdapter,\n createPostgresAdapter,\n createPostgresFromUrl,\n} from \"./adapters/postgres.js\";\n\nexport {\n NeonAdapter,\n createNeonAdapter,\n createNeonFromUrl,\n} from \"./adapters/neon.js\";\n\nexport { D1Adapter, createD1Adapter } from \"./adapters/d1.js\";\n\n// Utilities\nexport {\n sleep,\n retry,\n isRetryableError,\n parseConnectionString,\n buildConnectionString,\n snakeToCamel,\n camelToSnake,\n transformToCamelCase,\n transformToSnakeCase,\n generateUUID,\n generateShortId,\n getPaginationOffset,\n createPaginatedResult,\n escapeLike,\n buildSearchPattern,\n type PaginationOptions,\n type PaginatedResult,\n} from \"./utils.js\";\n\nimport type { DatabaseAdapter, DatabaseConfig } from \"./types.js\";\nimport { DatabaseError, DatabaseErrorCodes } from \"./types.js\";\n\n/**\n * Create a database adapter based on configuration\n *\n * @param config - Database configuration\n * @returns Database adapter instance\n */\nexport async function createDatabase(\n config: DatabaseConfig\n): Promise<DatabaseAdapter> {\n switch (config.type) {\n case \"postgres\": {\n const { createPostgresAdapter } = await import(\"./adapters/postgres.js\");\n return createPostgresAdapter(config);\n }\n\n case \"neon\": {\n const { createNeonAdapter } = await import(\"./adapters/neon.js\");\n return createNeonAdapter(config);\n }\n\n case \"d1\": {\n const { createD1Adapter } = await import(\"./adapters/d1.js\");\n return createD1Adapter(config);\n }\n\n default:\n throw new DatabaseError(\n `Unknown database type: ${(config as DatabaseConfig).type}`,\n DatabaseErrorCodes.INVALID_CONFIG\n );\n }\n}\n\n/**\n * Create a database adapter from connection string\n *\n * @param connectionString - Database connection URL\n * @param options - Additional options\n * @returns Database adapter instance\n */\nexport async function createDatabaseFromUrl(\n connectionString: string,\n options?: { logging?: boolean; poolSize?: number }\n): Promise<DatabaseAdapter> {\n const url = new URL(connectionString);\n\n // Detect database type from URL scheme\n switch (url.protocol) {\n case \"postgresql:\":\n case \"postgres:\": {\n // Check if it's a Neon URL\n if (url.hostname.includes(\"neon.tech\")) {\n const { createNeonFromUrl } = await import(\"./adapters/neon.js\");\n return createNeonFromUrl(connectionString, options);\n }\n\n const { createPostgresFromUrl } = await import(\"./adapters/postgres.js\");\n return createPostgresFromUrl(connectionString, options);\n }\n\n default:\n throw new DatabaseError(\n `Unsupported database URL scheme: ${url.protocol}`,\n DatabaseErrorCodes.INVALID_CONFIG\n );\n }\n}\n\n/**\n * Re-export drizzle-orm for convenience\n */\nexport * from \"drizzle-orm\";\n","/**\n * @parsrun/database - Utilities\n * Database utility functions\n */\n\n/**\n * Sleep for specified milliseconds\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Retry a database operation with exponential backoff\n */\nexport async function retry<T>(\n operation: () => Promise<T>,\n options: {\n maxAttempts?: number;\n baseDelay?: number;\n maxDelay?: number;\n shouldRetry?: (error: unknown) => boolean;\n } = {}\n): Promise<T> {\n const {\n maxAttempts = 3,\n baseDelay = 100,\n maxDelay = 5000,\n shouldRetry = isRetryableError,\n } = options;\n\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error;\n\n if (attempt === maxAttempts || !shouldRetry(error)) {\n throw error;\n }\n\n const delay = Math.min(baseDelay * Math.pow(2, attempt - 1), maxDelay);\n await sleep(delay);\n }\n }\n\n throw lastError;\n}\n\n/**\n * Check if an error is retryable\n */\nexport function isRetryableError(error: unknown): boolean {\n if (error instanceof Error) {\n const message = error.message.toLowerCase();\n\n // Connection errors\n if (\n message.includes(\"connection\") ||\n message.includes(\"econnrefused\") ||\n message.includes(\"econnreset\") ||\n message.includes(\"etimedout\")\n ) {\n return true;\n }\n\n // Serialization errors (can retry)\n if (\n message.includes(\"could not serialize\") ||\n message.includes(\"deadlock detected\")\n ) {\n return true;\n }\n\n // Pool exhaustion\n if (message.includes(\"too many clients\")) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Parse a PostgreSQL connection string\n */\nexport function parseConnectionString(connectionString: string): {\n host: string;\n port: number;\n user: string;\n password: string;\n database: string;\n ssl: boolean;\n params: Record<string, string>;\n} {\n const url = new URL(connectionString);\n\n const params: Record<string, string> = {};\n url.searchParams.forEach((value, key) => {\n params[key] = value;\n });\n\n return {\n host: url.hostname,\n port: parseInt(url.port || \"5432\", 10),\n user: decodeURIComponent(url.username),\n password: decodeURIComponent(url.password),\n database: url.pathname.slice(1),\n ssl:\n url.searchParams.get(\"sslmode\") === \"require\" ||\n url.searchParams.get(\"ssl\") === \"true\",\n params,\n };\n}\n\n/**\n * Build a PostgreSQL connection string\n */\nexport function buildConnectionString(config: {\n host: string;\n port?: number;\n user: string;\n password: string;\n database: string;\n ssl?: boolean;\n params?: Record<string, string>;\n}): string {\n const url = new URL(`postgresql://${config.host}`);\n url.port = String(config.port ?? 5432);\n url.username = encodeURIComponent(config.user);\n url.password = encodeURIComponent(config.password);\n url.pathname = `/${config.database}`;\n\n if (config.ssl) {\n url.searchParams.set(\"sslmode\", \"require\");\n }\n\n if (config.params) {\n for (const [key, value] of Object.entries(config.params)) {\n url.searchParams.set(key, value);\n }\n }\n\n return url.toString();\n}\n\n/**\n * Convert snake_case to camelCase\n */\nexport function snakeToCamel(str: string): string {\n return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\n}\n\n/**\n * Convert camelCase to snake_case\n */\nexport function camelToSnake(str: string): string {\n return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);\n}\n\n/**\n * Transform object keys from snake_case to camelCase\n */\nexport function transformToCamelCase<T extends Record<string, unknown>>(\n obj: T\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n const newKey = snakeToCamel(key);\n\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n result[newKey] = transformToCamelCase(value as Record<string, unknown>);\n } else if (Array.isArray(value)) {\n result[newKey] = value.map((item) =>\n item && typeof item === \"object\"\n ? transformToCamelCase(item as Record<string, unknown>)\n : item\n );\n } else {\n result[newKey] = value;\n }\n }\n\n return result;\n}\n\n/**\n * Transform object keys from camelCase to snake_case\n */\nexport function transformToSnakeCase<T extends Record<string, unknown>>(\n obj: T\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n const newKey = camelToSnake(key);\n\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n result[newKey] = transformToSnakeCase(value as Record<string, unknown>);\n } else if (Array.isArray(value)) {\n result[newKey] = value.map((item) =>\n item && typeof item === \"object\"\n ? transformToSnakeCase(item as Record<string, unknown>)\n : item\n );\n } else {\n result[newKey] = value;\n }\n }\n\n return result;\n}\n\n/**\n * Generate a UUID v4\n */\nexport function generateUUID(): string {\n return crypto.randomUUID();\n}\n\n/**\n * Generate a short ID (8 characters)\n */\nexport function generateShortId(): string {\n return crypto.randomUUID().slice(0, 8);\n}\n\n/**\n * Paginate results\n */\nexport interface PaginationOptions {\n page?: number;\n limit?: number;\n maxLimit?: number;\n}\n\nexport interface PaginatedResult<T> {\n data: T[];\n pagination: {\n page: number;\n limit: number;\n total: number;\n totalPages: number;\n hasMore: boolean;\n };\n}\n\n/**\n * Calculate pagination offset\n */\nexport function getPaginationOffset(options: PaginationOptions): {\n offset: number;\n limit: number;\n} {\n const page = Math.max(1, options.page ?? 1);\n const maxLimit = options.maxLimit ?? 100;\n const limit = Math.min(Math.max(1, options.limit ?? 20), maxLimit);\n const offset = (page - 1) * limit;\n\n return { offset, limit };\n}\n\n/**\n * Create paginated result\n */\nexport function createPaginatedResult<T>(\n data: T[],\n total: number,\n options: PaginationOptions\n): PaginatedResult<T> {\n const { offset, limit } = getPaginationOffset(options);\n const page = Math.floor(offset / limit) + 1;\n const totalPages = Math.ceil(total / limit);\n\n return {\n data,\n pagination: {\n page,\n limit,\n total,\n totalPages,\n hasMore: page < totalPages,\n },\n };\n}\n\n/**\n * Escape special characters for LIKE queries\n */\nexport function escapeLike(value: string): string {\n return value.replace(/[%_\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * Build a search pattern for LIKE queries\n */\nexport function buildSearchPattern(\n value: string,\n mode: \"contains\" | \"startsWith\" | \"endsWith\" = \"contains\"\n): string {\n const escaped = escapeLike(value);\n\n switch (mode) {\n case \"startsWith\":\n return `${escaped}%`;\n case \"endsWith\":\n return `%${escaped}`;\n case \"contains\":\n default:\n return `%${escaped}%`;\n }\n}\n"],"mappings":"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","names":["drizzle","drizzle","createPostgresAdapter","createNeonAdapter","createD1Adapter","createNeonFromUrl","createPostgresFromUrl"]}
1
+ {"version":3,"sources":["../src/types.ts","../src/adapters/postgres.ts","../src/adapters/neon.ts","../src/adapters/d1.ts","../src/index.ts","../src/utils.ts"],"sourcesContent":["/**\n * @parsrun/database - Type Definitions\n * Database types and interfaces\n */\n\n/**\n * Database adapter type\n */\nexport type DatabaseAdapterType = \"postgres\" | \"neon\" | \"d1\" | \"custom\";\n\n/**\n * Base database configuration\n */\nexport interface BaseDatabaseConfig {\n /** Adapter type */\n type: DatabaseAdapterType;\n /** Enable query logging */\n logging?: boolean | undefined;\n /** Connection pool size */\n poolSize?: number | undefined;\n}\n\n/**\n * PostgreSQL configuration\n */\nexport interface PostgresConfig extends BaseDatabaseConfig {\n type: \"postgres\";\n /** Database host */\n host: string;\n /** Database port */\n port: number;\n /** Database user */\n user: string;\n /** Database password */\n password: string;\n /** Database name */\n database: string;\n /** SSL configuration */\n ssl?: boolean | { rejectUnauthorized: boolean } | undefined;\n}\n\n/**\n * Neon serverless configuration\n */\nexport interface NeonConfig extends BaseDatabaseConfig {\n type: \"neon\";\n /** Connection string */\n connectionString: string;\n /** Use pooled connection */\n pooled?: boolean | undefined;\n}\n\n/**\n * Cloudflare D1 configuration\n */\nexport interface D1Config extends BaseDatabaseConfig {\n type: \"d1\";\n /** D1 binding */\n binding: D1Database;\n}\n\n/**\n * Cloudflare D1 Database binding type\n */\nexport interface D1Database {\n prepare(query: string): D1PreparedStatement;\n batch<T>(statements: D1PreparedStatement[]): Promise<D1Result<T>[]>;\n dump(): Promise<ArrayBuffer>;\n exec<T>(query: string): Promise<D1Result<T>>;\n}\n\ninterface D1PreparedStatement {\n bind(...values: unknown[]): D1PreparedStatement;\n first<T = unknown>(column?: string): Promise<T | null>;\n run<T = unknown>(): Promise<D1Result<T>>;\n all<T = unknown>(): Promise<D1Result<T>>;\n raw<T = unknown>(): Promise<T[]>;\n}\n\ninterface D1Result<T> {\n results?: T[];\n success: boolean;\n error?: string;\n meta?: D1Meta;\n}\n\ninterface D1Meta {\n duration: number;\n rows_read: number;\n rows_written: number;\n}\n\n/**\n * Combined database configuration\n */\nexport type DatabaseConfig = PostgresConfig | NeonConfig | D1Config;\n\n/**\n * Migration status\n */\nexport interface MigrationStatus {\n /** Whether migrations need to be run */\n needsMigration: boolean;\n /** Whether database is up to date */\n upToDate: boolean;\n /** Number of pending migrations */\n pendingCount: number;\n /** Number of applied migrations */\n appliedCount: number;\n /** Error message if check failed */\n error?: string | undefined;\n}\n\n/**\n * Migration result\n */\nexport interface MigrationResult {\n /** Whether migration succeeded */\n success: boolean;\n /** Number of migrations applied */\n appliedCount?: number | undefined;\n /** Error message if migration failed */\n error?: string | undefined;\n}\n\n/**\n * Transaction options\n */\nexport interface TransactionOptions {\n /** Isolation level */\n isolationLevel?: \"read uncommitted\" | \"read committed\" | \"repeatable read\" | \"serializable\" | undefined;\n /** Access mode */\n accessMode?: \"read only\" | \"read write\" | undefined;\n /** Deferrable (PostgreSQL) */\n deferrable?: boolean | undefined;\n}\n\n/**\n * Query options\n */\nexport interface QueryOptions {\n /** Query timeout in milliseconds */\n timeout?: number | undefined;\n /** Transform result rows */\n transform?: \"camelCase\" | \"snakeCase\" | undefined;\n}\n\n/**\n * Database health status\n */\nexport interface DatabaseHealth {\n /** Whether database is healthy */\n healthy: boolean;\n /** Connection latency in milliseconds */\n latencyMs: number;\n /** Database version */\n version?: string | undefined;\n /** Error message if unhealthy */\n error?: string | undefined;\n}\n\n/**\n * Database adapter interface\n */\nexport interface DatabaseAdapter {\n /** Adapter type */\n readonly type: DatabaseAdapterType;\n\n /**\n * Execute raw SQL query\n */\n execute<T = unknown>(sql: string): Promise<T[]>;\n\n /**\n * Check connection health\n */\n ping(): Promise<boolean>;\n\n /**\n * Get connection health with details\n */\n health(): Promise<DatabaseHealth>;\n\n /**\n * Get the underlying Drizzle instance\n */\n drizzle(): unknown;\n\n /**\n * Close database connection\n */\n close(): Promise<void>;\n}\n\n/**\n * Database error\n */\nexport class DatabaseError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly cause?: unknown\n ) {\n super(message);\n this.name = \"DatabaseError\";\n }\n}\n\n/**\n * Common database error codes\n */\nexport const DatabaseErrorCodes = {\n CONNECTION_FAILED: \"CONNECTION_FAILED\",\n QUERY_FAILED: \"QUERY_FAILED\",\n TRANSACTION_FAILED: \"TRANSACTION_FAILED\",\n MIGRATION_FAILED: \"MIGRATION_FAILED\",\n INVALID_CONFIG: \"INVALID_CONFIG\",\n ADAPTER_NOT_AVAILABLE: \"ADAPTER_NOT_AVAILABLE\",\n TIMEOUT: \"TIMEOUT\",\n CONSTRAINT_VIOLATION: \"CONSTRAINT_VIOLATION\",\n NOT_FOUND: \"NOT_FOUND\",\n} as const;\n","/**\n * @parsrun/database - PostgreSQL Adapter\n * PostgreSQL adapter using postgres.js\n */\n\nimport { drizzle, type PostgresJsDatabase } from \"drizzle-orm/postgres-js\";\nimport type {\n DatabaseAdapter,\n DatabaseHealth,\n PostgresConfig,\n} from \"../types.js\";\nimport { DatabaseError, DatabaseErrorCodes } from \"../types.js\";\n\n/**\n * PostgreSQL Database Adapter\n *\n * @example\n * ```typescript\n * const db = await createPostgresAdapter({\n * type: 'postgres',\n * host: 'localhost',\n * port: 5432,\n * user: 'postgres',\n * password: 'password',\n * database: 'mydb',\n * });\n *\n * // Execute queries\n * const users = await db.drizzle().select().from(usersTable);\n *\n * // Close when done\n * await db.close();\n * ```\n */\nexport class PostgresAdapter implements DatabaseAdapter {\n readonly type = \"postgres\" as const;\n\n private client: unknown = null;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private db: PostgresJsDatabase<any> | null = null;\n private config: PostgresConfig;\n\n constructor(config: PostgresConfig) {\n this.config = config;\n }\n\n /**\n * Initialize the connection\n */\n async connect(): Promise<void> {\n if (this.client) return;\n\n try {\n const postgresModule = await import(\"postgres\");\n const postgres = postgresModule.default;\n\n // Build SSL config\n type SSLMode = boolean | \"require\" | \"allow\" | \"prefer\" | \"verify-full\" | { rejectUnauthorized: boolean };\n let sslConfig: SSLMode = false;\n\n if (this.config.ssl === true) {\n sslConfig = \"require\";\n } else if (typeof this.config.ssl === \"object\") {\n sslConfig = this.config.ssl;\n }\n\n this.client = postgres({\n host: this.config.host,\n port: this.config.port,\n user: this.config.user,\n password: this.config.password,\n database: this.config.database,\n ssl: sslConfig,\n max: this.config.poolSize ?? 10,\n });\n\n // Build drizzle config - use any to avoid complex type issues\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const drizzleOpts: any = {};\n if (this.config.logging !== undefined) {\n drizzleOpts.logger = this.config.logging;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.db = drizzle(this.client as any, drizzleOpts);\n } catch (err) {\n throw new DatabaseError(\n `Failed to connect to PostgreSQL: ${err instanceof Error ? err.message : \"Unknown error\"}`,\n DatabaseErrorCodes.CONNECTION_FAILED,\n err\n );\n }\n }\n\n async execute<T = unknown>(sql: string): Promise<T[]> {\n if (!this.client) {\n await this.connect();\n }\n\n try {\n const client = this.client as { unsafe: (sql: string) => Promise<unknown[]> };\n const result = await client.unsafe(sql);\n return result as T[];\n } catch (err) {\n throw new DatabaseError(\n `Query failed: ${err instanceof Error ? err.message : \"Unknown error\"}`,\n DatabaseErrorCodes.QUERY_FAILED,\n err\n );\n }\n }\n\n async ping(): Promise<boolean> {\n try {\n await this.execute(\"SELECT 1\");\n return true;\n } catch {\n return false;\n }\n }\n\n async health(): Promise<DatabaseHealth> {\n const start = Date.now();\n\n try {\n if (!this.client) {\n await this.connect();\n }\n\n const result = await this.execute<{ version: string }>(\"SELECT version()\");\n const latencyMs = Date.now() - start;\n\n return {\n healthy: true,\n latencyMs,\n version: result[0]?.version,\n };\n } catch (err) {\n return {\n healthy: false,\n latencyMs: Date.now() - start,\n error: err instanceof Error ? err.message : \"Unknown error\",\n };\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n drizzle(): PostgresJsDatabase<any> {\n if (!this.db) {\n throw new DatabaseError(\n \"Database not connected. Call connect() first.\",\n DatabaseErrorCodes.CONNECTION_FAILED\n );\n }\n return this.db;\n }\n\n async close(): Promise<void> {\n if (this.client) {\n const client = this.client as { end: () => Promise<void> };\n await client.end();\n this.client = null;\n this.db = null;\n }\n }\n\n /**\n * Get the raw postgres client\n */\n getClient(): unknown {\n return this.client;\n }\n}\n\n/**\n * Create a PostgreSQL adapter\n */\nexport async function createPostgresAdapter(\n config: PostgresConfig\n): Promise<PostgresAdapter> {\n const adapter = new PostgresAdapter(config);\n await adapter.connect();\n return adapter;\n}\n\n/**\n * Create a PostgreSQL adapter from connection string\n */\nexport async function createPostgresFromUrl(\n connectionString: string,\n options?: Omit<PostgresConfig, \"type\" | \"host\" | \"port\" | \"user\" | \"password\" | \"database\">\n): Promise<PostgresAdapter> {\n const url = new URL(connectionString);\n\n const config: PostgresConfig = {\n type: \"postgres\",\n host: url.hostname,\n port: parseInt(url.port || \"5432\", 10),\n user: url.username,\n password: url.password,\n database: url.pathname.slice(1),\n ssl: url.searchParams.get(\"sslmode\") === \"require\",\n ...options,\n };\n\n return createPostgresAdapter(config);\n}\n","/**\n * @parsrun/database - Neon Serverless Adapter\n * Neon serverless PostgreSQL adapter - perfect for edge environments\n */\n\nimport { drizzle } from \"drizzle-orm/neon-http\";\nimport type {\n DatabaseAdapter,\n DatabaseHealth,\n NeonConfig,\n} from \"../types.js\";\nimport { DatabaseError, DatabaseErrorCodes } from \"../types.js\";\n\n// Type for Neon client\ntype NeonClient = ReturnType<typeof import(\"@neondatabase/serverless\").neon>;\n\n/**\n * Neon Serverless Database Adapter\n * Optimized for edge environments (Cloudflare Workers, Vercel Edge, etc.)\n *\n * @example\n * ```typescript\n * const db = await createNeonAdapter({\n * type: 'neon',\n * connectionString: process.env.DATABASE_URL,\n * });\n *\n * // Execute queries\n * const users = await db.drizzle().select().from(usersTable);\n * ```\n */\nexport class NeonAdapter implements DatabaseAdapter {\n readonly type = \"neon\" as const;\n\n private client: NeonClient | null = null;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private db: any = null;\n private config: NeonConfig;\n\n constructor(config: NeonConfig) {\n this.config = config;\n }\n\n /**\n * Initialize the connection\n */\n async connect(): Promise<void> {\n if (this.client) return;\n\n try {\n const { neon } = await import(\"@neondatabase/serverless\");\n\n this.client = neon(this.config.connectionString, {\n fetchOptions: {\n cache: \"no-store\",\n },\n });\n\n // Build drizzle config - use any to avoid complex type issues\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const drizzleOpts: any = {};\n if (this.config.logging !== undefined) {\n drizzleOpts.logger = this.config.logging;\n }\n\n this.db = drizzle(this.client, drizzleOpts);\n } catch (err) {\n throw new DatabaseError(\n `Failed to connect to Neon: ${err instanceof Error ? err.message : \"Unknown error\"}`,\n DatabaseErrorCodes.CONNECTION_FAILED,\n err\n );\n }\n }\n\n async execute<T = unknown>(sql: string): Promise<T[]> {\n if (!this.client) {\n await this.connect();\n }\n\n try {\n const result = await this.client!(sql);\n // Neon can return different formats depending on how it's called\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (Array.isArray(result) && (result as any).rows) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (result as any).rows as T[];\n }\n return result as T[];\n } catch (err) {\n throw new DatabaseError(\n `Query failed: ${err instanceof Error ? err.message : \"Unknown error\"}`,\n DatabaseErrorCodes.QUERY_FAILED,\n err\n );\n }\n }\n\n async ping(): Promise<boolean> {\n try {\n await this.execute(\"SELECT 1\");\n return true;\n } catch {\n return false;\n }\n }\n\n async health(): Promise<DatabaseHealth> {\n const start = Date.now();\n\n try {\n if (!this.client) {\n await this.connect();\n }\n\n const result = await this.execute<{ version: string }>(\"SELECT version()\");\n const latencyMs = Date.now() - start;\n\n return {\n healthy: true,\n latencyMs,\n version: result[0]?.version,\n };\n } catch (err) {\n return {\n healthy: false,\n latencyMs: Date.now() - start,\n error: err instanceof Error ? err.message : \"Unknown error\",\n };\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n drizzle(): any {\n if (!this.db) {\n throw new DatabaseError(\n \"Database not connected. Call connect() first.\",\n DatabaseErrorCodes.CONNECTION_FAILED\n );\n }\n return this.db;\n }\n\n async close(): Promise<void> {\n // Neon serverless connections are stateless, nothing to close\n this.client = null;\n this.db = null;\n }\n\n /**\n * Get the raw Neon client\n */\n getClient(): NeonClient | null {\n return this.client;\n }\n}\n\n/**\n * Create a Neon adapter\n */\nexport async function createNeonAdapter(\n config: NeonConfig\n): Promise<NeonAdapter> {\n const adapter = new NeonAdapter(config);\n await adapter.connect();\n return adapter;\n}\n\n/**\n * Create a Neon adapter from connection string\n */\nexport async function createNeonFromUrl(\n connectionString: string,\n options?: Omit<NeonConfig, \"type\" | \"connectionString\">\n): Promise<NeonAdapter> {\n return createNeonAdapter({\n type: \"neon\",\n connectionString,\n ...options,\n });\n}\n","/**\n * @parsrun/database - Cloudflare D1 Adapter\n * Cloudflare D1 (SQLite) adapter - native edge database\n */\n\nimport { drizzle } from \"drizzle-orm/d1\";\nimport type {\n D1Config,\n D1Database,\n DatabaseAdapter,\n DatabaseHealth,\n} from \"../types.js\";\nimport { DatabaseError, DatabaseErrorCodes } from \"../types.js\";\n\n/**\n * Cloudflare D1 Database Adapter\n * Native SQLite database for Cloudflare Workers\n *\n * @example\n * ```typescript\n * // In Cloudflare Worker\n * export default {\n * async fetch(request, env) {\n * const db = createD1Adapter({\n * type: 'd1',\n * binding: env.DB, // D1 binding from wrangler.toml\n * });\n *\n * const users = await db.drizzle().select().from(usersTable);\n * return new Response(JSON.stringify(users));\n * }\n * }\n * ```\n */\nexport class D1Adapter implements DatabaseAdapter {\n readonly type = \"d1\" as const;\n\n private binding: D1Database;\n private db: ReturnType<typeof drizzle>;\n\n constructor(config: D1Config) {\n this.binding = config.binding;\n\n const drizzleConfig: Parameters<typeof drizzle>[1] = {};\n if (config.logging !== undefined) {\n drizzleConfig.logger = config.logging;\n }\n\n this.db = drizzle(this.binding as Parameters<typeof drizzle>[0], drizzleConfig);\n }\n\n async execute<T = unknown>(sql: string): Promise<T[]> {\n try {\n const result = await this.binding.exec<T>(sql);\n return result.results ?? [];\n } catch (err) {\n throw new DatabaseError(\n `Query failed: ${err instanceof Error ? err.message : \"Unknown error\"}`,\n DatabaseErrorCodes.QUERY_FAILED,\n err\n );\n }\n }\n\n async ping(): Promise<boolean> {\n try {\n await this.binding.prepare(\"SELECT 1\").first();\n return true;\n } catch {\n return false;\n }\n }\n\n async health(): Promise<DatabaseHealth> {\n const start = Date.now();\n\n try {\n await this.binding.prepare(\"SELECT 1\").first();\n const latencyMs = Date.now() - start;\n\n // Get SQLite version\n const versionResult = await this.binding\n .prepare(\"SELECT sqlite_version() as version\")\n .first<{ version: string }>();\n\n return {\n healthy: true,\n latencyMs,\n version: versionResult ? `SQLite ${versionResult.version}` : undefined,\n };\n } catch (err) {\n return {\n healthy: false,\n latencyMs: Date.now() - start,\n error: err instanceof Error ? err.message : \"Unknown error\",\n };\n }\n }\n\n drizzle(): ReturnType<typeof drizzle> {\n return this.db;\n }\n\n async close(): Promise<void> {\n // D1 bindings are managed by Cloudflare, nothing to close\n }\n\n /**\n * Get the raw D1 binding\n */\n getBinding(): D1Database {\n return this.binding;\n }\n\n /**\n * Execute a batch of statements\n */\n async batch<T = unknown>(\n statements: Array<{ sql: string; params?: unknown[] }>\n ): Promise<T[][]> {\n try {\n const prepared = statements.map((stmt) => {\n const p = this.binding.prepare(stmt.sql);\n return stmt.params ? p.bind(...stmt.params) : p;\n });\n\n const results = await this.binding.batch<T>(prepared);\n return results.map((r) => r.results ?? []);\n } catch (err) {\n throw new DatabaseError(\n `Batch execution failed: ${err instanceof Error ? err.message : \"Unknown error\"}`,\n DatabaseErrorCodes.QUERY_FAILED,\n err\n );\n }\n }\n}\n\n/**\n * Create a D1 adapter\n */\nexport function createD1Adapter(config: D1Config): D1Adapter {\n return new D1Adapter(config);\n}\n","/**\n * @module\n * Database utilities for Pars - Drizzle ORM helpers, multi-runtime support.\n *\n * Supports:\n * - PostgreSQL (via postgres.js)\n * - Neon Serverless (edge-compatible)\n * - Cloudflare D1 (SQLite)\n *\n * @example\n * ```typescript\n * import { createDatabase } from '@parsrun/database';\n *\n * // PostgreSQL\n * const db = await createDatabase({\n * type: 'postgres',\n * host: 'localhost',\n * port: 5432,\n * user: 'postgres',\n * password: 'password',\n * database: 'mydb',\n * });\n *\n * // Neon Serverless\n * const db = await createDatabase({\n * type: 'neon',\n * connectionString: process.env.DATABASE_URL,\n * });\n *\n * // Cloudflare D1\n * const db = createDatabase({\n * type: 'd1',\n * binding: env.DB,\n * });\n *\n * // Use with Drizzle ORM\n * const users = await db.drizzle().select().from(usersTable);\n * ```\n */\n\n// Types\nexport {\n type DatabaseAdapterType,\n type BaseDatabaseConfig,\n type PostgresConfig,\n type NeonConfig,\n type D1Config,\n type D1Database,\n type DatabaseConfig,\n type MigrationStatus,\n type MigrationResult,\n type TransactionOptions,\n type QueryOptions,\n type DatabaseHealth,\n type DatabaseAdapter,\n DatabaseError,\n DatabaseErrorCodes,\n} from \"./types.js\";\n\n// Adapters\nexport {\n PostgresAdapter,\n createPostgresAdapter,\n createPostgresFromUrl,\n} from \"./adapters/postgres.js\";\n\nexport {\n NeonAdapter,\n createNeonAdapter,\n createNeonFromUrl,\n} from \"./adapters/neon.js\";\n\nexport { D1Adapter, createD1Adapter } from \"./adapters/d1.js\";\n\n// Utilities\nexport {\n sleep,\n retry,\n isRetryableError,\n parseConnectionString,\n buildConnectionString,\n snakeToCamel,\n camelToSnake,\n transformToCamelCase,\n transformToSnakeCase,\n generateUUID,\n generateShortId,\n getPaginationOffset,\n createPaginatedResult,\n escapeLike,\n buildSearchPattern,\n type PaginationOptions,\n type PaginatedResult,\n} from \"./utils.js\";\n\nimport type { DatabaseAdapter, DatabaseConfig } from \"./types.js\";\nimport { DatabaseError, DatabaseErrorCodes } from \"./types.js\";\n\n/**\n * Create a database adapter based on configuration\n *\n * @param config - Database configuration\n * @returns Database adapter instance\n */\nexport async function createDatabase(\n config: DatabaseConfig\n): Promise<DatabaseAdapter> {\n switch (config.type) {\n case \"postgres\": {\n const { createPostgresAdapter } = await import(\"./adapters/postgres.js\");\n return createPostgresAdapter(config);\n }\n\n case \"neon\": {\n const { createNeonAdapter } = await import(\"./adapters/neon.js\");\n return createNeonAdapter(config);\n }\n\n case \"d1\": {\n const { createD1Adapter } = await import(\"./adapters/d1.js\");\n return createD1Adapter(config);\n }\n\n default:\n throw new DatabaseError(\n `Unknown database type: ${(config as DatabaseConfig).type}`,\n DatabaseErrorCodes.INVALID_CONFIG\n );\n }\n}\n\n/**\n * Create a database adapter from connection string\n *\n * @param connectionString - Database connection URL\n * @param options - Additional options\n * @returns Database adapter instance\n */\nexport async function createDatabaseFromUrl(\n connectionString: string,\n options?: { logging?: boolean; poolSize?: number }\n): Promise<DatabaseAdapter> {\n const url = new URL(connectionString);\n\n // Detect database type from URL scheme\n switch (url.protocol) {\n case \"postgresql:\":\n case \"postgres:\": {\n // Check if it's a Neon URL\n if (url.hostname.includes(\"neon.tech\")) {\n const { createNeonFromUrl } = await import(\"./adapters/neon.js\");\n return createNeonFromUrl(connectionString, options);\n }\n\n const { createPostgresFromUrl } = await import(\"./adapters/postgres.js\");\n return createPostgresFromUrl(connectionString, options);\n }\n\n default:\n throw new DatabaseError(\n `Unsupported database URL scheme: ${url.protocol}`,\n DatabaseErrorCodes.INVALID_CONFIG\n );\n }\n}\n\n/**\n * Re-export drizzle-orm for convenience\n */\nexport * from \"drizzle-orm\";\n","/**\n * @parsrun/database - Utilities\n * Database utility functions\n */\n\n/**\n * Sleep for specified milliseconds\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Retry a database operation with exponential backoff\n */\nexport async function retry<T>(\n operation: () => Promise<T>,\n options: {\n maxAttempts?: number;\n baseDelay?: number;\n maxDelay?: number;\n shouldRetry?: (error: unknown) => boolean;\n } = {}\n): Promise<T> {\n const {\n maxAttempts = 3,\n baseDelay = 100,\n maxDelay = 5000,\n shouldRetry = isRetryableError,\n } = options;\n\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error;\n\n if (attempt === maxAttempts || !shouldRetry(error)) {\n throw error;\n }\n\n const delay = Math.min(baseDelay * Math.pow(2, attempt - 1), maxDelay);\n await sleep(delay);\n }\n }\n\n throw lastError;\n}\n\n/**\n * Check if an error is retryable\n */\nexport function isRetryableError(error: unknown): boolean {\n if (error instanceof Error) {\n const message = error.message.toLowerCase();\n\n // Connection errors\n if (\n message.includes(\"connection\") ||\n message.includes(\"econnrefused\") ||\n message.includes(\"econnreset\") ||\n message.includes(\"etimedout\")\n ) {\n return true;\n }\n\n // Serialization errors (can retry)\n if (\n message.includes(\"could not serialize\") ||\n message.includes(\"deadlock detected\")\n ) {\n return true;\n }\n\n // Pool exhaustion\n if (message.includes(\"too many clients\")) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Parse a PostgreSQL connection string\n */\nexport function parseConnectionString(connectionString: string): {\n host: string;\n port: number;\n user: string;\n password: string;\n database: string;\n ssl: boolean;\n params: Record<string, string>;\n} {\n const url = new URL(connectionString);\n\n const params: Record<string, string> = {};\n url.searchParams.forEach((value, key) => {\n params[key] = value;\n });\n\n return {\n host: url.hostname,\n port: parseInt(url.port || \"5432\", 10),\n user: decodeURIComponent(url.username),\n password: decodeURIComponent(url.password),\n database: url.pathname.slice(1),\n ssl:\n url.searchParams.get(\"sslmode\") === \"require\" ||\n url.searchParams.get(\"ssl\") === \"true\",\n params,\n };\n}\n\n/**\n * Build a PostgreSQL connection string\n */\nexport function buildConnectionString(config: {\n host: string;\n port?: number;\n user: string;\n password: string;\n database: string;\n ssl?: boolean;\n params?: Record<string, string>;\n}): string {\n const url = new URL(`postgresql://${config.host}`);\n url.port = String(config.port ?? 5432);\n url.username = encodeURIComponent(config.user);\n url.password = encodeURIComponent(config.password);\n url.pathname = `/${config.database}`;\n\n if (config.ssl) {\n url.searchParams.set(\"sslmode\", \"require\");\n }\n\n if (config.params) {\n for (const [key, value] of Object.entries(config.params)) {\n url.searchParams.set(key, value);\n }\n }\n\n return url.toString();\n}\n\n/**\n * Convert snake_case to camelCase\n */\nexport function snakeToCamel(str: string): string {\n return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\n}\n\n/**\n * Convert camelCase to snake_case\n */\nexport function camelToSnake(str: string): string {\n return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);\n}\n\n/**\n * Transform object keys from snake_case to camelCase\n */\nexport function transformToCamelCase<T extends Record<string, unknown>>(\n obj: T\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n const newKey = snakeToCamel(key);\n\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n result[newKey] = transformToCamelCase(value as Record<string, unknown>);\n } else if (Array.isArray(value)) {\n result[newKey] = value.map((item) =>\n item && typeof item === \"object\"\n ? transformToCamelCase(item as Record<string, unknown>)\n : item\n );\n } else {\n result[newKey] = value;\n }\n }\n\n return result;\n}\n\n/**\n * Transform object keys from camelCase to snake_case\n */\nexport function transformToSnakeCase<T extends Record<string, unknown>>(\n obj: T\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n const newKey = camelToSnake(key);\n\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n result[newKey] = transformToSnakeCase(value as Record<string, unknown>);\n } else if (Array.isArray(value)) {\n result[newKey] = value.map((item) =>\n item && typeof item === \"object\"\n ? transformToSnakeCase(item as Record<string, unknown>)\n : item\n );\n } else {\n result[newKey] = value;\n }\n }\n\n return result;\n}\n\n/**\n * Generate a UUID v4\n */\nexport function generateUUID(): string {\n return crypto.randomUUID();\n}\n\n/**\n * Generate a short ID (8 characters)\n */\nexport function generateShortId(): string {\n return crypto.randomUUID().slice(0, 8);\n}\n\n/**\n * Paginate results\n */\nexport interface PaginationOptions {\n page?: number;\n limit?: number;\n maxLimit?: number;\n}\n\nexport interface PaginatedResult<T> {\n data: T[];\n pagination: {\n page: number;\n limit: number;\n total: number;\n totalPages: number;\n hasMore: boolean;\n };\n}\n\n/**\n * Calculate pagination offset\n */\nexport function getPaginationOffset(options: PaginationOptions): {\n offset: number;\n limit: number;\n} {\n const page = Math.max(1, options.page ?? 1);\n const maxLimit = options.maxLimit ?? 100;\n const limit = Math.min(Math.max(1, options.limit ?? 20), maxLimit);\n const offset = (page - 1) * limit;\n\n return { offset, limit };\n}\n\n/**\n * Create paginated result\n */\nexport function createPaginatedResult<T>(\n data: T[],\n total: number,\n options: PaginationOptions\n): PaginatedResult<T> {\n const { offset, limit } = getPaginationOffset(options);\n const page = Math.floor(offset / limit) + 1;\n const totalPages = Math.ceil(total / limit);\n\n return {\n data,\n pagination: {\n page,\n limit,\n total,\n totalPages,\n hasMore: page < totalPages,\n },\n };\n}\n\n/**\n * Escape special characters for LIKE queries\n */\nexport function escapeLike(value: string): string {\n return value.replace(/[%_\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * Build a search pattern for LIKE queries\n */\nexport function buildSearchPattern(\n value: string,\n mode: \"contains\" | \"startsWith\" | \"endsWith\" = \"contains\"\n): string {\n const escaped = escapeLike(value);\n\n switch (mode) {\n case \"startsWith\":\n return `${escaped}%`;\n case \"endsWith\":\n return `%${escaped}`;\n case \"contains\":\n default:\n return `%${escaped}%`;\n }\n}\n"],"mappings":"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","names":["drizzle","drizzle","createPostgresAdapter","createNeonAdapter","createD1Adapter","createNeonFromUrl","createPostgresFromUrl"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@parsrun/database",
3
- "version": "0.1.15",
3
+ "version": "0.1.17",
4
4
  "description": "Database utilities for Pars - Drizzle ORM helpers, migrations, multi-runtime support",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",