@gl-life/gl-life-database 1.0.0 → 1.1.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/API.md +249 -1
- package/README.md +67 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +21 -3
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/cache/index.d.ts +0 -4
- package/dist/cache/index.d.ts.map +0 -1
- package/dist/cache/invalidation.d.ts +0 -156
- package/dist/cache/invalidation.d.ts.map +0 -1
- package/dist/cache/kv-cache.d.ts +0 -79
- package/dist/cache/kv-cache.d.ts.map +0 -1
- package/dist/cache/memory-cache.d.ts +0 -68
- package/dist/cache/memory-cache.d.ts.map +0 -1
- package/dist/cloudforge/d1-adapter.d.ts +0 -67
- package/dist/cloudforge/d1-adapter.d.ts.map +0 -1
- package/dist/cloudforge/do-storage.d.ts +0 -51
- package/dist/cloudforge/do-storage.d.ts.map +0 -1
- package/dist/cloudforge/index.d.ts +0 -4
- package/dist/cloudforge/index.d.ts.map +0 -1
- package/dist/cloudforge/r2-backup.d.ts +0 -38
- package/dist/cloudforge/r2-backup.d.ts.map +0 -1
- package/dist/connection/index.d.ts +0 -2
- package/dist/connection/index.d.ts.map +0 -1
- package/dist/connection/manager.d.ts +0 -54
- package/dist/connection/manager.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/migration/index.d.ts +0 -4
- package/dist/migration/index.d.ts.map +0 -1
- package/dist/migration/loader.d.ts +0 -88
- package/dist/migration/loader.d.ts.map +0 -1
- package/dist/migration/runner.d.ts +0 -91
- package/dist/migration/runner.d.ts.map +0 -1
- package/dist/migration/seeder.d.ts +0 -95
- package/dist/migration/seeder.d.ts.map +0 -1
- package/dist/query/builder.d.ts +0 -47
- package/dist/query/builder.d.ts.map +0 -1
- package/dist/query/index.d.ts +0 -3
- package/dist/query/index.d.ts.map +0 -1
- package/dist/query/raw.d.ts +0 -92
- package/dist/query/raw.d.ts.map +0 -1
- package/dist/tenant/context.d.ts +0 -52
- package/dist/tenant/context.d.ts.map +0 -1
- package/dist/tenant/index.d.ts +0 -4
- package/dist/tenant/index.d.ts.map +0 -1
- package/dist/tenant/query-wrapper.d.ts +0 -96
- package/dist/tenant/query-wrapper.d.ts.map +0 -1
- package/dist/tenant/schema-manager.d.ts +0 -185
- package/dist/tenant/schema-manager.d.ts.map +0 -1
- package/dist/transaction/index.d.ts +0 -2
- package/dist/transaction/index.d.ts.map +0 -1
- package/dist/transaction/transaction.d.ts +0 -51
- package/dist/transaction/transaction.d.ts.map +0 -1
- package/dist/types/cache.d.ts +0 -214
- package/dist/types/cache.d.ts.map +0 -1
- package/dist/types/cloudforge.d.ts +0 -753
- package/dist/types/cloudforge.d.ts.map +0 -1
- package/dist/types/connection.d.ts +0 -91
- package/dist/types/connection.d.ts.map +0 -1
- package/dist/types/index.d.ts +0 -10
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/migration.d.ts +0 -225
- package/dist/types/migration.d.ts.map +0 -1
- package/dist/types/plugin.d.ts +0 -432
- package/dist/types/plugin.d.ts.map +0 -1
- package/dist/types/query-builder.d.ts +0 -217
- package/dist/types/query-builder.d.ts.map +0 -1
- package/dist/types/seed.d.ts +0 -187
- package/dist/types/seed.d.ts.map +0 -1
- package/dist/types/tenant.d.ts +0 -140
- package/dist/types/tenant.d.ts.map +0 -1
- package/dist/types/transaction.d.ts +0 -144
- package/dist/types/transaction.d.ts.map +0 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/connection/manager.ts","../src/query/builder.ts","../src/query/raw.ts","../src/transaction/transaction.ts","../src/tenant/context.ts","../src/tenant/query-wrapper.ts","../src/tenant/schema-manager.ts","../src/cache/memory-cache.ts","../src/cache/kv-cache.ts","../src/cache/invalidation.ts","../src/migration/loader.ts","../src/migration/runner.ts","../src/migration/seeder.ts","../src/cloudforge/d1-adapter.ts","../src/cloudforge/do-storage.ts","../src/cloudforge/r2-backup.ts","../src/index.ts"],"names":["Result","conn","randomBytes","AsyncLocalStorage","Option","version","crypto","now","entry","fs","path","result","fs2","path2","gzipSync","gunzipSync"],"mappings":"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","file":"index.cjs","sourcesContent":["import { Result, Logger } from '@gl-life/gl-life-core';\nimport type {\n DatabaseConnection,\n DatabaseConnectionConfig,\n DatabaseConnectionError,\n} from '../types/connection.js';\n\n/**\n * Extended configuration for connection manager\n */\ninterface ConnectionManagerConfig extends DatabaseConnectionConfig {\n autoReconnect?: boolean;\n maxRetries?: number;\n retryDelay?: number;\n}\n\n/**\n * Internal connection wrapper\n */\nclass InternalConnection implements DatabaseConnection {\n readonly id: string;\n readonly config: DatabaseConnectionConfig;\n private connected: boolean = false;\n private lastPing: Date | null = null;\n\n constructor(id: string, config: DatabaseConnectionConfig) {\n this.id = id;\n this.config = config;\n }\n\n get isConnected(): boolean {\n return this.connected;\n }\n\n async connect(): Promise<Result<void, DatabaseConnectionError>> {\n try {\n this.connected = true;\n this.lastPing = new Date();\n return Result.ok(undefined);\n } catch (error) {\n return Result.err({\n type: 'CONNECTION_FAILED',\n message: `Failed to connect: ${error}`,\n cause: error,\n });\n }\n }\n\n async disconnect(): Promise<Result<void, DatabaseConnectionError>> {\n try {\n this.connected = false;\n this.lastPing = null;\n return Result.ok(undefined);\n } catch (error) {\n return Result.err({\n type: 'CONNECTION_FAILED',\n message: `Failed to disconnect: ${error}`,\n cause: error,\n });\n }\n }\n\n async execute<T = unknown>(\n sql: string,\n params?: unknown[]\n ): Promise<Result<T, DatabaseConnectionError>> {\n if (!this.connected) {\n return Result.err({\n type: 'CONNECTION_CLOSED',\n message: 'Connection is not active',\n });\n }\n\n try {\n // Mock execution for now - will integrate with gl-life-data\n return Result.ok({} as T);\n } catch (error) {\n return Result.err({\n type: 'UNKNOWN',\n message: `Query execution failed: ${error}`,\n cause: error,\n });\n }\n }\n\n async ping(): Promise<Result<boolean, DatabaseConnectionError>> {\n if (!this.connected) {\n return Result.ok(false);\n }\n\n try {\n this.lastPing = new Date();\n return Result.ok(true);\n } catch (error) {\n return Result.err({\n type: 'UNKNOWN',\n message: `Ping failed: ${error}`,\n cause: error,\n });\n }\n }\n}\n\n/**\n * Database connection manager with pooling, health checks, and auto-reconnect\n */\nexport class DatabaseConnectionManager {\n private config: ConnectionManagerConfig;\n private logger: Logger;\n private pool: InternalConnection[] = [];\n private available: InternalConnection[] = [];\n private active: Set<InternalConnection> = new Set();\n private initialized: boolean = false;\n private destroyed: boolean = false;\n private connectionIdCounter: number = 0;\n\n constructor(config: ConnectionManagerConfig, logger: Logger) {\n // Validate configuration\n if (!config.name || config.name.trim() === '') {\n throw new Error('Database name is required');\n }\n if (config.maxConnections !== undefined && config.maxConnections < 0) {\n throw new Error('maxConnections must be >= 0');\n }\n\n this.config = {\n maxConnections: 10,\n timeout: 30000,\n autoReconnect: false,\n maxRetries: 3,\n retryDelay: 1000,\n ...config,\n };\n this.logger = logger;\n }\n\n /**\n * Get manager configuration\n */\n getConfig(): ConnectionManagerConfig {\n return { ...this.config };\n }\n\n /**\n * Get number of active connections\n */\n getActiveCount(): number {\n return this.active.size;\n }\n\n /**\n * Initialize the connection manager\n */\n async initialize(): Promise<Result<void, DatabaseConnectionError>> {\n if (this.initialized) {\n return Result.ok(undefined);\n }\n\n if (this.destroyed) {\n return Result.err({\n type: 'CONNECTION_CLOSED',\n message: 'Manager has been destroyed',\n });\n }\n\n this.logger.info('Initializing DatabaseConnectionManager', {\n name: this.config.name,\n maxConnections: this.config.maxConnections,\n });\n\n try {\n this.initialized = true;\n this.logger.info('DatabaseConnectionManager initialized successfully');\n return Result.ok(undefined);\n } catch (error) {\n this.initialized = false;\n return Result.err({\n type: 'CONNECTION_FAILED',\n message: `Initialization failed: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Acquire a connection from the pool\n */\n async acquire(): Promise<Result<DatabaseConnection, DatabaseConnectionError>> {\n if (this.destroyed) {\n this.logger.error('Cannot acquire connection: manager destroyed');\n return Result.err({\n type: 'CONNECTION_CLOSED',\n message: 'Manager has been destroyed',\n });\n }\n\n if (!this.initialized) {\n return Result.err({\n type: 'CONNECTION_CLOSED',\n message: 'Manager not initialized',\n });\n }\n\n this.logger.debug('Acquiring connection from pool', {\n available: this.available.length,\n active: this.active.size,\n total: this.pool.length,\n });\n\n // Check if we have an available connection\n if (this.available.length > 0) {\n const conn = this.available.pop()!;\n this.active.add(conn);\n\n // Verify connection is still healthy\n const pingResult = await conn.ping();\n if (pingResult.isOk() && pingResult.unwrap()) {\n this.logger.debug('Reusing existing connection', { id: conn.id });\n return Result.ok(conn);\n } else {\n // Connection is unhealthy, reconnect if enabled\n if (this.config.autoReconnect) {\n const reconnectResult = await conn.connect();\n if (reconnectResult.isOk()) {\n this.logger.debug('Reconnected unhealthy connection', { id: conn.id });\n return Result.ok(conn);\n }\n }\n // Remove unhealthy connection\n this.active.delete(conn);\n this.pool = this.pool.filter(c => c.id !== conn.id);\n }\n }\n\n // Check if we can create a new connection\n const maxConnections = this.config.maxConnections!;\n if (this.pool.length >= maxConnections) {\n this.logger.error('Connection pool limit reached', {\n max: maxConnections,\n current: this.pool.length,\n });\n return Result.err({\n type: 'CONNECTION_FAILED',\n message: `Connection pool limit reached (${maxConnections})`,\n });\n }\n\n // Create new connection\n const connId = `conn-${++this.connectionIdCounter}`;\n const conn = new InternalConnection(connId, this.config);\n\n const connectResult = await conn.connect();\n if (connectResult.isErr()) {\n return connectResult;\n }\n\n this.pool.push(conn);\n this.active.add(conn);\n\n this.logger.debug('Created new connection', {\n id: conn.id,\n poolSize: this.pool.length,\n });\n\n return Result.ok(conn);\n }\n\n /**\n * Release a connection back to the pool\n */\n async release(connection: DatabaseConnection): Promise<Result<void, DatabaseConnectionError>> {\n if (!connection || !connection.id) {\n return Result.err({\n type: 'DATABASE_NOT_FOUND',\n message: 'Invalid connection provided',\n });\n }\n\n const conn = this.pool.find(c => c.id === connection.id);\n if (!conn) {\n return Result.err({\n type: 'DATABASE_NOT_FOUND',\n message: 'Connection not found in pool',\n });\n }\n\n this.active.delete(conn as InternalConnection);\n this.available.push(conn as InternalConnection);\n\n this.logger.debug('Released connection back to pool', {\n id: connection.id,\n available: this.available.length,\n });\n\n return Result.ok(undefined);\n }\n\n /**\n * Perform health check on all connections\n */\n async healthCheck(): Promise<Result<boolean, DatabaseConnectionError>> {\n if (this.destroyed) {\n return Result.ok(false);\n }\n\n if (!this.initialized) {\n return Result.ok(false);\n }\n\n try {\n if (this.pool.length === 0) {\n // No connections yet, try to create one\n const testConn = await this.acquire();\n if (testConn.isErr()) {\n return Result.ok(false);\n }\n await this.release(testConn.unwrap());\n return Result.ok(true);\n }\n\n // Check all connections\n const checks = this.pool.map(conn => conn.ping());\n const results = await Promise.all(checks);\n\n const allHealthy = results.every(r => r.isOk() && r.unwrap() === true);\n\n if (!allHealthy && this.config.autoReconnect) {\n // Attempt to reconnect unhealthy connections\n for (let i = 0; i < this.pool.length; i++) {\n const result = results[i];\n if (result.isErr() || !result.unwrap()) {\n await this.pool[i].connect();\n }\n }\n }\n\n return Result.ok(allHealthy);\n } catch (error) {\n return Result.err({\n type: 'UNKNOWN',\n message: `Health check failed: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Destroy the connection manager and close all connections\n */\n async destroy(): Promise<Result<void, DatabaseConnectionError>> {\n if (this.destroyed) {\n return Result.ok(undefined);\n }\n\n this.logger.info('Destroying DatabaseConnectionManager', {\n totalConnections: this.pool.length,\n activeConnections: this.active.size,\n });\n\n try {\n // Close all connections\n const closePromises = this.pool.map(conn => conn.disconnect());\n await Promise.all(closePromises);\n\n this.pool = [];\n this.available = [];\n this.active.clear();\n this.initialized = false;\n this.destroyed = true;\n\n this.logger.info('DatabaseConnectionManager destroyed successfully');\n return Result.ok(undefined);\n } catch (error) {\n return Result.err({\n type: 'UNKNOWN',\n message: `Destroy failed: ${error}`,\n cause: error,\n });\n }\n }\n}\n","import { Result, Logger } from '@gl-life/gl-life-core';\nimport type {\n QueryBuilder as IQueryBuilder,\n QueryBuilderError,\n WhereOperator,\n WhereCondition,\n JoinType,\n OrderDirection,\n} from '../types/query-builder.js';\n\n/**\n * Type-safe query builder wrapper for gl-life-data\n *\n * Wraps gl-life-data QueryBuilder with:\n * - Type safety using TypeScript generics\n * - Result<T, E> pattern for error handling\n * - Fluent chainable API\n * - Complex joins, aggregations, subqueries support\n */\nexport class TypeSafeQueryBuilder<T = unknown> implements IQueryBuilder<T> {\n private tableName: string;\n private metaDataService: any;\n private logger: Logger;\n\n private selectedColumns: string[] = [];\n private whereConditions: Array<{ field: string; operator: WhereOperator; value?: unknown; isOr?: boolean }> = [];\n private joinClauses: Array<{ type: JoinType; table: string; left: string; right: string }> = [];\n private orderByClauses: Array<{ field: string; direction: OrderDirection }> = [];\n private groupByFields: string[] = [];\n private havingCondition: string | null = null;\n private limitValue: number | null = null;\n private offsetValue: number | null = null;\n\n constructor(tableName: string, metaDataService: any, logger: Logger) {\n if (!tableName || tableName.trim() === '') {\n throw new Error('Table name is required');\n }\n this.tableName = tableName;\n this.metaDataService = metaDataService;\n this.logger = logger;\n }\n\n table(table: string): IQueryBuilder<T> {\n this.tableName = table;\n return this;\n }\n\n select(...columns: string[]): IQueryBuilder<T> {\n this.selectedColumns.push(...columns);\n return this;\n }\n\n where(field: string, operator: WhereOperator, value?: unknown): IQueryBuilder<T> {\n this.whereConditions.push({ field, operator, value, isOr: false });\n return this;\n }\n\n orWhere(field: string, operator: WhereOperator, value?: unknown): IQueryBuilder<T> {\n this.whereConditions.push({ field, operator, value, isOr: true });\n return this;\n }\n\n whereIn(field: string, values: unknown[]): IQueryBuilder<T> {\n this.whereConditions.push({ field, operator: 'IN', value: values, isOr: false });\n return this;\n }\n\n join(table: string, leftField: string, rightField: string, type: JoinType = 'INNER'): IQueryBuilder<T> {\n this.joinClauses.push({ type, table, left: leftField, right: rightField });\n return this;\n }\n\n orderBy(field: string, direction: OrderDirection = 'ASC'): IQueryBuilder<T> {\n this.orderByClauses.push({ field, direction });\n return this;\n }\n\n groupBy(...fields: string[]): IQueryBuilder<T> {\n this.groupByFields.push(...fields);\n return this;\n }\n\n having(condition: string): IQueryBuilder<T> {\n this.havingCondition = condition;\n return this;\n }\n\n limit(limit: number): IQueryBuilder<T> {\n this.limitValue = limit;\n return this;\n }\n\n offset(offset: number): IQueryBuilder<T> {\n this.offsetValue = offset;\n return this;\n }\n\n async insert(data: Partial<T>): Promise<Result<T, QueryBuilderError>> {\n try {\n this.logger.debug('Insert operation', { table: this.tableName, data });\n // Mock implementation - would integrate with gl-life-data\n return Result.ok(data as T);\n } catch (error) {\n return Result.err({\n type: 'EXECUTION_FAILED',\n message: `Insert failed: ${error}`,\n cause: error,\n });\n }\n }\n\n async insertMany(data: Partial<T>[]): Promise<Result<T[], QueryBuilderError>> {\n try {\n this.logger.debug('Insert many operation', { table: this.tableName, count: data.length });\n return Result.ok(data as T[]);\n } catch (error) {\n return Result.err({\n type: 'EXECUTION_FAILED',\n message: `Insert many failed: ${error}`,\n cause: error,\n });\n }\n }\n\n async update(data: Partial<T>): Promise<Result<number, QueryBuilderError>> {\n try {\n this.logger.debug('Update operation', { table: this.tableName, data });\n // Mock implementation\n return Result.ok(1);\n } catch (error) {\n return Result.err({\n type: 'EXECUTION_FAILED',\n message: `Update failed: ${error}`,\n cause: error,\n });\n }\n }\n\n async delete(): Promise<Result<number, QueryBuilderError>> {\n try {\n this.logger.debug('Delete operation', { table: this.tableName });\n return Result.ok(1);\n } catch (error) {\n return Result.err({\n type: 'EXECUTION_FAILED',\n message: `Delete failed: ${error}`,\n cause: error,\n });\n }\n }\n\n async first(): Promise<Result<T | null, QueryBuilderError>> {\n try {\n this.logger.debug('First operation', { table: this.tableName });\n // Mock implementation\n return Result.ok(null);\n } catch (error) {\n return Result.err({\n type: 'EXECUTION_FAILED',\n message: `First failed: ${error}`,\n cause: error,\n });\n }\n }\n\n async get(): Promise<Result<T[], QueryBuilderError>> {\n try {\n this.logger.debug('Get operation', { table: this.tableName });\n // Mock implementation - would integrate with gl-life-data QueryBuilder\n return Result.ok([]);\n } catch (error) {\n return Result.err({\n type: 'EXECUTION_FAILED',\n message: `Get failed: ${error}`,\n cause: error,\n });\n }\n }\n\n async count(field: string = '*'): Promise<Result<number, QueryBuilderError>> {\n try {\n this.logger.debug('Count operation', { table: this.tableName, field });\n return Result.ok(0);\n } catch (error) {\n return Result.err({\n type: 'EXECUTION_FAILED',\n message: `Count failed: ${error}`,\n cause: error,\n });\n }\n }\n\n toSQL(): string {\n const columns = this.selectedColumns.length > 0 ? this.selectedColumns.join(', ') : '*';\n let sql = `SELECT ${columns} FROM ${this.tableName}`;\n\n if (this.joinClauses.length > 0) {\n sql += ' ' + this.joinClauses\n .map(j => `${j.type} JOIN ${j.table} ON ${j.left} = ${j.right}`)\n .join(' ');\n }\n\n if (this.whereConditions.length > 0) {\n const whereParts = this.whereConditions.map((w, i) => {\n const prefix = i === 0 ? 'WHERE' : (w.isOr ? 'OR' : 'AND');\n return `${prefix} ${w.field} ${w.operator} ?`;\n });\n sql += ' ' + whereParts.join(' ');\n }\n\n if (this.groupByFields.length > 0) {\n sql += ` GROUP BY ${this.groupByFields.join(', ')}`;\n }\n\n if (this.havingCondition) {\n sql += ` HAVING ${this.havingCondition}`;\n }\n\n if (this.orderByClauses.length > 0) {\n sql += ' ORDER BY ' + this.orderByClauses\n .map(o => `${o.field} ${o.direction}`)\n .join(', ');\n }\n\n if (this.limitValue !== null) {\n sql += ` LIMIT ${this.limitValue}`;\n }\n\n if (this.offsetValue !== null) {\n sql += ` OFFSET ${this.offsetValue}`;\n }\n\n return sql;\n }\n\n getBindings(): unknown[] {\n return this.whereConditions.map(w => w.value).filter(v => v !== undefined);\n }\n\n clone(): IQueryBuilder<T> {\n const cloned = new TypeSafeQueryBuilder<T>(this.tableName, this.metaDataService, this.logger);\n cloned.selectedColumns = [...this.selectedColumns];\n cloned.whereConditions = [...this.whereConditions];\n cloned.joinClauses = [...this.joinClauses];\n cloned.orderByClauses = [...this.orderByClauses];\n cloned.groupByFields = [...this.groupByFields];\n cloned.havingCondition = this.havingCondition;\n cloned.limitValue = this.limitValue;\n cloned.offsetValue = this.offsetValue;\n return cloned;\n }\n}\n","import { Result, Logger } from '@gl-life/gl-life-core';\nimport type { DatabaseConnection, DatabaseConnectionError } from '../types/connection.js';\n\n/**\n * Raw SQL execution error types\n */\nexport type RawSQLError =\n | { type: 'INVALID_SQL'; message: string }\n | { type: 'PARAMETER_MISMATCH'; message: string }\n | { type: 'EXECUTION_FAILED'; message: string; cause?: unknown }\n | { type: 'VALIDATION_FAILED'; message: string }\n | DatabaseConnectionError;\n\n/**\n * Query with parameters for batch execution\n */\nexport interface SQLQuery {\n sql: string;\n params?: unknown[];\n}\n\n/**\n * Execution options\n */\nexport interface ExecutionOptions {\n transaction?: boolean;\n timeout?: number;\n}\n\n/**\n * Raw SQL Executor\n *\n * Provides safe raw SQL execution with:\n * - Parameterized queries to prevent SQL injection\n * - Result type mapping\n * - Query validation\n * - Batch execution support\n * - Error handling with Result pattern\n */\nexport class RawSQLExecutor {\n private readonly connection: DatabaseConnection;\n private readonly logger: Logger;\n\n constructor(connection: DatabaseConnection, logger: Logger) {\n this.connection = connection;\n this.logger = logger;\n }\n\n /**\n * Execute a raw SQL query with parameters\n *\n * Uses parameterized queries to prevent SQL injection.\n * All parameter values are properly escaped by the database driver.\n *\n * @param sql - SQL query string with ? placeholders\n * @param params - Parameter values to bind to placeholders\n * @param options - Execution options\n * @returns Result containing array of rows or error\n */\n async execute<T = unknown>(\n sql: string,\n params: unknown[] = [],\n options?: ExecutionOptions\n ): Promise<Result<T[], RawSQLError>> {\n // Validate SQL query\n const validationResult = this.validateSQL(sql, params);\n if (validationResult.isErr()) {\n return validationResult as Result<T[], RawSQLError>;\n }\n\n try {\n this.logger.debug('Executing raw SQL', {\n sql: sql.substring(0, 100),\n paramCount: params.length,\n });\n\n // Execute query through connection\n const result = await this.connection.execute<any>(sql, params);\n\n if (result.isErr()) {\n // Connection error - convert to RawSQLError\n return Result.err({\n type: 'EXECUTION_FAILED',\n message: 'Query execution failed',\n cause: result,\n });\n }\n\n const data = result.unwrap();\n\n // Extract rows from result\n // The result can be { rows: [...] } or just the array itself\n let rows: T[];\n if (data && typeof data === 'object' && 'rows' in data) {\n rows = data.rows;\n } else if (Array.isArray(data)) {\n rows = data;\n } else {\n rows = [];\n }\n\n this.logger.debug('Query executed successfully', {\n rowCount: rows.length,\n });\n\n return Result.ok(rows);\n } catch (error) {\n this.logger.error('Raw SQL execution failed', {\n error,\n sql: sql.substring(0, 100),\n });\n\n return Result.err({\n type: 'EXECUTION_FAILED',\n message: `Query execution failed: ${error instanceof Error ? error.message : String(error)}`,\n cause: error,\n });\n }\n }\n\n /**\n * Execute a query and return the first row or null\n *\n * @param sql - SQL query string\n * @param params - Parameter values\n * @param options - Execution options\n * @returns Result containing single row or null\n */\n async executeOne<T = unknown>(\n sql: string,\n params: unknown[] = [],\n options?: ExecutionOptions\n ): Promise<Result<T | null, RawSQLError>> {\n const result = await this.execute<T>(sql, params, options);\n\n if (result.isErr()) {\n return result as Result<T | null, RawSQLError>;\n }\n\n const rows = result.unwrap();\n return Result.ok(rows.length > 0 ? rows[0] : null);\n }\n\n /**\n * Execute multiple queries in batch\n *\n * All queries execute sequentially. If any query fails, execution stops\n * and an error is returned.\n *\n * @param queries - Array of SQL queries with parameters\n * @returns Result containing array of results or error\n */\n async executeBatch<T = unknown>(\n queries: SQLQuery[]\n ): Promise<Result<T[][], RawSQLError>> {\n const results: T[][] = [];\n\n try {\n this.logger.debug('Executing batch queries', { count: queries.length });\n\n for (const query of queries) {\n const result = await this.execute<T>(query.sql, query.params || []);\n\n if (result.isErr()) {\n // Batch execution failed\n return Result.err({\n type: 'EXECUTION_FAILED',\n message: 'Batch execution failed',\n cause: result,\n });\n }\n\n results.push(result.unwrap());\n }\n\n this.logger.debug('Batch execution completed', {\n queryCount: queries.length,\n totalRows: results.reduce((sum, rows) => sum + rows.length, 0),\n });\n\n return Result.ok(results);\n } catch (error) {\n this.logger.error('Batch execution failed', { error });\n\n return Result.err({\n type: 'EXECUTION_FAILED',\n message: `Batch execution failed: ${error instanceof Error ? error.message : String(error)}`,\n cause: error,\n });\n }\n }\n\n /**\n * Validate SQL query and parameters\n *\n * Checks for:\n * - Empty/whitespace-only queries\n * - Parameter count matching placeholder count\n *\n * @param sql - SQL query string\n * @param params - Parameter values\n * @returns Result indicating validation success or error\n */\n private validateSQL(sql: string, params: unknown[]): Result<void, RawSQLError> {\n // Check for empty query\n if (!sql || sql.trim().length === 0) {\n return Result.err({\n type: 'INVALID_SQL',\n message: 'SQL query cannot be empty',\n });\n }\n\n // Count placeholders in SQL\n const placeholderCount = (sql.match(/\\?/g) || []).length;\n\n // Validate parameter count matches placeholders\n if (placeholderCount !== params.length) {\n return Result.err({\n type: 'PARAMETER_MISMATCH',\n message: `Parameter count mismatch: expected ${placeholderCount} but got ${params.length}`,\n });\n }\n\n return Result.ok(undefined);\n }\n}\n","import { Result, Logger } from '@gl-life/gl-life-core';\nimport { randomBytes } from 'crypto';\nimport type {\n Transaction,\n TransactionError,\n TransactionState,\n TransactionConfig,\n TransactionIsolationLevel,\n} from '../types/transaction.js';\nimport type { QueryBuilder } from '../types/query-builder.js';\nimport { TypeSafeQueryBuilder } from '../query/builder.js';\n\n/**\n * Database connection interface\n */\ninterface DbConnection {\n execute<T = unknown>(sql: string, params: unknown[]): Promise<T>;\n batch?(queries: Array<{ sql: string; params: unknown[] }>): Promise<unknown[]>;\n}\n\n/**\n * Database Transaction implementation\n *\n * Provides ACID transaction support with:\n * - BEGIN/COMMIT/ROLLBACK operations\n * - Savepoint support for nested transactions\n * - Automatic rollback on errors (configurable)\n * - Transaction timeout handling\n * - Query builder integration\n */\nexport class DatabaseTransaction implements Transaction {\n private readonly _id: string;\n private readonly db: DbConnection;\n private readonly _logger: Logger;\n private readonly _config: Required<TransactionConfig>;\n private _state: TransactionState = 'PENDING';\n private startTime: number | null = null;\n private timeoutHandle: NodeJS.Timeout | null = null;\n\n constructor(\n db: DbConnection,\n logger: Logger,\n config: TransactionConfig = {}\n ) {\n this._id = this.generateTransactionId();\n this.db = db;\n this._logger = logger;\n this._config = {\n isolationLevel: config.isolationLevel || 'READ COMMITTED',\n timeout: config.timeout || 30000,\n autoRollback: config.autoRollback !== undefined ? config.autoRollback : true,\n };\n }\n\n private generateTransactionId(): string {\n return `tx_${randomBytes(16).toString('hex')}`;\n }\n\n get id(): string {\n return this._id;\n }\n\n get state(): TransactionState {\n return this._state;\n }\n\n get config(): TransactionConfig {\n return this._config;\n }\n\n get isActive(): boolean {\n return this._state === 'ACTIVE';\n }\n\n async begin(): Promise<Result<void, TransactionError>> {\n if (this._state !== 'PENDING') {\n return Result.err({\n type: 'ALREADY_STARTED',\n message: `Transaction ${this._id} is already ${this._state}`,\n });\n }\n\n try {\n this._logger.debug('Beginning transaction', {\n id: this._id,\n isolationLevel: this._config.isolationLevel,\n });\n\n // SQLite doesn't support setting isolation level directly in BEGIN\n // It uses PRAGMA for isolation levels, but for simplicity we'll just use BEGIN\n await this.db.execute('BEGIN', []);\n\n this._state = 'ACTIVE';\n this.startTime = Date.now();\n\n // Set timeout if configured\n if (this._config.timeout && this._config.timeout > 0) {\n this.timeoutHandle = setTimeout(() => {\n this.handleTimeout();\n }, this._config.timeout);\n }\n\n return Result.ok(undefined);\n } catch (error) {\n this._logger.error('Failed to begin transaction', { error, id: this._id });\n return Result.err({\n type: 'BEGIN_FAILED',\n message: `Failed to begin transaction: ${error instanceof Error ? error.message : String(error)}`,\n cause: error,\n });\n }\n }\n\n async commit(): Promise<Result<void, TransactionError>> {\n if (this._state === 'PENDING') {\n return Result.err({\n type: 'NOT_STARTED',\n message: `Transaction ${this._id} has not been started`,\n });\n }\n\n if (this._state === 'COMMITTED' || this._state === 'ROLLED_BACK') {\n return Result.err({\n type: 'ALREADY_COMPLETED',\n message: `Transaction ${this._id} is already ${this._state}`,\n });\n }\n\n try {\n this._logger.debug('Committing transaction', { id: this._id });\n\n await this.db.execute('COMMIT', []);\n\n this._state = 'COMMITTED';\n this.clearTimeout();\n\n const duration = this.startTime ? Date.now() - this.startTime : 0;\n this._logger.info('Transaction committed', { id: this._id, duration });\n\n return Result.ok(undefined);\n } catch (error) {\n this._logger.error('Failed to commit transaction', { error, id: this._id });\n return Result.err({\n type: 'COMMIT_FAILED',\n message: `Failed to commit transaction: ${error instanceof Error ? error.message : String(error)}`,\n cause: error,\n });\n }\n }\n\n async rollback(): Promise<Result<void, TransactionError>> {\n if (this._state === 'PENDING') {\n return Result.err({\n type: 'NOT_STARTED',\n message: `Transaction ${this._id} has not been started`,\n });\n }\n\n if (this._state === 'COMMITTED' || this._state === 'ROLLED_BACK') {\n return Result.err({\n type: 'ALREADY_COMPLETED',\n message: `Transaction ${this._id} is already ${this._state}`,\n });\n }\n\n try {\n this._logger.debug('Rolling back transaction', { id: this._id });\n\n await this.db.execute('ROLLBACK', []);\n\n this._state = 'ROLLED_BACK';\n this.clearTimeout();\n\n const duration = this.startTime ? Date.now() - this.startTime : 0;\n this._logger.info('Transaction rolled back', { id: this._id, duration });\n\n return Result.ok(undefined);\n } catch (error) {\n this._logger.error('Failed to rollback transaction', { error, id: this._id });\n return Result.err({\n type: 'ROLLBACK_FAILED',\n message: `Failed to rollback transaction: ${error instanceof Error ? error.message : String(error)}`,\n cause: error,\n });\n }\n }\n\n async savepoint(name: string): Promise<Result<string, TransactionError>> {\n if (!this.isActive) {\n return Result.err({\n type: 'NOT_STARTED',\n message: `Cannot create savepoint: transaction ${this._id} is not active`,\n });\n }\n\n try {\n this._logger.debug('Creating savepoint', { id: this._id, savepoint: name });\n\n await this.db.execute(`SAVEPOINT ${name}`, []);\n\n return Result.ok(name);\n } catch (error) {\n this._logger.error('Failed to create savepoint', { error, id: this._id, savepoint: name });\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to create savepoint: ${error instanceof Error ? error.message : String(error)}`,\n cause: error,\n });\n }\n }\n\n async rollbackToSavepoint(name: string): Promise<Result<void, TransactionError>> {\n if (!this.isActive) {\n return Result.err({\n type: 'NOT_STARTED',\n message: `Cannot rollback to savepoint: transaction ${this._id} is not active`,\n });\n }\n\n try {\n this._logger.debug('Rolling back to savepoint', { id: this._id, savepoint: name });\n\n await this.db.execute(`ROLLBACK TO SAVEPOINT ${name}`, []);\n\n return Result.ok(undefined);\n } catch (error) {\n this._logger.error('Failed to rollback to savepoint', { error, id: this._id, savepoint: name });\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to rollback to savepoint: ${error instanceof Error ? error.message : String(error)}`,\n cause: error,\n });\n }\n }\n\n async releaseSavepoint(name: string): Promise<Result<void, TransactionError>> {\n if (!this.isActive) {\n return Result.err({\n type: 'NOT_STARTED',\n message: `Cannot release savepoint: transaction ${this._id} is not active`,\n });\n }\n\n try {\n this._logger.debug('Releasing savepoint', { id: this._id, savepoint: name });\n\n await this.db.execute(`RELEASE SAVEPOINT ${name}`, []);\n\n return Result.ok(undefined);\n } catch (error) {\n this._logger.error('Failed to release savepoint', { error, id: this._id, savepoint: name });\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to release savepoint: ${error instanceof Error ? error.message : String(error)}`,\n cause: error,\n });\n }\n }\n\n async execute<T = unknown>(\n sql: string,\n params: unknown[] = []\n ): Promise<Result<T, TransactionError>> {\n if (!this.isActive) {\n return Result.err({\n type: 'NOT_STARTED',\n message: `Cannot execute query: transaction ${this._id} is not active`,\n });\n }\n\n try {\n this._logger.debug('Executing query in transaction', {\n id: this._id,\n sql: sql.substring(0, 100),\n });\n\n const result = await this.db.execute<T>(sql, params);\n\n return Result.ok(result);\n } catch (error) {\n this._logger.error('Query execution failed in transaction', {\n error,\n id: this._id,\n sql: sql.substring(0, 100),\n });\n return Result.err({\n type: 'UNKNOWN',\n message: `Query execution failed: ${error instanceof Error ? error.message : String(error)}`,\n cause: error,\n });\n }\n }\n\n queryBuilder<T = unknown>(table: string): QueryBuilder<T> {\n // Create a mock MetaDataService for now\n const mockMetaDataService = {\n getAllMappings: async () => [],\n getMapping: async () => null,\n };\n\n return new TypeSafeQueryBuilder<T>(table, mockMetaDataService, this._logger);\n }\n\n async run<T>(\n callback: (tx: Transaction) => Promise<Result<T, unknown>>\n ): Promise<Result<T, TransactionError>> {\n // Begin transaction if not already started\n if (this._state === 'PENDING') {\n const beginResult = await this.begin();\n if (beginResult.isErr()) {\n // Type-cast since we know this is a TransactionError\n return beginResult as Result<T, TransactionError>;\n }\n }\n\n try {\n // Execute callback\n const result = await callback(this);\n\n // Handle callback result\n if (result.isErr()) {\n // Callback returned an error - rollback if autoRollback is enabled\n if (this._config.autoRollback) {\n await this.rollback();\n }\n return Result.err({\n type: 'UNKNOWN',\n message: 'Transaction callback returned error',\n cause: result,\n });\n }\n\n // Success - commit\n const commitResult = await this.commit();\n if (commitResult.isErr()) {\n // Type-cast since we know this is a TransactionError\n return commitResult as Result<T, TransactionError>;\n }\n\n return Result.ok(result.unwrap());\n } catch (error) {\n // Exception thrown - rollback if autoRollback is enabled\n if (this._config.autoRollback) {\n await this.rollback();\n }\n\n return Result.err({\n type: 'UNKNOWN',\n message: `Transaction failed: ${error instanceof Error ? error.message : String(error)}`,\n cause: error,\n });\n }\n }\n\n private handleTimeout(): void {\n if (this.isActive) {\n this._logger.warn('Transaction timeout', {\n id: this._id,\n timeout: this._config.timeout,\n });\n\n // Force rollback on timeout\n this.rollback().then(result => {\n if (result.isErr()) {\n this._logger.error('Failed to rollback timed out transaction', {\n id: this._id,\n error: 'Transaction rollback failed',\n });\n }\n });\n }\n }\n\n private clearTimeout(): void {\n if (this.timeoutHandle) {\n clearTimeout(this.timeoutHandle);\n this.timeoutHandle = null;\n }\n }\n}\n","import { Option, Logger } from '@gl-life/gl-life-core';\nimport { AsyncLocalStorage } from 'async_hooks';\nimport type {\n TenantContext,\n TenantMetadata,\n TenantContextConfig,\n} from '../types/tenant.js';\n\n/**\n * Tenant context store for AsyncLocalStorage\n */\ninterface TenantContextStore {\n tenantMetadata: TenantMetadata | null;\n}\n\n/**\n * Tenant Context Manager\n *\n * Manages multi-tenancy context using AsyncLocalStorage for request isolation.\n * Supports multiple isolation strategies: DATABASE, SCHEMA, ROW, and HYBRID.\n *\n * Features:\n * - AsyncLocalStorage for context isolation (Cloudflare Workers compatible)\n * - Multiple isolation strategies\n * - Automatic SQL query modification for tenant isolation\n * - Tenant validation\n * - Scoped execution with withTenant()\n */\nexport class TenantContextManager implements TenantContext {\n private readonly storage: AsyncLocalStorage<TenantContextStore>;\n private readonly _config: TenantContextConfig;\n private readonly logger: Logger;\n private currentTenant: TenantMetadata | null = null;\n\n constructor(config: TenantContextConfig, logger: Logger) {\n this._config = config;\n this.logger = logger;\n this.storage = new AsyncLocalStorage<TenantContextStore>();\n }\n\n get tenant(): Option<TenantMetadata> {\n return this.getTenant();\n }\n\n get config(): TenantContextConfig {\n return this._config;\n }\n\n get hasTenant(): boolean {\n return this.currentTenant !== null;\n }\n\n async setTenant(tenantId: string): Promise<void> {\n this.validateTenantId(tenantId);\n\n this.logger.debug('Setting tenant', { tenantId });\n\n // Create basic metadata from ID\n const metadata: TenantMetadata = {\n id: tenantId,\n name: tenantId,\n createdAt: new Date(),\n updatedAt: new Date(),\n isActive: true,\n };\n\n this.currentTenant = metadata;\n }\n\n async setTenantWithMetadata(metadata: TenantMetadata): Promise<void> {\n this.validateTenantId(metadata.id);\n\n this.logger.debug('Setting tenant with metadata', {\n tenantId: metadata.id,\n name: metadata.name,\n });\n\n this.currentTenant = metadata;\n }\n\n async clearTenant(): Promise<void> {\n this.logger.debug('Clearing tenant context');\n this.currentTenant = null;\n }\n\n getTenantId(): Option<string> {\n if (this.currentTenant) {\n return Option.some(this.currentTenant.id);\n }\n return Option.none();\n }\n\n getTenant(): Option<TenantMetadata> {\n if (this.currentTenant) {\n return Option.some(this.currentTenant);\n }\n return Option.none();\n }\n\n shouldIsolateTable(table: string): boolean {\n // Don't isolate if isolation is not enforced\n if (!this._config.enforceIsolation) {\n return false;\n }\n\n // Don't isolate excluded tables\n if (this._config.excludedTables?.includes(table)) {\n return false;\n }\n\n return true;\n }\n\n applyTenantIsolation(\n sql: string,\n params: unknown[] = []\n ): { sql: string; params: unknown[] } {\n // Get current tenant\n const tenantId = this.getTenantId();\n if (tenantId.isNone()) {\n throw new Error('No tenant context set. Cannot apply tenant isolation.');\n }\n\n const tenant = tenantId.unwrap();\n\n // Extract table name from SQL (simple extraction for common cases)\n const tableMatch = sql.match(/(?:FROM|INTO|UPDATE)\\s+([a-zA-Z_][a-zA-Z0-9_]*)/i);\n if (tableMatch) {\n const tableName = tableMatch[1];\n\n // Check if table should be isolated\n if (!this.shouldIsolateTable(tableName)) {\n return { sql, params };\n }\n }\n\n // Apply isolation based on strategy\n switch (this._config.isolationStrategy) {\n case 'ROW':\n return this.applyRowLevelIsolation(sql, params, tenant);\n\n case 'SCHEMA':\n return this.applySchemaIsolation(sql, params, tenant);\n\n case 'DATABASE':\n // DATABASE isolation doesn't modify SQL, it changes the connection\n return { sql, params };\n\n case 'HYBRID':\n // For hybrid, apply both ROW and SCHEMA isolation\n const schemaResult = this.applySchemaIsolation(sql, params, tenant);\n return this.applyRowLevelIsolation(schemaResult.sql, schemaResult.params, tenant);\n\n default:\n return { sql, params };\n }\n }\n\n getTenantDatabase(): Option<string> {\n const tenantId = this.getTenantId();\n if (tenantId.isNone()) {\n return Option.none();\n }\n\n if (this._config.isolationStrategy !== 'DATABASE' && this._config.isolationStrategy !== 'HYBRID') {\n return Option.none();\n }\n\n const tenant = tenantId.unwrap();\n const baseName = this._config.databaseName || 'app';\n const dbName = `${baseName}_${tenant}`;\n\n return Option.some(dbName);\n }\n\n getTenantSchema(): Option<string> {\n const tenantId = this.getTenantId();\n if (tenantId.isNone()) {\n return Option.none();\n }\n\n if (this._config.isolationStrategy !== 'SCHEMA' && this._config.isolationStrategy !== 'HYBRID') {\n return Option.none();\n }\n\n const tenant = tenantId.unwrap();\n const baseName = this._config.schemaName || 'app';\n const schemaName = `${baseName}_${tenant}`;\n\n return Option.some(schemaName);\n }\n\n async withTenant<T>(tenantId: string, callback: () => Promise<T>): Promise<T> {\n // Save current tenant\n const previousTenant = this.currentTenant;\n\n try {\n // Set new tenant\n await this.setTenant(tenantId);\n\n // Execute callback\n const result = await callback();\n\n return result;\n } finally {\n // Restore previous tenant\n if (previousTenant) {\n this.currentTenant = previousTenant;\n } else {\n this.currentTenant = null;\n }\n }\n }\n\n clone(): TenantContext {\n return new TenantContextManager(this._config, this.logger);\n }\n\n /**\n * Validate tenant ID format\n */\n private validateTenantId(tenantId: string): void {\n if (!tenantId || typeof tenantId !== 'string') {\n throw new Error('Tenant ID must be a non-empty string');\n }\n\n if (tenantId.trim().length === 0) {\n throw new Error('Tenant ID cannot be whitespace only');\n }\n\n // Check for dangerous characters (SQL injection prevention)\n if (/[;'\"`\\\\]/.test(tenantId)) {\n throw new Error('Tenant ID contains invalid characters');\n }\n }\n\n /**\n * Apply ROW-level tenant isolation to SQL query\n */\n private applyRowLevelIsolation(\n sql: string,\n params: unknown[],\n tenantId: string\n ): { sql: string; params: unknown[] } {\n const tenantColumn = this._config.tenantIdColumn || 'tenant_id';\n const newParams = [...params];\n\n // Detect query type\n const sqlUpper = sql.trim().toUpperCase();\n\n if (sqlUpper.startsWith('SELECT')) {\n // Add WHERE clause or extend existing one\n if (sql.toUpperCase().includes('WHERE')) {\n // Extend existing WHERE\n sql = sql.replace(/WHERE/i, `WHERE ${tenantColumn} = ? AND`);\n newParams.unshift(tenantId);\n } else {\n // Add WHERE clause before ORDER BY, LIMIT, etc.\n const clauseMatch = sql.match(/(ORDER BY|LIMIT|OFFSET|GROUP BY)/i);\n if (clauseMatch) {\n const pos = sql.indexOf(clauseMatch[0]);\n sql = sql.slice(0, pos) + ` WHERE ${tenantColumn} = ? ` + sql.slice(pos);\n } else {\n sql = `${sql} WHERE ${tenantColumn} = ?`;\n }\n newParams.push(tenantId);\n }\n } else if (sqlUpper.startsWith('INSERT')) {\n // Add tenant_id to INSERT\n const valuesMatch = sql.match(/\\(([^)]+)\\)\\s+VALUES\\s+\\(([^)]+)\\)/i);\n if (valuesMatch) {\n const columns = valuesMatch[1];\n const placeholders = valuesMatch[2];\n const newColumns = `${columns}, ${tenantColumn}`;\n const newPlaceholders = `${placeholders}, ?`;\n sql = sql.replace(\n /\\(([^)]+)\\)\\s+VALUES\\s+\\(([^)]+)\\)/i,\n `(${newColumns}) VALUES (${newPlaceholders})`\n );\n newParams.push(tenantId);\n }\n } else if (sqlUpper.startsWith('UPDATE')) {\n // Add tenant_id to WHERE clause\n if (sql.toUpperCase().includes('WHERE')) {\n sql = sql.replace(/WHERE/i, `WHERE ${tenantColumn} = ? AND`);\n newParams.unshift(tenantId);\n } else {\n sql = `${sql} WHERE ${tenantColumn} = ?`;\n newParams.push(tenantId);\n }\n } else if (sqlUpper.startsWith('DELETE')) {\n // Add tenant_id to WHERE clause\n if (sql.toUpperCase().includes('WHERE')) {\n sql = sql.replace(/WHERE/i, `WHERE ${tenantColumn} = ? AND`);\n newParams.unshift(tenantId);\n } else {\n sql = `${sql} WHERE ${tenantColumn} = ?`;\n newParams.push(tenantId);\n }\n }\n\n return { sql, params: newParams };\n }\n\n /**\n * Apply SCHEMA-level tenant isolation to SQL query\n */\n private applySchemaIsolation(\n sql: string,\n params: unknown[],\n tenantId: string\n ): { sql: string; params: unknown[] } {\n const schemaName = this.getTenantSchema();\n if (schemaName.isNone()) {\n return { sql, params };\n }\n\n const schema = schemaName.unwrap();\n\n // Replace table names with schema-prefixed versions\n // This is a simple implementation - in production you'd want more robust parsing\n sql = sql.replace(\n /(?:FROM|INTO|UPDATE|JOIN)\\s+([a-zA-Z_][a-zA-Z0-9_]*)/gi,\n (match, tableName) => {\n // Don't prefix if already prefixed or is excluded table\n if (tableName.includes('.') || this._config.excludedTables?.includes(tableName)) {\n return match;\n }\n return match.replace(tableName, `${schema}.${tableName}`);\n }\n );\n\n return { sql, params };\n }\n}\n","import { Result, Logger } from '@gl-life/gl-life-core';\nimport type {\n QueryBuilder,\n QueryBuilderError,\n WhereOperator,\n JoinType,\n OrderDirection,\n} from '../types/query-builder.js';\nimport type { TenantContext } from '../types/tenant.js';\n\n/**\n * Tenant-Aware Query Builder\n *\n * Wraps a QueryBuilder to automatically inject tenant filters and prevent\n * cross-tenant data access. Provides:\n * - Automatic tenant_id filter injection for all queries\n * - Cross-tenant access prevention\n * - Admin override mechanism via asAdmin()\n * - Tenant filter enforcement (cannot be accidentally removed)\n * - Support for excluded tables (migrations, system tables)\n *\n * Security:\n * - All queries automatically scoped to current tenant\n * - Tenant context validated before query execution\n * - Manual tenant_id in WHERE clauses are overridden\n * - INSERT operations always use current tenant_id\n *\n * Usage:\n * ```typescript\n * const builder = new TenantAwareQueryBuilder(baseBuilder, tenantContext, logger);\n *\n * // Normal tenant-scoped query\n * const users = await builder.select('id', 'name').get();\n *\n * // Admin query (bypasses tenant filter)\n * const allUsers = await builder.asAdmin().select('id', 'name').get();\n * ```\n */\nexport class TenantAwareQueryBuilder<T = unknown> implements QueryBuilder<T> {\n private readonly baseBuilder: QueryBuilder<T>;\n private readonly tenantContext: TenantContext;\n private readonly logger: Logger;\n private isAdminMode: boolean = false;\n\n constructor(\n baseBuilder: QueryBuilder<T>,\n tenantContext: TenantContext,\n logger: Logger\n ) {\n this.baseBuilder = baseBuilder;\n this.tenantContext = tenantContext;\n this.logger = logger;\n }\n\n /**\n * Switch to admin mode - bypasses tenant filtering\n *\n * Use with caution! Only for administrative queries that need\n * to access data across all tenants.\n *\n * @returns QueryBuilder in admin mode\n */\n asAdmin(): TenantAwareQueryBuilder<T> {\n const adminBuilder = new TenantAwareQueryBuilder<T>(\n this.baseBuilder,\n this.tenantContext,\n this.logger\n );\n adminBuilder.isAdminMode = true;\n return adminBuilder;\n }\n\n /**\n * Switch back to tenant mode from admin mode\n *\n * Re-enables automatic tenant filtering\n *\n * @returns QueryBuilder in tenant mode\n */\n asTenant(): TenantAwareQueryBuilder<T> {\n const tenantBuilder = new TenantAwareQueryBuilder<T>(\n this.baseBuilder,\n this.tenantContext,\n this.logger\n );\n tenantBuilder.isAdminMode = false;\n return tenantBuilder;\n }\n\n /**\n * Validate that tenant context is set (unless admin mode or excluded table)\n */\n private validateTenantContext(): void {\n // Skip validation in admin mode\n if (this.isAdminMode) {\n return;\n }\n\n // Check if table should be isolated\n const tableName = this.getTableName();\n if (!this.tenantContext.shouldIsolateTable(tableName)) {\n return;\n }\n\n // Ensure tenant is set\n if (!this.tenantContext.hasTenant) {\n throw new Error(\n 'No tenant context set. Cannot execute query without tenant context. ' +\n 'Use asAdmin() for admin queries or set tenant via tenantContext.setTenant()'\n );\n }\n }\n\n /**\n * Get table name from base builder\n */\n private getTableName(): string {\n // Extract table name from SQL or use default\n const sql = this.baseBuilder.toSQL();\n const match = sql.match(/FROM\\s+([a-zA-Z_][a-zA-Z0-9_]*)/i);\n return match ? match[1] : '';\n }\n\n /**\n * Inject tenant filter into query builder\n *\n * This method ensures the correct tenant filter is present.\n * If a manual tenant_id filter exists, it will be overridden.\n */\n private injectTenantFilter(): void {\n // Skip in admin mode\n if (this.isAdminMode) {\n return;\n }\n\n // Skip for excluded tables\n const tableName = this.getTableName();\n if (!this.tenantContext.shouldIsolateTable(tableName)) {\n return;\n }\n\n // Get current tenant\n const tenantId = this.tenantContext.getTenantId();\n if (tenantId.isNone()) {\n throw new Error('No tenant context set. Cannot inject tenant filter.');\n }\n\n const tenant = tenantId.unwrap();\n const tenantColumn = this.tenantContext.config.tenantIdColumn || 'tenant_id';\n\n // Always add the tenant filter\n // If one already exists, this will add another AND condition\n // ensuring the correct tenant is enforced\n this.baseBuilder.where(tenantColumn, '=', tenant);\n }\n\n /**\n * Override tenant_id in data object for INSERT operations\n */\n private enforceTenantInData(data: Partial<T>): Partial<T> {\n // Skip in admin mode\n if (this.isAdminMode) {\n return data;\n }\n\n // Skip for excluded tables\n const tableName = this.getTableName();\n if (!this.tenantContext.shouldIsolateTable(tableName)) {\n return data;\n }\n\n // Get current tenant\n const tenantId = this.tenantContext.getTenantId();\n if (tenantId.isNone()) {\n throw new Error('No tenant context set. Cannot enforce tenant in INSERT.');\n }\n\n const tenant = tenantId.unwrap();\n const tenantColumn = this.tenantContext.config.tenantIdColumn || 'tenant_id';\n\n // Override tenant_id in data\n return {\n ...data,\n [tenantColumn]: tenant,\n } as Partial<T>;\n }\n\n // QueryBuilder interface implementation\n\n table(table: string): QueryBuilder<T> {\n this.baseBuilder.table(table);\n return this;\n }\n\n select(...columns: string[]): QueryBuilder<T> {\n this.baseBuilder.select(...columns);\n return this;\n }\n\n where(field: string, operator: WhereOperator, value?: unknown): QueryBuilder<T> {\n this.baseBuilder.where(field, operator, value);\n return this;\n }\n\n orWhere(field: string, operator: WhereOperator, value?: unknown): QueryBuilder<T> {\n this.baseBuilder.orWhere(field, operator, value);\n return this;\n }\n\n whereIn(field: string, values: unknown[]): QueryBuilder<T> {\n this.baseBuilder.whereIn(field, values);\n return this;\n }\n\n join(\n table: string,\n leftField: string,\n rightField: string,\n type: JoinType = 'INNER'\n ): QueryBuilder<T> {\n this.baseBuilder.join(table, leftField, rightField, type);\n return this;\n }\n\n orderBy(field: string, direction: OrderDirection = 'ASC'): QueryBuilder<T> {\n this.baseBuilder.orderBy(field, direction);\n return this;\n }\n\n groupBy(...fields: string[]): QueryBuilder<T> {\n this.baseBuilder.groupBy(...fields);\n return this;\n }\n\n having(condition: string): QueryBuilder<T> {\n this.baseBuilder.having(condition);\n return this;\n }\n\n limit(limit: number): QueryBuilder<T> {\n this.baseBuilder.limit(limit);\n return this;\n }\n\n offset(offset: number): QueryBuilder<T> {\n this.baseBuilder.offset(offset);\n return this;\n }\n\n async insert(data: Partial<T>): Promise<Result<T, QueryBuilderError>> {\n this.validateTenantContext();\n\n // Enforce tenant_id in data\n const dataWithTenant = this.enforceTenantInData(data);\n\n this.logger.debug('Tenant-aware INSERT', {\n table: this.getTableName(),\n isAdmin: this.isAdminMode,\n });\n\n return this.baseBuilder.insert(dataWithTenant);\n }\n\n async insertMany(data: Partial<T>[]): Promise<Result<T[], QueryBuilderError>> {\n this.validateTenantContext();\n\n // Enforce tenant_id in all data objects\n const dataWithTenant = data.map(item => this.enforceTenantInData(item));\n\n this.logger.debug('Tenant-aware INSERT MANY', {\n table: this.getTableName(),\n count: data.length,\n isAdmin: this.isAdminMode,\n });\n\n return this.baseBuilder.insertMany(dataWithTenant);\n }\n\n async update(data: Partial<T>): Promise<Result<number, QueryBuilderError>> {\n this.validateTenantContext();\n this.injectTenantFilter();\n\n this.logger.debug('Tenant-aware UPDATE', {\n table: this.getTableName(),\n isAdmin: this.isAdminMode,\n });\n\n return this.baseBuilder.update(data);\n }\n\n async delete(): Promise<Result<number, QueryBuilderError>> {\n this.validateTenantContext();\n this.injectTenantFilter();\n\n this.logger.debug('Tenant-aware DELETE', {\n table: this.getTableName(),\n isAdmin: this.isAdminMode,\n });\n\n return this.baseBuilder.delete();\n }\n\n async first(): Promise<Result<T | null, QueryBuilderError>> {\n this.validateTenantContext();\n this.injectTenantFilter();\n\n this.logger.debug('Tenant-aware FIRST', {\n table: this.getTableName(),\n isAdmin: this.isAdminMode,\n });\n\n return this.baseBuilder.first();\n }\n\n async get(): Promise<Result<T[], QueryBuilderError>> {\n this.validateTenantContext();\n this.injectTenantFilter();\n\n this.logger.debug('Tenant-aware GET', {\n table: this.getTableName(),\n isAdmin: this.isAdminMode,\n });\n\n return this.baseBuilder.get();\n }\n\n async count(field: string = '*'): Promise<Result<number, QueryBuilderError>> {\n this.validateTenantContext();\n this.injectTenantFilter();\n\n this.logger.debug('Tenant-aware COUNT', {\n table: this.getTableName(),\n field,\n isAdmin: this.isAdminMode,\n });\n\n return this.baseBuilder.count(field);\n }\n\n toSQL(): string {\n this.validateTenantContext();\n this.injectTenantFilter();\n\n return this.baseBuilder.toSQL();\n }\n\n getBindings(): unknown[] {\n // Note: If tenant filter is injected, it will be in bindings\n // This is called after toSQL() which injects the filter\n return this.baseBuilder.getBindings();\n }\n\n clone(): QueryBuilder<T> {\n const clonedBase = this.baseBuilder.clone();\n const clonedTenantAware = new TenantAwareQueryBuilder<T>(\n clonedBase,\n this.tenantContext,\n this.logger\n );\n clonedTenantAware.isAdminMode = this.isAdminMode;\n return clonedTenantAware;\n }\n}\n","import { Result, Logger } from '@gl-life/gl-life-core';\nimport type { DatabaseConnection, DatabaseConnectionError } from '../types/connection.js';\n\n/**\n * Schema manager error types\n */\nexport type SchemaManagerError =\n | { type: 'INVALID_TENANT_ID'; message: string }\n | { type: 'INVALID_VERSION'; message: string }\n | { type: 'SCHEMA_EXISTS'; message: string }\n | { type: 'SCHEMA_NOT_FOUND'; message: string }\n | { type: 'MIGRATION_FAILED'; message: string; cause?: unknown }\n | { type: 'DATABASE_ERROR'; message: string; cause?: DatabaseConnectionError }\n | { type: 'VALIDATION_FAILED'; message: string };\n\n/**\n * Schema version record\n */\nexport interface SchemaVersion {\n version: string;\n applied_at: Date;\n description?: string;\n}\n\n/**\n * Schema migration definition\n */\nexport interface SchemaMigration {\n version: string;\n sql: string;\n description?: string;\n}\n\n/**\n * Schema manager configuration\n */\nexport interface SchemaManagerConfig {\n /** Base schema name prefix */\n baseSchemaName: string;\n /** Table name for tracking schema versions */\n schemaVersionTable?: string;\n}\n\n/**\n * Options for creating tenant schema\n */\nexport interface CreateSchemaOptions {\n /** Initial schema version */\n version?: string;\n /** Whether to use a transaction */\n useTransaction?: boolean;\n}\n\n/**\n * Options for dropping tenant schema\n */\nexport interface DropSchemaOptions {\n /** Use CASCADE to drop all objects in schema */\n cascade?: boolean;\n /** Add IF EXISTS clause */\n ifExists?: boolean;\n /** Clean up version history */\n cleanupVersions?: boolean;\n}\n\n/**\n * Tenant Schema Manager\n *\n * Manages per-tenant database schemas for multi-tenant applications.\n * Supports schema creation, versioning, migration, and deprovisioning.\n *\n * Features:\n * - Create isolated schemas per tenant\n * - Schema versioning and migration tracking\n * - Safe schema deprovisioning\n * - Transaction support for atomic operations\n * - SQL injection prevention via parameterized queries\n *\n * Usage:\n * ```typescript\n * const manager = new TenantSchemaManager(connection, logger, {\n * baseSchemaName: 'app'\n * });\n *\n * // Provision new tenant\n * await manager.createTenantSchema('tenant-123', { version: '1.0.0' });\n *\n * // Apply migration\n * await manager.applyMigration('tenant-123', {\n * version: '1.1.0',\n * sql: 'ALTER TABLE users ADD COLUMN email VARCHAR(255);'\n * });\n *\n * // Deprovision tenant\n * await manager.dropTenantSchema('tenant-123', { cascade: true });\n * ```\n */\nexport class TenantSchemaManager {\n private readonly connection: DatabaseConnection;\n private readonly logger: Logger;\n private readonly config: SchemaManagerConfig;\n\n constructor(\n connection: DatabaseConnection,\n logger: Logger,\n config: SchemaManagerConfig\n ) {\n this.connection = connection;\n this.logger = logger;\n this.config = {\n schemaVersionTable: 'schema_versions',\n ...config,\n };\n }\n\n /**\n * Create a new tenant schema\n *\n * @param tenantId - Tenant identifier\n * @param options - Schema creation options\n * @returns Result with void on success or SchemaManagerError\n */\n async createTenantSchema(\n tenantId: string,\n options: CreateSchemaOptions = {}\n ): Promise<Result<void, SchemaManagerError>> {\n // Validate tenant ID\n const validationResult = this.validateTenantId(tenantId);\n if (validationResult.isErr()) {\n return validationResult as Result<void, SchemaManagerError>;\n }\n\n const schemaName = this.getSchemaName(tenantId);\n\n try {\n this.logger.debug('Creating tenant schema', { tenantId, schemaName });\n\n if (options.useTransaction) {\n await this.connection.execute('BEGIN');\n }\n\n // Create schema\n const createResult = await this.connection.execute(\n `CREATE SCHEMA ${schemaName}`,\n []\n );\n\n if (createResult.isErr()) {\n if (options.useTransaction) {\n await this.connection.execute('ROLLBACK');\n }\n\n const error = (createResult as any).variant.error;\n\n // Check if schema already exists\n if (error.message.includes('already exists')) {\n return Result.err({\n type: 'SCHEMA_EXISTS',\n message: `Schema for tenant ${tenantId} already exists`,\n });\n }\n\n return Result.err({\n type: 'DATABASE_ERROR',\n message: `Failed to create schema for tenant ${tenantId}`,\n cause: error,\n });\n }\n\n // Initialize version tracking if version provided\n if (options.version) {\n const versionResult = await this.initializeVersionTracking(\n tenantId,\n options.version\n );\n\n if (versionResult.isErr()) {\n if (options.useTransaction) {\n await this.connection.execute('ROLLBACK');\n }\n return versionResult;\n }\n }\n\n if (options.useTransaction) {\n await this.connection.execute('COMMIT');\n }\n\n this.logger.info('Tenant schema created', { tenantId, schemaName });\n\n return Result.ok(undefined);\n } catch (error) {\n if (options.useTransaction) {\n await this.connection.execute('ROLLBACK');\n }\n\n this.logger.error('Schema creation failed', { error, tenantId });\n\n return Result.err({\n type: 'DATABASE_ERROR',\n message: `Schema creation failed for tenant ${tenantId}: ${error}`,\n cause: error as DatabaseConnectionError,\n });\n }\n }\n\n /**\n * Drop a tenant schema\n *\n * @param tenantId - Tenant identifier\n * @param options - Drop schema options\n * @returns Result with void on success or SchemaManagerError\n */\n async dropTenantSchema(\n tenantId: string,\n options: DropSchemaOptions = {}\n ): Promise<Result<void, SchemaManagerError>> {\n // Validate tenant ID\n const validationResult = this.validateTenantId(tenantId);\n if (validationResult.isErr()) {\n return validationResult as Result<void, SchemaManagerError>;\n }\n\n const schemaName = this.getSchemaName(tenantId);\n\n try {\n this.logger.debug('Dropping tenant schema', { tenantId, schemaName });\n\n // Build DROP SCHEMA statement\n let sql = `DROP SCHEMA ${options.ifExists ? 'IF EXISTS ' : ''}${schemaName}`;\n if (options.cascade) {\n sql += ' CASCADE';\n }\n\n const dropResult = await this.connection.execute(sql, []);\n\n if (dropResult.isErr()) {\n const error = (dropResult as any).variant.error;\n return Result.err({\n type: 'DATABASE_ERROR',\n message: `Failed to drop schema for tenant ${tenantId}`,\n cause: error,\n });\n }\n\n // Clean up version history if requested\n if (options.cleanupVersions) {\n await this.connection.execute(\n `DELETE FROM ${this.config.schemaVersionTable} WHERE tenant_id = ?`,\n [tenantId]\n );\n }\n\n this.logger.info('Tenant schema dropped', { tenantId, schemaName });\n\n return Result.ok(undefined);\n } catch (error) {\n this.logger.error('Schema drop failed', { error, tenantId });\n\n return Result.err({\n type: 'DATABASE_ERROR',\n message: `Schema drop failed for tenant ${tenantId}: ${error}`,\n cause: error as DatabaseConnectionError,\n });\n }\n }\n\n /**\n * Check if tenant schema exists\n *\n * @param tenantId - Tenant identifier\n * @returns Result with boolean indicating existence\n */\n async schemaExists(tenantId: string): Promise<Result<boolean, SchemaManagerError>> {\n const schemaName = this.getSchemaName(tenantId);\n\n try {\n const result = await this.connection.execute(\n `SELECT schema_name FROM information_schema.schemata WHERE schema_name = ?`,\n [schemaName]\n );\n\n if (result.isErr()) {\n return Result.err({\n type: 'DATABASE_ERROR',\n message: 'Failed to check schema existence',\n cause: (result as any).variant.error,\n });\n }\n\n const data = result.unwrap() as any;\n const rows = data.rows || data || [];\n\n return Result.ok(rows.length > 0);\n } catch (error) {\n return Result.err({\n type: 'DATABASE_ERROR',\n message: `Failed to check schema existence: ${error}`,\n cause: error as DatabaseConnectionError,\n });\n }\n }\n\n /**\n * Get current schema version for tenant\n *\n * @param tenantId - Tenant identifier\n * @returns Result with version string or null\n */\n async getSchemaVersion(tenantId: string): Promise<Result<string | null, SchemaManagerError>> {\n try {\n const result = await this.connection.execute(\n `SELECT version FROM ${this.config.schemaVersionTable} WHERE tenant_id = ? ORDER BY applied_at DESC LIMIT 1`,\n [tenantId]\n );\n\n if (result.isErr()) {\n return Result.err({\n type: 'DATABASE_ERROR',\n message: 'Failed to get schema version',\n cause: (result as any).variant.error,\n });\n }\n\n const data = result.unwrap() as any;\n const rows = data.rows || data || [];\n\n if (rows.length === 0) {\n return Result.ok(null);\n }\n\n return Result.ok(rows[0].version);\n } catch (error) {\n return Result.err({\n type: 'DATABASE_ERROR',\n message: `Failed to get schema version: ${error}`,\n cause: error as DatabaseConnectionError,\n });\n }\n }\n\n /**\n * Update schema version for tenant\n *\n * @param tenantId - Tenant identifier\n * @param version - New version string\n * @returns Result with void on success\n */\n async updateSchemaVersion(\n tenantId: string,\n version: string\n ): Promise<Result<void, SchemaManagerError>> {\n // Validate version format (simple semver check)\n if (!this.isValidVersion(version)) {\n return Result.err({\n type: 'INVALID_VERSION',\n message: `Invalid version format: ${version}. Expected semver format (e.g., 1.0.0)`,\n });\n }\n\n try {\n const result = await this.connection.execute(\n `INSERT INTO ${this.config.schemaVersionTable} (tenant_id, version, applied_at) VALUES (?, ?, ?)`,\n [tenantId, version, new Date()]\n );\n\n if (result.isErr()) {\n return Result.err({\n type: 'DATABASE_ERROR',\n message: 'Failed to update schema version',\n cause: (result as any).variant.error,\n });\n }\n\n return Result.ok(undefined);\n } catch (error) {\n return Result.err({\n type: 'DATABASE_ERROR',\n message: `Failed to update schema version: ${error}`,\n cause: error as DatabaseConnectionError,\n });\n }\n }\n\n /**\n * Get version history for tenant\n *\n * @param tenantId - Tenant identifier\n * @returns Result with array of schema versions\n */\n async getVersionHistory(tenantId: string): Promise<Result<SchemaVersion[], SchemaManagerError>> {\n try {\n const result = await this.connection.execute(\n `SELECT version, applied_at, description FROM ${this.config.schemaVersionTable} WHERE tenant_id = ? ORDER BY applied_at ASC`,\n [tenantId]\n );\n\n if (result.isErr()) {\n return Result.err({\n type: 'DATABASE_ERROR',\n message: 'Failed to get version history',\n cause: (result as any).variant.error,\n });\n }\n\n const data = result.unwrap() as any;\n const rows = data.rows || data || [];\n\n return Result.ok(rows);\n } catch (error) {\n return Result.err({\n type: 'DATABASE_ERROR',\n message: `Failed to get version history: ${error}`,\n cause: error as DatabaseConnectionError,\n });\n }\n }\n\n /**\n * Apply a migration to tenant schema\n *\n * @param tenantId - Tenant identifier\n * @param migration - Migration definition\n * @returns Result with void on success\n */\n async applyMigration(\n tenantId: string,\n migration: SchemaMigration\n ): Promise<Result<void, SchemaManagerError>> {\n const schemaName = this.getSchemaName(tenantId);\n\n try {\n this.logger.debug('Applying migration', {\n tenantId,\n version: migration.version,\n });\n\n // Check if migration already applied\n const currentVersion = await this.getSchemaVersion(tenantId);\n if (currentVersion.isOk() && currentVersion.unwrap() === migration.version) {\n this.logger.info('Migration already applied', {\n tenantId,\n version: migration.version,\n });\n return Result.ok(undefined);\n }\n\n // Set search path to tenant schema\n await this.connection.execute(`SET search_path TO ${schemaName}`, []);\n\n // Execute migration SQL\n const migrationResult = await this.connection.execute(migration.sql, []);\n\n if (migrationResult.isErr()) {\n return Result.err({\n type: 'MIGRATION_FAILED',\n message: `Migration ${migration.version} failed for tenant ${tenantId}`,\n cause: (migrationResult as any).variant.error,\n });\n }\n\n // Record migration in version history\n await this.connection.execute(\n `INSERT INTO ${this.config.schemaVersionTable} (tenant_id, version, applied_at, description) VALUES (?, ?, ?, ?)`,\n [tenantId, migration.version, new Date(), migration.description || '']\n );\n\n this.logger.info('Migration applied', {\n tenantId,\n version: migration.version,\n });\n\n return Result.ok(undefined);\n } catch (error) {\n this.logger.error('Migration failed', {\n error,\n tenantId,\n version: migration.version,\n });\n\n return Result.err({\n type: 'MIGRATION_FAILED',\n message: `Migration failed: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Get the schema name for a tenant\n *\n * @param tenantId - Tenant identifier\n * @returns Schema name\n */\n getSchemaName(tenantId: string): string {\n // Validate tenant ID doesn't contain dangerous characters\n if (/[;'\"`\\\\]/.test(tenantId)) {\n throw new Error(`Invalid tenant ID: contains dangerous characters`);\n }\n\n return `${this.config.baseSchemaName}_tenant_${tenantId.replace(/[^a-zA-Z0-9_-]/g, '_')}`;\n }\n\n /**\n * Validate tenant ID format\n */\n private validateTenantId(tenantId: string): Result<void, SchemaManagerError> {\n if (!tenantId || typeof tenantId !== 'string') {\n return Result.err({\n type: 'INVALID_TENANT_ID',\n message: 'Tenant ID must be a non-empty string',\n });\n }\n\n if (tenantId.trim().length === 0) {\n return Result.err({\n type: 'INVALID_TENANT_ID',\n message: 'Tenant ID cannot be whitespace only',\n });\n }\n\n // Check for dangerous characters\n if (/[;'\"`\\\\]/.test(tenantId)) {\n return Result.err({\n type: 'INVALID_TENANT_ID',\n message: 'Tenant ID contains invalid characters',\n });\n }\n\n return Result.ok(undefined);\n }\n\n /**\n * Validate version format (simple semver check)\n */\n private isValidVersion(version: string): boolean {\n // Simple semver regex: major.minor.patch\n return /^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.-]+)?(\\+[a-zA-Z0-9.-]+)?$/.test(version);\n }\n\n /**\n * Initialize version tracking for new tenant\n */\n private async initializeVersionTracking(\n tenantId: string,\n version: string\n ): Promise<Result<void, SchemaManagerError>> {\n if (!this.isValidVersion(version)) {\n return Result.err({\n type: 'INVALID_VERSION',\n message: `Invalid version format: ${version}`,\n });\n }\n\n const result = await this.connection.execute(\n `INSERT INTO ${this.config.schemaVersionTable} (tenant_id, version, applied_at) VALUES (?, ?, ?)`,\n [tenantId, version, new Date()]\n );\n\n if (result.isErr()) {\n return Result.err({\n type: 'DATABASE_ERROR',\n message: 'Failed to initialize version tracking',\n cause: (result as any).variant.error,\n });\n }\n\n return Result.ok(undefined);\n }\n}\n","import { Result, Option, Logger } from '@gl-life/gl-life-core';\nimport crypto from 'crypto';\nimport type {\n Cache,\n CacheConfig,\n CacheEntry,\n CacheEntryMetadata,\n CacheError,\n CacheStats,\n} from '../types/cache.js';\n\n/**\n * In-memory LRU cache implementation\n *\n * Features:\n * - TTL-based expiration\n * - LRU eviction policy\n * - Cache statistics tracking (hits/misses/evictions)\n * - Pattern-based invalidation\n * - Metadata tracking (access count, timestamps)\n *\n * Usage:\n * ```typescript\n * const cache = new MemoryCache(config, logger);\n * await cache.set('user:1', { id: 1, name: 'John' }, 60);\n * const result = await cache.get<User>('user:1');\n * ```\n */\nexport class MemoryCache implements Cache {\n readonly config: CacheConfig;\n private readonly logger: Logger;\n private readonly store: Map<string, CacheEntry>;\n private readonly lruList: string[] = []; // Most recent at end\n private stats = {\n hits: 0,\n misses: 0,\n evictions: 0,\n };\n\n constructor(config: CacheConfig, logger: Logger) {\n this.config = config;\n this.logger = logger;\n this.store = new Map();\n }\n\n async get<T = unknown>(key: string): Promise<Result<Option<T>, CacheError>> {\n try {\n const fullKey = this.getFullKey(key);\n const entry = this.store.get(fullKey);\n\n if (!entry) {\n this.stats.misses++;\n return Result.ok(Option.none());\n }\n\n // Check expiration\n if (this.isExpired(entry)) {\n this.store.delete(fullKey);\n this.removeLRU(fullKey);\n this.stats.misses++;\n return Result.ok(Option.none());\n }\n\n // Update LRU and metadata\n this.touchEntry(fullKey, entry);\n this.stats.hits++;\n\n return Result.ok(Option.some(entry.value as T));\n } catch (error) {\n this.logger.error('Cache get failed', { error, key });\n return Result.err({\n type: 'GET_FAILED',\n message: `Failed to get cache entry: ${error}`,\n cause: error,\n });\n }\n }\n\n async getWithMetadata<T = unknown>(\n key: string\n ): Promise<Result<Option<CacheEntry<T>>, CacheError>> {\n try {\n const fullKey = this.getFullKey(key);\n const entry = this.store.get(fullKey);\n\n if (!entry) {\n this.stats.misses++;\n return Result.ok(Option.none());\n }\n\n if (this.isExpired(entry)) {\n this.store.delete(fullKey);\n this.removeLRU(fullKey);\n this.stats.misses++;\n return Result.ok(Option.none());\n }\n\n this.touchEntry(fullKey, entry);\n this.stats.hits++;\n\n return Result.ok(Option.some(entry as CacheEntry<T>));\n } catch (error) {\n this.logger.error('Cache getWithMetadata failed', { error, key });\n return Result.err({\n type: 'GET_FAILED',\n message: `Failed to get cache entry with metadata: ${error}`,\n cause: error,\n });\n }\n }\n\n async set<T = unknown>(\n key: string,\n value: T,\n ttl?: number\n ): Promise<Result<void, CacheError>> {\n try {\n const fullKey = this.getFullKey(key);\n const effectiveTTL = ttl !== undefined ? ttl : this.config.defaultTTL;\n\n // Evict if at max capacity and key doesn't exist\n if (\n this.config.maxItems &&\n this.store.size >= this.config.maxItems &&\n !this.store.has(fullKey)\n ) {\n this.evictLRU();\n }\n\n const now = new Date();\n const expiresAt =\n effectiveTTL > 0 ? new Date(now.getTime() + effectiveTTL * 1000) : undefined;\n\n const metadata: CacheEntryMetadata = {\n key: fullKey,\n createdAt: now,\n lastAccessedAt: now,\n accessCount: 0,\n size: this.estimateSize(value),\n ttl: effectiveTTL,\n expiresAt,\n };\n\n const entry: CacheEntry<T> = {\n value,\n metadata,\n };\n\n // Remove from LRU if updating existing entry\n if (this.store.has(fullKey)) {\n this.removeLRU(fullKey);\n }\n\n this.store.set(fullKey, entry as CacheEntry);\n this.lruList.push(fullKey); // Add to end (most recent)\n\n this.logger.debug('Cache set', { key, ttl: effectiveTTL });\n\n return Result.ok(undefined);\n } catch (error) {\n this.logger.error('Cache set failed', { error, key });\n return Result.err({\n type: 'SET_FAILED',\n message: `Failed to set cache entry: ${error}`,\n cause: error,\n });\n }\n }\n\n async delete(key: string): Promise<Result<boolean, CacheError>> {\n try {\n const fullKey = this.getFullKey(key);\n const existed = this.store.delete(fullKey);\n\n if (existed) {\n this.removeLRU(fullKey);\n this.logger.debug('Cache delete', { key });\n }\n\n return Result.ok(existed);\n } catch (error) {\n this.logger.error('Cache delete failed', { error, key });\n return Result.err({\n type: 'DELETE_FAILED',\n message: `Failed to delete cache entry: ${error}`,\n cause: error,\n });\n }\n }\n\n async deleteMany(keys: string[]): Promise<Result<number, CacheError>> {\n try {\n let deleted = 0;\n\n for (const key of keys) {\n const result = await this.delete(key);\n if (result.isOk() && result.unwrap()) {\n deleted++;\n }\n }\n\n return Result.ok(deleted);\n } catch (error) {\n this.logger.error('Cache deleteMany failed', { error });\n return Result.err({\n type: 'DELETE_FAILED',\n message: `Failed to delete multiple cache entries: ${error}`,\n cause: error,\n });\n }\n }\n\n async clear(): Promise<Result<void, CacheError>> {\n try {\n this.store.clear();\n this.lruList.length = 0;\n\n this.logger.debug('Cache cleared');\n\n return Result.ok(undefined);\n } catch (error) {\n this.logger.error('Cache clear failed', { error });\n return Result.err({\n type: 'CLEAR_FAILED',\n message: `Failed to clear cache: ${error}`,\n cause: error,\n });\n }\n }\n\n async has(key: string): Promise<Result<boolean, CacheError>> {\n try {\n const fullKey = this.getFullKey(key);\n const entry = this.store.get(fullKey);\n\n if (!entry) {\n return Result.ok(false);\n }\n\n // Check expiration\n if (this.isExpired(entry)) {\n this.store.delete(fullKey);\n this.removeLRU(fullKey);\n return Result.ok(false);\n }\n\n return Result.ok(true);\n } catch (error) {\n this.logger.error('Cache has failed', { error, key });\n return Result.err({\n type: 'GET_FAILED',\n message: `Failed to check cache key existence: ${error}`,\n cause: error,\n });\n }\n }\n\n async invalidate(pattern: string): Promise<Result<number, CacheError>> {\n try {\n // Apply prefix to pattern for matching\n const fullPattern = this.config.keyPrefix ? `${this.config.keyPrefix}${pattern}` : pattern;\n const regex = this.patternToRegex(fullPattern);\n let invalidated = 0;\n\n for (const key of this.store.keys()) {\n if (regex.test(key)) {\n this.store.delete(key);\n this.removeLRU(key);\n invalidated++;\n }\n }\n\n this.logger.debug('Cache invalidate', { pattern, count: invalidated });\n\n return Result.ok(invalidated);\n } catch (error) {\n this.logger.error('Cache invalidate failed', { error, pattern });\n return Result.err({\n type: 'DELETE_FAILED',\n message: `Failed to invalidate cache entries: ${error}`,\n cause: error,\n });\n }\n }\n\n async invalidateTable(table: string): Promise<Result<number, CacheError>> {\n try {\n // Invalidate entries that start with table name\n const pattern = `*${table}*`;\n return await this.invalidate(pattern);\n } catch (error) {\n this.logger.error('Cache invalidateTable failed', { error, table });\n return Result.err({\n type: 'DELETE_FAILED',\n message: `Failed to invalidate table cache: ${error}`,\n cause: error,\n });\n }\n }\n\n getStats(): Result<CacheStats, CacheError> {\n try {\n const totalAccesses = this.stats.hits + this.stats.misses;\n const hitRate = totalAccesses > 0 ? this.stats.hits / totalAccesses : 0;\n\n let totalSize = 0;\n for (const entry of this.store.values()) {\n totalSize += entry.metadata.size;\n }\n\n return Result.ok({\n itemCount: this.store.size,\n totalSize,\n hits: this.stats.hits,\n misses: this.stats.misses,\n hitRate,\n evictions: this.stats.evictions,\n });\n } catch (error) {\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to get cache stats: ${error}`,\n cause: error,\n });\n }\n }\n\n resetStats(): Result<void, CacheError> {\n try {\n this.stats.hits = 0;\n this.stats.misses = 0;\n this.stats.evictions = 0;\n\n return Result.ok(undefined);\n } catch (error) {\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to reset cache stats: ${error}`,\n cause: error,\n });\n }\n }\n\n generateKey(sql: string, params?: unknown[]): string {\n const data = {\n sql,\n params: params || [],\n };\n\n const hash = crypto\n .createHash('sha256')\n .update(JSON.stringify(data))\n .digest('hex');\n\n return hash.substring(0, 16); // Use first 16 chars for readability\n }\n\n /**\n * Get full cache key with prefix\n */\n private getFullKey(key: string): string {\n return this.config.keyPrefix ? `${this.config.keyPrefix}${key}` : key;\n }\n\n /**\n * Check if entry is expired\n */\n private isExpired(entry: CacheEntry): boolean {\n if (!entry.metadata.expiresAt) {\n return false;\n }\n\n return new Date() > entry.metadata.expiresAt;\n }\n\n /**\n * Update entry access metadata and LRU position\n */\n private touchEntry(key: string, entry: CacheEntry): void {\n entry.metadata.lastAccessedAt = new Date();\n entry.metadata.accessCount++;\n\n // Move to end of LRU list (most recent)\n this.removeLRU(key);\n this.lruList.push(key);\n }\n\n /**\n * Remove key from LRU list\n */\n private removeLRU(key: string): void {\n const index = this.lruList.indexOf(key);\n if (index > -1) {\n this.lruList.splice(index, 1);\n }\n }\n\n /**\n * Evict least recently used entry\n */\n private evictLRU(): void {\n if (this.lruList.length === 0) {\n return;\n }\n\n const lruKey = this.lruList[0]; // Least recent at start\n this.store.delete(lruKey);\n this.lruList.shift();\n this.stats.evictions++;\n\n this.logger.debug('LRU eviction', { key: lruKey });\n }\n\n /**\n * Estimate size of value in bytes\n */\n private estimateSize(value: unknown): number {\n try {\n return JSON.stringify(value).length;\n } catch {\n return 0;\n }\n }\n\n /**\n * Convert glob pattern to regex\n */\n private patternToRegex(pattern: string): RegExp {\n const escaped = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&') // Escape special regex chars\n .replace(/\\*/g, '.*') // Replace * with .*\n .replace(/\\?/g, '.'); // Replace ? with .\n\n return new RegExp(`^${escaped}$`);\n }\n}\n","import { Result, Option, Logger } from '@gl-life/gl-life-core';\nimport crypto from 'crypto';\nimport type {\n Cache,\n CacheConfig,\n CacheEntry,\n CacheEntryMetadata,\n CacheError,\n CacheStats,\n} from '../types/cache.js';\n\n/**\n * Cloudflare Workers KV namespace interface\n */\nexport interface KVNamespace {\n get(key: string, options?: { type?: 'text' | 'json' }): Promise<any>;\n put(key: string, value: string, options?: { expirationTtl?: number }): Promise<void>;\n delete(key: string): Promise<void>;\n list(options?: { prefix?: string; limit?: number; cursor?: string }): Promise<{\n keys: Array<{ name: string }>;\n list_complete: boolean;\n cursor?: string;\n }>;\n}\n\n/**\n * Cloudflare Workers KV cache implementation\n *\n * Features:\n * - Distributed cache using Cloudflare KV\n * - TTL-based expiration via KV expirationTtl\n * - Cache-aside pattern\n * - Pattern-based invalidation\n * - Statistics tracking (hits/misses)\n *\n * Limitations:\n * - No total item count (KV doesn't provide this efficiently)\n * - No LRU eviction (KV handles this internally)\n * - List operations are eventually consistent\n *\n * Usage:\n * ```typescript\n * const cache = new KVCache(env.CACHE_KV, config, logger);\n * await cache.set('user:1', { id: 1, name: 'John' }, 60);\n * const result = await cache.get<User>('user:1');\n * ```\n */\nexport class KVCache implements Cache {\n readonly config: CacheConfig;\n private readonly kv: KVNamespace;\n private readonly logger: Logger;\n private stats = {\n hits: 0,\n misses: 0,\n };\n\n constructor(kv: KVNamespace, config: CacheConfig, logger: Logger) {\n this.kv = kv;\n this.config = config;\n this.logger = logger;\n }\n\n async get<T = unknown>(key: string): Promise<Result<Option<T>, CacheError>> {\n try {\n const fullKey = this.getFullKey(key);\n let value = await this.kv.get(fullKey, { type: 'json' });\n\n if (value === null) {\n this.stats.misses++;\n return Result.ok(Option.none());\n }\n\n // If KV returned a string (mock behavior), parse it\n if (typeof value === 'string') {\n try {\n value = JSON.parse(value);\n } catch {\n // If parse fails, treat as string value\n this.stats.hits++;\n return Result.ok(Option.some(value as T));\n }\n }\n\n this.stats.hits++;\n\n // KV stores the entry wrapper with value property\n if (value && typeof value === 'object' && 'value' in value) {\n return Result.ok(Option.some(value.value as T));\n }\n\n // Fallback: if stored directly without wrapper\n return Result.ok(Option.some(value as T));\n } catch (error) {\n this.logger.error('KV cache get failed', { error, key });\n return Result.err({\n type: 'GET_FAILED',\n message: `Failed to get cache entry from KV: ${error}`,\n cause: error,\n });\n }\n }\n\n async getWithMetadata<T = unknown>(\n key: string\n ): Promise<Result<Option<CacheEntry<T>>, CacheError>> {\n try {\n const fullKey = this.getFullKey(key);\n let value = await this.kv.get(fullKey, { type: 'json' });\n\n if (value === null) {\n this.stats.misses++;\n return Result.ok(Option.none());\n }\n\n // If KV returned a string (mock behavior), parse it\n if (typeof value === 'string') {\n try {\n value = JSON.parse(value);\n } catch {\n // If parse fails, construct minimal entry with string value\n const now = new Date();\n this.stats.hits++;\n const entry: CacheEntry<T> = {\n value: value as T,\n metadata: {\n key: fullKey,\n createdAt: now,\n lastAccessedAt: now,\n accessCount: 1,\n size: this.estimateSize(value),\n ttl: this.config.defaultTTL,\n },\n };\n return Result.ok(Option.some(entry));\n }\n }\n\n this.stats.hits++;\n\n // KV stores complete entry with metadata\n if (value && typeof value === 'object' && 'value' in value && 'metadata' in value) {\n // Reconstruct Date objects from ISO strings\n const entry = value as any;\n entry.metadata.createdAt = new Date(entry.metadata.createdAt);\n entry.metadata.lastAccessedAt = new Date(entry.metadata.lastAccessedAt);\n if (entry.metadata.expiresAt) {\n entry.metadata.expiresAt = new Date(entry.metadata.expiresAt);\n }\n\n return Result.ok(Option.some(entry as CacheEntry<T>));\n }\n\n // Fallback: construct minimal entry\n const now = new Date();\n const entry: CacheEntry<T> = {\n value: value as T,\n metadata: {\n key: fullKey,\n createdAt: now,\n lastAccessedAt: now,\n accessCount: 1,\n size: this.estimateSize(value),\n ttl: this.config.defaultTTL,\n },\n };\n\n return Result.ok(Option.some(entry));\n } catch (error) {\n this.logger.error('KV cache getWithMetadata failed', { error, key });\n return Result.err({\n type: 'GET_FAILED',\n message: `Failed to get cache entry with metadata from KV: ${error}`,\n cause: error,\n });\n }\n }\n\n async set<T = unknown>(\n key: string,\n value: T,\n ttl?: number\n ): Promise<Result<void, CacheError>> {\n try {\n const fullKey = this.getFullKey(key);\n const effectiveTTL = ttl !== undefined ? ttl : this.config.defaultTTL;\n\n const now = new Date();\n const expiresAt =\n effectiveTTL > 0 ? new Date(now.getTime() + effectiveTTL * 1000) : undefined;\n\n const metadata: CacheEntryMetadata = {\n key: fullKey,\n createdAt: now,\n lastAccessedAt: now,\n accessCount: 0,\n size: this.estimateSize(value),\n ttl: effectiveTTL,\n expiresAt,\n };\n\n const entry = {\n value,\n metadata,\n };\n\n // Store as JSON string with TTL\n const options = effectiveTTL > 0 ? { expirationTtl: effectiveTTL } : {};\n await this.kv.put(fullKey, JSON.stringify(entry), options);\n\n this.logger.debug('KV cache set', { key, ttl: effectiveTTL });\n\n return Result.ok(undefined);\n } catch (error) {\n this.logger.error('KV cache set failed', { error, key });\n return Result.err({\n type: 'SET_FAILED',\n message: `Failed to set cache entry in KV: ${error}`,\n cause: error,\n });\n }\n }\n\n async delete(key: string): Promise<Result<boolean, CacheError>> {\n try {\n const fullKey = this.getFullKey(key);\n\n // KV delete doesn't return whether key existed\n // We need to check first for accurate return value\n const existed = await this.kv.get(fullKey);\n await this.kv.delete(fullKey);\n\n const wasDeleted = existed !== null;\n if (wasDeleted) {\n this.logger.debug('KV cache delete', { key });\n }\n\n return Result.ok(wasDeleted);\n } catch (error) {\n this.logger.error('KV cache delete failed', { error, key });\n return Result.err({\n type: 'DELETE_FAILED',\n message: `Failed to delete cache entry from KV: ${error}`,\n cause: error,\n });\n }\n }\n\n async deleteMany(keys: string[]): Promise<Result<number, CacheError>> {\n try {\n let deleted = 0;\n\n // KV doesn't have batch delete, so delete one by one\n for (const key of keys) {\n const result = await this.delete(key);\n if (result.isOk() && result.unwrap()) {\n deleted++;\n }\n }\n\n return Result.ok(deleted);\n } catch (error) {\n this.logger.error('KV cache deleteMany failed', { error });\n return Result.err({\n type: 'DELETE_FAILED',\n message: `Failed to delete multiple cache entries from KV: ${error}`,\n cause: error,\n });\n }\n }\n\n async clear(): Promise<Result<void, CacheError>> {\n try {\n const prefix = this.config.keyPrefix || '';\n\n // List all keys with prefix and delete them\n let cursor: string | undefined;\n let totalDeleted = 0;\n\n do {\n const listResult = await this.kv.list({\n prefix,\n limit: 1000,\n cursor,\n });\n\n // Delete all keys in this batch\n const deletePromises = listResult.keys.map(({ name }) => this.kv.delete(name));\n await Promise.all(deletePromises);\n totalDeleted += listResult.keys.length;\n\n cursor = listResult.list_complete ? undefined : listResult.cursor;\n } while (cursor);\n\n this.logger.debug('KV cache cleared', { deleted: totalDeleted });\n\n return Result.ok(undefined);\n } catch (error) {\n this.logger.error('KV cache clear failed', { error });\n return Result.err({\n type: 'CLEAR_FAILED',\n message: `Failed to clear KV cache: ${error}`,\n cause: error,\n });\n }\n }\n\n async has(key: string): Promise<Result<boolean, CacheError>> {\n try {\n const fullKey = this.getFullKey(key);\n const value = await this.kv.get(fullKey);\n\n return Result.ok(value !== null);\n } catch (error) {\n this.logger.error('KV cache has failed', { error, key });\n return Result.err({\n type: 'GET_FAILED',\n message: `Failed to check cache key existence in KV: ${error}`,\n cause: error,\n });\n }\n }\n\n async invalidate(pattern: string): Promise<Result<number, CacheError>> {\n try {\n // Convert glob pattern to prefix for KV list\n const fullPattern = this.config.keyPrefix ? `${this.config.keyPrefix}${pattern}` : pattern;\n\n // Extract prefix from pattern (everything before first wildcard)\n const prefix = fullPattern.split('*')[0].split('?')[0];\n const regex = this.patternToRegex(fullPattern);\n\n let invalidated = 0;\n let cursor: string | undefined;\n\n do {\n const listResult = await this.kv.list({\n prefix,\n limit: 1000,\n cursor,\n });\n\n // Filter keys matching the full pattern and delete them\n const matchingKeys = listResult.keys\n .map(({ name }) => name)\n .filter(name => regex.test(name));\n\n const deletePromises = matchingKeys.map(name => this.kv.delete(name));\n await Promise.all(deletePromises);\n invalidated += matchingKeys.length;\n\n cursor = listResult.list_complete ? undefined : listResult.cursor;\n } while (cursor);\n\n this.logger.debug('KV cache invalidate', { pattern, count: invalidated });\n\n return Result.ok(invalidated);\n } catch (error) {\n this.logger.error('KV cache invalidate failed', { error, pattern });\n return Result.err({\n type: 'DELETE_FAILED',\n message: `Failed to invalidate cache entries in KV: ${error}`,\n cause: error,\n });\n }\n }\n\n async invalidateTable(table: string): Promise<Result<number, CacheError>> {\n try {\n // Invalidate entries that contain table name\n const pattern = `*${table}*`;\n return await this.invalidate(pattern);\n } catch (error) {\n this.logger.error('KV cache invalidateTable failed', { error, table });\n return Result.err({\n type: 'DELETE_FAILED',\n message: `Failed to invalidate table cache in KV: ${error}`,\n cause: error,\n });\n }\n }\n\n getStats(): Result<CacheStats, CacheError> {\n try {\n const totalAccesses = this.stats.hits + this.stats.misses;\n const hitRate = totalAccesses > 0 ? this.stats.hits / totalAccesses : 0;\n\n // KV doesn't provide efficient ways to get total item count or size\n // These would require listing all keys which is expensive\n return Result.ok({\n itemCount: 0, // Not available for KV\n totalSize: 0, // Not available for KV\n hits: this.stats.hits,\n misses: this.stats.misses,\n hitRate,\n evictions: 0, // KV handles eviction internally\n });\n } catch (error) {\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to get KV cache stats: ${error}`,\n cause: error,\n });\n }\n }\n\n resetStats(): Result<void, CacheError> {\n try {\n this.stats.hits = 0;\n this.stats.misses = 0;\n\n return Result.ok(undefined);\n } catch (error) {\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to reset KV cache stats: ${error}`,\n cause: error,\n });\n }\n }\n\n generateKey(sql: string, params?: unknown[]): string {\n const data = {\n sql,\n params: params || [],\n };\n\n const hash = crypto\n .createHash('sha256')\n .update(JSON.stringify(data))\n .digest('hex');\n\n return hash.substring(0, 16); // Use first 16 chars for readability\n }\n\n /**\n * Get full cache key with prefix\n */\n private getFullKey(key: string): string {\n return this.config.keyPrefix ? `${this.config.keyPrefix}${key}` : key;\n }\n\n /**\n * Estimate size of value in bytes\n */\n private estimateSize(value: unknown): number {\n try {\n return JSON.stringify(value).length;\n } catch {\n return 0;\n }\n }\n\n /**\n * Convert glob pattern to regex\n */\n private patternToRegex(pattern: string): RegExp {\n const escaped = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&') // Escape special regex chars\n .replace(/\\*/g, '.*') // Replace * with .*\n .replace(/\\?/g, '.'); // Replace ? with .\n\n return new RegExp(`^${escaped}$`);\n }\n}\n","import { Result, Logger, EventBus, type UnsubscribeFn } from '@gl-life/gl-life-core';\nimport type { Cache, CacheError } from '../types/cache.js';\n\n/**\n * Invalidation statistics\n */\nexport interface InvalidationStats {\n /** Total number of invalidations performed */\n totalInvalidations: number;\n /** Number of tag-based invalidations */\n tagInvalidations: number;\n /** Number of pattern-based invalidations */\n patternInvalidations: number;\n /** Number of key-based invalidations */\n keyInvalidations: number;\n /** Number of expired entry invalidations */\n expiredInvalidations: number;\n}\n\n/**\n * Cache invalidation error types\n */\nexport type InvalidationError =\n | { type: 'INVALIDATION_FAILED'; message: string; cause?: unknown }\n | { type: 'TAG_NOT_FOUND'; message: string }\n | { type: 'UNKNOWN'; message: string; cause?: unknown };\n\n/**\n * Cache invalidation system\n *\n * Provides advanced cache invalidation strategies:\n * - Tag-based invalidation (group entries by logical tags)\n * - Time-based invalidation (TTL expiration scanning)\n * - Event-based invalidation (integrate with EventBus)\n * - Batch invalidation (efficient multi-entry invalidation)\n * - Pattern-based invalidation (wildcard matching)\n *\n * Usage:\n * ```typescript\n * const invalidator = new CacheInvalidator(cache, eventBus, logger);\n *\n * // Tag entries\n * await invalidator.tagEntry('user:1', ['users', 'active']);\n *\n * // Invalidate by tag\n * await invalidator.invalidateByTag('users');\n *\n * // Subscribe to data change events\n * const unsubscribe = invalidator.subscribeToDataChanges();\n * ```\n */\nexport class CacheInvalidator {\n private readonly cache: Cache;\n private readonly eventBus: EventBus;\n private readonly logger: Logger;\n\n // Tag index: tag -> Set<key>\n private readonly tagIndex: Map<string, Set<string>> = new Map();\n\n // Entry tags: key -> Set<tag>\n private readonly entryTags: Map<string, Set<string>> = new Map();\n\n // Statistics\n private stats: InvalidationStats = {\n totalInvalidations: 0,\n tagInvalidations: 0,\n patternInvalidations: 0,\n keyInvalidations: 0,\n expiredInvalidations: 0,\n };\n\n constructor(cache: Cache, eventBus: EventBus, logger: Logger) {\n this.cache = cache;\n this.eventBus = eventBus;\n this.logger = logger;\n }\n\n /**\n * Tag a cache entry for group invalidation\n *\n * @param key - Cache key\n * @param tags - Array of tags to associate with this entry\n * @returns Result with void on success\n */\n async tagEntry(key: string, tags: string[]): Promise<Result<void, InvalidationError>> {\n try {\n // Add tags to entry\n if (!this.entryTags.has(key)) {\n this.entryTags.set(key, new Set());\n }\n\n const entryTagSet = this.entryTags.get(key)!;\n\n for (const tag of tags) {\n entryTagSet.add(tag);\n\n // Add key to tag index\n if (!this.tagIndex.has(tag)) {\n this.tagIndex.set(tag, new Set());\n }\n this.tagIndex.get(tag)!.add(key);\n }\n\n this.logger.debug('Tagged cache entry', { key, tags });\n\n return Result.ok(undefined);\n } catch (error) {\n this.logger.error('Failed to tag entry', { error, key, tags });\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to tag entry: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Remove a tag from a cache entry\n *\n * @param key - Cache key\n * @param tag - Tag to remove\n * @returns Result with void on success\n */\n async removeTag(key: string, tag: string): Promise<Result<void, InvalidationError>> {\n try {\n // Remove tag from entry\n const entryTagSet = this.entryTags.get(key);\n if (entryTagSet) {\n entryTagSet.delete(tag);\n\n if (entryTagSet.size === 0) {\n this.entryTags.delete(key);\n }\n }\n\n // Remove key from tag index\n const tagSet = this.tagIndex.get(tag);\n if (tagSet) {\n tagSet.delete(key);\n\n if (tagSet.size === 0) {\n this.tagIndex.delete(tag);\n }\n }\n\n this.logger.debug('Removed tag from entry', { key, tag });\n\n return Result.ok(undefined);\n } catch (error) {\n this.logger.error('Failed to remove tag', { error, key, tag });\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to remove tag: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Invalidate all entries with a specific tag\n *\n * @param tag - Tag to invalidate (supports wildcards)\n * @returns Result with number of invalidated entries\n */\n async invalidateByTag(tag: string): Promise<Result<number, InvalidationError>> {\n try {\n const keysToInvalidate = new Set<string>();\n\n // Handle wildcard patterns\n if (tag.includes('*') || tag.includes('?')) {\n const regex = this.patternToRegex(tag);\n\n for (const [tagName, keys] of this.tagIndex.entries()) {\n if (regex.test(tagName)) {\n for (const key of keys) {\n keysToInvalidate.add(key);\n }\n }\n }\n } else {\n // Exact tag match\n const keys = this.tagIndex.get(tag);\n if (keys) {\n for (const key of keys) {\n keysToInvalidate.add(key);\n }\n }\n }\n\n // Invalidate all keys\n let invalidated = 0;\n for (const key of keysToInvalidate) {\n const result = await this.cache.delete(key);\n if (result.isOk() && result.unwrap()) {\n invalidated++;\n // Clean up tags\n await this.cleanupEntryTags(key);\n }\n }\n\n this.stats.totalInvalidations += invalidated;\n this.stats.tagInvalidations += invalidated;\n\n this.logger.debug('Invalidated by tag', { tag, count: invalidated });\n\n // Emit invalidation event\n await this.eventBus.emit('cache:invalidated', {\n type: 'tag',\n tag,\n count: invalidated,\n });\n\n return Result.ok(invalidated);\n } catch (error) {\n this.logger.error('Failed to invalidate by tag', { error, tag });\n return Result.err({\n type: 'INVALIDATION_FAILED',\n message: `Failed to invalidate by tag: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Invalidate entries by multiple tags\n *\n * @param tags - Array of tags to invalidate\n * @returns Result with number of invalidated entries\n */\n async invalidateByTags(tags: string[]): Promise<Result<number, InvalidationError>> {\n try {\n const keysToInvalidate = new Set<string>();\n\n for (const tag of tags) {\n const result = await this.getTaggedKeys(tag);\n if (result.isOk()) {\n const keys = result.unwrap();\n for (const key of keys) {\n keysToInvalidate.add(key);\n }\n }\n }\n\n // Invalidate all unique keys\n let invalidated = 0;\n for (const key of keysToInvalidate) {\n const result = await this.cache.delete(key);\n if (result.isOk() && result.unwrap()) {\n invalidated++;\n await this.cleanupEntryTags(key);\n }\n }\n\n this.stats.totalInvalidations += invalidated;\n this.stats.tagInvalidations += invalidated;\n\n this.logger.debug('Invalidated by tags', { tags, count: invalidated });\n\n return Result.ok(invalidated);\n } catch (error) {\n this.logger.error('Failed to invalidate by tags', { error, tags });\n return Result.err({\n type: 'INVALIDATION_FAILED',\n message: `Failed to invalidate by tags: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Invalidate specific cache keys\n *\n * @param keys - Array of keys to invalidate\n * @returns Result with number of invalidated entries\n */\n async invalidateByKeys(keys: string[]): Promise<Result<number, InvalidationError>> {\n try {\n let invalidated = 0;\n\n for (const key of keys) {\n const result = await this.cache.delete(key);\n if (result.isOk() && result.unwrap()) {\n invalidated++;\n await this.cleanupEntryTags(key);\n }\n }\n\n this.stats.totalInvalidations += invalidated;\n this.stats.keyInvalidations += invalidated;\n\n this.logger.debug('Invalidated by keys', { count: invalidated });\n\n return Result.ok(invalidated);\n } catch (error) {\n this.logger.error('Failed to invalidate by keys', { error, keys });\n return Result.err({\n type: 'INVALIDATION_FAILED',\n message: `Failed to invalidate by keys: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Invalidate entries matching a pattern\n *\n * @param pattern - Pattern to match (supports wildcards)\n * @returns Result with number of invalidated entries\n */\n async invalidateByPattern(pattern: string): Promise<Result<number, InvalidationError>> {\n try {\n const result = await this.cache.invalidate(pattern);\n\n if (result.isOk()) {\n const count = result.unwrap();\n this.stats.totalInvalidations += count;\n this.stats.patternInvalidations += count;\n }\n\n return result as Result<number, InvalidationError>;\n } catch (error) {\n this.logger.error('Failed to invalidate by pattern', { error, pattern });\n return Result.err({\n type: 'INVALIDATION_FAILED',\n message: `Failed to invalidate by pattern: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Scan and invalidate expired entries\n *\n * @returns Result with number of invalidated entries\n */\n async invalidateExpired(): Promise<Result<number, InvalidationError>> {\n try {\n // This relies on the cache's own TTL handling\n // We can trigger a scan by checking all entries\n let invalidated = 0;\n\n // For memory cache, just get all keys and check them\n // This will automatically remove expired ones\n const allKeys = Array.from(this.entryTags.keys());\n\n for (const key of allKeys) {\n const result = await this.cache.get(key);\n if (result.isOk() && result.unwrap().isNone()) {\n // Entry was expired and removed\n await this.cleanupEntryTags(key);\n invalidated++;\n }\n }\n\n this.stats.totalInvalidations += invalidated;\n this.stats.expiredInvalidations += invalidated;\n\n this.logger.debug('Invalidated expired entries', { count: invalidated });\n\n return Result.ok(invalidated);\n } catch (error) {\n this.logger.error('Failed to invalidate expired entries', { error });\n return Result.err({\n type: 'INVALIDATION_FAILED',\n message: `Failed to invalidate expired entries: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Subscribe to data change events for automatic invalidation\n *\n * @returns Unsubscribe function\n */\n subscribeToDataChanges(): UnsubscribeFn {\n const unsubscribers: UnsubscribeFn[] = [];\n\n // Subscribe to all events and filter for cache invalidation events\n unsubscribers.push(\n this.eventBus.subscribe('*', async (data: any) => {\n // This handler will be called for ALL events\n // We need to filter in the event emission\n })\n );\n\n // Subscribe to specific cache invalidation patterns\n const cacheInvalidateHandler = async (data: any) => {\n if (data && data.tag) {\n await this.invalidateByTag(data.tag);\n }\n };\n\n // Subscribe to common cache invalidation events\n const events = [\n 'cache:invalidate:users',\n 'cache:invalidate:posts',\n 'cache:invalidate:comments',\n ];\n\n for (const event of events) {\n unsubscribers.push(this.eventBus.subscribe(event, cacheInvalidateHandler));\n }\n\n // Subscribe to batch invalidation events\n unsubscribers.push(\n this.eventBus.subscribe('cache:invalidate:batch', async (data: any) => {\n if (data && data.tags) {\n await this.invalidateByTags(data.tags);\n }\n })\n );\n\n // Subscribe to data update events\n const dataUpdateHandler = async (data: any) => {\n if (data && data.table) {\n await this.cache.invalidateTable(data.table);\n }\n };\n\n const dataEvents = ['data:updated:users', 'data:updated:posts'];\n\n for (const event of dataEvents) {\n unsubscribers.push(this.eventBus.subscribe(event, dataUpdateHandler));\n }\n\n // Return combined unsubscribe function\n return () => {\n for (const unsubscribe of unsubscribers) {\n unsubscribe();\n }\n };\n }\n\n /**\n * Get all keys tagged with a specific tag\n *\n * @param tag - Tag name\n * @returns Result with array of keys\n */\n async getTaggedKeys(tag: string): Promise<Result<string[], InvalidationError>> {\n try {\n const keys = this.tagIndex.get(tag);\n\n if (!keys) {\n return Result.ok([]);\n }\n\n return Result.ok(Array.from(keys));\n } catch (error) {\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to get tagged keys: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Get all tags for a cache entry\n *\n * @param key - Cache key\n * @returns Result with array of tags\n */\n async getEntryTags(key: string): Promise<Result<string[], InvalidationError>> {\n try {\n const tags = this.entryTags.get(key);\n\n if (!tags) {\n return Result.ok([]);\n }\n\n return Result.ok(Array.from(tags));\n } catch (error) {\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to get entry tags: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Get invalidation statistics\n *\n * @returns Result with statistics\n */\n getStats(): Result<InvalidationStats, InvalidationError> {\n try {\n return Result.ok({ ...this.stats });\n } catch (error) {\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to get stats: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Reset invalidation statistics\n *\n * @returns Result with void on success\n */\n resetStats(): Result<void, InvalidationError> {\n try {\n this.stats = {\n totalInvalidations: 0,\n tagInvalidations: 0,\n patternInvalidations: 0,\n keyInvalidations: 0,\n expiredInvalidations: 0,\n };\n\n return Result.ok(undefined);\n } catch (error) {\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to reset stats: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Clean up tag mappings for a deleted entry\n */\n private async cleanupEntryTags(key: string): Promise<void> {\n const tags = this.entryTags.get(key);\n\n if (tags) {\n for (const tag of tags) {\n const tagSet = this.tagIndex.get(tag);\n if (tagSet) {\n tagSet.delete(key);\n\n if (tagSet.size === 0) {\n this.tagIndex.delete(tag);\n }\n }\n }\n\n this.entryTags.delete(key);\n }\n }\n\n /**\n * Convert glob pattern to regex\n */\n private patternToRegex(pattern: string): RegExp {\n const escaped = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&') // Escape special regex chars\n .replace(/\\*/g, '.*') // Replace * with .*\n .replace(/\\?/g, '.'); // Replace ? with .\n\n return new RegExp(`^${escaped}$`);\n }\n}\n","import { Result, Logger } from '@gl-life/gl-life-core';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport crypto from 'crypto';\nimport type {\n Migration,\n MigrationConfig,\n MigrationError,\n} from '../types/migration.js';\n\n/**\n * Migration file loader\n *\n * Discovers and loads migration files from a directory,\n * validates migration structure, and orders by version.\n *\n * Migration file format:\n * ```typescript\n * export const version = 1;\n * export const name = 'create_users_table';\n *\n * export async function up(context) {\n * return context.execute('CREATE TABLE users (id INTEGER PRIMARY KEY)');\n * }\n *\n * export async function down(context) {\n * return context.execute('DROP TABLE users');\n * }\n * ```\n *\n * Usage:\n * ```typescript\n * const loader = new MigrationLoader(config, logger);\n * const result = await loader.loadMigrations();\n * if (result.isOk()) {\n * const migrations = result.unwrap();\n * // migrations are ordered by version\n * }\n * ```\n */\nexport class MigrationLoader {\n private readonly config: MigrationConfig;\n private readonly logger: Logger;\n private readonly filePattern: RegExp;\n\n constructor(config: MigrationConfig, logger: Logger) {\n this.config = config;\n this.logger = logger;\n\n // Default file pattern: 001_name.ts, 002-name.ts, or V001__name.ts\n this.filePattern = config.filePattern || /^(\\d+|V\\d+)[_-].*\\.ts$/;\n }\n\n /**\n * Load all migrations from the configured directory\n *\n * @returns Result with array of migrations ordered by version\n */\n async loadMigrations(): Promise<Result<Migration[], MigrationError>> {\n try {\n // Check if directory exists\n if (!fs.existsSync(this.config.migrationsPath)) {\n return Result.err({\n type: 'INVALID_MIGRATION',\n message: `Migrations directory does not exist: ${this.config.migrationsPath}`,\n });\n }\n\n // Read directory\n const files = fs.readdirSync(this.config.migrationsPath);\n\n // Filter migration files\n const migrationFiles = files.filter(file => this.filePattern.test(file));\n\n this.logger.debug('Found migration files', {\n total: files.length,\n migrations: migrationFiles.length,\n });\n\n // Load each migration\n const migrations: Migration[] = [];\n\n for (const file of migrationFiles) {\n const filePath = path.join(this.config.migrationsPath, file);\n const result = await this.loadMigrationFile(filePath);\n\n if (result.isErr()) {\n return result as Result<Migration[], MigrationError>;\n }\n\n migrations.push(result.unwrap());\n }\n\n // Check for duplicate versions\n const duplicates = this.findDuplicateVersions(migrations);\n if (duplicates.length > 0) {\n return Result.err({\n type: 'INVALID_MIGRATION',\n message: `Duplicate migration versions found: ${duplicates.join(', ')}`,\n });\n }\n\n // Sort by version\n migrations.sort((a, b) => a.version - b.version);\n\n this.logger.debug('Loaded migrations', { count: migrations.length });\n\n return Result.ok(migrations);\n } catch (error) {\n this.logger.error('Failed to load migrations', { error });\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to load migrations: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Load a single migration file\n *\n * @param filePath - Path to migration file\n * @returns Result with Migration or MigrationError\n */\n private async loadMigrationFile(filePath: string): Promise<Result<Migration, MigrationError>> {\n try {\n // Read file content\n const content = fs.readFileSync(filePath, 'utf-8');\n\n // Dynamically import the migration module\n const fileUrl = `file://${filePath.replace(/\\\\/g, '/')}`;\n const module = await import(fileUrl);\n\n // Validate migration structure\n const validation = this.validateMigration(module, filePath);\n if (validation.isErr()) {\n return validation as Result<Migration, MigrationError>;\n }\n\n // Extract migration properties\n const { version, name, up, down } = module;\n\n // Generate migration ID\n const id = this.generateMigrationId(version, name);\n\n // Compute checksum\n const checksum = this.computeChecksum(content);\n\n const migration: Migration = {\n id,\n version,\n name,\n up,\n down,\n checksum,\n };\n\n this.logger.debug('Loaded migration', { id, version, name });\n\n return Result.ok(migration);\n } catch (error) {\n this.logger.error('Failed to load migration file', { error, filePath });\n return Result.err({\n type: 'INVALID_MIGRATION',\n message: `Failed to load migration file ${filePath}: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Validate migration module structure\n *\n * @param module - Migration module\n * @param filePath - File path for error messages\n * @returns Result with void on success or MigrationError\n */\n private validateMigration(\n module: any,\n filePath: string\n ): Result<void, MigrationError> {\n // Check version\n if (module.version === undefined) {\n return Result.err({\n type: 'INVALID_MIGRATION',\n message: `Migration ${filePath} is missing 'version' export`,\n });\n }\n\n if (typeof module.version !== 'number') {\n return Result.err({\n type: 'INVALID_MIGRATION',\n message: `Migration ${filePath} has invalid version type (must be number)`,\n });\n }\n\n if (module.version < 0) {\n return Result.err({\n type: 'INVALID_MIGRATION',\n message: `Migration ${filePath} has negative version number`,\n });\n }\n\n // Check name\n if (!module.name) {\n return Result.err({\n type: 'INVALID_MIGRATION',\n message: `Migration ${filePath} is missing 'name' export`,\n });\n }\n\n // Check up function\n if (!module.up || typeof module.up !== 'function') {\n return Result.err({\n type: 'INVALID_MIGRATION',\n message: `Migration ${filePath} is missing 'up' function`,\n });\n }\n\n // Check down function\n if (!module.down || typeof module.down !== 'function') {\n return Result.err({\n type: 'INVALID_MIGRATION',\n message: `Migration ${filePath} is missing 'down' function`,\n });\n }\n\n return Result.ok(undefined);\n }\n\n /**\n * Find duplicate version numbers in migrations\n *\n * @param migrations - Array of migrations\n * @returns Array of duplicate version numbers\n */\n private findDuplicateVersions(migrations: Migration[]): number[] {\n const versionCounts = new Map<number, number>();\n\n for (const migration of migrations) {\n const count = versionCounts.get(migration.version) || 0;\n versionCounts.set(migration.version, count + 1);\n }\n\n const duplicates: number[] = [];\n for (const [version, count] of versionCounts.entries()) {\n if (count > 1) {\n duplicates.push(version);\n }\n }\n\n return duplicates;\n }\n\n /**\n * Generate unique migration ID from version and name\n *\n * @param version - Migration version\n * @param name - Migration name\n * @returns Migration ID\n */\n private generateMigrationId(version: number, name: string): string {\n return `${version}_${name}`;\n }\n\n /**\n * Compute SHA-256 checksum of migration content\n *\n * @param content - Migration file content\n * @returns Checksum string\n */\n private computeChecksum(content: string): string {\n return crypto.createHash('sha256').update(content).digest('hex');\n }\n\n /**\n * Get SQL schema for migration tracking table\n *\n * @returns SQL CREATE TABLE statement\n */\n getMigrationTableSchema(): string {\n const tableName = this.config.migrationTable;\n\n return `\nCREATE TABLE IF NOT EXISTS ${tableName} (\n id TEXT PRIMARY KEY,\n version INTEGER NOT NULL UNIQUE,\n name TEXT NOT NULL,\n checksum TEXT,\n status TEXT NOT NULL DEFAULT 'PENDING',\n executed_at TIMESTAMP,\n execution_time INTEGER,\n error TEXT\n);\n\nCREATE INDEX IF NOT EXISTS idx_${tableName}_version ON ${tableName}(version);\nCREATE INDEX IF NOT EXISTS idx_${tableName}_status ON ${tableName}(status);\n `.trim();\n }\n}\n","import { Result, Logger } from '@gl-life/gl-life-core';\nimport type { MigrationLoader } from './loader.js';\nimport type {\n Migration,\n MigrationConfig,\n MigrationContext,\n MigrationMetadata,\n MigrationError,\n MigrationRunner as IMigrationRunner,\n} from '../types/migration.js';\n\n/**\n * Migration runner implementation\n *\n * Manages database migrations with version control, transaction support,\n * and rollback capabilities. Tracks migration state in the database.\n *\n * Usage:\n * ```typescript\n * const runner = new MigrationRunner(connection, loader, config, logger);\n *\n * // Run all pending migrations\n * const result = await runner.migrate();\n *\n * // Rollback last migration\n * const rollbackResult = await runner.rollback();\n * ```\n */\nexport class MigrationRunner implements IMigrationRunner {\n private readonly connection: any;\n private readonly loader: MigrationLoader;\n readonly config: MigrationConfig;\n private readonly logger: Logger;\n\n constructor(\n connection: any,\n loader: MigrationLoader,\n config: MigrationConfig,\n logger: Logger\n ) {\n this.connection = connection;\n this.loader = loader;\n this.config = config;\n this.logger = logger;\n }\n\n /**\n * Create migration table if it doesn't exist\n */\n async createMigrationTable(): Promise<Result<void, MigrationError>> {\n try {\n const schema = this.loader.getMigrationTableSchema();\n const result = await this.connection.execute(schema);\n\n if (result.isErr()) {\n return Result.err({\n type: 'UNKNOWN',\n message: 'Failed to create migration table',\n cause: result.variant.error,\n });\n }\n\n this.logger.debug('Migration table created');\n return Result.ok(undefined);\n } catch (error) {\n this.logger.error('Failed to create migration table', { error });\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to create migration table: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Get all available migrations\n */\n async getMigrations(): Promise<Result<Migration[], MigrationError>> {\n return this.loader.loadMigrations();\n }\n\n /**\n * Get migration history from database\n */\n async getHistory(): Promise<Result<MigrationMetadata[], MigrationError>> {\n try {\n const query = `SELECT * FROM ${this.config.migrationTable} ORDER BY version DESC`;\n const result = await this.connection.query(query);\n\n if (result.isErr()) {\n return Result.err({\n type: 'UNKNOWN',\n message: 'Failed to get migration history',\n cause: result.variant.error,\n });\n }\n\n const rows = result.unwrap();\n const history: MigrationMetadata[] = rows.map((row: any) => ({\n id: row.id,\n version: row.version,\n name: row.name,\n status: row.status,\n executedAt: row.executed_at ? new Date(row.executed_at) : undefined,\n executionTime: row.execution_time,\n error: row.error,\n checksum: row.checksum,\n }));\n\n return Result.ok(history);\n } catch (error) {\n this.logger.error('Failed to get migration history', { error });\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to get migration history: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Get pending migrations\n */\n async getPending(): Promise<Result<Migration[], MigrationError>> {\n try {\n // Load all migrations\n const migrationsResult = await this.getMigrations();\n if (migrationsResult.isErr()) {\n return migrationsResult;\n }\n\n const allMigrations = migrationsResult.unwrap();\n\n // Get history\n const historyResult = await this.getHistory();\n if (historyResult.isErr()) {\n return Result.err(historyResult.variant.error);\n }\n\n const history = historyResult.unwrap();\n const appliedVersions = new Set(\n history\n .filter(h => h.status === 'COMPLETED')\n .map(h => h.version)\n );\n\n // Filter out applied migrations\n const pending = allMigrations.filter(m => !appliedVersions.has(m.version));\n\n return Result.ok(pending);\n } catch (error) {\n this.logger.error('Failed to get pending migrations', { error });\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to get pending migrations: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Run all pending migrations\n */\n async migrate(): Promise<Result<MigrationMetadata[], MigrationError>> {\n try {\n // Validate checksums if enabled\n if (this.config.validateChecksums) {\n const validationResult = await this.validateChecksums();\n if (validationResult.isErr()) {\n return Result.err(validationResult.variant.error);\n }\n }\n\n // Get pending migrations\n const pendingResult = await this.getPending();\n if (pendingResult.isErr()) {\n return Result.err(pendingResult.variant.error);\n }\n\n const pending = pendingResult.unwrap();\n const applied: MigrationMetadata[] = [];\n\n // Run each migration\n for (const migration of pending) {\n const result = await this.runMigration(migration, 'UP');\n if (result.isErr()) {\n return Result.err(result.variant.error);\n }\n applied.push(result.unwrap());\n }\n\n this.logger.info('Migrations completed', { count: applied.length });\n return Result.ok(applied);\n } catch (error) {\n this.logger.error('Migration failed', { error });\n return Result.err({\n type: 'UNKNOWN',\n message: `Migration failed: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Run migrations up to a specific version\n */\n async migrateTo(targetVersion: number): Promise<Result<MigrationMetadata[], MigrationError>> {\n try {\n // Get all migrations\n const migrationsResult = await this.getMigrations();\n if (migrationsResult.isErr()) {\n return Result.err(migrationsResult.variant.error);\n }\n\n const allMigrations = migrationsResult.unwrap();\n\n // Check if target version exists\n const targetMigration = allMigrations.find(m => m.version === targetVersion);\n if (!targetMigration) {\n return Result.err({\n type: 'MIGRATION_NOT_FOUND',\n message: `Migration version ${targetVersion} not found`,\n migrationId: `${targetVersion}`,\n });\n }\n\n // Get pending migrations up to target\n const pendingResult = await this.getPending();\n if (pendingResult.isErr()) {\n return Result.err(pendingResult.variant.error);\n }\n\n const pending = pendingResult.unwrap();\n const toApply = pending.filter(m => m.version <= targetVersion);\n\n const applied: MigrationMetadata[] = [];\n\n // Run each migration\n for (const migration of toApply) {\n const result = await this.runMigration(migration, 'UP');\n if (result.isErr()) {\n return Result.err(result.variant.error);\n }\n applied.push(result.unwrap());\n }\n\n this.logger.info('Migrated to version', { version: targetVersion });\n return Result.ok(applied);\n } catch (error) {\n this.logger.error('Migration to version failed', { error, targetVersion });\n return Result.err({\n type: 'UNKNOWN',\n message: `Migration to version ${targetVersion} failed: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Rollback the last migration\n */\n async rollback(): Promise<Result<MigrationMetadata, MigrationError>> {\n try {\n // Get history\n const historyResult = await this.getHistory();\n if (historyResult.isErr()) {\n return Result.err(historyResult.variant.error);\n }\n\n const history = historyResult.unwrap();\n const completed = history.filter(h => h.status === 'COMPLETED');\n\n if (completed.length === 0) {\n return Result.err({\n type: 'NOT_APPLIED',\n message: 'No migrations to rollback',\n migrationId: '',\n });\n }\n\n // Get last completed migration\n const lastMigration = completed[0]; // Already sorted DESC\n\n // Load migration file\n const migrationsResult = await this.getMigrations();\n if (migrationsResult.isErr()) {\n return Result.err(migrationsResult.variant.error);\n }\n\n const migrations = migrationsResult.unwrap();\n const migration = migrations.find(m => m.id === lastMigration.id);\n\n if (!migration) {\n return Result.err({\n type: 'MIGRATION_NOT_FOUND',\n message: `Migration ${lastMigration.id} not found`,\n migrationId: lastMigration.id,\n });\n }\n\n // Run rollback\n const result = await this.runMigration(migration, 'DOWN');\n if (result.isErr()) {\n return Result.err(result.variant.error);\n }\n\n this.logger.info('Rolled back migration', { id: migration.id });\n return Result.ok(result.unwrap());\n } catch (error) {\n this.logger.error('Rollback failed', { error });\n return Result.err({\n type: 'UNKNOWN',\n message: `Rollback failed: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Rollback to a specific version\n */\n async rollbackTo(targetVersion: number): Promise<Result<MigrationMetadata[], MigrationError>> {\n try {\n // Get history\n const historyResult = await this.getHistory();\n if (historyResult.isErr()) {\n return Result.err(historyResult.variant.error);\n }\n\n const history = historyResult.unwrap();\n const completed = history\n .filter(h => h.status === 'COMPLETED' && h.version > targetVersion)\n .sort((a, b) => b.version - a.version); // DESC order\n\n // Load migrations\n const migrationsResult = await this.getMigrations();\n if (migrationsResult.isErr()) {\n return Result.err(migrationsResult.variant.error);\n }\n\n const allMigrations = migrationsResult.unwrap();\n const rolledBack: MigrationMetadata[] = [];\n\n // Rollback each migration\n for (const historyEntry of completed) {\n const migration = allMigrations.find(m => m.id === historyEntry.id);\n if (!migration) {\n return Result.err({\n type: 'MIGRATION_NOT_FOUND',\n message: `Migration ${historyEntry.id} not found`,\n migrationId: historyEntry.id,\n });\n }\n\n const result = await this.runMigration(migration, 'DOWN');\n if (result.isErr()) {\n return Result.err(result.variant.error);\n }\n rolledBack.push(result.unwrap());\n }\n\n this.logger.info('Rolled back to version', { version: targetVersion });\n return Result.ok(rolledBack);\n } catch (error) {\n this.logger.error('Rollback to version failed', { error, targetVersion });\n return Result.err({\n type: 'UNKNOWN',\n message: `Rollback to version ${targetVersion} failed: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Reset database by rolling back all migrations\n */\n async reset(): Promise<Result<MigrationMetadata[], MigrationError>> {\n return this.rollbackTo(0);\n }\n\n /**\n * Refresh database by resetting and re-running all migrations\n */\n async refresh(): Promise<\n Result<{ rolledBack: MigrationMetadata[]; applied: MigrationMetadata[] }, MigrationError>\n > {\n try {\n // Reset all migrations\n const resetResult = await this.reset();\n if (resetResult.isErr()) {\n return Result.err(resetResult.variant.error);\n }\n\n const rolledBack = resetResult.unwrap();\n\n // Re-run all migrations\n const migrateResult = await this.migrate();\n if (migrateResult.isErr()) {\n return Result.err(migrateResult.variant.error);\n }\n\n const applied = migrateResult.unwrap();\n\n this.logger.info('Database refreshed', {\n rolledBack: rolledBack.length,\n applied: applied.length,\n });\n\n return Result.ok({ rolledBack, applied });\n } catch (error) {\n this.logger.error('Refresh failed', { error });\n return Result.err({\n type: 'UNKNOWN',\n message: `Refresh failed: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Get current migration version\n */\n async getCurrentVersion(): Promise<Result<number, MigrationError>> {\n try {\n const historyResult = await this.getHistory();\n if (historyResult.isErr()) {\n return Result.err(historyResult.variant.error);\n }\n\n const history = historyResult.unwrap();\n const completed = history.filter(h => h.status === 'COMPLETED');\n\n if (completed.length === 0) {\n return Result.ok(0);\n }\n\n // Find max version among completed migrations\n const maxVersion = Math.max(...completed.map(h => h.version));\n return Result.ok(maxVersion);\n } catch (error) {\n this.logger.error('Failed to get current version', { error });\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to get current version: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Validate migration checksums\n */\n async validateChecksums(): Promise<Result<boolean, MigrationError>> {\n try {\n // Load all migrations\n const migrationsResult = await this.getMigrations();\n if (migrationsResult.isErr()) {\n return Result.err(migrationsResult.variant.error);\n }\n\n const migrations = migrationsResult.unwrap();\n\n // Get history\n const historyResult = await this.getHistory();\n if (historyResult.isErr()) {\n return Result.err(historyResult.variant.error);\n }\n\n const history = historyResult.unwrap();\n\n // Check checksums for completed migrations only\n const completedMigrations = history.filter(h => h.status === 'COMPLETED');\n\n for (const historyEntry of completedMigrations) {\n const migration = migrations.find(m => m.id === historyEntry.id);\n if (!migration) {\n continue; // Migration file may have been deleted\n }\n\n // Both checksums must exist and match\n if (migration.checksum && historyEntry.checksum) {\n if (migration.checksum !== historyEntry.checksum) {\n return Result.err({\n type: 'CHECKSUM_MISMATCH',\n message: `Checksum mismatch for migration ${migration.id}`,\n migrationId: migration.id,\n });\n }\n }\n }\n\n return Result.ok(true);\n } catch (error) {\n this.logger.error('Checksum validation failed', { error });\n return Result.err({\n type: 'UNKNOWN',\n message: `Checksum validation failed: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Load migration from file\n */\n async loadMigration(filePath: string): Promise<Result<Migration, MigrationError>> {\n if (this.loader.loadMigrationFile) {\n return this.loader.loadMigrationFile(filePath);\n }\n\n return Result.err({\n type: 'UNKNOWN',\n message: 'Migration loader does not support loading individual files',\n });\n }\n\n /**\n * Run a single migration in a transaction\n */\n private async runMigration(\n migration: Migration,\n direction: 'UP' | 'DOWN'\n ): Promise<Result<MigrationMetadata, MigrationError>> {\n const startTime = Date.now();\n const isUp = direction === 'UP';\n const fn = isUp ? migration.up : migration.down;\n\n try {\n // Insert/update migration status to RUNNING\n await this.updateMigrationStatus(\n migration,\n isUp ? 'RUNNING' : 'RUNNING',\n undefined,\n undefined\n );\n\n // Run migration in transaction if configured\n const runFn = async (conn: any) => {\n const context: MigrationContext = {\n execute: async <T = unknown>(sql: string, params?: unknown[]) => {\n const result = await conn.execute(sql, params);\n if (result.isErr()) {\n return Result.err({\n type: 'MIGRATION_FAILED',\n message: `Migration execution failed: ${result.variant.error}`,\n migrationId: migration.id,\n cause: result.variant.error,\n } as MigrationError);\n }\n return Result.ok(result.unwrap() as T);\n },\n log: (message: string) => {\n this.logger.info(message, { migrationId: migration.id });\n },\n metadata: {\n id: migration.id,\n version: migration.version,\n name: migration.name,\n status: 'RUNNING',\n },\n };\n\n return await fn(context);\n };\n\n let result: Result<void, MigrationError>;\n\n if (this.config.transactional) {\n result = await this.connection.transaction(runFn);\n } else {\n result = await runFn(this.connection);\n }\n\n const executionTime = Date.now() - startTime;\n\n if (result.isErr()) {\n // Update status to FAILED\n await this.updateMigrationStatus(\n migration,\n 'FAILED',\n executionTime,\n result.variant.error.message\n );\n\n return Result.err(result.variant.error);\n }\n\n // Update status to COMPLETED or ROLLED_BACK\n const finalStatus = isUp ? 'COMPLETED' : 'ROLLED_BACK';\n await this.updateMigrationStatus(migration, finalStatus, executionTime, undefined);\n\n const metadata: MigrationMetadata = {\n id: migration.id,\n version: migration.version,\n name: migration.name,\n status: finalStatus,\n executedAt: new Date(),\n executionTime,\n checksum: migration.checksum,\n };\n\n this.logger.info('Migration executed', {\n id: migration.id,\n direction,\n executionTime,\n });\n\n return Result.ok(metadata);\n } catch (error) {\n const executionTime = Date.now() - startTime;\n\n await this.updateMigrationStatus(\n migration,\n 'FAILED',\n executionTime,\n String(error)\n );\n\n this.logger.error('Migration execution failed', { error, migration: migration.id });\n\n return Result.err({\n type: isUp ? 'MIGRATION_FAILED' : 'ROLLBACK_FAILED',\n message: `Migration ${migration.id} failed: ${error}`,\n migrationId: migration.id,\n cause: error,\n });\n }\n }\n\n /**\n * Update migration status in database\n */\n private async updateMigrationStatus(\n migration: Migration,\n status: string,\n executionTime?: number,\n error?: string\n ): Promise<void> {\n try {\n const tableName = this.config.migrationTable;\n\n if (status === 'RUNNING') {\n // Insert new migration record\n const insertSQL = `\n INSERT OR REPLACE INTO ${tableName} (id, version, name, checksum, status, executed_at, execution_time, error)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `;\n\n await this.connection.execute(insertSQL, [\n {\n id: migration.id,\n version: migration.version,\n name: migration.name,\n checksum: migration.checksum || null,\n status,\n executed_at: new Date().toISOString(),\n execution_time: null,\n error: null,\n },\n ]);\n } else {\n // Update existing migration record\n const updateSQL = `\n UPDATE ${tableName}\n SET status = ?, execution_time = ?, error = ?, executed_at = ?\n WHERE id = ?\n `;\n\n await this.connection.execute(updateSQL, [\n {\n status,\n execution_time: executionTime || null,\n error: error || null,\n executed_at: new Date().toISOString(),\n id: migration.id,\n },\n ]);\n }\n } catch (err) {\n this.logger.error('Failed to update migration status', {\n error: err,\n migration: migration.id,\n });\n }\n }\n}\n","import { Result, Logger } from '@gl-life/gl-life-core';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport crypto from 'crypto';\nimport type {\n Seed,\n SeedConfig,\n SeedContext,\n SeedMetadata,\n SeedError,\n Seeder,\n SeedEnvironment,\n} from '../types/seed.js';\n\n/**\n * Data seeder implementation\n *\n * Manages database seeding with environment-specific support and idempotent execution.\n * Seeds are executed only once per environment unless explicitly re-run.\n *\n * Usage:\n * ```typescript\n * const seeder = new DataSeeder(connection, config, logger);\n *\n * // Run all pending seeds\n * const result = await seeder.seed();\n *\n * // Reset all seeds\n * const resetResult = await seeder.reset();\n * ```\n */\nexport class DataSeeder implements Seeder {\n private readonly connection: any;\n readonly config: SeedConfig;\n private readonly logger: Logger;\n private seedsCache: Seed[] | null = null;\n\n constructor(connection: any, config: SeedConfig, logger: Logger) {\n this.connection = connection;\n this.config = config;\n this.logger = logger;\n }\n\n /**\n * Create seed table if it doesn't exist\n */\n async createSeedTable(): Promise<Result<void, SeedError>> {\n try {\n const schema = this.getSeedTableSchema();\n const result = await this.connection.execute(schema);\n\n if (result.isErr()) {\n return Result.err({\n type: 'UNKNOWN',\n message: 'Failed to create seed table',\n cause: result.variant.error,\n });\n }\n\n this.logger.debug('Seed table created');\n return Result.ok(undefined);\n } catch (error) {\n this.logger.error('Failed to create seed table', { error });\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to create seed table: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Get all available seeds\n */\n async getSeeds(): Promise<Result<Seed[], SeedError>> {\n return this.loadSeedsFromDirectory();\n }\n\n /**\n * Get seed history from database\n */\n async getHistory(): Promise<Result<SeedMetadata[], SeedError>> {\n try {\n const query = `SELECT * FROM ${this.config.seedTable} ORDER BY executed_at DESC`;\n const result = await this.connection.query(query);\n\n if (result.isErr()) {\n return Result.err({\n type: 'UNKNOWN',\n message: 'Failed to get seed history',\n cause: result.variant.error,\n });\n }\n\n const rows = result.unwrap();\n const history: SeedMetadata[] = rows.map((row: any) => ({\n id: row.id,\n name: row.name,\n environment: JSON.parse(row.environment || '[]'),\n status: row.status,\n executedAt: row.executed_at ? new Date(row.executed_at) : undefined,\n executionTime: row.execution_time,\n error: row.error,\n checksum: row.checksum,\n }));\n\n return Result.ok(history);\n } catch (error) {\n this.logger.error('Failed to get seed history', { error });\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to get seed history: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Get pending seeds for current environment\n */\n async getPending(): Promise<Result<Seed[], SeedError>> {\n try {\n // Load all seeds\n const seedsResult = await this.getSeeds();\n if (seedsResult.isErr()) {\n return seedsResult;\n }\n\n const allSeeds = seedsResult.unwrap();\n\n // Filter by environment\n const environmentSeeds = allSeeds.filter(seed =>\n this.matchesEnvironment(seed.environment)\n );\n\n // Get history\n const historyResult = await this.getHistory();\n if (historyResult.isErr()) {\n return Result.err(historyResult.variant.error);\n }\n\n const history = historyResult.unwrap();\n const executedIds = new Set(\n history.filter(h => h.status === 'COMPLETED').map(h => h.id)\n );\n\n // Filter out executed seeds\n const pending = environmentSeeds.filter(s => !executedIds.has(s.id));\n\n return Result.ok(pending);\n } catch (error) {\n this.logger.error('Failed to get pending seeds', { error });\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to get pending seeds: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Run all pending seeds for current environment\n */\n async seed(): Promise<Result<SeedMetadata[], SeedError>> {\n try {\n // Validate checksums if enabled\n if (this.config.validateChecksums) {\n const validationResult = await this.validateChecksums();\n if (validationResult.isErr()) {\n return Result.err(validationResult.variant.error);\n }\n }\n\n // Get pending seeds\n const pendingResult = await this.getPending();\n if (pendingResult.isErr()) {\n return Result.err(pendingResult.variant.error);\n }\n\n const pending = pendingResult.unwrap();\n const executed: SeedMetadata[] = [];\n\n // Run each seed\n for (const seed of pending) {\n const result = await this.executeSeed(seed);\n if (result.isErr()) {\n return Result.err(result.variant.error);\n }\n executed.push(result.unwrap());\n }\n\n this.logger.info('Seeds completed', { count: executed.length });\n return Result.ok(executed);\n } catch (error) {\n this.logger.error('Seeding failed', { error });\n return Result.err({\n type: 'UNKNOWN',\n message: `Seeding failed: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Run a specific seed by ID\n */\n async runSeed(seedId: string): Promise<Result<SeedMetadata, SeedError>> {\n try {\n // Load all seeds\n const seedsResult = await this.getSeeds();\n if (seedsResult.isErr()) {\n return Result.err(seedsResult.variant.error);\n }\n\n const allSeeds = seedsResult.unwrap();\n const seed = allSeeds.find(s => s.id === seedId);\n\n if (!seed) {\n return Result.err({\n type: 'SEED_NOT_FOUND',\n message: `Seed ${seedId} not found`,\n seedId,\n });\n }\n\n // Execute seed (even if already run - allows re-running)\n return this.executeSeed(seed);\n } catch (error) {\n this.logger.error('Run seed failed', { error, seedId });\n return Result.err({\n type: 'UNKNOWN',\n message: `Run seed ${seedId} failed: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Reset all seeds (clear history)\n */\n async reset(): Promise<Result<void, SeedError>> {\n try {\n const sql = `DELETE FROM ${this.config.seedTable}`;\n const result = await this.connection.execute(sql);\n\n if (result.isErr()) {\n return Result.err({\n type: 'UNKNOWN',\n message: 'Failed to reset seeds',\n cause: result.variant.error,\n });\n }\n\n this.logger.info('All seeds reset');\n return Result.ok(undefined);\n } catch (error) {\n this.logger.error('Failed to reset seeds', { error });\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to reset seeds: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Validate seed checksums\n */\n async validateChecksums(): Promise<Result<boolean, SeedError>> {\n try {\n // Load all seeds\n const seedsResult = await this.getSeeds();\n if (seedsResult.isErr()) {\n return Result.err(seedsResult.variant.error);\n }\n\n const seeds = seedsResult.unwrap();\n\n // Get history\n const historyResult = await this.getHistory();\n if (historyResult.isErr()) {\n return Result.err(historyResult.variant.error);\n }\n\n const history = historyResult.unwrap();\n\n // Check checksums for completed seeds only\n const completedSeeds = history.filter(h => h.status === 'COMPLETED');\n\n for (const historyEntry of completedSeeds) {\n const seed = seeds.find(s => s.id === historyEntry.id);\n if (!seed) {\n continue; // Seed file may have been deleted\n }\n\n // Both checksums must exist and match\n if (seed.checksum && historyEntry.checksum) {\n if (seed.checksum !== historyEntry.checksum) {\n return Result.err({\n type: 'CHECKSUM_MISMATCH',\n message: `Checksum mismatch for seed ${seed.id}`,\n seedId: seed.id,\n });\n }\n }\n }\n\n return Result.ok(true);\n } catch (error) {\n this.logger.error('Checksum validation failed', { error });\n return Result.err({\n type: 'UNKNOWN',\n message: `Checksum validation failed: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Load seed from file\n */\n async loadSeed(filePath: string): Promise<Result<Seed, SeedError>> {\n return this.loadSeedFile(filePath);\n }\n\n /**\n * Load seeds from directory\n */\n private async loadSeedsFromDirectory(): Promise<Result<Seed[], SeedError>> {\n // Return cached seeds if available\n if (this.seedsCache) {\n return Result.ok(this.seedsCache);\n }\n\n try {\n // Check if directory exists\n if (!fs.existsSync(this.config.seedsPath)) {\n return Result.err({\n type: 'INVALID_SEED',\n message: `Seeds directory does not exist: ${this.config.seedsPath}`,\n });\n }\n\n // Read directory\n const files = fs.readdirSync(this.config.seedsPath);\n\n // Default file pattern: 001_name.ts or 001-name.ts\n const filePattern = this.config.filePattern || /^[0-9]+[_-].*\\.ts$/;\n\n // Filter seed files\n const seedFiles = files.filter(file => filePattern.test(file));\n\n this.logger.debug('Found seed files', {\n total: files.length,\n seeds: seedFiles.length,\n });\n\n // Load each seed\n const seeds: Seed[] = [];\n\n for (const file of seedFiles) {\n const filePath = path.join(this.config.seedsPath, file);\n const result = await this.loadSeedFile(filePath);\n\n if (result.isErr()) {\n return result as Result<Seed[], SeedError>;\n }\n\n seeds.push(result.unwrap());\n }\n\n // Sort by ID\n seeds.sort((a, b) => a.id.localeCompare(b.id));\n\n // Cache seeds\n this.seedsCache = seeds;\n\n this.logger.debug('Loaded seeds', { count: seeds.length });\n\n return Result.ok(seeds);\n } catch (error) {\n this.logger.error('Failed to load seeds', { error });\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to load seeds: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Load a single seed file\n */\n private async loadSeedFile(filePath: string): Promise<Result<Seed, SeedError>> {\n try {\n // Read file content\n const content = fs.readFileSync(filePath, 'utf-8');\n\n // Dynamically import the seed module\n const fileUrl = `file://${filePath.replace(/\\\\/g, '/')}`;\n const module = await import(fileUrl);\n\n // Validate seed structure\n const validation = this.validateSeed(module, filePath);\n if (validation.isErr()) {\n return validation as Result<Seed, SeedError>;\n }\n\n // Extract seed properties\n const { id, name, environment, run } = module;\n\n // Compute checksum\n const checksum = this.computeChecksum(content);\n\n const seed: Seed = {\n id,\n name,\n environment: Array.isArray(environment) ? environment : [environment],\n run,\n checksum,\n };\n\n this.logger.debug('Loaded seed', { id, name, environment });\n\n return Result.ok(seed);\n } catch (error) {\n this.logger.error('Failed to load seed file', { error, filePath });\n return Result.err({\n type: 'INVALID_SEED',\n message: `Failed to load seed file ${filePath}: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Validate seed module structure\n */\n private validateSeed(module: any, filePath: string): Result<void, SeedError> {\n // Check id\n if (!module.id) {\n return Result.err({\n type: 'INVALID_SEED',\n message: `Seed ${filePath} is missing 'id' export`,\n });\n }\n\n // Check name\n if (!module.name) {\n return Result.err({\n type: 'INVALID_SEED',\n message: `Seed ${filePath} is missing 'name' export`,\n });\n }\n\n // Check environment\n if (!module.environment) {\n return Result.err({\n type: 'INVALID_SEED',\n message: `Seed ${filePath} is missing 'environment' export`,\n });\n }\n\n // Check run function\n if (!module.run || typeof module.run !== 'function') {\n return Result.err({\n type: 'INVALID_SEED',\n message: `Seed ${filePath} is missing 'run' function`,\n });\n }\n\n return Result.ok(undefined);\n }\n\n /**\n * Check if seed matches current environment\n */\n private matchesEnvironment(environments: SeedEnvironment[]): boolean {\n // 'all' environment matches any environment\n if (environments.includes('all')) {\n return true;\n }\n\n // Check if current environment is in seed's environments\n return environments.includes(this.config.environment);\n }\n\n /**\n * Execute a single seed\n */\n private async executeSeed(seed: Seed): Promise<Result<SeedMetadata, SeedError>> {\n const startTime = Date.now();\n\n try {\n // Insert/update seed status to RUNNING\n await this.updateSeedStatus(seed, 'RUNNING', undefined, undefined);\n\n // Run seed in transaction if configured\n const runFn = async (conn: any) => {\n const context: SeedContext = {\n execute: async <T = unknown>(sql: string, params?: unknown[]) => {\n const result = await conn.execute(sql, params);\n if (result.isErr()) {\n return Result.err({\n type: 'SEED_FAILED',\n message: `Seed execution failed: ${result.variant.error}`,\n seedId: seed.id,\n cause: result.variant.error,\n } as SeedError);\n }\n return Result.ok(result.unwrap() as T);\n },\n log: (message: string) => {\n this.logger.info(message, { seedId: seed.id });\n },\n metadata: {\n id: seed.id,\n name: seed.name,\n environment: seed.environment,\n status: 'RUNNING',\n },\n environment: this.config.environment,\n };\n\n return await seed.run(context);\n };\n\n let result: Result<void, SeedError>;\n\n if (this.config.transactional) {\n result = await this.connection.transaction(runFn);\n } else {\n result = await runFn(this.connection);\n }\n\n const executionTime = Date.now() - startTime;\n\n if (result.isErr()) {\n // Update status to FAILED\n await this.updateSeedStatus(seed, 'FAILED', executionTime, result.variant.error.message);\n\n return Result.err(result.variant.error);\n }\n\n // Update status to COMPLETED\n await this.updateSeedStatus(seed, 'COMPLETED', executionTime, undefined);\n\n const metadata: SeedMetadata = {\n id: seed.id,\n name: seed.name,\n environment: seed.environment,\n status: 'COMPLETED',\n executedAt: new Date(),\n executionTime,\n checksum: seed.checksum,\n };\n\n this.logger.info('Seed executed', {\n id: seed.id,\n executionTime,\n });\n\n return Result.ok(metadata);\n } catch (error) {\n const executionTime = Date.now() - startTime;\n\n await this.updateSeedStatus(seed, 'FAILED', executionTime, String(error));\n\n this.logger.error('Seed execution failed', { error, seed: seed.id });\n\n return Result.err({\n type: 'SEED_FAILED',\n message: `Seed ${seed.id} failed: ${error}`,\n seedId: seed.id,\n cause: error,\n });\n }\n }\n\n /**\n * Update seed status in database\n */\n private async updateSeedStatus(\n seed: Seed,\n status: string,\n executionTime?: number,\n error?: string\n ): Promise<void> {\n try {\n const tableName = this.config.seedTable;\n\n if (status === 'RUNNING') {\n // Insert new seed record\n const insertSQL = `\n INSERT OR REPLACE INTO ${tableName} (id, name, environment, checksum, status, executed_at, execution_time, error)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `;\n\n await this.connection.execute(insertSQL, [\n seed.id,\n seed.name,\n JSON.stringify(seed.environment),\n seed.checksum || null,\n status,\n new Date().toISOString(),\n null,\n null,\n ]);\n } else {\n // Update existing seed record\n const updateSQL = `\n UPDATE ${tableName}\n SET status = ?, execution_time = ?, error = ?, executed_at = ?\n WHERE id = ?\n `;\n\n await this.connection.execute(updateSQL, [\n status,\n executionTime || null,\n error || null,\n new Date().toISOString(),\n seed.id,\n ]);\n }\n } catch (err) {\n this.logger.error('Failed to update seed status', {\n error: err,\n seed: seed.id,\n });\n }\n }\n\n /**\n * Compute SHA-256 checksum of seed content\n */\n private computeChecksum(content: string): string {\n return crypto.createHash('sha256').update(content).digest('hex');\n }\n\n /**\n * Get SQL schema for seed tracking table\n */\n private getSeedTableSchema(): string {\n const tableName = this.config.seedTable;\n\n return `\nCREATE TABLE IF NOT EXISTS ${tableName} (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n environment TEXT NOT NULL,\n checksum TEXT,\n status TEXT NOT NULL DEFAULT 'PENDING',\n executed_at TIMESTAMP,\n execution_time INTEGER,\n error TEXT\n);\n\nCREATE INDEX IF NOT EXISTS idx_${tableName}_status ON ${tableName}(status);\nCREATE INDEX IF NOT EXISTS idx_${tableName}_environment ON ${tableName}(environment);\n `.trim();\n }\n}\n","import { Result, Logger } from '@gl-life/gl-life-core';\nimport type {\n D1Database,\n D1PreparedStatement,\n D1Result,\n D1AdapterConfig,\n D1AdapterError,\n D1Adapter,\n D1ExecResult,\n} from '../types/cloudforge.js';\n\n/**\n * Cloudflare D1 database adapter\n *\n * Provides a standardized interface for interacting with Cloudflare D1 databases.\n * Handles D1-specific quirks and optimizes for D1 performance.\n *\n * Usage:\n * ```typescript\n * const adapter = new D1DatabaseAdapter(config, logger);\n *\n * // Query data\n * const result = await adapter.query('SELECT * FROM users WHERE id = ?', [1]);\n *\n * // Execute statement\n * const execResult = await adapter.execute('INSERT INTO users (name) VALUES (?)', ['Alice']);\n *\n * // Batch operations\n * const batchResult = await adapter.batch([\n * { sql: 'INSERT INTO users (name) VALUES (?)', params: ['Alice'] },\n * { sql: 'INSERT INTO users (name) VALUES (?)', params: ['Bob'] },\n * ]);\n * ```\n */\nexport class D1DatabaseAdapter implements D1Adapter {\n readonly config: D1AdapterConfig;\n private readonly logger: Logger;\n private readonly db: D1Database;\n\n constructor(config: D1AdapterConfig, logger: Logger) {\n this.config = config;\n this.logger = logger;\n this.db = config.database;\n }\n\n /**\n * Execute a SQL query and return all results\n */\n async query<T = unknown>(sql: string, params?: unknown[]): Promise<Result<T[], D1AdapterError>> {\n try {\n if (this.config.enableQueryLogging) {\n this.logger.debug('Executing D1 query', { sql, params });\n }\n\n const stmt = this.prepareStatement(sql, params);\n const result = await stmt.all<T>();\n\n if (!result.success) {\n return Result.err({\n type: 'QUERY_FAILED',\n message: result.error || 'Query failed',\n sql,\n });\n }\n\n return Result.ok(result.results || []);\n } catch (error) {\n this.logger.error('D1 query failed', { error, sql });\n return Result.err({\n type: 'QUERY_FAILED',\n message: `Query failed: ${error}`,\n sql,\n cause: error,\n });\n }\n }\n\n /**\n * Execute a SQL query and return first result\n */\n async queryFirst<T = unknown>(\n sql: string,\n params?: unknown[]\n ): Promise<Result<T | null, D1AdapterError>> {\n try {\n if (this.config.enableQueryLogging) {\n this.logger.debug('Executing D1 queryFirst', { sql, params });\n }\n\n const stmt = this.prepareStatement(sql, params);\n const result = await stmt.first<T>();\n\n return Result.ok(result);\n } catch (error) {\n this.logger.error('D1 queryFirst failed', { error, sql });\n return Result.err({\n type: 'QUERY_FAILED',\n message: `QueryFirst failed: ${error}`,\n sql,\n cause: error,\n });\n }\n }\n\n /**\n * Execute a SQL statement (INSERT, UPDATE, DELETE)\n */\n async execute(sql: string, params?: unknown[]): Promise<Result<D1Result, D1AdapterError>> {\n try {\n if (this.config.enableQueryLogging) {\n this.logger.debug('Executing D1 statement', { sql, params });\n }\n\n const stmt = this.prepareStatement(sql, params);\n const result = await stmt.run();\n\n if (!result.success) {\n return Result.err({\n type: 'QUERY_FAILED',\n message: result.error || 'Execution failed',\n sql,\n });\n }\n\n return Result.ok(result);\n } catch (error) {\n this.logger.error('D1 execute failed', { error, sql });\n return Result.err({\n type: 'QUERY_FAILED',\n message: `Execute failed: ${error}`,\n sql,\n cause: error,\n });\n }\n }\n\n /**\n * Execute multiple SQL statements in a batch\n */\n async batch(\n statements: Array<{ sql: string; params?: unknown[] }>\n ): Promise<Result<D1Result[], D1AdapterError>> {\n try {\n // Validate batch size\n const maxBatchSize = this.config.maxBatchSize || 100;\n if (statements.length > maxBatchSize) {\n return Result.err({\n type: 'BATCH_FAILED',\n message: `Batch size ${statements.length} exceeds maximum ${maxBatchSize}`,\n });\n }\n\n // Handle empty batch\n if (statements.length === 0) {\n return Result.ok([]);\n }\n\n if (this.config.enableQueryLogging) {\n this.logger.debug('Executing D1 batch', {\n count: statements.length,\n });\n }\n\n // Prepare all statements\n const preparedStatements: D1PreparedStatement[] = statements.map(({ sql, params }) =>\n this.prepareStatement(sql, params)\n );\n\n // Execute batch\n const results = await this.db.batch(preparedStatements);\n\n return Result.ok(results);\n } catch (error) {\n this.logger.error('D1 batch failed', { error, count: statements.length });\n return Result.err({\n type: 'BATCH_FAILED',\n message: `Batch execution failed: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Execute raw SQL (for migrations and schema changes)\n */\n async exec(sql: string): Promise<Result<D1ExecResult, D1AdapterError>> {\n try {\n if (this.config.enableQueryLogging) {\n this.logger.debug('Executing D1 raw SQL', { sql });\n }\n\n const result = await this.db.exec(sql);\n\n return Result.ok(result);\n } catch (error) {\n this.logger.error('D1 exec failed', { error, sql });\n return Result.err({\n type: 'EXEC_FAILED',\n message: `Exec failed: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Begin a transaction\n *\n * Note: D1 doesn't support explicit transactions yet, so this wraps\n * the callback execution and provides the same interface for compatibility.\n * Consider using batch() for atomic multi-statement operations.\n */\n async transaction<T>(\n callback: (adapter: D1Adapter) => Promise<Result<T, D1AdapterError>>\n ): Promise<Result<T, D1AdapterError>> {\n try {\n this.logger.debug('Starting D1 transaction (logical)');\n\n // Execute the callback with this adapter\n const result = await callback(this);\n\n return result;\n } catch (error) {\n this.logger.error('D1 transaction failed', { error });\n return Result.err({\n type: 'UNKNOWN',\n message: `Transaction failed: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Prepare a SQL statement with parameters\n */\n private prepareStatement(sql: string, params?: unknown[]): D1PreparedStatement {\n const stmt = this.db.prepare(sql);\n\n // Bind parameters if provided\n if (params && params.length > 0) {\n return stmt.bind(...params);\n }\n\n return stmt;\n }\n}\n","import { Result, Logger } from '@gl-life/gl-life-core';\nimport type {\n DurableObjectStorage,\n DurableObjectStorageConfig,\n DurableObjectStorageError,\n DurableObjectStorageAdapter as IDurableObjectStorageAdapter,\n StorageListOptions,\n StorageTransaction,\n} from '../types/cloudforge.js';\n\n/**\n * Durable Objects storage adapter implementation\n *\n * Provides a type-safe interface for Cloudflare Durable Objects storage\n * with Result-based error handling and logging support.\n */\nexport class DurableObjectStorageAdapter implements IDurableObjectStorageAdapter {\n readonly config: DurableObjectStorageConfig;\n private readonly storage: DurableObjectStorage;\n private readonly logger: Logger;\n\n constructor(\n storage: DurableObjectStorage,\n config: DurableObjectStorageConfig,\n logger: Logger\n ) {\n this.storage = storage;\n this.config = config;\n this.logger = logger;\n }\n\n /**\n * Get a single value by key\n */\n async get<T>(key: string): Promise<Result<T | null, DurableObjectStorageError>> {\n try {\n if (this.config.enableLogging) {\n this.logger.debug('DO Storage operation', { operation: 'get', key });\n }\n\n const value = await this.storage.get(key);\n\n return Result.ok(value === undefined ? null : value);\n } catch (error) {\n this.logger.error('DO Storage get failed', { error, key });\n return Result.err({\n type: 'STORAGE_FAILED',\n message: `Failed to get value for key \"${key}\": ${error}`,\n key,\n cause: error,\n });\n }\n }\n\n /**\n * Get multiple values by keys\n */\n async getMultiple<T>(\n keys: string[]\n ): Promise<Result<Map<string, T>, DurableObjectStorageError>> {\n try {\n if (this.config.enableLogging) {\n this.logger.debug('DO Storage operation', {\n operation: 'getMultiple',\n keyCount: keys.length,\n });\n }\n\n const result = await this.storage.get(keys);\n const typedResult = result as Map<string, T>;\n\n return Result.ok(typedResult);\n } catch (error) {\n this.logger.error('DO Storage getMultiple failed', { error, keyCount: keys.length });\n return Result.err({\n type: 'STORAGE_FAILED',\n message: `Failed to get multiple values: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Put a single key-value pair\n */\n async put<T>(key: string, value: T): Promise<Result<void, DurableObjectStorageError>> {\n try {\n if (this.config.enableLogging) {\n this.logger.debug('DO Storage operation', { operation: 'put', key });\n }\n\n await this.storage.put(key, value);\n\n return Result.ok(undefined);\n } catch (error) {\n // Check for serialization errors\n if (\n error instanceof Error &&\n (error.message.includes('DataCloneError') || error.message.includes('could not be cloned'))\n ) {\n this.logger.error('DO Storage serialization failed', { error, key });\n return Result.err({\n type: 'SERIALIZATION_ERROR',\n message: `Failed to serialize value for key \"${key}\": ${error.message}`,\n cause: error,\n });\n }\n\n // Check for quota exceeded errors\n if (\n error instanceof Error &&\n (error.message.includes('QuotaExceededError') ||\n error.message.includes('storage quota exceeded'))\n ) {\n this.logger.error('DO Storage quota exceeded', { error, key });\n return Result.err({\n type: 'QUOTA_EXCEEDED',\n message: `Storage quota exceeded when setting key \"${key}\"`,\n });\n }\n\n this.logger.error('DO Storage put failed', { error, key });\n return Result.err({\n type: 'STORAGE_FAILED',\n message: `Failed to put value for key \"${key}\": ${error}`,\n key,\n cause: error,\n });\n }\n }\n\n /**\n * Put multiple key-value pairs\n */\n async putMultiple<T>(\n entries: [string, T][]\n ): Promise<Result<void, DurableObjectStorageError>> {\n try {\n if (this.config.enableLogging) {\n this.logger.debug('DO Storage operation', {\n operation: 'putMultiple',\n entryCount: entries.length,\n });\n }\n\n // Convert array of tuples to object\n const entriesObj: Record<string, T> = {};\n for (const [key, value] of entries) {\n entriesObj[key] = value;\n }\n\n await this.storage.put(entriesObj);\n\n return Result.ok(undefined);\n } catch (error) {\n // Check for serialization errors\n if (\n error instanceof Error &&\n (error.message.includes('DataCloneError') || error.message.includes('could not be cloned'))\n ) {\n this.logger.error('DO Storage serialization failed', { error });\n return Result.err({\n type: 'SERIALIZATION_ERROR',\n message: `Failed to serialize values: ${error.message}`,\n cause: error,\n });\n }\n\n // Check for quota exceeded errors\n if (\n error instanceof Error &&\n (error.message.includes('QuotaExceededError') ||\n error.message.includes('storage quota exceeded'))\n ) {\n this.logger.error('DO Storage quota exceeded', { error });\n return Result.err({\n type: 'QUOTA_EXCEEDED',\n message: 'Storage quota exceeded when setting multiple values',\n });\n }\n\n this.logger.error('DO Storage putMultiple failed', { error, entryCount: entries.length });\n return Result.err({\n type: 'STORAGE_FAILED',\n message: `Failed to put multiple values: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Delete a single key\n */\n async delete(key: string): Promise<Result<boolean, DurableObjectStorageError>> {\n try {\n if (this.config.enableLogging) {\n this.logger.debug('DO Storage operation', { operation: 'delete', key });\n }\n\n const result = await this.storage.delete(key);\n\n return Result.ok(result as boolean);\n } catch (error) {\n this.logger.error('DO Storage delete failed', { error, key });\n return Result.err({\n type: 'STORAGE_FAILED',\n message: `Failed to delete key \"${key}\": ${error}`,\n key,\n cause: error,\n });\n }\n }\n\n /**\n * Delete multiple keys\n */\n async deleteMultiple(keys: string[]): Promise<Result<number, DurableObjectStorageError>> {\n try {\n if (this.config.enableLogging) {\n this.logger.debug('DO Storage operation', {\n operation: 'deleteMultiple',\n keyCount: keys.length,\n });\n }\n\n const result = await this.storage.delete(keys);\n\n return Result.ok(result as number);\n } catch (error) {\n this.logger.error('DO Storage deleteMultiple failed', { error, keyCount: keys.length });\n return Result.err({\n type: 'STORAGE_FAILED',\n message: `Failed to delete multiple keys: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Delete all keys in storage\n */\n async deleteAll(): Promise<Result<void, DurableObjectStorageError>> {\n try {\n if (this.config.enableLogging) {\n this.logger.debug('DO Storage operation', { operation: 'deleteAll' });\n }\n\n await this.storage.deleteAll();\n\n return Result.ok(undefined);\n } catch (error) {\n this.logger.error('DO Storage deleteAll failed', { error });\n return Result.err({\n type: 'STORAGE_FAILED',\n message: `Failed to delete all keys: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * List keys in storage\n */\n async list(\n options?: StorageListOptions\n ): Promise<Result<Map<string, any>, DurableObjectStorageError>> {\n try {\n if (this.config.enableLogging) {\n this.logger.debug('DO Storage operation', { operation: 'list', options });\n }\n\n const result = await this.storage.list(options);\n\n return Result.ok(result);\n } catch (error) {\n this.logger.error('DO Storage list failed', { error, options });\n return Result.err({\n type: 'STORAGE_FAILED',\n message: `Failed to list keys: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Execute operations in a transaction\n */\n async transaction<T>(\n callback: (txn: StorageTransaction) => Promise<Result<T, DurableObjectStorageError>>\n ): Promise<Result<T, DurableObjectStorageError>> {\n try {\n if (this.config.enableLogging) {\n this.logger.debug('DO Storage operation', { operation: 'transaction' });\n }\n\n const result = await this.storage.transaction(async (txnStorage) => {\n // Create a transaction adapter for the callback\n const txnAdapter = new DurableObjectStorageAdapter(\n txnStorage,\n this.config,\n this.logger\n );\n\n // Execute the callback with the transaction adapter\n return await callback(txnAdapter);\n });\n\n return result;\n } catch (error) {\n this.logger.error('DO Storage transaction failed', { error });\n return Result.err({\n type: 'TRANSACTION_FAILED',\n message: `Transaction failed: ${error}`,\n cause: error,\n });\n }\n }\n}\n","import { Result, Logger } from '@gl-life/gl-life-core';\nimport { gzipSync, gunzipSync } from 'node:zlib';\nimport type {\n R2Bucket,\n R2BackupConfig,\n R2BackupError,\n R2BackupAdapter as IR2BackupAdapter,\n BackupInfo,\n BackupOptions,\n RestoreOptions,\n} from '../types/cloudforge.js';\n\n/**\n * R2 backup adapter implementation\n *\n * Provides database backup and restore functionality using Cloudflare R2 storage\n * with compression support and metadata tracking.\n */\nexport class R2BackupAdapter implements IR2BackupAdapter {\n readonly config: R2BackupConfig;\n private readonly bucket: R2Bucket;\n private readonly logger: Logger;\n\n constructor(config: R2BackupConfig, logger: Logger) {\n this.config = config;\n this.bucket = config.bucket;\n this.logger = logger;\n }\n\n /**\n * Create a backup with compression\n */\n async backup(\n data: ArrayBuffer | Buffer,\n options?: BackupOptions\n ): Promise<Result<BackupInfo, R2BackupError>> {\n try {\n if (this.config.enableLogging) {\n this.logger.debug('R2 Backup operation', { operation: 'backup' });\n }\n\n // Convert ArrayBuffer to Buffer if needed\n const buffer = data instanceof ArrayBuffer ? Buffer.from(data) : data;\n\n if (!buffer || buffer.length === 0) {\n return Result.err({\n type: 'COMPRESSION_FAILED',\n message: 'Cannot backup empty or invalid data',\n });\n }\n\n // Compress data\n const compressionLevel = options?.compressionLevel ?? this.config.defaultCompressionLevel ?? 6;\n\n let compressedData: Buffer;\n try {\n compressedData = gzipSync(buffer, { level: compressionLevel });\n } catch (error) {\n this.logger.error('Compression failed', { error });\n return Result.err({\n type: 'COMPRESSION_FAILED',\n message: `Failed to compress data: ${error}`,\n cause: error,\n });\n }\n\n // Generate unique backup key with timestamp\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const key = `${this.config.name}-backup-${timestamp}.gz`;\n\n // Prepare metadata\n const customMetadata: Record<string, string> = {\n originalSize: buffer.length.toString(),\n compressionRatio: (compressedData.length / buffer.length).toString(),\n compressionLevel: compressionLevel.toString(),\n backupDate: new Date().toISOString(),\n ...(options?.metadata || {}),\n };\n\n // Upload to R2\n try {\n const r2Object = await this.bucket.put(key, compressedData, {\n httpMetadata: {\n contentType: 'application/gzip',\n contentEncoding: 'gzip',\n contentDisposition: `attachment; filename=\"${key}\"`,\n },\n customMetadata,\n storageClass: options?.storageClass || 'Standard',\n });\n\n const backupInfo: BackupInfo = {\n key: r2Object.key,\n size: buffer.length,\n compressedSize: r2Object.size,\n compressionRatio: r2Object.size / buffer.length,\n uploadedAt: r2Object.uploaded,\n etag: r2Object.etag,\n metadata: {\n databaseVersion: customMetadata.databaseVersion,\n backupType: customMetadata.backupType,\n originalChecksum: customMetadata.originalChecksum,\n },\n };\n\n if (this.config.enableLogging) {\n this.logger.debug('Backup completed', {\n key: backupInfo.key,\n originalSize: backupInfo.size,\n compressedSize: backupInfo.compressedSize,\n compressionRatio: backupInfo.compressionRatio,\n });\n }\n\n return Result.ok(backupInfo);\n } catch (error) {\n this.logger.error('R2 upload failed', { error, key });\n return Result.err({\n type: 'UPLOAD_FAILED',\n message: `Failed to upload backup: ${error}`,\n key,\n cause: error,\n });\n }\n } catch (error) {\n this.logger.error('Backup operation failed', { error });\n return Result.err({\n type: 'UNKNOWN',\n message: `Backup failed: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Restore from a backup with decompression\n */\n async restore(\n key: string,\n options?: RestoreOptions\n ): Promise<Result<ArrayBuffer, R2BackupError>> {\n try {\n if (this.config.enableLogging) {\n this.logger.debug('R2 Backup operation', { operation: 'restore', key });\n }\n\n // Download from R2\n let r2Object;\n try {\n r2Object = await this.bucket.get(key);\n } catch (error) {\n this.logger.error('R2 download failed', { error, key });\n return Result.err({\n type: 'DOWNLOAD_FAILED',\n message: `Failed to download backup: ${error}`,\n key,\n cause: error,\n });\n }\n\n if (!r2Object) {\n return Result.err({\n type: 'BACKUP_NOT_FOUND',\n message: `Backup not found: ${key}`,\n key,\n });\n }\n\n // Get compressed data\n const compressedData = await r2Object.arrayBuffer();\n\n // Decompress data\n try {\n const decompressed = gunzipSync(Buffer.from(compressedData));\n\n if (this.config.enableLogging) {\n this.logger.debug('Restore completed', {\n key,\n compressedSize: compressedData.byteLength,\n originalSize: decompressed.length,\n });\n }\n\n return Result.ok(decompressed.buffer);\n } catch (error) {\n this.logger.error('Decompression failed', { error, key });\n return Result.err({\n type: 'DECOMPRESSION_FAILED',\n message: `Failed to decompress backup: ${error}`,\n cause: error,\n });\n }\n } catch (error) {\n this.logger.error('Restore operation failed', { error, key });\n return Result.err({\n type: 'RESTORE_FAILED',\n message: `Restore failed: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * List all backups\n */\n async listBackups(options?: {\n limit?: number;\n cursor?: string;\n }): Promise<Result<BackupInfo[], R2BackupError>> {\n try {\n if (this.config.enableLogging) {\n this.logger.debug('R2 Backup operation', { operation: 'listBackups' });\n }\n\n const r2Objects = await this.bucket.list({\n prefix: `${this.config.name}-backup`,\n limit: options?.limit,\n cursor: options?.cursor,\n include: ['customMetadata'],\n });\n\n const backups: BackupInfo[] = r2Objects.objects.map((obj) => {\n const originalSize = parseInt(obj.customMetadata?.originalSize || '0', 10);\n const compressionRatio = parseFloat(\n obj.customMetadata?.compressionRatio || '1.0'\n );\n\n return {\n key: obj.key,\n size: originalSize,\n compressedSize: obj.size,\n compressionRatio,\n uploadedAt: obj.uploaded,\n etag: obj.etag,\n metadata: {\n databaseVersion: obj.customMetadata?.databaseVersion,\n backupType: obj.customMetadata?.backupType,\n originalChecksum: obj.customMetadata?.originalChecksum,\n },\n };\n });\n\n return Result.ok(backups);\n } catch (error) {\n this.logger.error('List backups failed', { error });\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to list backups: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Delete a single backup\n */\n async deleteBackup(key: string): Promise<Result<void, R2BackupError>> {\n try {\n if (this.config.enableLogging) {\n this.logger.debug('R2 Backup operation', { operation: 'deleteBackup', key });\n }\n\n await this.bucket.delete(key);\n\n return Result.ok(undefined);\n } catch (error) {\n this.logger.error('Delete backup failed', { error, key });\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to delete backup: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Delete multiple backups (batched for efficiency)\n */\n async deleteMultipleBackups(keys: string[]): Promise<Result<void, R2BackupError>> {\n try {\n if (this.config.enableLogging) {\n this.logger.debug('R2 Backup operation', {\n operation: 'deleteMultipleBackups',\n count: keys.length,\n });\n }\n\n // R2 supports up to 1000 deletions per call\n const batchSize = 1000;\n const batches: string[][] = [];\n\n for (let i = 0; i < keys.length; i += batchSize) {\n batches.push(keys.slice(i, i + batchSize));\n }\n\n // Delete in batches\n for (const batch of batches) {\n await this.bucket.delete(batch);\n }\n\n return Result.ok(undefined);\n } catch (error) {\n this.logger.error('Delete multiple backups failed', { error, count: keys.length });\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to delete backups: ${error}`,\n cause: error,\n });\n }\n }\n}\n","// @gl-life/gl-life-database\n// Enhanced gl-life-data wrapper with CloudForge features\n\nimport { Result, Option, Logger, EventBus, Config } from '@gl-life/gl-life-core';\n\nexport { Result, Option, Logger, EventBus, Config };\n\n// Export all types and interfaces\nexport * from './types/index.js';\n\n// Export connection manager\nexport * from './connection/index.js';\n\n// Export query builder\nexport * from './query/index.js';\n\n// Export transaction\nexport * from './transaction/index.js';\n\n// Export tenant\nexport * from './tenant/index.js';\n\n// Export cache\nexport * from './cache/index.js';\n\n// Export migration classes\nexport { MigrationLoader } from './migration/loader.js';\nexport { MigrationRunner } from './migration/runner.js';\nexport { DataSeeder } from './migration/seeder.js';\n\n// Export cloudforge classes\nexport { D1DatabaseAdapter } from './cloudforge/d1-adapter.js';\nexport { DurableObjectStorageAdapter } from './cloudforge/do-storage.js';\nexport { R2BackupAdapter } from './cloudforge/r2-backup.js';\n\nexport const version = '1.0.0';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/connection/manager.ts","../src/query/builder.ts","../src/query/raw.ts","../src/transaction/transaction.ts","../src/tenant/context.ts","../src/tenant/query-wrapper.ts","../src/tenant/schema-manager.ts","../src/cache/memory-cache.ts","../src/cache/kv-cache.ts","../src/cache/invalidation.ts","../src/migration/loader.ts","../src/migration/runner.ts","../src/migration/seeder.ts","../src/cloudforge/d1-adapter.ts","../src/cloudforge/do-storage.ts","../src/cloudforge/r2-backup.ts","../src/index.ts"],"names":["Result","conn","randomBytes","AsyncLocalStorage","Option","version","crypto","now","entry","fs","path","result","fs2","path2","gzipSync","gunzipSync"],"mappings":"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","file":"index.cjs","sourcesContent":["import { Result, Logger } from '@gl-life/gl-life-core';\nimport type {\n DatabaseConnection,\n DatabaseConnectionConfig,\n DatabaseConnectionError,\n} from '../types/connection.js';\n\n/**\n * Extended configuration for connection manager\n */\ninterface ConnectionManagerConfig extends DatabaseConnectionConfig {\n autoReconnect?: boolean;\n maxRetries?: number;\n retryDelay?: number;\n}\n\n/**\n * Internal connection wrapper\n */\nclass InternalConnection implements DatabaseConnection {\n readonly id: string;\n readonly config: DatabaseConnectionConfig;\n private connected: boolean = false;\n private lastPing: Date | null = null;\n\n constructor(id: string, config: DatabaseConnectionConfig) {\n this.id = id;\n this.config = config;\n }\n\n get isConnected(): boolean {\n return this.connected;\n }\n\n async connect(): Promise<Result<void, DatabaseConnectionError>> {\n try {\n this.connected = true;\n this.lastPing = new Date();\n return Result.ok(undefined);\n } catch (error) {\n return Result.err({\n type: 'CONNECTION_FAILED',\n message: `Failed to connect: ${error}`,\n cause: error,\n });\n }\n }\n\n async disconnect(): Promise<Result<void, DatabaseConnectionError>> {\n try {\n this.connected = false;\n this.lastPing = null;\n return Result.ok(undefined);\n } catch (error) {\n return Result.err({\n type: 'CONNECTION_FAILED',\n message: `Failed to disconnect: ${error}`,\n cause: error,\n });\n }\n }\n\n async execute<T = unknown>(\n sql: string,\n params?: unknown[]\n ): Promise<Result<T, DatabaseConnectionError>> {\n if (!this.connected) {\n return Result.err({\n type: 'CONNECTION_CLOSED',\n message: 'Connection is not active',\n });\n }\n\n try {\n // Mock execution for now - will integrate with gl-life-data\n return Result.ok({} as T);\n } catch (error) {\n return Result.err({\n type: 'UNKNOWN',\n message: `Query execution failed: ${error}`,\n cause: error,\n });\n }\n }\n\n async ping(): Promise<Result<boolean, DatabaseConnectionError>> {\n if (!this.connected) {\n return Result.ok(false);\n }\n\n try {\n this.lastPing = new Date();\n return Result.ok(true);\n } catch (error) {\n return Result.err({\n type: 'UNKNOWN',\n message: `Ping failed: ${error}`,\n cause: error,\n });\n }\n }\n}\n\n/**\n * Database connection manager with pooling, health checks, and auto-reconnect\n */\nexport class DatabaseConnectionManager {\n private config: ConnectionManagerConfig;\n private logger: Logger;\n private pool: InternalConnection[] = [];\n private available: InternalConnection[] = [];\n private active: Set<InternalConnection> = new Set();\n private initialized: boolean = false;\n private destroyed: boolean = false;\n private connectionIdCounter: number = 0;\n\n constructor(config: ConnectionManagerConfig, logger: Logger) {\n // Validate configuration\n if (!config.name || config.name.trim() === '') {\n throw new Error('Database name is required');\n }\n if (config.maxConnections !== undefined && config.maxConnections < 0) {\n throw new Error('maxConnections must be >= 0');\n }\n\n this.config = {\n maxConnections: 10,\n timeout: 30000,\n autoReconnect: false,\n maxRetries: 3,\n retryDelay: 1000,\n ...config,\n };\n this.logger = logger;\n }\n\n /**\n * Get manager configuration\n */\n getConfig(): ConnectionManagerConfig {\n return { ...this.config };\n }\n\n /**\n * Get number of active connections\n */\n getActiveCount(): number {\n return this.active.size;\n }\n\n /**\n * Initialize the connection manager\n */\n async initialize(): Promise<Result<void, DatabaseConnectionError>> {\n if (this.initialized) {\n return Result.ok(undefined);\n }\n\n if (this.destroyed) {\n return Result.err({\n type: 'CONNECTION_CLOSED',\n message: 'Manager has been destroyed',\n });\n }\n\n this.logger.info('Initializing DatabaseConnectionManager', {\n name: this.config.name,\n maxConnections: this.config.maxConnections,\n });\n\n try {\n this.initialized = true;\n this.logger.info('DatabaseConnectionManager initialized successfully');\n return Result.ok(undefined);\n } catch (error) {\n this.initialized = false;\n return Result.err({\n type: 'CONNECTION_FAILED',\n message: `Initialization failed: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Acquire a connection from the pool\n */\n async acquire(): Promise<Result<DatabaseConnection, DatabaseConnectionError>> {\n if (this.destroyed) {\n this.logger.error('Cannot acquire connection: manager destroyed');\n return Result.err({\n type: 'CONNECTION_CLOSED',\n message: 'Manager has been destroyed',\n });\n }\n\n if (!this.initialized) {\n return Result.err({\n type: 'CONNECTION_CLOSED',\n message: 'Manager not initialized',\n });\n }\n\n this.logger.debug('Acquiring connection from pool', {\n available: this.available.length,\n active: this.active.size,\n total: this.pool.length,\n });\n\n // Check if we have an available connection\n if (this.available.length > 0) {\n const conn = this.available.pop()!;\n this.active.add(conn);\n\n // Verify connection is still healthy\n const pingResult = await conn.ping();\n if (pingResult.isOk() && pingResult.unwrap()) {\n this.logger.debug('Reusing existing connection', { id: conn.id });\n return Result.ok(conn);\n } else {\n // Connection is unhealthy, reconnect if enabled\n if (this.config.autoReconnect) {\n const reconnectResult = await conn.connect();\n if (reconnectResult.isOk()) {\n this.logger.debug('Reconnected unhealthy connection', { id: conn.id });\n return Result.ok(conn);\n }\n }\n // Remove unhealthy connection\n this.active.delete(conn);\n this.pool = this.pool.filter(c => c.id !== conn.id);\n }\n }\n\n // Check if we can create a new connection\n const maxConnections = this.config.maxConnections!;\n if (this.pool.length >= maxConnections) {\n this.logger.error('Connection pool limit reached', {\n max: maxConnections,\n current: this.pool.length,\n });\n return Result.err({\n type: 'CONNECTION_FAILED',\n message: `Connection pool limit reached (${maxConnections})`,\n });\n }\n\n // Create new connection\n const connId = `conn-${++this.connectionIdCounter}`;\n const conn = new InternalConnection(connId, this.config);\n\n const connectResult = await conn.connect();\n if (connectResult.isErr()) {\n return connectResult;\n }\n\n this.pool.push(conn);\n this.active.add(conn);\n\n this.logger.debug('Created new connection', {\n id: conn.id,\n poolSize: this.pool.length,\n });\n\n return Result.ok(conn);\n }\n\n /**\n * Release a connection back to the pool\n */\n async release(connection: DatabaseConnection): Promise<Result<void, DatabaseConnectionError>> {\n if (!connection || !connection.id) {\n return Result.err({\n type: 'DATABASE_NOT_FOUND',\n message: 'Invalid connection provided',\n });\n }\n\n const conn = this.pool.find(c => c.id === connection.id);\n if (!conn) {\n return Result.err({\n type: 'DATABASE_NOT_FOUND',\n message: 'Connection not found in pool',\n });\n }\n\n this.active.delete(conn as InternalConnection);\n this.available.push(conn as InternalConnection);\n\n this.logger.debug('Released connection back to pool', {\n id: connection.id,\n available: this.available.length,\n });\n\n return Result.ok(undefined);\n }\n\n /**\n * Perform health check on all connections\n */\n async healthCheck(): Promise<Result<boolean, DatabaseConnectionError>> {\n if (this.destroyed) {\n return Result.ok(false);\n }\n\n if (!this.initialized) {\n return Result.ok(false);\n }\n\n try {\n if (this.pool.length === 0) {\n // No connections yet, try to create one\n const testConn = await this.acquire();\n if (testConn.isErr()) {\n return Result.ok(false);\n }\n await this.release(testConn.unwrap());\n return Result.ok(true);\n }\n\n // Check all connections\n const checks = this.pool.map(conn => conn.ping());\n const results = await Promise.all(checks);\n\n const allHealthy = results.every(r => r.isOk() && r.unwrap() === true);\n\n if (!allHealthy && this.config.autoReconnect) {\n // Attempt to reconnect unhealthy connections\n for (let i = 0; i < this.pool.length; i++) {\n const result = results[i];\n if (result.isErr() || !result.unwrap()) {\n await this.pool[i].connect();\n }\n }\n }\n\n return Result.ok(allHealthy);\n } catch (error) {\n return Result.err({\n type: 'UNKNOWN',\n message: `Health check failed: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Destroy the connection manager and close all connections\n */\n async destroy(): Promise<Result<void, DatabaseConnectionError>> {\n if (this.destroyed) {\n return Result.ok(undefined);\n }\n\n this.logger.info('Destroying DatabaseConnectionManager', {\n totalConnections: this.pool.length,\n activeConnections: this.active.size,\n });\n\n try {\n // Close all connections\n const closePromises = this.pool.map(conn => conn.disconnect());\n await Promise.all(closePromises);\n\n this.pool = [];\n this.available = [];\n this.active.clear();\n this.initialized = false;\n this.destroyed = true;\n\n this.logger.info('DatabaseConnectionManager destroyed successfully');\n return Result.ok(undefined);\n } catch (error) {\n return Result.err({\n type: 'UNKNOWN',\n message: `Destroy failed: ${error}`,\n cause: error,\n });\n }\n }\n}\n","import { Result, Logger } from '@gl-life/gl-life-core';\nimport type {\n QueryBuilder as IQueryBuilder,\n QueryBuilderError,\n WhereOperator,\n WhereCondition,\n JoinType,\n OrderDirection,\n} from '../types/query-builder.js';\n\n/**\n * Type-safe query builder wrapper for gl-life-data\n *\n * Wraps gl-life-data QueryBuilder with:\n * - Type safety using TypeScript generics\n * - Result<T, E> pattern for error handling\n * - Fluent chainable API\n * - Complex joins, aggregations, subqueries support\n */\nexport class TypeSafeQueryBuilder<T = unknown> implements IQueryBuilder<T> {\n private tableName: string;\n private metaDataService: any;\n private logger: Logger;\n\n private selectedColumns: string[] = [];\n private whereConditions: Array<{ field: string; operator: WhereOperator; value?: unknown; isOr?: boolean }> = [];\n private joinClauses: Array<{ type: JoinType; table: string; left: string; right: string }> = [];\n private orderByClauses: Array<{ field: string; direction: OrderDirection }> = [];\n private groupByFields: string[] = [];\n private havingCondition: string | null = null;\n private limitValue: number | null = null;\n private offsetValue: number | null = null;\n\n constructor(tableName: string, metaDataService: any, logger: Logger) {\n if (!tableName || tableName.trim() === '') {\n throw new Error('Table name is required');\n }\n this.tableName = tableName;\n this.metaDataService = metaDataService;\n this.logger = logger;\n }\n\n table(table: string): IQueryBuilder<T> {\n this.tableName = table;\n return this;\n }\n\n select(...columns: string[]): IQueryBuilder<T> {\n this.selectedColumns.push(...columns);\n return this;\n }\n\n where(field: string, operator: WhereOperator, value?: unknown): IQueryBuilder<T> {\n this.whereConditions.push({ field, operator, value, isOr: false });\n return this;\n }\n\n orWhere(field: string, operator: WhereOperator, value?: unknown): IQueryBuilder<T> {\n this.whereConditions.push({ field, operator, value, isOr: true });\n return this;\n }\n\n whereIn(field: string, values: unknown[]): IQueryBuilder<T> {\n this.whereConditions.push({ field, operator: 'IN', value: values, isOr: false });\n return this;\n }\n\n join(table: string, leftField: string, rightField: string, type: JoinType = 'INNER'): IQueryBuilder<T> {\n this.joinClauses.push({ type, table, left: leftField, right: rightField });\n return this;\n }\n\n orderBy(field: string, direction: OrderDirection = 'ASC'): IQueryBuilder<T> {\n this.orderByClauses.push({ field, direction });\n return this;\n }\n\n groupBy(...fields: string[]): IQueryBuilder<T> {\n this.groupByFields.push(...fields);\n return this;\n }\n\n having(condition: string): IQueryBuilder<T> {\n this.havingCondition = condition;\n return this;\n }\n\n limit(limit: number): IQueryBuilder<T> {\n this.limitValue = limit;\n return this;\n }\n\n offset(offset: number): IQueryBuilder<T> {\n this.offsetValue = offset;\n return this;\n }\n\n async insert(data: Partial<T>): Promise<Result<T, QueryBuilderError>> {\n try {\n this.logger.debug('Insert operation', { table: this.tableName, data });\n // Mock implementation - would integrate with gl-life-data\n return Result.ok(data as T);\n } catch (error) {\n return Result.err({\n type: 'EXECUTION_FAILED',\n message: `Insert failed: ${error}`,\n cause: error,\n });\n }\n }\n\n async insertMany(data: Partial<T>[]): Promise<Result<T[], QueryBuilderError>> {\n try {\n this.logger.debug('Insert many operation', { table: this.tableName, count: data.length });\n return Result.ok(data as T[]);\n } catch (error) {\n return Result.err({\n type: 'EXECUTION_FAILED',\n message: `Insert many failed: ${error}`,\n cause: error,\n });\n }\n }\n\n async update(data: Partial<T>): Promise<Result<number, QueryBuilderError>> {\n try {\n this.logger.debug('Update operation', { table: this.tableName, data });\n // Mock implementation\n return Result.ok(1);\n } catch (error) {\n return Result.err({\n type: 'EXECUTION_FAILED',\n message: `Update failed: ${error}`,\n cause: error,\n });\n }\n }\n\n async delete(): Promise<Result<number, QueryBuilderError>> {\n try {\n this.logger.debug('Delete operation', { table: this.tableName });\n return Result.ok(1);\n } catch (error) {\n return Result.err({\n type: 'EXECUTION_FAILED',\n message: `Delete failed: ${error}`,\n cause: error,\n });\n }\n }\n\n async first(): Promise<Result<T | null, QueryBuilderError>> {\n try {\n this.logger.debug('First operation', { table: this.tableName });\n // Mock implementation\n return Result.ok(null);\n } catch (error) {\n return Result.err({\n type: 'EXECUTION_FAILED',\n message: `First failed: ${error}`,\n cause: error,\n });\n }\n }\n\n async get(): Promise<Result<T[], QueryBuilderError>> {\n try {\n this.logger.debug('Get operation', { table: this.tableName });\n // Mock implementation - would integrate with gl-life-data QueryBuilder\n return Result.ok([]);\n } catch (error) {\n return Result.err({\n type: 'EXECUTION_FAILED',\n message: `Get failed: ${error}`,\n cause: error,\n });\n }\n }\n\n async count(field: string = '*'): Promise<Result<number, QueryBuilderError>> {\n try {\n this.logger.debug('Count operation', { table: this.tableName, field });\n return Result.ok(0);\n } catch (error) {\n return Result.err({\n type: 'EXECUTION_FAILED',\n message: `Count failed: ${error}`,\n cause: error,\n });\n }\n }\n\n toSQL(): string {\n const columns = this.selectedColumns.length > 0 ? this.selectedColumns.join(', ') : '*';\n let sql = `SELECT ${columns} FROM ${this.tableName}`;\n\n if (this.joinClauses.length > 0) {\n sql += ' ' + this.joinClauses\n .map(j => `${j.type} JOIN ${j.table} ON ${j.left} = ${j.right}`)\n .join(' ');\n }\n\n if (this.whereConditions.length > 0) {\n const whereParts = this.whereConditions.map((w, i) => {\n const prefix = i === 0 ? 'WHERE' : (w.isOr ? 'OR' : 'AND');\n return `${prefix} ${w.field} ${w.operator} ?`;\n });\n sql += ' ' + whereParts.join(' ');\n }\n\n if (this.groupByFields.length > 0) {\n sql += ` GROUP BY ${this.groupByFields.join(', ')}`;\n }\n\n if (this.havingCondition) {\n sql += ` HAVING ${this.havingCondition}`;\n }\n\n if (this.orderByClauses.length > 0) {\n sql += ' ORDER BY ' + this.orderByClauses\n .map(o => `${o.field} ${o.direction}`)\n .join(', ');\n }\n\n if (this.limitValue !== null) {\n sql += ` LIMIT ${this.limitValue}`;\n }\n\n if (this.offsetValue !== null) {\n sql += ` OFFSET ${this.offsetValue}`;\n }\n\n return sql;\n }\n\n getBindings(): unknown[] {\n return this.whereConditions.map(w => w.value).filter(v => v !== undefined);\n }\n\n clone(): IQueryBuilder<T> {\n const cloned = new TypeSafeQueryBuilder<T>(this.tableName, this.metaDataService, this.logger);\n cloned.selectedColumns = [...this.selectedColumns];\n cloned.whereConditions = [...this.whereConditions];\n cloned.joinClauses = [...this.joinClauses];\n cloned.orderByClauses = [...this.orderByClauses];\n cloned.groupByFields = [...this.groupByFields];\n cloned.havingCondition = this.havingCondition;\n cloned.limitValue = this.limitValue;\n cloned.offsetValue = this.offsetValue;\n return cloned;\n }\n}\n","import { Result, Logger } from '@gl-life/gl-life-core';\nimport type { DatabaseConnection, DatabaseConnectionError } from '../types/connection.js';\n\n/**\n * Raw SQL execution error types\n */\nexport type RawSQLError =\n | { type: 'INVALID_SQL'; message: string }\n | { type: 'PARAMETER_MISMATCH'; message: string }\n | { type: 'EXECUTION_FAILED'; message: string; cause?: unknown }\n | { type: 'VALIDATION_FAILED'; message: string }\n | DatabaseConnectionError;\n\n/**\n * Query with parameters for batch execution\n */\nexport interface SQLQuery {\n sql: string;\n params?: unknown[];\n}\n\n/**\n * Execution options\n */\nexport interface ExecutionOptions {\n transaction?: boolean;\n timeout?: number;\n}\n\n/**\n * Raw SQL Executor\n *\n * Provides safe raw SQL execution with:\n * - Parameterized queries to prevent SQL injection\n * - Result type mapping\n * - Query validation\n * - Batch execution support\n * - Error handling with Result pattern\n */\nexport class RawSQLExecutor {\n private readonly connection: DatabaseConnection;\n private readonly logger: Logger;\n\n constructor(connection: DatabaseConnection, logger: Logger) {\n this.connection = connection;\n this.logger = logger;\n }\n\n /**\n * Execute a raw SQL query with parameters\n *\n * Uses parameterized queries to prevent SQL injection.\n * All parameter values are properly escaped by the database driver.\n *\n * @param sql - SQL query string with ? placeholders\n * @param params - Parameter values to bind to placeholders\n * @param options - Execution options\n * @returns Result containing array of rows or error\n */\n async execute<T = unknown>(\n sql: string,\n params: unknown[] = [],\n options?: ExecutionOptions\n ): Promise<Result<T[], RawSQLError>> {\n // Validate SQL query\n const validationResult = this.validateSQL(sql, params);\n if (validationResult.isErr()) {\n return validationResult as Result<T[], RawSQLError>;\n }\n\n try {\n this.logger.debug('Executing raw SQL', {\n sql: sql.substring(0, 100),\n paramCount: params.length,\n });\n\n // Execute query through connection\n const result = await this.connection.execute<any>(sql, params);\n\n if (result.isErr()) {\n // Connection error - convert to RawSQLError\n return Result.err({\n type: 'EXECUTION_FAILED',\n message: 'Query execution failed',\n cause: result,\n });\n }\n\n const data = result.unwrap();\n\n // Extract rows from result\n // The result can be { rows: [...] } or just the array itself\n let rows: T[];\n if (data && typeof data === 'object' && 'rows' in data) {\n rows = data.rows;\n } else if (Array.isArray(data)) {\n rows = data;\n } else {\n rows = [];\n }\n\n this.logger.debug('Query executed successfully', {\n rowCount: rows.length,\n });\n\n return Result.ok(rows);\n } catch (error) {\n this.logger.error('Raw SQL execution failed', {\n error,\n sql: sql.substring(0, 100),\n });\n\n return Result.err({\n type: 'EXECUTION_FAILED',\n message: `Query execution failed: ${error instanceof Error ? error.message : String(error)}`,\n cause: error,\n });\n }\n }\n\n /**\n * Execute a query and return the first row or null\n *\n * @param sql - SQL query string\n * @param params - Parameter values\n * @param options - Execution options\n * @returns Result containing single row or null\n */\n async executeOne<T = unknown>(\n sql: string,\n params: unknown[] = [],\n options?: ExecutionOptions\n ): Promise<Result<T | null, RawSQLError>> {\n const result = await this.execute<T>(sql, params, options);\n\n if (result.isErr()) {\n return result as Result<T | null, RawSQLError>;\n }\n\n const rows = result.unwrap();\n return Result.ok(rows.length > 0 ? rows[0] : null);\n }\n\n /**\n * Execute multiple queries in batch\n *\n * All queries execute sequentially. If any query fails, execution stops\n * and an error is returned.\n *\n * @param queries - Array of SQL queries with parameters\n * @returns Result containing array of results or error\n */\n async executeBatch<T = unknown>(\n queries: SQLQuery[]\n ): Promise<Result<T[][], RawSQLError>> {\n const results: T[][] = [];\n\n try {\n this.logger.debug('Executing batch queries', { count: queries.length });\n\n for (const query of queries) {\n const result = await this.execute<T>(query.sql, query.params || []);\n\n if (result.isErr()) {\n // Batch execution failed\n return Result.err({\n type: 'EXECUTION_FAILED',\n message: 'Batch execution failed',\n cause: result,\n });\n }\n\n results.push(result.unwrap());\n }\n\n this.logger.debug('Batch execution completed', {\n queryCount: queries.length,\n totalRows: results.reduce((sum, rows) => sum + rows.length, 0),\n });\n\n return Result.ok(results);\n } catch (error) {\n this.logger.error('Batch execution failed', { error });\n\n return Result.err({\n type: 'EXECUTION_FAILED',\n message: `Batch execution failed: ${error instanceof Error ? error.message : String(error)}`,\n cause: error,\n });\n }\n }\n\n /**\n * Validate SQL query and parameters\n *\n * Checks for:\n * - Empty/whitespace-only queries\n * - Parameter count matching placeholder count\n *\n * @param sql - SQL query string\n * @param params - Parameter values\n * @returns Result indicating validation success or error\n */\n private validateSQL(sql: string, params: unknown[]): Result<void, RawSQLError> {\n // Check for empty query\n if (!sql || sql.trim().length === 0) {\n return Result.err({\n type: 'INVALID_SQL',\n message: 'SQL query cannot be empty',\n });\n }\n\n // Count placeholders in SQL\n const placeholderCount = (sql.match(/\\?/g) || []).length;\n\n // Validate parameter count matches placeholders\n if (placeholderCount !== params.length) {\n return Result.err({\n type: 'PARAMETER_MISMATCH',\n message: `Parameter count mismatch: expected ${placeholderCount} but got ${params.length}`,\n });\n }\n\n return Result.ok(undefined);\n }\n}\n","import { Result, Logger } from '@gl-life/gl-life-core';\nimport { randomBytes } from 'crypto';\nimport type {\n Transaction,\n TransactionError,\n TransactionState,\n TransactionConfig,\n TransactionIsolationLevel,\n} from '../types/transaction.js';\nimport type { QueryBuilder } from '../types/query-builder.js';\nimport { TypeSafeQueryBuilder } from '../query/builder.js';\n\n/**\n * Database connection interface\n */\ninterface DbConnection {\n execute<T = unknown>(sql: string, params: unknown[]): Promise<T>;\n batch?(queries: Array<{ sql: string; params: unknown[] }>): Promise<unknown[]>;\n}\n\n/**\n * Database Transaction implementation\n *\n * Provides ACID transaction support with:\n * - BEGIN/COMMIT/ROLLBACK operations\n * - Savepoint support for nested transactions\n * - Automatic rollback on errors (configurable)\n * - Transaction timeout handling\n * - Query builder integration\n */\nexport class DatabaseTransaction implements Transaction {\n private readonly _id: string;\n private readonly db: DbConnection;\n private readonly _logger: Logger;\n private readonly _config: Required<TransactionConfig>;\n private _state: TransactionState = 'PENDING';\n private startTime: number | null = null;\n private timeoutHandle: NodeJS.Timeout | null = null;\n\n constructor(\n db: DbConnection,\n logger: Logger,\n config: TransactionConfig = {}\n ) {\n this._id = this.generateTransactionId();\n this.db = db;\n this._logger = logger;\n this._config = {\n isolationLevel: config.isolationLevel || 'READ COMMITTED',\n timeout: config.timeout || 30000,\n autoRollback: config.autoRollback !== undefined ? config.autoRollback : true,\n };\n }\n\n private generateTransactionId(): string {\n return `tx_${randomBytes(16).toString('hex')}`;\n }\n\n get id(): string {\n return this._id;\n }\n\n get state(): TransactionState {\n return this._state;\n }\n\n get config(): TransactionConfig {\n return this._config;\n }\n\n get isActive(): boolean {\n return this._state === 'ACTIVE';\n }\n\n async begin(): Promise<Result<void, TransactionError>> {\n if (this._state !== 'PENDING') {\n return Result.err({\n type: 'ALREADY_STARTED',\n message: `Transaction ${this._id} is already ${this._state}`,\n });\n }\n\n try {\n this._logger.debug('Beginning transaction', {\n id: this._id,\n isolationLevel: this._config.isolationLevel,\n });\n\n // SQLite doesn't support setting isolation level directly in BEGIN\n // It uses PRAGMA for isolation levels, but for simplicity we'll just use BEGIN\n await this.db.execute('BEGIN', []);\n\n this._state = 'ACTIVE';\n this.startTime = Date.now();\n\n // Set timeout if configured\n if (this._config.timeout && this._config.timeout > 0) {\n this.timeoutHandle = setTimeout(() => {\n this.handleTimeout();\n }, this._config.timeout);\n }\n\n return Result.ok(undefined);\n } catch (error) {\n this._logger.error('Failed to begin transaction', { error, id: this._id });\n return Result.err({\n type: 'BEGIN_FAILED',\n message: `Failed to begin transaction: ${error instanceof Error ? error.message : String(error)}`,\n cause: error,\n });\n }\n }\n\n async commit(): Promise<Result<void, TransactionError>> {\n if (this._state === 'PENDING') {\n return Result.err({\n type: 'NOT_STARTED',\n message: `Transaction ${this._id} has not been started`,\n });\n }\n\n if (this._state === 'COMMITTED' || this._state === 'ROLLED_BACK') {\n return Result.err({\n type: 'ALREADY_COMPLETED',\n message: `Transaction ${this._id} is already ${this._state}`,\n });\n }\n\n try {\n this._logger.debug('Committing transaction', { id: this._id });\n\n await this.db.execute('COMMIT', []);\n\n this._state = 'COMMITTED';\n this.clearTimeout();\n\n const duration = this.startTime ? Date.now() - this.startTime : 0;\n this._logger.info('Transaction committed', { id: this._id, duration });\n\n return Result.ok(undefined);\n } catch (error) {\n this._logger.error('Failed to commit transaction', { error, id: this._id });\n return Result.err({\n type: 'COMMIT_FAILED',\n message: `Failed to commit transaction: ${error instanceof Error ? error.message : String(error)}`,\n cause: error,\n });\n }\n }\n\n async rollback(): Promise<Result<void, TransactionError>> {\n if (this._state === 'PENDING') {\n return Result.err({\n type: 'NOT_STARTED',\n message: `Transaction ${this._id} has not been started`,\n });\n }\n\n if (this._state === 'COMMITTED' || this._state === 'ROLLED_BACK') {\n return Result.err({\n type: 'ALREADY_COMPLETED',\n message: `Transaction ${this._id} is already ${this._state}`,\n });\n }\n\n try {\n this._logger.debug('Rolling back transaction', { id: this._id });\n\n await this.db.execute('ROLLBACK', []);\n\n this._state = 'ROLLED_BACK';\n this.clearTimeout();\n\n const duration = this.startTime ? Date.now() - this.startTime : 0;\n this._logger.info('Transaction rolled back', { id: this._id, duration });\n\n return Result.ok(undefined);\n } catch (error) {\n this._logger.error('Failed to rollback transaction', { error, id: this._id });\n return Result.err({\n type: 'ROLLBACK_FAILED',\n message: `Failed to rollback transaction: ${error instanceof Error ? error.message : String(error)}`,\n cause: error,\n });\n }\n }\n\n async savepoint(name: string): Promise<Result<string, TransactionError>> {\n if (!this.isActive) {\n return Result.err({\n type: 'NOT_STARTED',\n message: `Cannot create savepoint: transaction ${this._id} is not active`,\n });\n }\n\n try {\n this._logger.debug('Creating savepoint', { id: this._id, savepoint: name });\n\n await this.db.execute(`SAVEPOINT ${name}`, []);\n\n return Result.ok(name);\n } catch (error) {\n this._logger.error('Failed to create savepoint', { error, id: this._id, savepoint: name });\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to create savepoint: ${error instanceof Error ? error.message : String(error)}`,\n cause: error,\n });\n }\n }\n\n async rollbackToSavepoint(name: string): Promise<Result<void, TransactionError>> {\n if (!this.isActive) {\n return Result.err({\n type: 'NOT_STARTED',\n message: `Cannot rollback to savepoint: transaction ${this._id} is not active`,\n });\n }\n\n try {\n this._logger.debug('Rolling back to savepoint', { id: this._id, savepoint: name });\n\n await this.db.execute(`ROLLBACK TO SAVEPOINT ${name}`, []);\n\n return Result.ok(undefined);\n } catch (error) {\n this._logger.error('Failed to rollback to savepoint', { error, id: this._id, savepoint: name });\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to rollback to savepoint: ${error instanceof Error ? error.message : String(error)}`,\n cause: error,\n });\n }\n }\n\n async releaseSavepoint(name: string): Promise<Result<void, TransactionError>> {\n if (!this.isActive) {\n return Result.err({\n type: 'NOT_STARTED',\n message: `Cannot release savepoint: transaction ${this._id} is not active`,\n });\n }\n\n try {\n this._logger.debug('Releasing savepoint', { id: this._id, savepoint: name });\n\n await this.db.execute(`RELEASE SAVEPOINT ${name}`, []);\n\n return Result.ok(undefined);\n } catch (error) {\n this._logger.error('Failed to release savepoint', { error, id: this._id, savepoint: name });\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to release savepoint: ${error instanceof Error ? error.message : String(error)}`,\n cause: error,\n });\n }\n }\n\n async execute<T = unknown>(\n sql: string,\n params: unknown[] = []\n ): Promise<Result<T, TransactionError>> {\n if (!this.isActive) {\n return Result.err({\n type: 'NOT_STARTED',\n message: `Cannot execute query: transaction ${this._id} is not active`,\n });\n }\n\n try {\n this._logger.debug('Executing query in transaction', {\n id: this._id,\n sql: sql.substring(0, 100),\n });\n\n const result = await this.db.execute<T>(sql, params);\n\n return Result.ok(result);\n } catch (error) {\n this._logger.error('Query execution failed in transaction', {\n error,\n id: this._id,\n sql: sql.substring(0, 100),\n });\n return Result.err({\n type: 'UNKNOWN',\n message: `Query execution failed: ${error instanceof Error ? error.message : String(error)}`,\n cause: error,\n });\n }\n }\n\n queryBuilder<T = unknown>(table: string): QueryBuilder<T> {\n // Create a mock MetaDataService for now\n const mockMetaDataService = {\n getAllMappings: async () => [],\n getMapping: async () => null,\n };\n\n return new TypeSafeQueryBuilder<T>(table, mockMetaDataService, this._logger);\n }\n\n async run<T>(\n callback: (tx: Transaction) => Promise<Result<T, unknown>>\n ): Promise<Result<T, TransactionError>> {\n // Begin transaction if not already started\n if (this._state === 'PENDING') {\n const beginResult = await this.begin();\n if (beginResult.isErr()) {\n // Type-cast since we know this is a TransactionError\n return beginResult as Result<T, TransactionError>;\n }\n }\n\n try {\n // Execute callback\n const result = await callback(this);\n\n // Handle callback result\n if (result.isErr()) {\n // Callback returned an error - rollback if autoRollback is enabled\n if (this._config.autoRollback) {\n await this.rollback();\n }\n return Result.err({\n type: 'UNKNOWN',\n message: 'Transaction callback returned error',\n cause: result,\n });\n }\n\n // Success - commit\n const commitResult = await this.commit();\n if (commitResult.isErr()) {\n // Type-cast since we know this is a TransactionError\n return commitResult as Result<T, TransactionError>;\n }\n\n return Result.ok(result.unwrap());\n } catch (error) {\n // Exception thrown - rollback if autoRollback is enabled\n if (this._config.autoRollback) {\n await this.rollback();\n }\n\n return Result.err({\n type: 'UNKNOWN',\n message: `Transaction failed: ${error instanceof Error ? error.message : String(error)}`,\n cause: error,\n });\n }\n }\n\n private handleTimeout(): void {\n if (this.isActive) {\n this._logger.warn('Transaction timeout', {\n id: this._id,\n timeout: this._config.timeout,\n });\n\n // Force rollback on timeout\n this.rollback().then(result => {\n if (result.isErr()) {\n this._logger.error('Failed to rollback timed out transaction', {\n id: this._id,\n error: 'Transaction rollback failed',\n });\n }\n });\n }\n }\n\n private clearTimeout(): void {\n if (this.timeoutHandle) {\n clearTimeout(this.timeoutHandle);\n this.timeoutHandle = null;\n }\n }\n}\n","import { Option, Logger } from '@gl-life/gl-life-core';\nimport { AsyncLocalStorage } from 'async_hooks';\nimport type {\n TenantContext,\n TenantMetadata,\n TenantContextConfig,\n} from '../types/tenant.js';\n\n/**\n * Tenant context store for AsyncLocalStorage\n */\ninterface TenantContextStore {\n tenantMetadata: TenantMetadata | null;\n}\n\n/**\n * Tenant Context Manager\n *\n * Manages multi-tenancy context using AsyncLocalStorage for request isolation.\n * Supports multiple isolation strategies: DATABASE, SCHEMA, ROW, and HYBRID.\n *\n * Features:\n * - AsyncLocalStorage for context isolation (Cloudflare Workers compatible)\n * - Multiple isolation strategies\n * - Automatic SQL query modification for tenant isolation\n * - Tenant validation\n * - Scoped execution with withTenant()\n */\nexport class TenantContextManager implements TenantContext {\n private readonly storage: AsyncLocalStorage<TenantContextStore>;\n private readonly _config: TenantContextConfig;\n private readonly logger: Logger;\n private currentTenant: TenantMetadata | null = null;\n\n constructor(config: TenantContextConfig, logger: Logger) {\n this._config = config;\n this.logger = logger;\n this.storage = new AsyncLocalStorage<TenantContextStore>();\n }\n\n get tenant(): Option<TenantMetadata> {\n return this.getTenant();\n }\n\n get config(): TenantContextConfig {\n return this._config;\n }\n\n get hasTenant(): boolean {\n return this.currentTenant !== null;\n }\n\n async setTenant(tenantId: string): Promise<void> {\n this.validateTenantId(tenantId);\n\n this.logger.debug('Setting tenant', { tenantId });\n\n // Create basic metadata from ID\n const metadata: TenantMetadata = {\n id: tenantId,\n name: tenantId,\n createdAt: new Date(),\n updatedAt: new Date(),\n isActive: true,\n };\n\n this.currentTenant = metadata;\n }\n\n async setTenantWithMetadata(metadata: TenantMetadata): Promise<void> {\n this.validateTenantId(metadata.id);\n\n this.logger.debug('Setting tenant with metadata', {\n tenantId: metadata.id,\n name: metadata.name,\n });\n\n this.currentTenant = metadata;\n }\n\n async clearTenant(): Promise<void> {\n this.logger.debug('Clearing tenant context');\n this.currentTenant = null;\n }\n\n getTenantId(): Option<string> {\n if (this.currentTenant) {\n return Option.some(this.currentTenant.id);\n }\n return Option.none();\n }\n\n getTenant(): Option<TenantMetadata> {\n if (this.currentTenant) {\n return Option.some(this.currentTenant);\n }\n return Option.none();\n }\n\n shouldIsolateTable(table: string): boolean {\n // Don't isolate if isolation is not enforced\n if (!this._config.enforceIsolation) {\n return false;\n }\n\n // Don't isolate excluded tables\n if (this._config.excludedTables?.includes(table)) {\n return false;\n }\n\n return true;\n }\n\n applyTenantIsolation(\n sql: string,\n params: unknown[] = []\n ): { sql: string; params: unknown[] } {\n // Get current tenant\n const tenantId = this.getTenantId();\n if (tenantId.isNone()) {\n throw new Error('No tenant context set. Cannot apply tenant isolation.');\n }\n\n const tenant = tenantId.unwrap();\n\n // Extract table name from SQL (simple extraction for common cases)\n const tableMatch = sql.match(/(?:FROM|INTO|UPDATE)\\s+([a-zA-Z_][a-zA-Z0-9_]*)/i);\n if (tableMatch) {\n const tableName = tableMatch[1];\n\n // Check if table should be isolated\n if (!this.shouldIsolateTable(tableName)) {\n return { sql, params };\n }\n }\n\n // Apply isolation based on strategy\n switch (this._config.isolationStrategy) {\n case 'ROW':\n return this.applyRowLevelIsolation(sql, params, tenant);\n\n case 'SCHEMA':\n return this.applySchemaIsolation(sql, params, tenant);\n\n case 'DATABASE':\n // DATABASE isolation doesn't modify SQL, it changes the connection\n return { sql, params };\n\n case 'HYBRID':\n // For hybrid, apply both ROW and SCHEMA isolation\n const schemaResult = this.applySchemaIsolation(sql, params, tenant);\n return this.applyRowLevelIsolation(schemaResult.sql, schemaResult.params, tenant);\n\n default:\n return { sql, params };\n }\n }\n\n getTenantDatabase(): Option<string> {\n const tenantId = this.getTenantId();\n if (tenantId.isNone()) {\n return Option.none();\n }\n\n if (this._config.isolationStrategy !== 'DATABASE' && this._config.isolationStrategy !== 'HYBRID') {\n return Option.none();\n }\n\n const tenant = tenantId.unwrap();\n const baseName = this._config.databaseName || 'app';\n const dbName = `${baseName}_${tenant}`;\n\n return Option.some(dbName);\n }\n\n getTenantSchema(): Option<string> {\n const tenantId = this.getTenantId();\n if (tenantId.isNone()) {\n return Option.none();\n }\n\n if (this._config.isolationStrategy !== 'SCHEMA' && this._config.isolationStrategy !== 'HYBRID') {\n return Option.none();\n }\n\n const tenant = tenantId.unwrap();\n const baseName = this._config.schemaName || 'app';\n const schemaName = `${baseName}_${tenant}`;\n\n return Option.some(schemaName);\n }\n\n async withTenant<T>(tenantId: string, callback: () => Promise<T>): Promise<T> {\n // Save current tenant\n const previousTenant = this.currentTenant;\n\n try {\n // Set new tenant\n await this.setTenant(tenantId);\n\n // Execute callback\n const result = await callback();\n\n return result;\n } finally {\n // Restore previous tenant\n if (previousTenant) {\n this.currentTenant = previousTenant;\n } else {\n this.currentTenant = null;\n }\n }\n }\n\n clone(): TenantContext {\n return new TenantContextManager(this._config, this.logger);\n }\n\n /**\n * Validate tenant ID format\n */\n private validateTenantId(tenantId: string): void {\n if (!tenantId || typeof tenantId !== 'string') {\n throw new Error('Tenant ID must be a non-empty string');\n }\n\n if (tenantId.trim().length === 0) {\n throw new Error('Tenant ID cannot be whitespace only');\n }\n\n // Check for dangerous characters (SQL injection prevention)\n if (/[;'\"`\\\\]/.test(tenantId)) {\n throw new Error('Tenant ID contains invalid characters');\n }\n }\n\n /**\n * Apply ROW-level tenant isolation to SQL query\n */\n private applyRowLevelIsolation(\n sql: string,\n params: unknown[],\n tenantId: string\n ): { sql: string; params: unknown[] } {\n const tenantColumn = this._config.tenantIdColumn || 'tenant_id';\n const newParams = [...params];\n\n // Detect query type\n const sqlUpper = sql.trim().toUpperCase();\n\n if (sqlUpper.startsWith('SELECT')) {\n // Add WHERE clause or extend existing one\n if (sql.toUpperCase().includes('WHERE')) {\n // Extend existing WHERE\n sql = sql.replace(/WHERE/i, `WHERE ${tenantColumn} = ? AND`);\n newParams.unshift(tenantId);\n } else {\n // Add WHERE clause before ORDER BY, LIMIT, etc.\n const clauseMatch = sql.match(/(ORDER BY|LIMIT|OFFSET|GROUP BY)/i);\n if (clauseMatch) {\n const pos = sql.indexOf(clauseMatch[0]);\n sql = sql.slice(0, pos) + ` WHERE ${tenantColumn} = ? ` + sql.slice(pos);\n } else {\n sql = `${sql} WHERE ${tenantColumn} = ?`;\n }\n newParams.push(tenantId);\n }\n } else if (sqlUpper.startsWith('INSERT')) {\n // Add tenant_id to INSERT\n const valuesMatch = sql.match(/\\(([^)]+)\\)\\s+VALUES\\s+\\(([^)]+)\\)/i);\n if (valuesMatch) {\n const columns = valuesMatch[1];\n const placeholders = valuesMatch[2];\n const newColumns = `${columns}, ${tenantColumn}`;\n const newPlaceholders = `${placeholders}, ?`;\n sql = sql.replace(\n /\\(([^)]+)\\)\\s+VALUES\\s+\\(([^)]+)\\)/i,\n `(${newColumns}) VALUES (${newPlaceholders})`\n );\n newParams.push(tenantId);\n }\n } else if (sqlUpper.startsWith('UPDATE')) {\n // Add tenant_id to WHERE clause\n if (sql.toUpperCase().includes('WHERE')) {\n sql = sql.replace(/WHERE/i, `WHERE ${tenantColumn} = ? AND`);\n newParams.unshift(tenantId);\n } else {\n sql = `${sql} WHERE ${tenantColumn} = ?`;\n newParams.push(tenantId);\n }\n } else if (sqlUpper.startsWith('DELETE')) {\n // Add tenant_id to WHERE clause\n if (sql.toUpperCase().includes('WHERE')) {\n sql = sql.replace(/WHERE/i, `WHERE ${tenantColumn} = ? AND`);\n newParams.unshift(tenantId);\n } else {\n sql = `${sql} WHERE ${tenantColumn} = ?`;\n newParams.push(tenantId);\n }\n }\n\n return { sql, params: newParams };\n }\n\n /**\n * Apply SCHEMA-level tenant isolation to SQL query\n */\n private applySchemaIsolation(\n sql: string,\n params: unknown[],\n tenantId: string\n ): { sql: string; params: unknown[] } {\n const schemaName = this.getTenantSchema();\n if (schemaName.isNone()) {\n return { sql, params };\n }\n\n const schema = schemaName.unwrap();\n\n // Replace table names with schema-prefixed versions\n // This is a simple implementation - in production you'd want more robust parsing\n sql = sql.replace(\n /(?:FROM|INTO|UPDATE|JOIN)\\s+([a-zA-Z_][a-zA-Z0-9_]*)/gi,\n (match, tableName) => {\n // Don't prefix if already prefixed or is excluded table\n if (tableName.includes('.') || this._config.excludedTables?.includes(tableName)) {\n return match;\n }\n return match.replace(tableName, `${schema}.${tableName}`);\n }\n );\n\n return { sql, params };\n }\n}\n","import { Result, Logger } from '@gl-life/gl-life-core';\nimport type {\n QueryBuilder,\n QueryBuilderError,\n WhereOperator,\n JoinType,\n OrderDirection,\n} from '../types/query-builder.js';\nimport type { TenantContext } from '../types/tenant.js';\n\n/**\n * Tenant-Aware Query Builder\n *\n * Wraps a QueryBuilder to automatically inject tenant filters and prevent\n * cross-tenant data access. Provides:\n * - Automatic tenant_id filter injection for all queries\n * - Cross-tenant access prevention\n * - Admin override mechanism via asAdmin()\n * - Tenant filter enforcement (cannot be accidentally removed)\n * - Support for excluded tables (migrations, system tables)\n *\n * Security:\n * - All queries automatically scoped to current tenant\n * - Tenant context validated before query execution\n * - Manual tenant_id in WHERE clauses are overridden\n * - INSERT operations always use current tenant_id\n *\n * Usage:\n * ```typescript\n * const builder = new TenantAwareQueryBuilder(baseBuilder, tenantContext, logger);\n *\n * // Normal tenant-scoped query\n * const users = await builder.select('id', 'name').get();\n *\n * // Admin query (bypasses tenant filter)\n * const allUsers = await builder.asAdmin().select('id', 'name').get();\n * ```\n */\nexport class TenantAwareQueryBuilder<T = unknown> implements QueryBuilder<T> {\n private readonly baseBuilder: QueryBuilder<T>;\n private readonly tenantContext: TenantContext;\n private readonly logger: Logger;\n private isAdminMode: boolean = false;\n\n constructor(\n baseBuilder: QueryBuilder<T>,\n tenantContext: TenantContext,\n logger: Logger\n ) {\n this.baseBuilder = baseBuilder;\n this.tenantContext = tenantContext;\n this.logger = logger;\n }\n\n /**\n * Switch to admin mode - bypasses tenant filtering\n *\n * Use with caution! Only for administrative queries that need\n * to access data across all tenants.\n *\n * @returns QueryBuilder in admin mode\n */\n asAdmin(): TenantAwareQueryBuilder<T> {\n const adminBuilder = new TenantAwareQueryBuilder<T>(\n this.baseBuilder,\n this.tenantContext,\n this.logger\n );\n adminBuilder.isAdminMode = true;\n return adminBuilder;\n }\n\n /**\n * Switch back to tenant mode from admin mode\n *\n * Re-enables automatic tenant filtering\n *\n * @returns QueryBuilder in tenant mode\n */\n asTenant(): TenantAwareQueryBuilder<T> {\n const tenantBuilder = new TenantAwareQueryBuilder<T>(\n this.baseBuilder,\n this.tenantContext,\n this.logger\n );\n tenantBuilder.isAdminMode = false;\n return tenantBuilder;\n }\n\n /**\n * Validate that tenant context is set (unless admin mode or excluded table)\n */\n private validateTenantContext(): void {\n // Skip validation in admin mode\n if (this.isAdminMode) {\n return;\n }\n\n // Check if table should be isolated\n const tableName = this.getTableName();\n if (!this.tenantContext.shouldIsolateTable(tableName)) {\n return;\n }\n\n // Ensure tenant is set\n if (!this.tenantContext.hasTenant) {\n throw new Error(\n 'No tenant context set. Cannot execute query without tenant context. ' +\n 'Use asAdmin() for admin queries or set tenant via tenantContext.setTenant()'\n );\n }\n }\n\n /**\n * Get table name from base builder\n */\n private getTableName(): string {\n // Extract table name from SQL or use default\n const sql = this.baseBuilder.toSQL();\n const match = sql.match(/FROM\\s+([a-zA-Z_][a-zA-Z0-9_]*)/i);\n return match ? match[1] : '';\n }\n\n /**\n * Inject tenant filter into query builder\n *\n * This method ensures the correct tenant filter is present.\n * If a manual tenant_id filter exists, it will be overridden.\n */\n private injectTenantFilter(): void {\n // Skip in admin mode\n if (this.isAdminMode) {\n return;\n }\n\n // Skip for excluded tables\n const tableName = this.getTableName();\n if (!this.tenantContext.shouldIsolateTable(tableName)) {\n return;\n }\n\n // Get current tenant\n const tenantId = this.tenantContext.getTenantId();\n if (tenantId.isNone()) {\n throw new Error('No tenant context set. Cannot inject tenant filter.');\n }\n\n const tenant = tenantId.unwrap();\n const tenantColumn = this.tenantContext.config.tenantIdColumn || 'tenant_id';\n\n // Always add the tenant filter\n // If one already exists, this will add another AND condition\n // ensuring the correct tenant is enforced\n this.baseBuilder.where(tenantColumn, '=', tenant);\n }\n\n /**\n * Override tenant_id in data object for INSERT operations\n */\n private enforceTenantInData(data: Partial<T>): Partial<T> {\n // Skip in admin mode\n if (this.isAdminMode) {\n return data;\n }\n\n // Skip for excluded tables\n const tableName = this.getTableName();\n if (!this.tenantContext.shouldIsolateTable(tableName)) {\n return data;\n }\n\n // Get current tenant\n const tenantId = this.tenantContext.getTenantId();\n if (tenantId.isNone()) {\n throw new Error('No tenant context set. Cannot enforce tenant in INSERT.');\n }\n\n const tenant = tenantId.unwrap();\n const tenantColumn = this.tenantContext.config.tenantIdColumn || 'tenant_id';\n\n // Override tenant_id in data\n return {\n ...data,\n [tenantColumn]: tenant,\n } as Partial<T>;\n }\n\n // QueryBuilder interface implementation\n\n table(table: string): QueryBuilder<T> {\n this.baseBuilder.table(table);\n return this;\n }\n\n select(...columns: string[]): QueryBuilder<T> {\n this.baseBuilder.select(...columns);\n return this;\n }\n\n where(field: string, operator: WhereOperator, value?: unknown): QueryBuilder<T> {\n this.baseBuilder.where(field, operator, value);\n return this;\n }\n\n orWhere(field: string, operator: WhereOperator, value?: unknown): QueryBuilder<T> {\n this.baseBuilder.orWhere(field, operator, value);\n return this;\n }\n\n whereIn(field: string, values: unknown[]): QueryBuilder<T> {\n this.baseBuilder.whereIn(field, values);\n return this;\n }\n\n join(\n table: string,\n leftField: string,\n rightField: string,\n type: JoinType = 'INNER'\n ): QueryBuilder<T> {\n this.baseBuilder.join(table, leftField, rightField, type);\n return this;\n }\n\n orderBy(field: string, direction: OrderDirection = 'ASC'): QueryBuilder<T> {\n this.baseBuilder.orderBy(field, direction);\n return this;\n }\n\n groupBy(...fields: string[]): QueryBuilder<T> {\n this.baseBuilder.groupBy(...fields);\n return this;\n }\n\n having(condition: string): QueryBuilder<T> {\n this.baseBuilder.having(condition);\n return this;\n }\n\n limit(limit: number): QueryBuilder<T> {\n this.baseBuilder.limit(limit);\n return this;\n }\n\n offset(offset: number): QueryBuilder<T> {\n this.baseBuilder.offset(offset);\n return this;\n }\n\n async insert(data: Partial<T>): Promise<Result<T, QueryBuilderError>> {\n this.validateTenantContext();\n\n // Enforce tenant_id in data\n const dataWithTenant = this.enforceTenantInData(data);\n\n this.logger.debug('Tenant-aware INSERT', {\n table: this.getTableName(),\n isAdmin: this.isAdminMode,\n });\n\n return this.baseBuilder.insert(dataWithTenant);\n }\n\n async insertMany(data: Partial<T>[]): Promise<Result<T[], QueryBuilderError>> {\n this.validateTenantContext();\n\n // Enforce tenant_id in all data objects\n const dataWithTenant = data.map(item => this.enforceTenantInData(item));\n\n this.logger.debug('Tenant-aware INSERT MANY', {\n table: this.getTableName(),\n count: data.length,\n isAdmin: this.isAdminMode,\n });\n\n return this.baseBuilder.insertMany(dataWithTenant);\n }\n\n async update(data: Partial<T>): Promise<Result<number, QueryBuilderError>> {\n this.validateTenantContext();\n this.injectTenantFilter();\n\n this.logger.debug('Tenant-aware UPDATE', {\n table: this.getTableName(),\n isAdmin: this.isAdminMode,\n });\n\n return this.baseBuilder.update(data);\n }\n\n async delete(): Promise<Result<number, QueryBuilderError>> {\n this.validateTenantContext();\n this.injectTenantFilter();\n\n this.logger.debug('Tenant-aware DELETE', {\n table: this.getTableName(),\n isAdmin: this.isAdminMode,\n });\n\n return this.baseBuilder.delete();\n }\n\n async first(): Promise<Result<T | null, QueryBuilderError>> {\n this.validateTenantContext();\n this.injectTenantFilter();\n\n this.logger.debug('Tenant-aware FIRST', {\n table: this.getTableName(),\n isAdmin: this.isAdminMode,\n });\n\n return this.baseBuilder.first();\n }\n\n async get(): Promise<Result<T[], QueryBuilderError>> {\n this.validateTenantContext();\n this.injectTenantFilter();\n\n this.logger.debug('Tenant-aware GET', {\n table: this.getTableName(),\n isAdmin: this.isAdminMode,\n });\n\n return this.baseBuilder.get();\n }\n\n async count(field: string = '*'): Promise<Result<number, QueryBuilderError>> {\n this.validateTenantContext();\n this.injectTenantFilter();\n\n this.logger.debug('Tenant-aware COUNT', {\n table: this.getTableName(),\n field,\n isAdmin: this.isAdminMode,\n });\n\n return this.baseBuilder.count(field);\n }\n\n toSQL(): string {\n this.validateTenantContext();\n this.injectTenantFilter();\n\n return this.baseBuilder.toSQL();\n }\n\n getBindings(): unknown[] {\n // Note: If tenant filter is injected, it will be in bindings\n // This is called after toSQL() which injects the filter\n return this.baseBuilder.getBindings();\n }\n\n clone(): QueryBuilder<T> {\n const clonedBase = this.baseBuilder.clone();\n const clonedTenantAware = new TenantAwareQueryBuilder<T>(\n clonedBase,\n this.tenantContext,\n this.logger\n );\n clonedTenantAware.isAdminMode = this.isAdminMode;\n return clonedTenantAware;\n }\n}\n","import { Result, Logger } from '@gl-life/gl-life-core';\nimport type { DatabaseConnection, DatabaseConnectionError } from '../types/connection.js';\n\n/**\n * Schema manager error types\n */\nexport type SchemaManagerError =\n | { type: 'INVALID_TENANT_ID'; message: string }\n | { type: 'INVALID_VERSION'; message: string }\n | { type: 'SCHEMA_EXISTS'; message: string }\n | { type: 'SCHEMA_NOT_FOUND'; message: string }\n | { type: 'MIGRATION_FAILED'; message: string; cause?: unknown }\n | { type: 'DATABASE_ERROR'; message: string; cause?: DatabaseConnectionError }\n | { type: 'VALIDATION_FAILED'; message: string };\n\n/**\n * Schema version record\n */\nexport interface SchemaVersion {\n version: string;\n applied_at: Date;\n description?: string;\n}\n\n/**\n * Schema migration definition\n */\nexport interface SchemaMigration {\n version: string;\n sql: string;\n description?: string;\n}\n\n/**\n * Schema manager configuration\n */\nexport interface SchemaManagerConfig {\n /** Base schema name prefix */\n baseSchemaName: string;\n /** Table name for tracking schema versions */\n schemaVersionTable?: string;\n}\n\n/**\n * Options for creating tenant schema\n */\nexport interface CreateSchemaOptions {\n /** Initial schema version */\n version?: string;\n /** Whether to use a transaction */\n useTransaction?: boolean;\n}\n\n/**\n * Options for dropping tenant schema\n */\nexport interface DropSchemaOptions {\n /** Use CASCADE to drop all objects in schema */\n cascade?: boolean;\n /** Add IF EXISTS clause */\n ifExists?: boolean;\n /** Clean up version history */\n cleanupVersions?: boolean;\n}\n\n/**\n * Tenant Schema Manager\n *\n * Manages per-tenant database schemas for multi-tenant applications.\n * Supports schema creation, versioning, migration, and deprovisioning.\n *\n * Features:\n * - Create isolated schemas per tenant\n * - Schema versioning and migration tracking\n * - Safe schema deprovisioning\n * - Transaction support for atomic operations\n * - SQL injection prevention via parameterized queries\n *\n * Usage:\n * ```typescript\n * const manager = new TenantSchemaManager(connection, logger, {\n * baseSchemaName: 'app'\n * });\n *\n * // Provision new tenant\n * await manager.createTenantSchema('tenant-123', { version: '1.0.0' });\n *\n * // Apply migration\n * await manager.applyMigration('tenant-123', {\n * version: '1.1.0',\n * sql: 'ALTER TABLE users ADD COLUMN email VARCHAR(255);'\n * });\n *\n * // Deprovision tenant\n * await manager.dropTenantSchema('tenant-123', { cascade: true });\n * ```\n */\nexport class TenantSchemaManager {\n private readonly connection: DatabaseConnection;\n private readonly logger: Logger;\n private readonly config: SchemaManagerConfig;\n\n constructor(\n connection: DatabaseConnection,\n logger: Logger,\n config: SchemaManagerConfig\n ) {\n this.connection = connection;\n this.logger = logger;\n this.config = {\n schemaVersionTable: 'schema_versions',\n ...config,\n };\n }\n\n /**\n * Create a new tenant schema\n *\n * @param tenantId - Tenant identifier\n * @param options - Schema creation options\n * @returns Result with void on success or SchemaManagerError\n */\n async createTenantSchema(\n tenantId: string,\n options: CreateSchemaOptions = {}\n ): Promise<Result<void, SchemaManagerError>> {\n // Validate tenant ID\n const validationResult = this.validateTenantId(tenantId);\n if (validationResult.isErr()) {\n return validationResult as Result<void, SchemaManagerError>;\n }\n\n const schemaName = this.getSchemaName(tenantId);\n\n try {\n this.logger.debug('Creating tenant schema', { tenantId, schemaName });\n\n if (options.useTransaction) {\n await this.connection.execute('BEGIN');\n }\n\n // Create schema\n const createResult = await this.connection.execute(\n `CREATE SCHEMA ${schemaName}`,\n []\n );\n\n if (createResult.isErr()) {\n if (options.useTransaction) {\n await this.connection.execute('ROLLBACK');\n }\n\n const error = (createResult as any).variant.error;\n\n // Check if schema already exists\n if (error.message.includes('already exists')) {\n return Result.err({\n type: 'SCHEMA_EXISTS',\n message: `Schema for tenant ${tenantId} already exists`,\n });\n }\n\n return Result.err({\n type: 'DATABASE_ERROR',\n message: `Failed to create schema for tenant ${tenantId}`,\n cause: error,\n });\n }\n\n // Initialize version tracking if version provided\n if (options.version) {\n const versionResult = await this.initializeVersionTracking(\n tenantId,\n options.version\n );\n\n if (versionResult.isErr()) {\n if (options.useTransaction) {\n await this.connection.execute('ROLLBACK');\n }\n return versionResult;\n }\n }\n\n if (options.useTransaction) {\n await this.connection.execute('COMMIT');\n }\n\n this.logger.info('Tenant schema created', { tenantId, schemaName });\n\n return Result.ok(undefined);\n } catch (error) {\n if (options.useTransaction) {\n await this.connection.execute('ROLLBACK');\n }\n\n this.logger.error('Schema creation failed', { error, tenantId });\n\n return Result.err({\n type: 'DATABASE_ERROR',\n message: `Schema creation failed for tenant ${tenantId}: ${error}`,\n cause: error as DatabaseConnectionError,\n });\n }\n }\n\n /**\n * Drop a tenant schema\n *\n * @param tenantId - Tenant identifier\n * @param options - Drop schema options\n * @returns Result with void on success or SchemaManagerError\n */\n async dropTenantSchema(\n tenantId: string,\n options: DropSchemaOptions = {}\n ): Promise<Result<void, SchemaManagerError>> {\n // Validate tenant ID\n const validationResult = this.validateTenantId(tenantId);\n if (validationResult.isErr()) {\n return validationResult as Result<void, SchemaManagerError>;\n }\n\n const schemaName = this.getSchemaName(tenantId);\n\n try {\n this.logger.debug('Dropping tenant schema', { tenantId, schemaName });\n\n // Build DROP SCHEMA statement\n let sql = `DROP SCHEMA ${options.ifExists ? 'IF EXISTS ' : ''}${schemaName}`;\n if (options.cascade) {\n sql += ' CASCADE';\n }\n\n const dropResult = await this.connection.execute(sql, []);\n\n if (dropResult.isErr()) {\n const error = (dropResult as any).variant.error;\n return Result.err({\n type: 'DATABASE_ERROR',\n message: `Failed to drop schema for tenant ${tenantId}`,\n cause: error,\n });\n }\n\n // Clean up version history if requested\n if (options.cleanupVersions) {\n await this.connection.execute(\n `DELETE FROM ${this.config.schemaVersionTable} WHERE tenant_id = ?`,\n [tenantId]\n );\n }\n\n this.logger.info('Tenant schema dropped', { tenantId, schemaName });\n\n return Result.ok(undefined);\n } catch (error) {\n this.logger.error('Schema drop failed', { error, tenantId });\n\n return Result.err({\n type: 'DATABASE_ERROR',\n message: `Schema drop failed for tenant ${tenantId}: ${error}`,\n cause: error as DatabaseConnectionError,\n });\n }\n }\n\n /**\n * Check if tenant schema exists\n *\n * @param tenantId - Tenant identifier\n * @returns Result with boolean indicating existence\n */\n async schemaExists(tenantId: string): Promise<Result<boolean, SchemaManagerError>> {\n const schemaName = this.getSchemaName(tenantId);\n\n try {\n const result = await this.connection.execute(\n `SELECT schema_name FROM information_schema.schemata WHERE schema_name = ?`,\n [schemaName]\n );\n\n if (result.isErr()) {\n return Result.err({\n type: 'DATABASE_ERROR',\n message: 'Failed to check schema existence',\n cause: (result as any).variant.error,\n });\n }\n\n const data = result.unwrap() as any;\n const rows = data.rows || data || [];\n\n return Result.ok(rows.length > 0);\n } catch (error) {\n return Result.err({\n type: 'DATABASE_ERROR',\n message: `Failed to check schema existence: ${error}`,\n cause: error as DatabaseConnectionError,\n });\n }\n }\n\n /**\n * Get current schema version for tenant\n *\n * @param tenantId - Tenant identifier\n * @returns Result with version string or null\n */\n async getSchemaVersion(tenantId: string): Promise<Result<string | null, SchemaManagerError>> {\n try {\n const result = await this.connection.execute(\n `SELECT version FROM ${this.config.schemaVersionTable} WHERE tenant_id = ? ORDER BY applied_at DESC LIMIT 1`,\n [tenantId]\n );\n\n if (result.isErr()) {\n return Result.err({\n type: 'DATABASE_ERROR',\n message: 'Failed to get schema version',\n cause: (result as any).variant.error,\n });\n }\n\n const data = result.unwrap() as any;\n const rows = data.rows || data || [];\n\n if (rows.length === 0) {\n return Result.ok(null);\n }\n\n return Result.ok(rows[0].version);\n } catch (error) {\n return Result.err({\n type: 'DATABASE_ERROR',\n message: `Failed to get schema version: ${error}`,\n cause: error as DatabaseConnectionError,\n });\n }\n }\n\n /**\n * Update schema version for tenant\n *\n * @param tenantId - Tenant identifier\n * @param version - New version string\n * @returns Result with void on success\n */\n async updateSchemaVersion(\n tenantId: string,\n version: string\n ): Promise<Result<void, SchemaManagerError>> {\n // Validate version format (simple semver check)\n if (!this.isValidVersion(version)) {\n return Result.err({\n type: 'INVALID_VERSION',\n message: `Invalid version format: ${version}. Expected semver format (e.g., 1.0.0)`,\n });\n }\n\n try {\n const result = await this.connection.execute(\n `INSERT INTO ${this.config.schemaVersionTable} (tenant_id, version, applied_at) VALUES (?, ?, ?)`,\n [tenantId, version, new Date()]\n );\n\n if (result.isErr()) {\n return Result.err({\n type: 'DATABASE_ERROR',\n message: 'Failed to update schema version',\n cause: (result as any).variant.error,\n });\n }\n\n return Result.ok(undefined);\n } catch (error) {\n return Result.err({\n type: 'DATABASE_ERROR',\n message: `Failed to update schema version: ${error}`,\n cause: error as DatabaseConnectionError,\n });\n }\n }\n\n /**\n * Get version history for tenant\n *\n * @param tenantId - Tenant identifier\n * @returns Result with array of schema versions\n */\n async getVersionHistory(tenantId: string): Promise<Result<SchemaVersion[], SchemaManagerError>> {\n try {\n const result = await this.connection.execute(\n `SELECT version, applied_at, description FROM ${this.config.schemaVersionTable} WHERE tenant_id = ? ORDER BY applied_at ASC`,\n [tenantId]\n );\n\n if (result.isErr()) {\n return Result.err({\n type: 'DATABASE_ERROR',\n message: 'Failed to get version history',\n cause: (result as any).variant.error,\n });\n }\n\n const data = result.unwrap() as any;\n const rows = data.rows || data || [];\n\n return Result.ok(rows);\n } catch (error) {\n return Result.err({\n type: 'DATABASE_ERROR',\n message: `Failed to get version history: ${error}`,\n cause: error as DatabaseConnectionError,\n });\n }\n }\n\n /**\n * Apply a migration to tenant schema\n *\n * @param tenantId - Tenant identifier\n * @param migration - Migration definition\n * @returns Result with void on success\n */\n async applyMigration(\n tenantId: string,\n migration: SchemaMigration\n ): Promise<Result<void, SchemaManagerError>> {\n const schemaName = this.getSchemaName(tenantId);\n\n try {\n this.logger.debug('Applying migration', {\n tenantId,\n version: migration.version,\n });\n\n // Check if migration already applied\n const currentVersion = await this.getSchemaVersion(tenantId);\n if (currentVersion.isOk() && currentVersion.unwrap() === migration.version) {\n this.logger.info('Migration already applied', {\n tenantId,\n version: migration.version,\n });\n return Result.ok(undefined);\n }\n\n // Set search path to tenant schema\n await this.connection.execute(`SET search_path TO ${schemaName}`, []);\n\n // Execute migration SQL\n const migrationResult = await this.connection.execute(migration.sql, []);\n\n if (migrationResult.isErr()) {\n return Result.err({\n type: 'MIGRATION_FAILED',\n message: `Migration ${migration.version} failed for tenant ${tenantId}`,\n cause: (migrationResult as any).variant.error,\n });\n }\n\n // Record migration in version history\n await this.connection.execute(\n `INSERT INTO ${this.config.schemaVersionTable} (tenant_id, version, applied_at, description) VALUES (?, ?, ?, ?)`,\n [tenantId, migration.version, new Date(), migration.description || '']\n );\n\n this.logger.info('Migration applied', {\n tenantId,\n version: migration.version,\n });\n\n return Result.ok(undefined);\n } catch (error) {\n this.logger.error('Migration failed', {\n error,\n tenantId,\n version: migration.version,\n });\n\n return Result.err({\n type: 'MIGRATION_FAILED',\n message: `Migration failed: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Get the schema name for a tenant\n *\n * @param tenantId - Tenant identifier\n * @returns Schema name\n */\n getSchemaName(tenantId: string): string {\n // Validate tenant ID doesn't contain dangerous characters\n if (/[;'\"`\\\\]/.test(tenantId)) {\n throw new Error(`Invalid tenant ID: contains dangerous characters`);\n }\n\n return `${this.config.baseSchemaName}_tenant_${tenantId.replace(/[^a-zA-Z0-9_-]/g, '_')}`;\n }\n\n /**\n * Validate tenant ID format\n */\n private validateTenantId(tenantId: string): Result<void, SchemaManagerError> {\n if (!tenantId || typeof tenantId !== 'string') {\n return Result.err({\n type: 'INVALID_TENANT_ID',\n message: 'Tenant ID must be a non-empty string',\n });\n }\n\n if (tenantId.trim().length === 0) {\n return Result.err({\n type: 'INVALID_TENANT_ID',\n message: 'Tenant ID cannot be whitespace only',\n });\n }\n\n // Check for dangerous characters\n if (/[;'\"`\\\\]/.test(tenantId)) {\n return Result.err({\n type: 'INVALID_TENANT_ID',\n message: 'Tenant ID contains invalid characters',\n });\n }\n\n return Result.ok(undefined);\n }\n\n /**\n * Validate version format (simple semver check)\n */\n private isValidVersion(version: string): boolean {\n // Simple semver regex: major.minor.patch\n return /^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.-]+)?(\\+[a-zA-Z0-9.-]+)?$/.test(version);\n }\n\n /**\n * Initialize version tracking for new tenant\n */\n private async initializeVersionTracking(\n tenantId: string,\n version: string\n ): Promise<Result<void, SchemaManagerError>> {\n if (!this.isValidVersion(version)) {\n return Result.err({\n type: 'INVALID_VERSION',\n message: `Invalid version format: ${version}`,\n });\n }\n\n const result = await this.connection.execute(\n `INSERT INTO ${this.config.schemaVersionTable} (tenant_id, version, applied_at) VALUES (?, ?, ?)`,\n [tenantId, version, new Date()]\n );\n\n if (result.isErr()) {\n return Result.err({\n type: 'DATABASE_ERROR',\n message: 'Failed to initialize version tracking',\n cause: (result as any).variant.error,\n });\n }\n\n return Result.ok(undefined);\n }\n}\n","import { Result, Option, Logger } from '@gl-life/gl-life-core';\nimport crypto from 'crypto';\nimport type {\n Cache,\n CacheConfig,\n CacheEntry,\n CacheEntryMetadata,\n CacheError,\n CacheStats,\n} from '../types/cache.js';\n\n/**\n * In-memory LRU cache implementation\n *\n * Features:\n * - TTL-based expiration\n * - LRU eviction policy\n * - Cache statistics tracking (hits/misses/evictions)\n * - Pattern-based invalidation\n * - Metadata tracking (access count, timestamps)\n *\n * Usage:\n * ```typescript\n * const cache = new MemoryCache(config, logger);\n * await cache.set('user:1', { id: 1, name: 'John' }, 60);\n * const result = await cache.get<User>('user:1');\n * ```\n */\nexport class MemoryCache implements Cache {\n readonly config: CacheConfig;\n private readonly logger: Logger;\n private readonly store: Map<string, CacheEntry>;\n private readonly lruList: string[] = []; // Most recent at end\n private stats = {\n hits: 0,\n misses: 0,\n evictions: 0,\n };\n\n constructor(config: CacheConfig, logger: Logger) {\n this.config = config;\n this.logger = logger;\n this.store = new Map();\n }\n\n async get<T = unknown>(key: string): Promise<Result<Option<T>, CacheError>> {\n try {\n const fullKey = this.getFullKey(key);\n const entry = this.store.get(fullKey);\n\n if (!entry) {\n this.stats.misses++;\n return Result.ok(Option.none());\n }\n\n // Check expiration\n if (this.isExpired(entry)) {\n this.store.delete(fullKey);\n this.removeLRU(fullKey);\n this.stats.misses++;\n return Result.ok(Option.none());\n }\n\n // Update LRU and metadata\n this.touchEntry(fullKey, entry);\n this.stats.hits++;\n\n return Result.ok(Option.some(entry.value as T));\n } catch (error) {\n this.logger.error('Cache get failed', { error, key });\n return Result.err({\n type: 'GET_FAILED',\n message: `Failed to get cache entry: ${error}`,\n cause: error,\n });\n }\n }\n\n async getWithMetadata<T = unknown>(\n key: string\n ): Promise<Result<Option<CacheEntry<T>>, CacheError>> {\n try {\n const fullKey = this.getFullKey(key);\n const entry = this.store.get(fullKey);\n\n if (!entry) {\n this.stats.misses++;\n return Result.ok(Option.none());\n }\n\n if (this.isExpired(entry)) {\n this.store.delete(fullKey);\n this.removeLRU(fullKey);\n this.stats.misses++;\n return Result.ok(Option.none());\n }\n\n this.touchEntry(fullKey, entry);\n this.stats.hits++;\n\n return Result.ok(Option.some(entry as CacheEntry<T>));\n } catch (error) {\n this.logger.error('Cache getWithMetadata failed', { error, key });\n return Result.err({\n type: 'GET_FAILED',\n message: `Failed to get cache entry with metadata: ${error}`,\n cause: error,\n });\n }\n }\n\n async set<T = unknown>(\n key: string,\n value: T,\n ttl?: number\n ): Promise<Result<void, CacheError>> {\n try {\n const fullKey = this.getFullKey(key);\n const effectiveTTL = ttl !== undefined ? ttl : this.config.defaultTTL;\n\n // Evict if at max capacity and key doesn't exist\n if (\n this.config.maxItems &&\n this.store.size >= this.config.maxItems &&\n !this.store.has(fullKey)\n ) {\n this.evictLRU();\n }\n\n const now = new Date();\n const expiresAt =\n effectiveTTL > 0 ? new Date(now.getTime() + effectiveTTL * 1000) : undefined;\n\n const metadata: CacheEntryMetadata = {\n key: fullKey,\n createdAt: now,\n lastAccessedAt: now,\n accessCount: 0,\n size: this.estimateSize(value),\n ttl: effectiveTTL,\n expiresAt,\n };\n\n const entry: CacheEntry<T> = {\n value,\n metadata,\n };\n\n // Remove from LRU if updating existing entry\n if (this.store.has(fullKey)) {\n this.removeLRU(fullKey);\n }\n\n this.store.set(fullKey, entry as CacheEntry);\n this.lruList.push(fullKey); // Add to end (most recent)\n\n this.logger.debug('Cache set', { key, ttl: effectiveTTL });\n\n return Result.ok(undefined);\n } catch (error) {\n this.logger.error('Cache set failed', { error, key });\n return Result.err({\n type: 'SET_FAILED',\n message: `Failed to set cache entry: ${error}`,\n cause: error,\n });\n }\n }\n\n async delete(key: string): Promise<Result<boolean, CacheError>> {\n try {\n const fullKey = this.getFullKey(key);\n const existed = this.store.delete(fullKey);\n\n if (existed) {\n this.removeLRU(fullKey);\n this.logger.debug('Cache delete', { key });\n }\n\n return Result.ok(existed);\n } catch (error) {\n this.logger.error('Cache delete failed', { error, key });\n return Result.err({\n type: 'DELETE_FAILED',\n message: `Failed to delete cache entry: ${error}`,\n cause: error,\n });\n }\n }\n\n async deleteMany(keys: string[]): Promise<Result<number, CacheError>> {\n try {\n let deleted = 0;\n\n for (const key of keys) {\n const result = await this.delete(key);\n if (result.isOk() && result.unwrap()) {\n deleted++;\n }\n }\n\n return Result.ok(deleted);\n } catch (error) {\n this.logger.error('Cache deleteMany failed', { error });\n return Result.err({\n type: 'DELETE_FAILED',\n message: `Failed to delete multiple cache entries: ${error}`,\n cause: error,\n });\n }\n }\n\n async clear(): Promise<Result<void, CacheError>> {\n try {\n this.store.clear();\n this.lruList.length = 0;\n\n this.logger.debug('Cache cleared');\n\n return Result.ok(undefined);\n } catch (error) {\n this.logger.error('Cache clear failed', { error });\n return Result.err({\n type: 'CLEAR_FAILED',\n message: `Failed to clear cache: ${error}`,\n cause: error,\n });\n }\n }\n\n async has(key: string): Promise<Result<boolean, CacheError>> {\n try {\n const fullKey = this.getFullKey(key);\n const entry = this.store.get(fullKey);\n\n if (!entry) {\n return Result.ok(false);\n }\n\n // Check expiration\n if (this.isExpired(entry)) {\n this.store.delete(fullKey);\n this.removeLRU(fullKey);\n return Result.ok(false);\n }\n\n return Result.ok(true);\n } catch (error) {\n this.logger.error('Cache has failed', { error, key });\n return Result.err({\n type: 'GET_FAILED',\n message: `Failed to check cache key existence: ${error}`,\n cause: error,\n });\n }\n }\n\n async invalidate(pattern: string): Promise<Result<number, CacheError>> {\n try {\n // Apply prefix to pattern for matching\n const fullPattern = this.config.keyPrefix ? `${this.config.keyPrefix}${pattern}` : pattern;\n const regex = this.patternToRegex(fullPattern);\n let invalidated = 0;\n\n for (const key of this.store.keys()) {\n if (regex.test(key)) {\n this.store.delete(key);\n this.removeLRU(key);\n invalidated++;\n }\n }\n\n this.logger.debug('Cache invalidate', { pattern, count: invalidated });\n\n return Result.ok(invalidated);\n } catch (error) {\n this.logger.error('Cache invalidate failed', { error, pattern });\n return Result.err({\n type: 'DELETE_FAILED',\n message: `Failed to invalidate cache entries: ${error}`,\n cause: error,\n });\n }\n }\n\n async invalidateTable(table: string): Promise<Result<number, CacheError>> {\n try {\n // Invalidate entries that start with table name\n const pattern = `*${table}*`;\n return await this.invalidate(pattern);\n } catch (error) {\n this.logger.error('Cache invalidateTable failed', { error, table });\n return Result.err({\n type: 'DELETE_FAILED',\n message: `Failed to invalidate table cache: ${error}`,\n cause: error,\n });\n }\n }\n\n getStats(): Result<CacheStats, CacheError> {\n try {\n const totalAccesses = this.stats.hits + this.stats.misses;\n const hitRate = totalAccesses > 0 ? this.stats.hits / totalAccesses : 0;\n\n let totalSize = 0;\n for (const entry of this.store.values()) {\n totalSize += entry.metadata.size;\n }\n\n return Result.ok({\n itemCount: this.store.size,\n totalSize,\n hits: this.stats.hits,\n misses: this.stats.misses,\n hitRate,\n evictions: this.stats.evictions,\n });\n } catch (error) {\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to get cache stats: ${error}`,\n cause: error,\n });\n }\n }\n\n resetStats(): Result<void, CacheError> {\n try {\n this.stats.hits = 0;\n this.stats.misses = 0;\n this.stats.evictions = 0;\n\n return Result.ok(undefined);\n } catch (error) {\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to reset cache stats: ${error}`,\n cause: error,\n });\n }\n }\n\n generateKey(sql: string, params?: unknown[]): string {\n const data = {\n sql,\n params: params || [],\n };\n\n const hash = crypto\n .createHash('sha256')\n .update(JSON.stringify(data))\n .digest('hex');\n\n return hash.substring(0, 16); // Use first 16 chars for readability\n }\n\n /**\n * Get full cache key with prefix\n */\n private getFullKey(key: string): string {\n return this.config.keyPrefix ? `${this.config.keyPrefix}${key}` : key;\n }\n\n /**\n * Check if entry is expired\n */\n private isExpired(entry: CacheEntry): boolean {\n if (!entry.metadata.expiresAt) {\n return false;\n }\n\n return new Date() > entry.metadata.expiresAt;\n }\n\n /**\n * Update entry access metadata and LRU position\n */\n private touchEntry(key: string, entry: CacheEntry): void {\n entry.metadata.lastAccessedAt = new Date();\n entry.metadata.accessCount++;\n\n // Move to end of LRU list (most recent)\n this.removeLRU(key);\n this.lruList.push(key);\n }\n\n /**\n * Remove key from LRU list\n */\n private removeLRU(key: string): void {\n const index = this.lruList.indexOf(key);\n if (index > -1) {\n this.lruList.splice(index, 1);\n }\n }\n\n /**\n * Evict least recently used entry\n */\n private evictLRU(): void {\n if (this.lruList.length === 0) {\n return;\n }\n\n const lruKey = this.lruList[0]; // Least recent at start\n this.store.delete(lruKey);\n this.lruList.shift();\n this.stats.evictions++;\n\n this.logger.debug('LRU eviction', { key: lruKey });\n }\n\n /**\n * Estimate size of value in bytes\n */\n private estimateSize(value: unknown): number {\n try {\n return JSON.stringify(value).length;\n } catch {\n return 0;\n }\n }\n\n /**\n * Convert glob pattern to regex\n */\n private patternToRegex(pattern: string): RegExp {\n const escaped = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&') // Escape special regex chars\n .replace(/\\*/g, '.*') // Replace * with .*\n .replace(/\\?/g, '.'); // Replace ? with .\n\n return new RegExp(`^${escaped}$`);\n }\n}\n","import { Result, Option, Logger } from '@gl-life/gl-life-core';\nimport crypto from 'crypto';\nimport type {\n Cache,\n CacheConfig,\n CacheEntry,\n CacheEntryMetadata,\n CacheError,\n CacheStats,\n} from '../types/cache.js';\n\n/**\n * Cloudflare Workers KV namespace interface\n */\nexport interface KVNamespace {\n get(key: string, options?: { type?: 'text' | 'json' }): Promise<any>;\n put(key: string, value: string, options?: { expirationTtl?: number }): Promise<void>;\n delete(key: string): Promise<void>;\n list(options?: { prefix?: string; limit?: number; cursor?: string }): Promise<{\n keys: Array<{ name: string }>;\n list_complete: boolean;\n cursor?: string;\n }>;\n}\n\n/**\n * Cloudflare Workers KV cache implementation\n *\n * Features:\n * - Distributed cache using Cloudflare KV\n * - TTL-based expiration via KV expirationTtl\n * - Cache-aside pattern\n * - Pattern-based invalidation\n * - Statistics tracking (hits/misses)\n *\n * Limitations:\n * - No total item count (KV doesn't provide this efficiently)\n * - No LRU eviction (KV handles this internally)\n * - List operations are eventually consistent\n *\n * Usage:\n * ```typescript\n * const cache = new KVCache(env.CACHE_KV, config, logger);\n * await cache.set('user:1', { id: 1, name: 'John' }, 60);\n * const result = await cache.get<User>('user:1');\n * ```\n */\nexport class KVCache implements Cache {\n readonly config: CacheConfig;\n private readonly kv: KVNamespace;\n private readonly logger: Logger;\n private stats = {\n hits: 0,\n misses: 0,\n };\n\n constructor(kv: KVNamespace, config: CacheConfig, logger: Logger) {\n this.kv = kv;\n this.config = config;\n this.logger = logger;\n }\n\n async get<T = unknown>(key: string): Promise<Result<Option<T>, CacheError>> {\n try {\n const fullKey = this.getFullKey(key);\n let value = await this.kv.get(fullKey, { type: 'json' });\n\n if (value === null) {\n this.stats.misses++;\n return Result.ok(Option.none());\n }\n\n // If KV returned a string (mock behavior), parse it\n if (typeof value === 'string') {\n try {\n value = JSON.parse(value);\n } catch {\n // If parse fails, treat as string value\n this.stats.hits++;\n return Result.ok(Option.some(value as T));\n }\n }\n\n this.stats.hits++;\n\n // KV stores the entry wrapper with value property\n if (value && typeof value === 'object' && 'value' in value) {\n return Result.ok(Option.some(value.value as T));\n }\n\n // Fallback: if stored directly without wrapper\n return Result.ok(Option.some(value as T));\n } catch (error) {\n this.logger.error('KV cache get failed', { error, key });\n return Result.err({\n type: 'GET_FAILED',\n message: `Failed to get cache entry from KV: ${error}`,\n cause: error,\n });\n }\n }\n\n async getWithMetadata<T = unknown>(\n key: string\n ): Promise<Result<Option<CacheEntry<T>>, CacheError>> {\n try {\n const fullKey = this.getFullKey(key);\n let value = await this.kv.get(fullKey, { type: 'json' });\n\n if (value === null) {\n this.stats.misses++;\n return Result.ok(Option.none());\n }\n\n // If KV returned a string (mock behavior), parse it\n if (typeof value === 'string') {\n try {\n value = JSON.parse(value);\n } catch {\n // If parse fails, construct minimal entry with string value\n const now = new Date();\n this.stats.hits++;\n const entry: CacheEntry<T> = {\n value: value as T,\n metadata: {\n key: fullKey,\n createdAt: now,\n lastAccessedAt: now,\n accessCount: 1,\n size: this.estimateSize(value),\n ttl: this.config.defaultTTL,\n },\n };\n return Result.ok(Option.some(entry));\n }\n }\n\n this.stats.hits++;\n\n // KV stores complete entry with metadata\n if (value && typeof value === 'object' && 'value' in value && 'metadata' in value) {\n // Reconstruct Date objects from ISO strings\n const entry = value as any;\n entry.metadata.createdAt = new Date(entry.metadata.createdAt);\n entry.metadata.lastAccessedAt = new Date(entry.metadata.lastAccessedAt);\n if (entry.metadata.expiresAt) {\n entry.metadata.expiresAt = new Date(entry.metadata.expiresAt);\n }\n\n return Result.ok(Option.some(entry as CacheEntry<T>));\n }\n\n // Fallback: construct minimal entry\n const now = new Date();\n const entry: CacheEntry<T> = {\n value: value as T,\n metadata: {\n key: fullKey,\n createdAt: now,\n lastAccessedAt: now,\n accessCount: 1,\n size: this.estimateSize(value),\n ttl: this.config.defaultTTL,\n },\n };\n\n return Result.ok(Option.some(entry));\n } catch (error) {\n this.logger.error('KV cache getWithMetadata failed', { error, key });\n return Result.err({\n type: 'GET_FAILED',\n message: `Failed to get cache entry with metadata from KV: ${error}`,\n cause: error,\n });\n }\n }\n\n async set<T = unknown>(\n key: string,\n value: T,\n ttl?: number\n ): Promise<Result<void, CacheError>> {\n try {\n const fullKey = this.getFullKey(key);\n const effectiveTTL = ttl !== undefined ? ttl : this.config.defaultTTL;\n\n const now = new Date();\n const expiresAt =\n effectiveTTL > 0 ? new Date(now.getTime() + effectiveTTL * 1000) : undefined;\n\n const metadata: CacheEntryMetadata = {\n key: fullKey,\n createdAt: now,\n lastAccessedAt: now,\n accessCount: 0,\n size: this.estimateSize(value),\n ttl: effectiveTTL,\n expiresAt,\n };\n\n const entry = {\n value,\n metadata,\n };\n\n // Store as JSON string with TTL\n const options = effectiveTTL > 0 ? { expirationTtl: effectiveTTL } : {};\n await this.kv.put(fullKey, JSON.stringify(entry), options);\n\n this.logger.debug('KV cache set', { key, ttl: effectiveTTL });\n\n return Result.ok(undefined);\n } catch (error) {\n this.logger.error('KV cache set failed', { error, key });\n return Result.err({\n type: 'SET_FAILED',\n message: `Failed to set cache entry in KV: ${error}`,\n cause: error,\n });\n }\n }\n\n async delete(key: string): Promise<Result<boolean, CacheError>> {\n try {\n const fullKey = this.getFullKey(key);\n\n // KV delete doesn't return whether key existed\n // We need to check first for accurate return value\n const existed = await this.kv.get(fullKey);\n await this.kv.delete(fullKey);\n\n const wasDeleted = existed !== null;\n if (wasDeleted) {\n this.logger.debug('KV cache delete', { key });\n }\n\n return Result.ok(wasDeleted);\n } catch (error) {\n this.logger.error('KV cache delete failed', { error, key });\n return Result.err({\n type: 'DELETE_FAILED',\n message: `Failed to delete cache entry from KV: ${error}`,\n cause: error,\n });\n }\n }\n\n async deleteMany(keys: string[]): Promise<Result<number, CacheError>> {\n try {\n let deleted = 0;\n\n // KV doesn't have batch delete, so delete one by one\n for (const key of keys) {\n const result = await this.delete(key);\n if (result.isOk() && result.unwrap()) {\n deleted++;\n }\n }\n\n return Result.ok(deleted);\n } catch (error) {\n this.logger.error('KV cache deleteMany failed', { error });\n return Result.err({\n type: 'DELETE_FAILED',\n message: `Failed to delete multiple cache entries from KV: ${error}`,\n cause: error,\n });\n }\n }\n\n async clear(): Promise<Result<void, CacheError>> {\n try {\n const prefix = this.config.keyPrefix || '';\n\n // List all keys with prefix and delete them\n let cursor: string | undefined;\n let totalDeleted = 0;\n\n do {\n const listResult = await this.kv.list({\n prefix,\n limit: 1000,\n cursor,\n });\n\n // Delete all keys in this batch\n const deletePromises = listResult.keys.map(({ name }) => this.kv.delete(name));\n await Promise.all(deletePromises);\n totalDeleted += listResult.keys.length;\n\n cursor = listResult.list_complete ? undefined : listResult.cursor;\n } while (cursor);\n\n this.logger.debug('KV cache cleared', { deleted: totalDeleted });\n\n return Result.ok(undefined);\n } catch (error) {\n this.logger.error('KV cache clear failed', { error });\n return Result.err({\n type: 'CLEAR_FAILED',\n message: `Failed to clear KV cache: ${error}`,\n cause: error,\n });\n }\n }\n\n async has(key: string): Promise<Result<boolean, CacheError>> {\n try {\n const fullKey = this.getFullKey(key);\n const value = await this.kv.get(fullKey);\n\n return Result.ok(value !== null);\n } catch (error) {\n this.logger.error('KV cache has failed', { error, key });\n return Result.err({\n type: 'GET_FAILED',\n message: `Failed to check cache key existence in KV: ${error}`,\n cause: error,\n });\n }\n }\n\n async invalidate(pattern: string): Promise<Result<number, CacheError>> {\n try {\n // Convert glob pattern to prefix for KV list\n const fullPattern = this.config.keyPrefix ? `${this.config.keyPrefix}${pattern}` : pattern;\n\n // Extract prefix from pattern (everything before first wildcard)\n const prefix = fullPattern.split('*')[0].split('?')[0];\n const regex = this.patternToRegex(fullPattern);\n\n let invalidated = 0;\n let cursor: string | undefined;\n\n do {\n const listResult = await this.kv.list({\n prefix,\n limit: 1000,\n cursor,\n });\n\n // Filter keys matching the full pattern and delete them\n const matchingKeys = listResult.keys\n .map(({ name }) => name)\n .filter(name => regex.test(name));\n\n const deletePromises = matchingKeys.map(name => this.kv.delete(name));\n await Promise.all(deletePromises);\n invalidated += matchingKeys.length;\n\n cursor = listResult.list_complete ? undefined : listResult.cursor;\n } while (cursor);\n\n this.logger.debug('KV cache invalidate', { pattern, count: invalidated });\n\n return Result.ok(invalidated);\n } catch (error) {\n this.logger.error('KV cache invalidate failed', { error, pattern });\n return Result.err({\n type: 'DELETE_FAILED',\n message: `Failed to invalidate cache entries in KV: ${error}`,\n cause: error,\n });\n }\n }\n\n async invalidateTable(table: string): Promise<Result<number, CacheError>> {\n try {\n // Invalidate entries that contain table name\n const pattern = `*${table}*`;\n return await this.invalidate(pattern);\n } catch (error) {\n this.logger.error('KV cache invalidateTable failed', { error, table });\n return Result.err({\n type: 'DELETE_FAILED',\n message: `Failed to invalidate table cache in KV: ${error}`,\n cause: error,\n });\n }\n }\n\n getStats(): Result<CacheStats, CacheError> {\n try {\n const totalAccesses = this.stats.hits + this.stats.misses;\n const hitRate = totalAccesses > 0 ? this.stats.hits / totalAccesses : 0;\n\n // KV doesn't provide efficient ways to get total item count or size\n // These would require listing all keys which is expensive\n return Result.ok({\n itemCount: 0, // Not available for KV\n totalSize: 0, // Not available for KV\n hits: this.stats.hits,\n misses: this.stats.misses,\n hitRate,\n evictions: 0, // KV handles eviction internally\n });\n } catch (error) {\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to get KV cache stats: ${error}`,\n cause: error,\n });\n }\n }\n\n resetStats(): Result<void, CacheError> {\n try {\n this.stats.hits = 0;\n this.stats.misses = 0;\n\n return Result.ok(undefined);\n } catch (error) {\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to reset KV cache stats: ${error}`,\n cause: error,\n });\n }\n }\n\n generateKey(sql: string, params?: unknown[]): string {\n const data = {\n sql,\n params: params || [],\n };\n\n const hash = crypto\n .createHash('sha256')\n .update(JSON.stringify(data))\n .digest('hex');\n\n return hash.substring(0, 16); // Use first 16 chars for readability\n }\n\n /**\n * Get full cache key with prefix\n */\n private getFullKey(key: string): string {\n return this.config.keyPrefix ? `${this.config.keyPrefix}${key}` : key;\n }\n\n /**\n * Estimate size of value in bytes\n */\n private estimateSize(value: unknown): number {\n try {\n return JSON.stringify(value).length;\n } catch {\n return 0;\n }\n }\n\n /**\n * Convert glob pattern to regex\n */\n private patternToRegex(pattern: string): RegExp {\n const escaped = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&') // Escape special regex chars\n .replace(/\\*/g, '.*') // Replace * with .*\n .replace(/\\?/g, '.'); // Replace ? with .\n\n return new RegExp(`^${escaped}$`);\n }\n}\n","import { Result, Logger, EventBus, type UnsubscribeFn } from '@gl-life/gl-life-core';\nimport type { Cache, CacheError } from '../types/cache.js';\n\n/**\n * Invalidation statistics\n */\nexport interface InvalidationStats {\n /** Total number of invalidations performed */\n totalInvalidations: number;\n /** Number of tag-based invalidations */\n tagInvalidations: number;\n /** Number of pattern-based invalidations */\n patternInvalidations: number;\n /** Number of key-based invalidations */\n keyInvalidations: number;\n /** Number of expired entry invalidations */\n expiredInvalidations: number;\n}\n\n/**\n * Cache invalidation error types\n */\nexport type InvalidationError =\n | { type: 'INVALIDATION_FAILED'; message: string; cause?: unknown }\n | { type: 'TAG_NOT_FOUND'; message: string }\n | { type: 'UNKNOWN'; message: string; cause?: unknown };\n\n/**\n * Cache invalidation system\n *\n * Provides advanced cache invalidation strategies:\n * - Tag-based invalidation (group entries by logical tags)\n * - Time-based invalidation (TTL expiration scanning)\n * - Event-based invalidation (integrate with EventBus)\n * - Batch invalidation (efficient multi-entry invalidation)\n * - Pattern-based invalidation (wildcard matching)\n *\n * Usage:\n * ```typescript\n * const invalidator = new CacheInvalidator(cache, eventBus, logger);\n *\n * // Tag entries\n * await invalidator.tagEntry('user:1', ['users', 'active']);\n *\n * // Invalidate by tag\n * await invalidator.invalidateByTag('users');\n *\n * // Subscribe to data change events\n * const unsubscribe = invalidator.subscribeToDataChanges();\n * ```\n */\nexport class CacheInvalidator {\n private readonly cache: Cache;\n private readonly eventBus: EventBus;\n private readonly logger: Logger;\n\n // Tag index: tag -> Set<key>\n private readonly tagIndex: Map<string, Set<string>> = new Map();\n\n // Entry tags: key -> Set<tag>\n private readonly entryTags: Map<string, Set<string>> = new Map();\n\n // Statistics\n private stats: InvalidationStats = {\n totalInvalidations: 0,\n tagInvalidations: 0,\n patternInvalidations: 0,\n keyInvalidations: 0,\n expiredInvalidations: 0,\n };\n\n constructor(cache: Cache, eventBus: EventBus, logger: Logger) {\n this.cache = cache;\n this.eventBus = eventBus;\n this.logger = logger;\n }\n\n /**\n * Tag a cache entry for group invalidation\n *\n * @param key - Cache key\n * @param tags - Array of tags to associate with this entry\n * @returns Result with void on success\n */\n async tagEntry(key: string, tags: string[]): Promise<Result<void, InvalidationError>> {\n try {\n // Add tags to entry\n if (!this.entryTags.has(key)) {\n this.entryTags.set(key, new Set());\n }\n\n const entryTagSet = this.entryTags.get(key)!;\n\n for (const tag of tags) {\n entryTagSet.add(tag);\n\n // Add key to tag index\n if (!this.tagIndex.has(tag)) {\n this.tagIndex.set(tag, new Set());\n }\n this.tagIndex.get(tag)!.add(key);\n }\n\n this.logger.debug('Tagged cache entry', { key, tags });\n\n return Result.ok(undefined);\n } catch (error) {\n this.logger.error('Failed to tag entry', { error, key, tags });\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to tag entry: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Remove a tag from a cache entry\n *\n * @param key - Cache key\n * @param tag - Tag to remove\n * @returns Result with void on success\n */\n async removeTag(key: string, tag: string): Promise<Result<void, InvalidationError>> {\n try {\n // Remove tag from entry\n const entryTagSet = this.entryTags.get(key);\n if (entryTagSet) {\n entryTagSet.delete(tag);\n\n if (entryTagSet.size === 0) {\n this.entryTags.delete(key);\n }\n }\n\n // Remove key from tag index\n const tagSet = this.tagIndex.get(tag);\n if (tagSet) {\n tagSet.delete(key);\n\n if (tagSet.size === 0) {\n this.tagIndex.delete(tag);\n }\n }\n\n this.logger.debug('Removed tag from entry', { key, tag });\n\n return Result.ok(undefined);\n } catch (error) {\n this.logger.error('Failed to remove tag', { error, key, tag });\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to remove tag: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Invalidate all entries with a specific tag\n *\n * @param tag - Tag to invalidate (supports wildcards)\n * @returns Result with number of invalidated entries\n */\n async invalidateByTag(tag: string): Promise<Result<number, InvalidationError>> {\n try {\n const keysToInvalidate = new Set<string>();\n\n // Handle wildcard patterns\n if (tag.includes('*') || tag.includes('?')) {\n const regex = this.patternToRegex(tag);\n\n for (const [tagName, keys] of this.tagIndex.entries()) {\n if (regex.test(tagName)) {\n for (const key of keys) {\n keysToInvalidate.add(key);\n }\n }\n }\n } else {\n // Exact tag match\n const keys = this.tagIndex.get(tag);\n if (keys) {\n for (const key of keys) {\n keysToInvalidate.add(key);\n }\n }\n }\n\n // Invalidate all keys\n let invalidated = 0;\n for (const key of keysToInvalidate) {\n const result = await this.cache.delete(key);\n if (result.isOk() && result.unwrap()) {\n invalidated++;\n // Clean up tags\n await this.cleanupEntryTags(key);\n }\n }\n\n this.stats.totalInvalidations += invalidated;\n this.stats.tagInvalidations += invalidated;\n\n this.logger.debug('Invalidated by tag', { tag, count: invalidated });\n\n // Emit invalidation event\n await this.eventBus.emit('cache:invalidated', {\n type: 'tag',\n tag,\n count: invalidated,\n });\n\n return Result.ok(invalidated);\n } catch (error) {\n this.logger.error('Failed to invalidate by tag', { error, tag });\n return Result.err({\n type: 'INVALIDATION_FAILED',\n message: `Failed to invalidate by tag: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Invalidate entries by multiple tags\n *\n * @param tags - Array of tags to invalidate\n * @returns Result with number of invalidated entries\n */\n async invalidateByTags(tags: string[]): Promise<Result<number, InvalidationError>> {\n try {\n const keysToInvalidate = new Set<string>();\n\n for (const tag of tags) {\n const result = await this.getTaggedKeys(tag);\n if (result.isOk()) {\n const keys = result.unwrap();\n for (const key of keys) {\n keysToInvalidate.add(key);\n }\n }\n }\n\n // Invalidate all unique keys\n let invalidated = 0;\n for (const key of keysToInvalidate) {\n const result = await this.cache.delete(key);\n if (result.isOk() && result.unwrap()) {\n invalidated++;\n await this.cleanupEntryTags(key);\n }\n }\n\n this.stats.totalInvalidations += invalidated;\n this.stats.tagInvalidations += invalidated;\n\n this.logger.debug('Invalidated by tags', { tags, count: invalidated });\n\n return Result.ok(invalidated);\n } catch (error) {\n this.logger.error('Failed to invalidate by tags', { error, tags });\n return Result.err({\n type: 'INVALIDATION_FAILED',\n message: `Failed to invalidate by tags: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Invalidate specific cache keys\n *\n * @param keys - Array of keys to invalidate\n * @returns Result with number of invalidated entries\n */\n async invalidateByKeys(keys: string[]): Promise<Result<number, InvalidationError>> {\n try {\n let invalidated = 0;\n\n for (const key of keys) {\n const result = await this.cache.delete(key);\n if (result.isOk() && result.unwrap()) {\n invalidated++;\n await this.cleanupEntryTags(key);\n }\n }\n\n this.stats.totalInvalidations += invalidated;\n this.stats.keyInvalidations += invalidated;\n\n this.logger.debug('Invalidated by keys', { count: invalidated });\n\n return Result.ok(invalidated);\n } catch (error) {\n this.logger.error('Failed to invalidate by keys', { error, keys });\n return Result.err({\n type: 'INVALIDATION_FAILED',\n message: `Failed to invalidate by keys: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Invalidate entries matching a pattern\n *\n * @param pattern - Pattern to match (supports wildcards)\n * @returns Result with number of invalidated entries\n */\n async invalidateByPattern(pattern: string): Promise<Result<number, InvalidationError>> {\n try {\n const result = await this.cache.invalidate(pattern);\n\n if (result.isOk()) {\n const count = result.unwrap();\n this.stats.totalInvalidations += count;\n this.stats.patternInvalidations += count;\n }\n\n return result as Result<number, InvalidationError>;\n } catch (error) {\n this.logger.error('Failed to invalidate by pattern', { error, pattern });\n return Result.err({\n type: 'INVALIDATION_FAILED',\n message: `Failed to invalidate by pattern: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Scan and invalidate expired entries\n *\n * @returns Result with number of invalidated entries\n */\n async invalidateExpired(): Promise<Result<number, InvalidationError>> {\n try {\n // This relies on the cache's own TTL handling\n // We can trigger a scan by checking all entries\n let invalidated = 0;\n\n // For memory cache, just get all keys and check them\n // This will automatically remove expired ones\n const allKeys = Array.from(this.entryTags.keys());\n\n for (const key of allKeys) {\n const result = await this.cache.get(key);\n if (result.isOk() && result.unwrap().isNone()) {\n // Entry was expired and removed\n await this.cleanupEntryTags(key);\n invalidated++;\n }\n }\n\n this.stats.totalInvalidations += invalidated;\n this.stats.expiredInvalidations += invalidated;\n\n this.logger.debug('Invalidated expired entries', { count: invalidated });\n\n return Result.ok(invalidated);\n } catch (error) {\n this.logger.error('Failed to invalidate expired entries', { error });\n return Result.err({\n type: 'INVALIDATION_FAILED',\n message: `Failed to invalidate expired entries: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Subscribe to data change events for automatic invalidation\n *\n * @returns Unsubscribe function\n */\n subscribeToDataChanges(): UnsubscribeFn {\n const unsubscribers: UnsubscribeFn[] = [];\n\n // Subscribe to all events and filter for cache invalidation events\n unsubscribers.push(\n this.eventBus.subscribe('*', async (data: any) => {\n // This handler will be called for ALL events\n // We need to filter in the event emission\n })\n );\n\n // Subscribe to specific cache invalidation patterns\n const cacheInvalidateHandler = async (data: any) => {\n if (data && data.tag) {\n await this.invalidateByTag(data.tag);\n }\n };\n\n // Subscribe to common cache invalidation events\n const events = [\n 'cache:invalidate:users',\n 'cache:invalidate:posts',\n 'cache:invalidate:comments',\n ];\n\n for (const event of events) {\n unsubscribers.push(this.eventBus.subscribe(event, cacheInvalidateHandler));\n }\n\n // Subscribe to batch invalidation events\n unsubscribers.push(\n this.eventBus.subscribe('cache:invalidate:batch', async (data: any) => {\n if (data && data.tags) {\n await this.invalidateByTags(data.tags);\n }\n })\n );\n\n // Subscribe to data update events\n const dataUpdateHandler = async (data: any) => {\n if (data && data.table) {\n await this.cache.invalidateTable(data.table);\n }\n };\n\n const dataEvents = ['data:updated:users', 'data:updated:posts'];\n\n for (const event of dataEvents) {\n unsubscribers.push(this.eventBus.subscribe(event, dataUpdateHandler));\n }\n\n // Return combined unsubscribe function\n return () => {\n for (const unsubscribe of unsubscribers) {\n unsubscribe();\n }\n };\n }\n\n /**\n * Get all keys tagged with a specific tag\n *\n * @param tag - Tag name\n * @returns Result with array of keys\n */\n async getTaggedKeys(tag: string): Promise<Result<string[], InvalidationError>> {\n try {\n const keys = this.tagIndex.get(tag);\n\n if (!keys) {\n return Result.ok([]);\n }\n\n return Result.ok(Array.from(keys));\n } catch (error) {\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to get tagged keys: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Get all tags for a cache entry\n *\n * @param key - Cache key\n * @returns Result with array of tags\n */\n async getEntryTags(key: string): Promise<Result<string[], InvalidationError>> {\n try {\n const tags = this.entryTags.get(key);\n\n if (!tags) {\n return Result.ok([]);\n }\n\n return Result.ok(Array.from(tags));\n } catch (error) {\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to get entry tags: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Get invalidation statistics\n *\n * @returns Result with statistics\n */\n getStats(): Result<InvalidationStats, InvalidationError> {\n try {\n return Result.ok({ ...this.stats });\n } catch (error) {\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to get stats: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Reset invalidation statistics\n *\n * @returns Result with void on success\n */\n resetStats(): Result<void, InvalidationError> {\n try {\n this.stats = {\n totalInvalidations: 0,\n tagInvalidations: 0,\n patternInvalidations: 0,\n keyInvalidations: 0,\n expiredInvalidations: 0,\n };\n\n return Result.ok(undefined);\n } catch (error) {\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to reset stats: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Clean up tag mappings for a deleted entry\n */\n private async cleanupEntryTags(key: string): Promise<void> {\n const tags = this.entryTags.get(key);\n\n if (tags) {\n for (const tag of tags) {\n const tagSet = this.tagIndex.get(tag);\n if (tagSet) {\n tagSet.delete(key);\n\n if (tagSet.size === 0) {\n this.tagIndex.delete(tag);\n }\n }\n }\n\n this.entryTags.delete(key);\n }\n }\n\n /**\n * Convert glob pattern to regex\n */\n private patternToRegex(pattern: string): RegExp {\n const escaped = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&') // Escape special regex chars\n .replace(/\\*/g, '.*') // Replace * with .*\n .replace(/\\?/g, '.'); // Replace ? with .\n\n return new RegExp(`^${escaped}$`);\n }\n}\n","import { Result, Logger } from '@gl-life/gl-life-core';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport crypto from 'crypto';\nimport type {\n Migration,\n MigrationConfig,\n MigrationError,\n} from '../types/migration.js';\n\n/**\n * Migration file loader\n *\n * Discovers and loads migration files from a directory,\n * validates migration structure, and orders by version.\n *\n * Migration file format:\n * ```typescript\n * export const version = 1;\n * export const name = 'create_users_table';\n *\n * export async function up(context) {\n * return context.execute('CREATE TABLE users (id INTEGER PRIMARY KEY)');\n * }\n *\n * export async function down(context) {\n * return context.execute('DROP TABLE users');\n * }\n * ```\n *\n * Usage:\n * ```typescript\n * const loader = new MigrationLoader(config, logger);\n * const result = await loader.loadMigrations();\n * if (result.isOk()) {\n * const migrations = result.unwrap();\n * // migrations are ordered by version\n * }\n * ```\n */\nexport class MigrationLoader {\n private readonly config: MigrationConfig;\n private readonly logger: Logger;\n private readonly filePattern: RegExp;\n\n constructor(config: MigrationConfig, logger: Logger) {\n this.config = config;\n this.logger = logger;\n\n // Default file pattern: 001_name.ts, 002-name.ts, or V001__name.ts\n this.filePattern = config.filePattern || /^(\\d+|V\\d+)[_-].*\\.ts$/;\n }\n\n /**\n * Load all migrations from the configured directory\n *\n * @returns Result with array of migrations ordered by version\n */\n async loadMigrations(): Promise<Result<Migration[], MigrationError>> {\n try {\n // Check if directory exists\n if (!fs.existsSync(this.config.migrationsPath)) {\n return Result.err({\n type: 'INVALID_MIGRATION',\n message: `Migrations directory does not exist: ${this.config.migrationsPath}`,\n });\n }\n\n // Read directory\n const files = fs.readdirSync(this.config.migrationsPath);\n\n // Filter migration files\n const migrationFiles = files.filter(file => this.filePattern.test(file));\n\n this.logger.debug('Found migration files', {\n total: files.length,\n migrations: migrationFiles.length,\n });\n\n // Load each migration\n const migrations: Migration[] = [];\n\n for (const file of migrationFiles) {\n const filePath = path.join(this.config.migrationsPath, file);\n const result = await this.loadMigrationFile(filePath);\n\n if (result.isErr()) {\n return result as Result<Migration[], MigrationError>;\n }\n\n migrations.push(result.unwrap());\n }\n\n // Check for duplicate versions\n const duplicates = this.findDuplicateVersions(migrations);\n if (duplicates.length > 0) {\n return Result.err({\n type: 'INVALID_MIGRATION',\n message: `Duplicate migration versions found: ${duplicates.join(', ')}`,\n });\n }\n\n // Sort by version\n migrations.sort((a, b) => a.version - b.version);\n\n this.logger.debug('Loaded migrations', { count: migrations.length });\n\n return Result.ok(migrations);\n } catch (error) {\n this.logger.error('Failed to load migrations', { error });\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to load migrations: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Load a single migration file\n *\n * @param filePath - Path to migration file\n * @returns Result with Migration or MigrationError\n */\n private async loadMigrationFile(filePath: string): Promise<Result<Migration, MigrationError>> {\n try {\n // Read file content\n const content = fs.readFileSync(filePath, 'utf-8');\n\n // Dynamically import the migration module\n const fileUrl = `file://${filePath.replace(/\\\\/g, '/')}`;\n const module = await import(fileUrl);\n\n // Validate migration structure\n const validation = this.validateMigration(module, filePath);\n if (validation.isErr()) {\n return validation as Result<Migration, MigrationError>;\n }\n\n // Extract migration properties\n const { version, name, up, down } = module;\n\n // Generate migration ID\n const id = this.generateMigrationId(version, name);\n\n // Compute checksum\n const checksum = this.computeChecksum(content);\n\n const migration: Migration = {\n id,\n version,\n name,\n up,\n down,\n checksum,\n };\n\n this.logger.debug('Loaded migration', { id, version, name });\n\n return Result.ok(migration);\n } catch (error) {\n this.logger.error('Failed to load migration file', { error, filePath });\n return Result.err({\n type: 'INVALID_MIGRATION',\n message: `Failed to load migration file ${filePath}: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Validate migration module structure\n *\n * @param module - Migration module\n * @param filePath - File path for error messages\n * @returns Result with void on success or MigrationError\n */\n private validateMigration(\n module: any,\n filePath: string\n ): Result<void, MigrationError> {\n // Check version\n if (module.version === undefined) {\n return Result.err({\n type: 'INVALID_MIGRATION',\n message: `Migration ${filePath} is missing 'version' export`,\n });\n }\n\n if (typeof module.version !== 'number') {\n return Result.err({\n type: 'INVALID_MIGRATION',\n message: `Migration ${filePath} has invalid version type (must be number)`,\n });\n }\n\n if (module.version < 0) {\n return Result.err({\n type: 'INVALID_MIGRATION',\n message: `Migration ${filePath} has negative version number`,\n });\n }\n\n // Check name\n if (!module.name) {\n return Result.err({\n type: 'INVALID_MIGRATION',\n message: `Migration ${filePath} is missing 'name' export`,\n });\n }\n\n // Check up function\n if (!module.up || typeof module.up !== 'function') {\n return Result.err({\n type: 'INVALID_MIGRATION',\n message: `Migration ${filePath} is missing 'up' function`,\n });\n }\n\n // Check down function\n if (!module.down || typeof module.down !== 'function') {\n return Result.err({\n type: 'INVALID_MIGRATION',\n message: `Migration ${filePath} is missing 'down' function`,\n });\n }\n\n return Result.ok(undefined);\n }\n\n /**\n * Find duplicate version numbers in migrations\n *\n * @param migrations - Array of migrations\n * @returns Array of duplicate version numbers\n */\n private findDuplicateVersions(migrations: Migration[]): number[] {\n const versionCounts = new Map<number, number>();\n\n for (const migration of migrations) {\n const count = versionCounts.get(migration.version) || 0;\n versionCounts.set(migration.version, count + 1);\n }\n\n const duplicates: number[] = [];\n for (const [version, count] of versionCounts.entries()) {\n if (count > 1) {\n duplicates.push(version);\n }\n }\n\n return duplicates;\n }\n\n /**\n * Generate unique migration ID from version and name\n *\n * @param version - Migration version\n * @param name - Migration name\n * @returns Migration ID\n */\n private generateMigrationId(version: number, name: string): string {\n return `${version}_${name}`;\n }\n\n /**\n * Compute SHA-256 checksum of migration content\n *\n * @param content - Migration file content\n * @returns Checksum string\n */\n private computeChecksum(content: string): string {\n return crypto.createHash('sha256').update(content).digest('hex');\n }\n\n /**\n * Get SQL schema for migration tracking table\n *\n * @returns SQL CREATE TABLE statement\n */\n getMigrationTableSchema(): string {\n const tableName = this.config.migrationTable;\n\n return `\nCREATE TABLE IF NOT EXISTS ${tableName} (\n id TEXT PRIMARY KEY,\n version INTEGER NOT NULL UNIQUE,\n name TEXT NOT NULL,\n checksum TEXT,\n status TEXT NOT NULL DEFAULT 'PENDING',\n executed_at TIMESTAMP,\n execution_time INTEGER,\n error TEXT\n);\n\nCREATE INDEX IF NOT EXISTS idx_${tableName}_version ON ${tableName}(version);\nCREATE INDEX IF NOT EXISTS idx_${tableName}_status ON ${tableName}(status);\n `.trim();\n }\n}\n","import { Result, Logger } from '@gl-life/gl-life-core';\nimport type { MigrationLoader } from './loader.js';\nimport type {\n Migration,\n MigrationConfig,\n MigrationContext,\n MigrationMetadata,\n MigrationError,\n MigrationRunner as IMigrationRunner,\n} from '../types/migration.js';\n\n/**\n * Migration runner implementation\n *\n * Manages database migrations with version control, transaction support,\n * and rollback capabilities. Tracks migration state in the database.\n *\n * Usage:\n * ```typescript\n * const runner = new MigrationRunner(connection, loader, config, logger);\n *\n * // Run all pending migrations\n * const result = await runner.migrate();\n *\n * // Rollback last migration\n * const rollbackResult = await runner.rollback();\n * ```\n */\nexport class MigrationRunner implements IMigrationRunner {\n private readonly connection: any;\n private readonly loader: MigrationLoader;\n readonly config: MigrationConfig;\n private readonly logger: Logger;\n\n constructor(\n connection: any,\n loader: MigrationLoader,\n config: MigrationConfig,\n logger: Logger\n ) {\n this.connection = connection;\n this.loader = loader;\n this.config = config;\n this.logger = logger;\n }\n\n /**\n * Create migration table if it doesn't exist\n */\n async createMigrationTable(): Promise<Result<void, MigrationError>> {\n try {\n const schema = this.loader.getMigrationTableSchema();\n const result = await this.connection.execute(schema);\n\n if (result.isErr()) {\n return Result.err({\n type: 'UNKNOWN',\n message: 'Failed to create migration table',\n cause: result.variant.error,\n });\n }\n\n this.logger.debug('Migration table created');\n return Result.ok(undefined);\n } catch (error) {\n this.logger.error('Failed to create migration table', { error });\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to create migration table: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Get all available migrations\n */\n async getMigrations(): Promise<Result<Migration[], MigrationError>> {\n return this.loader.loadMigrations();\n }\n\n /**\n * Get migration history from database\n */\n async getHistory(): Promise<Result<MigrationMetadata[], MigrationError>> {\n try {\n const query = `SELECT * FROM ${this.config.migrationTable} ORDER BY version DESC`;\n const result = await this.connection.query(query);\n\n if (result.isErr()) {\n return Result.err({\n type: 'UNKNOWN',\n message: 'Failed to get migration history',\n cause: result.variant.error,\n });\n }\n\n const rows = result.unwrap();\n const history: MigrationMetadata[] = rows.map((row: any) => ({\n id: row.id,\n version: row.version,\n name: row.name,\n status: row.status,\n executedAt: row.executed_at ? new Date(row.executed_at) : undefined,\n executionTime: row.execution_time,\n error: row.error,\n checksum: row.checksum,\n }));\n\n return Result.ok(history);\n } catch (error) {\n this.logger.error('Failed to get migration history', { error });\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to get migration history: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Get pending migrations\n */\n async getPending(): Promise<Result<Migration[], MigrationError>> {\n try {\n // Load all migrations\n const migrationsResult = await this.getMigrations();\n if (migrationsResult.isErr()) {\n return migrationsResult;\n }\n\n const allMigrations = migrationsResult.unwrap();\n\n // Get history\n const historyResult = await this.getHistory();\n if (historyResult.isErr()) {\n return Result.err(historyResult.variant.error);\n }\n\n const history = historyResult.unwrap();\n const appliedVersions = new Set(\n history\n .filter(h => h.status === 'COMPLETED')\n .map(h => h.version)\n );\n\n // Filter out applied migrations\n const pending = allMigrations.filter(m => !appliedVersions.has(m.version));\n\n return Result.ok(pending);\n } catch (error) {\n this.logger.error('Failed to get pending migrations', { error });\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to get pending migrations: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Run all pending migrations\n */\n async migrate(): Promise<Result<MigrationMetadata[], MigrationError>> {\n try {\n // Validate checksums if enabled\n if (this.config.validateChecksums) {\n const validationResult = await this.validateChecksums();\n if (validationResult.isErr()) {\n return Result.err(validationResult.variant.error);\n }\n }\n\n // Get pending migrations\n const pendingResult = await this.getPending();\n if (pendingResult.isErr()) {\n return Result.err(pendingResult.variant.error);\n }\n\n const pending = pendingResult.unwrap();\n const applied: MigrationMetadata[] = [];\n\n // Run each migration\n for (const migration of pending) {\n const result = await this.runMigration(migration, 'UP');\n if (result.isErr()) {\n return Result.err(result.variant.error);\n }\n applied.push(result.unwrap());\n }\n\n this.logger.info('Migrations completed', { count: applied.length });\n return Result.ok(applied);\n } catch (error) {\n this.logger.error('Migration failed', { error });\n return Result.err({\n type: 'UNKNOWN',\n message: `Migration failed: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Run migrations up to a specific version\n */\n async migrateTo(targetVersion: number): Promise<Result<MigrationMetadata[], MigrationError>> {\n try {\n // Get all migrations\n const migrationsResult = await this.getMigrations();\n if (migrationsResult.isErr()) {\n return Result.err(migrationsResult.variant.error);\n }\n\n const allMigrations = migrationsResult.unwrap();\n\n // Check if target version exists\n const targetMigration = allMigrations.find(m => m.version === targetVersion);\n if (!targetMigration) {\n return Result.err({\n type: 'MIGRATION_NOT_FOUND',\n message: `Migration version ${targetVersion} not found`,\n migrationId: `${targetVersion}`,\n });\n }\n\n // Get pending migrations up to target\n const pendingResult = await this.getPending();\n if (pendingResult.isErr()) {\n return Result.err(pendingResult.variant.error);\n }\n\n const pending = pendingResult.unwrap();\n const toApply = pending.filter(m => m.version <= targetVersion);\n\n const applied: MigrationMetadata[] = [];\n\n // Run each migration\n for (const migration of toApply) {\n const result = await this.runMigration(migration, 'UP');\n if (result.isErr()) {\n return Result.err(result.variant.error);\n }\n applied.push(result.unwrap());\n }\n\n this.logger.info('Migrated to version', { version: targetVersion });\n return Result.ok(applied);\n } catch (error) {\n this.logger.error('Migration to version failed', { error, targetVersion });\n return Result.err({\n type: 'UNKNOWN',\n message: `Migration to version ${targetVersion} failed: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Rollback the last migration\n */\n async rollback(): Promise<Result<MigrationMetadata, MigrationError>> {\n try {\n // Get history\n const historyResult = await this.getHistory();\n if (historyResult.isErr()) {\n return Result.err(historyResult.variant.error);\n }\n\n const history = historyResult.unwrap();\n const completed = history.filter(h => h.status === 'COMPLETED');\n\n if (completed.length === 0) {\n return Result.err({\n type: 'NOT_APPLIED',\n message: 'No migrations to rollback',\n migrationId: '',\n });\n }\n\n // Get last completed migration\n const lastMigration = completed[0]; // Already sorted DESC\n\n // Load migration file\n const migrationsResult = await this.getMigrations();\n if (migrationsResult.isErr()) {\n return Result.err(migrationsResult.variant.error);\n }\n\n const migrations = migrationsResult.unwrap();\n const migration = migrations.find(m => m.id === lastMigration.id);\n\n if (!migration) {\n return Result.err({\n type: 'MIGRATION_NOT_FOUND',\n message: `Migration ${lastMigration.id} not found`,\n migrationId: lastMigration.id,\n });\n }\n\n // Run rollback\n const result = await this.runMigration(migration, 'DOWN');\n if (result.isErr()) {\n return Result.err(result.variant.error);\n }\n\n this.logger.info('Rolled back migration', { id: migration.id });\n return Result.ok(result.unwrap());\n } catch (error) {\n this.logger.error('Rollback failed', { error });\n return Result.err({\n type: 'UNKNOWN',\n message: `Rollback failed: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Rollback to a specific version\n */\n async rollbackTo(targetVersion: number): Promise<Result<MigrationMetadata[], MigrationError>> {\n try {\n // Get history\n const historyResult = await this.getHistory();\n if (historyResult.isErr()) {\n return Result.err(historyResult.variant.error);\n }\n\n const history = historyResult.unwrap();\n const completed = history\n .filter(h => h.status === 'COMPLETED' && h.version > targetVersion)\n .sort((a, b) => b.version - a.version); // DESC order\n\n // Load migrations\n const migrationsResult = await this.getMigrations();\n if (migrationsResult.isErr()) {\n return Result.err(migrationsResult.variant.error);\n }\n\n const allMigrations = migrationsResult.unwrap();\n const rolledBack: MigrationMetadata[] = [];\n\n // Rollback each migration\n for (const historyEntry of completed) {\n const migration = allMigrations.find(m => m.id === historyEntry.id);\n if (!migration) {\n return Result.err({\n type: 'MIGRATION_NOT_FOUND',\n message: `Migration ${historyEntry.id} not found`,\n migrationId: historyEntry.id,\n });\n }\n\n const result = await this.runMigration(migration, 'DOWN');\n if (result.isErr()) {\n return Result.err(result.variant.error);\n }\n rolledBack.push(result.unwrap());\n }\n\n this.logger.info('Rolled back to version', { version: targetVersion });\n return Result.ok(rolledBack);\n } catch (error) {\n this.logger.error('Rollback to version failed', { error, targetVersion });\n return Result.err({\n type: 'UNKNOWN',\n message: `Rollback to version ${targetVersion} failed: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Reset database by rolling back all migrations\n */\n async reset(): Promise<Result<MigrationMetadata[], MigrationError>> {\n return this.rollbackTo(0);\n }\n\n /**\n * Refresh database by resetting and re-running all migrations\n */\n async refresh(): Promise<\n Result<{ rolledBack: MigrationMetadata[]; applied: MigrationMetadata[] }, MigrationError>\n > {\n try {\n // Reset all migrations\n const resetResult = await this.reset();\n if (resetResult.isErr()) {\n return Result.err(resetResult.variant.error);\n }\n\n const rolledBack = resetResult.unwrap();\n\n // Re-run all migrations\n const migrateResult = await this.migrate();\n if (migrateResult.isErr()) {\n return Result.err(migrateResult.variant.error);\n }\n\n const applied = migrateResult.unwrap();\n\n this.logger.info('Database refreshed', {\n rolledBack: rolledBack.length,\n applied: applied.length,\n });\n\n return Result.ok({ rolledBack, applied });\n } catch (error) {\n this.logger.error('Refresh failed', { error });\n return Result.err({\n type: 'UNKNOWN',\n message: `Refresh failed: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Get current migration version\n */\n async getCurrentVersion(): Promise<Result<number, MigrationError>> {\n try {\n const historyResult = await this.getHistory();\n if (historyResult.isErr()) {\n return Result.err(historyResult.variant.error);\n }\n\n const history = historyResult.unwrap();\n const completed = history.filter(h => h.status === 'COMPLETED');\n\n if (completed.length === 0) {\n return Result.ok(0);\n }\n\n // Find max version among completed migrations\n const maxVersion = Math.max(...completed.map(h => h.version));\n return Result.ok(maxVersion);\n } catch (error) {\n this.logger.error('Failed to get current version', { error });\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to get current version: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Validate migration checksums\n */\n async validateChecksums(): Promise<Result<boolean, MigrationError>> {\n try {\n // Load all migrations\n const migrationsResult = await this.getMigrations();\n if (migrationsResult.isErr()) {\n return Result.err(migrationsResult.variant.error);\n }\n\n const migrations = migrationsResult.unwrap();\n\n // Get history\n const historyResult = await this.getHistory();\n if (historyResult.isErr()) {\n return Result.err(historyResult.variant.error);\n }\n\n const history = historyResult.unwrap();\n\n // Check checksums for completed migrations only\n const completedMigrations = history.filter(h => h.status === 'COMPLETED');\n\n for (const historyEntry of completedMigrations) {\n const migration = migrations.find(m => m.id === historyEntry.id);\n if (!migration) {\n continue; // Migration file may have been deleted\n }\n\n // Both checksums must exist and match\n if (migration.checksum && historyEntry.checksum) {\n if (migration.checksum !== historyEntry.checksum) {\n return Result.err({\n type: 'CHECKSUM_MISMATCH',\n message: `Checksum mismatch for migration ${migration.id}`,\n migrationId: migration.id,\n });\n }\n }\n }\n\n return Result.ok(true);\n } catch (error) {\n this.logger.error('Checksum validation failed', { error });\n return Result.err({\n type: 'UNKNOWN',\n message: `Checksum validation failed: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Load migration from file\n */\n async loadMigration(filePath: string): Promise<Result<Migration, MigrationError>> {\n if (this.loader.loadMigrationFile) {\n return this.loader.loadMigrationFile(filePath);\n }\n\n return Result.err({\n type: 'UNKNOWN',\n message: 'Migration loader does not support loading individual files',\n });\n }\n\n /**\n * Run a single migration in a transaction\n */\n private async runMigration(\n migration: Migration,\n direction: 'UP' | 'DOWN'\n ): Promise<Result<MigrationMetadata, MigrationError>> {\n const startTime = Date.now();\n const isUp = direction === 'UP';\n const fn = isUp ? migration.up : migration.down;\n\n try {\n // Insert/update migration status to RUNNING\n await this.updateMigrationStatus(\n migration,\n isUp ? 'RUNNING' : 'RUNNING',\n undefined,\n undefined\n );\n\n // Run migration in transaction if configured\n const runFn = async (conn: any) => {\n const context: MigrationContext = {\n execute: async <T = unknown>(sql: string, params?: unknown[]) => {\n const result = await conn.execute(sql, params);\n if (result.isErr()) {\n return Result.err({\n type: 'MIGRATION_FAILED',\n message: `Migration execution failed: ${result.variant.error}`,\n migrationId: migration.id,\n cause: result.variant.error,\n } as MigrationError);\n }\n return Result.ok(result.unwrap() as T);\n },\n log: (message: string) => {\n this.logger.info(message, { migrationId: migration.id });\n },\n metadata: {\n id: migration.id,\n version: migration.version,\n name: migration.name,\n status: 'RUNNING',\n },\n };\n\n return await fn(context);\n };\n\n let result: Result<void, MigrationError>;\n\n if (this.config.transactional) {\n result = await this.connection.transaction(runFn);\n } else {\n result = await runFn(this.connection);\n }\n\n const executionTime = Date.now() - startTime;\n\n if (result.isErr()) {\n // Update status to FAILED\n await this.updateMigrationStatus(\n migration,\n 'FAILED',\n executionTime,\n result.variant.error.message\n );\n\n return Result.err(result.variant.error);\n }\n\n // Update status to COMPLETED or ROLLED_BACK\n const finalStatus = isUp ? 'COMPLETED' : 'ROLLED_BACK';\n await this.updateMigrationStatus(migration, finalStatus, executionTime, undefined);\n\n const metadata: MigrationMetadata = {\n id: migration.id,\n version: migration.version,\n name: migration.name,\n status: finalStatus,\n executedAt: new Date(),\n executionTime,\n checksum: migration.checksum,\n };\n\n this.logger.info('Migration executed', {\n id: migration.id,\n direction,\n executionTime,\n });\n\n return Result.ok(metadata);\n } catch (error) {\n const executionTime = Date.now() - startTime;\n\n await this.updateMigrationStatus(\n migration,\n 'FAILED',\n executionTime,\n String(error)\n );\n\n this.logger.error('Migration execution failed', { error, migration: migration.id });\n\n return Result.err({\n type: isUp ? 'MIGRATION_FAILED' : 'ROLLBACK_FAILED',\n message: `Migration ${migration.id} failed: ${error}`,\n migrationId: migration.id,\n cause: error,\n });\n }\n }\n\n /**\n * Update migration status in database\n */\n private async updateMigrationStatus(\n migration: Migration,\n status: string,\n executionTime?: number,\n error?: string\n ): Promise<void> {\n try {\n const tableName = this.config.migrationTable;\n\n if (status === 'RUNNING') {\n // Insert new migration record\n const insertSQL = `\n INSERT OR REPLACE INTO ${tableName} (id, version, name, checksum, status, executed_at, execution_time, error)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `;\n\n await this.connection.execute(insertSQL, [\n {\n id: migration.id,\n version: migration.version,\n name: migration.name,\n checksum: migration.checksum || null,\n status,\n executed_at: new Date().toISOString(),\n execution_time: null,\n error: null,\n },\n ]);\n } else {\n // Update existing migration record\n const updateSQL = `\n UPDATE ${tableName}\n SET status = ?, execution_time = ?, error = ?, executed_at = ?\n WHERE id = ?\n `;\n\n await this.connection.execute(updateSQL, [\n {\n status,\n execution_time: executionTime || null,\n error: error || null,\n executed_at: new Date().toISOString(),\n id: migration.id,\n },\n ]);\n }\n } catch (err) {\n this.logger.error('Failed to update migration status', {\n error: err,\n migration: migration.id,\n });\n }\n }\n}\n","import { Result, Logger } from '@gl-life/gl-life-core';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport crypto from 'crypto';\nimport type {\n Seed,\n SeedConfig,\n SeedContext,\n SeedMetadata,\n SeedError,\n Seeder,\n SeedEnvironment,\n} from '../types/seed.js';\n\n/**\n * Data seeder implementation\n *\n * Manages database seeding with environment-specific support and idempotent execution.\n * Seeds are executed only once per environment unless explicitly re-run.\n *\n * Usage:\n * ```typescript\n * const seeder = new DataSeeder(connection, config, logger);\n *\n * // Run all pending seeds\n * const result = await seeder.seed();\n *\n * // Reset all seeds\n * const resetResult = await seeder.reset();\n * ```\n */\nexport class DataSeeder implements Seeder {\n private readonly connection: any;\n readonly config: SeedConfig;\n private readonly logger: Logger;\n private seedsCache: Seed[] | null = null;\n\n constructor(connection: any, config: SeedConfig, logger: Logger) {\n this.connection = connection;\n this.config = config;\n this.logger = logger;\n }\n\n /**\n * Create seed table if it doesn't exist\n */\n async createSeedTable(): Promise<Result<void, SeedError>> {\n try {\n const schema = this.getSeedTableSchema();\n const result = await this.connection.execute(schema);\n\n if (result.isErr()) {\n return Result.err({\n type: 'UNKNOWN',\n message: 'Failed to create seed table',\n cause: result.variant.error,\n });\n }\n\n this.logger.debug('Seed table created');\n return Result.ok(undefined);\n } catch (error) {\n this.logger.error('Failed to create seed table', { error });\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to create seed table: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Get all available seeds\n */\n async getSeeds(): Promise<Result<Seed[], SeedError>> {\n return this.loadSeedsFromDirectory();\n }\n\n /**\n * Get seed history from database\n */\n async getHistory(): Promise<Result<SeedMetadata[], SeedError>> {\n try {\n const query = `SELECT * FROM ${this.config.seedTable} ORDER BY executed_at DESC`;\n const result = await this.connection.query(query);\n\n if (result.isErr()) {\n return Result.err({\n type: 'UNKNOWN',\n message: 'Failed to get seed history',\n cause: result.variant.error,\n });\n }\n\n const rows = result.unwrap();\n const history: SeedMetadata[] = rows.map((row: any) => ({\n id: row.id,\n name: row.name,\n environment: JSON.parse(row.environment || '[]'),\n status: row.status,\n executedAt: row.executed_at ? new Date(row.executed_at) : undefined,\n executionTime: row.execution_time,\n error: row.error,\n checksum: row.checksum,\n }));\n\n return Result.ok(history);\n } catch (error) {\n this.logger.error('Failed to get seed history', { error });\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to get seed history: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Get pending seeds for current environment\n */\n async getPending(): Promise<Result<Seed[], SeedError>> {\n try {\n // Load all seeds\n const seedsResult = await this.getSeeds();\n if (seedsResult.isErr()) {\n return seedsResult;\n }\n\n const allSeeds = seedsResult.unwrap();\n\n // Filter by environment\n const environmentSeeds = allSeeds.filter(seed =>\n this.matchesEnvironment(seed.environment)\n );\n\n // Get history\n const historyResult = await this.getHistory();\n if (historyResult.isErr()) {\n return Result.err(historyResult.variant.error);\n }\n\n const history = historyResult.unwrap();\n const executedIds = new Set(\n history.filter(h => h.status === 'COMPLETED').map(h => h.id)\n );\n\n // Filter out executed seeds\n const pending = environmentSeeds.filter(s => !executedIds.has(s.id));\n\n return Result.ok(pending);\n } catch (error) {\n this.logger.error('Failed to get pending seeds', { error });\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to get pending seeds: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Run all pending seeds for current environment\n */\n async seed(): Promise<Result<SeedMetadata[], SeedError>> {\n try {\n // Validate checksums if enabled\n if (this.config.validateChecksums) {\n const validationResult = await this.validateChecksums();\n if (validationResult.isErr()) {\n return Result.err(validationResult.variant.error);\n }\n }\n\n // Get pending seeds\n const pendingResult = await this.getPending();\n if (pendingResult.isErr()) {\n return Result.err(pendingResult.variant.error);\n }\n\n const pending = pendingResult.unwrap();\n const executed: SeedMetadata[] = [];\n\n // Run each seed\n for (const seed of pending) {\n const result = await this.executeSeed(seed);\n if (result.isErr()) {\n return Result.err(result.variant.error);\n }\n executed.push(result.unwrap());\n }\n\n this.logger.info('Seeds completed', { count: executed.length });\n return Result.ok(executed);\n } catch (error) {\n this.logger.error('Seeding failed', { error });\n return Result.err({\n type: 'UNKNOWN',\n message: `Seeding failed: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Run a specific seed by ID\n */\n async runSeed(seedId: string): Promise<Result<SeedMetadata, SeedError>> {\n try {\n // Load all seeds\n const seedsResult = await this.getSeeds();\n if (seedsResult.isErr()) {\n return Result.err(seedsResult.variant.error);\n }\n\n const allSeeds = seedsResult.unwrap();\n const seed = allSeeds.find(s => s.id === seedId);\n\n if (!seed) {\n return Result.err({\n type: 'SEED_NOT_FOUND',\n message: `Seed ${seedId} not found`,\n seedId,\n });\n }\n\n // Execute seed (even if already run - allows re-running)\n return this.executeSeed(seed);\n } catch (error) {\n this.logger.error('Run seed failed', { error, seedId });\n return Result.err({\n type: 'UNKNOWN',\n message: `Run seed ${seedId} failed: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Reset all seeds (clear history)\n */\n async reset(): Promise<Result<void, SeedError>> {\n try {\n const sql = `DELETE FROM ${this.config.seedTable}`;\n const result = await this.connection.execute(sql);\n\n if (result.isErr()) {\n return Result.err({\n type: 'UNKNOWN',\n message: 'Failed to reset seeds',\n cause: result.variant.error,\n });\n }\n\n this.logger.info('All seeds reset');\n return Result.ok(undefined);\n } catch (error) {\n this.logger.error('Failed to reset seeds', { error });\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to reset seeds: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Validate seed checksums\n */\n async validateChecksums(): Promise<Result<boolean, SeedError>> {\n try {\n // Load all seeds\n const seedsResult = await this.getSeeds();\n if (seedsResult.isErr()) {\n return Result.err(seedsResult.variant.error);\n }\n\n const seeds = seedsResult.unwrap();\n\n // Get history\n const historyResult = await this.getHistory();\n if (historyResult.isErr()) {\n return Result.err(historyResult.variant.error);\n }\n\n const history = historyResult.unwrap();\n\n // Check checksums for completed seeds only\n const completedSeeds = history.filter(h => h.status === 'COMPLETED');\n\n for (const historyEntry of completedSeeds) {\n const seed = seeds.find(s => s.id === historyEntry.id);\n if (!seed) {\n continue; // Seed file may have been deleted\n }\n\n // Both checksums must exist and match\n if (seed.checksum && historyEntry.checksum) {\n if (seed.checksum !== historyEntry.checksum) {\n return Result.err({\n type: 'CHECKSUM_MISMATCH',\n message: `Checksum mismatch for seed ${seed.id}`,\n seedId: seed.id,\n });\n }\n }\n }\n\n return Result.ok(true);\n } catch (error) {\n this.logger.error('Checksum validation failed', { error });\n return Result.err({\n type: 'UNKNOWN',\n message: `Checksum validation failed: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Load seed from file\n */\n async loadSeed(filePath: string): Promise<Result<Seed, SeedError>> {\n return this.loadSeedFile(filePath);\n }\n\n /**\n * Load seeds from directory\n */\n private async loadSeedsFromDirectory(): Promise<Result<Seed[], SeedError>> {\n // Return cached seeds if available\n if (this.seedsCache) {\n return Result.ok(this.seedsCache);\n }\n\n try {\n // Check if directory exists\n if (!fs.existsSync(this.config.seedsPath)) {\n return Result.err({\n type: 'INVALID_SEED',\n message: `Seeds directory does not exist: ${this.config.seedsPath}`,\n });\n }\n\n // Read directory\n const files = fs.readdirSync(this.config.seedsPath);\n\n // Default file pattern: 001_name.ts or 001-name.ts\n const filePattern = this.config.filePattern || /^[0-9]+[_-].*\\.ts$/;\n\n // Filter seed files\n const seedFiles = files.filter(file => filePattern.test(file));\n\n this.logger.debug('Found seed files', {\n total: files.length,\n seeds: seedFiles.length,\n });\n\n // Load each seed\n const seeds: Seed[] = [];\n\n for (const file of seedFiles) {\n const filePath = path.join(this.config.seedsPath, file);\n const result = await this.loadSeedFile(filePath);\n\n if (result.isErr()) {\n return result as Result<Seed[], SeedError>;\n }\n\n seeds.push(result.unwrap());\n }\n\n // Sort by ID\n seeds.sort((a, b) => a.id.localeCompare(b.id));\n\n // Cache seeds\n this.seedsCache = seeds;\n\n this.logger.debug('Loaded seeds', { count: seeds.length });\n\n return Result.ok(seeds);\n } catch (error) {\n this.logger.error('Failed to load seeds', { error });\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to load seeds: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Load a single seed file\n */\n private async loadSeedFile(filePath: string): Promise<Result<Seed, SeedError>> {\n try {\n // Read file content\n const content = fs.readFileSync(filePath, 'utf-8');\n\n // Dynamically import the seed module\n const fileUrl = `file://${filePath.replace(/\\\\/g, '/')}`;\n const module = await import(fileUrl);\n\n // Validate seed structure\n const validation = this.validateSeed(module, filePath);\n if (validation.isErr()) {\n return validation as Result<Seed, SeedError>;\n }\n\n // Extract seed properties\n const { id, name, environment, run } = module;\n\n // Compute checksum\n const checksum = this.computeChecksum(content);\n\n const seed: Seed = {\n id,\n name,\n environment: Array.isArray(environment) ? environment : [environment],\n run,\n checksum,\n };\n\n this.logger.debug('Loaded seed', { id, name, environment });\n\n return Result.ok(seed);\n } catch (error) {\n this.logger.error('Failed to load seed file', { error, filePath });\n return Result.err({\n type: 'INVALID_SEED',\n message: `Failed to load seed file ${filePath}: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Validate seed module structure\n */\n private validateSeed(module: any, filePath: string): Result<void, SeedError> {\n // Check id\n if (!module.id) {\n return Result.err({\n type: 'INVALID_SEED',\n message: `Seed ${filePath} is missing 'id' export`,\n });\n }\n\n // Check name\n if (!module.name) {\n return Result.err({\n type: 'INVALID_SEED',\n message: `Seed ${filePath} is missing 'name' export`,\n });\n }\n\n // Check environment\n if (!module.environment) {\n return Result.err({\n type: 'INVALID_SEED',\n message: `Seed ${filePath} is missing 'environment' export`,\n });\n }\n\n // Check run function\n if (!module.run || typeof module.run !== 'function') {\n return Result.err({\n type: 'INVALID_SEED',\n message: `Seed ${filePath} is missing 'run' function`,\n });\n }\n\n return Result.ok(undefined);\n }\n\n /**\n * Check if seed matches current environment\n */\n private matchesEnvironment(environments: SeedEnvironment[]): boolean {\n // 'all' environment matches any environment\n if (environments.includes('all')) {\n return true;\n }\n\n // Check if current environment is in seed's environments\n return environments.includes(this.config.environment);\n }\n\n /**\n * Execute a single seed\n */\n private async executeSeed(seed: Seed): Promise<Result<SeedMetadata, SeedError>> {\n const startTime = Date.now();\n\n try {\n // Insert/update seed status to RUNNING\n await this.updateSeedStatus(seed, 'RUNNING', undefined, undefined);\n\n // Run seed in transaction if configured\n const runFn = async (conn: any) => {\n const context: SeedContext = {\n execute: async <T = unknown>(sql: string, params?: unknown[]) => {\n const result = await conn.execute(sql, params);\n if (result.isErr()) {\n return Result.err({\n type: 'SEED_FAILED',\n message: `Seed execution failed: ${result.variant.error}`,\n seedId: seed.id,\n cause: result.variant.error,\n } as SeedError);\n }\n return Result.ok(result.unwrap() as T);\n },\n log: (message: string) => {\n this.logger.info(message, { seedId: seed.id });\n },\n metadata: {\n id: seed.id,\n name: seed.name,\n environment: seed.environment,\n status: 'RUNNING',\n },\n environment: this.config.environment,\n };\n\n return await seed.run(context);\n };\n\n let result: Result<void, SeedError>;\n\n if (this.config.transactional) {\n result = await this.connection.transaction(runFn);\n } else {\n result = await runFn(this.connection);\n }\n\n const executionTime = Date.now() - startTime;\n\n if (result.isErr()) {\n // Update status to FAILED\n await this.updateSeedStatus(seed, 'FAILED', executionTime, result.variant.error.message);\n\n return Result.err(result.variant.error);\n }\n\n // Update status to COMPLETED\n await this.updateSeedStatus(seed, 'COMPLETED', executionTime, undefined);\n\n const metadata: SeedMetadata = {\n id: seed.id,\n name: seed.name,\n environment: seed.environment,\n status: 'COMPLETED',\n executedAt: new Date(),\n executionTime,\n checksum: seed.checksum,\n };\n\n this.logger.info('Seed executed', {\n id: seed.id,\n executionTime,\n });\n\n return Result.ok(metadata);\n } catch (error) {\n const executionTime = Date.now() - startTime;\n\n await this.updateSeedStatus(seed, 'FAILED', executionTime, String(error));\n\n this.logger.error('Seed execution failed', { error, seed: seed.id });\n\n return Result.err({\n type: 'SEED_FAILED',\n message: `Seed ${seed.id} failed: ${error}`,\n seedId: seed.id,\n cause: error,\n });\n }\n }\n\n /**\n * Update seed status in database\n */\n private async updateSeedStatus(\n seed: Seed,\n status: string,\n executionTime?: number,\n error?: string\n ): Promise<void> {\n try {\n const tableName = this.config.seedTable;\n\n if (status === 'RUNNING') {\n // Insert new seed record\n const insertSQL = `\n INSERT OR REPLACE INTO ${tableName} (id, name, environment, checksum, status, executed_at, execution_time, error)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `;\n\n await this.connection.execute(insertSQL, [\n seed.id,\n seed.name,\n JSON.stringify(seed.environment),\n seed.checksum || null,\n status,\n new Date().toISOString(),\n null,\n null,\n ]);\n } else {\n // Update existing seed record\n const updateSQL = `\n UPDATE ${tableName}\n SET status = ?, execution_time = ?, error = ?, executed_at = ?\n WHERE id = ?\n `;\n\n await this.connection.execute(updateSQL, [\n status,\n executionTime || null,\n error || null,\n new Date().toISOString(),\n seed.id,\n ]);\n }\n } catch (err) {\n this.logger.error('Failed to update seed status', {\n error: err,\n seed: seed.id,\n });\n }\n }\n\n /**\n * Compute SHA-256 checksum of seed content\n */\n private computeChecksum(content: string): string {\n return crypto.createHash('sha256').update(content).digest('hex');\n }\n\n /**\n * Get SQL schema for seed tracking table\n */\n private getSeedTableSchema(): string {\n const tableName = this.config.seedTable;\n\n return `\nCREATE TABLE IF NOT EXISTS ${tableName} (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n environment TEXT NOT NULL,\n checksum TEXT,\n status TEXT NOT NULL DEFAULT 'PENDING',\n executed_at TIMESTAMP,\n execution_time INTEGER,\n error TEXT\n);\n\nCREATE INDEX IF NOT EXISTS idx_${tableName}_status ON ${tableName}(status);\nCREATE INDEX IF NOT EXISTS idx_${tableName}_environment ON ${tableName}(environment);\n `.trim();\n }\n}\n","import { Result, Logger } from '@gl-life/gl-life-core';\nimport type {\n D1Database,\n D1PreparedStatement,\n D1Result,\n D1AdapterConfig,\n D1AdapterError,\n D1Adapter,\n D1ExecResult,\n} from '../types/cloudforge.js';\n\n/**\n * Cloudflare D1 database adapter\n *\n * Provides a standardized interface for interacting with Cloudflare D1 databases.\n * Handles D1-specific quirks and optimizes for D1 performance.\n *\n * Usage:\n * ```typescript\n * const adapter = new D1DatabaseAdapter(config, logger);\n *\n * // Query data\n * const result = await adapter.query('SELECT * FROM users WHERE id = ?', [1]);\n *\n * // Execute statement\n * const execResult = await adapter.execute('INSERT INTO users (name) VALUES (?)', ['Alice']);\n *\n * // Batch operations\n * const batchResult = await adapter.batch([\n * { sql: 'INSERT INTO users (name) VALUES (?)', params: ['Alice'] },\n * { sql: 'INSERT INTO users (name) VALUES (?)', params: ['Bob'] },\n * ]);\n * ```\n */\nexport class D1DatabaseAdapter implements D1Adapter {\n readonly config: D1AdapterConfig;\n private readonly logger: Logger;\n private readonly db: D1Database;\n\n constructor(config: D1AdapterConfig, logger: Logger) {\n this.config = config;\n this.logger = logger;\n this.db = config.database;\n }\n\n /**\n * Execute a SQL query and return all results\n */\n async query<T = unknown>(sql: string, params?: unknown[]): Promise<Result<T[], D1AdapterError>> {\n try {\n if (this.config.enableQueryLogging) {\n this.logger.debug('Executing D1 query', { sql, params });\n }\n\n const stmt = this.prepareStatement(sql, params);\n const result = await stmt.all<T>();\n\n if (!result.success) {\n return Result.err({\n type: 'QUERY_FAILED',\n message: result.error || 'Query failed',\n sql,\n });\n }\n\n return Result.ok(result.results || []);\n } catch (error) {\n this.logger.error('D1 query failed', { error, sql });\n return Result.err({\n type: 'QUERY_FAILED',\n message: `Query failed: ${error}`,\n sql,\n cause: error,\n });\n }\n }\n\n /**\n * Execute a SQL query and return first result\n */\n async queryFirst<T = unknown>(\n sql: string,\n params?: unknown[]\n ): Promise<Result<T | null, D1AdapterError>> {\n try {\n if (this.config.enableQueryLogging) {\n this.logger.debug('Executing D1 queryFirst', { sql, params });\n }\n\n const stmt = this.prepareStatement(sql, params);\n const result = await stmt.first<T>();\n\n return Result.ok(result);\n } catch (error) {\n this.logger.error('D1 queryFirst failed', { error, sql });\n return Result.err({\n type: 'QUERY_FAILED',\n message: `QueryFirst failed: ${error}`,\n sql,\n cause: error,\n });\n }\n }\n\n /**\n * Execute a SQL statement (INSERT, UPDATE, DELETE)\n */\n async execute(sql: string, params?: unknown[]): Promise<Result<D1Result, D1AdapterError>> {\n try {\n if (this.config.enableQueryLogging) {\n this.logger.debug('Executing D1 statement', { sql, params });\n }\n\n const stmt = this.prepareStatement(sql, params);\n const result = await stmt.run();\n\n if (!result.success) {\n return Result.err({\n type: 'QUERY_FAILED',\n message: result.error || 'Execution failed',\n sql,\n });\n }\n\n return Result.ok(result);\n } catch (error) {\n this.logger.error('D1 execute failed', { error, sql });\n return Result.err({\n type: 'QUERY_FAILED',\n message: `Execute failed: ${error}`,\n sql,\n cause: error,\n });\n }\n }\n\n /**\n * Execute multiple SQL statements in a batch\n */\n async batch(\n statements: Array<{ sql: string; params?: unknown[] }>\n ): Promise<Result<D1Result[], D1AdapterError>> {\n try {\n // Validate batch size\n const maxBatchSize = this.config.maxBatchSize || 100;\n if (statements.length > maxBatchSize) {\n return Result.err({\n type: 'BATCH_FAILED',\n message: `Batch size ${statements.length} exceeds maximum ${maxBatchSize}`,\n });\n }\n\n // Handle empty batch\n if (statements.length === 0) {\n return Result.ok([]);\n }\n\n if (this.config.enableQueryLogging) {\n this.logger.debug('Executing D1 batch', {\n count: statements.length,\n });\n }\n\n // Prepare all statements\n const preparedStatements: D1PreparedStatement[] = statements.map(({ sql, params }) =>\n this.prepareStatement(sql, params)\n );\n\n // Execute batch\n const results = await this.db.batch(preparedStatements);\n\n return Result.ok(results);\n } catch (error) {\n this.logger.error('D1 batch failed', { error, count: statements.length });\n return Result.err({\n type: 'BATCH_FAILED',\n message: `Batch execution failed: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Execute raw SQL (for migrations and schema changes)\n */\n async exec(sql: string): Promise<Result<D1ExecResult, D1AdapterError>> {\n try {\n if (this.config.enableQueryLogging) {\n this.logger.debug('Executing D1 raw SQL', { sql });\n }\n\n const result = await this.db.exec(sql);\n\n return Result.ok(result);\n } catch (error) {\n this.logger.error('D1 exec failed', { error, sql });\n return Result.err({\n type: 'EXEC_FAILED',\n message: `Exec failed: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Begin a transaction\n *\n * Note: D1 doesn't support explicit transactions yet, so this wraps\n * the callback execution and provides the same interface for compatibility.\n * Consider using batch() for atomic multi-statement operations.\n */\n async transaction<T>(\n callback: (adapter: D1Adapter) => Promise<Result<T, D1AdapterError>>\n ): Promise<Result<T, D1AdapterError>> {\n try {\n this.logger.debug('Starting D1 transaction (logical)');\n\n // Execute the callback with this adapter\n const result = await callback(this);\n\n return result;\n } catch (error) {\n this.logger.error('D1 transaction failed', { error });\n return Result.err({\n type: 'UNKNOWN',\n message: `Transaction failed: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Prepare a SQL statement with parameters\n */\n private prepareStatement(sql: string, params?: unknown[]): D1PreparedStatement {\n const stmt = this.db.prepare(sql);\n\n // Bind parameters if provided\n if (params && params.length > 0) {\n return stmt.bind(...params);\n }\n\n return stmt;\n }\n}\n","import { Result, Logger } from '@gl-life/gl-life-core';\nimport type {\n DurableObjectStorage,\n DurableObjectStorageConfig,\n DurableObjectStorageError,\n DurableObjectStorageAdapter as IDurableObjectStorageAdapter,\n StorageListOptions,\n StorageTransaction,\n} from '../types/cloudforge.js';\n\n/**\n * Durable Objects storage adapter implementation\n *\n * Provides a type-safe interface for Cloudflare Durable Objects storage\n * with Result-based error handling and logging support.\n */\nexport class DurableObjectStorageAdapter implements IDurableObjectStorageAdapter {\n readonly config: DurableObjectStorageConfig;\n private readonly storage: DurableObjectStorage;\n private readonly logger: Logger;\n\n constructor(\n storage: DurableObjectStorage,\n config: DurableObjectStorageConfig,\n logger: Logger\n ) {\n this.storage = storage;\n this.config = config;\n this.logger = logger;\n }\n\n /**\n * Get a single value by key\n */\n async get<T>(key: string): Promise<Result<T | null, DurableObjectStorageError>> {\n try {\n if (this.config.enableLogging) {\n this.logger.debug('DO Storage operation', { operation: 'get', key });\n }\n\n const value = await this.storage.get(key);\n\n return Result.ok(value === undefined ? null : value);\n } catch (error) {\n this.logger.error('DO Storage get failed', { error, key });\n return Result.err({\n type: 'STORAGE_FAILED',\n message: `Failed to get value for key \"${key}\": ${error}`,\n key,\n cause: error,\n });\n }\n }\n\n /**\n * Get multiple values by keys\n */\n async getMultiple<T>(\n keys: string[]\n ): Promise<Result<Map<string, T>, DurableObjectStorageError>> {\n try {\n if (this.config.enableLogging) {\n this.logger.debug('DO Storage operation', {\n operation: 'getMultiple',\n keyCount: keys.length,\n });\n }\n\n const result = await this.storage.get(keys);\n const typedResult = result as Map<string, T>;\n\n return Result.ok(typedResult);\n } catch (error) {\n this.logger.error('DO Storage getMultiple failed', { error, keyCount: keys.length });\n return Result.err({\n type: 'STORAGE_FAILED',\n message: `Failed to get multiple values: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Put a single key-value pair\n */\n async put<T>(key: string, value: T): Promise<Result<void, DurableObjectStorageError>> {\n try {\n if (this.config.enableLogging) {\n this.logger.debug('DO Storage operation', { operation: 'put', key });\n }\n\n await this.storage.put(key, value);\n\n return Result.ok(undefined);\n } catch (error) {\n // Check for serialization errors\n if (\n error instanceof Error &&\n (error.message.includes('DataCloneError') || error.message.includes('could not be cloned'))\n ) {\n this.logger.error('DO Storage serialization failed', { error, key });\n return Result.err({\n type: 'SERIALIZATION_ERROR',\n message: `Failed to serialize value for key \"${key}\": ${error.message}`,\n cause: error,\n });\n }\n\n // Check for quota exceeded errors\n if (\n error instanceof Error &&\n (error.message.includes('QuotaExceededError') ||\n error.message.includes('storage quota exceeded'))\n ) {\n this.logger.error('DO Storage quota exceeded', { error, key });\n return Result.err({\n type: 'QUOTA_EXCEEDED',\n message: `Storage quota exceeded when setting key \"${key}\"`,\n });\n }\n\n this.logger.error('DO Storage put failed', { error, key });\n return Result.err({\n type: 'STORAGE_FAILED',\n message: `Failed to put value for key \"${key}\": ${error}`,\n key,\n cause: error,\n });\n }\n }\n\n /**\n * Put multiple key-value pairs\n */\n async putMultiple<T>(\n entries: [string, T][]\n ): Promise<Result<void, DurableObjectStorageError>> {\n try {\n if (this.config.enableLogging) {\n this.logger.debug('DO Storage operation', {\n operation: 'putMultiple',\n entryCount: entries.length,\n });\n }\n\n // Convert array of tuples to object\n const entriesObj: Record<string, T> = {};\n for (const [key, value] of entries) {\n entriesObj[key] = value;\n }\n\n await this.storage.put(entriesObj);\n\n return Result.ok(undefined);\n } catch (error) {\n // Check for serialization errors\n if (\n error instanceof Error &&\n (error.message.includes('DataCloneError') || error.message.includes('could not be cloned'))\n ) {\n this.logger.error('DO Storage serialization failed', { error });\n return Result.err({\n type: 'SERIALIZATION_ERROR',\n message: `Failed to serialize values: ${error.message}`,\n cause: error,\n });\n }\n\n // Check for quota exceeded errors\n if (\n error instanceof Error &&\n (error.message.includes('QuotaExceededError') ||\n error.message.includes('storage quota exceeded'))\n ) {\n this.logger.error('DO Storage quota exceeded', { error });\n return Result.err({\n type: 'QUOTA_EXCEEDED',\n message: 'Storage quota exceeded when setting multiple values',\n });\n }\n\n this.logger.error('DO Storage putMultiple failed', { error, entryCount: entries.length });\n return Result.err({\n type: 'STORAGE_FAILED',\n message: `Failed to put multiple values: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Delete a single key\n */\n async delete(key: string): Promise<Result<boolean, DurableObjectStorageError>> {\n try {\n if (this.config.enableLogging) {\n this.logger.debug('DO Storage operation', { operation: 'delete', key });\n }\n\n const result = await this.storage.delete(key);\n\n return Result.ok(result as boolean);\n } catch (error) {\n this.logger.error('DO Storage delete failed', { error, key });\n return Result.err({\n type: 'STORAGE_FAILED',\n message: `Failed to delete key \"${key}\": ${error}`,\n key,\n cause: error,\n });\n }\n }\n\n /**\n * Delete multiple keys\n */\n async deleteMultiple(keys: string[]): Promise<Result<number, DurableObjectStorageError>> {\n try {\n if (this.config.enableLogging) {\n this.logger.debug('DO Storage operation', {\n operation: 'deleteMultiple',\n keyCount: keys.length,\n });\n }\n\n const result = await this.storage.delete(keys);\n\n return Result.ok(result as number);\n } catch (error) {\n this.logger.error('DO Storage deleteMultiple failed', { error, keyCount: keys.length });\n return Result.err({\n type: 'STORAGE_FAILED',\n message: `Failed to delete multiple keys: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Delete all keys in storage\n */\n async deleteAll(): Promise<Result<void, DurableObjectStorageError>> {\n try {\n if (this.config.enableLogging) {\n this.logger.debug('DO Storage operation', { operation: 'deleteAll' });\n }\n\n await this.storage.deleteAll();\n\n return Result.ok(undefined);\n } catch (error) {\n this.logger.error('DO Storage deleteAll failed', { error });\n return Result.err({\n type: 'STORAGE_FAILED',\n message: `Failed to delete all keys: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * List keys in storage\n */\n async list(\n options?: StorageListOptions\n ): Promise<Result<Map<string, any>, DurableObjectStorageError>> {\n try {\n if (this.config.enableLogging) {\n this.logger.debug('DO Storage operation', { operation: 'list', options });\n }\n\n const result = await this.storage.list(options);\n\n return Result.ok(result);\n } catch (error) {\n this.logger.error('DO Storage list failed', { error, options });\n return Result.err({\n type: 'STORAGE_FAILED',\n message: `Failed to list keys: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Execute operations in a transaction\n */\n async transaction<T>(\n callback: (txn: StorageTransaction) => Promise<Result<T, DurableObjectStorageError>>\n ): Promise<Result<T, DurableObjectStorageError>> {\n try {\n if (this.config.enableLogging) {\n this.logger.debug('DO Storage operation', { operation: 'transaction' });\n }\n\n const result = await this.storage.transaction(async (txnStorage) => {\n // Create a transaction adapter for the callback\n const txnAdapter = new DurableObjectStorageAdapter(\n txnStorage,\n this.config,\n this.logger\n );\n\n // Execute the callback with the transaction adapter\n return await callback(txnAdapter);\n });\n\n return result;\n } catch (error) {\n this.logger.error('DO Storage transaction failed', { error });\n return Result.err({\n type: 'TRANSACTION_FAILED',\n message: `Transaction failed: ${error}`,\n cause: error,\n });\n }\n }\n}\n","import { Result, Logger } from '@gl-life/gl-life-core';\nimport { gzipSync, gunzipSync } from 'node:zlib';\nimport type {\n R2Bucket,\n R2BackupConfig,\n R2BackupError,\n R2BackupAdapter as IR2BackupAdapter,\n BackupInfo,\n BackupOptions,\n RestoreOptions,\n} from '../types/cloudforge.js';\n\n/**\n * R2 backup adapter implementation\n *\n * Provides database backup and restore functionality using Cloudflare R2 storage\n * with compression support and metadata tracking.\n */\nexport class R2BackupAdapter implements IR2BackupAdapter {\n readonly config: R2BackupConfig;\n private readonly bucket: R2Bucket;\n private readonly logger: Logger;\n\n constructor(config: R2BackupConfig, logger: Logger) {\n this.config = config;\n this.bucket = config.bucket;\n this.logger = logger;\n }\n\n /**\n * Create a backup with compression\n */\n async backup(\n data: ArrayBuffer | Buffer,\n options?: BackupOptions\n ): Promise<Result<BackupInfo, R2BackupError>> {\n try {\n if (this.config.enableLogging) {\n this.logger.debug('R2 Backup operation', { operation: 'backup' });\n }\n\n // Convert ArrayBuffer to Buffer if needed\n const buffer = data instanceof ArrayBuffer ? Buffer.from(data) : data;\n\n if (!buffer || buffer.length === 0) {\n return Result.err({\n type: 'COMPRESSION_FAILED',\n message: 'Cannot backup empty or invalid data',\n });\n }\n\n // Compress data\n const compressionLevel = options?.compressionLevel ?? this.config.defaultCompressionLevel ?? 6;\n\n let compressedData: Buffer;\n try {\n compressedData = gzipSync(buffer, { level: compressionLevel });\n } catch (error) {\n this.logger.error('Compression failed', { error });\n return Result.err({\n type: 'COMPRESSION_FAILED',\n message: `Failed to compress data: ${error}`,\n cause: error,\n });\n }\n\n // Generate unique backup key with timestamp\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const key = `${this.config.name}-backup-${timestamp}.gz`;\n\n // Prepare metadata\n const customMetadata: Record<string, string> = {\n originalSize: buffer.length.toString(),\n compressionRatio: (compressedData.length / buffer.length).toString(),\n compressionLevel: compressionLevel.toString(),\n backupDate: new Date().toISOString(),\n ...(options?.metadata || {}),\n };\n\n // Upload to R2\n try {\n const r2Object = await this.bucket.put(key, compressedData, {\n httpMetadata: {\n contentType: 'application/gzip',\n contentEncoding: 'gzip',\n contentDisposition: `attachment; filename=\"${key}\"`,\n },\n customMetadata,\n storageClass: options?.storageClass || 'Standard',\n });\n\n const backupInfo: BackupInfo = {\n key: r2Object.key,\n size: buffer.length,\n compressedSize: r2Object.size,\n compressionRatio: r2Object.size / buffer.length,\n uploadedAt: r2Object.uploaded,\n etag: r2Object.etag,\n metadata: {\n databaseVersion: customMetadata.databaseVersion,\n backupType: customMetadata.backupType,\n originalChecksum: customMetadata.originalChecksum,\n },\n };\n\n if (this.config.enableLogging) {\n this.logger.debug('Backup completed', {\n key: backupInfo.key,\n originalSize: backupInfo.size,\n compressedSize: backupInfo.compressedSize,\n compressionRatio: backupInfo.compressionRatio,\n });\n }\n\n return Result.ok(backupInfo);\n } catch (error) {\n this.logger.error('R2 upload failed', { error, key });\n return Result.err({\n type: 'UPLOAD_FAILED',\n message: `Failed to upload backup: ${error}`,\n key,\n cause: error,\n });\n }\n } catch (error) {\n this.logger.error('Backup operation failed', { error });\n return Result.err({\n type: 'UNKNOWN',\n message: `Backup failed: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Restore from a backup with decompression\n */\n async restore(\n key: string,\n options?: RestoreOptions\n ): Promise<Result<ArrayBuffer, R2BackupError>> {\n try {\n if (this.config.enableLogging) {\n this.logger.debug('R2 Backup operation', { operation: 'restore', key });\n }\n\n // Download from R2\n let r2Object;\n try {\n r2Object = await this.bucket.get(key);\n } catch (error) {\n this.logger.error('R2 download failed', { error, key });\n return Result.err({\n type: 'DOWNLOAD_FAILED',\n message: `Failed to download backup: ${error}`,\n key,\n cause: error,\n });\n }\n\n if (!r2Object) {\n return Result.err({\n type: 'BACKUP_NOT_FOUND',\n message: `Backup not found: ${key}`,\n key,\n });\n }\n\n // Get compressed data\n const compressedData = await r2Object.arrayBuffer();\n\n // Decompress data\n try {\n const decompressed = gunzipSync(Buffer.from(compressedData));\n\n if (this.config.enableLogging) {\n this.logger.debug('Restore completed', {\n key,\n compressedSize: compressedData.byteLength,\n originalSize: decompressed.length,\n });\n }\n\n return Result.ok(decompressed.buffer);\n } catch (error) {\n this.logger.error('Decompression failed', { error, key });\n return Result.err({\n type: 'DECOMPRESSION_FAILED',\n message: `Failed to decompress backup: ${error}`,\n cause: error,\n });\n }\n } catch (error) {\n this.logger.error('Restore operation failed', { error, key });\n return Result.err({\n type: 'RESTORE_FAILED',\n message: `Restore failed: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * List all backups\n */\n async listBackups(options?: {\n limit?: number;\n cursor?: string;\n }): Promise<Result<BackupInfo[], R2BackupError>> {\n try {\n if (this.config.enableLogging) {\n this.logger.debug('R2 Backup operation', { operation: 'listBackups' });\n }\n\n const r2Objects = await this.bucket.list({\n prefix: `${this.config.name}-backup`,\n limit: options?.limit,\n cursor: options?.cursor,\n include: ['customMetadata'],\n });\n\n const backups: BackupInfo[] = r2Objects.objects.map((obj) => {\n const originalSize = parseInt(obj.customMetadata?.originalSize || '0', 10);\n const compressionRatio = parseFloat(\n obj.customMetadata?.compressionRatio || '1.0'\n );\n\n return {\n key: obj.key,\n size: originalSize,\n compressedSize: obj.size,\n compressionRatio,\n uploadedAt: obj.uploaded,\n etag: obj.etag,\n metadata: {\n databaseVersion: obj.customMetadata?.databaseVersion,\n backupType: obj.customMetadata?.backupType,\n originalChecksum: obj.customMetadata?.originalChecksum,\n },\n };\n });\n\n return Result.ok(backups);\n } catch (error) {\n this.logger.error('List backups failed', { error });\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to list backups: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Delete a single backup\n */\n async deleteBackup(key: string): Promise<Result<void, R2BackupError>> {\n try {\n if (this.config.enableLogging) {\n this.logger.debug('R2 Backup operation', { operation: 'deleteBackup', key });\n }\n\n await this.bucket.delete(key);\n\n return Result.ok(undefined);\n } catch (error) {\n this.logger.error('Delete backup failed', { error, key });\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to delete backup: ${error}`,\n cause: error,\n });\n }\n }\n\n /**\n * Delete multiple backups (batched for efficiency)\n */\n async deleteMultipleBackups(keys: string[]): Promise<Result<void, R2BackupError>> {\n try {\n if (this.config.enableLogging) {\n this.logger.debug('R2 Backup operation', {\n operation: 'deleteMultipleBackups',\n count: keys.length,\n });\n }\n\n // R2 supports up to 1000 deletions per call\n const batchSize = 1000;\n const batches: string[][] = [];\n\n for (let i = 0; i < keys.length; i += batchSize) {\n batches.push(keys.slice(i, i + batchSize));\n }\n\n // Delete in batches\n for (const batch of batches) {\n await this.bucket.delete(batch);\n }\n\n return Result.ok(undefined);\n } catch (error) {\n this.logger.error('Delete multiple backups failed', { error, count: keys.length });\n return Result.err({\n type: 'UNKNOWN',\n message: `Failed to delete backups: ${error}`,\n cause: error,\n });\n }\n }\n}\n","// @gl-life/gl-life-database\n// Enhanced gl-life-data wrapper with CloudForge features\n\nimport { Result, Option, Logger, EventBus, Config } from '@gl-life/gl-life-core';\n\nexport { Result, Option, Logger, EventBus, Config };\n\n// Export all types and interfaces\nexport * from './types/index.js';\n\n// Export connection manager\nexport * from './connection/index.js';\n\n// Export query builder\nexport * from './query/index.js';\n\n// Export transaction\nexport * from './transaction/index.js';\n\n// Export tenant\nexport * from './tenant/index.js';\n\n// Export cache\nexport * from './cache/index.js';\n\n// Export migration classes\nexport { MigrationLoader } from './migration/loader.js';\nexport { MigrationRunner } from './migration/runner.js';\nexport { DataSeeder } from './migration/seeder.js';\n\n// Export cloudforge classes\nexport { D1DatabaseAdapter } from './cloudforge/d1-adapter.js';\nexport { DurableObjectStorageAdapter } from './cloudforge/do-storage.js';\nexport { R2BackupAdapter } from './cloudforge/r2-backup.js';\n\nexport const version = '1.1.0';\n"]}
|