@hedystia/db 2.1.1 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"s3.cjs","names":["BaseDriver","DriverError"],"sources":["../../src/drivers/s3.ts"],"sourcesContent":["import { DriverError } from \"../errors\";\nimport type { ColumnMetadata, S3ConnectionConfig, TableMetadata } from \"../types\";\nimport { BaseDriver } from \"./driver\";\n\ninterface S3TableData {\n rows: Record<string, unknown>[];\n autoIncrementId: number;\n meta: {\n columns: ColumnMetadata[];\n };\n}\n\n/**\n * S3-based database driver using JSON objects for storage\n */\nexport class S3Driver extends BaseDriver {\n private config: S3ConnectionConfig;\n private data = new Map<string, S3TableData>();\n private client: any = null;\n\n constructor(config: S3ConnectionConfig) {\n super();\n this.config = config;\n }\n\n private getKey(tableName: string): string {\n const prefix = this.config.prefix ? `${this.config.prefix}/` : \"\";\n return `${prefix}${tableName}.json`;\n }\n\n async connect(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n try {\n const { S3Client, HeadBucketCommand } = await import(\"@aws-sdk/client-s3\");\n const clientConfig: any = {};\n if (this.config.region) {\n clientConfig.region = this.config.region;\n }\n if (this.config.endpoint) {\n clientConfig.endpoint = this.config.endpoint;\n clientConfig.forcePathStyle = true;\n }\n if (this.config.accessKeyId && this.config.secretAccessKey) {\n clientConfig.credentials = {\n accessKeyId: this.config.accessKeyId,\n secretAccessKey: this.config.secretAccessKey,\n };\n }\n this.client = new S3Client(clientConfig);\n\n try {\n await this.client.send(new HeadBucketCommand({ Bucket: this.config.bucket }));\n } catch (err: any) {\n if (err.name === \"NotFound\" || err.$metadata?.httpStatusCode === 404) {\n const { CreateBucketCommand } = await import(\"@aws-sdk/client-s3\");\n await this.client.send(new CreateBucketCommand({ Bucket: this.config.bucket }));\n } else if (err.$metadata?.httpStatusCode !== 200) {\n throw err;\n }\n }\n\n await this.loadAll();\n this.connected = true;\n } catch (err: any) {\n throw new DriverError(`Failed to connect to S3: ${err.message}`);\n }\n }\n\n async disconnect(): Promise<void> {\n await this.flushAll();\n this.data.clear();\n this.client = null;\n this.connected = false;\n }\n\n async execute(sql: string, params: unknown[] = []): Promise<any> {\n return this.executeParsed(sql, params);\n }\n\n async query(sql: string, params: unknown[] = []): Promise<any[]> {\n const result = this.executeParsed(sql, params);\n return Array.isArray(result) ? result : [];\n }\n\n async tableExists(name: string): Promise<boolean> {\n return this.data.has(name);\n }\n\n async getTableColumns(name: string): Promise<ColumnMetadata[]> {\n const table = this.data.get(name);\n if (!table) {\n return [];\n }\n return Object.values(table.meta.columns);\n }\n\n async createTable(meta: TableMetadata): Promise<void> {\n if (this.data.has(meta.name)) {\n return;\n }\n this.data.set(meta.name, {\n rows: [],\n autoIncrementId: 0,\n meta: { columns: [...meta.columns] },\n });\n await this.flush(meta.name);\n }\n\n async dropTable(name: string): Promise<void> {\n this.data.delete(name);\n try {\n const { DeleteObjectCommand } = await import(\"@aws-sdk/client-s3\");\n await this.client.send(\n new DeleteObjectCommand({\n Bucket: this.config.bucket,\n Key: this.getKey(name),\n }),\n );\n } catch {}\n }\n\n async addColumn(table: string, column: ColumnMetadata): Promise<void> {\n const tableData = this.data.get(table);\n if (!tableData) {\n throw new DriverError(`Table \"${table}\" does not exist`);\n }\n tableData.meta.columns.push(column);\n for (const row of tableData.rows) {\n row[column.name] = column.defaultValue ?? null;\n }\n await this.flush(table);\n }\n\n async dropColumn(table: string, name: string): Promise<void> {\n const tableData = this.data.get(table);\n if (!tableData) {\n throw new DriverError(`Table \"${table}\" does not exist`);\n }\n tableData.meta.columns = tableData.meta.columns.filter((c) => c.name !== name);\n for (const row of tableData.rows) {\n delete row[name];\n }\n await this.flush(table);\n }\n\n async renameColumn(table: string, oldName: string, newName: string): Promise<void> {\n const tableData = this.data.get(table);\n if (!tableData) {\n throw new DriverError(`Table \"${table}\" does not exist`);\n }\n const col = tableData.meta.columns.find((c) => c.name === oldName);\n if (col) {\n col.name = newName;\n }\n for (const row of tableData.rows) {\n row[newName] = row[oldName];\n delete row[oldName];\n }\n await this.flush(table);\n }\n\n async transaction<T>(fn: () => Promise<T>): Promise<T> {\n const snapshot = new Map<string, string>();\n for (const [name, tableData] of this.data) {\n snapshot.set(name, JSON.stringify(tableData));\n }\n try {\n const result = await fn();\n await this.flushAll();\n return result;\n } catch (err) {\n for (const [name, json] of snapshot) {\n this.data.set(name, JSON.parse(json));\n }\n throw err;\n }\n }\n\n async getAllTableColumns(): Promise<Record<string, ColumnMetadata[]>> {\n const result: Record<string, ColumnMetadata[]> = {};\n for (const [name, tableData] of this.data) {\n result[name] = [...tableData.meta.columns];\n }\n return result;\n }\n\n private async loadAll(): Promise<void> {\n try {\n const { ListObjectsV2Command, GetObjectCommand } = await import(\"@aws-sdk/client-s3\");\n const prefix = this.config.prefix ? `${this.config.prefix}/` : \"\";\n const response = await this.client.send(\n new ListObjectsV2Command({\n Bucket: this.config.bucket,\n Prefix: prefix,\n }),\n );\n\n if (response.Contents) {\n for (const obj of response.Contents) {\n if (obj.Key?.endsWith(\".json\")) {\n const tableName = obj.Key.replace(prefix, \"\").replace(\".json\", \"\");\n try {\n const getResponse = await this.client.send(\n new GetObjectCommand({\n Bucket: this.config.bucket,\n Key: obj.Key,\n }),\n );\n const body = await getResponse.Body?.transformToString();\n if (body) {\n this.data.set(tableName, JSON.parse(body));\n }\n } catch {}\n }\n }\n }\n } catch {}\n }\n\n private async flush(tableName: string): Promise<void> {\n const tableData = this.data.get(tableName);\n if (!tableData || !this.client) {\n return;\n }\n try {\n const { PutObjectCommand } = await import(\"@aws-sdk/client-s3\");\n await this.client.send(\n new PutObjectCommand({\n Bucket: this.config.bucket,\n Key: this.getKey(tableName),\n Body: JSON.stringify(tableData),\n ContentType: \"application/json\",\n }),\n );\n } catch {}\n }\n\n private async flushAll(): Promise<void> {\n for (const [name] of this.data) {\n await this.flush(name);\n }\n }\n\n private executeParsed(sql: string, params: unknown[]): any {\n const trimmed = sql.trim().toUpperCase();\n\n if (trimmed.startsWith(\"CREATE TABLE\")) {\n return { insertId: 0, affectedRows: 0 };\n }\n\n if (trimmed.startsWith(\"DROP TABLE\")) {\n const match = sql.match(/DROP\\s+TABLE\\s+(?:IF\\s+EXISTS\\s+)?`?(\\w+)`?/i);\n if (match?.[1]) {\n this.data.delete(match[1]);\n }\n return { insertId: 0, affectedRows: 0 };\n }\n\n if (trimmed.startsWith(\"INSERT\")) {\n return this.handleInsert(sql, params);\n }\n\n if (trimmed.startsWith(\"UPDATE\")) {\n return this.handleUpdate(sql, params);\n }\n\n if (trimmed.startsWith(\"DELETE\")) {\n return this.handleDelete(sql, params);\n }\n\n if (trimmed.startsWith(\"SELECT\")) {\n return this.handleSelect(sql, params);\n }\n\n return { insertId: 0, affectedRows: 0 };\n }\n\n private handleInsert(sql: string, params: unknown[]): any {\n const tableMatch = sql.match(/INTO\\s+`?(\\w+)`?/i);\n if (!tableMatch?.[1]) {\n return { insertId: 0, affectedRows: 0 };\n }\n\n const tableName = tableMatch[1];\n const tableData = this.data.get(tableName);\n if (!tableData) {\n return { insertId: 0, affectedRows: 0 };\n }\n\n const colMatch = sql.match(/\\(([^)]+)\\)\\s+VALUES/i);\n if (!colMatch?.[1]) {\n return { insertId: 0, affectedRows: 0 };\n }\n\n const cols = colMatch[1]\n .split(\",\")\n .map((c) => c.trim().replace(/`/g, \"\"))\n .filter(Boolean);\n\n const rowCount = Math.floor(params.length / cols.length);\n\n let insertId = 0;\n let pkCol: string | null = null;\n for (const col of tableData.meta.columns) {\n if (col.autoIncrement) {\n pkCol = col.name;\n break;\n }\n }\n\n for (let rowIdx = 0; rowIdx < rowCount; rowIdx++) {\n const row: Record<string, unknown> = {};\n const rowParamStart = rowIdx * cols.length;\n\n for (let i = 0; i < cols.length; i++) {\n const col = cols[i];\n if (col) {\n row[col] = params[rowParamStart + i];\n }\n }\n\n if (pkCol && row[pkCol] === undefined) {\n tableData.autoIncrementId++;\n row[pkCol] = tableData.autoIncrementId;\n if (rowIdx === 0) {\n insertId = tableData.autoIncrementId;\n }\n } else if (pkCol && row[pkCol]) {\n if (rowIdx === 0) {\n insertId = row[pkCol] as number;\n }\n }\n\n tableData.rows.push({ ...row });\n }\n\n this.flush(tableName);\n\n return { insertId, affectedRows: rowCount };\n }\n\n private handleUpdate(sql: string, params: unknown[]): any {\n const tableMatch = sql.match(/UPDATE\\s+`?(\\w+)`?/i);\n if (!tableMatch?.[1]) {\n return { affectedRows: 0 };\n }\n\n const tableName = tableMatch[1];\n const tableData = this.data.get(tableName);\n if (!tableData) {\n return { affectedRows: 0 };\n }\n\n const setMatch = sql.match(/SET\\s+(.+?)\\s+WHERE/i) || sql.match(/SET\\s+(.+)$/i);\n if (!setMatch?.[1]) {\n return { affectedRows: 0 };\n }\n\n const setClauses = setMatch[1].split(\",\");\n const updates: Record<string, unknown> = {};\n let paramIndex = 0;\n\n for (const clause of setClauses) {\n const eqMatch = clause.match(/`?(\\w+)`?\\s*=\\s*\\?/);\n if (eqMatch?.[1]) {\n updates[eqMatch[1]] = params[paramIndex];\n paramIndex++;\n }\n }\n\n const whereMatch = sql.match(/WHERE\\s+(.+)$/i);\n const whereConditions = whereMatch?.[1] || \"\";\n\n let affectedRows = 0;\n for (const row of tableData.rows) {\n if (this.matchesWhere(row, whereConditions, params, paramIndex)) {\n Object.assign(row, updates);\n affectedRows++;\n }\n }\n\n if (affectedRows > 0) {\n this.flush(tableName);\n }\n\n return { affectedRows };\n }\n\n private handleDelete(sql: string, params: unknown[]): any {\n const tableMatch = sql.match(/FROM\\s+`?(\\w+)`?/i);\n if (!tableMatch?.[1]) {\n return { affectedRows: 0 };\n }\n\n const tableName = tableMatch[1];\n const tableData = this.data.get(tableName);\n if (!tableData) {\n return { affectedRows: 0 };\n }\n\n const whereMatch = sql.match(/WHERE\\s+(.+)$/i);\n if (!whereMatch?.[1]) {\n const affectedRows = tableData.rows.length;\n tableData.rows = [];\n if (affectedRows > 0) {\n this.flush(tableName);\n }\n return { affectedRows };\n }\n\n const whereConditions = whereMatch[1];\n const before = tableData.rows.length;\n\n tableData.rows = tableData.rows.filter(\n (row) => !this.matchesWhere(row, whereConditions, params, 0),\n );\n\n const affectedRows = before - tableData.rows.length;\n if (affectedRows > 0) {\n this.flush(tableName);\n }\n\n return { affectedRows };\n }\n\n private handleSelect(sql: string, params: unknown[]): any {\n const countMatch = sql.match(/SELECT\\s+COUNT\\s*\\(\\s*\\*\\s*\\)\\s+as\\s+(\\w+)/i);\n if (countMatch) {\n const tableMatch = sql.match(/FROM\\s+`?(\\w+)`?/i);\n if (!tableMatch?.[1]) {\n return [];\n }\n const tableName = tableMatch[1];\n const tableData = this.data.get(tableName);\n if (!tableData) {\n return [{ count: 0 }];\n }\n\n const whereMatch = sql.match(/WHERE\\s+(.+?)(?:\\s+ORDER|\\s+LIMIT|\\s*$)/i);\n if (whereMatch?.[1]) {\n const filter = (row: Record<string, unknown>) =>\n this.matchesWhere(row, whereMatch[1]!, params, 0);\n const count = tableData.rows.filter(filter).length;\n return [{ count }];\n }\n\n return [{ count: tableData.rows.length }];\n }\n\n const tableMatch = sql.match(/FROM\\s+`?(\\w+)`?/i);\n if (!tableMatch?.[1]) {\n return [];\n }\n\n const tableName = tableMatch[1];\n const tableData = this.data.get(tableName);\n if (!tableData) {\n return [];\n }\n\n let rows = [...tableData.rows];\n\n const whereMatch = sql.match(/WHERE\\s+(.+?)(?:\\s+ORDER\\s+BY|\\s+LIMIT|\\s*$)/i);\n if (whereMatch?.[1]) {\n rows = rows.filter((row) => this.matchesWhere(row, whereMatch[1]!, params, 0));\n }\n\n const orderMatch = sql.match(/ORDER\\s+BY\\s+(.+?)(?:\\s+LIMIT|\\s*$)/i);\n if (orderMatch?.[1]) {\n const orders = orderMatch[1].split(\",\");\n rows.sort((a, b) => {\n for (const orderClause of orders) {\n const [col, dir] = orderClause.trim().split(/\\s+/);\n const colName = col?.replace(/`/g, \"\") ?? \"\";\n const aVal = (a as any)[colName];\n const bVal = (b as any)[colName];\n if (aVal < bVal) {\n return dir?.toUpperCase() === \"DESC\" ? 1 : -1;\n }\n if (aVal > bVal) {\n return dir?.toUpperCase() === \"DESC\" ? -1 : 1;\n }\n }\n return 0;\n });\n }\n\n const limitMatch = sql.match(/LIMIT\\s+(\\d+)(?:\\s+OFFSET\\s+(\\d+)|\\s*,\\s*(\\d+))?/i);\n if (limitMatch) {\n const limit = Number.parseInt(limitMatch[1]!, 10);\n const offset = limitMatch[2]\n ? Number.parseInt(limitMatch[2], 10)\n : limitMatch[3]\n ? Number.parseInt(limitMatch[3], 10)\n : 0;\n rows = rows.slice(offset, offset + limit);\n }\n\n return rows.map((r) => ({ ...r }));\n }\n\n private matchesWhere(\n row: Record<string, unknown>,\n whereStr: string,\n params: unknown[],\n paramOffset: number,\n ): boolean {\n return this.evaluateWhereExpression(row, whereStr, params, paramOffset).matched;\n }\n\n private evaluateWhereExpression(\n row: Record<string, unknown>,\n expr: string,\n params: unknown[],\n startParamIdx: number,\n ): { matched: boolean; paramIdx: number } {\n let paramIdx = startParamIdx;\n expr = expr.trim();\n\n if (expr.startsWith(\"(\") && expr.endsWith(\")\")) {\n const result = this.evaluateWhereExpression(row, expr.slice(1, -1), params, paramIdx);\n return result;\n }\n const orClauses = this.splitByTopLevel(expr, \"OR\");\n if (orClauses.length > 1) {\n for (const orClause of orClauses) {\n const result = this.evaluateWhereExpression(row, orClause.trim(), params, paramIdx);\n paramIdx = result.paramIdx;\n if (result.matched) {\n return { matched: true, paramIdx };\n }\n }\n return { matched: false, paramIdx };\n }\n\n const andClauses = this.splitByTopLevel(expr, \"AND\");\n if (andClauses.length > 1) {\n for (const andClause of andClauses) {\n const result = this.evaluateWhereExpression(row, andClause.trim(), params, paramIdx);\n paramIdx = result.paramIdx;\n if (!result.matched) {\n return { matched: false, paramIdx };\n }\n }\n return { matched: true, paramIdx };\n }\n\n return this.evaluateSingleCondition(row, expr, params, paramIdx);\n }\n\n private splitByTopLevel(expr: string, operator: string): string[] {\n const parts: string[] = [];\n let current = \"\";\n let parenDepth = 0;\n\n const opRegex = new RegExp(`\\\\s+${operator}\\\\s+`, \"i\");\n let i = 0;\n\n while (i < expr.length) {\n const char = expr[i];\n\n if (char === \"(\") {\n parenDepth++;\n current += char;\n i++;\n } else if (char === \")\") {\n parenDepth--;\n current += char;\n i++;\n } else if (parenDepth === 0) {\n const remaining = expr.slice(i);\n const match = remaining.match(opRegex);\n\n if (match && match.index === 0) {\n if (current.trim()) {\n parts.push(current.trim());\n }\n i += match[0]!.length;\n current = \"\";\n } else {\n current += char;\n i++;\n }\n } else {\n current += char;\n i++;\n }\n }\n\n if (current.trim()) {\n parts.push(current.trim());\n }\n\n return parts.length > 0 ? parts : [expr];\n }\n\n private evaluateSingleCondition(\n row: Record<string, unknown>,\n condition: string,\n params: unknown[],\n paramIdx: number,\n ): { matched: boolean; paramIdx: number } {\n condition = condition.trim();\n\n const notInMatch = condition.match(/`?(\\w+)`?\\s+NOT\\s+IN\\s+\\(([^)]*)\\)/i);\n if (notInMatch) {\n const col = notInMatch[1]!;\n const placeholders = notInMatch[2]!.split(\",\").map((p) => p.trim());\n const values: unknown[] = [];\n for (const placeholder of placeholders) {\n if (placeholder === \"?\") {\n values.push(params[paramIdx]);\n paramIdx++;\n }\n }\n const matched = !values.includes(row[col]);\n return { matched, paramIdx };\n }\n\n const inMatch = condition.match(/`?(\\w+)`?\\s+IN\\s+\\(([^)]*)\\)/i);\n if (inMatch) {\n const col = inMatch[1]!;\n const placeholders = inMatch[2]!.split(\",\").map((p) => p.trim());\n const values: unknown[] = [];\n for (const placeholder of placeholders) {\n if (placeholder === \"?\") {\n values.push(params[paramIdx]);\n paramIdx++;\n }\n }\n const matched = values.includes(row[col]);\n return { matched, paramIdx };\n }\n\n const eqMatch = condition.match(/`?(\\w+)`?\\s*=\\s*\\?/);\n if (eqMatch) {\n const matched = row[eqMatch[1]!] === params[paramIdx];\n return { matched, paramIdx: paramIdx + 1 };\n }\n\n const neqMatch = condition.match(/`?(\\w+)`?\\s*!=\\s*\\?/);\n if (neqMatch) {\n const matched = row[neqMatch[1]!] !== params[paramIdx];\n return { matched, paramIdx: paramIdx + 1 };\n }\n\n const gtMatch = condition.match(/`?(\\w+)`?\\s*>\\s*\\?/);\n if (gtMatch) {\n const matched = (row[gtMatch[1]!] as any) > (params[paramIdx] as any);\n return { matched, paramIdx: paramIdx + 1 };\n }\n\n const gteMatch = condition.match(/`?(\\w+)`?\\s*>=\\s*\\?/);\n if (gteMatch) {\n const matched = (row[gteMatch[1]!] as any) >= (params[paramIdx] as any);\n return { matched, paramIdx: paramIdx + 1 };\n }\n\n const ltMatch = condition.match(/`?(\\w+)`?\\s*<\\s*\\?/);\n if (ltMatch) {\n const matched = (row[ltMatch[1]!] as any) < (params[paramIdx] as any);\n return { matched, paramIdx: paramIdx + 1 };\n }\n\n const lteMatch = condition.match(/`?(\\w+)`?\\s*<=\\s*\\?/);\n if (lteMatch) {\n const matched = (row[lteMatch[1]!] as any) <= (params[paramIdx] as any);\n return { matched, paramIdx: paramIdx + 1 };\n }\n\n const notLikeMatch = condition.match(/`?(\\w+)`?\\s+NOT\\s+LIKE\\s+\\?/i);\n if (notLikeMatch) {\n const pattern = (params[paramIdx] as string).replace(/%/g, \".*\");\n const matched = !new RegExp(`^${pattern}$`).test(String(row[notLikeMatch[1]!]));\n return { matched, paramIdx: paramIdx + 1 };\n }\n\n const likeMatch = condition.match(/`?(\\w+)`?\\s+LIKE\\s+\\?/i);\n if (likeMatch) {\n const pattern = (params[paramIdx] as string).replace(/%/g, \".*\");\n const matched = new RegExp(`^${pattern}$`).test(String(row[likeMatch[1]!]));\n return { matched, paramIdx: paramIdx + 1 };\n }\n\n return { matched: true, paramIdx };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"s3.cjs","names":["BaseDriver","DriverError"],"sources":["../../src/drivers/s3.ts"],"sourcesContent":["import { DriverError } from \"../errors\";\nimport type { ColumnMetadata, S3ConnectionConfig, TableMetadata } from \"../types\";\nimport { BaseDriver } from \"./driver\";\n\ninterface S3TableData {\n rows: Record<string, unknown>[];\n autoIncrementId: number;\n meta: {\n columns: ColumnMetadata[];\n };\n}\n\n/**\n * S3-based database driver using JSON objects for storage\n */\nexport class S3Driver extends BaseDriver {\n readonly dialect = \"s3\" as const;\n private config: S3ConnectionConfig;\n private data = new Map<string, S3TableData>();\n private client: any = null;\n\n constructor(config: S3ConnectionConfig) {\n super();\n this.config = config;\n }\n\n private getKey(tableName: string): string {\n const prefix = this.config.prefix ? `${this.config.prefix}/` : \"\";\n return `${prefix}${tableName}.json`;\n }\n\n async connect(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n try {\n const { S3Client, HeadBucketCommand } = await import(\"@aws-sdk/client-s3\");\n const clientConfig: any = {};\n if (this.config.region) {\n clientConfig.region = this.config.region;\n }\n if (this.config.endpoint) {\n clientConfig.endpoint = this.config.endpoint;\n clientConfig.forcePathStyle = true;\n }\n if (this.config.accessKeyId && this.config.secretAccessKey) {\n clientConfig.credentials = {\n accessKeyId: this.config.accessKeyId,\n secretAccessKey: this.config.secretAccessKey,\n };\n }\n this.client = new S3Client(clientConfig);\n\n try {\n await this.client.send(new HeadBucketCommand({ Bucket: this.config.bucket }));\n } catch (err: any) {\n if (err.name === \"NotFound\" || err.$metadata?.httpStatusCode === 404) {\n const { CreateBucketCommand } = await import(\"@aws-sdk/client-s3\");\n await this.client.send(new CreateBucketCommand({ Bucket: this.config.bucket }));\n } else if (err.$metadata?.httpStatusCode !== 200) {\n throw err;\n }\n }\n\n await this.loadAll();\n this.connected = true;\n } catch (err: any) {\n throw new DriverError(`Failed to connect to S3: ${err.message}`);\n }\n }\n\n async disconnect(): Promise<void> {\n await this.flushAll();\n this.data.clear();\n this.client = null;\n this.connected = false;\n }\n\n async execute(sql: string, params: unknown[] = []): Promise<any> {\n return this.executeParsed(sql, params);\n }\n\n async query(sql: string, params: unknown[] = []): Promise<any[]> {\n const result = this.executeParsed(sql, params);\n return Array.isArray(result) ? result : [];\n }\n\n async tableExists(name: string): Promise<boolean> {\n return this.data.has(name);\n }\n\n async getTableColumns(name: string): Promise<ColumnMetadata[]> {\n const table = this.data.get(name);\n if (!table) {\n return [];\n }\n return Object.values(table.meta.columns);\n }\n\n async createTable(meta: TableMetadata): Promise<void> {\n if (this.data.has(meta.name)) {\n return;\n }\n this.data.set(meta.name, {\n rows: [],\n autoIncrementId: 0,\n meta: { columns: [...meta.columns] },\n });\n await this.flush(meta.name);\n }\n\n async dropTable(name: string): Promise<void> {\n this.data.delete(name);\n try {\n const { DeleteObjectCommand } = await import(\"@aws-sdk/client-s3\");\n await this.client.send(\n new DeleteObjectCommand({\n Bucket: this.config.bucket,\n Key: this.getKey(name),\n }),\n );\n } catch {}\n }\n\n async addColumn(table: string, column: ColumnMetadata): Promise<void> {\n const tableData = this.data.get(table);\n if (!tableData) {\n throw new DriverError(`Table \"${table}\" does not exist`);\n }\n tableData.meta.columns.push(column);\n for (const row of tableData.rows) {\n row[column.name] = column.defaultValue ?? null;\n }\n await this.flush(table);\n }\n\n async dropColumn(table: string, name: string): Promise<void> {\n const tableData = this.data.get(table);\n if (!tableData) {\n throw new DriverError(`Table \"${table}\" does not exist`);\n }\n tableData.meta.columns = tableData.meta.columns.filter((c) => c.name !== name);\n for (const row of tableData.rows) {\n delete row[name];\n }\n await this.flush(table);\n }\n\n async renameColumn(table: string, oldName: string, newName: string): Promise<void> {\n const tableData = this.data.get(table);\n if (!tableData) {\n throw new DriverError(`Table \"${table}\" does not exist`);\n }\n const col = tableData.meta.columns.find((c) => c.name === oldName);\n if (col) {\n col.name = newName;\n }\n for (const row of tableData.rows) {\n row[newName] = row[oldName];\n delete row[oldName];\n }\n await this.flush(table);\n }\n\n async transaction<T>(fn: () => Promise<T>): Promise<T> {\n const snapshot = new Map<string, string>();\n for (const [name, tableData] of this.data) {\n snapshot.set(name, JSON.stringify(tableData));\n }\n try {\n const result = await fn();\n await this.flushAll();\n return result;\n } catch (err) {\n for (const [name, json] of snapshot) {\n this.data.set(name, JSON.parse(json));\n }\n throw err;\n }\n }\n\n async getAllTableColumns(): Promise<Record<string, ColumnMetadata[]>> {\n const result: Record<string, ColumnMetadata[]> = {};\n for (const [name, tableData] of this.data) {\n result[name] = [...tableData.meta.columns];\n }\n return result;\n }\n\n private async loadAll(): Promise<void> {\n try {\n const { ListObjectsV2Command, GetObjectCommand } = await import(\"@aws-sdk/client-s3\");\n const prefix = this.config.prefix ? `${this.config.prefix}/` : \"\";\n const response = await this.client.send(\n new ListObjectsV2Command({\n Bucket: this.config.bucket,\n Prefix: prefix,\n }),\n );\n\n if (response.Contents) {\n for (const obj of response.Contents) {\n if (obj.Key?.endsWith(\".json\")) {\n const tableName = obj.Key.replace(prefix, \"\").replace(\".json\", \"\");\n try {\n const getResponse = await this.client.send(\n new GetObjectCommand({\n Bucket: this.config.bucket,\n Key: obj.Key,\n }),\n );\n const body = await getResponse.Body?.transformToString();\n if (body) {\n this.data.set(tableName, JSON.parse(body));\n }\n } catch {}\n }\n }\n }\n } catch {}\n }\n\n private async flush(tableName: string): Promise<void> {\n const tableData = this.data.get(tableName);\n if (!tableData || !this.client) {\n return;\n }\n try {\n const { PutObjectCommand } = await import(\"@aws-sdk/client-s3\");\n await this.client.send(\n new PutObjectCommand({\n Bucket: this.config.bucket,\n Key: this.getKey(tableName),\n Body: JSON.stringify(tableData),\n ContentType: \"application/json\",\n }),\n );\n } catch {}\n }\n\n private async flushAll(): Promise<void> {\n for (const [name] of this.data) {\n await this.flush(name);\n }\n }\n\n private executeParsed(sql: string, params: unknown[]): any {\n const trimmed = sql.trim().toUpperCase();\n\n if (trimmed.startsWith(\"CREATE TABLE\")) {\n return { insertId: 0, affectedRows: 0 };\n }\n\n if (trimmed.startsWith(\"DROP TABLE\")) {\n const match = sql.match(/DROP\\s+TABLE\\s+(?:IF\\s+EXISTS\\s+)?`?(\\w+)`?/i);\n if (match?.[1]) {\n this.data.delete(match[1]);\n }\n return { insertId: 0, affectedRows: 0 };\n }\n\n if (trimmed.startsWith(\"INSERT\")) {\n return this.handleInsert(sql, params);\n }\n\n if (trimmed.startsWith(\"UPDATE\")) {\n return this.handleUpdate(sql, params);\n }\n\n if (trimmed.startsWith(\"DELETE\")) {\n return this.handleDelete(sql, params);\n }\n\n if (trimmed.startsWith(\"SELECT\")) {\n return this.handleSelect(sql, params);\n }\n\n return { insertId: 0, affectedRows: 0 };\n }\n\n private handleInsert(sql: string, params: unknown[]): any {\n const tableMatch = sql.match(/INTO\\s+`?(\\w+)`?/i);\n if (!tableMatch?.[1]) {\n return { insertId: 0, affectedRows: 0 };\n }\n\n const tableName = tableMatch[1];\n const tableData = this.data.get(tableName);\n if (!tableData) {\n return { insertId: 0, affectedRows: 0 };\n }\n\n const colMatch = sql.match(/\\(([^)]+)\\)\\s+VALUES/i);\n if (!colMatch?.[1]) {\n return { insertId: 0, affectedRows: 0 };\n }\n\n const cols = colMatch[1]\n .split(\",\")\n .map((c) => c.trim().replace(/`/g, \"\"))\n .filter(Boolean);\n\n const rowCount = Math.floor(params.length / cols.length);\n\n let insertId = 0;\n let pkCol: string | null = null;\n for (const col of tableData.meta.columns) {\n if (col.autoIncrement) {\n pkCol = col.name;\n break;\n }\n }\n\n for (let rowIdx = 0; rowIdx < rowCount; rowIdx++) {\n const row: Record<string, unknown> = {};\n const rowParamStart = rowIdx * cols.length;\n\n for (let i = 0; i < cols.length; i++) {\n const col = cols[i];\n if (col) {\n row[col] = params[rowParamStart + i];\n }\n }\n\n if (pkCol && row[pkCol] === undefined) {\n tableData.autoIncrementId++;\n row[pkCol] = tableData.autoIncrementId;\n if (rowIdx === 0) {\n insertId = tableData.autoIncrementId;\n }\n } else if (pkCol && row[pkCol]) {\n if (rowIdx === 0) {\n insertId = row[pkCol] as number;\n }\n }\n\n tableData.rows.push({ ...row });\n }\n\n this.flush(tableName);\n\n return { insertId, affectedRows: rowCount };\n }\n\n private handleUpdate(sql: string, params: unknown[]): any {\n const tableMatch = sql.match(/UPDATE\\s+`?(\\w+)`?/i);\n if (!tableMatch?.[1]) {\n return { affectedRows: 0 };\n }\n\n const tableName = tableMatch[1];\n const tableData = this.data.get(tableName);\n if (!tableData) {\n return { affectedRows: 0 };\n }\n\n const setMatch = sql.match(/SET\\s+(.+?)\\s+WHERE/i) || sql.match(/SET\\s+(.+)$/i);\n if (!setMatch?.[1]) {\n return { affectedRows: 0 };\n }\n\n const setClauses = setMatch[1].split(\",\");\n const updates: Record<string, unknown> = {};\n let paramIndex = 0;\n\n for (const clause of setClauses) {\n const eqMatch = clause.match(/`?(\\w+)`?\\s*=\\s*\\?/);\n if (eqMatch?.[1]) {\n updates[eqMatch[1]] = params[paramIndex];\n paramIndex++;\n }\n }\n\n const whereMatch = sql.match(/WHERE\\s+(.+)$/i);\n const whereConditions = whereMatch?.[1] || \"\";\n\n let affectedRows = 0;\n for (const row of tableData.rows) {\n if (this.matchesWhere(row, whereConditions, params, paramIndex)) {\n Object.assign(row, updates);\n affectedRows++;\n }\n }\n\n if (affectedRows > 0) {\n this.flush(tableName);\n }\n\n return { affectedRows };\n }\n\n private handleDelete(sql: string, params: unknown[]): any {\n const tableMatch = sql.match(/FROM\\s+`?(\\w+)`?/i);\n if (!tableMatch?.[1]) {\n return { affectedRows: 0 };\n }\n\n const tableName = tableMatch[1];\n const tableData = this.data.get(tableName);\n if (!tableData) {\n return { affectedRows: 0 };\n }\n\n const whereMatch = sql.match(/WHERE\\s+(.+)$/i);\n if (!whereMatch?.[1]) {\n const affectedRows = tableData.rows.length;\n tableData.rows = [];\n if (affectedRows > 0) {\n this.flush(tableName);\n }\n return { affectedRows };\n }\n\n const whereConditions = whereMatch[1];\n const before = tableData.rows.length;\n\n tableData.rows = tableData.rows.filter(\n (row) => !this.matchesWhere(row, whereConditions, params, 0),\n );\n\n const affectedRows = before - tableData.rows.length;\n if (affectedRows > 0) {\n this.flush(tableName);\n }\n\n return { affectedRows };\n }\n\n private handleSelect(sql: string, params: unknown[]): any {\n const countMatch = sql.match(/SELECT\\s+COUNT\\s*\\(\\s*\\*\\s*\\)\\s+as\\s+(\\w+)/i);\n if (countMatch) {\n const tableMatch = sql.match(/FROM\\s+`?(\\w+)`?/i);\n if (!tableMatch?.[1]) {\n return [];\n }\n const tableName = tableMatch[1];\n const tableData = this.data.get(tableName);\n if (!tableData) {\n return [{ count: 0 }];\n }\n\n const whereMatch = sql.match(/WHERE\\s+(.+?)(?:\\s+ORDER|\\s+LIMIT|\\s*$)/i);\n if (whereMatch?.[1]) {\n const filter = (row: Record<string, unknown>) =>\n this.matchesWhere(row, whereMatch[1]!, params, 0);\n const count = tableData.rows.filter(filter).length;\n return [{ count }];\n }\n\n return [{ count: tableData.rows.length }];\n }\n\n const tableMatch = sql.match(/FROM\\s+`?(\\w+)`?/i);\n if (!tableMatch?.[1]) {\n return [];\n }\n\n const tableName = tableMatch[1];\n const tableData = this.data.get(tableName);\n if (!tableData) {\n return [];\n }\n\n let rows = [...tableData.rows];\n\n const whereMatch = sql.match(/WHERE\\s+(.+?)(?:\\s+ORDER\\s+BY|\\s+LIMIT|\\s*$)/i);\n if (whereMatch?.[1]) {\n rows = rows.filter((row) => this.matchesWhere(row, whereMatch[1]!, params, 0));\n }\n\n const orderMatch = sql.match(/ORDER\\s+BY\\s+(.+?)(?:\\s+LIMIT|\\s*$)/i);\n if (orderMatch?.[1]) {\n const orders = orderMatch[1].split(\",\");\n rows.sort((a, b) => {\n for (const orderClause of orders) {\n const [col, dir] = orderClause.trim().split(/\\s+/);\n const colName = col?.replace(/`/g, \"\") ?? \"\";\n const aVal = (a as any)[colName];\n const bVal = (b as any)[colName];\n if (aVal < bVal) {\n return dir?.toUpperCase() === \"DESC\" ? 1 : -1;\n }\n if (aVal > bVal) {\n return dir?.toUpperCase() === \"DESC\" ? -1 : 1;\n }\n }\n return 0;\n });\n }\n\n const limitMatch = sql.match(/LIMIT\\s+(\\d+)(?:\\s+OFFSET\\s+(\\d+)|\\s*,\\s*(\\d+))?/i);\n if (limitMatch) {\n const limit = Number.parseInt(limitMatch[1]!, 10);\n const offset = limitMatch[2]\n ? Number.parseInt(limitMatch[2], 10)\n : limitMatch[3]\n ? Number.parseInt(limitMatch[3], 10)\n : 0;\n rows = rows.slice(offset, offset + limit);\n }\n\n return rows.map((r) => ({ ...r }));\n }\n\n private matchesWhere(\n row: Record<string, unknown>,\n whereStr: string,\n params: unknown[],\n paramOffset: number,\n ): boolean {\n return this.evaluateWhereExpression(row, whereStr, params, paramOffset).matched;\n }\n\n private evaluateWhereExpression(\n row: Record<string, unknown>,\n expr: string,\n params: unknown[],\n startParamIdx: number,\n ): { matched: boolean; paramIdx: number } {\n let paramIdx = startParamIdx;\n expr = expr.trim();\n\n if (expr.startsWith(\"(\") && expr.endsWith(\")\")) {\n const result = this.evaluateWhereExpression(row, expr.slice(1, -1), params, paramIdx);\n return result;\n }\n const orClauses = this.splitByTopLevel(expr, \"OR\");\n if (orClauses.length > 1) {\n for (const orClause of orClauses) {\n const result = this.evaluateWhereExpression(row, orClause.trim(), params, paramIdx);\n paramIdx = result.paramIdx;\n if (result.matched) {\n return { matched: true, paramIdx };\n }\n }\n return { matched: false, paramIdx };\n }\n\n const andClauses = this.splitByTopLevel(expr, \"AND\");\n if (andClauses.length > 1) {\n for (const andClause of andClauses) {\n const result = this.evaluateWhereExpression(row, andClause.trim(), params, paramIdx);\n paramIdx = result.paramIdx;\n if (!result.matched) {\n return { matched: false, paramIdx };\n }\n }\n return { matched: true, paramIdx };\n }\n\n return this.evaluateSingleCondition(row, expr, params, paramIdx);\n }\n\n private splitByTopLevel(expr: string, operator: string): string[] {\n const parts: string[] = [];\n let current = \"\";\n let parenDepth = 0;\n\n const opRegex = new RegExp(`\\\\s+${operator}\\\\s+`, \"i\");\n let i = 0;\n\n while (i < expr.length) {\n const char = expr[i];\n\n if (char === \"(\") {\n parenDepth++;\n current += char;\n i++;\n } else if (char === \")\") {\n parenDepth--;\n current += char;\n i++;\n } else if (parenDepth === 0) {\n const remaining = expr.slice(i);\n const match = remaining.match(opRegex);\n\n if (match && match.index === 0) {\n if (current.trim()) {\n parts.push(current.trim());\n }\n i += match[0]!.length;\n current = \"\";\n } else {\n current += char;\n i++;\n }\n } else {\n current += char;\n i++;\n }\n }\n\n if (current.trim()) {\n parts.push(current.trim());\n }\n\n return parts.length > 0 ? parts : [expr];\n }\n\n private evaluateSingleCondition(\n row: Record<string, unknown>,\n condition: string,\n params: unknown[],\n paramIdx: number,\n ): { matched: boolean; paramIdx: number } {\n condition = condition.trim();\n\n const notInMatch = condition.match(/`?(\\w+)`?\\s+NOT\\s+IN\\s+\\(([^)]*)\\)/i);\n if (notInMatch) {\n const col = notInMatch[1]!;\n const placeholders = notInMatch[2]!.split(\",\").map((p) => p.trim());\n const values: unknown[] = [];\n for (const placeholder of placeholders) {\n if (placeholder === \"?\") {\n values.push(params[paramIdx]);\n paramIdx++;\n }\n }\n const matched = !values.includes(row[col]);\n return { matched, paramIdx };\n }\n\n const inMatch = condition.match(/`?(\\w+)`?\\s+IN\\s+\\(([^)]*)\\)/i);\n if (inMatch) {\n const col = inMatch[1]!;\n const placeholders = inMatch[2]!.split(\",\").map((p) => p.trim());\n const values: unknown[] = [];\n for (const placeholder of placeholders) {\n if (placeholder === \"?\") {\n values.push(params[paramIdx]);\n paramIdx++;\n }\n }\n const matched = values.includes(row[col]);\n return { matched, paramIdx };\n }\n\n const eqMatch = condition.match(/`?(\\w+)`?\\s*=\\s*\\?/);\n if (eqMatch) {\n const matched = row[eqMatch[1]!] === params[paramIdx];\n return { matched, paramIdx: paramIdx + 1 };\n }\n\n const neqMatch = condition.match(/`?(\\w+)`?\\s*!=\\s*\\?/);\n if (neqMatch) {\n const matched = row[neqMatch[1]!] !== params[paramIdx];\n return { matched, paramIdx: paramIdx + 1 };\n }\n\n const gtMatch = condition.match(/`?(\\w+)`?\\s*>\\s*\\?/);\n if (gtMatch) {\n const matched = (row[gtMatch[1]!] as any) > (params[paramIdx] as any);\n return { matched, paramIdx: paramIdx + 1 };\n }\n\n const gteMatch = condition.match(/`?(\\w+)`?\\s*>=\\s*\\?/);\n if (gteMatch) {\n const matched = (row[gteMatch[1]!] as any) >= (params[paramIdx] as any);\n return { matched, paramIdx: paramIdx + 1 };\n }\n\n const ltMatch = condition.match(/`?(\\w+)`?\\s*<\\s*\\?/);\n if (ltMatch) {\n const matched = (row[ltMatch[1]!] as any) < (params[paramIdx] as any);\n return { matched, paramIdx: paramIdx + 1 };\n }\n\n const lteMatch = condition.match(/`?(\\w+)`?\\s*<=\\s*\\?/);\n if (lteMatch) {\n const matched = (row[lteMatch[1]!] as any) <= (params[paramIdx] as any);\n return { matched, paramIdx: paramIdx + 1 };\n }\n\n const notLikeMatch = condition.match(/`?(\\w+)`?\\s+NOT\\s+LIKE\\s+\\?/i);\n if (notLikeMatch) {\n const pattern = (params[paramIdx] as string).replace(/%/g, \".*\");\n const matched = !new RegExp(`^${pattern}$`).test(String(row[notLikeMatch[1]!]));\n return { matched, paramIdx: paramIdx + 1 };\n }\n\n const likeMatch = condition.match(/`?(\\w+)`?\\s+LIKE\\s+\\?/i);\n if (likeMatch) {\n const pattern = (params[paramIdx] as string).replace(/%/g, \".*\");\n const matched = new RegExp(`^${pattern}$`).test(String(row[likeMatch[1]!]));\n return { matched, paramIdx: paramIdx + 1 };\n }\n\n return { matched: true, paramIdx };\n }\n}\n"],"mappings":"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"}
@@ -7,6 +7,7 @@ var init_s3 = __esmMin((() => {
7
7
  init_errors();
8
8
  init_driver();
9
9
  S3Driver = class extends BaseDriver {
10
+ dialect = "s3";
10
11
  config;
11
12
  data = /* @__PURE__ */ new Map();
12
13
  client = null;
@@ -1 +1 @@
1
- {"version":3,"file":"s3.mjs","names":[],"sources":["../../src/drivers/s3.ts"],"sourcesContent":["import { DriverError } from \"../errors\";\nimport type { ColumnMetadata, S3ConnectionConfig, TableMetadata } from \"../types\";\nimport { BaseDriver } from \"./driver\";\n\ninterface S3TableData {\n rows: Record<string, unknown>[];\n autoIncrementId: number;\n meta: {\n columns: ColumnMetadata[];\n };\n}\n\n/**\n * S3-based database driver using JSON objects for storage\n */\nexport class S3Driver extends BaseDriver {\n private config: S3ConnectionConfig;\n private data = new Map<string, S3TableData>();\n private client: any = null;\n\n constructor(config: S3ConnectionConfig) {\n super();\n this.config = config;\n }\n\n private getKey(tableName: string): string {\n const prefix = this.config.prefix ? `${this.config.prefix}/` : \"\";\n return `${prefix}${tableName}.json`;\n }\n\n async connect(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n try {\n const { S3Client, HeadBucketCommand } = await import(\"@aws-sdk/client-s3\");\n const clientConfig: any = {};\n if (this.config.region) {\n clientConfig.region = this.config.region;\n }\n if (this.config.endpoint) {\n clientConfig.endpoint = this.config.endpoint;\n clientConfig.forcePathStyle = true;\n }\n if (this.config.accessKeyId && this.config.secretAccessKey) {\n clientConfig.credentials = {\n accessKeyId: this.config.accessKeyId,\n secretAccessKey: this.config.secretAccessKey,\n };\n }\n this.client = new S3Client(clientConfig);\n\n try {\n await this.client.send(new HeadBucketCommand({ Bucket: this.config.bucket }));\n } catch (err: any) {\n if (err.name === \"NotFound\" || err.$metadata?.httpStatusCode === 404) {\n const { CreateBucketCommand } = await import(\"@aws-sdk/client-s3\");\n await this.client.send(new CreateBucketCommand({ Bucket: this.config.bucket }));\n } else if (err.$metadata?.httpStatusCode !== 200) {\n throw err;\n }\n }\n\n await this.loadAll();\n this.connected = true;\n } catch (err: any) {\n throw new DriverError(`Failed to connect to S3: ${err.message}`);\n }\n }\n\n async disconnect(): Promise<void> {\n await this.flushAll();\n this.data.clear();\n this.client = null;\n this.connected = false;\n }\n\n async execute(sql: string, params: unknown[] = []): Promise<any> {\n return this.executeParsed(sql, params);\n }\n\n async query(sql: string, params: unknown[] = []): Promise<any[]> {\n const result = this.executeParsed(sql, params);\n return Array.isArray(result) ? result : [];\n }\n\n async tableExists(name: string): Promise<boolean> {\n return this.data.has(name);\n }\n\n async getTableColumns(name: string): Promise<ColumnMetadata[]> {\n const table = this.data.get(name);\n if (!table) {\n return [];\n }\n return Object.values(table.meta.columns);\n }\n\n async createTable(meta: TableMetadata): Promise<void> {\n if (this.data.has(meta.name)) {\n return;\n }\n this.data.set(meta.name, {\n rows: [],\n autoIncrementId: 0,\n meta: { columns: [...meta.columns] },\n });\n await this.flush(meta.name);\n }\n\n async dropTable(name: string): Promise<void> {\n this.data.delete(name);\n try {\n const { DeleteObjectCommand } = await import(\"@aws-sdk/client-s3\");\n await this.client.send(\n new DeleteObjectCommand({\n Bucket: this.config.bucket,\n Key: this.getKey(name),\n }),\n );\n } catch {}\n }\n\n async addColumn(table: string, column: ColumnMetadata): Promise<void> {\n const tableData = this.data.get(table);\n if (!tableData) {\n throw new DriverError(`Table \"${table}\" does not exist`);\n }\n tableData.meta.columns.push(column);\n for (const row of tableData.rows) {\n row[column.name] = column.defaultValue ?? null;\n }\n await this.flush(table);\n }\n\n async dropColumn(table: string, name: string): Promise<void> {\n const tableData = this.data.get(table);\n if (!tableData) {\n throw new DriverError(`Table \"${table}\" does not exist`);\n }\n tableData.meta.columns = tableData.meta.columns.filter((c) => c.name !== name);\n for (const row of tableData.rows) {\n delete row[name];\n }\n await this.flush(table);\n }\n\n async renameColumn(table: string, oldName: string, newName: string): Promise<void> {\n const tableData = this.data.get(table);\n if (!tableData) {\n throw new DriverError(`Table \"${table}\" does not exist`);\n }\n const col = tableData.meta.columns.find((c) => c.name === oldName);\n if (col) {\n col.name = newName;\n }\n for (const row of tableData.rows) {\n row[newName] = row[oldName];\n delete row[oldName];\n }\n await this.flush(table);\n }\n\n async transaction<T>(fn: () => Promise<T>): Promise<T> {\n const snapshot = new Map<string, string>();\n for (const [name, tableData] of this.data) {\n snapshot.set(name, JSON.stringify(tableData));\n }\n try {\n const result = await fn();\n await this.flushAll();\n return result;\n } catch (err) {\n for (const [name, json] of snapshot) {\n this.data.set(name, JSON.parse(json));\n }\n throw err;\n }\n }\n\n async getAllTableColumns(): Promise<Record<string, ColumnMetadata[]>> {\n const result: Record<string, ColumnMetadata[]> = {};\n for (const [name, tableData] of this.data) {\n result[name] = [...tableData.meta.columns];\n }\n return result;\n }\n\n private async loadAll(): Promise<void> {\n try {\n const { ListObjectsV2Command, GetObjectCommand } = await import(\"@aws-sdk/client-s3\");\n const prefix = this.config.prefix ? `${this.config.prefix}/` : \"\";\n const response = await this.client.send(\n new ListObjectsV2Command({\n Bucket: this.config.bucket,\n Prefix: prefix,\n }),\n );\n\n if (response.Contents) {\n for (const obj of response.Contents) {\n if (obj.Key?.endsWith(\".json\")) {\n const tableName = obj.Key.replace(prefix, \"\").replace(\".json\", \"\");\n try {\n const getResponse = await this.client.send(\n new GetObjectCommand({\n Bucket: this.config.bucket,\n Key: obj.Key,\n }),\n );\n const body = await getResponse.Body?.transformToString();\n if (body) {\n this.data.set(tableName, JSON.parse(body));\n }\n } catch {}\n }\n }\n }\n } catch {}\n }\n\n private async flush(tableName: string): Promise<void> {\n const tableData = this.data.get(tableName);\n if (!tableData || !this.client) {\n return;\n }\n try {\n const { PutObjectCommand } = await import(\"@aws-sdk/client-s3\");\n await this.client.send(\n new PutObjectCommand({\n Bucket: this.config.bucket,\n Key: this.getKey(tableName),\n Body: JSON.stringify(tableData),\n ContentType: \"application/json\",\n }),\n );\n } catch {}\n }\n\n private async flushAll(): Promise<void> {\n for (const [name] of this.data) {\n await this.flush(name);\n }\n }\n\n private executeParsed(sql: string, params: unknown[]): any {\n const trimmed = sql.trim().toUpperCase();\n\n if (trimmed.startsWith(\"CREATE TABLE\")) {\n return { insertId: 0, affectedRows: 0 };\n }\n\n if (trimmed.startsWith(\"DROP TABLE\")) {\n const match = sql.match(/DROP\\s+TABLE\\s+(?:IF\\s+EXISTS\\s+)?`?(\\w+)`?/i);\n if (match?.[1]) {\n this.data.delete(match[1]);\n }\n return { insertId: 0, affectedRows: 0 };\n }\n\n if (trimmed.startsWith(\"INSERT\")) {\n return this.handleInsert(sql, params);\n }\n\n if (trimmed.startsWith(\"UPDATE\")) {\n return this.handleUpdate(sql, params);\n }\n\n if (trimmed.startsWith(\"DELETE\")) {\n return this.handleDelete(sql, params);\n }\n\n if (trimmed.startsWith(\"SELECT\")) {\n return this.handleSelect(sql, params);\n }\n\n return { insertId: 0, affectedRows: 0 };\n }\n\n private handleInsert(sql: string, params: unknown[]): any {\n const tableMatch = sql.match(/INTO\\s+`?(\\w+)`?/i);\n if (!tableMatch?.[1]) {\n return { insertId: 0, affectedRows: 0 };\n }\n\n const tableName = tableMatch[1];\n const tableData = this.data.get(tableName);\n if (!tableData) {\n return { insertId: 0, affectedRows: 0 };\n }\n\n const colMatch = sql.match(/\\(([^)]+)\\)\\s+VALUES/i);\n if (!colMatch?.[1]) {\n return { insertId: 0, affectedRows: 0 };\n }\n\n const cols = colMatch[1]\n .split(\",\")\n .map((c) => c.trim().replace(/`/g, \"\"))\n .filter(Boolean);\n\n const rowCount = Math.floor(params.length / cols.length);\n\n let insertId = 0;\n let pkCol: string | null = null;\n for (const col of tableData.meta.columns) {\n if (col.autoIncrement) {\n pkCol = col.name;\n break;\n }\n }\n\n for (let rowIdx = 0; rowIdx < rowCount; rowIdx++) {\n const row: Record<string, unknown> = {};\n const rowParamStart = rowIdx * cols.length;\n\n for (let i = 0; i < cols.length; i++) {\n const col = cols[i];\n if (col) {\n row[col] = params[rowParamStart + i];\n }\n }\n\n if (pkCol && row[pkCol] === undefined) {\n tableData.autoIncrementId++;\n row[pkCol] = tableData.autoIncrementId;\n if (rowIdx === 0) {\n insertId = tableData.autoIncrementId;\n }\n } else if (pkCol && row[pkCol]) {\n if (rowIdx === 0) {\n insertId = row[pkCol] as number;\n }\n }\n\n tableData.rows.push({ ...row });\n }\n\n this.flush(tableName);\n\n return { insertId, affectedRows: rowCount };\n }\n\n private handleUpdate(sql: string, params: unknown[]): any {\n const tableMatch = sql.match(/UPDATE\\s+`?(\\w+)`?/i);\n if (!tableMatch?.[1]) {\n return { affectedRows: 0 };\n }\n\n const tableName = tableMatch[1];\n const tableData = this.data.get(tableName);\n if (!tableData) {\n return { affectedRows: 0 };\n }\n\n const setMatch = sql.match(/SET\\s+(.+?)\\s+WHERE/i) || sql.match(/SET\\s+(.+)$/i);\n if (!setMatch?.[1]) {\n return { affectedRows: 0 };\n }\n\n const setClauses = setMatch[1].split(\",\");\n const updates: Record<string, unknown> = {};\n let paramIndex = 0;\n\n for (const clause of setClauses) {\n const eqMatch = clause.match(/`?(\\w+)`?\\s*=\\s*\\?/);\n if (eqMatch?.[1]) {\n updates[eqMatch[1]] = params[paramIndex];\n paramIndex++;\n }\n }\n\n const whereMatch = sql.match(/WHERE\\s+(.+)$/i);\n const whereConditions = whereMatch?.[1] || \"\";\n\n let affectedRows = 0;\n for (const row of tableData.rows) {\n if (this.matchesWhere(row, whereConditions, params, paramIndex)) {\n Object.assign(row, updates);\n affectedRows++;\n }\n }\n\n if (affectedRows > 0) {\n this.flush(tableName);\n }\n\n return { affectedRows };\n }\n\n private handleDelete(sql: string, params: unknown[]): any {\n const tableMatch = sql.match(/FROM\\s+`?(\\w+)`?/i);\n if (!tableMatch?.[1]) {\n return { affectedRows: 0 };\n }\n\n const tableName = tableMatch[1];\n const tableData = this.data.get(tableName);\n if (!tableData) {\n return { affectedRows: 0 };\n }\n\n const whereMatch = sql.match(/WHERE\\s+(.+)$/i);\n if (!whereMatch?.[1]) {\n const affectedRows = tableData.rows.length;\n tableData.rows = [];\n if (affectedRows > 0) {\n this.flush(tableName);\n }\n return { affectedRows };\n }\n\n const whereConditions = whereMatch[1];\n const before = tableData.rows.length;\n\n tableData.rows = tableData.rows.filter(\n (row) => !this.matchesWhere(row, whereConditions, params, 0),\n );\n\n const affectedRows = before - tableData.rows.length;\n if (affectedRows > 0) {\n this.flush(tableName);\n }\n\n return { affectedRows };\n }\n\n private handleSelect(sql: string, params: unknown[]): any {\n const countMatch = sql.match(/SELECT\\s+COUNT\\s*\\(\\s*\\*\\s*\\)\\s+as\\s+(\\w+)/i);\n if (countMatch) {\n const tableMatch = sql.match(/FROM\\s+`?(\\w+)`?/i);\n if (!tableMatch?.[1]) {\n return [];\n }\n const tableName = tableMatch[1];\n const tableData = this.data.get(tableName);\n if (!tableData) {\n return [{ count: 0 }];\n }\n\n const whereMatch = sql.match(/WHERE\\s+(.+?)(?:\\s+ORDER|\\s+LIMIT|\\s*$)/i);\n if (whereMatch?.[1]) {\n const filter = (row: Record<string, unknown>) =>\n this.matchesWhere(row, whereMatch[1]!, params, 0);\n const count = tableData.rows.filter(filter).length;\n return [{ count }];\n }\n\n return [{ count: tableData.rows.length }];\n }\n\n const tableMatch = sql.match(/FROM\\s+`?(\\w+)`?/i);\n if (!tableMatch?.[1]) {\n return [];\n }\n\n const tableName = tableMatch[1];\n const tableData = this.data.get(tableName);\n if (!tableData) {\n return [];\n }\n\n let rows = [...tableData.rows];\n\n const whereMatch = sql.match(/WHERE\\s+(.+?)(?:\\s+ORDER\\s+BY|\\s+LIMIT|\\s*$)/i);\n if (whereMatch?.[1]) {\n rows = rows.filter((row) => this.matchesWhere(row, whereMatch[1]!, params, 0));\n }\n\n const orderMatch = sql.match(/ORDER\\s+BY\\s+(.+?)(?:\\s+LIMIT|\\s*$)/i);\n if (orderMatch?.[1]) {\n const orders = orderMatch[1].split(\",\");\n rows.sort((a, b) => {\n for (const orderClause of orders) {\n const [col, dir] = orderClause.trim().split(/\\s+/);\n const colName = col?.replace(/`/g, \"\") ?? \"\";\n const aVal = (a as any)[colName];\n const bVal = (b as any)[colName];\n if (aVal < bVal) {\n return dir?.toUpperCase() === \"DESC\" ? 1 : -1;\n }\n if (aVal > bVal) {\n return dir?.toUpperCase() === \"DESC\" ? -1 : 1;\n }\n }\n return 0;\n });\n }\n\n const limitMatch = sql.match(/LIMIT\\s+(\\d+)(?:\\s+OFFSET\\s+(\\d+)|\\s*,\\s*(\\d+))?/i);\n if (limitMatch) {\n const limit = Number.parseInt(limitMatch[1]!, 10);\n const offset = limitMatch[2]\n ? Number.parseInt(limitMatch[2], 10)\n : limitMatch[3]\n ? Number.parseInt(limitMatch[3], 10)\n : 0;\n rows = rows.slice(offset, offset + limit);\n }\n\n return rows.map((r) => ({ ...r }));\n }\n\n private matchesWhere(\n row: Record<string, unknown>,\n whereStr: string,\n params: unknown[],\n paramOffset: number,\n ): boolean {\n return this.evaluateWhereExpression(row, whereStr, params, paramOffset).matched;\n }\n\n private evaluateWhereExpression(\n row: Record<string, unknown>,\n expr: string,\n params: unknown[],\n startParamIdx: number,\n ): { matched: boolean; paramIdx: number } {\n let paramIdx = startParamIdx;\n expr = expr.trim();\n\n if (expr.startsWith(\"(\") && expr.endsWith(\")\")) {\n const result = this.evaluateWhereExpression(row, expr.slice(1, -1), params, paramIdx);\n return result;\n }\n const orClauses = this.splitByTopLevel(expr, \"OR\");\n if (orClauses.length > 1) {\n for (const orClause of orClauses) {\n const result = this.evaluateWhereExpression(row, orClause.trim(), params, paramIdx);\n paramIdx = result.paramIdx;\n if (result.matched) {\n return { matched: true, paramIdx };\n }\n }\n return { matched: false, paramIdx };\n }\n\n const andClauses = this.splitByTopLevel(expr, \"AND\");\n if (andClauses.length > 1) {\n for (const andClause of andClauses) {\n const result = this.evaluateWhereExpression(row, andClause.trim(), params, paramIdx);\n paramIdx = result.paramIdx;\n if (!result.matched) {\n return { matched: false, paramIdx };\n }\n }\n return { matched: true, paramIdx };\n }\n\n return this.evaluateSingleCondition(row, expr, params, paramIdx);\n }\n\n private splitByTopLevel(expr: string, operator: string): string[] {\n const parts: string[] = [];\n let current = \"\";\n let parenDepth = 0;\n\n const opRegex = new RegExp(`\\\\s+${operator}\\\\s+`, \"i\");\n let i = 0;\n\n while (i < expr.length) {\n const char = expr[i];\n\n if (char === \"(\") {\n parenDepth++;\n current += char;\n i++;\n } else if (char === \")\") {\n parenDepth--;\n current += char;\n i++;\n } else if (parenDepth === 0) {\n const remaining = expr.slice(i);\n const match = remaining.match(opRegex);\n\n if (match && match.index === 0) {\n if (current.trim()) {\n parts.push(current.trim());\n }\n i += match[0]!.length;\n current = \"\";\n } else {\n current += char;\n i++;\n }\n } else {\n current += char;\n i++;\n }\n }\n\n if (current.trim()) {\n parts.push(current.trim());\n }\n\n return parts.length > 0 ? parts : [expr];\n }\n\n private evaluateSingleCondition(\n row: Record<string, unknown>,\n condition: string,\n params: unknown[],\n paramIdx: number,\n ): { matched: boolean; paramIdx: number } {\n condition = condition.trim();\n\n const notInMatch = condition.match(/`?(\\w+)`?\\s+NOT\\s+IN\\s+\\(([^)]*)\\)/i);\n if (notInMatch) {\n const col = notInMatch[1]!;\n const placeholders = notInMatch[2]!.split(\",\").map((p) => p.trim());\n const values: unknown[] = [];\n for (const placeholder of placeholders) {\n if (placeholder === \"?\") {\n values.push(params[paramIdx]);\n paramIdx++;\n }\n }\n const matched = !values.includes(row[col]);\n return { matched, paramIdx };\n }\n\n const inMatch = condition.match(/`?(\\w+)`?\\s+IN\\s+\\(([^)]*)\\)/i);\n if (inMatch) {\n const col = inMatch[1]!;\n const placeholders = inMatch[2]!.split(\",\").map((p) => p.trim());\n const values: unknown[] = [];\n for (const placeholder of placeholders) {\n if (placeholder === \"?\") {\n values.push(params[paramIdx]);\n paramIdx++;\n }\n }\n const matched = values.includes(row[col]);\n return { matched, paramIdx };\n }\n\n const eqMatch = condition.match(/`?(\\w+)`?\\s*=\\s*\\?/);\n if (eqMatch) {\n const matched = row[eqMatch[1]!] === params[paramIdx];\n return { matched, paramIdx: paramIdx + 1 };\n }\n\n const neqMatch = condition.match(/`?(\\w+)`?\\s*!=\\s*\\?/);\n if (neqMatch) {\n const matched = row[neqMatch[1]!] !== params[paramIdx];\n return { matched, paramIdx: paramIdx + 1 };\n }\n\n const gtMatch = condition.match(/`?(\\w+)`?\\s*>\\s*\\?/);\n if (gtMatch) {\n const matched = (row[gtMatch[1]!] as any) > (params[paramIdx] as any);\n return { matched, paramIdx: paramIdx + 1 };\n }\n\n const gteMatch = condition.match(/`?(\\w+)`?\\s*>=\\s*\\?/);\n if (gteMatch) {\n const matched = (row[gteMatch[1]!] as any) >= (params[paramIdx] as any);\n return { matched, paramIdx: paramIdx + 1 };\n }\n\n const ltMatch = condition.match(/`?(\\w+)`?\\s*<\\s*\\?/);\n if (ltMatch) {\n const matched = (row[ltMatch[1]!] as any) < (params[paramIdx] as any);\n return { matched, paramIdx: paramIdx + 1 };\n }\n\n const lteMatch = condition.match(/`?(\\w+)`?\\s*<=\\s*\\?/);\n if (lteMatch) {\n const matched = (row[lteMatch[1]!] as any) <= (params[paramIdx] as any);\n return { matched, paramIdx: paramIdx + 1 };\n }\n\n const notLikeMatch = condition.match(/`?(\\w+)`?\\s+NOT\\s+LIKE\\s+\\?/i);\n if (notLikeMatch) {\n const pattern = (params[paramIdx] as string).replace(/%/g, \".*\");\n const matched = !new RegExp(`^${pattern}$`).test(String(row[notLikeMatch[1]!]));\n return { matched, paramIdx: paramIdx + 1 };\n }\n\n const likeMatch = condition.match(/`?(\\w+)`?\\s+LIKE\\s+\\?/i);\n if (likeMatch) {\n const pattern = (params[paramIdx] as string).replace(/%/g, \".*\");\n const matched = new RegExp(`^${pattern}$`).test(String(row[likeMatch[1]!]));\n return { matched, paramIdx: paramIdx + 1 };\n }\n\n return { matched: true, paramIdx };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"s3.mjs","names":[],"sources":["../../src/drivers/s3.ts"],"sourcesContent":["import { DriverError } from \"../errors\";\nimport type { ColumnMetadata, S3ConnectionConfig, TableMetadata } from \"../types\";\nimport { BaseDriver } from \"./driver\";\n\ninterface S3TableData {\n rows: Record<string, unknown>[];\n autoIncrementId: number;\n meta: {\n columns: ColumnMetadata[];\n };\n}\n\n/**\n * S3-based database driver using JSON objects for storage\n */\nexport class S3Driver extends BaseDriver {\n readonly dialect = \"s3\" as const;\n private config: S3ConnectionConfig;\n private data = new Map<string, S3TableData>();\n private client: any = null;\n\n constructor(config: S3ConnectionConfig) {\n super();\n this.config = config;\n }\n\n private getKey(tableName: string): string {\n const prefix = this.config.prefix ? `${this.config.prefix}/` : \"\";\n return `${prefix}${tableName}.json`;\n }\n\n async connect(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n try {\n const { S3Client, HeadBucketCommand } = await import(\"@aws-sdk/client-s3\");\n const clientConfig: any = {};\n if (this.config.region) {\n clientConfig.region = this.config.region;\n }\n if (this.config.endpoint) {\n clientConfig.endpoint = this.config.endpoint;\n clientConfig.forcePathStyle = true;\n }\n if (this.config.accessKeyId && this.config.secretAccessKey) {\n clientConfig.credentials = {\n accessKeyId: this.config.accessKeyId,\n secretAccessKey: this.config.secretAccessKey,\n };\n }\n this.client = new S3Client(clientConfig);\n\n try {\n await this.client.send(new HeadBucketCommand({ Bucket: this.config.bucket }));\n } catch (err: any) {\n if (err.name === \"NotFound\" || err.$metadata?.httpStatusCode === 404) {\n const { CreateBucketCommand } = await import(\"@aws-sdk/client-s3\");\n await this.client.send(new CreateBucketCommand({ Bucket: this.config.bucket }));\n } else if (err.$metadata?.httpStatusCode !== 200) {\n throw err;\n }\n }\n\n await this.loadAll();\n this.connected = true;\n } catch (err: any) {\n throw new DriverError(`Failed to connect to S3: ${err.message}`);\n }\n }\n\n async disconnect(): Promise<void> {\n await this.flushAll();\n this.data.clear();\n this.client = null;\n this.connected = false;\n }\n\n async execute(sql: string, params: unknown[] = []): Promise<any> {\n return this.executeParsed(sql, params);\n }\n\n async query(sql: string, params: unknown[] = []): Promise<any[]> {\n const result = this.executeParsed(sql, params);\n return Array.isArray(result) ? result : [];\n }\n\n async tableExists(name: string): Promise<boolean> {\n return this.data.has(name);\n }\n\n async getTableColumns(name: string): Promise<ColumnMetadata[]> {\n const table = this.data.get(name);\n if (!table) {\n return [];\n }\n return Object.values(table.meta.columns);\n }\n\n async createTable(meta: TableMetadata): Promise<void> {\n if (this.data.has(meta.name)) {\n return;\n }\n this.data.set(meta.name, {\n rows: [],\n autoIncrementId: 0,\n meta: { columns: [...meta.columns] },\n });\n await this.flush(meta.name);\n }\n\n async dropTable(name: string): Promise<void> {\n this.data.delete(name);\n try {\n const { DeleteObjectCommand } = await import(\"@aws-sdk/client-s3\");\n await this.client.send(\n new DeleteObjectCommand({\n Bucket: this.config.bucket,\n Key: this.getKey(name),\n }),\n );\n } catch {}\n }\n\n async addColumn(table: string, column: ColumnMetadata): Promise<void> {\n const tableData = this.data.get(table);\n if (!tableData) {\n throw new DriverError(`Table \"${table}\" does not exist`);\n }\n tableData.meta.columns.push(column);\n for (const row of tableData.rows) {\n row[column.name] = column.defaultValue ?? null;\n }\n await this.flush(table);\n }\n\n async dropColumn(table: string, name: string): Promise<void> {\n const tableData = this.data.get(table);\n if (!tableData) {\n throw new DriverError(`Table \"${table}\" does not exist`);\n }\n tableData.meta.columns = tableData.meta.columns.filter((c) => c.name !== name);\n for (const row of tableData.rows) {\n delete row[name];\n }\n await this.flush(table);\n }\n\n async renameColumn(table: string, oldName: string, newName: string): Promise<void> {\n const tableData = this.data.get(table);\n if (!tableData) {\n throw new DriverError(`Table \"${table}\" does not exist`);\n }\n const col = tableData.meta.columns.find((c) => c.name === oldName);\n if (col) {\n col.name = newName;\n }\n for (const row of tableData.rows) {\n row[newName] = row[oldName];\n delete row[oldName];\n }\n await this.flush(table);\n }\n\n async transaction<T>(fn: () => Promise<T>): Promise<T> {\n const snapshot = new Map<string, string>();\n for (const [name, tableData] of this.data) {\n snapshot.set(name, JSON.stringify(tableData));\n }\n try {\n const result = await fn();\n await this.flushAll();\n return result;\n } catch (err) {\n for (const [name, json] of snapshot) {\n this.data.set(name, JSON.parse(json));\n }\n throw err;\n }\n }\n\n async getAllTableColumns(): Promise<Record<string, ColumnMetadata[]>> {\n const result: Record<string, ColumnMetadata[]> = {};\n for (const [name, tableData] of this.data) {\n result[name] = [...tableData.meta.columns];\n }\n return result;\n }\n\n private async loadAll(): Promise<void> {\n try {\n const { ListObjectsV2Command, GetObjectCommand } = await import(\"@aws-sdk/client-s3\");\n const prefix = this.config.prefix ? `${this.config.prefix}/` : \"\";\n const response = await this.client.send(\n new ListObjectsV2Command({\n Bucket: this.config.bucket,\n Prefix: prefix,\n }),\n );\n\n if (response.Contents) {\n for (const obj of response.Contents) {\n if (obj.Key?.endsWith(\".json\")) {\n const tableName = obj.Key.replace(prefix, \"\").replace(\".json\", \"\");\n try {\n const getResponse = await this.client.send(\n new GetObjectCommand({\n Bucket: this.config.bucket,\n Key: obj.Key,\n }),\n );\n const body = await getResponse.Body?.transformToString();\n if (body) {\n this.data.set(tableName, JSON.parse(body));\n }\n } catch {}\n }\n }\n }\n } catch {}\n }\n\n private async flush(tableName: string): Promise<void> {\n const tableData = this.data.get(tableName);\n if (!tableData || !this.client) {\n return;\n }\n try {\n const { PutObjectCommand } = await import(\"@aws-sdk/client-s3\");\n await this.client.send(\n new PutObjectCommand({\n Bucket: this.config.bucket,\n Key: this.getKey(tableName),\n Body: JSON.stringify(tableData),\n ContentType: \"application/json\",\n }),\n );\n } catch {}\n }\n\n private async flushAll(): Promise<void> {\n for (const [name] of this.data) {\n await this.flush(name);\n }\n }\n\n private executeParsed(sql: string, params: unknown[]): any {\n const trimmed = sql.trim().toUpperCase();\n\n if (trimmed.startsWith(\"CREATE TABLE\")) {\n return { insertId: 0, affectedRows: 0 };\n }\n\n if (trimmed.startsWith(\"DROP TABLE\")) {\n const match = sql.match(/DROP\\s+TABLE\\s+(?:IF\\s+EXISTS\\s+)?`?(\\w+)`?/i);\n if (match?.[1]) {\n this.data.delete(match[1]);\n }\n return { insertId: 0, affectedRows: 0 };\n }\n\n if (trimmed.startsWith(\"INSERT\")) {\n return this.handleInsert(sql, params);\n }\n\n if (trimmed.startsWith(\"UPDATE\")) {\n return this.handleUpdate(sql, params);\n }\n\n if (trimmed.startsWith(\"DELETE\")) {\n return this.handleDelete(sql, params);\n }\n\n if (trimmed.startsWith(\"SELECT\")) {\n return this.handleSelect(sql, params);\n }\n\n return { insertId: 0, affectedRows: 0 };\n }\n\n private handleInsert(sql: string, params: unknown[]): any {\n const tableMatch = sql.match(/INTO\\s+`?(\\w+)`?/i);\n if (!tableMatch?.[1]) {\n return { insertId: 0, affectedRows: 0 };\n }\n\n const tableName = tableMatch[1];\n const tableData = this.data.get(tableName);\n if (!tableData) {\n return { insertId: 0, affectedRows: 0 };\n }\n\n const colMatch = sql.match(/\\(([^)]+)\\)\\s+VALUES/i);\n if (!colMatch?.[1]) {\n return { insertId: 0, affectedRows: 0 };\n }\n\n const cols = colMatch[1]\n .split(\",\")\n .map((c) => c.trim().replace(/`/g, \"\"))\n .filter(Boolean);\n\n const rowCount = Math.floor(params.length / cols.length);\n\n let insertId = 0;\n let pkCol: string | null = null;\n for (const col of tableData.meta.columns) {\n if (col.autoIncrement) {\n pkCol = col.name;\n break;\n }\n }\n\n for (let rowIdx = 0; rowIdx < rowCount; rowIdx++) {\n const row: Record<string, unknown> = {};\n const rowParamStart = rowIdx * cols.length;\n\n for (let i = 0; i < cols.length; i++) {\n const col = cols[i];\n if (col) {\n row[col] = params[rowParamStart + i];\n }\n }\n\n if (pkCol && row[pkCol] === undefined) {\n tableData.autoIncrementId++;\n row[pkCol] = tableData.autoIncrementId;\n if (rowIdx === 0) {\n insertId = tableData.autoIncrementId;\n }\n } else if (pkCol && row[pkCol]) {\n if (rowIdx === 0) {\n insertId = row[pkCol] as number;\n }\n }\n\n tableData.rows.push({ ...row });\n }\n\n this.flush(tableName);\n\n return { insertId, affectedRows: rowCount };\n }\n\n private handleUpdate(sql: string, params: unknown[]): any {\n const tableMatch = sql.match(/UPDATE\\s+`?(\\w+)`?/i);\n if (!tableMatch?.[1]) {\n return { affectedRows: 0 };\n }\n\n const tableName = tableMatch[1];\n const tableData = this.data.get(tableName);\n if (!tableData) {\n return { affectedRows: 0 };\n }\n\n const setMatch = sql.match(/SET\\s+(.+?)\\s+WHERE/i) || sql.match(/SET\\s+(.+)$/i);\n if (!setMatch?.[1]) {\n return { affectedRows: 0 };\n }\n\n const setClauses = setMatch[1].split(\",\");\n const updates: Record<string, unknown> = {};\n let paramIndex = 0;\n\n for (const clause of setClauses) {\n const eqMatch = clause.match(/`?(\\w+)`?\\s*=\\s*\\?/);\n if (eqMatch?.[1]) {\n updates[eqMatch[1]] = params[paramIndex];\n paramIndex++;\n }\n }\n\n const whereMatch = sql.match(/WHERE\\s+(.+)$/i);\n const whereConditions = whereMatch?.[1] || \"\";\n\n let affectedRows = 0;\n for (const row of tableData.rows) {\n if (this.matchesWhere(row, whereConditions, params, paramIndex)) {\n Object.assign(row, updates);\n affectedRows++;\n }\n }\n\n if (affectedRows > 0) {\n this.flush(tableName);\n }\n\n return { affectedRows };\n }\n\n private handleDelete(sql: string, params: unknown[]): any {\n const tableMatch = sql.match(/FROM\\s+`?(\\w+)`?/i);\n if (!tableMatch?.[1]) {\n return { affectedRows: 0 };\n }\n\n const tableName = tableMatch[1];\n const tableData = this.data.get(tableName);\n if (!tableData) {\n return { affectedRows: 0 };\n }\n\n const whereMatch = sql.match(/WHERE\\s+(.+)$/i);\n if (!whereMatch?.[1]) {\n const affectedRows = tableData.rows.length;\n tableData.rows = [];\n if (affectedRows > 0) {\n this.flush(tableName);\n }\n return { affectedRows };\n }\n\n const whereConditions = whereMatch[1];\n const before = tableData.rows.length;\n\n tableData.rows = tableData.rows.filter(\n (row) => !this.matchesWhere(row, whereConditions, params, 0),\n );\n\n const affectedRows = before - tableData.rows.length;\n if (affectedRows > 0) {\n this.flush(tableName);\n }\n\n return { affectedRows };\n }\n\n private handleSelect(sql: string, params: unknown[]): any {\n const countMatch = sql.match(/SELECT\\s+COUNT\\s*\\(\\s*\\*\\s*\\)\\s+as\\s+(\\w+)/i);\n if (countMatch) {\n const tableMatch = sql.match(/FROM\\s+`?(\\w+)`?/i);\n if (!tableMatch?.[1]) {\n return [];\n }\n const tableName = tableMatch[1];\n const tableData = this.data.get(tableName);\n if (!tableData) {\n return [{ count: 0 }];\n }\n\n const whereMatch = sql.match(/WHERE\\s+(.+?)(?:\\s+ORDER|\\s+LIMIT|\\s*$)/i);\n if (whereMatch?.[1]) {\n const filter = (row: Record<string, unknown>) =>\n this.matchesWhere(row, whereMatch[1]!, params, 0);\n const count = tableData.rows.filter(filter).length;\n return [{ count }];\n }\n\n return [{ count: tableData.rows.length }];\n }\n\n const tableMatch = sql.match(/FROM\\s+`?(\\w+)`?/i);\n if (!tableMatch?.[1]) {\n return [];\n }\n\n const tableName = tableMatch[1];\n const tableData = this.data.get(tableName);\n if (!tableData) {\n return [];\n }\n\n let rows = [...tableData.rows];\n\n const whereMatch = sql.match(/WHERE\\s+(.+?)(?:\\s+ORDER\\s+BY|\\s+LIMIT|\\s*$)/i);\n if (whereMatch?.[1]) {\n rows = rows.filter((row) => this.matchesWhere(row, whereMatch[1]!, params, 0));\n }\n\n const orderMatch = sql.match(/ORDER\\s+BY\\s+(.+?)(?:\\s+LIMIT|\\s*$)/i);\n if (orderMatch?.[1]) {\n const orders = orderMatch[1].split(\",\");\n rows.sort((a, b) => {\n for (const orderClause of orders) {\n const [col, dir] = orderClause.trim().split(/\\s+/);\n const colName = col?.replace(/`/g, \"\") ?? \"\";\n const aVal = (a as any)[colName];\n const bVal = (b as any)[colName];\n if (aVal < bVal) {\n return dir?.toUpperCase() === \"DESC\" ? 1 : -1;\n }\n if (aVal > bVal) {\n return dir?.toUpperCase() === \"DESC\" ? -1 : 1;\n }\n }\n return 0;\n });\n }\n\n const limitMatch = sql.match(/LIMIT\\s+(\\d+)(?:\\s+OFFSET\\s+(\\d+)|\\s*,\\s*(\\d+))?/i);\n if (limitMatch) {\n const limit = Number.parseInt(limitMatch[1]!, 10);\n const offset = limitMatch[2]\n ? Number.parseInt(limitMatch[2], 10)\n : limitMatch[3]\n ? Number.parseInt(limitMatch[3], 10)\n : 0;\n rows = rows.slice(offset, offset + limit);\n }\n\n return rows.map((r) => ({ ...r }));\n }\n\n private matchesWhere(\n row: Record<string, unknown>,\n whereStr: string,\n params: unknown[],\n paramOffset: number,\n ): boolean {\n return this.evaluateWhereExpression(row, whereStr, params, paramOffset).matched;\n }\n\n private evaluateWhereExpression(\n row: Record<string, unknown>,\n expr: string,\n params: unknown[],\n startParamIdx: number,\n ): { matched: boolean; paramIdx: number } {\n let paramIdx = startParamIdx;\n expr = expr.trim();\n\n if (expr.startsWith(\"(\") && expr.endsWith(\")\")) {\n const result = this.evaluateWhereExpression(row, expr.slice(1, -1), params, paramIdx);\n return result;\n }\n const orClauses = this.splitByTopLevel(expr, \"OR\");\n if (orClauses.length > 1) {\n for (const orClause of orClauses) {\n const result = this.evaluateWhereExpression(row, orClause.trim(), params, paramIdx);\n paramIdx = result.paramIdx;\n if (result.matched) {\n return { matched: true, paramIdx };\n }\n }\n return { matched: false, paramIdx };\n }\n\n const andClauses = this.splitByTopLevel(expr, \"AND\");\n if (andClauses.length > 1) {\n for (const andClause of andClauses) {\n const result = this.evaluateWhereExpression(row, andClause.trim(), params, paramIdx);\n paramIdx = result.paramIdx;\n if (!result.matched) {\n return { matched: false, paramIdx };\n }\n }\n return { matched: true, paramIdx };\n }\n\n return this.evaluateSingleCondition(row, expr, params, paramIdx);\n }\n\n private splitByTopLevel(expr: string, operator: string): string[] {\n const parts: string[] = [];\n let current = \"\";\n let parenDepth = 0;\n\n const opRegex = new RegExp(`\\\\s+${operator}\\\\s+`, \"i\");\n let i = 0;\n\n while (i < expr.length) {\n const char = expr[i];\n\n if (char === \"(\") {\n parenDepth++;\n current += char;\n i++;\n } else if (char === \")\") {\n parenDepth--;\n current += char;\n i++;\n } else if (parenDepth === 0) {\n const remaining = expr.slice(i);\n const match = remaining.match(opRegex);\n\n if (match && match.index === 0) {\n if (current.trim()) {\n parts.push(current.trim());\n }\n i += match[0]!.length;\n current = \"\";\n } else {\n current += char;\n i++;\n }\n } else {\n current += char;\n i++;\n }\n }\n\n if (current.trim()) {\n parts.push(current.trim());\n }\n\n return parts.length > 0 ? parts : [expr];\n }\n\n private evaluateSingleCondition(\n row: Record<string, unknown>,\n condition: string,\n params: unknown[],\n paramIdx: number,\n ): { matched: boolean; paramIdx: number } {\n condition = condition.trim();\n\n const notInMatch = condition.match(/`?(\\w+)`?\\s+NOT\\s+IN\\s+\\(([^)]*)\\)/i);\n if (notInMatch) {\n const col = notInMatch[1]!;\n const placeholders = notInMatch[2]!.split(\",\").map((p) => p.trim());\n const values: unknown[] = [];\n for (const placeholder of placeholders) {\n if (placeholder === \"?\") {\n values.push(params[paramIdx]);\n paramIdx++;\n }\n }\n const matched = !values.includes(row[col]);\n return { matched, paramIdx };\n }\n\n const inMatch = condition.match(/`?(\\w+)`?\\s+IN\\s+\\(([^)]*)\\)/i);\n if (inMatch) {\n const col = inMatch[1]!;\n const placeholders = inMatch[2]!.split(\",\").map((p) => p.trim());\n const values: unknown[] = [];\n for (const placeholder of placeholders) {\n if (placeholder === \"?\") {\n values.push(params[paramIdx]);\n paramIdx++;\n }\n }\n const matched = values.includes(row[col]);\n return { matched, paramIdx };\n }\n\n const eqMatch = condition.match(/`?(\\w+)`?\\s*=\\s*\\?/);\n if (eqMatch) {\n const matched = row[eqMatch[1]!] === params[paramIdx];\n return { matched, paramIdx: paramIdx + 1 };\n }\n\n const neqMatch = condition.match(/`?(\\w+)`?\\s*!=\\s*\\?/);\n if (neqMatch) {\n const matched = row[neqMatch[1]!] !== params[paramIdx];\n return { matched, paramIdx: paramIdx + 1 };\n }\n\n const gtMatch = condition.match(/`?(\\w+)`?\\s*>\\s*\\?/);\n if (gtMatch) {\n const matched = (row[gtMatch[1]!] as any) > (params[paramIdx] as any);\n return { matched, paramIdx: paramIdx + 1 };\n }\n\n const gteMatch = condition.match(/`?(\\w+)`?\\s*>=\\s*\\?/);\n if (gteMatch) {\n const matched = (row[gteMatch[1]!] as any) >= (params[paramIdx] as any);\n return { matched, paramIdx: paramIdx + 1 };\n }\n\n const ltMatch = condition.match(/`?(\\w+)`?\\s*<\\s*\\?/);\n if (ltMatch) {\n const matched = (row[ltMatch[1]!] as any) < (params[paramIdx] as any);\n return { matched, paramIdx: paramIdx + 1 };\n }\n\n const lteMatch = condition.match(/`?(\\w+)`?\\s*<=\\s*\\?/);\n if (lteMatch) {\n const matched = (row[lteMatch[1]!] as any) <= (params[paramIdx] as any);\n return { matched, paramIdx: paramIdx + 1 };\n }\n\n const notLikeMatch = condition.match(/`?(\\w+)`?\\s+NOT\\s+LIKE\\s+\\?/i);\n if (notLikeMatch) {\n const pattern = (params[paramIdx] as string).replace(/%/g, \".*\");\n const matched = !new RegExp(`^${pattern}$`).test(String(row[notLikeMatch[1]!]));\n return { matched, paramIdx: paramIdx + 1 };\n }\n\n const likeMatch = condition.match(/`?(\\w+)`?\\s+LIKE\\s+\\?/i);\n if (likeMatch) {\n const pattern = (params[paramIdx] as string).replace(/%/g, \".*\");\n const matched = new RegExp(`^${pattern}$`).test(String(row[likeMatch[1]!]));\n return { matched, paramIdx: paramIdx + 1 };\n }\n\n return { matched: true, paramIdx };\n }\n}\n"],"mappings":"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"}
@@ -102,6 +102,7 @@ function compileColumnDef(col, dialect) {
102
102
  if (col.unique && !col.primaryKey) parts.push("UNIQUE");
103
103
  if (col.defaultValue !== void 0) if (typeof col.defaultValue === "string") parts.push(`DEFAULT '${col.defaultValue}'`);
104
104
  else if (col.defaultValue === null) parts.push("DEFAULT NULL");
105
+ else if (col.defaultValue instanceof Date) parts.push(`DEFAULT '${col.defaultValue.toISOString()}'`);
105
106
  else parts.push(`DEFAULT ${col.defaultValue}`);
106
107
  return parts.join(" ");
107
108
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sql-compiler.cjs","names":[],"sources":["../../src/drivers/sql-compiler.ts"],"sourcesContent":["import type {\n ColumnDataType,\n ColumnMetadata,\n DatabaseType,\n TableMetadata,\n WhereClause,\n WhereCondition,\n} from \"../types\";\n\n/**\n * Compile column type to SQL string for a specific database dialect\n * @param {ColumnMetadata} col - Column metadata\n * @param {DatabaseType} dialect - Database dialect\n * @returns {string} SQL column type string\n */\nexport function compileColumnType(col: ColumnMetadata, dialect: DatabaseType): string {\n const name = typeof dialect === \"string\" ? dialect : dialect.name;\n\n const typeMap: Record<ColumnDataType, Record<string, string>> = {\n integer: { mysql: \"INT\", mariadb: \"INT\", sqlite: \"INTEGER\", file: \"INTEGER\" },\n bigint: { mysql: \"BIGINT\", mariadb: \"BIGINT\", sqlite: \"INTEGER\", file: \"BIGINT\" },\n varchar: {\n mysql: `VARCHAR(${col.length ?? 255})`,\n mariadb: `VARCHAR(${col.length ?? 255})`,\n sqlite: \"TEXT\",\n file: \"VARCHAR\",\n },\n char: {\n mysql: `CHAR(${col.length ?? 1})`,\n mariadb: `CHAR(${col.length ?? 1})`,\n sqlite: \"TEXT\",\n file: \"CHAR\",\n },\n text: { mysql: \"TEXT\", mariadb: \"TEXT\", sqlite: \"TEXT\", file: \"TEXT\" },\n boolean: { mysql: \"TINYINT(1)\", mariadb: \"TINYINT(1)\", sqlite: \"INTEGER\", file: \"BOOLEAN\" },\n json: { mysql: \"JSON\", mariadb: \"JSON\", sqlite: \"TEXT\", file: \"JSON\" },\n array: { mysql: \"JSON\", mariadb: \"JSON\", sqlite: \"TEXT\", file: \"JSON\" },\n datetime: { mysql: \"DATETIME\", mariadb: \"DATETIME\", sqlite: \"TEXT\", file: \"DATETIME\" },\n timestamp: { mysql: \"TIMESTAMP\", mariadb: \"TIMESTAMP\", sqlite: \"TEXT\", file: \"TIMESTAMP\" },\n decimal: {\n mysql: `DECIMAL(${col.precision ?? 10},${col.scale ?? 2})`,\n mariadb: `DECIMAL(${col.precision ?? 10},${col.scale ?? 2})`,\n sqlite: \"REAL\",\n file: \"DECIMAL\",\n },\n float: { mysql: \"FLOAT\", mariadb: \"FLOAT\", sqlite: \"REAL\", file: \"FLOAT\" },\n blob: { mysql: \"BLOB\", mariadb: \"BLOB\", sqlite: \"BLOB\", file: \"BLOB\" },\n };\n\n return typeMap[col.type]?.[name] ?? \"TEXT\";\n}\n\n/**\n * Compile a column definition to a SQL fragment\n * @param {ColumnMetadata} col - Column metadata\n * @param {DatabaseType} dialect - Database dialect\n * @returns {string} SQL column definition\n */\nexport function compileColumnDef(col: ColumnMetadata, dialect: DatabaseType): string {\n const parts: string[] = [`\\`${col.name}\\``, compileColumnType(col, dialect)];\n\n if (col.primaryKey) {\n parts.push(\"PRIMARY KEY\");\n }\n if (col.autoIncrement) {\n parts.push(dialect === \"mysql\" ? \"AUTO_INCREMENT\" : \"AUTOINCREMENT\");\n }\n if (col.notNull && !col.primaryKey) {\n parts.push(\"NOT NULL\");\n }\n if (col.unique && !col.primaryKey) {\n parts.push(\"UNIQUE\");\n }\n if (col.defaultValue !== undefined) {\n if (typeof col.defaultValue === \"string\") {\n parts.push(`DEFAULT '${col.defaultValue}'`);\n } else if (col.defaultValue === null) {\n parts.push(\"DEFAULT NULL\");\n } else {\n parts.push(`DEFAULT ${col.defaultValue}`);\n }\n }\n\n return parts.join(\" \");\n}\n\n/**\n * Compile a CREATE TABLE statement from table metadata\n * @param {TableMetadata} table - Table metadata\n * @param {DatabaseType} dialect - Database dialect\n * @returns {string} CREATE TABLE SQL statement\n */\nexport function compileCreateTable(table: TableMetadata, dialect: DatabaseType): string {\n const columnDefs: string[] = [];\n const constraints: string[] = [];\n\n for (const col of table.columns) {\n columnDefs.push(compileColumnDef(col, dialect));\n\n if (col.references) {\n const onDelete = col.references.onDelete ? ` ON DELETE ${col.references.onDelete}` : \"\";\n const onUpdate = col.references.onUpdate ? ` ON UPDATE ${col.references.onUpdate}` : \"\";\n constraints.push(\n `FOREIGN KEY (\\`${col.name}\\`) REFERENCES \\`${col.references.table}\\`(\\`${col.references.column}\\`)${onDelete}${onUpdate}`,\n );\n }\n }\n\n const allDefs = [...columnDefs, ...constraints].join(\", \");\n return `CREATE TABLE IF NOT EXISTS \\`${table.name}\\` (${allDefs})`;\n}\n\n/**\n * Compile a WHERE clause from a condition object\n * @param {WhereClause} where - Where clause object\n * @param {unknown[]} params - Parameter array to push values into\n * @returns {string} SQL WHERE fragment\n */\nexport function compileWhere(where: WhereClause, params: unknown[]): string {\n const conditions: string[] = [];\n\n for (const [key, value] of Object.entries(where)) {\n if (key === \"OR\" && Array.isArray(value)) {\n const orParts = (value as WhereClause[]).map((sub) => compileWhere(sub, params));\n if (orParts.length > 0) {\n conditions.push(`(${orParts.join(\" OR \")})`);\n }\n continue;\n }\n if (key === \"AND\" && Array.isArray(value)) {\n const andParts = (value as WhereClause[]).map((sub) => compileWhere(sub, params));\n if (andParts.length > 0) {\n conditions.push(`(${andParts.join(\" AND \")})`);\n }\n continue;\n }\n\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) {\n const cond = value as WhereCondition;\n if (cond.eq !== undefined) {\n params.push(cond.eq);\n conditions.push(`\\`${key}\\` = ?`);\n }\n if (cond.neq !== undefined) {\n params.push(cond.neq);\n conditions.push(`\\`${key}\\` != ?`);\n }\n if (cond.gt !== undefined) {\n params.push(cond.gt);\n conditions.push(`\\`${key}\\` > ?`);\n }\n if (cond.gte !== undefined) {\n params.push(cond.gte);\n conditions.push(`\\`${key}\\` >= ?`);\n }\n if (cond.lt !== undefined) {\n params.push(cond.lt);\n conditions.push(`\\`${key}\\` < ?`);\n }\n if (cond.lte !== undefined) {\n params.push(cond.lte);\n conditions.push(`\\`${key}\\` <= ?`);\n }\n if (cond.like !== undefined) {\n params.push(cond.like);\n conditions.push(`\\`${key}\\` LIKE ?`);\n }\n if (cond.notLike !== undefined) {\n params.push(cond.notLike);\n conditions.push(`\\`${key}\\` NOT LIKE ?`);\n }\n if (cond.in !== undefined && Array.isArray(cond.in)) {\n const placeholders = cond.in.map(() => \"?\").join(\", \");\n params.push(...cond.in);\n conditions.push(`\\`${key}\\` IN (${placeholders})`);\n }\n if (cond.notIn !== undefined && Array.isArray(cond.notIn)) {\n const placeholders = cond.notIn.map(() => \"?\").join(\", \");\n params.push(...cond.notIn);\n conditions.push(`\\`${key}\\` NOT IN (${placeholders})`);\n }\n if (cond.isNull === true) {\n conditions.push(`\\`${key}\\` IS NULL`);\n }\n if (cond.isNull === false) {\n conditions.push(`\\`${key}\\` IS NOT NULL`);\n }\n if (cond.between !== undefined && Array.isArray(cond.between)) {\n params.push(cond.between[0], cond.between[1]);\n conditions.push(`\\`${key}\\` BETWEEN ? AND ?`);\n }\n } else {\n params.push(value);\n conditions.push(`\\`${key}\\` = ?`);\n }\n }\n\n return conditions.length > 0 ? conditions.join(\" AND \") : \"1=1\";\n}\n\n/**\n * Compile a SELECT query from options\n * @param {string} tableName - Table name\n * @param {object} options - Query options\n * @param {unknown[]} params - Parameter array\n * @returns {string} SQL SELECT statement\n */\nexport function compileSelect(\n tableName: string,\n options: {\n select?: string[];\n where?: WhereClause;\n orderBy?: Record<string, \"asc\" | \"desc\">;\n take?: number;\n skip?: number;\n },\n params: unknown[],\n): string {\n const cols = options.select?.map((c) => `\\`${String(c)}\\``).join(\", \") ?? \"*\";\n let sql = `SELECT ${cols} FROM \\`${tableName}\\``;\n\n if (options.where && Object.keys(options.where).length > 0) {\n sql += ` WHERE ${compileWhere(options.where, params)}`;\n }\n if (options.orderBy) {\n const orderParts = Object.entries(options.orderBy).map(\n ([col, dir]) => `\\`${col}\\` ${dir.toUpperCase()}`,\n );\n if (orderParts.length > 0) {\n sql += ` ORDER BY ${orderParts.join(\", \")}`;\n }\n }\n if (options.take !== undefined) {\n sql += ` LIMIT ${options.take}`;\n }\n if (options.skip !== undefined) {\n sql += ` OFFSET ${options.skip}`;\n }\n\n return sql;\n}\n\n/**\n * Compile an INSERT statement\n * @param {string} tableName - Table name\n * @param {Record<string, unknown>} data - Data to insert\n * @param {unknown[]} params - Parameter array\n * @returns {string} SQL INSERT statement\n */\nexport function compileInsert(\n tableName: string,\n data: Record<string, unknown>,\n params: unknown[],\n): string {\n const keys = Object.keys(data);\n const cols = keys.map((k) => `\\`${k}\\``).join(\", \");\n const placeholders = keys.map(() => \"?\").join(\", \");\n params.push(...keys.map((k) => data[k]));\n return `INSERT INTO \\`${tableName}\\` (${cols}) VALUES (${placeholders})`;\n}\n\n/**\n * Compile a bulk INSERT statement for multiple rows\n * @param {string} tableName - Table name\n * @param {Record<string, unknown>[]} data - Array of data to insert\n * @param {unknown[]} params - Parameter array\n * @returns {string} SQL bulk INSERT statement\n */\nexport function compileBulkInsert(\n tableName: string,\n data: Record<string, unknown>[],\n params: unknown[],\n): string {\n if (data.length === 0) {\n return \"\";\n }\n const keys = Object.keys(data[0]!);\n const cols = keys.map((k) => `\\`${k}\\``).join(\", \");\n const valuePlaceholders = data.map(() => `(${keys.map(() => \"?\").join(\", \")})`).join(\", \");\n\n for (const row of data) {\n for (const key of keys) {\n params.push(row[key]);\n }\n }\n\n return `INSERT INTO \\`${tableName}\\` (${cols}) VALUES ${valuePlaceholders}`;\n}\n\n/**\n * Compile an UPDATE statement\n * @param {string} tableName - Table name\n * @param {Record<string, unknown>} data - Data to update\n * @param {WhereClause} where - Where clause\n * @param {unknown[]} params - Parameter array\n * @returns {string} SQL UPDATE statement\n */\nexport function compileUpdate(\n tableName: string,\n data: Record<string, unknown>,\n where: WhereClause,\n params: unknown[],\n): string {\n const setParts = Object.keys(data).map((k) => {\n params.push(data[k]);\n return `\\`${k}\\` = ?`;\n });\n let sql = `UPDATE \\`${tableName}\\` SET ${setParts.join(\", \")}`;\n if (Object.keys(where).length > 0) {\n sql += ` WHERE ${compileWhere(where, params)}`;\n }\n return sql;\n}\n\n/**\n * Compile a DELETE statement\n * @param {string} tableName - Table name\n * @param {WhereClause} where - Where clause\n * @param {unknown[]} params - Parameter array\n * @returns {string} SQL DELETE statement\n */\nexport function compileDelete(tableName: string, where: WhereClause, params: unknown[]): string {\n let sql = `DELETE FROM \\`${tableName}\\``;\n if (Object.keys(where).length > 0) {\n sql += ` WHERE ${compileWhere(where, params)}`;\n }\n return sql;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"sql-compiler.cjs","names":[],"sources":["../../src/drivers/sql-compiler.ts"],"sourcesContent":["import type {\n ColumnDataType,\n ColumnMetadata,\n DatabaseType,\n TableMetadata,\n WhereClause,\n WhereCondition,\n} from \"../types\";\n\n/**\n * Compile column type to SQL string for a specific database dialect\n * @param {ColumnMetadata} col - Column metadata\n * @param {DatabaseType} dialect - Database dialect\n * @returns {string} SQL column type string\n */\nexport function compileColumnType(col: ColumnMetadata, dialect: DatabaseType): string {\n const name = typeof dialect === \"string\" ? dialect : dialect.name;\n\n const typeMap: Record<ColumnDataType, Record<string, string>> = {\n integer: { mysql: \"INT\", mariadb: \"INT\", sqlite: \"INTEGER\", file: \"INTEGER\" },\n bigint: { mysql: \"BIGINT\", mariadb: \"BIGINT\", sqlite: \"INTEGER\", file: \"BIGINT\" },\n varchar: {\n mysql: `VARCHAR(${col.length ?? 255})`,\n mariadb: `VARCHAR(${col.length ?? 255})`,\n sqlite: \"TEXT\",\n file: \"VARCHAR\",\n },\n char: {\n mysql: `CHAR(${col.length ?? 1})`,\n mariadb: `CHAR(${col.length ?? 1})`,\n sqlite: \"TEXT\",\n file: \"CHAR\",\n },\n text: { mysql: \"TEXT\", mariadb: \"TEXT\", sqlite: \"TEXT\", file: \"TEXT\" },\n boolean: { mysql: \"TINYINT(1)\", mariadb: \"TINYINT(1)\", sqlite: \"INTEGER\", file: \"BOOLEAN\" },\n json: { mysql: \"JSON\", mariadb: \"JSON\", sqlite: \"TEXT\", file: \"JSON\" },\n array: { mysql: \"JSON\", mariadb: \"JSON\", sqlite: \"TEXT\", file: \"JSON\" },\n datetime: { mysql: \"DATETIME\", mariadb: \"DATETIME\", sqlite: \"TEXT\", file: \"DATETIME\" },\n timestamp: { mysql: \"TIMESTAMP\", mariadb: \"TIMESTAMP\", sqlite: \"TEXT\", file: \"TIMESTAMP\" },\n decimal: {\n mysql: `DECIMAL(${col.precision ?? 10},${col.scale ?? 2})`,\n mariadb: `DECIMAL(${col.precision ?? 10},${col.scale ?? 2})`,\n sqlite: \"REAL\",\n file: \"DECIMAL\",\n },\n float: { mysql: \"FLOAT\", mariadb: \"FLOAT\", sqlite: \"REAL\", file: \"FLOAT\" },\n blob: { mysql: \"BLOB\", mariadb: \"BLOB\", sqlite: \"BLOB\", file: \"BLOB\" },\n };\n\n return typeMap[col.type]?.[name] ?? \"TEXT\";\n}\n\n/**\n * Compile a column definition to a SQL fragment\n * @param {ColumnMetadata} col - Column metadata\n * @param {DatabaseType} dialect - Database dialect\n * @returns {string} SQL column definition\n */\nexport function compileColumnDef(col: ColumnMetadata, dialect: DatabaseType): string {\n const parts: string[] = [`\\`${col.name}\\``, compileColumnType(col, dialect)];\n\n if (col.primaryKey) {\n parts.push(\"PRIMARY KEY\");\n }\n if (col.autoIncrement) {\n parts.push(dialect === \"mysql\" ? \"AUTO_INCREMENT\" : \"AUTOINCREMENT\");\n }\n if (col.notNull && !col.primaryKey) {\n parts.push(\"NOT NULL\");\n }\n if (col.unique && !col.primaryKey) {\n parts.push(\"UNIQUE\");\n }\n if (col.defaultValue !== undefined) {\n if (typeof col.defaultValue === \"string\") {\n parts.push(`DEFAULT '${col.defaultValue}'`);\n } else if (col.defaultValue === null) {\n parts.push(\"DEFAULT NULL\");\n } else if (col.defaultValue instanceof Date) {\n parts.push(`DEFAULT '${col.defaultValue.toISOString()}'`);\n } else {\n parts.push(`DEFAULT ${col.defaultValue}`);\n }\n }\n\n return parts.join(\" \");\n}\n\n/**\n * Compile a CREATE TABLE statement from table metadata\n * @param {TableMetadata} table - Table metadata\n * @param {DatabaseType} dialect - Database dialect\n * @returns {string} CREATE TABLE SQL statement\n */\nexport function compileCreateTable(table: TableMetadata, dialect: DatabaseType): string {\n const columnDefs: string[] = [];\n const constraints: string[] = [];\n\n for (const col of table.columns) {\n columnDefs.push(compileColumnDef(col, dialect));\n\n if (col.references) {\n const onDelete = col.references.onDelete ? ` ON DELETE ${col.references.onDelete}` : \"\";\n const onUpdate = col.references.onUpdate ? ` ON UPDATE ${col.references.onUpdate}` : \"\";\n constraints.push(\n `FOREIGN KEY (\\`${col.name}\\`) REFERENCES \\`${col.references.table}\\`(\\`${col.references.column}\\`)${onDelete}${onUpdate}`,\n );\n }\n }\n\n const allDefs = [...columnDefs, ...constraints].join(\", \");\n return `CREATE TABLE IF NOT EXISTS \\`${table.name}\\` (${allDefs})`;\n}\n\n/**\n * Compile a WHERE clause from a condition object\n * @param {WhereClause} where - Where clause object\n * @param {unknown[]} params - Parameter array to push values into\n * @returns {string} SQL WHERE fragment\n */\nexport function compileWhere(where: WhereClause, params: unknown[]): string {\n const conditions: string[] = [];\n\n for (const [key, value] of Object.entries(where)) {\n if (key === \"OR\" && Array.isArray(value)) {\n const orParts = (value as WhereClause[]).map((sub) => compileWhere(sub, params));\n if (orParts.length > 0) {\n conditions.push(`(${orParts.join(\" OR \")})`);\n }\n continue;\n }\n if (key === \"AND\" && Array.isArray(value)) {\n const andParts = (value as WhereClause[]).map((sub) => compileWhere(sub, params));\n if (andParts.length > 0) {\n conditions.push(`(${andParts.join(\" AND \")})`);\n }\n continue;\n }\n\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) {\n const cond = value as WhereCondition;\n if (cond.eq !== undefined) {\n params.push(cond.eq);\n conditions.push(`\\`${key}\\` = ?`);\n }\n if (cond.neq !== undefined) {\n params.push(cond.neq);\n conditions.push(`\\`${key}\\` != ?`);\n }\n if (cond.gt !== undefined) {\n params.push(cond.gt);\n conditions.push(`\\`${key}\\` > ?`);\n }\n if (cond.gte !== undefined) {\n params.push(cond.gte);\n conditions.push(`\\`${key}\\` >= ?`);\n }\n if (cond.lt !== undefined) {\n params.push(cond.lt);\n conditions.push(`\\`${key}\\` < ?`);\n }\n if (cond.lte !== undefined) {\n params.push(cond.lte);\n conditions.push(`\\`${key}\\` <= ?`);\n }\n if (cond.like !== undefined) {\n params.push(cond.like);\n conditions.push(`\\`${key}\\` LIKE ?`);\n }\n if (cond.notLike !== undefined) {\n params.push(cond.notLike);\n conditions.push(`\\`${key}\\` NOT LIKE ?`);\n }\n if (cond.in !== undefined && Array.isArray(cond.in)) {\n const placeholders = cond.in.map(() => \"?\").join(\", \");\n params.push(...cond.in);\n conditions.push(`\\`${key}\\` IN (${placeholders})`);\n }\n if (cond.notIn !== undefined && Array.isArray(cond.notIn)) {\n const placeholders = cond.notIn.map(() => \"?\").join(\", \");\n params.push(...cond.notIn);\n conditions.push(`\\`${key}\\` NOT IN (${placeholders})`);\n }\n if (cond.isNull === true) {\n conditions.push(`\\`${key}\\` IS NULL`);\n }\n if (cond.isNull === false) {\n conditions.push(`\\`${key}\\` IS NOT NULL`);\n }\n if (cond.between !== undefined && Array.isArray(cond.between)) {\n params.push(cond.between[0], cond.between[1]);\n conditions.push(`\\`${key}\\` BETWEEN ? AND ?`);\n }\n } else {\n params.push(value);\n conditions.push(`\\`${key}\\` = ?`);\n }\n }\n\n return conditions.length > 0 ? conditions.join(\" AND \") : \"1=1\";\n}\n\n/**\n * Compile a SELECT query from options\n * @param {string} tableName - Table name\n * @param {object} options - Query options\n * @param {unknown[]} params - Parameter array\n * @returns {string} SQL SELECT statement\n */\nexport function compileSelect(\n tableName: string,\n options: {\n select?: string[];\n where?: WhereClause;\n orderBy?: Record<string, \"asc\" | \"desc\">;\n take?: number;\n skip?: number;\n },\n params: unknown[],\n): string {\n const cols = options.select?.map((c) => `\\`${String(c)}\\``).join(\", \") ?? \"*\";\n let sql = `SELECT ${cols} FROM \\`${tableName}\\``;\n\n if (options.where && Object.keys(options.where).length > 0) {\n sql += ` WHERE ${compileWhere(options.where, params)}`;\n }\n if (options.orderBy) {\n const orderParts = Object.entries(options.orderBy).map(\n ([col, dir]) => `\\`${col}\\` ${dir.toUpperCase()}`,\n );\n if (orderParts.length > 0) {\n sql += ` ORDER BY ${orderParts.join(\", \")}`;\n }\n }\n if (options.take !== undefined) {\n sql += ` LIMIT ${options.take}`;\n }\n if (options.skip !== undefined) {\n sql += ` OFFSET ${options.skip}`;\n }\n\n return sql;\n}\n\n/**\n * Compile an INSERT statement\n * @param {string} tableName - Table name\n * @param {Record<string, unknown>} data - Data to insert\n * @param {unknown[]} params - Parameter array\n * @returns {string} SQL INSERT statement\n */\nexport function compileInsert(\n tableName: string,\n data: Record<string, unknown>,\n params: unknown[],\n): string {\n const keys = Object.keys(data);\n const cols = keys.map((k) => `\\`${k}\\``).join(\", \");\n const placeholders = keys.map(() => \"?\").join(\", \");\n params.push(...keys.map((k) => data[k]));\n return `INSERT INTO \\`${tableName}\\` (${cols}) VALUES (${placeholders})`;\n}\n\n/**\n * Compile a bulk INSERT statement for multiple rows\n * @param {string} tableName - Table name\n * @param {Record<string, unknown>[]} data - Array of data to insert\n * @param {unknown[]} params - Parameter array\n * @returns {string} SQL bulk INSERT statement\n */\nexport function compileBulkInsert(\n tableName: string,\n data: Record<string, unknown>[],\n params: unknown[],\n): string {\n if (data.length === 0) {\n return \"\";\n }\n const keys = Object.keys(data[0]!);\n const cols = keys.map((k) => `\\`${k}\\``).join(\", \");\n const valuePlaceholders = data.map(() => `(${keys.map(() => \"?\").join(\", \")})`).join(\", \");\n\n for (const row of data) {\n for (const key of keys) {\n params.push(row[key]);\n }\n }\n\n return `INSERT INTO \\`${tableName}\\` (${cols}) VALUES ${valuePlaceholders}`;\n}\n\n/**\n * Compile an UPDATE statement\n * @param {string} tableName - Table name\n * @param {Record<string, unknown>} data - Data to update\n * @param {WhereClause} where - Where clause\n * @param {unknown[]} params - Parameter array\n * @returns {string} SQL UPDATE statement\n */\nexport function compileUpdate(\n tableName: string,\n data: Record<string, unknown>,\n where: WhereClause,\n params: unknown[],\n): string {\n const setParts = Object.keys(data).map((k) => {\n params.push(data[k]);\n return `\\`${k}\\` = ?`;\n });\n let sql = `UPDATE \\`${tableName}\\` SET ${setParts.join(\", \")}`;\n if (Object.keys(where).length > 0) {\n sql += ` WHERE ${compileWhere(where, params)}`;\n }\n return sql;\n}\n\n/**\n * Compile a DELETE statement\n * @param {string} tableName - Table name\n * @param {WhereClause} where - Where clause\n * @param {unknown[]} params - Parameter array\n * @returns {string} SQL DELETE statement\n */\nexport function compileDelete(tableName: string, where: WhereClause, params: unknown[]): string {\n let sql = `DELETE FROM \\`${tableName}\\``;\n if (Object.keys(where).length > 0) {\n sql += ` WHERE ${compileWhere(where, params)}`;\n }\n return sql;\n}\n"],"mappings":"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"}
@@ -103,6 +103,7 @@ function compileColumnDef(col, dialect) {
103
103
  if (col.unique && !col.primaryKey) parts.push("UNIQUE");
104
104
  if (col.defaultValue !== void 0) if (typeof col.defaultValue === "string") parts.push(`DEFAULT '${col.defaultValue}'`);
105
105
  else if (col.defaultValue === null) parts.push("DEFAULT NULL");
106
+ else if (col.defaultValue instanceof Date) parts.push(`DEFAULT '${col.defaultValue.toISOString()}'`);
106
107
  else parts.push(`DEFAULT ${col.defaultValue}`);
107
108
  return parts.join(" ");
108
109
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sql-compiler.mjs","names":[],"sources":["../../src/drivers/sql-compiler.ts"],"sourcesContent":["import type {\n ColumnDataType,\n ColumnMetadata,\n DatabaseType,\n TableMetadata,\n WhereClause,\n WhereCondition,\n} from \"../types\";\n\n/**\n * Compile column type to SQL string for a specific database dialect\n * @param {ColumnMetadata} col - Column metadata\n * @param {DatabaseType} dialect - Database dialect\n * @returns {string} SQL column type string\n */\nexport function compileColumnType(col: ColumnMetadata, dialect: DatabaseType): string {\n const name = typeof dialect === \"string\" ? dialect : dialect.name;\n\n const typeMap: Record<ColumnDataType, Record<string, string>> = {\n integer: { mysql: \"INT\", mariadb: \"INT\", sqlite: \"INTEGER\", file: \"INTEGER\" },\n bigint: { mysql: \"BIGINT\", mariadb: \"BIGINT\", sqlite: \"INTEGER\", file: \"BIGINT\" },\n varchar: {\n mysql: `VARCHAR(${col.length ?? 255})`,\n mariadb: `VARCHAR(${col.length ?? 255})`,\n sqlite: \"TEXT\",\n file: \"VARCHAR\",\n },\n char: {\n mysql: `CHAR(${col.length ?? 1})`,\n mariadb: `CHAR(${col.length ?? 1})`,\n sqlite: \"TEXT\",\n file: \"CHAR\",\n },\n text: { mysql: \"TEXT\", mariadb: \"TEXT\", sqlite: \"TEXT\", file: \"TEXT\" },\n boolean: { mysql: \"TINYINT(1)\", mariadb: \"TINYINT(1)\", sqlite: \"INTEGER\", file: \"BOOLEAN\" },\n json: { mysql: \"JSON\", mariadb: \"JSON\", sqlite: \"TEXT\", file: \"JSON\" },\n array: { mysql: \"JSON\", mariadb: \"JSON\", sqlite: \"TEXT\", file: \"JSON\" },\n datetime: { mysql: \"DATETIME\", mariadb: \"DATETIME\", sqlite: \"TEXT\", file: \"DATETIME\" },\n timestamp: { mysql: \"TIMESTAMP\", mariadb: \"TIMESTAMP\", sqlite: \"TEXT\", file: \"TIMESTAMP\" },\n decimal: {\n mysql: `DECIMAL(${col.precision ?? 10},${col.scale ?? 2})`,\n mariadb: `DECIMAL(${col.precision ?? 10},${col.scale ?? 2})`,\n sqlite: \"REAL\",\n file: \"DECIMAL\",\n },\n float: { mysql: \"FLOAT\", mariadb: \"FLOAT\", sqlite: \"REAL\", file: \"FLOAT\" },\n blob: { mysql: \"BLOB\", mariadb: \"BLOB\", sqlite: \"BLOB\", file: \"BLOB\" },\n };\n\n return typeMap[col.type]?.[name] ?? \"TEXT\";\n}\n\n/**\n * Compile a column definition to a SQL fragment\n * @param {ColumnMetadata} col - Column metadata\n * @param {DatabaseType} dialect - Database dialect\n * @returns {string} SQL column definition\n */\nexport function compileColumnDef(col: ColumnMetadata, dialect: DatabaseType): string {\n const parts: string[] = [`\\`${col.name}\\``, compileColumnType(col, dialect)];\n\n if (col.primaryKey) {\n parts.push(\"PRIMARY KEY\");\n }\n if (col.autoIncrement) {\n parts.push(dialect === \"mysql\" ? \"AUTO_INCREMENT\" : \"AUTOINCREMENT\");\n }\n if (col.notNull && !col.primaryKey) {\n parts.push(\"NOT NULL\");\n }\n if (col.unique && !col.primaryKey) {\n parts.push(\"UNIQUE\");\n }\n if (col.defaultValue !== undefined) {\n if (typeof col.defaultValue === \"string\") {\n parts.push(`DEFAULT '${col.defaultValue}'`);\n } else if (col.defaultValue === null) {\n parts.push(\"DEFAULT NULL\");\n } else {\n parts.push(`DEFAULT ${col.defaultValue}`);\n }\n }\n\n return parts.join(\" \");\n}\n\n/**\n * Compile a CREATE TABLE statement from table metadata\n * @param {TableMetadata} table - Table metadata\n * @param {DatabaseType} dialect - Database dialect\n * @returns {string} CREATE TABLE SQL statement\n */\nexport function compileCreateTable(table: TableMetadata, dialect: DatabaseType): string {\n const columnDefs: string[] = [];\n const constraints: string[] = [];\n\n for (const col of table.columns) {\n columnDefs.push(compileColumnDef(col, dialect));\n\n if (col.references) {\n const onDelete = col.references.onDelete ? ` ON DELETE ${col.references.onDelete}` : \"\";\n const onUpdate = col.references.onUpdate ? ` ON UPDATE ${col.references.onUpdate}` : \"\";\n constraints.push(\n `FOREIGN KEY (\\`${col.name}\\`) REFERENCES \\`${col.references.table}\\`(\\`${col.references.column}\\`)${onDelete}${onUpdate}`,\n );\n }\n }\n\n const allDefs = [...columnDefs, ...constraints].join(\", \");\n return `CREATE TABLE IF NOT EXISTS \\`${table.name}\\` (${allDefs})`;\n}\n\n/**\n * Compile a WHERE clause from a condition object\n * @param {WhereClause} where - Where clause object\n * @param {unknown[]} params - Parameter array to push values into\n * @returns {string} SQL WHERE fragment\n */\nexport function compileWhere(where: WhereClause, params: unknown[]): string {\n const conditions: string[] = [];\n\n for (const [key, value] of Object.entries(where)) {\n if (key === \"OR\" && Array.isArray(value)) {\n const orParts = (value as WhereClause[]).map((sub) => compileWhere(sub, params));\n if (orParts.length > 0) {\n conditions.push(`(${orParts.join(\" OR \")})`);\n }\n continue;\n }\n if (key === \"AND\" && Array.isArray(value)) {\n const andParts = (value as WhereClause[]).map((sub) => compileWhere(sub, params));\n if (andParts.length > 0) {\n conditions.push(`(${andParts.join(\" AND \")})`);\n }\n continue;\n }\n\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) {\n const cond = value as WhereCondition;\n if (cond.eq !== undefined) {\n params.push(cond.eq);\n conditions.push(`\\`${key}\\` = ?`);\n }\n if (cond.neq !== undefined) {\n params.push(cond.neq);\n conditions.push(`\\`${key}\\` != ?`);\n }\n if (cond.gt !== undefined) {\n params.push(cond.gt);\n conditions.push(`\\`${key}\\` > ?`);\n }\n if (cond.gte !== undefined) {\n params.push(cond.gte);\n conditions.push(`\\`${key}\\` >= ?`);\n }\n if (cond.lt !== undefined) {\n params.push(cond.lt);\n conditions.push(`\\`${key}\\` < ?`);\n }\n if (cond.lte !== undefined) {\n params.push(cond.lte);\n conditions.push(`\\`${key}\\` <= ?`);\n }\n if (cond.like !== undefined) {\n params.push(cond.like);\n conditions.push(`\\`${key}\\` LIKE ?`);\n }\n if (cond.notLike !== undefined) {\n params.push(cond.notLike);\n conditions.push(`\\`${key}\\` NOT LIKE ?`);\n }\n if (cond.in !== undefined && Array.isArray(cond.in)) {\n const placeholders = cond.in.map(() => \"?\").join(\", \");\n params.push(...cond.in);\n conditions.push(`\\`${key}\\` IN (${placeholders})`);\n }\n if (cond.notIn !== undefined && Array.isArray(cond.notIn)) {\n const placeholders = cond.notIn.map(() => \"?\").join(\", \");\n params.push(...cond.notIn);\n conditions.push(`\\`${key}\\` NOT IN (${placeholders})`);\n }\n if (cond.isNull === true) {\n conditions.push(`\\`${key}\\` IS NULL`);\n }\n if (cond.isNull === false) {\n conditions.push(`\\`${key}\\` IS NOT NULL`);\n }\n if (cond.between !== undefined && Array.isArray(cond.between)) {\n params.push(cond.between[0], cond.between[1]);\n conditions.push(`\\`${key}\\` BETWEEN ? AND ?`);\n }\n } else {\n params.push(value);\n conditions.push(`\\`${key}\\` = ?`);\n }\n }\n\n return conditions.length > 0 ? conditions.join(\" AND \") : \"1=1\";\n}\n\n/**\n * Compile a SELECT query from options\n * @param {string} tableName - Table name\n * @param {object} options - Query options\n * @param {unknown[]} params - Parameter array\n * @returns {string} SQL SELECT statement\n */\nexport function compileSelect(\n tableName: string,\n options: {\n select?: string[];\n where?: WhereClause;\n orderBy?: Record<string, \"asc\" | \"desc\">;\n take?: number;\n skip?: number;\n },\n params: unknown[],\n): string {\n const cols = options.select?.map((c) => `\\`${String(c)}\\``).join(\", \") ?? \"*\";\n let sql = `SELECT ${cols} FROM \\`${tableName}\\``;\n\n if (options.where && Object.keys(options.where).length > 0) {\n sql += ` WHERE ${compileWhere(options.where, params)}`;\n }\n if (options.orderBy) {\n const orderParts = Object.entries(options.orderBy).map(\n ([col, dir]) => `\\`${col}\\` ${dir.toUpperCase()}`,\n );\n if (orderParts.length > 0) {\n sql += ` ORDER BY ${orderParts.join(\", \")}`;\n }\n }\n if (options.take !== undefined) {\n sql += ` LIMIT ${options.take}`;\n }\n if (options.skip !== undefined) {\n sql += ` OFFSET ${options.skip}`;\n }\n\n return sql;\n}\n\n/**\n * Compile an INSERT statement\n * @param {string} tableName - Table name\n * @param {Record<string, unknown>} data - Data to insert\n * @param {unknown[]} params - Parameter array\n * @returns {string} SQL INSERT statement\n */\nexport function compileInsert(\n tableName: string,\n data: Record<string, unknown>,\n params: unknown[],\n): string {\n const keys = Object.keys(data);\n const cols = keys.map((k) => `\\`${k}\\``).join(\", \");\n const placeholders = keys.map(() => \"?\").join(\", \");\n params.push(...keys.map((k) => data[k]));\n return `INSERT INTO \\`${tableName}\\` (${cols}) VALUES (${placeholders})`;\n}\n\n/**\n * Compile a bulk INSERT statement for multiple rows\n * @param {string} tableName - Table name\n * @param {Record<string, unknown>[]} data - Array of data to insert\n * @param {unknown[]} params - Parameter array\n * @returns {string} SQL bulk INSERT statement\n */\nexport function compileBulkInsert(\n tableName: string,\n data: Record<string, unknown>[],\n params: unknown[],\n): string {\n if (data.length === 0) {\n return \"\";\n }\n const keys = Object.keys(data[0]!);\n const cols = keys.map((k) => `\\`${k}\\``).join(\", \");\n const valuePlaceholders = data.map(() => `(${keys.map(() => \"?\").join(\", \")})`).join(\", \");\n\n for (const row of data) {\n for (const key of keys) {\n params.push(row[key]);\n }\n }\n\n return `INSERT INTO \\`${tableName}\\` (${cols}) VALUES ${valuePlaceholders}`;\n}\n\n/**\n * Compile an UPDATE statement\n * @param {string} tableName - Table name\n * @param {Record<string, unknown>} data - Data to update\n * @param {WhereClause} where - Where clause\n * @param {unknown[]} params - Parameter array\n * @returns {string} SQL UPDATE statement\n */\nexport function compileUpdate(\n tableName: string,\n data: Record<string, unknown>,\n where: WhereClause,\n params: unknown[],\n): string {\n const setParts = Object.keys(data).map((k) => {\n params.push(data[k]);\n return `\\`${k}\\` = ?`;\n });\n let sql = `UPDATE \\`${tableName}\\` SET ${setParts.join(\", \")}`;\n if (Object.keys(where).length > 0) {\n sql += ` WHERE ${compileWhere(where, params)}`;\n }\n return sql;\n}\n\n/**\n * Compile a DELETE statement\n * @param {string} tableName - Table name\n * @param {WhereClause} where - Where clause\n * @param {unknown[]} params - Parameter array\n * @returns {string} SQL DELETE statement\n */\nexport function compileDelete(tableName: string, where: WhereClause, params: unknown[]): string {\n let sql = `DELETE FROM \\`${tableName}\\``;\n if (Object.keys(where).length > 0) {\n sql += ` WHERE ${compileWhere(where, params)}`;\n }\n return sql;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"sql-compiler.mjs","names":[],"sources":["../../src/drivers/sql-compiler.ts"],"sourcesContent":["import type {\n ColumnDataType,\n ColumnMetadata,\n DatabaseType,\n TableMetadata,\n WhereClause,\n WhereCondition,\n} from \"../types\";\n\n/**\n * Compile column type to SQL string for a specific database dialect\n * @param {ColumnMetadata} col - Column metadata\n * @param {DatabaseType} dialect - Database dialect\n * @returns {string} SQL column type string\n */\nexport function compileColumnType(col: ColumnMetadata, dialect: DatabaseType): string {\n const name = typeof dialect === \"string\" ? dialect : dialect.name;\n\n const typeMap: Record<ColumnDataType, Record<string, string>> = {\n integer: { mysql: \"INT\", mariadb: \"INT\", sqlite: \"INTEGER\", file: \"INTEGER\" },\n bigint: { mysql: \"BIGINT\", mariadb: \"BIGINT\", sqlite: \"INTEGER\", file: \"BIGINT\" },\n varchar: {\n mysql: `VARCHAR(${col.length ?? 255})`,\n mariadb: `VARCHAR(${col.length ?? 255})`,\n sqlite: \"TEXT\",\n file: \"VARCHAR\",\n },\n char: {\n mysql: `CHAR(${col.length ?? 1})`,\n mariadb: `CHAR(${col.length ?? 1})`,\n sqlite: \"TEXT\",\n file: \"CHAR\",\n },\n text: { mysql: \"TEXT\", mariadb: \"TEXT\", sqlite: \"TEXT\", file: \"TEXT\" },\n boolean: { mysql: \"TINYINT(1)\", mariadb: \"TINYINT(1)\", sqlite: \"INTEGER\", file: \"BOOLEAN\" },\n json: { mysql: \"JSON\", mariadb: \"JSON\", sqlite: \"TEXT\", file: \"JSON\" },\n array: { mysql: \"JSON\", mariadb: \"JSON\", sqlite: \"TEXT\", file: \"JSON\" },\n datetime: { mysql: \"DATETIME\", mariadb: \"DATETIME\", sqlite: \"TEXT\", file: \"DATETIME\" },\n timestamp: { mysql: \"TIMESTAMP\", mariadb: \"TIMESTAMP\", sqlite: \"TEXT\", file: \"TIMESTAMP\" },\n decimal: {\n mysql: `DECIMAL(${col.precision ?? 10},${col.scale ?? 2})`,\n mariadb: `DECIMAL(${col.precision ?? 10},${col.scale ?? 2})`,\n sqlite: \"REAL\",\n file: \"DECIMAL\",\n },\n float: { mysql: \"FLOAT\", mariadb: \"FLOAT\", sqlite: \"REAL\", file: \"FLOAT\" },\n blob: { mysql: \"BLOB\", mariadb: \"BLOB\", sqlite: \"BLOB\", file: \"BLOB\" },\n };\n\n return typeMap[col.type]?.[name] ?? \"TEXT\";\n}\n\n/**\n * Compile a column definition to a SQL fragment\n * @param {ColumnMetadata} col - Column metadata\n * @param {DatabaseType} dialect - Database dialect\n * @returns {string} SQL column definition\n */\nexport function compileColumnDef(col: ColumnMetadata, dialect: DatabaseType): string {\n const parts: string[] = [`\\`${col.name}\\``, compileColumnType(col, dialect)];\n\n if (col.primaryKey) {\n parts.push(\"PRIMARY KEY\");\n }\n if (col.autoIncrement) {\n parts.push(dialect === \"mysql\" ? \"AUTO_INCREMENT\" : \"AUTOINCREMENT\");\n }\n if (col.notNull && !col.primaryKey) {\n parts.push(\"NOT NULL\");\n }\n if (col.unique && !col.primaryKey) {\n parts.push(\"UNIQUE\");\n }\n if (col.defaultValue !== undefined) {\n if (typeof col.defaultValue === \"string\") {\n parts.push(`DEFAULT '${col.defaultValue}'`);\n } else if (col.defaultValue === null) {\n parts.push(\"DEFAULT NULL\");\n } else if (col.defaultValue instanceof Date) {\n parts.push(`DEFAULT '${col.defaultValue.toISOString()}'`);\n } else {\n parts.push(`DEFAULT ${col.defaultValue}`);\n }\n }\n\n return parts.join(\" \");\n}\n\n/**\n * Compile a CREATE TABLE statement from table metadata\n * @param {TableMetadata} table - Table metadata\n * @param {DatabaseType} dialect - Database dialect\n * @returns {string} CREATE TABLE SQL statement\n */\nexport function compileCreateTable(table: TableMetadata, dialect: DatabaseType): string {\n const columnDefs: string[] = [];\n const constraints: string[] = [];\n\n for (const col of table.columns) {\n columnDefs.push(compileColumnDef(col, dialect));\n\n if (col.references) {\n const onDelete = col.references.onDelete ? ` ON DELETE ${col.references.onDelete}` : \"\";\n const onUpdate = col.references.onUpdate ? ` ON UPDATE ${col.references.onUpdate}` : \"\";\n constraints.push(\n `FOREIGN KEY (\\`${col.name}\\`) REFERENCES \\`${col.references.table}\\`(\\`${col.references.column}\\`)${onDelete}${onUpdate}`,\n );\n }\n }\n\n const allDefs = [...columnDefs, ...constraints].join(\", \");\n return `CREATE TABLE IF NOT EXISTS \\`${table.name}\\` (${allDefs})`;\n}\n\n/**\n * Compile a WHERE clause from a condition object\n * @param {WhereClause} where - Where clause object\n * @param {unknown[]} params - Parameter array to push values into\n * @returns {string} SQL WHERE fragment\n */\nexport function compileWhere(where: WhereClause, params: unknown[]): string {\n const conditions: string[] = [];\n\n for (const [key, value] of Object.entries(where)) {\n if (key === \"OR\" && Array.isArray(value)) {\n const orParts = (value as WhereClause[]).map((sub) => compileWhere(sub, params));\n if (orParts.length > 0) {\n conditions.push(`(${orParts.join(\" OR \")})`);\n }\n continue;\n }\n if (key === \"AND\" && Array.isArray(value)) {\n const andParts = (value as WhereClause[]).map((sub) => compileWhere(sub, params));\n if (andParts.length > 0) {\n conditions.push(`(${andParts.join(\" AND \")})`);\n }\n continue;\n }\n\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) {\n const cond = value as WhereCondition;\n if (cond.eq !== undefined) {\n params.push(cond.eq);\n conditions.push(`\\`${key}\\` = ?`);\n }\n if (cond.neq !== undefined) {\n params.push(cond.neq);\n conditions.push(`\\`${key}\\` != ?`);\n }\n if (cond.gt !== undefined) {\n params.push(cond.gt);\n conditions.push(`\\`${key}\\` > ?`);\n }\n if (cond.gte !== undefined) {\n params.push(cond.gte);\n conditions.push(`\\`${key}\\` >= ?`);\n }\n if (cond.lt !== undefined) {\n params.push(cond.lt);\n conditions.push(`\\`${key}\\` < ?`);\n }\n if (cond.lte !== undefined) {\n params.push(cond.lte);\n conditions.push(`\\`${key}\\` <= ?`);\n }\n if (cond.like !== undefined) {\n params.push(cond.like);\n conditions.push(`\\`${key}\\` LIKE ?`);\n }\n if (cond.notLike !== undefined) {\n params.push(cond.notLike);\n conditions.push(`\\`${key}\\` NOT LIKE ?`);\n }\n if (cond.in !== undefined && Array.isArray(cond.in)) {\n const placeholders = cond.in.map(() => \"?\").join(\", \");\n params.push(...cond.in);\n conditions.push(`\\`${key}\\` IN (${placeholders})`);\n }\n if (cond.notIn !== undefined && Array.isArray(cond.notIn)) {\n const placeholders = cond.notIn.map(() => \"?\").join(\", \");\n params.push(...cond.notIn);\n conditions.push(`\\`${key}\\` NOT IN (${placeholders})`);\n }\n if (cond.isNull === true) {\n conditions.push(`\\`${key}\\` IS NULL`);\n }\n if (cond.isNull === false) {\n conditions.push(`\\`${key}\\` IS NOT NULL`);\n }\n if (cond.between !== undefined && Array.isArray(cond.between)) {\n params.push(cond.between[0], cond.between[1]);\n conditions.push(`\\`${key}\\` BETWEEN ? AND ?`);\n }\n } else {\n params.push(value);\n conditions.push(`\\`${key}\\` = ?`);\n }\n }\n\n return conditions.length > 0 ? conditions.join(\" AND \") : \"1=1\";\n}\n\n/**\n * Compile a SELECT query from options\n * @param {string} tableName - Table name\n * @param {object} options - Query options\n * @param {unknown[]} params - Parameter array\n * @returns {string} SQL SELECT statement\n */\nexport function compileSelect(\n tableName: string,\n options: {\n select?: string[];\n where?: WhereClause;\n orderBy?: Record<string, \"asc\" | \"desc\">;\n take?: number;\n skip?: number;\n },\n params: unknown[],\n): string {\n const cols = options.select?.map((c) => `\\`${String(c)}\\``).join(\", \") ?? \"*\";\n let sql = `SELECT ${cols} FROM \\`${tableName}\\``;\n\n if (options.where && Object.keys(options.where).length > 0) {\n sql += ` WHERE ${compileWhere(options.where, params)}`;\n }\n if (options.orderBy) {\n const orderParts = Object.entries(options.orderBy).map(\n ([col, dir]) => `\\`${col}\\` ${dir.toUpperCase()}`,\n );\n if (orderParts.length > 0) {\n sql += ` ORDER BY ${orderParts.join(\", \")}`;\n }\n }\n if (options.take !== undefined) {\n sql += ` LIMIT ${options.take}`;\n }\n if (options.skip !== undefined) {\n sql += ` OFFSET ${options.skip}`;\n }\n\n return sql;\n}\n\n/**\n * Compile an INSERT statement\n * @param {string} tableName - Table name\n * @param {Record<string, unknown>} data - Data to insert\n * @param {unknown[]} params - Parameter array\n * @returns {string} SQL INSERT statement\n */\nexport function compileInsert(\n tableName: string,\n data: Record<string, unknown>,\n params: unknown[],\n): string {\n const keys = Object.keys(data);\n const cols = keys.map((k) => `\\`${k}\\``).join(\", \");\n const placeholders = keys.map(() => \"?\").join(\", \");\n params.push(...keys.map((k) => data[k]));\n return `INSERT INTO \\`${tableName}\\` (${cols}) VALUES (${placeholders})`;\n}\n\n/**\n * Compile a bulk INSERT statement for multiple rows\n * @param {string} tableName - Table name\n * @param {Record<string, unknown>[]} data - Array of data to insert\n * @param {unknown[]} params - Parameter array\n * @returns {string} SQL bulk INSERT statement\n */\nexport function compileBulkInsert(\n tableName: string,\n data: Record<string, unknown>[],\n params: unknown[],\n): string {\n if (data.length === 0) {\n return \"\";\n }\n const keys = Object.keys(data[0]!);\n const cols = keys.map((k) => `\\`${k}\\``).join(\", \");\n const valuePlaceholders = data.map(() => `(${keys.map(() => \"?\").join(\", \")})`).join(\", \");\n\n for (const row of data) {\n for (const key of keys) {\n params.push(row[key]);\n }\n }\n\n return `INSERT INTO \\`${tableName}\\` (${cols}) VALUES ${valuePlaceholders}`;\n}\n\n/**\n * Compile an UPDATE statement\n * @param {string} tableName - Table name\n * @param {Record<string, unknown>} data - Data to update\n * @param {WhereClause} where - Where clause\n * @param {unknown[]} params - Parameter array\n * @returns {string} SQL UPDATE statement\n */\nexport function compileUpdate(\n tableName: string,\n data: Record<string, unknown>,\n where: WhereClause,\n params: unknown[],\n): string {\n const setParts = Object.keys(data).map((k) => {\n params.push(data[k]);\n return `\\`${k}\\` = ?`;\n });\n let sql = `UPDATE \\`${tableName}\\` SET ${setParts.join(\", \")}`;\n if (Object.keys(where).length > 0) {\n sql += ` WHERE ${compileWhere(where, params)}`;\n }\n return sql;\n}\n\n/**\n * Compile a DELETE statement\n * @param {string} tableName - Table name\n * @param {WhereClause} where - Where clause\n * @param {unknown[]} params - Parameter array\n * @returns {string} SQL DELETE statement\n */\nexport function compileDelete(tableName: string, where: WhereClause, params: unknown[]): string {\n let sql = `DELETE FROM \\`${tableName}\\``;\n if (Object.keys(where).length > 0) {\n sql += ` WHERE ${compileWhere(where, params)}`;\n }\n return sql;\n}\n"],"mappings":"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"}
@@ -6,6 +6,7 @@ const require_sql_compiler = require("./sql-compiler.cjs");
6
6
  * SQLite database driver supporting multiple libraries (better-sqlite3, sqlite3, sql.js, bun:sqlite)
7
7
  */
8
8
  var SQLiteDriver = class extends require_driver.BaseDriver {
9
+ dialect = "sqlite";
9
10
  db = null;
10
11
  config;
11
12
  provider;