@earth-app/collegedb 1.2.2 → 1.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +7 -7
- package/dist/index.js.map +3 -3
- package/dist/providers-memory.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -9,9 +9,9 @@
|
|
|
9
9
|
"/**\n * @fileoverview Durable Object for coordinating shard allocation and maintaining statistics\n *\n * This module provides the ShardCoordinator Durable Object that manages shard allocation\n * strategies and maintains real-time statistics about shard utilization. It provides\n * an HTTP API for other parts of the system to interact with the coordinator.\n *\n * @example\n * ```typescript\n * // In wrangler.jsonc:\n * // {\n * // \"durable_objects\": {\n * // \"bindings\": [\n * // { \"name\": \"ShardCoordinator\", \"class_name\": \"ShardCoordinator\" }\n * // ]\n * // }\n * // }\n *\n * // Usage in a Worker:\n * const coordinatorId = env.ShardCoordinator.idFromName('default');\n * const coordinator = env.ShardCoordinator.get(coordinatorId);\n * const response = await coordinator.fetch('http://coordinator/allocate', {\n * method: 'POST',\n * body: JSON.stringify({ primaryKey: 'user-123', strategy: 'hash' })\n * });\n * ```\n *\n * @author CollegeDB Team\n * @since 1.0.0\n */\n\nimport type { DurableObjectState } from '@cloudflare/workers-types';\nimport { CollegeDBError } from './errors';\nimport type { D1Region, MixedShardingStrategy, OperationType, ShardCoordinatorState, ShardingStrategy } from './types';\n\n/**\n * Durable Object for coordinating shard allocation and maintaining statistics\n *\n * The ShardCoordinator is a Cloudflare Durable Object that provides centralized\n * coordination for shard allocation across multiple D1 databases. It maintains\n * state about available shards, allocation strategies, and usage statistics.\n *\n * Key responsibilities:\n * - Track available D1 shards and their current load\n * - Implement allocation strategies (round-robin, random, hash-based)\n * - Provide HTTP API for shard allocation and management\n * - Maintain persistent state using Durable Object storage\n *\n * @example\n * ```typescript\n * // Allocate a shard for a new primary key\n * const response = await coordinator.fetch('http://coordinator/allocate', {\n * method: 'POST',\n * body: JSON.stringify({ primaryKey: 'user-456', strategy: 'hash' })\n * });\n * const { shard } = await response.json();\n * ```\n */\nexport class ShardCoordinator {\n\t/**\n\t * Durable Object state handle for persistent storage\n\t * @private\n\t */\n\tprivate state: DurableObjectState;\n\n\t/**\n\t * Creates a new ShardCoordinator instance\n\t * @param state - Durable Object state provided by Cloudflare runtime\n\t */\n\tconstructor(state: DurableObjectState) {\n\t\tthis.state = state;\n\t}\n\n\t/**\n\t * Gets the current coordinator state from persistent storage\n\t *\n\t * Retrieves the coordinator state from Durable Object storage, returning\n\t * a default state if none exists. The state includes known shards, statistics,\n\t * allocation strategy, and round-robin counter.\n\t *\n\t * @private\n\t * @returns Promise resolving to the current coordinator state\n\t * @throws {Error} If storage access fails\n\t */\n\tprivate async getState(): Promise<ShardCoordinatorState> {\n\t\tconst state = await this.state.storage.get<ShardCoordinatorState>('coordinator_state');\n\t\treturn (\n\t\t\tstate || {\n\t\t\t\tknownShards: [],\n\t\t\t\tshardStats: {},\n\t\t\t\tstrategy: 'round-robin',\n\t\t\t\troundRobinIndex: 0\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Saves the coordinator state to persistent storage\n\t *\n\t * Persists the coordinator state to Durable Object storage. This includes\n\t * all shard information, statistics, and configuration.\n\t *\n\t * @private\n\t * @param state - The coordinator state to persist\n\t * @returns Promise that resolves when state is saved\n\t * @throws {Error} If storage write fails\n\t */\n\tprivate async saveState(state: ShardCoordinatorState): Promise<void> {\n\t\tawait this.state.storage.put('coordinator_state', state);\n\t}\n\n\t/**\n\t * Handles HTTP requests to the Durable Object\n\t *\n\t * Main entry point for all HTTP requests to the ShardCoordinator. Routes\n\t * requests based on method and path to appropriate handler functions.\n\t *\n\t * Supported endpoints:\n\t * - GET /shards - List all known shards\n\t * - POST /shards - Add a new shard\n\t * - DELETE /shards - Remove a shard\n\t * - GET /stats - Get shard statistics\n\t * - POST /stats - Update shard statistics\n\t * - POST /allocate - Allocate a shard for a primary key\n\t * - POST /flush - Clear all coordinator state (development only)\n\t * - GET /health - Health check endpoint\n\t *\n\t * @param request - The incoming HTTP request\n\t * @returns Promise resolving to HTTP response\n\t * @example\n\t * ```typescript\n\t * // Allocate a shard\n\t * const response = await coordinator.fetch('http://coordinator/allocate', {\n\t * method: 'POST',\n\t * headers: { 'Content-Type': 'application/json' },\n\t * body: JSON.stringify({ primaryKey: 'user-123' })\n\t * });\n\t * ```\n\t */\n\tasync fetch(request: Request): Promise<Response> {\n\t\tconst url = new URL(request.url);\n\t\tconst path = url.pathname;\n\t\tconst method = request.method;\n\n\t\ttry {\n\t\t\tswitch (`${method} ${path}`) {\n\t\t\t\tcase 'GET /shards':\n\t\t\t\t\treturn this.handleListShards();\n\t\t\t\tcase 'POST /shards':\n\t\t\t\t\treturn this.handleAddShard(request);\n\t\t\t\tcase 'DELETE /shards':\n\t\t\t\t\treturn this.handleRemoveShard(request);\n\t\t\t\tcase 'GET /stats':\n\t\t\t\t\treturn this.handleGetStats();\n\t\t\t\tcase 'POST /stats':\n\t\t\t\t\treturn this.handleUpdateStats(request);\n\t\t\t\tcase 'POST /allocate':\n\t\t\t\t\treturn this.handleAllocateShard(request);\n\t\t\t\tcase 'POST /flush':\n\t\t\t\t\treturn this.handleFlush();\n\t\t\t\tcase 'GET /health':\n\t\t\t\t\treturn new Response('OK', { status: 200 });\n\t\t\t\tdefault:\n\t\t\t\t\treturn new Response('Not Found', { status: 404 });\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('ShardCoordinator error:', error);\n\t\t\treturn new Response('Internal Server Error', { status: 500 });\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves all known shards as a JSON array of all D1 binding names that have been registered\n\t * with the coordinator.\n\t * @private\n\t * @returns Promise resolving to HTTP response with shard list\n\t * @example Response body: `[\"db-east\", \"db-west\", \"db-central\"]`\n\t */\n\tprivate async handleListShards(): Promise<Response> {\n\t\tconst state = await this.getState();\n\t\treturn new Response(JSON.stringify(state.knownShards), {\n\t\t\theaders: { 'Content-Type': 'application/json' }\n\t\t});\n\t}\n\n\t/**\n\t * Registers a new D1 database binding with the coordinator. If the shard\n\t * is already known, this operation is idempotent. Initializes statistics\n\t * for the new shard.\n\t * @private\n\t * @param request - HTTP request containing shard binding name in JSON body\n\t * @returns Promise resolving to HTTP response indicating success\n\t * @throws {Error} If request body is invalid JSON\n\t * @example Request body: `{\"shard\": \"db-new-region\"}`\n\t */\n\tprivate async handleAddShard(request: Request): Promise<Response> {\n\t\tconst { shard } = (await request.json()) as { shard: string };\n\n\t\t// Validate required parameters\n\t\tif (!shard || typeof shard !== 'string') {\n\t\t\treturn new Response(JSON.stringify({ error: 'Missing or invalid shard parameter' }), {\n\t\t\t\tstatus: 400,\n\t\t\t\theaders: { 'Content-Type': 'application/json' }\n\t\t\t});\n\t\t}\n\n\t\tconst state = await this.getState();\n\n\t\tif (!state.knownShards.includes(shard)) {\n\t\t\tstate.knownShards.push(shard);\n\t\t\tstate.shardStats[shard] = {\n\t\t\t\tbinding: shard,\n\t\t\t\tcount: 0,\n\t\t\t\tlastUpdated: Date.now()\n\t\t\t};\n\t\t\tawait this.saveState(state);\n\t\t}\n\n\t\treturn new Response(JSON.stringify({ success: true }), {\n\t\t\theaders: { 'Content-Type': 'application/json' }\n\t\t});\n\t}\n\n\t/**\n\t * Unregisters a D1 database binding from the coordinator. Removes the shard\n\t * from the known shards list and deletes its statistics. Adjusts the round-robin\n\t * index if necessary to prevent out-of-bounds access.\n\t * @private\n\t * @param request - HTTP request containing shard binding name in JSON body\n\t * @returns Promise resolving to HTTP response indicating success\n\t * @throws {Error} If request body is invalid JSON\n\t * @example Request body: `{\"shard\": \"db-old-region\"}`\n\t */\n\tprivate async handleRemoveShard(request: Request): Promise<Response> {\n\t\tconst { shard } = (await request.json()) as { shard: string };\n\n\t\t// Validate required parameters\n\t\tif (!shard || typeof shard !== 'string') {\n\t\t\treturn new Response(JSON.stringify({ error: 'Missing or invalid shard parameter' }), {\n\t\t\t\tstatus: 400,\n\t\t\t\theaders: { 'Content-Type': 'application/json' }\n\t\t\t});\n\t\t}\n\n\t\tconst state = await this.getState();\n\n\t\tconst index = state.knownShards.indexOf(shard);\n\t\tif (index > -1) {\n\t\t\tstate.knownShards.splice(index, 1);\n\t\t\tdelete state.shardStats[shard];\n\t\t\t// Adjust round-robin index if necessary\n\t\t\tif (state.roundRobinIndex >= state.knownShards.length) {\n\t\t\t\tstate.roundRobinIndex = 0;\n\t\t\t}\n\t\t\tawait this.saveState(state);\n\t\t}\n\n\t\treturn new Response(JSON.stringify({ success: true }), {\n\t\t\theaders: { 'Content-Type': 'application/json' }\n\t\t});\n\t}\n\n\t/**\n\t * Returns an array of statistics for all known shards, including\n\t * binding names, key counts, and last updated timestamps.\n\t * @private\n\t * @returns Promise resolving to HTTP response with statistics array\n\t * @example Response body: `[{\"binding\": \"db-east\", \"count\": 1234, \"lastUpdated\": 1672531200000}]`\n\t */\n\tprivate async handleGetStats(): Promise<Response> {\n\t\tconst state = await this.getState();\n\t\tconst stats = Object.values(state.shardStats);\n\t\treturn new Response(JSON.stringify(stats), {\n\t\t\theaders: { 'Content-Type': 'application/json' }\n\t\t});\n\t}\n\n\t/**\n\t * Updates the key count and last updated timestamp for a specific shard.\n\t * Used by other parts of the system to report changes in shard utilization.\n\t * @private\n\t * @param request - HTTP request containing shard name and count in JSON body\n\t * @returns Promise resolving to HTTP response indicating success\n\t * @throws {Error} If request body is invalid JSON or shard doesn't exist\n\t * @example Request body: `{\"shard\": \"db-east\", \"count\": 1500}`\n\t */\n\tprivate async handleUpdateStats(request: Request): Promise<Response> {\n\t\tconst { shard, count } = (await request.json()) as { shard: string; count: number };\n\n\t\t// Validate required parameters\n\t\tif (!shard || typeof shard !== 'string') {\n\t\t\treturn new Response(JSON.stringify({ error: 'Missing or invalid shard parameter' }), {\n\t\t\t\tstatus: 400,\n\t\t\t\theaders: { 'Content-Type': 'application/json' }\n\t\t\t});\n\t\t}\n\n\t\tif (count === undefined || typeof count !== 'number') {\n\t\t\treturn new Response(JSON.stringify({ error: 'Missing or invalid count parameter' }), {\n\t\t\t\tstatus: 400,\n\t\t\t\theaders: { 'Content-Type': 'application/json' }\n\t\t\t});\n\t\t}\n\n\t\tconst state = await this.getState();\n\n\t\tif (state.shardStats[shard]) {\n\t\t\tstate.shardStats[shard].count = count;\n\t\t\tstate.shardStats[shard].lastUpdated = Date.now();\n\t\t\tawait this.saveState(state);\n\t\t}\n\n\t\treturn new Response(JSON.stringify({ success: true }), {\n\t\t\theaders: { 'Content-Type': 'application/json' }\n\t\t});\n\t}\n\n\t/**\n\t * Selects an appropriate shard for a new primary key using the specified\n\t * allocation strategy. Updates internal state for round-robin allocation.\n\t *\n\t * Supported strategies:\n\t * - round-robin: Cycles through shards in order\n\t * - random: Selects a random shard\n\t * - hash: Uses consistent hashing based on primary key\n\t *\n\t * @private\n\t * @param request - HTTP request containing primary key and optional strategy\n\t * @returns Promise resolving to HTTP response with selected shard\n\t * @throws {Error} If no shards are available or request body is invalid\n\t * @example Request body: `{\"primaryKey\": \"user-123\", \"strategy\": \"hash\"}`\n\t * @example Response body: `{\"shard\": \"db-west\"}`\n\t */\n\tprivate async handleAllocateShard(request: Request): Promise<Response> {\n\t\tconst { primaryKey, strategy, operationType, availableShards } = (await request.json()) as {\n\t\t\tprimaryKey: string;\n\t\t\tstrategy?: ShardingStrategy;\n\t\t\toperationType?: OperationType;\n\t\t\tavailableShards?: string[];\n\t\t};\n\n\t\tif (!primaryKey || typeof primaryKey !== 'string') {\n\t\t\treturn new Response(JSON.stringify({ error: 'Missing or invalid primaryKey parameter' }), {\n\t\t\t\tstatus: 400,\n\t\t\t\theaders: { 'Content-Type': 'application/json' }\n\t\t\t});\n\t\t}\n\n\t\tconst state = await this.getState();\n\t\tconst eligibleShards = availableShards || state.knownShards;\n\n\t\tif (eligibleShards.length === 0) {\n\t\t\treturn new Response(JSON.stringify({ error: 'No shards available' }), {\n\t\t\t\tstatus: 400,\n\t\t\t\theaders: { 'Content-Type': 'application/json' }\n\t\t\t});\n\t\t}\n\n\t\tconst effectiveStrategy = this.resolveStrategy(state.strategy, strategy, operationType || 'write');\n\t\tconst selectedShard = this.selectShard(primaryKey, state, effectiveStrategy, eligibleShards);\n\n\t\tif (effectiveStrategy === 'round-robin') {\n\t\t\tstate.roundRobinIndex = (state.roundRobinIndex + 1) % eligibleShards.length;\n\t\t\tawait this.saveState(state);\n\t\t}\n\n\t\treturn new Response(JSON.stringify({ shard: selectedShard }), {\n\t\t\theaders: { 'Content-Type': 'application/json' }\n\t\t});\n\t}\n\n\t/**\n\t * Completely clears all coordinator state from Durable Object storage.\n\t * This removes all shard registrations, statistics, and configuration.\n\t *\n\t * **WARNING**: This operation is destructive and should only be used\n\t * in development environments or during testing.\n\t *\n\t * @private\n\t * @returns Promise resolving to HTTP response indicating success\n\t * @example Response body: `{\"success\": true}`\n\t */\n\tprivate async handleFlush(): Promise<Response> {\n\t\tawait this.state.storage.deleteAll();\n\t\treturn new Response(JSON.stringify({ success: true }), {\n\t\t\theaders: { 'Content-Type': 'application/json' }\n\t\t});\n\t}\n\n\t/**\n\t * Resolves the effective sharding strategy for a given operation type\n\t *\n\t * @private\n\t * @param configStrategy - The strategy from state configuration\n\t * @param requestStrategy - Optional strategy override from request\n\t * @param operationType - The type of operation (read/write)\n\t * @returns The effective sharding strategy to use\n\t */\n\tprivate resolveStrategy(\n\t\tconfigStrategy: ShardingStrategy | MixedShardingStrategy,\n\t\trequestStrategy?: ShardingStrategy,\n\t\toperationType: OperationType = 'write'\n\t): ShardingStrategy {\n\t\t// Request strategy overrides everything\n\t\tif (requestStrategy) {\n\t\t\treturn requestStrategy;\n\t\t}\n\n\t\t// If config strategy is a string, use it for all operations\n\t\tif (typeof configStrategy === 'string') {\n\t\t\treturn configStrategy;\n\t\t}\n\n\t\t// If config strategy is a mixed strategy object, use the appropriate strategy for the operation type\n\t\treturn configStrategy[operationType];\n\t}\n\n\t/**\n\t * Implements the core shard selection logic for different allocation strategies.\n\t * Uses consistent algorithms to ensure predictable shard assignment.\n\t *\n\t * Strategy details:\n\t * - round-robin: Uses roundRobinIndex to cycle through shards\n\t * - random: Uses Math.random() for uniform distribution\n\t * - hash: Uses string hash function for consistent assignment\n\t *\n\t * @private\n\t * @param primaryKey - The primary key to allocate a shard for\n\t * @param state - Current coordinator state containing available shards\n\t * @param strategy - The allocation strategy to use\n\t * @param eligibleShards - Optional filtered list of shards to choose from\n\t * @returns The selected shard binding name\n\t * @throws {CollegeDBError} If no shards are available\n\t * @example\n\t * ```typescript\n\t * const shard = this.selectShard('user-123', state, 'hash');\n\t * // Returns: \"db-west\" (consistent for this key)\n\t * ```\n\t */\n\tprivate selectShard(primaryKey: string, state: ShardCoordinatorState, strategy: ShardingStrategy, eligibleShards?: string[]): string {\n\t\tconst shards = eligibleShards || state.knownShards;\n\n\t\tif (shards.length === 0) {\n\t\t\tthrow new CollegeDBError('No shards available', 'NO_SHARDS');\n\t\t}\n\n\t\tswitch (strategy) {\n\t\t\tcase 'round-robin':\n\t\t\t\treturn shards[state.roundRobinIndex] ?? shards[0]!;\n\t\t\tcase 'random':\n\t\t\t\treturn shards[Math.floor(Math.random() * shards.length)]!;\n\t\t\tcase 'hash': {\n\t\t\t\tlet hash = 0;\n\t\t\t\tfor (let i = 0; i < primaryKey.length; i++) {\n\t\t\t\t\tconst char = primaryKey.charCodeAt(i);\n\t\t\t\t\thash = (hash << 5) - hash + char;\n\t\t\t\t\thash = hash & hash; // Convert to 32-bit integer\n\t\t\t\t}\n\t\t\t\tconst index = Math.abs(hash) % shards.length;\n\t\t\t\treturn shards[index]!;\n\t\t\t}\n\t\t\tcase 'location': {\n\t\t\t\t// If location config missing, fallback to hash\n\t\t\t\tconst region = state.targetRegion;\n\t\t\t\tconst locations = state.shardLocations || {};\n\t\t\t\tconst located = shards.filter((s) => locations[s]);\n\t\t\t\tif (!region || located.length === 0) {\n\t\t\t\t\tlet h = 0;\n\t\t\t\t\tfor (let i = 0; i < primaryKey.length; i++) {\n\t\t\t\t\t\tconst c = primaryKey.charCodeAt(i);\n\t\t\t\t\t\th = (h << 5) - h + c;\n\t\t\t\t\t\th = h & h;\n\t\t\t\t\t}\n\t\t\t\t\tconst idx = Math.abs(h) % shards.length;\n\t\t\t\t\treturn shards[idx]!;\n\t\t\t\t}\n\n\t\t\t\t// Simple location scoring similar to router.ts\n\t\t\t\tconst coords: Record<D1Region, { lat: number; lon: number }> = {\n\t\t\t\t\t// Western North America - San Francisco, CA\n\t\t\t\t\twnam: { lat: 37.7749, lon: -122.4194 },\n\t\t\t\t\t// Eastern North America - Newark, NJ\n\t\t\t\t\tenam: { lat: 40.7357, lon: -74.1724 },\n\t\t\t\t\t// Western Europe - London, UK\n\t\t\t\t\tweur: { lat: 51.5074, lon: -0.1278 },\n\t\t\t\t\t// Eastern Europe - Warsaw, Poland\n\t\t\t\t\teeur: { lat: 52.2297, lon: 21.0122 },\n\t\t\t\t\t// Asia Pacific - Tokyo, Japan\n\t\t\t\t\tapac: { lat: 35.6762, lon: 139.6503 },\n\t\t\t\t\t// Oceania - Sydney, Australia\n\t\t\t\t\toc: { lat: -33.8688, lon: 151.2093 },\n\t\t\t\t\t// Middle East - Dubai, UAE\n\t\t\t\t\tme: { lat: 25.2048, lon: 55.2708 },\n\t\t\t\t\t// Africa - Johannesburg, South Africa\n\t\t\t\t\taf: { lat: -26.2041, lon: 28.0473 }\n\t\t\t\t};\n\n\t\t\t\tconst hasCoordKey = (obj: typeof coords, key: D1Region) => key in obj;\n\t\t\t\tconst getKey = (k: D1Region): keyof typeof coords => (hasCoordKey(coords, k) ? (k as keyof typeof coords) : 'wnam');\n\t\t\t\tconst dist = (from: D1Region, to: D1Region) => {\n\t\t\t\t\tconst a = coords[getKey(from)];\n\t\t\t\t\tconst b = coords[getKey(to)];\n\t\t\t\t\tconst lat = a.lat - b.lat;\n\t\t\t\t\tconst lon = a.lon - b.lon;\n\t\t\t\t\treturn Math.sqrt(lat * lat + lon * lon);\n\t\t\t\t};\n\n\t\t\t\tconst scores = located.map((shard) => {\n\t\t\t\t\tconst meta = locations[shard]!;\n\t\t\t\t\tconst distance = dist(region, meta.region);\n\t\t\t\t\tconst priority = meta.priority || 1;\n\t\t\t\t\treturn { shard, score: distance - priority * 0.1 };\n\t\t\t\t});\n\n\t\t\t\tscores.sort((a, b) => a.score - b.score);\n\t\t\t\tconst bestScore = scores[0]!.score;\n\t\t\t\tconst best = scores.filter((s) => Math.abs(s.score - bestScore) < 0.01);\n\t\t\t\tif (best.length === 1) return best[0]!.shard;\n\n\t\t\t\t// Tie-breaker by consistent hash\n\t\t\t\tlet h2 = 0;\n\t\t\t\tfor (let i = 0; i < primaryKey.length; i++) {\n\t\t\t\t\tconst c = primaryKey.charCodeAt(i);\n\t\t\t\t\th2 = (h2 << 5) - h2 + c;\n\t\t\t\t\th2 = h2 & h2;\n\t\t\t\t}\n\t\t\t\tconst idx2 = Math.abs(h2) % best.length;\n\t\t\t\treturn best[idx2]!.shard;\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\treturn shards[0]!;\n\t\t}\n\t}\n\n\t/**\n\t * Atomically increments the key count for a specific shard and updates\n\t * the last modified timestamp. Used when new primary keys are assigned\n\t * to a shard.\n\t * @param shard - The shard binding name to increment\n\t * @returns Promise that resolves when the count is updated\n\t * @throws {Error} If the shard is not known to the coordinator\n\t * @example\n\t * ```typescript\n\t * await coordinator.incrementShardCount('db-east');\n\t * ```\n\t */\n\tasync incrementShardCount(shard: string): Promise<void> {\n\t\tconst state = await this.getState();\n\t\tif (state.shardStats[shard]) {\n\t\t\tstate.shardStats[shard].count++;\n\t\t\tstate.shardStats[shard].lastUpdated = Date.now();\n\t\t\tawait this.saveState(state);\n\t\t}\n\t}\n\n\t/**\n\t * Atomically decrements the key count for a specific shard and updates\n\t * the last modified timestamp. Used when primary keys are removed or\n\t * moved from a shard. Prevents negative counts.\n\t * @param shard - The shard binding name to decrement\n\t * @returns Promise that resolves when the count is updated\n\t * @throws {CollegeDBError} If the shard is not known to the coordinator\n\t * @example\n\t * ```typescript\n\t * await coordinator.decrementShardCount('db-west');\n\t * ```\n\t */\n\tasync decrementShardCount(shard: string): Promise<void> {\n\t\tconst state = await this.getState();\n\t\tif (state.shardStats[shard] && state.shardStats[shard].count > 0) {\n\t\t\tstate.shardStats[shard].count--;\n\t\t\tstate.shardStats[shard].lastUpdated = Date.now();\n\t\t\tawait this.saveState(state);\n\t\t}\n\t}\n}\n",
|
|
10
10
|
"/**\n * CollegeDB - Cloudflare D1 Sharding Router\n *\n * A TypeScript library for horizontal scaling of SQLite-style databases on Cloudflare\n * using D1 and KV. Routes queries to the correct D1 database instance using primary\n * key mappings stored in Cloudflare KV.\n *\n * @author Gregory Mitchell\n * @license MIT\n */\n\n// Export main API functions\nexport {\n\tall,\n\tallAllShards,\n\tallAllShardsGlobal,\n\tallByLookupKey,\n\tallShard,\n\tcollegedb,\n\tcount,\n\tcountAllShards,\n\tcountShard,\n\tcreateSchema,\n\texplain,\n\texplainAllShards,\n\texplainShard,\n\tfirst,\n\tfirstAllShards,\n\tfirstAllShardsGlobal,\n\tfirstByLookupKey,\n\tfirstShard,\n\tflush,\n\tgetClosestRegionFromIP,\n\tgetDatabaseSizeForKey,\n\tgetDatabaseSizeForShard,\n\tgetDatabaseSizesAllShards,\n\tgetShardStats,\n\tgetTotalDatabaseSize,\n\tindex,\n\tindexAllShards,\n\tindexShard,\n\tinitialize,\n\tinitializeAsync,\n\tinsert,\n\tinsertShard,\n\tlistKnownShards,\n\tprepare,\n\treassignShard,\n\tresetConfig,\n\trun,\n\trunAllShards,\n\trunShard\n} from './router';\n\nexport type {\n\tCreateIndexOptions,\n\tExplainOptions,\n\tGlobalAllShardsOptions,\n\tIndexColumnDefinition,\n\tInsertResult,\n\tShardSizeResult,\n\tShardTableCount\n} from './router';\n\n// Export utility classes\nexport { ShardCoordinator } from './durable';\nexport { CollegeDBError } from './errors';\nexport { KVShardMapper } from './kvmap';\n\n// Export provider adapters\nexport {\n\tcreateDrizzleSQLProvider,\n\tcreateHyperdriveMySQLProvider,\n\tcreateHyperdrivePostgresProvider,\n\tcreateMySQLProvider,\n\tcreateNuxtHubKVProvider,\n\tcreatePostgreSQLProvider,\n\tcreateRedisKVProvider,\n\tcreateSQLiteProvider,\n\tcreateValkeyKVProvider,\n\tisKVStorage,\n\tisSQLDatabase,\n\ttype DrizzleClientLike,\n\ttype DrizzleSqlChunkLike,\n\ttype DrizzleSqlTagLike,\n\ttype HyperdriveBindingLike,\n\ttype HyperdriveMySQLClientFactory,\n\ttype HyperdrivePostgresClientFactory,\n\ttype MySQLClientLike,\n\ttype NuxtHubKVLike,\n\ttype PostgresClientLike,\n\ttype RedisLikeClient,\n\ttype SQLiteClientLike\n} from './providers';\n\n// Export in-memory mock providers for testing\nexport { InMemoryKVStorage, InMemorySQLDatabase, createInMemoryKVProvider, createInMemorySQLProvider } from './providers-memory';\n\n// Export migration functions\nexport {\n\tautoDetectAndMigrate,\n\tcheckMigrationNeeded,\n\tclearMigrationCache,\n\tclearShardMigrationCache,\n\tcreateMappingsForExistingKeys,\n\tcreateSchemaAcrossShards,\n\tdiscoverExistingPrimaryKeys,\n\tdiscoverExistingRecordsWithColumns,\n\tdropSchema,\n\tintegrateExistingDatabase,\n\tlistTables,\n\tmigrateRecord,\n\tschemaExists,\n\tvalidateTableForSharding,\n\ttype IntegrationOptions,\n\ttype IntegrationResult,\n\ttype ValidationResult\n} from './migrations';\n\n// Export types\nexport type {\n\tCollegeDBConfig,\n\tD1Region,\n\tEnv,\n\tKVListResult,\n\tKVStorage,\n\tMixedShardingStrategy,\n\tOperationType,\n\tPreparedStatement,\n\tQueryResult,\n\tQueryResultMeta,\n\tSQLDatabase,\n\tShardCoordinatorState,\n\tShardLocation,\n\tShardMapping,\n\tShardStats,\n\tShardingStrategy\n} from './types';\n",
|
|
11
11
|
"/**\n * @fileoverview Provider adapters for non-Cloudflare backends.\n *\n * This module defines maintainable adapter factories that allow CollegeDB to run\n * on multiple storage backends while preserving Cloudflare compatibility.\n *\n * Supported KV backends:\n * - Cloudflare KV (native shape)\n * - Redis\n * - Valkey\n * - NuxtHub KV / Unstorage-compatible clients\n *\n * Supported SQL backends:\n * - Cloudflare D1 (native shape)\n * - PostgreSQL compatible clients\n * - MySQL / MariaDB compatible clients\n * - SQLite clients\n * - Drizzle ORM database instances\n * - Hyperdrive-backed PostgreSQL / MySQL clients\n *\n * @author CollegeDB Team\n * @since 1.1.0\n */\n\nimport { CollegeDBError } from './errors';\nimport type { KVListResult, KVStorage, PreparedStatement, QueryResult, QueryResultMeta, SQLDatabase } from './types';\n\nconst DEFAULT_REDIS_SCAN_COUNT = 500;\n\n/**\n * Minimal Redis/Valkey client contract used by the KV adapter.\n */\nexport interface RedisLikeClient {\n\tget(key: string): Promise<string | null>;\n\tset(key: string, value: string): unknown | Promise<unknown>;\n\tdel(key: string): unknown | Promise<unknown>;\n\tscan(cursor: string, ...args: any[]): RedisScanResult | Promise<RedisScanResult>;\n}\n\n/**\n * Redis/Valkey SCAN response in ioredis tuple form.\n */\nexport type RedisScanTupleResult = [string, string[]];\n\n/**\n * Redis/Valkey SCAN response in node-redis object form.\n */\nexport interface RedisScanObjectResult {\n\tcursor: string | number;\n\tkeys: string[];\n}\n\n/**\n * Accepted SCAN response formats.\n */\nexport type RedisScanResult = RedisScanTupleResult | RedisScanObjectResult;\n\n/**\n * PostgreSQL result shape used by adapters.\n */\nexport interface PostgresQueryResult<T = Record<string, unknown>> {\n\trows: T[];\n\trowCount?: number | null;\n\tcommand?: string;\n\t[key: string]: unknown;\n}\n\n/**\n * Minimal PostgreSQL client contract used by the SQL adapter.\n */\nexport interface PostgresClientLike {\n\tquery<T = Record<string, unknown>>(sql: string, bindings?: any[]): Promise<PostgresQueryResult<T>>;\n}\n\n/**\n * Optional lifecycle methods used by Hyperdrive helpers.\n */\nexport interface PostgresLifecycleClientLike extends PostgresClientLike {\n\tconnect?: () => void | Promise<void>;\n\tend?: () => void | Promise<void>;\n\trelease?: () => void;\n}\n\n/**\n * MySQL/MariaDB OK packet shape.\n */\nexport interface MySQLOkPacket {\n\taffectedRows?: number;\n\tinsertId?: number;\n\twarningStatus?: number;\n\t[key: string]: unknown;\n}\n\n/**\n * Minimal MySQL/MariaDB client contract used by adapters.\n */\nexport interface MySQLClientLike {\n\texecute?: (sql: string, bindings?: any[]) => any | Promise<any>;\n\tquery?: (sql: string, bindings?: any[]) => any | Promise<any>;\n}\n\n/**\n * Optional lifecycle methods used by Hyperdrive helpers.\n */\nexport interface MySQLLifecycleClientLike extends MySQLClientLike {\n\tend?: () => void | Promise<void>;\n\tclose?: () => void | Promise<void>;\n\tdestroy?: () => void;\n}\n\n/**\n * Statement contract for SQLite adapters.\n */\nexport interface SQLiteStatementLike {\n\trun?: (...bindings: any[]) => unknown | Promise<unknown>;\n\tall?: (...bindings: any[]) => unknown[] | Promise<unknown[]>;\n\tget?: (...bindings: any[]) => unknown | Promise<unknown>;\n}\n\n/**\n * Minimal SQLite client contract used by adapters.\n */\nexport interface SQLiteClientLike {\n\tprepare?: (sql: string) => SQLiteStatementLike;\n\texecute?: (sql: string, bindings?: any[]) => any | Promise<any>;\n}\n\n/**\n * Hyperdrive binding shape used by helper factories.\n */\nexport interface HyperdriveBindingLike {\n\tconnectionString: string;\n\tlocalConnectionString?: string;\n}\n\n/**\n * Factory for creating PostgreSQL clients from a Hyperdrive connection string.\n */\nexport type HyperdrivePostgresClientFactory = (connectionString: string) => PostgresLifecycleClientLike;\n\n/**\n * Factory for creating MySQL clients from a Hyperdrive connection string.\n */\nexport type HyperdriveMySQLClientFactory = (connectionString: string) => MySQLLifecycleClientLike;\n\n/**\n * Minimal SQL chunk contract produced by Drizzle's `sql` helper.\n */\nexport interface DrizzleSqlChunkLike {\n\tappend(chunk: DrizzleSqlChunkLike): void;\n}\n\n/**\n * Minimal Drizzle `sql` tag contract used to build parameterized raw statements.\n */\nexport interface DrizzleSqlTagLike {\n\t(strings: TemplateStringsArray, ...params: any[]): DrizzleSqlChunkLike;\n\traw(sql: string): DrizzleSqlChunkLike;\n\tempty?: () => DrizzleSqlChunkLike;\n}\n\n/**\n * Minimal Drizzle database contract used by the SQL adapter.\n */\nexport interface DrizzleClientLike {\n\texecute?: (query: any) => any | Promise<any>;\n\trun?: (query: any) => any | Promise<any>;\n\tall?: (query: any) => any | Promise<any>;\n\tget?: (query: any) => any | Promise<any>;\n}\n\n/**\n * NuxtHub/Unstorage-like KV contract used by the adapter.\n */\nexport interface NuxtHubKVLike {\n\tget?<T = any>(key: string): T | null | undefined | Promise<T | null | undefined>;\n\tset?(key: string, value: any, options?: { ttl?: number }): any | Promise<any>;\n\tdel?(key: string): any | Promise<any>;\n\tkeys?(prefix?: string): string[] | readonly string[] | Promise<string[] | readonly string[]>;\n\tgetItem?<T = any>(key: string): T | null | undefined | Promise<T | null | undefined>;\n\tsetItem?(key: string, value: any): any | Promise<any>;\n\tremoveItem?(key: string): any | Promise<any>;\n\tgetKeys?(prefix?: string): string[] | readonly string[] | Promise<string[] | readonly string[]>;\n}\n\n/**\n * Creates a Redis-backed KV provider adapter.\n *\n * The adapter supports both node-redis and ioredis scan formats.\n *\n * @param client - Redis/Valkey client\n * @param options - Adapter tuning options\n * @returns KVStorage-compatible adapter\n */\nexport function createRedisKVProvider(client: RedisLikeClient, options: { scanCount?: number } = {}): KVStorage {\n\tconst scanCount = options.scanCount ?? DEFAULT_REDIS_SCAN_COUNT;\n\n\treturn {\n\t\tasync get<T = unknown>(key: string, type: 'text' | 'json' = 'text'): Promise<T | string | null> {\n\t\t\tconst raw = await client.get(key);\n\t\t\tif (raw === null) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif (type !== 'json') {\n\t\t\t\treturn raw;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(raw) as T;\n\t\t\t} catch (error) {\n\t\t\t\tthrow new CollegeDBError(\n\t\t\t\t\t`Failed to parse JSON from Redis for key ${key}: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t'KV_JSON_PARSE_FAILED'\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\n\t\tasync put(key: string, value: string): Promise<void> {\n\t\t\tawait client.set(key, value);\n\t\t},\n\n\t\tasync delete(key: string): Promise<void> {\n\t\t\tawait client.del(key);\n\t\t},\n\n\t\tasync list(options?: { prefix?: string; cursor?: string; limit?: number }): Promise<KVListResult> {\n\t\t\tconst prefix = options?.prefix ?? '';\n\t\t\tconst pattern = `${prefix}*`;\n\t\t\tlet cursor = options?.cursor ?? '0';\n\t\t\tconst limit = options?.limit;\n\t\t\tconst keys: string[] = [];\n\n\t\t\tdo {\n\t\t\t\tconst scanResult = await executeRedisScan(client, cursor, pattern, scanCount);\n\t\t\t\tcursor = scanResult.cursor;\n\n\t\t\t\tfor (const key of scanResult.keys) {\n\t\t\t\t\tif (!prefix || key.startsWith(prefix)) {\n\t\t\t\t\t\tkeys.push(key);\n\t\t\t\t\t}\n\t\t\t\t\tif (limit && keys.length >= limit) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (limit && keys.length >= limit) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} while (cursor !== '0');\n\n\t\t\treturn {\n\t\t\t\tkeys: keys.map((name) => ({ name })),\n\t\t\t\tcursor,\n\t\t\t\tlist_complete: cursor === '0'\n\t\t\t};\n\t\t}\n\t};\n}\n\n/**\n * Creates a Valkey-backed KV provider adapter.\n *\n * Valkey and Redis have compatible command surfaces for this adapter.\n *\n * @param client - Valkey client\n * @param options - Adapter tuning options\n * @returns KVStorage-compatible adapter\n */\nexport function createValkeyKVProvider(client: RedisLikeClient, options: { scanCount?: number } = {}): KVStorage {\n\treturn createRedisKVProvider(client, options);\n}\n\n/**\n * Creates a PostgreSQL adapter implementing CollegeDB's SQL contract.\n *\n * Supports `pg` Client, Pool, and compatible implementations.\n * SQL using `?` placeholders is automatically rewritten to `$1..$n`.\n *\n * For Drizzle-backed PostgreSQL clients, pass the Drizzle DB instance as\n * `client` and the Drizzle `sql` helper as the second argument.\n *\n * @param client - PostgreSQL client/pool\n * @param sqlTag - Optional Drizzle `sql` helper for Drizzle interop\n * @returns SQLDatabase-compatible adapter\n */\nexport function createPostgreSQLProvider(client: PostgresClientLike): SQLDatabase;\nexport function createPostgreSQLProvider(client: DrizzleClientLike, sqlTag: DrizzleSqlTagLike): SQLDatabase;\nexport function createPostgreSQLProvider(client: PostgresClientLike | DrizzleClientLike, sqlTag?: DrizzleSqlTagLike): SQLDatabase {\n\tif (sqlTag) {\n\t\treturn createDrizzleSQLProvider(client as DrizzleClientLike, sqlTag);\n\t}\n\n\treturn {\n\t\tprepare(sql: string): PreparedStatement {\n\t\t\treturn new PostgresPreparedStatement(client as PostgresClientLike, sql);\n\t\t}\n\t};\n}\n\n/**\n * Creates a MySQL/MariaDB adapter implementing CollegeDB's SQL contract.\n *\n * Supports mysql2/promise clients, pools, and compatible wrappers.\n *\n * For Drizzle-backed MySQL/MariaDB clients, pass the Drizzle DB instance as\n * `client` and the Drizzle `sql` helper as the second argument.\n *\n * @param client - MySQL/MariaDB client or pool\n * @param sqlTag - Optional Drizzle `sql` helper for Drizzle interop\n * @returns SQLDatabase-compatible adapter\n */\nexport function createMySQLProvider(client: MySQLClientLike): SQLDatabase;\nexport function createMySQLProvider(client: DrizzleClientLike, sqlTag: DrizzleSqlTagLike): SQLDatabase;\nexport function createMySQLProvider(client: MySQLClientLike | DrizzleClientLike, sqlTag?: DrizzleSqlTagLike): SQLDatabase {\n\tif (sqlTag) {\n\t\treturn createDrizzleSQLProvider(client as DrizzleClientLike, sqlTag);\n\t}\n\n\treturn {\n\t\tprepare(sql: string): PreparedStatement {\n\t\t\treturn new MySQLPreparedStatement(client as MySQLClientLike, sql);\n\t\t}\n\t};\n}\n\n/**\n * Creates a SQLite adapter implementing CollegeDB's SQL contract.\n *\n * Supports both execute-style clients and prepare/run/get/all statement clients.\n *\n * For Drizzle-backed SQLite/D1 clients, pass the Drizzle DB instance as\n * `client` and the Drizzle `sql` helper as the second argument.\n *\n * @param client - SQLite client\n * @param sqlTag - Optional Drizzle `sql` helper for Drizzle interop\n * @returns SQLDatabase-compatible adapter\n */\nexport function createSQLiteProvider(client: SQLiteClientLike): SQLDatabase;\nexport function createSQLiteProvider(client: DrizzleClientLike, sqlTag: DrizzleSqlTagLike): SQLDatabase;\nexport function createSQLiteProvider(client: SQLiteClientLike | DrizzleClientLike, sqlTag?: DrizzleSqlTagLike): SQLDatabase {\n\tif (sqlTag) {\n\t\treturn createDrizzleSQLProvider(client as DrizzleClientLike, sqlTag);\n\t}\n\n\treturn {\n\t\tprepare(sql: string): PreparedStatement {\n\t\t\treturn new SQLitePreparedStatement(client as SQLiteClientLike, sql);\n\t\t}\n\t};\n}\n\n/**\n * Creates a Drizzle-backed SQL adapter implementing CollegeDB's SQL contract.\n *\n * This adapter enables using Drizzle database instances (including NuxtHub's\n * `db` from `@nuxthub/db` or `hub:db`) as shard providers while CollegeDB keeps\n * query routing and key->shard mapping responsibilities.\n *\n * @param client - Drizzle database instance\n * @param sqlTag - Drizzle `sql` helper from `drizzle-orm`\n * @returns SQLDatabase-compatible adapter\n */\nexport function createDrizzleSQLProvider(client: DrizzleClientLike, sqlTag: DrizzleSqlTagLike): SQLDatabase {\n\treturn {\n\t\tprepare(sql: string): PreparedStatement {\n\t\t\treturn new DrizzlePreparedStatement(client, sqlTag, sql);\n\t\t}\n\t};\n}\n\n/**\n * Creates a NuxtHub KV adapter implementing CollegeDB's KV contract.\n *\n * Supports both `@nuxthub/kv` (`get/set/del/keys`) and unstorage-like\n * implementations (`getItem/setItem/removeItem/getKeys`).\n *\n * @param client - NuxtHub KV/Unstorage-like client\n * @returns KVStorage-compatible adapter\n */\nexport function createNuxtHubKVProvider(client: NuxtHubKVLike): KVStorage {\n\treturn {\n\t\tasync get<T = unknown>(key: string, type: 'text' | 'json' = 'text'): Promise<T | string | null> {\n\t\t\tconst raw = await getNuxtHubKVValue(client, key);\n\t\t\tif (raw === null || raw === undefined) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif (type === 'json') {\n\t\t\t\tif (typeof raw === 'string') {\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn JSON.parse(raw) as T;\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tthrow new CollegeDBError(\n\t\t\t\t\t\t\t`Failed to parse JSON from NuxtHub KV for key ${key}: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t\t\t'KV_JSON_PARSE_FAILED'\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn raw as T;\n\t\t\t}\n\n\t\t\treturn typeof raw === 'string' ? raw : JSON.stringify(raw);\n\t\t},\n\n\t\tasync put(key: string, value: string): Promise<void> {\n\t\t\tawait setNuxtHubKVValue(client, key, value);\n\t\t},\n\n\t\tasync delete(key: string): Promise<void> {\n\t\t\tawait deleteNuxtHubKVValue(client, key);\n\t\t},\n\n\t\tasync list(options?: { prefix?: string; cursor?: string; limit?: number }): Promise<KVListResult> {\n\t\t\tconst prefix = options?.prefix ?? '';\n\t\t\tconst allKeys = await listNuxtHubKVKeys(client, prefix);\n\t\t\tconst limitedKeys = typeof options?.limit === 'number' ? allKeys.slice(0, options.limit) : allKeys;\n\n\t\t\treturn {\n\t\t\t\tkeys: limitedKeys.map((name) => ({ name })),\n\t\t\t\tlist_complete: true\n\t\t\t};\n\t\t}\n\t};\n}\n\n/**\n * Creates a PostgreSQL adapter wired to a Hyperdrive binding.\n *\n * The returned provider creates a transient client for each statement execution.\n * Hyperdrive handles connection pooling at the edge, so this pattern remains fast\n * and scalable in Workers.\n *\n * @param hyperdrive - Hyperdrive binding\n * @param clientFactory - Client factory (e.g. `connectionString => new Client({ connectionString })`)\n * @returns SQLDatabase-compatible adapter\n */\nexport function createHyperdrivePostgresProvider(\n\thyperdrive: HyperdriveBindingLike,\n\tclientFactory: HyperdrivePostgresClientFactory\n): SQLDatabase {\n\tconst delegatedClient: PostgresClientLike = {\n\t\tquery: async <T = Record<string, unknown>>(sql: string, bindings: any[] = []) => {\n\t\t\tconst client = clientFactory(hyperdrive.connectionString);\n\t\t\tif (typeof client.connect === 'function') {\n\t\t\t\tawait client.connect();\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\treturn await client.query<T>(sql, bindings);\n\t\t\t} finally {\n\t\t\t\tif (typeof client.release === 'function') {\n\t\t\t\t\tclient.release();\n\t\t\t\t} else if (typeof client.end === 'function') {\n\t\t\t\t\tawait client.end();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\treturn createPostgreSQLProvider(delegatedClient);\n}\n\n/**\n * Creates a MySQL/MariaDB adapter wired to a Hyperdrive binding.\n *\n * The returned provider creates a transient client for each statement execution.\n * Hyperdrive handles connection pooling under the hood.\n *\n * @param hyperdrive - Hyperdrive binding\n * @param clientFactory - Client factory (e.g. `connectionString => mysql.createConnection(connectionString)`)\n * @returns SQLDatabase-compatible adapter\n */\nexport function createHyperdriveMySQLProvider(hyperdrive: HyperdriveBindingLike, clientFactory: HyperdriveMySQLClientFactory): SQLDatabase {\n\tconst delegatedClient: MySQLClientLike = {\n\t\texecute: async (sql: string, bindings: any[] = []) => {\n\t\t\tconst client = clientFactory(hyperdrive.connectionString);\n\t\t\ttry {\n\t\t\t\tif (typeof client.execute === 'function') {\n\t\t\t\t\treturn await client.execute(sql, bindings);\n\t\t\t\t}\n\t\t\t\tif (typeof client.query === 'function') {\n\t\t\t\t\treturn await client.query(sql, bindings);\n\t\t\t\t}\n\n\t\t\t\tthrow new CollegeDBError('Hyperdrive MySQL client is missing execute/query methods', 'MYSQL_CLIENT_INVALID');\n\t\t\t} finally {\n\t\t\t\tif (typeof client.end === 'function') {\n\t\t\t\t\tawait client.end();\n\t\t\t\t} else if (typeof client.close === 'function') {\n\t\t\t\t\tawait client.close();\n\t\t\t\t} else if (typeof client.destroy === 'function') {\n\t\t\t\t\tclient.destroy();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\treturn createMySQLProvider(delegatedClient);\n}\n\n/**\n * Returns `true` when a value looks like an SQL database provider.\n */\nexport function isSQLDatabase(value: unknown): value is SQLDatabase {\n\tif (!value || typeof value !== 'object') {\n\t\treturn false;\n\t}\n\n\treturn typeof (value as SQLDatabase).prepare === 'function';\n}\n\n/**\n * Returns `true` when a value looks like a KV storage provider.\n */\nexport function isKVStorage(value: unknown): value is KVStorage {\n\tif (!value || typeof value !== 'object') {\n\t\treturn false;\n\t}\n\n\tconst kv = value as KVStorage;\n\treturn typeof kv.get === 'function' && typeof kv.put === 'function' && typeof kv.delete === 'function' && typeof kv.list === 'function';\n}\n\nclass PostgresPreparedStatement implements PreparedStatement {\n\tprivate readonly client: PostgresClientLike;\n\tprivate readonly sql: string;\n\tprivate readonly bindings: any[];\n\n\tconstructor(client: PostgresClientLike, sql: string, bindings: any[] = []) {\n\t\tthis.client = client;\n\t\tthis.sql = sql;\n\t\tthis.bindings = bindings;\n\t}\n\n\tbind(...bindings: any[]): PreparedStatement {\n\t\treturn new PostgresPreparedStatement(this.client, this.sql, bindings);\n\t}\n\n\tasync run<T = Record<string, unknown>>(): Promise<QueryResult<T>> {\n\t\tconst startedAt = Date.now();\n\t\tconst sql = rewriteQuestionPlaceholders(this.sql);\n\t\tconst result = await this.client.query<T>(sql, this.bindings);\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults: result.rows ?? [],\n\t\t\tmeta: createMeta(startedAt, {\n\t\t\t\tchanges: typeof result.rowCount === 'number' ? result.rowCount : undefined,\n\t\t\t\tcommand: result.command\n\t\t\t})\n\t\t};\n\t}\n\n\tasync all<T = Record<string, unknown>>(): Promise<QueryResult<T>> {\n\t\tconst startedAt = Date.now();\n\t\tconst sql = rewriteQuestionPlaceholders(this.sql);\n\t\tconst result = await this.client.query<T>(sql, this.bindings);\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults: result.rows ?? [],\n\t\t\tmeta: createMeta(startedAt, {\n\t\t\t\tchanges: typeof result.rowCount === 'number' ? result.rowCount : undefined,\n\t\t\t\tcommand: result.command\n\t\t\t})\n\t\t};\n\t}\n\n\tasync first<T = Record<string, unknown>>(): Promise<T | null> {\n\t\tconst sql = rewriteQuestionPlaceholders(this.sql);\n\t\tconst result = await this.client.query<T>(sql, this.bindings);\n\t\treturn result.rows?.[0] ?? null;\n\t}\n}\n\nclass MySQLPreparedStatement implements PreparedStatement {\n\tprivate readonly client: MySQLClientLike;\n\tprivate readonly sql: string;\n\tprivate readonly bindings: any[];\n\n\tconstructor(client: MySQLClientLike, sql: string, bindings: any[] = []) {\n\t\tthis.client = client;\n\t\tthis.sql = sql;\n\t\tthis.bindings = bindings;\n\t}\n\n\tbind(...bindings: any[]): PreparedStatement {\n\t\treturn new MySQLPreparedStatement(this.client, this.sql, bindings);\n\t}\n\n\tasync run<T = Record<string, unknown>>(): Promise<QueryResult<T>> {\n\t\tconst startedAt = Date.now();\n\t\tconst rows = await executeMySQL(this.client, this.sql, this.bindings);\n\n\t\tif (Array.isArray(rows)) {\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tresults: rows as T[],\n\t\t\t\tmeta: createMeta(startedAt)\n\t\t\t};\n\t\t}\n\n\t\tconst packet = rows as MySQLOkPacket;\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults: [],\n\t\t\tmeta: createMeta(startedAt, {\n\t\t\t\tchanges: packet.affectedRows,\n\t\t\t\tlast_row_id: packet.insertId,\n\t\t\t\twarningStatus: packet.warningStatus\n\t\t\t})\n\t\t};\n\t}\n\n\tasync all<T = Record<string, unknown>>(): Promise<QueryResult<T>> {\n\t\tconst startedAt = Date.now();\n\t\tconst rows = await executeMySQL(this.client, this.sql, this.bindings);\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults: Array.isArray(rows) ? (rows as T[]) : [],\n\t\t\tmeta: createMeta(startedAt, {\n\t\t\t\tchanges: !Array.isArray(rows) ? (rows as MySQLOkPacket).affectedRows : undefined\n\t\t\t})\n\t\t};\n\t}\n\n\tasync first<T = Record<string, unknown>>(): Promise<T | null> {\n\t\tconst rows = await executeMySQL(this.client, this.sql, this.bindings);\n\t\tif (!Array.isArray(rows) || rows.length === 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn rows[0] as T;\n\t}\n}\n\nclass SQLitePreparedStatement implements PreparedStatement {\n\tprivate readonly client: SQLiteClientLike;\n\tprivate readonly sql: string;\n\tprivate readonly bindings: any[];\n\n\tconstructor(client: SQLiteClientLike, sql: string, bindings: any[] = []) {\n\t\tthis.client = client;\n\t\tthis.sql = sql;\n\t\tthis.bindings = bindings;\n\t}\n\n\tbind(...bindings: any[]): PreparedStatement {\n\t\treturn new SQLitePreparedStatement(this.client, this.sql, bindings);\n\t}\n\n\tasync run<T = Record<string, unknown>>(): Promise<QueryResult<T>> {\n\t\tconst startedAt = Date.now();\n\n\t\tif (typeof this.client.execute === 'function') {\n\t\t\tconst result = await this.client.execute(this.sql, this.bindings);\n\t\t\tconst rows = extractRowsFromSQLiteExecute<T>(result);\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tresults: rows,\n\t\t\t\tmeta: createMeta(startedAt)\n\t\t\t};\n\t\t}\n\n\t\tconst statement = this.client.prepare?.(this.sql);\n\t\tif (!statement || typeof statement.run !== 'function') {\n\t\t\tthrow new CollegeDBError('SQLite client must expose execute() or prepare().run()', 'SQLITE_CLIENT_INVALID');\n\t\t}\n\n\t\tconst runResult = await statement.run(...this.bindings);\n\t\tconst runMeta = (runResult ?? {}) as Record<string, unknown>;\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults: [],\n\t\t\tmeta: createMeta(startedAt, {\n\t\t\t\tchanges: toMaybeNumber(runMeta.changes),\n\t\t\t\tlast_row_id: (runMeta.lastInsertRowid ?? runMeta.lastID) as number | string | undefined\n\t\t\t})\n\t\t};\n\t}\n\n\tasync all<T = Record<string, unknown>>(): Promise<QueryResult<T>> {\n\t\tconst startedAt = Date.now();\n\n\t\tif (typeof this.client.execute === 'function') {\n\t\t\tconst result = await this.client.execute(this.sql, this.bindings);\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tresults: extractRowsFromSQLiteExecute<T>(result),\n\t\t\t\tmeta: createMeta(startedAt)\n\t\t\t};\n\t\t}\n\n\t\tconst statement = this.client.prepare?.(this.sql);\n\t\tif (!statement || typeof statement.all !== 'function') {\n\t\t\tthrow new CollegeDBError('SQLite client must expose execute() or prepare().all()', 'SQLITE_CLIENT_INVALID');\n\t\t}\n\n\t\tconst rows = await statement.all(...this.bindings);\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults: (Array.isArray(rows) ? rows : []) as T[],\n\t\t\tmeta: createMeta(startedAt)\n\t\t};\n\t}\n\n\tasync first<T = Record<string, unknown>>(): Promise<T | null> {\n\t\tif (typeof this.client.execute === 'function') {\n\t\t\tconst result = await this.client.execute(this.sql, this.bindings);\n\t\t\tconst rows = extractRowsFromSQLiteExecute<T>(result);\n\t\t\treturn rows[0] ?? null;\n\t\t}\n\n\t\tconst statement = this.client.prepare?.(this.sql);\n\t\tif (!statement) {\n\t\t\tthrow new CollegeDBError('SQLite client must expose execute() or prepare().get()', 'SQLITE_CLIENT_INVALID');\n\t\t}\n\n\t\tif (typeof statement.get === 'function') {\n\t\t\tconst row = await statement.get(...this.bindings);\n\t\t\treturn row === undefined || row === null ? null : (row as T);\n\t\t}\n\n\t\tif (typeof statement.all === 'function') {\n\t\t\tconst rows = await statement.all(...this.bindings);\n\t\t\tif (!Array.isArray(rows) || rows.length === 0) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst firstRow = rows[0];\n\t\t\treturn firstRow === undefined || firstRow === null ? null : (firstRow as T);\n\t\t}\n\n\t\tthrow new CollegeDBError('SQLite prepare() result must expose get() or all()', 'SQLITE_CLIENT_INVALID');\n\t}\n}\n\nclass DrizzlePreparedStatement implements PreparedStatement {\n\tprivate readonly client: DrizzleClientLike;\n\tprivate readonly sqlTag: DrizzleSqlTagLike;\n\tprivate readonly sqlText: string;\n\tprivate readonly bindings: any[];\n\n\tconstructor(client: DrizzleClientLike, sqlTag: DrizzleSqlTagLike, sqlText: string, bindings: any[] = []) {\n\t\tthis.client = client;\n\t\tthis.sqlTag = sqlTag;\n\t\tthis.sqlText = sqlText;\n\t\tthis.bindings = bindings;\n\t}\n\n\tbind(...bindings: any[]): PreparedStatement {\n\t\treturn new DrizzlePreparedStatement(this.client, this.sqlTag, this.sqlText, bindings);\n\t}\n\n\tasync run<T = Record<string, unknown>>(): Promise<QueryResult<T>> {\n\t\tconst startedAt = Date.now();\n\t\tconst query = buildDrizzleQuery(this.sqlTag, this.sqlText, this.bindings);\n\t\tconst result = await executeDrizzleRun(this.client, query);\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults: extractRowsFromDrizzleExecute<T>(result),\n\t\t\tmeta: createMeta(startedAt, extractMetaFromDrizzleExecute(result))\n\t\t};\n\t}\n\n\tasync all<T = Record<string, unknown>>(): Promise<QueryResult<T>> {\n\t\tconst startedAt = Date.now();\n\t\tconst query = buildDrizzleQuery(this.sqlTag, this.sqlText, this.bindings);\n\t\tconst result = await executeDrizzleAll(this.client, query);\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults: extractRowsFromDrizzleExecute<T>(result),\n\t\t\tmeta: createMeta(startedAt, extractMetaFromDrizzleExecute(result))\n\t\t};\n\t}\n\n\tasync first<T = Record<string, unknown>>(): Promise<T | null> {\n\t\tconst query = buildDrizzleQuery(this.sqlTag, this.sqlText, this.bindings);\n\t\tconst result = await executeDrizzleFirst(this.client, query);\n\t\tconst rows = extractRowsFromDrizzleExecute<T>(result);\n\t\tif (rows.length > 0) {\n\t\t\treturn rows[0] ?? null;\n\t\t}\n\n\t\tif (result && typeof result === 'object' && 'row' in result) {\n\t\t\tconst row = (result as Record<string, unknown>).row;\n\t\t\treturn row === undefined || row === null ? null : (row as T);\n\t\t}\n\n\t\tif (\n\t\t\tresult &&\n\t\t\ttypeof result === 'object' &&\n\t\t\t!Array.isArray(result) &&\n\t\t\t!('rows' in result) &&\n\t\t\t!('results' in result) &&\n\t\t\t!('data' in result)\n\t\t) {\n\t\t\treturn result as T;\n\t\t}\n\n\t\treturn null;\n\t}\n}\n\nasync function executeRedisScan(\n\tclient: RedisLikeClient,\n\tcursor: string,\n\tpattern: string,\n\tscanCount: number\n): Promise<{ cursor: string; keys: string[] }> {\n\ttry {\n\t\tconst objectResult = await client.scan(cursor, { MATCH: pattern, COUNT: scanCount });\n\t\treturn normalizeRedisScanResult(objectResult);\n\t} catch {\n\t\tconst tupleResult = await client.scan(cursor, 'MATCH', pattern, 'COUNT', String(scanCount));\n\t\treturn normalizeRedisScanResult(tupleResult);\n\t}\n}\n\nfunction normalizeRedisScanResult(result: RedisScanResult): { cursor: string; keys: string[] } {\n\tif (Array.isArray(result)) {\n\t\treturn {\n\t\t\tcursor: String(result[0] ?? '0'),\n\t\t\tkeys: Array.isArray(result[1]) ? result[1] : []\n\t\t};\n\t}\n\n\treturn {\n\t\tcursor: String(result.cursor ?? '0'),\n\t\tkeys: Array.isArray(result.keys) ? result.keys : []\n\t};\n}\n\nasync function executeMySQL(client: MySQLClientLike, sql: string, bindings: any[]): Promise<unknown> {\n\tif (typeof client.execute === 'function') {\n\t\tconst result = await client.execute(sql, bindings);\n\t\tif (Array.isArray(result)) {\n\t\t\treturn result[0];\n\t\t}\n\t\treturn result;\n\t}\n\n\tif (typeof client.query === 'function') {\n\t\tconst result = await client.query(sql, bindings);\n\t\tif (Array.isArray(result)) {\n\t\t\treturn result[0];\n\t\t}\n\t\treturn result;\n\t}\n\n\tthrow new CollegeDBError('MySQL client must expose execute() or query()', 'MYSQL_CLIENT_INVALID');\n}\n\nasync function executeDrizzleRun(client: DrizzleClientLike, query: DrizzleSqlChunkLike): Promise<unknown> {\n\tif (typeof client.run === 'function') {\n\t\treturn await client.run(query);\n\t}\n\n\tif (typeof client.execute === 'function') {\n\t\treturn await client.execute(query);\n\t}\n\n\tif (typeof client.all === 'function') {\n\t\treturn await client.all(query);\n\t}\n\n\tthrow new CollegeDBError('Drizzle client must expose run(), execute(), or all()', 'DRIZZLE_CLIENT_INVALID');\n}\n\nasync function executeDrizzleAll(client: DrizzleClientLike, query: DrizzleSqlChunkLike): Promise<unknown> {\n\tif (typeof client.all === 'function') {\n\t\treturn await client.all(query);\n\t}\n\n\tif (typeof client.execute === 'function') {\n\t\treturn await client.execute(query);\n\t}\n\n\tif (typeof client.run === 'function') {\n\t\treturn await client.run(query);\n\t}\n\n\tthrow new CollegeDBError('Drizzle client must expose all(), execute(), or run()', 'DRIZZLE_CLIENT_INVALID');\n}\n\nasync function executeDrizzleFirst(client: DrizzleClientLike, query: DrizzleSqlChunkLike): Promise<unknown> {\n\tif (typeof client.get === 'function') {\n\t\treturn await client.get(query);\n\t}\n\n\treturn await executeDrizzleAll(client, query);\n}\n\nfunction buildDrizzleQuery(sqlTag: DrizzleSqlTagLike, sqlText: string, bindings: any[]): DrizzleSqlChunkLike {\n\tconst segments = splitQuestionPlaceholders(sqlText);\n\tconst placeholderCount = segments.length - 1;\n\n\tif (placeholderCount !== bindings.length) {\n\t\tthrow new CollegeDBError(\n\t\t\t`Drizzle binding mismatch: expected ${placeholderCount} bindings, received ${bindings.length}`,\n\t\t\t'DRIZZLE_BINDINGS_MISMATCH'\n\t\t);\n\t}\n\n\tif (placeholderCount === 0) {\n\t\treturn sqlTag.raw(sqlText);\n\t}\n\n\tconst statement = typeof sqlTag.empty === 'function' ? sqlTag.empty() : sqlTag.raw('');\n\n\tfor (let i = 0; i < segments.length; i++) {\n\t\tconst segment = segments[i];\n\t\tif (segment) {\n\t\t\tstatement.append(sqlTag.raw(segment));\n\t\t}\n\n\t\tif (i < placeholderCount) {\n\t\t\tstatement.append(sqlTag`${bindings[i]}`);\n\t\t}\n\t}\n\n\treturn statement;\n}\n\nfunction splitQuestionPlaceholders(sql: string): string[] {\n\tconst segments: string[] = [];\n\tlet segmentStart = 0;\n\n\tlet inSingleQuote = false;\n\tlet inDoubleQuote = false;\n\tlet inLineComment = false;\n\tlet inBlockComment = false;\n\n\tfor (let i = 0; i < sql.length; i++) {\n\t\tconst char = sql[i]!;\n\t\tconst next = i + 1 < sql.length ? sql[i + 1] : '';\n\n\t\tif (inLineComment) {\n\t\t\tif (char === '\\n') {\n\t\t\t\tinLineComment = false;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (inBlockComment) {\n\t\t\tif (char === '*' && next === '/') {\n\t\t\t\ti++;\n\t\t\t\tinBlockComment = false;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!inSingleQuote && !inDoubleQuote) {\n\t\t\tif (char === '-' && next === '-') {\n\t\t\t\ti++;\n\t\t\t\tinLineComment = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (char === '/' && next === '*') {\n\t\t\t\ti++;\n\t\t\t\tinBlockComment = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tif (char === \"'\" && !inDoubleQuote) {\n\t\t\tif (inSingleQuote && next === \"'\") {\n\t\t\t\ti++;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tinSingleQuote = !inSingleQuote;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '\"' && !inSingleQuote) {\n\t\t\tif (inDoubleQuote && next === '\"') {\n\t\t\t\ti++;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tinDoubleQuote = !inDoubleQuote;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '?' && !inSingleQuote && !inDoubleQuote) {\n\t\t\tsegments.push(sql.slice(segmentStart, i));\n\t\t\tsegmentStart = i + 1;\n\t\t}\n\t}\n\n\tsegments.push(sql.slice(segmentStart));\n\treturn segments;\n}\n\nfunction extractRowsFromDrizzleExecute<T>(result: unknown): T[] {\n\tconst extractRowsFromObject = (value: unknown): T[] | undefined => {\n\t\tif (!value || typeof value !== 'object' || Array.isArray(value)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst objectValue = value as Record<string, unknown>;\n\t\tif (Array.isArray(objectValue.rows)) {\n\t\t\treturn objectValue.rows as T[];\n\t\t}\n\n\t\tif (Array.isArray(objectValue.results)) {\n\t\t\treturn objectValue.results as T[];\n\t\t}\n\n\t\tif (Array.isArray(objectValue.data)) {\n\t\t\treturn objectValue.data as T[];\n\t\t}\n\n\t\treturn undefined;\n\t};\n\n\tconst looksLikeRowObject = (value: unknown): value is Record<string, unknown> => {\n\t\tif (!value || typeof value !== 'object' || Array.isArray(value)) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn Object.keys(value).length > 0;\n\t};\n\n\tif (Array.isArray(result)) {\n\t\tif (result.length === 2) {\n\t\t\tconst firstObjectRows = extractRowsFromObject(result[0]);\n\t\t\tif (firstObjectRows) {\n\t\t\t\treturn firstObjectRows;\n\t\t\t}\n\n\t\t\tconst secondObjectRows = extractRowsFromObject(result[1]);\n\t\t\tif (secondObjectRows) {\n\t\t\t\treturn secondObjectRows;\n\t\t\t}\n\n\t\t\tif (!Array.isArray(result[0]) && !Array.isArray(result[1])) {\n\t\t\t\tif (looksLikeRowObject(result[0])) {\n\t\t\t\t\treturn [result[0] as T];\n\t\t\t\t}\n\n\t\t\t\tif (looksLikeRowObject(result[1])) {\n\t\t\t\t\treturn [result[1] as T];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (Array.isArray(result[0])) {\n\t\t\t\treturn result[0] as T[];\n\t\t\t}\n\n\t\t\tif (Array.isArray(result[1])) {\n\t\t\t\treturn result[1] as T[];\n\t\t\t}\n\t\t}\n\n\t\treturn result as T[];\n\t}\n\n\tif (result && typeof result === 'object') {\n\t\tconst objectRows = extractRowsFromObject(result);\n\t\tif (objectRows) {\n\t\t\treturn objectRows;\n\t\t}\n\t}\n\n\treturn [];\n}\n\nfunction extractMetaFromDrizzleExecute(result: unknown): Record<string, unknown> {\n\tif (!result) {\n\t\treturn {};\n\t}\n\n\tlet objectResult: Record<string, unknown> | undefined;\n\n\tif (Array.isArray(result)) {\n\t\tif (result.length === 2) {\n\t\t\t// Try result[0] first (metadata-first format like [metadata, rows])\n\t\t\tif (result[0] && typeof result[0] === 'object' && !Array.isArray(result[0])) {\n\t\t\t\tobjectResult = result[0] as Record<string, unknown>;\n\t\t\t}\n\t\t\t// Try result[1] if result[0] is not metadata (metadata-second format like [rows, metadata])\n\t\t\telse if (result[1] && typeof result[1] === 'object' && !Array.isArray(result[1])) {\n\t\t\t\tobjectResult = result[1] as Record<string, unknown>;\n\t\t\t}\n\t\t}\n\t} else if (typeof result === 'object' && !Array.isArray(result)) {\n\t\tobjectResult = result as Record<string, unknown>;\n\t}\n\n\tif (!objectResult) {\n\t\treturn {};\n\t}\n\n\tconst meta: Record<string, unknown> = {};\n\n\tconst changes = toMaybeNumber(objectResult.rowCount) ?? toMaybeNumber(objectResult.changes) ?? toMaybeNumber(objectResult.affectedRows);\n\tif (changes !== undefined) {\n\t\tmeta.changes = changes;\n\t}\n\n\tconst lastRowId =\n\t\tobjectResult.lastInsertRowid ??\n\t\tobjectResult.lastInsertId ??\n\t\tobjectResult.lastID ??\n\t\tobjectResult.lastRowID ??\n\t\tobjectResult.insertId ??\n\t\tobjectResult.insertID;\n\tif (typeof lastRowId === 'number' || typeof lastRowId === 'string') {\n\t\tmeta.last_row_id = lastRowId;\n\t}\n\n\tif (objectResult.meta && typeof objectResult.meta === 'object') {\n\t\tObject.assign(meta, objectResult.meta as Record<string, unknown>);\n\t}\n\n\treturn meta;\n}\n\nasync function getNuxtHubKVValue<T = unknown>(client: NuxtHubKVLike, key: string): Promise<T | null | undefined> {\n\tif (typeof client.get === 'function') {\n\t\treturn await client.get<T>(key);\n\t}\n\n\tif (typeof client.getItem === 'function') {\n\t\treturn await client.getItem<T>(key);\n\t}\n\n\tthrow new CollegeDBError('NuxtHub KV client must expose get() or getItem()', 'NUXTHUB_KV_CLIENT_INVALID');\n}\n\nasync function setNuxtHubKVValue(client: NuxtHubKVLike, key: string, value: string): Promise<void> {\n\tif (typeof client.set === 'function') {\n\t\tawait client.set(key, value);\n\t\treturn;\n\t}\n\n\tif (typeof client.setItem === 'function') {\n\t\tawait client.setItem(key, value);\n\t\treturn;\n\t}\n\n\tthrow new CollegeDBError('NuxtHub KV client must expose set() or setItem()', 'NUXTHUB_KV_CLIENT_INVALID');\n}\n\nasync function deleteNuxtHubKVValue(client: NuxtHubKVLike, key: string): Promise<void> {\n\tif (typeof client.del === 'function') {\n\t\tawait client.del(key);\n\t\treturn;\n\t}\n\n\tif (typeof client.removeItem === 'function') {\n\t\tawait client.removeItem(key);\n\t\treturn;\n\t}\n\n\tthrow new CollegeDBError('NuxtHub KV client must expose del() or removeItem()', 'NUXTHUB_KV_CLIENT_INVALID');\n}\n\nasync function listNuxtHubKVKeys(client: NuxtHubKVLike, prefix: string): Promise<string[]> {\n\tlet keys: readonly string[];\n\n\tif (typeof client.keys === 'function') {\n\t\tkeys = await client.keys(prefix);\n\t} else if (typeof client.getKeys === 'function') {\n\t\tkeys = await client.getKeys(prefix);\n\t} else {\n\t\tthrow new CollegeDBError('NuxtHub KV client must expose keys() or getKeys()', 'NUXTHUB_KV_CLIENT_INVALID');\n\t}\n\n\tif (!Array.isArray(keys)) {\n\t\treturn [];\n\t}\n\n\tif (!prefix) {\n\t\treturn [...keys];\n\t}\n\n\treturn keys.filter((key) => key.startsWith(prefix));\n}\n\nfunction extractRowsFromSQLiteExecute<T>(result: unknown): T[] {\n\tif (Array.isArray(result)) {\n\t\treturn result as T[];\n\t}\n\n\tif (result && typeof result === 'object') {\n\t\tconst objectResult = result as Record<string, unknown>;\n\n\t\tif (Array.isArray(objectResult.rows)) {\n\t\t\treturn objectResult.rows as T[];\n\t\t}\n\t\tif (Array.isArray(objectResult.results)) {\n\t\t\treturn objectResult.results as T[];\n\t\t}\n\t}\n\n\treturn [];\n}\n\nfunction createMeta(startedAt: number, extra: Record<string, unknown> = {}): QueryResultMeta {\n\treturn {\n\t\tduration: Date.now() - startedAt,\n\t\t...extra\n\t};\n}\n\nfunction toMaybeNumber(value: unknown): number | undefined {\n\tif (typeof value === 'number' && Number.isFinite(value)) {\n\t\treturn value;\n\t}\n\treturn undefined;\n}\n\nconst postgresPlaceholderCache = new Map<string, string>();\n\nfunction rewriteQuestionPlaceholders(sql: string): string {\n\tconst cached = postgresPlaceholderCache.get(sql);\n\tif (cached) {\n\t\treturn cached;\n\t}\n\n\tlet output = '';\n\tlet placeholderIndex = 0;\n\tlet inSingleQuote = false;\n\tlet inDoubleQuote = false;\n\tlet inLineComment = false;\n\tlet inBlockComment = false;\n\n\tfor (let i = 0; i < sql.length; i++) {\n\t\tconst char = sql[i]!;\n\t\tconst next = i + 1 < sql.length ? sql[i + 1] : '';\n\n\t\tif (inLineComment) {\n\t\t\toutput += char;\n\t\t\tif (char === '\\n') {\n\t\t\t\tinLineComment = false;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (inBlockComment) {\n\t\t\toutput += char;\n\t\t\tif (char === '*' && next === '/') {\n\t\t\t\toutput += '/';\n\t\t\t\ti++;\n\t\t\t\tinBlockComment = false;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!inSingleQuote && !inDoubleQuote) {\n\t\t\tif (char === '-' && next === '-') {\n\t\t\t\toutput += '--';\n\t\t\t\ti++;\n\t\t\t\tinLineComment = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (char === '/' && next === '*') {\n\t\t\t\toutput += '/*';\n\t\t\t\ti++;\n\t\t\t\tinBlockComment = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tif (char === \"'\" && !inDoubleQuote) {\n\t\t\tinSingleQuote = !inSingleQuote;\n\t\t\toutput += char;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '\"' && !inSingleQuote) {\n\t\t\tinDoubleQuote = !inDoubleQuote;\n\t\t\toutput += char;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '?' && !inSingleQuote && !inDoubleQuote) {\n\t\t\tplaceholderIndex++;\n\t\t\toutput += `$${placeholderIndex}`;\n\t\t\tcontinue;\n\t\t}\n\n\t\toutput += char;\n\t}\n\n\tpostgresPlaceholderCache.set(sql, output);\n\tif (postgresPlaceholderCache.size > 5000) {\n\t\tconst firstKey = postgresPlaceholderCache.keys().next().value;\n\t\tif (firstKey) {\n\t\t\tpostgresPlaceholderCache.delete(firstKey);\n\t\t}\n\t}\n\n\treturn output;\n}\n",
|
|
12
|
-
"/**\n * @fileoverview In-memory mock providers for testing and development.\n *\n * Zero-dependency, lightweight implementations of the {@link KVStorage} and\n * {@link SQLDatabase} contracts. Intended for unit tests, integration tests,\n * local development, and sandboxed routing experiments. The SQL implementation\n * emulates a useful subset of SQLite syntax — enough to drive CollegeDB's\n * router and most ORM-generated CRUD statements without spinning up a real\n * database.\n *\n * The SQL emulator supports:\n *\n * - `CREATE TABLE [IF NOT EXISTS]` with simple column definitions and inline\n * PRIMARY KEY / AUTOINCREMENT / DEFAULT clauses\n * - `INSERT [OR REPLACE|IGNORE|...] INTO` with explicit column lists and\n * `RETURNING` rows\n * - `UPDATE ... SET col = ?, col = expr WHERE ...` with compound WHERE\n * (AND, OR, parens, =, !=, <, >, <=, >=, LIKE, IS NULL, IS NOT NULL)\n * - `DELETE FROM ... WHERE ...` with the same compound WHERE support\n * - `SELECT` projections including `*`, plain columns, aggregate calls\n * (`COUNT(*)`, `COUNT(col)`, `MAX`, `MIN`, `SUM`, `AVG`), `COALESCE`,\n * simple arithmetic on aggregate expressions, `AS` aliases, `ORDER BY`,\n * `LIMIT`, and `OFFSET`\n * - Common metadata queries (`PRAGMA page_count`, `PRAGMA page_size`,\n * `PRAGMA table_info`, `SELECT ... FROM sqlite_master`)\n *\n * The emulator deliberately does not implement transactions, indexes,\n * triggers, full SQL expression evaluation, or cross-table joins. Production\n * workloads should always run against real D1/Postgres/MySQL/SQLite shards\n * via the adapters in `providers.ts`.\n *\n * @author CollegeDB Team\n * @since 1.2.0\n */\n\nimport { CollegeDBError } from './errors';\nimport type { KVListResult, KVStorage, PreparedStatement, QueryResult, SQLDatabase } from './types';\n\n/**\n * Column metadata captured when a CREATE TABLE statement is parsed.\n * @private\n */\ninterface ColumnInfo {\n\tname: string;\n\ttype: string;\n\tisPrimaryKey: boolean;\n\tisAutoIncrement: boolean;\n\tdefaultValue?: unknown;\n\tnotNull?: boolean;\n}\n\n/**\n * Drizzle-style query payloads passed to {@link InMemorySQLDatabase}.\n * @private\n */\ntype InMemoryDrizzleQuery = {\n\ttoQuery?: (config: Record<string, unknown>) => { sql?: string; params?: unknown[] };\n\tsql?: string;\n\tparams?: unknown[];\n\ttext?: string;\n};\n\n/**\n * Format config requested by `drizzle-orm` when building parameterized SQL.\n * Used purely to coax Drizzle into emitting `?` placeholders.\n * @private\n */\nconst IN_MEMORY_DRIZZLE_QUERY_CONFIG = {\n\tcasing: {\n\t\tgetColumnCasing(column: { name?: string }): string {\n\t\t\treturn column?.name ?? '';\n\t\t}\n\t},\n\tescapeName(name: string): string {\n\t\treturn name;\n\t},\n\tescapeParam(): string {\n\t\treturn '?';\n\t},\n\tescapeString(str: string): string {\n\t\treturn str.replace(/'/g, \"''\");\n\t}\n} as const;\n\nconst COMPARISON_OPERATORS = ['<=', '>=', '!=', '<>', '=', '<', '>'] as const;\ntype ComparisonOperator = (typeof COMPARISON_OPERATORS)[number];\n\nconst AGGREGATE_FUNCTIONS = new Set(['COUNT', 'MAX', 'MIN', 'SUM', 'AVG']);\nconst SUPPORTED_SCALARS = new Set(['COALESCE', 'IFNULL', 'LOWER', 'UPPER', 'LENGTH', 'ABS']);\n\n/**\n * Strips back-ticks, double quotes, square brackets, and schema prefixes from an SQL identifier.\n * @private\n */\nfunction normalizeSqlIdentifier(identifier: string): string {\n\treturn (\n\t\tidentifier\n\t\t\t.trim()\n\t\t\t.replace(/^[`\"\\[]+|[`\"\\]]+$/g, '')\n\t\t\t.split('.')\n\t\t\t.pop()\n\t\t\t?.trim() ?? identifier.trim()\n\t);\n}\n\n/**\n * Escapes a literal value before injection into a `RegExp` constructor.\n * @private\n */\nfunction escapeRegExp(value: string): string {\n\treturn value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Tries to coerce a value to a finite number.\n * @private\n */\nfunction toFiniteNumber(value: unknown): number | undefined {\n\tif (typeof value === 'number' && Number.isFinite(value)) {\n\t\treturn value;\n\t}\n\tif (typeof value === 'bigint') {\n\t\treturn Number(value);\n\t}\n\tif (typeof value === 'string') {\n\t\tconst trimmed = value.trim();\n\t\tif (trimmed === '') {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst parsed = Number(trimmed);\n\t\treturn Number.isFinite(parsed) ? parsed : undefined;\n\t}\n\treturn undefined;\n}\n\n/**\n * Splits a comma-separated SQL fragment while respecting parenthesis depth.\n * Used to break apart SELECT column lists and SET assignments without\n * tripping over function calls like `COALESCE(a, 0)`.\n * @private\n */\nfunction splitTopLevel(fragment: string, separator: string = ','): string[] {\n\tconst parts: string[] = [];\n\tlet depth = 0;\n\tlet buffer = '';\n\tlet inSingleQuote = false;\n\tlet inDoubleQuote = false;\n\n\tfor (let i = 0; i < fragment.length; i++) {\n\t\tconst char = fragment[i]!;\n\n\t\tif (char === \"'\" && !inDoubleQuote) {\n\t\t\tinSingleQuote = !inSingleQuote;\n\t\t\tbuffer += char;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === '\"' && !inSingleQuote) {\n\t\t\tinDoubleQuote = !inDoubleQuote;\n\t\t\tbuffer += char;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!inSingleQuote && !inDoubleQuote) {\n\t\t\tif (char === '(') {\n\t\t\t\tdepth++;\n\t\t\t} else if (char === ')') {\n\t\t\t\tdepth = Math.max(0, depth - 1);\n\t\t\t} else if (depth === 0 && char === separator) {\n\t\t\t\tparts.push(buffer.trim());\n\t\t\t\tbuffer = '';\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tbuffer += char;\n\t}\n\n\tconst tail = buffer.trim();\n\tif (tail.length > 0) {\n\t\tparts.push(tail);\n\t}\n\treturn parts;\n}\n\n/**\n * Finds the matching closing parenthesis index for the `(` at `openIndex`.\n * @private\n */\nfunction findMatchingParen(text: string, openIndex: number): number {\n\tlet depth = 0;\n\tlet inSingleQuote = false;\n\tlet inDoubleQuote = false;\n\n\tfor (let i = openIndex; i < text.length; i++) {\n\t\tconst char = text[i]!;\n\t\tif (char === \"'\" && !inDoubleQuote) {\n\t\t\tinSingleQuote = !inSingleQuote;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === '\"' && !inSingleQuote) {\n\t\t\tinDoubleQuote = !inDoubleQuote;\n\t\t\tcontinue;\n\t\t}\n\t\tif (inSingleQuote || inDoubleQuote) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === '(') depth++;\n\t\telse if (char === ')') {\n\t\t\tdepth--;\n\t\t\tif (depth === 0) return i;\n\t\t}\n\t}\n\treturn -1;\n}\n\n/**\n * Parses a JS literal from a SQL expression — strings, numbers, NULL, TRUE/FALSE.\n * @private\n */\nfunction parseLiteral(expression: string): { value: unknown; consumed: boolean } {\n\tconst text = expression.trim();\n\tif (text.length === 0) {\n\t\treturn { value: null, consumed: false };\n\t}\n\n\tif (text === '?') {\n\t\treturn { value: null, consumed: false };\n\t}\n\n\tif (/^null$/i.test(text)) {\n\t\treturn { value: null, consumed: true };\n\t}\n\n\tif (/^true$/i.test(text)) {\n\t\treturn { value: 1, consumed: true };\n\t}\n\n\tif (/^false$/i.test(text)) {\n\t\treturn { value: 0, consumed: true };\n\t}\n\n\tif ((text.startsWith(\"'\") && text.endsWith(\"'\")) || (text.startsWith('\"') && text.endsWith('\"'))) {\n\t\tconst inner = text.slice(1, -1).replace(/''/g, \"'\").replace(/\"\"/g, '\"');\n\t\treturn { value: inner, consumed: true };\n\t}\n\n\tconst numeric = Number(text);\n\tif (Number.isFinite(numeric) && /^-?\\d+(\\.\\d+)?$/.test(text)) {\n\t\treturn { value: numeric, consumed: true };\n\t}\n\n\treturn { value: undefined, consumed: false };\n}\n\n/**\n * Compound WHERE node — either a logical join or a single comparison/IS NULL leaf.\n * @private\n */\ntype WhereNode =\n\t| { type: 'and' | 'or'; children: WhereNode[] }\n\t| {\n\t\t\ttype: 'compare';\n\t\t\tcolumn: string;\n\t\t\toperator: ComparisonOperator | 'LIKE' | 'NOT LIKE';\n\t\t\tvalue: { kind: 'literal'; value: unknown } | { kind: 'param' };\n\t }\n\t| {\n\t\t\ttype: 'null-check';\n\t\t\tcolumn: string;\n\t\t\toperator: 'IS NULL' | 'IS NOT NULL';\n\t }\n\t| { type: 'always-true' };\n\n/**\n * Pulls the trailing `WHERE ...` substring out of an SQL statement, returning\n * everything from the WHERE keyword to either the next clause (`ORDER BY`,\n * `LIMIT`, `OFFSET`, `GROUP BY`, `RETURNING`, `;`) or the end of the string.\n * Quoted strings and parenthesized expressions are respected.\n * @private\n */\nfunction extractWhereSegment(sql: string): { whereClause: string | null; afterWhere: string } {\n\tconst upper = sql.toUpperCase();\n\tconst whereIdx = findKeyword(upper, sql, 'WHERE');\n\tif (whereIdx === -1) {\n\t\t// Even without a WHERE clause we want the post-FROM tail so\n\t\t// extractLimitOffset / extractOrderBy can locate clauses like\n\t\t// `ORDER BY age DESC LIMIT 5`.\n\t\tconst fromIdx = findKeyword(upper, sql, 'FROM');\n\t\tconst tail = fromIdx === -1 ? '' : sql.slice(fromIdx + 'FROM'.length);\n\t\treturn { whereClause: null, afterWhere: tail };\n\t}\n\n\tconst startOfWhere = whereIdx + 'WHERE'.length;\n\tconst terminators = ['ORDER BY', 'GROUP BY', 'HAVING', 'LIMIT', 'OFFSET', 'RETURNING', ';'];\n\n\tlet endIdx = sql.length;\n\tfor (const terminator of terminators) {\n\t\tconst idx = findKeyword(upper, sql, terminator, startOfWhere);\n\t\tif (idx !== -1 && idx < endIdx) {\n\t\t\tendIdx = idx;\n\t\t}\n\t}\n\n\treturn {\n\t\twhereClause: sql.slice(startOfWhere, endIdx).trim(),\n\t\tafterWhere: sql.slice(endIdx)\n\t};\n}\n\n/**\n * Finds a keyword in `sql` (case-insensitive) by matching against `upper`,\n * ignoring positions inside quoted strings. Returns `-1` if not present.\n * @private\n */\nfunction findKeyword(upper: string, original: string, keyword: string, fromIndex: number = 0): number {\n\tlet i = fromIndex;\n\tlet inSingle = false;\n\tlet inDouble = false;\n\n\twhile (i <= upper.length - keyword.length) {\n\t\tconst char = original[i]!;\n\t\tif (char === \"'\" && !inDouble) {\n\t\t\tinSingle = !inSingle;\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === '\"' && !inSingle) {\n\t\t\tinDouble = !inDouble;\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (!inSingle && !inDouble) {\n\t\t\tif (upper.startsWith(keyword, i)) {\n\t\t\t\tconst before = i === 0 ? ' ' : upper[i - 1]!;\n\t\t\t\tconst after = upper[i + keyword.length] ?? ' ';\n\t\t\t\tconst startBoundary = /[A-Z0-9_]/.test(before) === false;\n\t\t\t\tconst endBoundary = /[A-Z0-9_]/.test(after) === false;\n\t\t\t\tif (startBoundary && endBoundary) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\ti++;\n\t}\n\treturn -1;\n}\n\n/**\n * Pulls out the next LIMIT and OFFSET integer literals from `afterWhere`, if present.\n * @private\n */\nfunction extractLimitOffset(afterWhere: string): { limit?: number; offset?: number } {\n\tconst upper = afterWhere.toUpperCase();\n\tconst result: { limit?: number; offset?: number } = {};\n\n\tconst limitIdx = findKeyword(upper, afterWhere, 'LIMIT');\n\tif (limitIdx !== -1) {\n\t\tconst tail = afterWhere.slice(limitIdx + 'LIMIT'.length).trim();\n\t\tconst match = tail.match(/^(\\d+)(?:\\s*,\\s*(\\d+))?/);\n\t\tif (match) {\n\t\t\tconst first = Number(match[1]);\n\t\t\tconst second = match[2] !== undefined ? Number(match[2]) : undefined;\n\t\t\tif (second !== undefined) {\n\t\t\t\tresult.offset = first;\n\t\t\t\tresult.limit = second;\n\t\t\t} else {\n\t\t\t\tresult.limit = first;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst offsetIdx = findKeyword(upper, afterWhere, 'OFFSET');\n\tif (offsetIdx !== -1) {\n\t\tconst tail = afterWhere.slice(offsetIdx + 'OFFSET'.length).trim();\n\t\tconst match = tail.match(/^(\\d+)/);\n\t\tif (match) {\n\t\t\tresult.offset = Number(match[1]);\n\t\t}\n\t}\n\n\treturn result;\n}\n\n/**\n * Splits the body of a SET clause into `(column, expression)` pairs while\n * respecting parenthesis depth and quoted strings. Replaces the buggy\n * `/SET\\s+([^W]+?)WHERE/i` extractor — the original regex's `[^W]` accidentally\n * also excluded lowercase `w` under the `/i` flag, dropping any column whose\n * name contained `w` (for example `wrapped_dek`).\n * @private\n */\nfunction parseSetAssignments(setBody: string): Array<{ column: string; expression: string }> {\n\tconst assignments: Array<{ column: string; expression: string }> = [];\n\tfor (const segment of splitTopLevel(setBody, ',')) {\n\t\tconst eqIdx = segment.indexOf('=');\n\t\tif (eqIdx === -1) continue;\n\t\tconst column = normalizeSqlIdentifier(segment.slice(0, eqIdx));\n\t\tconst expression = segment.slice(eqIdx + 1).trim();\n\t\tif (column.length === 0) continue;\n\t\tassignments.push({ column, expression });\n\t}\n\treturn assignments;\n}\n\n/**\n * Tokenizes a WHERE expression into an array of strings.\n * @private\n */\nfunction tokenizeWhere(expression: string): string[] {\n\tconst tokens: string[] = [];\n\tlet i = 0;\n\twhile (i < expression.length) {\n\t\tconst char = expression[i]!;\n\n\t\tif (/\\s/.test(char)) {\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '(' || char === ')') {\n\t\t\ttokens.push(char);\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '?') {\n\t\t\ttokens.push('?');\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === \"'\" || char === '\"') {\n\t\t\tconst quote = char;\n\t\t\tlet end = i + 1;\n\t\t\twhile (end < expression.length) {\n\t\t\t\tif (expression[end] === quote) {\n\t\t\t\t\tif (expression[end + 1] === quote) {\n\t\t\t\t\t\tend += 2;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tend++;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tend++;\n\t\t\t}\n\t\t\ttokens.push(expression.slice(i, end));\n\t\t\ti = end;\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet matchedOperator: string | null = null;\n\t\tfor (const op of COMPARISON_OPERATORS) {\n\t\t\tif (expression.startsWith(op, i)) {\n\t\t\t\tmatchedOperator = op;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (matchedOperator) {\n\t\t\ttokens.push(matchedOperator);\n\t\t\ti += matchedOperator.length;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Identifier or word token (operator keywords like AND/OR/LIKE/IS/NULL/NOT).\n\t\tlet end = i;\n\t\twhile (end < expression.length && /[A-Za-z0-9_.$]/.test(expression[end]!)) {\n\t\t\tend++;\n\t\t}\n\t\tif (end === i) {\n\t\t\ttokens.push(char);\n\t\t\ti++;\n\t\t} else {\n\t\t\ttokens.push(expression.slice(i, end));\n\t\t\ti = end;\n\t\t}\n\t}\n\treturn tokens;\n}\n\n/**\n * Tiny recursive-descent parser that converts a tokenized WHERE clause into a\n * tree of `WhereNode`s. Supports AND/OR with parenthesized groups and the\n * comparison/null-check operators enumerated above.\n * @private\n */\nclass WhereParser {\n\tprivate position = 0;\n\n\tconstructor(private readonly tokens: string[]) {}\n\n\tparse(): WhereNode {\n\t\tif (this.tokens.length === 0) {\n\t\t\treturn { type: 'always-true' };\n\t\t}\n\t\treturn this.parseOr();\n\t}\n\n\tprivate peek(): string | undefined {\n\t\treturn this.tokens[this.position];\n\t}\n\n\tprivate take(): string | undefined {\n\t\treturn this.tokens[this.position++];\n\t}\n\n\tprivate isKeyword(token: string | undefined, keyword: string): boolean {\n\t\treturn typeof token === 'string' && token.toUpperCase() === keyword;\n\t}\n\n\tprivate parseOr(): WhereNode {\n\t\tlet left = this.parseAnd();\n\t\twhile (this.isKeyword(this.peek(), 'OR')) {\n\t\t\tthis.take();\n\t\t\tconst right = this.parseAnd();\n\t\t\tleft = left.type === 'or' ? { type: 'or', children: [...left.children, right] } : { type: 'or', children: [left, right] };\n\t\t}\n\t\treturn left;\n\t}\n\n\tprivate parseAnd(): WhereNode {\n\t\tlet left = this.parseTerm();\n\t\twhile (this.isKeyword(this.peek(), 'AND')) {\n\t\t\tthis.take();\n\t\t\tconst right = this.parseTerm();\n\t\t\tleft = left.type === 'and' ? { type: 'and', children: [...left.children, right] } : { type: 'and', children: [left, right] };\n\t\t}\n\t\treturn left;\n\t}\n\n\tprivate parseTerm(): WhereNode {\n\t\tconst next = this.peek();\n\t\tif (next === '(') {\n\t\t\tthis.take();\n\t\t\tconst expression = this.parseOr();\n\t\t\tif (this.peek() === ')') {\n\t\t\t\tthis.take();\n\t\t\t}\n\t\t\treturn expression;\n\t\t}\n\t\treturn this.parseComparison();\n\t}\n\n\tprivate parseComparison(): WhereNode {\n\t\tconst columnToken = this.take();\n\t\tif (columnToken === undefined) {\n\t\t\treturn { type: 'always-true' };\n\t\t}\n\n\t\tconst column = normalizeSqlIdentifier(columnToken);\n\t\tconst operatorToken = this.take();\n\t\tif (operatorToken === undefined) {\n\t\t\treturn { type: 'always-true' };\n\t\t}\n\n\t\tconst operatorUpper = operatorToken.toUpperCase();\n\t\tif (operatorUpper === 'IS') {\n\t\t\tconst maybeNot = this.peek();\n\t\t\tif (this.isKeyword(maybeNot, 'NOT')) {\n\t\t\t\tthis.take();\n\t\t\t\tconst nullToken = this.take();\n\t\t\t\tif (this.isKeyword(nullToken, 'NULL')) {\n\t\t\t\t\treturn { type: 'null-check', column, operator: 'IS NOT NULL' };\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst nullToken = this.take();\n\t\t\tif (this.isKeyword(nullToken, 'NULL')) {\n\t\t\t\treturn { type: 'null-check', column, operator: 'IS NULL' };\n\t\t\t}\n\t\t\treturn { type: 'always-true' };\n\t\t}\n\n\t\tlet comparisonOperator: ComparisonOperator | 'LIKE' | 'NOT LIKE' | null = null;\n\t\tif (operatorUpper === 'LIKE') {\n\t\t\tcomparisonOperator = 'LIKE';\n\t\t} else if (operatorUpper === 'NOT') {\n\t\t\tconst maybeLike = this.take();\n\t\t\tif (this.isKeyword(maybeLike, 'LIKE')) {\n\t\t\t\tcomparisonOperator = 'NOT LIKE';\n\t\t\t} else {\n\t\t\t\treturn { type: 'always-true' };\n\t\t\t}\n\t\t} else if (COMPARISON_OPERATORS.includes(operatorUpper as ComparisonOperator)) {\n\t\t\tcomparisonOperator = operatorUpper as ComparisonOperator;\n\t\t}\n\n\t\tif (!comparisonOperator) {\n\t\t\treturn { type: 'always-true' };\n\t\t}\n\n\t\tconst valueToken = this.take();\n\t\tif (valueToken === '?') {\n\t\t\treturn { type: 'compare', column, operator: comparisonOperator, value: { kind: 'param' } };\n\t\t}\n\t\tconst literal = parseLiteral(valueToken ?? '');\n\t\treturn {\n\t\t\ttype: 'compare',\n\t\t\tcolumn,\n\t\t\toperator: comparisonOperator,\n\t\t\tvalue: { kind: 'literal', value: literal.consumed ? literal.value : (valueToken ?? null) }\n\t\t};\n\t}\n}\n\n/**\n * Walks a {@link WhereNode} tree against a record, consuming `?` bindings in\n * left-to-right order from `bindings[paramCursor]`.\n * @private\n */\nfunction evaluateWhere(node: WhereNode, record: Record<string, unknown>, bindings: unknown[], paramCursor: { value: number }): boolean {\n\tswitch (node.type) {\n\t\tcase 'always-true':\n\t\t\treturn true;\n\t\tcase 'and':\n\t\t\treturn node.children.every((child) => evaluateWhere(child, record, bindings, paramCursor));\n\t\tcase 'or': {\n\t\t\t// All `?` parameters in an OR expression still consume bindings even\n\t\t\t// when short-circuited, otherwise downstream clauses pick up the wrong\n\t\t\t// binding indices.\n\t\t\tlet matched = false;\n\t\t\tfor (const child of node.children) {\n\t\t\t\tif (evaluateWhere(child, record, bindings, paramCursor)) {\n\t\t\t\t\tmatched = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn matched;\n\t\t}\n\t\tcase 'null-check': {\n\t\t\tconst recordValue = record[node.column];\n\t\t\tconst isNull = recordValue === null || recordValue === undefined;\n\t\t\treturn node.operator === 'IS NULL' ? isNull : !isNull;\n\t\t}\n\t\tcase 'compare': {\n\t\t\tlet value: unknown;\n\t\t\tif (node.value.kind === 'param') {\n\t\t\t\tvalue = bindings[paramCursor.value++];\n\t\t\t} else {\n\t\t\t\tvalue = node.value.value;\n\t\t\t}\n\t\t\tconst recordValue = record[node.column];\n\n\t\t\tif (node.operator === 'LIKE' || node.operator === 'NOT LIKE') {\n\t\t\t\tconst pattern = String(value ?? '');\n\t\t\t\tconst regex = new RegExp(`^${escapeRegExp(pattern).replace(/%/g, '.*').replace(/_/g, '.')}$`, 'i');\n\t\t\t\tconst matches = regex.test(String(recordValue ?? ''));\n\t\t\t\treturn node.operator === 'LIKE' ? matches : !matches;\n\t\t\t}\n\n\t\t\tconst leftNumber = toFiniteNumber(recordValue);\n\t\t\tconst rightNumber = toFiniteNumber(value);\n\n\t\t\tlet comparison: number;\n\t\t\tif (leftNumber !== undefined && rightNumber !== undefined) {\n\t\t\t\tcomparison = leftNumber === rightNumber ? 0 : leftNumber < rightNumber ? -1 : 1;\n\t\t\t} else if (recordValue === null || recordValue === undefined) {\n\t\t\t\tif (value === null || value === undefined) {\n\t\t\t\t\tcomparison = 0;\n\t\t\t\t} else {\n\t\t\t\t\tcomparison = -1;\n\t\t\t\t}\n\t\t\t} else if (value === null || value === undefined) {\n\t\t\t\tcomparison = 1;\n\t\t\t} else {\n\t\t\t\tconst leftStr = String(recordValue);\n\t\t\t\tconst rightStr = String(value);\n\t\t\t\tcomparison = leftStr === rightStr ? 0 : leftStr < rightStr ? -1 : 1;\n\t\t\t}\n\n\t\t\tswitch (node.operator) {\n\t\t\t\tcase '=':\n\t\t\t\t\treturn comparison === 0;\n\t\t\t\tcase '!=':\n\t\t\t\tcase '<>':\n\t\t\t\t\treturn comparison !== 0;\n\t\t\t\tcase '<':\n\t\t\t\t\treturn comparison < 0;\n\t\t\t\tcase '<=':\n\t\t\t\t\treturn comparison <= 0;\n\t\t\t\tcase '>':\n\t\t\t\t\treturn comparison > 0;\n\t\t\t\tcase '>=':\n\t\t\t\t\treturn comparison >= 0;\n\t\t\t\tdefault:\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Reports the number of `?` placeholders that appear in `text`, respecting\n * quoted strings.\n * @private\n */\nfunction countQuestionPlaceholders(text: string): number {\n\tlet count = 0;\n\tlet inSingle = false;\n\tlet inDouble = false;\n\tfor (let i = 0; i < text.length; i++) {\n\t\tconst char = text[i]!;\n\t\tif (char === \"'\" && !inDouble) {\n\t\t\tinSingle = !inSingle;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === '\"' && !inSingle) {\n\t\t\tinDouble = !inDouble;\n\t\t\tcontinue;\n\t\t}\n\t\tif (!inSingle && !inDouble && char === '?') {\n\t\t\tcount++;\n\t\t}\n\t}\n\treturn count;\n}\n\n/**\n * Lightweight detector for the SQL statement kind. Used to pick the matching\n * handler in {@link InMemorySQLDatabase.executeStatement}.\n * @private\n */\nfunction detectStatementType(\n\tsql: string\n): 'select' | 'insert' | 'update' | 'delete' | 'create-table' | 'drop-table' | 'pragma' | 'sqlite-master-select' | 'other' {\n\tconst trimmed = sql.trim().toUpperCase();\n\tif (trimmed.startsWith('SELECT') || trimmed.startsWith('WITH')) {\n\t\tif (trimmed.includes('SQLITE_MASTER')) {\n\t\t\treturn 'sqlite-master-select';\n\t\t}\n\t\treturn 'select';\n\t}\n\tif (trimmed.startsWith('INSERT')) return 'insert';\n\tif (trimmed.startsWith('UPDATE')) return 'update';\n\tif (trimmed.startsWith('DELETE')) return 'delete';\n\tif (trimmed.startsWith('CREATE TABLE')) return 'create-table';\n\tif (trimmed.startsWith('DROP TABLE')) return 'drop-table';\n\tif (trimmed.startsWith('PRAGMA')) return 'pragma';\n\treturn 'other';\n}\n\n/**\n * Extracts a table name when one is referenced by an `INSERT INTO`, `UPDATE`,\n * `DELETE FROM`, `SELECT ... FROM`, or `CREATE TABLE` clause.\n * @private\n */\nfunction extractTableName(sql: string): string | null {\n\tconst upper = sql.toUpperCase();\n\n\t// CREATE TABLE [IF NOT EXISTS] <name>\n\tconst createMatch = sql.match(/create\\s+table\\s+(?:if\\s+not\\s+exists\\s+)?([`\"\\[]?[\\w.]+[`\"\\]]?)/i);\n\tif (createMatch) {\n\t\treturn normalizeSqlIdentifier(createMatch[1] ?? '');\n\t}\n\n\t// DROP TABLE [IF EXISTS] <name>\n\tconst dropMatch = sql.match(/drop\\s+table\\s+(?:if\\s+exists\\s+)?([`\"\\[]?[\\w.]+[`\"\\]]?)/i);\n\tif (dropMatch) {\n\t\treturn normalizeSqlIdentifier(dropMatch[1] ?? '');\n\t}\n\n\t// INSERT [OR REPLACE|IGNORE|...] INTO <name>\n\tconst insertMatch = sql.match(/insert\\s+(?:or\\s+\\w+\\s+)?into\\s+([`\"\\[]?[\\w.]+[`\"\\]]?)/i);\n\tif (insertMatch) {\n\t\treturn normalizeSqlIdentifier(insertMatch[1] ?? '');\n\t}\n\n\t// UPDATE [OR ...] <name>\n\tconst updateMatch = sql.match(/update\\s+(?:or\\s+\\w+\\s+)?([`\"\\[]?[\\w.]+[`\"\\]]?)\\s+set/i);\n\tif (updateMatch) {\n\t\treturn normalizeSqlIdentifier(updateMatch[1] ?? '');\n\t}\n\n\t// DELETE FROM <name>\n\tconst deleteMatch = sql.match(/delete\\s+from\\s+([`\"\\[]?[\\w.]+[`\"\\]]?)/i);\n\tif (deleteMatch) {\n\t\treturn normalizeSqlIdentifier(deleteMatch[1] ?? '');\n\t}\n\n\t// SELECT ... FROM <name>\n\tconst fromIdx = findKeyword(upper, sql, 'FROM');\n\tif (fromIdx !== -1) {\n\t\tconst after = sql.slice(fromIdx + 'FROM'.length).trim();\n\t\tconst match = after.match(/^([`\"\\[]?[\\w.]+[`\"\\]]?)/);\n\t\tif (match) {\n\t\t\treturn normalizeSqlIdentifier(match[1] ?? '');\n\t\t}\n\t}\n\n\treturn null;\n}\n\n/**\n * Normalizes Drizzle-style query payloads into plain `(sql, bindings)`.\n * @private\n */\nfunction normalizeInMemoryDrizzleQuery(query: string | InMemoryDrizzleQuery, bindings: any[] = []): { sql: string; bindings: any[] } {\n\tif (typeof query === 'string') {\n\t\treturn { sql: query, bindings };\n\t}\n\n\tif (!query || typeof query !== 'object') {\n\t\tthrow new CollegeDBError('Unsupported query input', 'INVALID_QUERY_INPUT');\n\t}\n\n\tif (typeof query.toQuery === 'function') {\n\t\tconst built = query.toQuery(IN_MEMORY_DRIZZLE_QUERY_CONFIG as Record<string, unknown>);\n\t\tif (built && typeof built.sql === 'string') {\n\t\t\treturn {\n\t\t\t\tsql: built.sql,\n\t\t\t\tbindings: Array.isArray(built.params) ? [...built.params] : bindings\n\t\t\t};\n\t\t}\n\t}\n\n\tif (typeof query.sql === 'string') {\n\t\treturn {\n\t\t\tsql: query.sql,\n\t\t\tbindings: Array.isArray(query.params) ? [...query.params] : bindings\n\t\t};\n\t}\n\n\tif (typeof query.text === 'string') {\n\t\treturn {\n\t\t\tsql: query.text,\n\t\t\tbindings: Array.isArray(query.params) ? [...query.params] : bindings\n\t\t};\n\t}\n\n\tthrow new CollegeDBError('Unsupported Drizzle-style query object', 'INVALID_QUERY_INPUT');\n}\n\n/**\n * Internal projection descriptor produced by {@link parseSelectColumns}.\n * @private\n */\ninterface SelectColumn {\n\texpression: string;\n\talias: string;\n\tkind: 'star' | 'column' | 'aggregate' | 'scalar' | 'expression';\n}\n\n/**\n * Splits the body of a SELECT projection into descriptive fragments. Each\n * fragment carries the original expression text, the resolved output alias,\n * and a coarse \"kind\" so {@link evaluateSelectColumn} can decide whether to\n * materialize an aggregate or simply project a column.\n * @private\n */\nfunction parseSelectColumns(selectBody: string): SelectColumn[] {\n\tconst fragments = splitTopLevel(selectBody, ',');\n\treturn fragments.map((fragment) => {\n\t\tconst aliasMatch = fragment.match(/\\s+as\\s+([`\"\\[]?[\\w.]+[`\"\\]]?)\\s*$/i);\n\t\tconst expression = aliasMatch ? fragment.slice(0, aliasMatch.index).trim() : fragment.trim();\n\t\tconst alias = aliasMatch ? normalizeSqlIdentifier(aliasMatch[1] ?? '') : deriveDefaultAlias(expression);\n\n\t\tif (expression === '*') {\n\t\t\treturn { expression, alias: '*', kind: 'star' };\n\t\t}\n\n\t\tconst upperExpression = expression.toUpperCase();\n\t\tconst funcMatch = expression.match(/^([A-Za-z_][A-Za-z0-9_]*)\\s*\\(/);\n\t\tif (funcMatch) {\n\t\t\tconst fnName = (funcMatch[1] ?? '').toUpperCase();\n\t\t\tif (AGGREGATE_FUNCTIONS.has(fnName) || /\\b(?:COUNT|MAX|MIN|SUM|AVG)\\s*\\(/i.test(upperExpression)) {\n\t\t\t\treturn { expression, alias, kind: 'aggregate' };\n\t\t\t}\n\t\t\tif (SUPPORTED_SCALARS.has(fnName)) {\n\t\t\t\treturn { expression, alias, kind: 'scalar' };\n\t\t\t}\n\t\t}\n\n\t\tif (/[+\\-*/()]/.test(expression) || /\\bCOUNT\\s*\\(/i.test(expression) || /\\bMAX\\s*\\(/i.test(expression)) {\n\t\t\treturn { expression, alias, kind: 'expression' };\n\t\t}\n\n\t\treturn { expression, alias, kind: 'column' };\n\t});\n}\n\n/**\n * Picks a deterministic alias for a SELECT expression when the caller didn't\n * explicitly assign one with `AS`.\n * @private\n */\nfunction deriveDefaultAlias(expression: string): string {\n\tconst trimmed = expression.trim();\n\tif (trimmed === '*') return '*';\n\tconst match = trimmed.match(/^([`\"\\[]?[\\w.]+[`\"\\]]?)$/);\n\tif (match) {\n\t\treturn normalizeSqlIdentifier(trimmed);\n\t}\n\treturn trimmed;\n}\n\n/**\n * Replaces the next sequence of `?` placeholders inside an expression with the\n * corresponding bindings so the resulting text can be evaluated by\n * {@link evaluateScalarExpression} as a literal expression. Returns the\n * updated expression and the new binding cursor index.\n * @private\n */\nfunction substituteBindings(expression: string, bindings: unknown[], cursor: number): { expression: string; cursor: number } {\n\tlet output = '';\n\tlet inSingle = false;\n\tlet inDouble = false;\n\tlet i = 0;\n\tlet localCursor = cursor;\n\twhile (i < expression.length) {\n\t\tconst char = expression[i]!;\n\t\tif (char === \"'\" && !inDouble) {\n\t\t\tinSingle = !inSingle;\n\t\t\toutput += char;\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === '\"' && !inSingle) {\n\t\t\tinDouble = !inDouble;\n\t\t\toutput += char;\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (!inSingle && !inDouble && char === '?') {\n\t\t\tconst value = bindings[localCursor++];\n\t\t\toutput += literalToSql(value);\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\toutput += char;\n\t\ti++;\n\t}\n\treturn { expression: output, cursor: localCursor };\n}\n\n/**\n * Encodes a JS value as a SQL literal suitable for in-place substitution.\n * @private\n */\nfunction literalToSql(value: unknown): string {\n\tif (value === null || value === undefined) return 'NULL';\n\tif (typeof value === 'number' || typeof value === 'bigint') return String(value);\n\tif (typeof value === 'boolean') return value ? '1' : '0';\n\tconst stringValue = String(value).replace(/'/g, \"''\");\n\treturn `'${stringValue}'`;\n}\n\n/**\n * Evaluates a single SELECT expression against the rows that survived\n * filtering. Aggregates are computed across `rows`; non-aggregate expressions\n * are evaluated against the first row (or returned as `null` when empty).\n * @private\n */\nfunction evaluateSelectColumn(column: SelectColumn, rows: Record<string, unknown>[], bindings: unknown[], cursor: number): unknown {\n\tif (column.kind === 'star') {\n\t\treturn undefined;\n\t}\n\n\tif (column.kind === 'column') {\n\t\tconst first = rows[0];\n\t\treturn first ? first[column.expression] : null;\n\t}\n\n\tconst substituted = substituteBindings(column.expression, bindings, cursor).expression;\n\n\tif (column.kind === 'aggregate' || /\\b(?:COUNT|MAX|MIN|SUM|AVG)\\s*\\(/i.test(substituted)) {\n\t\treturn evaluateAggregateExpression(substituted, rows);\n\t}\n\n\tif (column.kind === 'scalar') {\n\t\tconst first = rows[0] ?? {};\n\t\treturn evaluateScalarExpression(substituted, first);\n\t}\n\n\tconst first = rows[0] ?? {};\n\treturn evaluateScalarExpression(substituted, first);\n}\n\n/**\n * Replaces every aggregate call inside `expression` with its evaluated value\n * (computed across `rows`), then defers any remaining expression evaluation —\n * which at this point should only involve numbers and operators — to\n * {@link evaluateScalarExpression}.\n * @private\n */\nfunction evaluateAggregateExpression(expression: string, rows: Record<string, unknown>[]): unknown {\n\tlet working = expression;\n\tconst aggregatePattern = /(COUNT|MAX|MIN|SUM|AVG)\\s*\\(/i;\n\tlet safety = 0;\n\n\twhile (aggregatePattern.test(working) && safety < 25) {\n\t\tsafety++;\n\t\tconst match = working.match(aggregatePattern);\n\t\tif (!match || match.index === undefined) break;\n\t\tconst openParenIndex = working.indexOf('(', match.index);\n\t\tif (openParenIndex === -1) break;\n\t\tconst closeParenIndex = findMatchingParen(working, openParenIndex);\n\t\tif (closeParenIndex === -1) break;\n\n\t\tconst fnName = (match[1] ?? '').toUpperCase();\n\t\tconst inner = working.slice(openParenIndex + 1, closeParenIndex).trim();\n\t\tconst value = computeAggregate(fnName, inner, rows);\n\t\tconst replacement = literalToSql(value);\n\t\tworking = working.slice(0, match.index) + replacement + working.slice(closeParenIndex + 1);\n\t}\n\n\treturn evaluateScalarExpression(working, rows[0] ?? {});\n}\n\n/**\n * Computes a single aggregate value (COUNT/MAX/MIN/SUM/AVG) for the provided rows.\n * @private\n */\nfunction computeAggregate(fnName: string, inner: string, rows: Record<string, unknown>[]): unknown {\n\tif (fnName === 'COUNT') {\n\t\tif (inner === '*') {\n\t\t\treturn rows.length;\n\t\t}\n\t\tconst isDistinct = /^distinct\\s+/i.test(inner);\n\t\tconst column = normalizeSqlIdentifier(inner.replace(/^distinct\\s+/i, ''));\n\t\tconst values = rows.map((row) => row[column]).filter((value) => value !== null && value !== undefined);\n\t\tif (isDistinct) {\n\t\t\treturn new Set(values.map((value) => String(value))).size;\n\t\t}\n\t\treturn values.length;\n\t}\n\n\tconst column = normalizeSqlIdentifier(inner);\n\tconst numericValues = rows.map((row) => toFiniteNumber(row[column])).filter((value): value is number => value !== undefined);\n\n\tif (numericValues.length === 0) {\n\t\treturn null;\n\t}\n\n\tswitch (fnName) {\n\t\tcase 'MAX':\n\t\t\treturn Math.max(...numericValues);\n\t\tcase 'MIN':\n\t\t\treturn Math.min(...numericValues);\n\t\tcase 'SUM':\n\t\t\treturn numericValues.reduce((sum, value) => sum + value, 0);\n\t\tcase 'AVG':\n\t\t\treturn numericValues.reduce((sum, value) => sum + value, 0) / numericValues.length;\n\t\tdefault:\n\t\t\treturn null;\n\t}\n}\n\n/**\n * Tiny expression evaluator for the residual scalar forms left after\n * aggregates have been substituted. Supports COALESCE/IFNULL, LOWER/UPPER,\n * LENGTH, ABS, and arithmetic / comparison via {@link safelyEvaluate}.\n * @private\n */\nfunction evaluateScalarExpression(expression: string, record: Record<string, unknown>): unknown {\n\tconst trimmed = expression.trim();\n\tif (trimmed.length === 0) return null;\n\n\tconst literal = parseLiteral(trimmed);\n\tif (literal.consumed) {\n\t\treturn literal.value;\n\t}\n\n\tconst scalarMatch = trimmed.match(/^([A-Za-z_][A-Za-z0-9_]*)\\s*\\(/);\n\tif (scalarMatch) {\n\t\tconst fnName = (scalarMatch[1] ?? '').toUpperCase();\n\t\tconst openParenIndex = trimmed.indexOf('(', scalarMatch.index);\n\t\tconst closeParenIndex = findMatchingParen(trimmed, openParenIndex);\n\t\tif (closeParenIndex !== -1) {\n\t\t\tconst inner = trimmed.slice(openParenIndex + 1, closeParenIndex);\n\t\t\tconst args = splitTopLevel(inner, ',').map((arg) => evaluateScalarExpression(arg, record));\n\t\t\tconst suffix = trimmed.slice(closeParenIndex + 1).trim();\n\t\t\tconst value = applyScalarFunction(fnName, args);\n\t\t\tif (suffix.length === 0) {\n\t\t\t\treturn value;\n\t\t\t}\n\t\t\treturn safelyEvaluate(`${literalToSql(value)} ${suffix}`, record);\n\t\t}\n\t}\n\n\tconst identifierMatch = trimmed.match(/^([`\"\\[]?[\\w.]+[`\"\\]]?)$/);\n\tif (identifierMatch) {\n\t\treturn record[normalizeSqlIdentifier(trimmed)] ?? null;\n\t}\n\n\treturn safelyEvaluate(trimmed, record);\n}\n\n/**\n * Applies a non-aggregate scalar function to its evaluated argument list.\n * @private\n */\nfunction applyScalarFunction(fnName: string, args: unknown[]): unknown {\n\tswitch (fnName) {\n\t\tcase 'COALESCE':\n\t\tcase 'IFNULL': {\n\t\t\tfor (const arg of args) {\n\t\t\t\tif (arg !== null && arg !== undefined) return arg;\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t\tcase 'LOWER':\n\t\t\treturn args[0] === null || args[0] === undefined ? null : String(args[0]).toLowerCase();\n\t\tcase 'UPPER':\n\t\t\treturn args[0] === null || args[0] === undefined ? null : String(args[0]).toUpperCase();\n\t\tcase 'LENGTH':\n\t\t\treturn args[0] === null || args[0] === undefined ? null : String(args[0]).length;\n\t\tcase 'ABS': {\n\t\t\tconst numeric = toFiniteNumber(args[0]);\n\t\t\treturn numeric === undefined ? null : Math.abs(numeric);\n\t\t}\n\t\tdefault:\n\t\t\treturn null;\n\t}\n}\n\n/**\n * Computes a constrained subset of scalar expressions — numeric arithmetic\n * over column references and constants. Anything outside that subset is\n * returned verbatim so the caller can decide whether the result is useful.\n * @private\n */\nfunction safelyEvaluate(expression: string, record: Record<string, unknown>): unknown {\n\tconst trimmed = expression.trim();\n\tif (trimmed.length === 0) return null;\n\n\tconst literal = parseLiteral(trimmed);\n\tif (literal.consumed) return literal.value;\n\n\tif (!/^[\\d+\\-*/().\\s]+$/.test(trimmed)) {\n\t\t// Try simple identifier-resolved arithmetic, e.g. \"max_id + 1\".\n\t\tconst tokens = trimmed.split(/(\\s|[+\\-*/()])/).filter((token) => token.trim().length > 0);\n\t\tconst replaced = tokens\n\t\t\t.map((token) => {\n\t\t\t\tif (/^[+\\-*/()]$/.test(token)) return token;\n\t\t\t\tconst number = Number(token);\n\t\t\t\tif (Number.isFinite(number)) return token;\n\t\t\t\tif (token.toLowerCase() === 'null') return 'null';\n\t\t\t\tconst value = record[normalizeSqlIdentifier(token)];\n\t\t\t\tif (value === null || value === undefined) return 'null';\n\t\t\t\tif (typeof value === 'number') return String(value);\n\t\t\t\treturn JSON.stringify(value);\n\t\t\t})\n\t\t\t.join(' ');\n\n\t\tif (!/^[\\d+\\-*/().\\s]+$/.test(replaced.replace(/null/g, '0'))) {\n\t\t\treturn trimmed;\n\t\t}\n\n\t\ttry {\n\t\t\t// eslint-disable-next-line no-new-func\n\t\t\tconst evaluator = new Function(`return (${replaced.replace(/null/g, '0')});`);\n\t\t\treturn evaluator();\n\t\t} catch {\n\t\t\treturn trimmed;\n\t\t}\n\t}\n\n\ttry {\n\t\t// eslint-disable-next-line no-new-func\n\t\tconst evaluator = new Function(`return (${trimmed});`);\n\t\treturn evaluator();\n\t} catch {\n\t\treturn trimmed;\n\t}\n}\n\n/**\n * In-memory SQL backend used by tests and local sandboxes.\n *\n * Implements the {@link SQLDatabase} contract with a deliberately limited\n * subset of SQLite-flavored SQL. See the file-level docstring for the exact\n * features supported.\n */\nexport class InMemorySQLDatabase implements SQLDatabase {\n\tprivate tables = new Map<string, Map<string, Record<string, unknown>>>();\n\tprivate schemas = new Map<string, Map<string, ColumnInfo>>();\n\tprivate autoIncrementCounters = new Map<string, number>();\n\tprivate lastInsertRowId: number | string | null = null;\n\n\tprepare(sql: string): PreparedStatement {\n\t\treturn new InMemoryPreparedStatement(this, sql);\n\t}\n\n\tasync execute(query: string | InMemoryDrizzleQuery, bindings: any[] = []): Promise<QueryResult<Record<string, unknown>>> {\n\t\treturn await this.executeClientQuery(query, bindings);\n\t}\n\n\tasync run(query: string | InMemoryDrizzleQuery, bindings: any[] = []): Promise<QueryResult<Record<string, unknown>>> {\n\t\treturn await this.executeClientQuery(query, bindings);\n\t}\n\n\tasync all(query: string | InMemoryDrizzleQuery, bindings: any[] = []): Promise<QueryResult<Record<string, unknown>>> {\n\t\treturn await this.executeClientQuery(query, bindings);\n\t}\n\n\tasync get(query: string | InMemoryDrizzleQuery, bindings: any[] = []): Promise<QueryResult<Record<string, unknown>>> {\n\t\treturn await this.executeClientQuery(query, bindings);\n\t}\n\n\t/**\n\t * Routes a Drizzle-style query payload through the SQL emulator.\n\t * @private\n\t */\n\tprivate async executeClientQuery(query: string | InMemoryDrizzleQuery, bindings: any[]): Promise<QueryResult<Record<string, unknown>>> {\n\t\tconst normalized = normalizeInMemoryDrizzleQuery(query, bindings);\n\t\treturn await this.executeStatement(normalized.sql, normalized.bindings);\n\t}\n\n\t/**\n\t * Dispatches to the correct handler based on the SQL statement kind.\n\t * Public so the prepared-statement wrapper can target it directly.\n\t */\n\tasync executeStatement(sql: string, bindings: any[]): Promise<QueryResult<Record<string, unknown>>> {\n\t\tconst startTime = Date.now();\n\t\ttry {\n\t\t\tswitch (detectStatementType(sql)) {\n\t\t\t\tcase 'create-table':\n\t\t\t\t\treturn await this.handleCreateTable(sql);\n\t\t\t\tcase 'drop-table':\n\t\t\t\t\treturn await this.handleDropTable(sql);\n\t\t\t\tcase 'insert':\n\t\t\t\t\treturn await this.handleInsert(sql, bindings);\n\t\t\t\tcase 'update':\n\t\t\t\t\treturn await this.handleUpdate(sql, bindings);\n\t\t\t\tcase 'delete':\n\t\t\t\t\treturn await this.handleDelete(sql, bindings);\n\t\t\t\tcase 'select':\n\t\t\t\t\treturn await this.handleSelect(sql, bindings);\n\t\t\t\tcase 'sqlite-master-select':\n\t\t\t\t\treturn await this.handleSqliteMasterSelect(sql, bindings);\n\t\t\t\tcase 'pragma':\n\t\t\t\t\treturn await this.handlePragma(sql);\n\t\t\t\tcase 'other':\n\t\t\t\tdefault:\n\t\t\t\t\t// No-op success for unsupported statements (CREATE INDEX, ATTACH, etc.).\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\tresults: [],\n\t\t\t\t\t\tmeta: { duration: Date.now() - startTime }\n\t\t\t\t\t};\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tresults: [],\n\t\t\t\tmeta: { duration: Date.now() - startTime },\n\t\t\t\terror: message\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Convenience wrapper kept for backwards compatibility. Routes SELECT\n\t * statements through the emulator and rejects other statement kinds.\n\t */\n\tasync executeQuery(sql: string, bindings: any[]): Promise<QueryResult<Record<string, unknown>>> {\n\t\tconst startTime = Date.now();\n\t\tconst kind = detectStatementType(sql);\n\t\tif (kind === 'select' || kind === 'sqlite-master-select' || kind === 'pragma') {\n\t\t\treturn await this.executeStatement(sql, bindings);\n\t\t}\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tresults: [],\n\t\t\tmeta: { duration: Date.now() - startTime },\n\t\t\terror: 'Use executeStatement for non-SELECT queries'\n\t\t};\n\t}\n\n\tprivate async handleCreateTable(sql: string): Promise<QueryResult> {\n\t\tconst startTime = Date.now();\n\t\tconst tableName = extractTableName(sql);\n\n\t\tif (!tableName) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tresults: [],\n\t\t\t\tmeta: { duration: Date.now() - startTime },\n\t\t\t\terror: 'Could not extract table name'\n\t\t\t};\n\t\t}\n\n\t\tconst schema = new Map<string, ColumnInfo>();\n\t\tconst openParen = sql.indexOf('(');\n\t\tconst closeParen = openParen === -1 ? -1 : findMatchingParen(sql, openParen);\n\n\t\tif (openParen !== -1 && closeParen !== -1) {\n\t\t\tconst definitionBody = sql.slice(openParen + 1, closeParen);\n\t\t\tfor (const rawColumn of splitTopLevel(definitionBody, ',')) {\n\t\t\t\tconst tokens = rawColumn.trim().split(/\\s+/);\n\t\t\t\tif (tokens.length === 0) continue;\n\t\t\t\tconst firstUpper = tokens[0]?.toUpperCase() ?? '';\n\t\t\t\t// Skip table-level constraints such as PRIMARY KEY (...), FOREIGN KEY, CHECK, UNIQUE.\n\t\t\t\tif (['PRIMARY', 'FOREIGN', 'UNIQUE', 'CHECK', 'CONSTRAINT'].includes(firstUpper)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst colName = normalizeSqlIdentifier(tokens[0] ?? '');\n\t\t\t\tif (colName.length === 0) continue;\n\t\t\t\tconst colType = (tokens[1] ?? '').toUpperCase();\n\t\t\t\tconst modifiers = tokens.slice(2).join(' ').toUpperCase();\n\n\t\t\t\tschema.set(colName, {\n\t\t\t\t\tname: colName,\n\t\t\t\t\ttype: colType,\n\t\t\t\t\tisPrimaryKey: modifiers.includes('PRIMARY KEY'),\n\t\t\t\t\tisAutoIncrement:\n\t\t\t\t\t\tmodifiers.includes('AUTOINCREMENT') ||\n\t\t\t\t\t\tmodifiers.includes('AUTO_INCREMENT') ||\n\t\t\t\t\t\tmodifiers.includes('GENERATED BY DEFAULT AS IDENTITY'),\n\t\t\t\t\tdefaultValue: extractDefaultValue(tokens.slice(2).join(' ')),\n\t\t\t\t\tnotNull: modifiers.includes('NOT NULL')\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tthis.tables.set(tableName, new Map());\n\t\tthis.schemas.set(tableName, schema);\n\n\t\tfor (const column of schema.values()) {\n\t\t\tif (column.isAutoIncrement) {\n\t\t\t\tthis.autoIncrementCounters.set(tableName, this.autoIncrementCounters.get(tableName) ?? 0);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults: [],\n\t\t\tmeta: { duration: Date.now() - startTime }\n\t\t};\n\t}\n\n\tprivate async handleDropTable(sql: string): Promise<QueryResult> {\n\t\tconst startTime = Date.now();\n\t\tconst tableName = extractTableName(sql);\n\n\t\tif (!tableName) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tresults: [],\n\t\t\t\tmeta: { duration: Date.now() - startTime },\n\t\t\t\terror: 'Could not extract table name'\n\t\t\t};\n\t\t}\n\n\t\tthis.tables.delete(tableName);\n\t\tthis.schemas.delete(tableName);\n\t\tthis.autoIncrementCounters.delete(tableName);\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults: [],\n\t\t\tmeta: { duration: Date.now() - startTime }\n\t\t};\n\t}\n\n\tprivate async handleInsert(sql: string, bindings: any[]): Promise<QueryResult> {\n\t\tconst startTime = Date.now();\n\t\tconst tableName = extractTableName(sql);\n\n\t\tif (!tableName) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tresults: [],\n\t\t\t\tmeta: { duration: Date.now() - startTime },\n\t\t\t\terror: 'Could not extract table name'\n\t\t\t};\n\t\t}\n\n\t\tif (!this.tables.has(tableName)) {\n\t\t\tthis.tables.set(tableName, new Map());\n\t\t}\n\n\t\tconst table = this.tables.get(tableName)!;\n\t\tconst schema = this.schemas.get(tableName);\n\t\tconst schemaEntries = schema ? Array.from(schema.values()) : [];\n\t\tconst primaryKeyInfo = schemaEntries.find((column) => column.isPrimaryKey);\n\t\tconst autoIncrementInfo = schemaEntries.find((column) => column.isAutoIncrement);\n\n\t\tconst explicitColumns = extractInsertColumns(sql);\n\t\tconst isOrReplace = /\\binsert\\s+or\\s+replace\\b/i.test(sql);\n\t\tconst isOrIgnore = /\\binsert\\s+or\\s+(?:ignore|abort|fail|rollback)\\b/i.test(sql);\n\n\t\tconst valuesSegments = extractInsertValues(sql);\n\t\tconst insertedRows: Record<string, unknown>[] = [];\n\n\t\t// When values appear as a VALUES (...) list, evaluate each tuple. When the\n\t\t// caller omits VALUES (e.g. INSERT INTO ... SELECT ...) we fall back to\n\t\t// the binding-order behavior used by older versions of the emulator.\n\t\tconst tuples = valuesSegments.length > 0 ? valuesSegments : [null];\n\t\tlet bindingCursor = 0;\n\n\t\tfor (const tuple of tuples) {\n\t\t\tconst record: Record<string, unknown> = {};\n\n\t\t\tif (explicitColumns && explicitColumns.length > 0) {\n\t\t\t\tconst tupleExpressions = tuple ? splitTopLevel(tuple, ',').map((expression) => expression.trim()) : explicitColumns.map(() => '?');\n\n\t\t\t\texplicitColumns.forEach((columnName, index) => {\n\t\t\t\t\tconst expr = tupleExpressions[index];\n\t\t\t\t\tif (expr === undefined) return;\n\t\t\t\t\tif (expr === '?') {\n\t\t\t\t\t\trecord[columnName] = bindings[bindingCursor++];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst literal = parseLiteral(expr);\n\t\t\t\t\t\trecord[columnName] = literal.consumed ? literal.value : expr;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else if (schema) {\n\t\t\t\t// Without an explicit column list, fall back to schema order — the\n\t\t\t\t// historical default. Bindings are consumed in declaration order.\n\t\t\t\tfor (const column of schema.keys()) {\n\t\t\t\t\tif (bindingCursor < bindings.length) {\n\t\t\t\t\t\trecord[column] = bindings[bindingCursor++];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor (const value of bindings.slice(bindingCursor)) {\n\t\t\t\t\trecord[Object.keys(record).length === 0 ? 'id' : `column_${Object.keys(record).length}`] = value;\n\t\t\t\t\tbindingCursor++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Apply column defaults for omitted columns.\n\t\t\tif (schema) {\n\t\t\t\tfor (const column of schema.values()) {\n\t\t\t\t\tif (record[column.name] === undefined && column.defaultValue !== undefined) {\n\t\t\t\t\t\trecord[column.name] = column.defaultValue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst primaryKeyColumn = primaryKeyInfo?.name ?? 'id';\n\t\t\tlet primaryKeyValue = record[primaryKeyColumn];\n\n\t\t\tif ((primaryKeyValue === undefined || primaryKeyValue === null || primaryKeyValue === '') && autoIncrementInfo) {\n\t\t\t\tconst nextValue = (this.autoIncrementCounters.get(tableName) ?? 0) + 1;\n\t\t\t\tthis.autoIncrementCounters.set(tableName, nextValue);\n\t\t\t\trecord[autoIncrementInfo.name] = nextValue;\n\t\t\t\tif (primaryKeyColumn !== autoIncrementInfo.name) {\n\t\t\t\t\trecord[primaryKeyColumn] = nextValue;\n\t\t\t\t}\n\t\t\t\tprimaryKeyValue = nextValue;\n\t\t\t}\n\n\t\t\tif (primaryKeyValue === undefined || primaryKeyValue === null || primaryKeyValue === '') {\n\t\t\t\t// No primary key declared. Fall back to synthesized rowids so\n\t\t\t\t// downstream operations still find the inserted row.\n\t\t\t\tconst nextValue = (this.autoIncrementCounters.get(tableName) ?? 0) + 1;\n\t\t\t\tthis.autoIncrementCounters.set(tableName, nextValue);\n\t\t\t\tprimaryKeyValue = nextValue;\n\t\t\t\trecord[primaryKeyColumn] = nextValue;\n\t\t\t}\n\n\t\t\tif (autoIncrementInfo) {\n\t\t\t\tconst numericPrimaryKey = typeof primaryKeyValue === 'number' ? primaryKeyValue : Number(primaryKeyValue);\n\t\t\t\tif (Number.isFinite(numericPrimaryKey)) {\n\t\t\t\t\tthis.autoIncrementCounters.set(tableName, Math.max(this.autoIncrementCounters.get(tableName) ?? 0, numericPrimaryKey));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst key = String(primaryKeyValue);\n\t\t\tconst existed = table.has(key);\n\n\t\t\tif (existed && !isOrReplace) {\n\t\t\t\tif (isOrIgnore) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\tresults: [],\n\t\t\t\t\tmeta: { duration: Date.now() - startTime },\n\t\t\t\t\terror: `UNIQUE constraint failed: ${tableName}.${primaryKeyColumn}`\n\t\t\t\t};\n\t\t\t}\n\n\t\t\ttable.set(key, record);\n\t\t\tthis.lastInsertRowId =\n\t\t\t\ttypeof primaryKeyValue === 'number' || typeof primaryKeyValue === 'string' ? primaryKeyValue : String(primaryKeyValue);\n\t\t\tinsertedRows.push(record);\n\t\t}\n\n\t\tconst hasReturning = /\\breturning\\b/i.test(sql);\n\t\tconst returningColumns = hasReturning ? extractReturningColumns(sql) : null;\n\t\tconst results = hasReturning ? insertedRows.map((row) => projectReturningRow(row, returningColumns ?? ['*'])) : [];\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults,\n\t\t\tmeta: {\n\t\t\t\tduration: Date.now() - startTime,\n\t\t\t\tlast_row_id: this.lastInsertRowId ?? undefined,\n\t\t\t\tchanges: insertedRows.length\n\t\t\t}\n\t\t};\n\t}\n\n\tprivate async handleUpdate(sql: string, bindings: any[]): Promise<QueryResult> {\n\t\tconst startTime = Date.now();\n\t\tconst tableName = extractTableName(sql);\n\n\t\tif (!tableName) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tresults: [],\n\t\t\t\tmeta: { duration: Date.now() - startTime },\n\t\t\t\terror: 'Could not extract table name'\n\t\t\t};\n\t\t}\n\n\t\tif (!this.tables.has(tableName)) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tresults: [],\n\t\t\t\tmeta: { duration: Date.now() - startTime },\n\t\t\t\terror: `Table ${tableName} not found`\n\t\t\t};\n\t\t}\n\n\t\tconst setBody = extractSetBody(sql);\n\t\tif (!setBody) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tresults: [],\n\t\t\t\tmeta: { duration: Date.now() - startTime },\n\t\t\t\terror: 'UPDATE missing SET clause'\n\t\t\t};\n\t\t}\n\n\t\tconst assignments = parseSetAssignments(setBody);\n\n\t\tconst table = this.tables.get(tableName)!;\n\t\tconst records = Array.from(table.values());\n\n\t\t// Bindings are consumed first by the SET expressions (in order), then by\n\t\t// the WHERE expression. Aggregate this layout once so we can re-evaluate\n\t\t// WHERE per row without altering the binding cursor for later iterations.\n\t\tconst setPlaceholderCount = countQuestionPlaceholders(setBody);\n\t\tconst whereBindings = bindings.slice(setPlaceholderCount);\n\t\tconst setBindings = bindings.slice(0, setPlaceholderCount);\n\n\t\tconst { whereClause } = extractWhereSegment(sql);\n\t\tconst whereNode = whereClause ? new WhereParser(tokenizeWhere(whereClause)).parse() : ({ type: 'always-true' } as WhereNode);\n\n\t\tconst matched: Record<string, unknown>[] = [];\n\t\tfor (const record of records) {\n\t\t\tconst cursor = { value: 0 };\n\t\t\tif (evaluateWhere(whereNode, record, whereBindings, cursor)) {\n\t\t\t\tmatched.push(record);\n\t\t\t}\n\t\t}\n\n\t\tlet changes = 0;\n\t\tfor (const record of matched) {\n\t\t\tconst cursor = { value: 0 };\n\t\t\tfor (const { column, expression } of assignments) {\n\t\t\t\tconst placeholderCount = countQuestionPlaceholders(expression);\n\t\t\t\tconst slice = setBindings.slice(cursor.value, cursor.value + placeholderCount);\n\t\t\t\tcursor.value += placeholderCount;\n\t\t\t\trecord[column] = computeAssignmentValue(expression, slice, record);\n\t\t\t}\n\t\t\tchanges++;\n\t\t}\n\n\t\tconst hasReturning = /\\breturning\\b/i.test(sql);\n\t\tconst returningColumns = hasReturning ? extractReturningColumns(sql) : null;\n\t\tconst results = hasReturning ? matched.map((row) => projectReturningRow(row, returningColumns ?? ['*'])) : [];\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults,\n\t\t\tmeta: { duration: Date.now() - startTime, changes }\n\t\t};\n\t}\n\n\tprivate async handleDelete(sql: string, bindings: any[]): Promise<QueryResult> {\n\t\tconst startTime = Date.now();\n\t\tconst tableName = extractTableName(sql);\n\n\t\tif (!tableName) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tresults: [],\n\t\t\t\tmeta: { duration: Date.now() - startTime },\n\t\t\t\terror: 'Could not extract table name'\n\t\t\t};\n\t\t}\n\n\t\tif (!this.tables.has(tableName)) {\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tresults: [],\n\t\t\t\tmeta: { duration: Date.now() - startTime, changes: 0 }\n\t\t\t};\n\t\t}\n\n\t\tconst table = this.tables.get(tableName)!;\n\n\t\tconst { whereClause } = extractWhereSegment(sql);\n\t\tif (!whereClause) {\n\t\t\tconst removed = table.size;\n\t\t\ttable.clear();\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tresults: [],\n\t\t\t\tmeta: { duration: Date.now() - startTime, changes: removed }\n\t\t\t};\n\t\t}\n\n\t\tconst whereNode = new WhereParser(tokenizeWhere(whereClause)).parse();\n\t\tconst removedRows: Record<string, unknown>[] = [];\n\t\tfor (const [key, record] of Array.from(table.entries())) {\n\t\t\tconst cursor = { value: 0 };\n\t\t\tif (evaluateWhere(whereNode, record, bindings, cursor)) {\n\t\t\t\ttable.delete(key);\n\t\t\t\tremovedRows.push(record);\n\t\t\t}\n\t\t}\n\n\t\tconst hasReturning = /\\breturning\\b/i.test(sql);\n\t\tconst returningColumns = hasReturning ? extractReturningColumns(sql) : null;\n\t\tconst results = hasReturning ? removedRows.map((row) => projectReturningRow(row, returningColumns ?? ['*'])) : [];\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults,\n\t\t\tmeta: { duration: Date.now() - startTime, changes: removedRows.length }\n\t\t};\n\t}\n\n\tprivate async handleSelect(sql: string, bindings: any[]): Promise<QueryResult> {\n\t\tconst startTime = Date.now();\n\t\tconst tableName = extractTableName(sql);\n\n\t\tif (!tableName) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tresults: [],\n\t\t\t\tmeta: { duration: Date.now() - startTime },\n\t\t\t\terror: 'Could not extract table name'\n\t\t\t};\n\t\t}\n\n\t\tif (!this.tables.has(tableName)) {\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tresults: [],\n\t\t\t\tmeta: { duration: Date.now() - startTime }\n\t\t\t};\n\t\t}\n\n\t\tconst table = this.tables.get(tableName)!;\n\t\tconst allRows = Array.from(table.values());\n\n\t\t// Filter\n\t\tconst { whereClause, afterWhere } = extractWhereSegment(sql);\n\t\tconst whereNode = whereClause ? new WhereParser(tokenizeWhere(whereClause)).parse() : ({ type: 'always-true' } as WhereNode);\n\t\tconst selectBody = extractSelectBody(sql);\n\t\tconst selectColumns = parseSelectColumns(selectBody);\n\n\t\t// Bindings are split between SELECT projection (uncommon), WHERE, and\n\t\t// LIMIT/OFFSET. The current emulator does not support placeholders in\n\t\t// SELECT or LIMIT/OFFSET, so every binding feeds the WHERE evaluator.\n\t\tconst filtered: Record<string, unknown>[] = [];\n\t\tfor (const row of allRows) {\n\t\t\tconst cursor = { value: 0 };\n\t\t\tif (evaluateWhere(whereNode, row, bindings, cursor)) {\n\t\t\t\tfiltered.push(row);\n\t\t\t}\n\t\t}\n\n\t\t// ORDER BY\n\t\tconst orderBy = extractOrderBy(afterWhere || sql);\n\t\tlet orderedRows = filtered;\n\t\tif (orderBy) {\n\t\t\torderedRows = [...filtered].sort((left, right) => compareRowsByOrder(left, right, orderBy));\n\t\t}\n\n\t\tconst isAggregateSelect = selectColumns.some((col) => col.kind === 'aggregate');\n\t\tlet projectedRows: Record<string, unknown>[];\n\t\tif (isAggregateSelect) {\n\t\t\tconst aggregateRow: Record<string, unknown> = {};\n\t\t\tfor (const column of selectColumns) {\n\t\t\t\taggregateRow[column.alias] = evaluateSelectColumn(column, orderedRows, bindings, 0);\n\t\t\t}\n\t\t\tprojectedRows = [aggregateRow];\n\t\t} else if (selectColumns.length === 1 && selectColumns[0]?.kind === 'star') {\n\t\t\tprojectedRows = orderedRows.map((row) => ({ ...row }));\n\t\t} else {\n\t\t\tprojectedRows = orderedRows.map((row) => {\n\t\t\t\tconst projected: Record<string, unknown> = {};\n\t\t\t\tfor (const column of selectColumns) {\n\t\t\t\t\tif (column.kind === 'star') {\n\t\t\t\t\t\tObject.assign(projected, row);\n\t\t\t\t\t} else if (column.kind === 'column') {\n\t\t\t\t\t\tprojected[column.alias] = row[column.expression] ?? null;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tprojected[column.alias] = evaluateSelectColumn(column, [row], bindings, 0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn projected;\n\t\t\t});\n\t\t}\n\n\t\tconst { limit, offset } = extractLimitOffset(afterWhere);\n\t\tconst startIndex = offset ?? 0;\n\t\tconst endIndex = limit === undefined ? projectedRows.length : startIndex + limit;\n\t\tconst paginatedRows = projectedRows.slice(startIndex, endIndex);\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults: paginatedRows,\n\t\t\tmeta: { duration: Date.now() - startTime }\n\t\t};\n\t}\n\n\tprivate async handleSqliteMasterSelect(sql: string, bindings: any[]): Promise<QueryResult> {\n\t\tconst startTime = Date.now();\n\t\tconst rows: Record<string, unknown>[] = [];\n\t\tfor (const tableName of this.tables.keys()) {\n\t\t\trows.push({ name: tableName, type: 'table', tbl_name: tableName, sql: `CREATE TABLE ${tableName} (...)` });\n\t\t}\n\n\t\tconst { whereClause, afterWhere } = extractWhereSegment(sql);\n\t\tconst whereNode = whereClause ? new WhereParser(tokenizeWhere(whereClause)).parse() : ({ type: 'always-true' } as WhereNode);\n\n\t\tconst filtered = rows.filter((row) => {\n\t\t\tconst cursor = { value: 0 };\n\t\t\treturn evaluateWhere(whereNode, row, bindings, cursor);\n\t\t});\n\n\t\tconst selectBody = extractSelectBody(sql);\n\t\tconst projection = parseSelectColumns(selectBody);\n\t\tconst projected = filtered.map((row) => {\n\t\t\tif (projection.length === 1 && projection[0]?.kind === 'star') return { ...row };\n\t\t\tconst out: Record<string, unknown> = {};\n\t\t\tfor (const column of projection) {\n\t\t\t\tif (column.kind === 'star') {\n\t\t\t\t\tObject.assign(out, row);\n\t\t\t\t} else if (column.kind === 'column') {\n\t\t\t\t\tout[column.alias] = row[column.expression] ?? null;\n\t\t\t\t} else {\n\t\t\t\t\tout[column.alias] = evaluateSelectColumn(column, [row], bindings, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn out;\n\t\t});\n\n\t\tconst { limit, offset } = extractLimitOffset(afterWhere);\n\t\tconst start = offset ?? 0;\n\t\tconst end = limit === undefined ? projected.length : start + limit;\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults: projected.slice(start, end),\n\t\t\tmeta: { duration: Date.now() - startTime }\n\t\t};\n\t}\n\n\tprivate async handlePragma(sql: string): Promise<QueryResult> {\n\t\tconst startTime = Date.now();\n\t\tconst lower = sql.trim().toLowerCase();\n\n\t\tif (lower.startsWith('pragma page_count')) {\n\t\t\t// Approximate \"page count\" using a stable hash of the total row count\n\t\t\t// so size-based shard allocation still has a meaningful signal.\n\t\t\tlet totalRows = 0;\n\t\t\tfor (const table of this.tables.values()) {\n\t\t\t\ttotalRows += table.size;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tresults: [{ page_count: Math.max(1, totalRows) }],\n\t\t\t\tmeta: { duration: Date.now() - startTime }\n\t\t\t};\n\t\t}\n\n\t\tif (lower.startsWith('pragma page_size')) {\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tresults: [{ page_size: 4096 }],\n\t\t\t\tmeta: { duration: Date.now() - startTime }\n\t\t\t};\n\t\t}\n\n\t\tif (lower.startsWith('pragma table_info')) {\n\t\t\tconst match = lower.match(/pragma\\s+table_info\\s*\\(\\s*([`\"\\[]?[\\w.]+[`\"\\]]?)\\s*\\)/);\n\t\t\tif (match) {\n\t\t\t\tconst tableName = normalizeSqlIdentifier(match[1] ?? '');\n\t\t\t\tconst schema = this.schemas.get(tableName);\n\t\t\t\tif (schema) {\n\t\t\t\t\tconst rows = Array.from(schema.values()).map((column, index) => ({\n\t\t\t\t\t\tcid: index,\n\t\t\t\t\t\tname: column.name,\n\t\t\t\t\t\ttype: column.type,\n\t\t\t\t\t\tnotnull: column.notNull ? 1 : 0,\n\t\t\t\t\t\tdflt_value: column.defaultValue ?? null,\n\t\t\t\t\t\tpk: column.isPrimaryKey ? 1 : 0\n\t\t\t\t\t}));\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\tresults: rows,\n\t\t\t\t\t\tmeta: { duration: Date.now() - startTime }\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults: [],\n\t\t\tmeta: { duration: Date.now() - startTime }\n\t\t};\n\t}\n}\n\n/**\n * Helper used by `UPDATE ... SET col = <expr>` to compute the assigned value\n * for each row. Pure column references and the special form `col = col + 1`\n * are evaluated against the live row so updates can reference their previous\n * column values.\n * @private\n */\nfunction computeAssignmentValue(expression: string, slice: unknown[], row: Record<string, unknown>): unknown {\n\tif (expression === '?') {\n\t\treturn slice[0];\n\t}\n\n\tconst substituted = substituteBindings(expression, slice, 0).expression;\n\treturn evaluateScalarExpression(substituted, row);\n}\n\n/**\n * Returns the body of a SELECT projection — the substring between `SELECT`\n * (or a leading distinct/all keyword) and the matching `FROM`.\n * @private\n */\nfunction extractSelectBody(sql: string): string {\n\tconst upper = sql.toUpperCase();\n\tconst selectIdx = findKeyword(upper, sql, 'SELECT');\n\tif (selectIdx === -1) return '*';\n\tconst fromIdx = findKeyword(upper, sql, 'FROM', selectIdx + 'SELECT'.length);\n\tif (fromIdx === -1) return sql.slice(selectIdx + 'SELECT'.length).trim();\n\treturn sql\n\t\t.slice(selectIdx + 'SELECT'.length, fromIdx)\n\t\t.trim()\n\t\t.replace(/^distinct\\s+/i, '');\n}\n\n/**\n * Returns the body of a `SET` clause from an UPDATE statement.\n * @private\n */\nfunction extractSetBody(sql: string): string | null {\n\tconst upper = sql.toUpperCase();\n\tconst setIdx = findKeyword(upper, sql, 'SET');\n\tif (setIdx === -1) return null;\n\n\tconst startOfSet = setIdx + 'SET'.length;\n\tconst terminators = ['WHERE', 'RETURNING', 'ORDER BY', 'LIMIT'];\n\tlet endIdx = sql.length;\n\tfor (const terminator of terminators) {\n\t\tconst idx = findKeyword(upper, sql, terminator, startOfSet);\n\t\tif (idx !== -1 && idx < endIdx) {\n\t\t\tendIdx = idx;\n\t\t}\n\t}\n\treturn sql.slice(startOfSet, endIdx).trim();\n}\n\n/**\n * Returns the body of an ORDER BY clause.\n * @private\n */\ninterface OrderByClause {\n\tcolumn: string;\n\tdirection: 'asc' | 'desc';\n}\n\nfunction extractOrderBy(sql: string): OrderByClause | null {\n\tconst upper = sql.toUpperCase();\n\tconst orderIdx = findKeyword(upper, sql, 'ORDER BY');\n\tif (orderIdx === -1) return null;\n\n\tconst tail = sql.slice(orderIdx + 'ORDER BY'.length).trim();\n\tconst match = tail.match(/^([`\"\\[]?[\\w.]+[`\"\\]]?)(?:\\s+(asc|desc))?/i);\n\tif (!match) return null;\n\treturn {\n\t\tcolumn: normalizeSqlIdentifier(match[1] ?? ''),\n\t\tdirection: (match[2] ?? 'asc').toLowerCase() === 'desc' ? 'desc' : 'asc'\n\t};\n}\n\nfunction compareRowsByOrder(left: Record<string, unknown>, right: Record<string, unknown>, order: OrderByClause): number {\n\tconst leftValue = left[order.column];\n\tconst rightValue = right[order.column];\n\tif (leftValue === rightValue) return 0;\n\tif (leftValue === undefined || leftValue === null) {\n\t\treturn order.direction === 'desc' ? 1 : -1;\n\t}\n\tif (rightValue === undefined || rightValue === null) {\n\t\treturn order.direction === 'desc' ? -1 : 1;\n\t}\n\tconst leftNumber = toFiniteNumber(leftValue);\n\tconst rightNumber = toFiniteNumber(rightValue);\n\tlet comparison: number;\n\tif (leftNumber !== undefined && rightNumber !== undefined) {\n\t\tcomparison = leftNumber === rightNumber ? 0 : leftNumber < rightNumber ? -1 : 1;\n\t} else {\n\t\tcomparison = String(leftValue).localeCompare(String(rightValue));\n\t}\n\treturn order.direction === 'desc' ? -comparison : comparison;\n}\n\n/**\n * Extracts each `VALUES (...)` tuple body from an INSERT statement.\n * @private\n */\nfunction extractInsertValues(sql: string): string[] {\n\tconst upper = sql.toUpperCase();\n\tconst valuesIdx = findKeyword(upper, sql, 'VALUES');\n\tif (valuesIdx === -1) return [];\n\n\tconst tuples: string[] = [];\n\tlet i = valuesIdx + 'VALUES'.length;\n\twhile (i < sql.length) {\n\t\twhile (i < sql.length && /[\\s,]/.test(sql[i]!)) i++;\n\t\tif (sql[i] !== '(') break;\n\t\tconst close = findMatchingParen(sql, i);\n\t\tif (close === -1) break;\n\t\ttuples.push(sql.slice(i + 1, close).trim());\n\t\ti = close + 1;\n\t}\n\treturn tuples;\n}\n\n/**\n * Extracts the explicit column list from an INSERT statement, when present.\n * Distinguishes between `INSERT INTO t (a, b) VALUES (?, ?)` (column list) and\n * `INSERT INTO t VALUES (?, ?)` (no column list — first parenthesized group is\n * the VALUES tuple) by checking that the matched paren group appears before\n * any `VALUES` / `SELECT` keyword.\n * @private\n */\nfunction extractInsertColumns(sql: string): string[] | null {\n\tconst match = sql.match(/insert\\s+(?:or\\s+\\w+\\s+)?into\\s+[^()]+\\(([^)]+)\\)/i);\n\tif (!match || !match[1] || match.index === undefined) return null;\n\n\tconst beforeMatch = sql.slice(0, match.index + match[0].length);\n\tconst upper = beforeMatch.toUpperCase();\n\tif (upper.includes('VALUES') || upper.includes('SELECT')) {\n\t\t// The parenthesized group falls inside (or after) the VALUES clause,\n\t\t// not before it — that means the statement omits the column list.\n\t\treturn null;\n\t}\n\n\treturn match[1]\n\t\t.split(',')\n\t\t.map((column) => normalizeSqlIdentifier(column))\n\t\t.filter((column) => column.length > 0);\n}\n\n/**\n * Pulls the column list out of a RETURNING clause, if any.\n * @private\n */\nfunction extractReturningColumns(sql: string): string[] | null {\n\tconst match = sql.match(/\\breturning\\b\\s+([^;]+)/i);\n\tif (!match || !match[1]) return null;\n\treturn splitTopLevel(match[1], ',').map((entry) => entry.trim());\n}\n\nfunction projectReturningRow(row: Record<string, unknown>, columns: string[]): Record<string, unknown> {\n\tif (columns.length === 1 && columns[0] === '*') {\n\t\treturn { ...row };\n\t}\n\tconst projection = parseSelectColumns(columns.join(', '));\n\tconst output: Record<string, unknown> = {};\n\tfor (const column of projection) {\n\t\tif (column.kind === 'star') {\n\t\t\tObject.assign(output, row);\n\t\t} else if (column.kind === 'column') {\n\t\t\toutput[column.alias] = row[column.expression] ?? null;\n\t\t} else {\n\t\t\toutput[column.alias] = evaluateSelectColumn(column, [row], [], 0);\n\t\t}\n\t}\n\treturn output;\n}\n\n/**\n * Recognizes `DEFAULT <literal>` modifiers in column definitions and\n * normalizes the literal value.\n * @private\n */\nfunction extractDefaultValue(modifiers: string): unknown {\n\tconst match = modifiers.match(/default\\s+('([^']*)'|\"([^\"]*)\"|[\\w.-]+)/i);\n\tif (!match) return undefined;\n\tconst raw = match[1] ?? '';\n\tconst literal = parseLiteral(raw);\n\treturn literal.consumed ? literal.value : raw;\n}\n\n/**\n * Prepared statement wrapper that delegates execution back to the in-memory\n * database. The wrapper picks the right method on the underlying database\n * based on the statement kind, so callers can use the same `.run()` /\n * `.first()` / `.all()` API regardless of the SQL kind.\n * @private\n */\nclass InMemoryPreparedStatement implements PreparedStatement {\n\tprivate bindings: any[] = [];\n\n\tconstructor(\n\t\tprivate database: InMemorySQLDatabase,\n\t\tprivate sql: string\n\t) {}\n\n\tbind(...bindings: any[]): PreparedStatement {\n\t\tthis.bindings = bindings;\n\t\treturn this;\n\t}\n\n\tasync run<T = Record<string, unknown>>(): Promise<QueryResult<T>> {\n\t\treturn (await this.database.executeStatement(this.sql, this.bindings)) as QueryResult<T>;\n\t}\n\n\tasync all<T = Record<string, unknown>>(): Promise<QueryResult<T>> {\n\t\t// For non-SELECT statements `executeQuery` previously returned a failed\n\t\t// result. Route through `executeStatement` so RETURNING rows are still\n\t\t// surfaced via `.all()`.\n\t\treturn (await this.database.executeStatement(this.sql, this.bindings)) as QueryResult<T>;\n\t}\n\n\tasync first<T = Record<string, unknown>>(): Promise<T | null> {\n\t\tconst result = await this.database.executeStatement(this.sql, this.bindings);\n\t\treturn (result.results[0] as T) ?? null;\n\t}\n}\n\n/**\n * In-memory implementation of {@link KVStorage}.\n *\n * Implements every method on the contract plus a few NuxtHub-flavored aliases\n * (`set`, `del`, `keys`, `getItem`, `setItem`, `removeItem`, `getKeys`) so the\n * same instance can be wrapped by `createNuxtHubKVProvider` without any\n * additional adapter glue.\n */\nexport class InMemoryKVStorage implements KVStorage {\n\tprivate store = new Map<string, string>();\n\tprivate expirations = new Map<string, number>();\n\n\t/**\n\t * Removes any keys whose TTL has expired. Cheap to call as part of read\n\t * paths because the store stays small in test workloads.\n\t * @private\n\t */\n\tprivate pruneExpired(): void {\n\t\tif (this.expirations.size === 0) return;\n\t\tconst now = Date.now();\n\t\tfor (const [key, expiresAt] of this.expirations) {\n\t\t\tif (expiresAt < now) {\n\t\t\t\tthis.store.delete(key);\n\t\t\t\tthis.expirations.delete(key);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate normalizeValue(value: unknown): string {\n\t\treturn typeof value === 'string' ? value : (JSON.stringify(value) ?? String(value));\n\t}\n\n\tasync get<T = unknown>(key: string, type: 'json'): Promise<T | null>;\n\tasync get(key: string, type?: 'text'): Promise<string | null>;\n\tasync get<T = unknown>(key: string, type: 'text' | 'json' = 'text'): Promise<any> {\n\t\tconst expiration = this.expirations.get(key);\n\t\tif (expiration !== undefined && expiration < Date.now()) {\n\t\t\tthis.store.delete(key);\n\t\t\tthis.expirations.delete(key);\n\t\t\treturn null;\n\t\t}\n\n\t\tconst value = this.store.get(key);\n\t\tif (value === undefined) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (type === 'json') {\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(value) as T;\n\t\t\t} catch (error) {\n\t\t\t\tthrow new CollegeDBError(\n\t\t\t\t\t`Failed to parse JSON from KV for key ${key}: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t'KV_JSON_PARSE_FAILED'\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t}\n\n\tasync put(key: string, value: string, options?: { expirationTtl?: number }): Promise<void> {\n\t\tthis.store.set(key, value);\n\t\tif (options?.expirationTtl) {\n\t\t\tthis.expirations.set(key, Date.now() + options.expirationTtl * 1000);\n\t\t} else {\n\t\t\tthis.expirations.delete(key);\n\t\t}\n\t}\n\n\tasync set(key: string, value: unknown, options?: { ttl?: number }): Promise<void> {\n\t\tthis.store.set(key, this.normalizeValue(value));\n\t\tif (options?.ttl) {\n\t\t\tthis.expirations.set(key, Date.now() + options.ttl * 1000);\n\t\t} else {\n\t\t\tthis.expirations.delete(key);\n\t\t}\n\t}\n\n\tasync del(key: string): Promise<void> {\n\t\tawait this.delete(key);\n\t}\n\n\tasync keys(prefix: string = ''): Promise<string[]> {\n\t\tconst listed = await this.list({ prefix });\n\t\treturn listed.keys.map((key) => key.name);\n\t}\n\n\tasync getItem<T = unknown>(key: string): Promise<T | null> {\n\t\tconst value = await this.get(key, 'text');\n\t\treturn (value as T | null) ?? null;\n\t}\n\n\tasync setItem(key: string, value: unknown): Promise<void> {\n\t\tawait this.set(key, value);\n\t}\n\n\tasync removeItem(key: string): Promise<void> {\n\t\tawait this.delete(key);\n\t}\n\n\tasync getKeys(prefix: string = ''): Promise<string[]> {\n\t\treturn await this.keys(prefix);\n\t}\n\n\tasync delete(key: string): Promise<void> {\n\t\tthis.store.delete(key);\n\t\tthis.expirations.delete(key);\n\t}\n\n\tasync list(options?: { prefix?: string; cursor?: string; limit?: number }): Promise<KVListResult> {\n\t\tthis.pruneExpired();\n\n\t\tconst prefix = options?.prefix ?? '';\n\t\tconst limit = options?.limit ?? 1000;\n\t\tconst parsedCursor = options?.cursor ? Number.parseInt(options.cursor, 10) : 0;\n\t\tconst cursor = Number.isFinite(parsedCursor) && parsedCursor >= 0 ? parsedCursor : 0;\n\n\t\tconst allKeys: string[] = [];\n\t\tfor (const key of this.store.keys()) {\n\t\t\tif (key.startsWith(prefix)) {\n\t\t\t\tallKeys.push(key);\n\t\t\t}\n\t\t}\n\n\t\tconst slice = allKeys.slice(cursor, cursor + limit).map((name) => ({ name }));\n\t\tconst nextCursor = cursor + limit;\n\t\tconst listComplete = nextCursor >= allKeys.length;\n\n\t\treturn {\n\t\t\tkeys: slice,\n\t\t\tcursor: listComplete ? undefined : String(nextCursor),\n\t\t\tlist_complete: listComplete\n\t\t};\n\t}\n\n\t/**\n\t * Drops every entry from the store. Test utility only — production\n\t * implementations should not expose this affordance.\n\t */\n\tclear(): void {\n\t\tthis.store.clear();\n\t\tthis.expirations.clear();\n\t}\n\n\t/**\n\t * Returns the number of non-expired entries currently in the store. Useful\n\t * for asserting on cleanup behavior in tests.\n\t */\n\tsize(): number {\n\t\tthis.pruneExpired();\n\t\treturn this.store.size;\n\t}\n}\n\n/**\n * Factory function to create an in-memory SQL database provider.\n *\n * @returns InMemorySQLDatabase instance\n *\n * @example\n * ```typescript\n * import { createInMemorySQLProvider } from '@earth-app/collegedb';\n *\n * const db = createInMemorySQLProvider();\n * initialize({\n * kv: new InMemoryKVStorage(),\n * shards: {\n * 'shard-1': db,\n * 'shard-2': db\n * }\n * });\n * ```\n */\nexport function createInMemorySQLProvider(): InMemorySQLDatabase {\n\treturn new InMemorySQLDatabase();\n}\n\n/**\n * Factory function to create an in-memory KV storage provider.\n *\n * @returns InMemoryKVStorage instance\n *\n * @example\n * ```typescript\n * import { createInMemoryKVProvider } from '@earth-app/collegedb';\n *\n * const kv = createInMemoryKVProvider();\n * initialize({\n * kv,\n * shards: { /* ... *\\/ }\n * });\n * ```\n */\nexport function createInMemoryKVProvider(): InMemoryKVStorage {\n\treturn new InMemoryKVStorage();\n}\n"
|
|
12
|
+
"/**\n * @fileoverview In-memory mock providers for testing and development.\n *\n * Zero-dependency, lightweight implementations of the {@link KVStorage} and\n * {@link SQLDatabase} contracts. Intended for unit tests, integration tests,\n * local development, and sandboxed routing experiments. The SQL implementation\n * emulates a useful subset of SQLite syntax — enough to drive CollegeDB's\n * router and most ORM-generated CRUD statements without spinning up a real\n * database.\n *\n * The SQL emulator supports:\n *\n * - `CREATE TABLE [IF NOT EXISTS]` with simple column definitions and inline\n * PRIMARY KEY / AUTOINCREMENT / DEFAULT clauses\n * - `INSERT [OR REPLACE|IGNORE|...] INTO` with explicit column lists and\n * `RETURNING` rows\n * - `UPDATE ... SET col = ?, col = expr WHERE ...` with compound WHERE\n * (AND, OR, parens, =, !=, <, >, <=, >=, LIKE, IS NULL, IS NOT NULL)\n * - `DELETE FROM ... WHERE ...` with the same compound WHERE support\n * - `SELECT` projections including `*`, plain columns, aggregate calls\n * (`COUNT(*)`, `COUNT(col)`, `MAX`, `MIN`, `SUM`, `AVG`), `COALESCE`,\n * simple arithmetic on aggregate expressions, `AS` aliases, `ORDER BY`,\n * `LIMIT`, and `OFFSET`\n * - Common metadata queries (`PRAGMA page_count`, `PRAGMA page_size`,\n * `PRAGMA table_info`, `SELECT ... FROM sqlite_master`)\n *\n * The emulator deliberately does not implement transactions, indexes,\n * triggers, full SQL expression evaluation, or cross-table joins. Production\n * workloads should always run against real D1/Postgres/MySQL/SQLite shards\n * via the adapters in `providers.ts`.\n *\n * @author CollegeDB Team\n * @since 1.2.0\n */\n\nimport { CollegeDBError } from './errors';\nimport type { KVListResult, KVStorage, PreparedStatement, QueryResult, SQLDatabase } from './types';\n\n/**\n * Column metadata captured when a CREATE TABLE statement is parsed.\n * @private\n */\ninterface ColumnInfo {\n\tname: string;\n\ttype: string;\n\tisPrimaryKey: boolean;\n\tisAutoIncrement: boolean;\n\tdefaultValue?: unknown;\n\tnotNull?: boolean;\n}\n\n/**\n * Drizzle-style query payloads passed to {@link InMemorySQLDatabase}.\n * @private\n */\ntype InMemoryDrizzleQuery = {\n\ttoQuery?: (config: Record<string, unknown>) => { sql?: string; params?: unknown[] };\n\tsql?: string;\n\tparams?: unknown[];\n\ttext?: string;\n};\n\n/**\n * Format config requested by `drizzle-orm` when building parameterized SQL.\n * Used purely to coax Drizzle into emitting `?` placeholders.\n * @private\n */\nconst IN_MEMORY_DRIZZLE_QUERY_CONFIG = {\n\tcasing: {\n\t\tgetColumnCasing(column: { name?: string }): string {\n\t\t\treturn column?.name ?? '';\n\t\t}\n\t},\n\tescapeName(name: string): string {\n\t\treturn name;\n\t},\n\tescapeParam(): string {\n\t\treturn '?';\n\t},\n\tescapeString(str: string): string {\n\t\treturn str.replace(/'/g, \"''\");\n\t}\n} as const;\n\nconst COMPARISON_OPERATORS = ['<=', '>=', '!=', '<>', '=', '<', '>'] as const;\ntype ComparisonOperator = (typeof COMPARISON_OPERATORS)[number];\n\nconst AGGREGATE_FUNCTIONS = new Set(['COUNT', 'MAX', 'MIN', 'SUM', 'AVG']);\nconst SUPPORTED_SCALARS = new Set(['COALESCE', 'IFNULL', 'LOWER', 'UPPER', 'LENGTH', 'ABS']);\n\n/**\n * Strips back-ticks, double quotes, square brackets, and schema prefixes from an SQL identifier.\n * @private\n */\nfunction normalizeSqlIdentifier(identifier: string): string {\n\treturn (\n\t\tidentifier\n\t\t\t.trim()\n\t\t\t.replace(/^[`\"\\[]+|[`\"\\]]+$/g, '')\n\t\t\t.split('.')\n\t\t\t.pop()\n\t\t\t?.trim() ?? identifier.trim()\n\t);\n}\n\n/**\n * Escapes a literal value before injection into a `RegExp` constructor.\n * @private\n */\nfunction escapeRegExp(value: string): string {\n\treturn value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Tries to coerce a value to a finite number.\n * @private\n */\nfunction toFiniteNumber(value: unknown): number | undefined {\n\tif (typeof value === 'number' && Number.isFinite(value)) {\n\t\treturn value;\n\t}\n\tif (typeof value === 'bigint') {\n\t\treturn Number(value);\n\t}\n\tif (typeof value === 'string') {\n\t\tconst trimmed = value.trim();\n\t\tif (trimmed === '') {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst parsed = Number(trimmed);\n\t\treturn Number.isFinite(parsed) ? parsed : undefined;\n\t}\n\treturn undefined;\n}\n\n/**\n * Splits a comma-separated SQL fragment while respecting parenthesis depth.\n * Used to break apart SELECT column lists and SET assignments without\n * tripping over function calls like `COALESCE(a, 0)`.\n * @private\n */\nfunction splitTopLevel(fragment: string, separator: string = ','): string[] {\n\tconst parts: string[] = [];\n\tlet depth = 0;\n\tlet buffer = '';\n\tlet inSingleQuote = false;\n\tlet inDoubleQuote = false;\n\n\tfor (let i = 0; i < fragment.length; i++) {\n\t\tconst char = fragment[i]!;\n\n\t\tif (char === \"'\" && !inDoubleQuote) {\n\t\t\tinSingleQuote = !inSingleQuote;\n\t\t\tbuffer += char;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === '\"' && !inSingleQuote) {\n\t\t\tinDoubleQuote = !inDoubleQuote;\n\t\t\tbuffer += char;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!inSingleQuote && !inDoubleQuote) {\n\t\t\tif (char === '(') {\n\t\t\t\tdepth++;\n\t\t\t} else if (char === ')') {\n\t\t\t\tdepth = Math.max(0, depth - 1);\n\t\t\t} else if (depth === 0 && char === separator) {\n\t\t\t\tparts.push(buffer.trim());\n\t\t\t\tbuffer = '';\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tbuffer += char;\n\t}\n\n\tconst tail = buffer.trim();\n\tif (tail.length > 0) {\n\t\tparts.push(tail);\n\t}\n\treturn parts;\n}\n\n/**\n * Finds the matching closing parenthesis index for the `(` at `openIndex`.\n * @private\n */\nfunction findMatchingParen(text: string, openIndex: number): number {\n\tlet depth = 0;\n\tlet inSingleQuote = false;\n\tlet inDoubleQuote = false;\n\n\tfor (let i = openIndex; i < text.length; i++) {\n\t\tconst char = text[i]!;\n\t\tif (char === \"'\" && !inDoubleQuote) {\n\t\t\tinSingleQuote = !inSingleQuote;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === '\"' && !inSingleQuote) {\n\t\t\tinDoubleQuote = !inDoubleQuote;\n\t\t\tcontinue;\n\t\t}\n\t\tif (inSingleQuote || inDoubleQuote) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === '(') depth++;\n\t\telse if (char === ')') {\n\t\t\tdepth--;\n\t\t\tif (depth === 0) return i;\n\t\t}\n\t}\n\treturn -1;\n}\n\n/**\n * Parses a JS literal from a SQL expression — strings, numbers, NULL, TRUE/FALSE.\n * @private\n */\nfunction parseLiteral(expression: string): { value: unknown; consumed: boolean } {\n\tconst text = expression.trim();\n\tif (text.length === 0) {\n\t\treturn { value: null, consumed: false };\n\t}\n\n\tif (text === '?') {\n\t\treturn { value: null, consumed: false };\n\t}\n\n\tif (/^null$/i.test(text)) {\n\t\treturn { value: null, consumed: true };\n\t}\n\n\tif (/^true$/i.test(text)) {\n\t\treturn { value: 1, consumed: true };\n\t}\n\n\tif (/^false$/i.test(text)) {\n\t\treturn { value: 0, consumed: true };\n\t}\n\n\tif ((text.startsWith(\"'\") && text.endsWith(\"'\")) || (text.startsWith('\"') && text.endsWith('\"'))) {\n\t\tconst inner = text.slice(1, -1).replace(/''/g, \"'\").replace(/\"\"/g, '\"');\n\t\treturn { value: inner, consumed: true };\n\t}\n\n\tconst numeric = Number(text);\n\tif (Number.isFinite(numeric) && /^-?\\d+(\\.\\d+)?$/.test(text)) {\n\t\treturn { value: numeric, consumed: true };\n\t}\n\n\treturn { value: undefined, consumed: false };\n}\n\n/**\n * Compound WHERE node — either a logical join or a single comparison/IS NULL leaf.\n * @private\n */\ntype WhereNode =\n\t| { type: 'and' | 'or'; children: WhereNode[] }\n\t| {\n\t\t\ttype: 'compare';\n\t\t\tcolumn: string;\n\t\t\toperator: ComparisonOperator | 'LIKE' | 'NOT LIKE';\n\t\t\tvalue: { kind: 'literal'; value: unknown } | { kind: 'param' };\n\t }\n\t| {\n\t\t\ttype: 'null-check';\n\t\t\tcolumn: string;\n\t\t\toperator: 'IS NULL' | 'IS NOT NULL';\n\t }\n\t| { type: 'always-true' };\n\n/**\n * Pulls the trailing `WHERE ...` substring out of an SQL statement, returning\n * everything from the WHERE keyword to either the next clause (`ORDER BY`,\n * `LIMIT`, `OFFSET`, `GROUP BY`, `RETURNING`, `;`) or the end of the string.\n * Quoted strings and parenthesized expressions are respected.\n * @private\n */\nfunction extractWhereSegment(sql: string): { whereClause: string | null; afterWhere: string } {\n\tconst upper = sql.toUpperCase();\n\tconst whereIdx = findKeyword(upper, sql, 'WHERE');\n\tif (whereIdx === -1) {\n\t\t// Even without a WHERE clause we want the post-FROM tail so\n\t\t// extractLimitOffset / extractOrderBy can locate clauses like\n\t\t// `ORDER BY age DESC LIMIT 5`.\n\t\tconst fromIdx = findKeyword(upper, sql, 'FROM');\n\t\tconst tail = fromIdx === -1 ? '' : sql.slice(fromIdx + 'FROM'.length);\n\t\treturn { whereClause: null, afterWhere: tail };\n\t}\n\n\tconst startOfWhere = whereIdx + 'WHERE'.length;\n\tconst terminators = ['ORDER BY', 'GROUP BY', 'HAVING', 'LIMIT', 'OFFSET', 'RETURNING', ';'];\n\n\tlet endIdx = sql.length;\n\tfor (const terminator of terminators) {\n\t\tconst idx = findKeyword(upper, sql, terminator, startOfWhere);\n\t\tif (idx !== -1 && idx < endIdx) {\n\t\t\tendIdx = idx;\n\t\t}\n\t}\n\n\treturn {\n\t\twhereClause: sql.slice(startOfWhere, endIdx).trim(),\n\t\tafterWhere: sql.slice(endIdx)\n\t};\n}\n\n/**\n * Finds a keyword in `sql` (case-insensitive) by matching against `upper`,\n * ignoring positions inside quoted strings. Returns `-1` if not present.\n * @private\n */\nfunction findKeyword(upper: string, original: string, keyword: string, fromIndex: number = 0): number {\n\tlet i = fromIndex;\n\tlet inSingle = false;\n\tlet inDouble = false;\n\n\twhile (i <= upper.length - keyword.length) {\n\t\tconst char = original[i]!;\n\t\tif (char === \"'\" && !inDouble) {\n\t\t\tinSingle = !inSingle;\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === '\"' && !inSingle) {\n\t\t\tinDouble = !inDouble;\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (!inSingle && !inDouble) {\n\t\t\tif (upper.startsWith(keyword, i)) {\n\t\t\t\tconst before = i === 0 ? ' ' : upper[i - 1]!;\n\t\t\t\tconst after = upper[i + keyword.length] ?? ' ';\n\t\t\t\tconst startBoundary = /[A-Z0-9_]/.test(before) === false;\n\t\t\t\tconst endBoundary = /[A-Z0-9_]/.test(after) === false;\n\t\t\t\tif (startBoundary && endBoundary) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\ti++;\n\t}\n\treturn -1;\n}\n\n/**\n * Pulls out the next LIMIT and OFFSET integer literals from `afterWhere`, if present.\n * @private\n */\nfunction extractLimitOffset(afterWhere: string): { limit?: number; offset?: number } {\n\tconst upper = afterWhere.toUpperCase();\n\tconst result: { limit?: number; offset?: number } = {};\n\n\tconst limitIdx = findKeyword(upper, afterWhere, 'LIMIT');\n\tif (limitIdx !== -1) {\n\t\tconst tail = afterWhere.slice(limitIdx + 'LIMIT'.length).trim();\n\t\tconst match = tail.match(/^(\\d+)(?:\\s*,\\s*(\\d+))?/);\n\t\tif (match) {\n\t\t\tconst first = Number(match[1]);\n\t\t\tconst second = match[2] !== undefined ? Number(match[2]) : undefined;\n\t\t\tif (second !== undefined) {\n\t\t\t\tresult.offset = first;\n\t\t\t\tresult.limit = second;\n\t\t\t} else {\n\t\t\t\tresult.limit = first;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst offsetIdx = findKeyword(upper, afterWhere, 'OFFSET');\n\tif (offsetIdx !== -1) {\n\t\tconst tail = afterWhere.slice(offsetIdx + 'OFFSET'.length).trim();\n\t\tconst match = tail.match(/^(\\d+)/);\n\t\tif (match) {\n\t\t\tresult.offset = Number(match[1]);\n\t\t}\n\t}\n\n\treturn result;\n}\n\n/**\n * Splits the body of a SET clause into `(column, expression)` pairs while\n * respecting parenthesis depth and quoted strings. Replaces the buggy\n * `/SET\\s+([^W]+?)WHERE/i` extractor — the original regex's `[^W]` accidentally\n * also excluded lowercase `w` under the `/i` flag, dropping any column whose\n * name contained `w` (for example `wrapped_dek`).\n * @private\n */\nfunction parseSetAssignments(setBody: string): Array<{ column: string; expression: string }> {\n\tconst assignments: Array<{ column: string; expression: string }> = [];\n\tfor (const segment of splitTopLevel(setBody, ',')) {\n\t\tconst eqIdx = segment.indexOf('=');\n\t\tif (eqIdx === -1) continue;\n\t\tconst column = normalizeSqlIdentifier(segment.slice(0, eqIdx));\n\t\tconst expression = segment.slice(eqIdx + 1).trim();\n\t\tif (column.length === 0) continue;\n\t\tassignments.push({ column, expression });\n\t}\n\treturn assignments;\n}\n\n/**\n * Tokenizes a WHERE expression into an array of strings.\n * @private\n */\nfunction tokenizeWhere(expression: string): string[] {\n\tconst tokens: string[] = [];\n\tlet i = 0;\n\twhile (i < expression.length) {\n\t\tconst char = expression[i]!;\n\n\t\tif (/\\s/.test(char)) {\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '(' || char === ')') {\n\t\t\ttokens.push(char);\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '?') {\n\t\t\ttokens.push('?');\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === \"'\" || char === '\"') {\n\t\t\tconst quote = char;\n\t\t\tlet end = i + 1;\n\t\t\twhile (end < expression.length) {\n\t\t\t\tif (expression[end] === quote) {\n\t\t\t\t\tif (expression[end + 1] === quote) {\n\t\t\t\t\t\tend += 2;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tend++;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tend++;\n\t\t\t}\n\t\t\ttokens.push(expression.slice(i, end));\n\t\t\ti = end;\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet matchedOperator: string | null = null;\n\t\tfor (const op of COMPARISON_OPERATORS) {\n\t\t\tif (expression.startsWith(op, i)) {\n\t\t\t\tmatchedOperator = op;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (matchedOperator) {\n\t\t\ttokens.push(matchedOperator);\n\t\t\ti += matchedOperator.length;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Identifier or word token (operator keywords like AND/OR/LIKE/IS/NULL/NOT).\n\t\tlet end = i;\n\t\twhile (end < expression.length && /[A-Za-z0-9_.$]/.test(expression[end]!)) {\n\t\t\tend++;\n\t\t}\n\t\tif (end === i) {\n\t\t\ttokens.push(char);\n\t\t\ti++;\n\t\t} else {\n\t\t\ttokens.push(expression.slice(i, end));\n\t\t\ti = end;\n\t\t}\n\t}\n\treturn tokens;\n}\n\n/**\n * Tiny recursive-descent parser that converts a tokenized WHERE clause into a\n * tree of `WhereNode`s. Supports AND/OR with parenthesized groups and the\n * comparison/null-check operators enumerated above.\n * @private\n */\nclass WhereParser {\n\tprivate position = 0;\n\n\tconstructor(private readonly tokens: string[]) {}\n\n\tparse(): WhereNode {\n\t\tif (this.tokens.length === 0) {\n\t\t\treturn { type: 'always-true' };\n\t\t}\n\t\treturn this.parseOr();\n\t}\n\n\tprivate peek(): string | undefined {\n\t\treturn this.tokens[this.position];\n\t}\n\n\tprivate take(): string | undefined {\n\t\treturn this.tokens[this.position++];\n\t}\n\n\tprivate isKeyword(token: string | undefined, keyword: string): boolean {\n\t\treturn typeof token === 'string' && token.toUpperCase() === keyword;\n\t}\n\n\tprivate parseOr(): WhereNode {\n\t\tlet left = this.parseAnd();\n\t\twhile (this.isKeyword(this.peek(), 'OR')) {\n\t\t\tthis.take();\n\t\t\tconst right = this.parseAnd();\n\t\t\tleft = left.type === 'or' ? { type: 'or', children: [...left.children, right] } : { type: 'or', children: [left, right] };\n\t\t}\n\t\treturn left;\n\t}\n\n\tprivate parseAnd(): WhereNode {\n\t\tlet left = this.parseTerm();\n\t\twhile (this.isKeyword(this.peek(), 'AND')) {\n\t\t\tthis.take();\n\t\t\tconst right = this.parseTerm();\n\t\t\tleft = left.type === 'and' ? { type: 'and', children: [...left.children, right] } : { type: 'and', children: [left, right] };\n\t\t}\n\t\treturn left;\n\t}\n\n\tprivate parseTerm(): WhereNode {\n\t\tconst next = this.peek();\n\t\tif (next === '(') {\n\t\t\tthis.take();\n\t\t\tconst expression = this.parseOr();\n\t\t\tif (this.peek() === ')') {\n\t\t\t\tthis.take();\n\t\t\t}\n\t\t\treturn expression;\n\t\t}\n\t\treturn this.parseComparison();\n\t}\n\n\tprivate parseComparison(): WhereNode {\n\t\tconst columnToken = this.take();\n\t\tif (columnToken === undefined) {\n\t\t\treturn { type: 'always-true' };\n\t\t}\n\n\t\tconst column = normalizeSqlIdentifier(columnToken);\n\t\tconst operatorToken = this.take();\n\t\tif (operatorToken === undefined) {\n\t\t\treturn { type: 'always-true' };\n\t\t}\n\n\t\tconst operatorUpper = operatorToken.toUpperCase();\n\t\tif (operatorUpper === 'IS') {\n\t\t\tconst maybeNot = this.peek();\n\t\t\tif (this.isKeyword(maybeNot, 'NOT')) {\n\t\t\t\tthis.take();\n\t\t\t\tconst nullToken = this.take();\n\t\t\t\tif (this.isKeyword(nullToken, 'NULL')) {\n\t\t\t\t\treturn { type: 'null-check', column, operator: 'IS NOT NULL' };\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst nullToken = this.take();\n\t\t\tif (this.isKeyword(nullToken, 'NULL')) {\n\t\t\t\treturn { type: 'null-check', column, operator: 'IS NULL' };\n\t\t\t}\n\t\t\treturn { type: 'always-true' };\n\t\t}\n\n\t\tlet comparisonOperator: ComparisonOperator | 'LIKE' | 'NOT LIKE' | null = null;\n\t\tif (operatorUpper === 'LIKE') {\n\t\t\tcomparisonOperator = 'LIKE';\n\t\t} else if (operatorUpper === 'NOT') {\n\t\t\tconst maybeLike = this.take();\n\t\t\tif (this.isKeyword(maybeLike, 'LIKE')) {\n\t\t\t\tcomparisonOperator = 'NOT LIKE';\n\t\t\t} else {\n\t\t\t\treturn { type: 'always-true' };\n\t\t\t}\n\t\t} else if (COMPARISON_OPERATORS.includes(operatorUpper as ComparisonOperator)) {\n\t\t\tcomparisonOperator = operatorUpper as ComparisonOperator;\n\t\t}\n\n\t\tif (!comparisonOperator) {\n\t\t\treturn { type: 'always-true' };\n\t\t}\n\n\t\tconst valueToken = this.take();\n\t\tif (valueToken === '?') {\n\t\t\treturn { type: 'compare', column, operator: comparisonOperator, value: { kind: 'param' } };\n\t\t}\n\t\tconst literal = parseLiteral(valueToken ?? '');\n\t\treturn {\n\t\t\ttype: 'compare',\n\t\t\tcolumn,\n\t\t\toperator: comparisonOperator,\n\t\t\tvalue: { kind: 'literal', value: literal.consumed ? literal.value : (valueToken ?? null) }\n\t\t};\n\t}\n}\n\n/**\n * Walks a {@link WhereNode} tree against a record, consuming `?` bindings in\n * left-to-right order from `bindings[paramCursor]`.\n * @private\n */\nfunction evaluateWhere(node: WhereNode, record: Record<string, unknown>, bindings: unknown[], paramCursor: { value: number }): boolean {\n\tswitch (node.type) {\n\t\tcase 'always-true':\n\t\t\treturn true;\n\t\tcase 'and':\n\t\t\treturn node.children.every((child) => evaluateWhere(child, record, bindings, paramCursor));\n\t\tcase 'or': {\n\t\t\t// All `?` parameters in an OR expression still consume bindings even\n\t\t\t// when short-circuited, otherwise downstream clauses pick up the wrong\n\t\t\t// binding indices.\n\t\t\tlet matched = false;\n\t\t\tfor (const child of node.children) {\n\t\t\t\tif (evaluateWhere(child, record, bindings, paramCursor)) {\n\t\t\t\t\tmatched = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn matched;\n\t\t}\n\t\tcase 'null-check': {\n\t\t\tconst recordValue = record[node.column];\n\t\t\tconst isNull = recordValue === null || recordValue === undefined;\n\t\t\treturn node.operator === 'IS NULL' ? isNull : !isNull;\n\t\t}\n\t\tcase 'compare': {\n\t\t\tlet value: unknown;\n\t\t\tif (node.value.kind === 'param') {\n\t\t\t\tvalue = bindings[paramCursor.value++];\n\t\t\t} else {\n\t\t\t\tvalue = node.value.value;\n\t\t\t}\n\t\t\tconst recordValue = record[node.column];\n\n\t\t\tif (node.operator === 'LIKE' || node.operator === 'NOT LIKE') {\n\t\t\t\tconst pattern = String(value ?? '');\n\t\t\t\tconst regex = new RegExp(`^${escapeRegExp(pattern).replace(/%/g, '.*').replace(/_/g, '.')}$`, 'i');\n\t\t\t\tconst matches = regex.test(String(recordValue ?? ''));\n\t\t\t\treturn node.operator === 'LIKE' ? matches : !matches;\n\t\t\t}\n\n\t\t\tconst leftNumber = toFiniteNumber(recordValue);\n\t\t\tconst rightNumber = toFiniteNumber(value);\n\n\t\t\tlet comparison: number;\n\t\t\tif (leftNumber !== undefined && rightNumber !== undefined) {\n\t\t\t\tcomparison = leftNumber === rightNumber ? 0 : leftNumber < rightNumber ? -1 : 1;\n\t\t\t} else if (recordValue === null || recordValue === undefined) {\n\t\t\t\tif (value === null || value === undefined) {\n\t\t\t\t\tcomparison = 0;\n\t\t\t\t} else {\n\t\t\t\t\tcomparison = -1;\n\t\t\t\t}\n\t\t\t} else if (value === null || value === undefined) {\n\t\t\t\tcomparison = 1;\n\t\t\t} else {\n\t\t\t\tconst leftStr = String(recordValue);\n\t\t\t\tconst rightStr = String(value);\n\t\t\t\tcomparison = leftStr === rightStr ? 0 : leftStr < rightStr ? -1 : 1;\n\t\t\t}\n\n\t\t\tswitch (node.operator) {\n\t\t\t\tcase '=':\n\t\t\t\t\treturn comparison === 0;\n\t\t\t\tcase '!=':\n\t\t\t\tcase '<>':\n\t\t\t\t\treturn comparison !== 0;\n\t\t\t\tcase '<':\n\t\t\t\t\treturn comparison < 0;\n\t\t\t\tcase '<=':\n\t\t\t\t\treturn comparison <= 0;\n\t\t\t\tcase '>':\n\t\t\t\t\treturn comparison > 0;\n\t\t\t\tcase '>=':\n\t\t\t\t\treturn comparison >= 0;\n\t\t\t\tdefault:\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Reports the number of `?` placeholders that appear in `text`, respecting\n * quoted strings.\n * @private\n */\nfunction countQuestionPlaceholders(text: string): number {\n\tlet count = 0;\n\tlet inSingle = false;\n\tlet inDouble = false;\n\tfor (let i = 0; i < text.length; i++) {\n\t\tconst char = text[i]!;\n\t\tif (char === \"'\" && !inDouble) {\n\t\t\tinSingle = !inSingle;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === '\"' && !inSingle) {\n\t\t\tinDouble = !inDouble;\n\t\t\tcontinue;\n\t\t}\n\t\tif (!inSingle && !inDouble && char === '?') {\n\t\t\tcount++;\n\t\t}\n\t}\n\treturn count;\n}\n\n/**\n * Lightweight detector for the SQL statement kind. Used to pick the matching\n * handler in {@link InMemorySQLDatabase.executeStatement}.\n * @private\n */\nfunction detectStatementType(\n\tsql: string\n): 'select' | 'insert' | 'update' | 'delete' | 'create-table' | 'drop-table' | 'pragma' | 'sqlite-master-select' | 'other' {\n\tconst trimmed = sql.trim().toUpperCase();\n\tif (trimmed.startsWith('SELECT') || trimmed.startsWith('WITH')) {\n\t\tif (trimmed.includes('SQLITE_MASTER')) {\n\t\t\treturn 'sqlite-master-select';\n\t\t}\n\t\treturn 'select';\n\t}\n\tif (trimmed.startsWith('INSERT')) return 'insert';\n\tif (trimmed.startsWith('UPDATE')) return 'update';\n\tif (trimmed.startsWith('DELETE')) return 'delete';\n\tif (trimmed.startsWith('CREATE TABLE')) return 'create-table';\n\tif (trimmed.startsWith('DROP TABLE')) return 'drop-table';\n\tif (trimmed.startsWith('PRAGMA')) return 'pragma';\n\treturn 'other';\n}\n\n/**\n * Extracts a table name when one is referenced by an `INSERT INTO`, `UPDATE`,\n * `DELETE FROM`, `SELECT ... FROM`, or `CREATE TABLE` clause.\n * @private\n */\nfunction extractTableName(sql: string): string | null {\n\tconst upper = sql.toUpperCase();\n\n\t// CREATE TABLE [IF NOT EXISTS] <name>\n\tconst createMatch = sql.match(/create\\s+table\\s+(?:if\\s+not\\s+exists\\s+)?([`\"\\[]?[\\w.]+[`\"\\]]?)/i);\n\tif (createMatch) {\n\t\treturn normalizeSqlIdentifier(createMatch[1] ?? '');\n\t}\n\n\t// DROP TABLE [IF EXISTS] <name>\n\tconst dropMatch = sql.match(/drop\\s+table\\s+(?:if\\s+exists\\s+)?([`\"\\[]?[\\w.]+[`\"\\]]?)/i);\n\tif (dropMatch) {\n\t\treturn normalizeSqlIdentifier(dropMatch[1] ?? '');\n\t}\n\n\t// INSERT [OR REPLACE|IGNORE|...] INTO <name>\n\tconst insertMatch = sql.match(/insert\\s+(?:or\\s+\\w+\\s+)?into\\s+([`\"\\[]?[\\w.]+[`\"\\]]?)/i);\n\tif (insertMatch) {\n\t\treturn normalizeSqlIdentifier(insertMatch[1] ?? '');\n\t}\n\n\t// UPDATE [OR ...] <name>\n\tconst updateMatch = sql.match(/update\\s+(?:or\\s+\\w+\\s+)?([`\"\\[]?[\\w.]+[`\"\\]]?)\\s+set/i);\n\tif (updateMatch) {\n\t\treturn normalizeSqlIdentifier(updateMatch[1] ?? '');\n\t}\n\n\t// DELETE FROM <name>\n\tconst deleteMatch = sql.match(/delete\\s+from\\s+([`\"\\[]?[\\w.]+[`\"\\]]?)/i);\n\tif (deleteMatch) {\n\t\treturn normalizeSqlIdentifier(deleteMatch[1] ?? '');\n\t}\n\n\t// SELECT ... FROM <name>\n\tconst fromIdx = findKeyword(upper, sql, 'FROM');\n\tif (fromIdx !== -1) {\n\t\tconst after = sql.slice(fromIdx + 'FROM'.length).trim();\n\t\tconst match = after.match(/^([`\"\\[]?[\\w.]+[`\"\\]]?)/);\n\t\tif (match) {\n\t\t\treturn normalizeSqlIdentifier(match[1] ?? '');\n\t\t}\n\t}\n\n\treturn null;\n}\n\n/**\n * Normalizes Drizzle-style query payloads into plain `(sql, bindings)`.\n * @private\n */\nfunction normalizeInMemoryDrizzleQuery(query: string | InMemoryDrizzleQuery, bindings: any[] = []): { sql: string; bindings: any[] } {\n\tif (typeof query === 'string') {\n\t\treturn { sql: query, bindings };\n\t}\n\n\tif (!query || typeof query !== 'object') {\n\t\tthrow new CollegeDBError('Unsupported query input', 'INVALID_QUERY_INPUT');\n\t}\n\n\tif (typeof query.toQuery === 'function') {\n\t\tconst built = query.toQuery(IN_MEMORY_DRIZZLE_QUERY_CONFIG as Record<string, unknown>);\n\t\tif (built && typeof built.sql === 'string') {\n\t\t\treturn {\n\t\t\t\tsql: built.sql,\n\t\t\t\tbindings: Array.isArray(built.params) ? [...built.params] : bindings\n\t\t\t};\n\t\t}\n\t}\n\n\tif (typeof query.sql === 'string') {\n\t\treturn {\n\t\t\tsql: query.sql,\n\t\t\tbindings: Array.isArray(query.params) ? [...query.params] : bindings\n\t\t};\n\t}\n\n\tif (typeof query.text === 'string') {\n\t\treturn {\n\t\t\tsql: query.text,\n\t\t\tbindings: Array.isArray(query.params) ? [...query.params] : bindings\n\t\t};\n\t}\n\n\tthrow new CollegeDBError('Unsupported Drizzle-style query object', 'INVALID_QUERY_INPUT');\n}\n\n/**\n * Internal projection descriptor produced by {@link parseSelectColumns}.\n * @private\n */\ninterface SelectColumn {\n\texpression: string;\n\talias: string;\n\tkind: 'star' | 'column' | 'aggregate' | 'scalar' | 'expression';\n}\n\n/**\n * Splits the body of a SELECT projection into descriptive fragments. Each\n * fragment carries the original expression text, the resolved output alias,\n * and a coarse \"kind\" so {@link evaluateSelectColumn} can decide whether to\n * materialize an aggregate or simply project a column.\n * @private\n */\nfunction parseSelectColumns(selectBody: string): SelectColumn[] {\n\tconst fragments = splitTopLevel(selectBody, ',');\n\treturn fragments.map((fragment) => {\n\t\tconst aliasMatch = fragment.match(/\\s+as\\s+([`\"\\[]?[\\w.]+[`\"\\]]?)\\s*$/i);\n\t\tconst expression = aliasMatch ? fragment.slice(0, aliasMatch.index).trim() : fragment.trim();\n\t\tconst alias = aliasMatch ? normalizeSqlIdentifier(aliasMatch[1] ?? '') : deriveDefaultAlias(expression);\n\n\t\tif (expression === '*') {\n\t\t\treturn { expression, alias: '*', kind: 'star' };\n\t\t}\n\n\t\tconst upperExpression = expression.toUpperCase();\n\t\tconst funcMatch = expression.match(/^([A-Za-z_][A-Za-z0-9_]*)\\s*\\(/);\n\t\tif (funcMatch) {\n\t\t\tconst fnName = (funcMatch[1] ?? '').toUpperCase();\n\t\t\tif (AGGREGATE_FUNCTIONS.has(fnName) || /\\b(?:COUNT|MAX|MIN|SUM|AVG)\\s*\\(/i.test(upperExpression)) {\n\t\t\t\treturn { expression, alias, kind: 'aggregate' };\n\t\t\t}\n\t\t\tif (SUPPORTED_SCALARS.has(fnName)) {\n\t\t\t\treturn { expression, alias, kind: 'scalar' };\n\t\t\t}\n\t\t}\n\n\t\tif (/[+\\-*/()]/.test(expression) || /\\bCOUNT\\s*\\(/i.test(expression) || /\\bMAX\\s*\\(/i.test(expression)) {\n\t\t\treturn { expression, alias, kind: 'expression' };\n\t\t}\n\n\t\treturn { expression, alias, kind: 'column' };\n\t});\n}\n\n/**\n * Picks a deterministic alias for a SELECT expression when the caller didn't\n * explicitly assign one with `AS`.\n * @private\n */\nfunction deriveDefaultAlias(expression: string): string {\n\tconst trimmed = expression.trim();\n\tif (trimmed === '*') return '*';\n\tconst match = trimmed.match(/^([`\"\\[]?[\\w.]+[`\"\\]]?)$/);\n\tif (match) {\n\t\treturn normalizeSqlIdentifier(trimmed);\n\t}\n\treturn trimmed;\n}\n\n/**\n * Replaces the next sequence of `?` placeholders inside an expression with the\n * corresponding bindings so the resulting text can be evaluated by\n * {@link evaluateScalarExpression} as a literal expression. Returns the\n * updated expression and the new binding cursor index.\n * @private\n */\nfunction substituteBindings(expression: string, bindings: unknown[], cursor: number): { expression: string; cursor: number } {\n\tlet output = '';\n\tlet inSingle = false;\n\tlet inDouble = false;\n\tlet i = 0;\n\tlet localCursor = cursor;\n\twhile (i < expression.length) {\n\t\tconst char = expression[i]!;\n\t\tif (char === \"'\" && !inDouble) {\n\t\t\tinSingle = !inSingle;\n\t\t\toutput += char;\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === '\"' && !inSingle) {\n\t\t\tinDouble = !inDouble;\n\t\t\toutput += char;\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (!inSingle && !inDouble && char === '?') {\n\t\t\tconst value = bindings[localCursor++];\n\t\t\toutput += literalToSql(value);\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\toutput += char;\n\t\ti++;\n\t}\n\treturn { expression: output, cursor: localCursor };\n}\n\n/**\n * Encodes a JS value as a SQL literal suitable for in-place substitution.\n * @private\n */\nfunction literalToSql(value: unknown): string {\n\tif (value === null || value === undefined) return 'NULL';\n\tif (typeof value === 'number' || typeof value === 'bigint') return String(value);\n\tif (typeof value === 'boolean') return value ? '1' : '0';\n\tconst stringValue = String(value).replace(/'/g, \"''\");\n\treturn `'${stringValue}'`;\n}\n\n/**\n * Evaluates a single SELECT expression against the rows that survived\n * filtering. Aggregates are computed across `rows`; non-aggregate expressions\n * are evaluated against the first row (or returned as `null` when empty).\n * @private\n */\nfunction evaluateSelectColumn(column: SelectColumn, rows: Record<string, unknown>[], bindings: unknown[], cursor: number): unknown {\n\tif (column.kind === 'star') {\n\t\treturn undefined;\n\t}\n\n\tif (column.kind === 'column') {\n\t\tconst first = rows[0];\n\t\treturn first ? first[column.expression] : null;\n\t}\n\n\tconst substituted = substituteBindings(column.expression, bindings, cursor).expression;\n\n\tif (column.kind === 'aggregate' || /\\b(?:COUNT|MAX|MIN|SUM|AVG)\\s*\\(/i.test(substituted)) {\n\t\treturn evaluateAggregateExpression(substituted, rows);\n\t}\n\n\tif (column.kind === 'scalar') {\n\t\tconst first = rows[0] ?? {};\n\t\treturn evaluateScalarExpression(substituted, first);\n\t}\n\n\tconst first = rows[0] ?? {};\n\treturn evaluateScalarExpression(substituted, first);\n}\n\n/**\n * Replaces every aggregate call inside `expression` with its evaluated value\n * (computed across `rows`), then defers any remaining expression evaluation —\n * which at this point should only involve numbers and operators — to\n * {@link evaluateScalarExpression}.\n * @private\n */\nfunction evaluateAggregateExpression(expression: string, rows: Record<string, unknown>[]): unknown {\n\tlet working = expression;\n\tconst aggregatePattern = /(COUNT|MAX|MIN|SUM|AVG)\\s*\\(/i;\n\tlet safety = 0;\n\n\twhile (aggregatePattern.test(working) && safety < 25) {\n\t\tsafety++;\n\t\tconst match = working.match(aggregatePattern);\n\t\tif (!match || match.index === undefined) break;\n\t\tconst openParenIndex = working.indexOf('(', match.index);\n\t\tif (openParenIndex === -1) break;\n\t\tconst closeParenIndex = findMatchingParen(working, openParenIndex);\n\t\tif (closeParenIndex === -1) break;\n\n\t\tconst fnName = (match[1] ?? '').toUpperCase();\n\t\tconst inner = working.slice(openParenIndex + 1, closeParenIndex).trim();\n\t\tconst value = computeAggregate(fnName, inner, rows);\n\t\tconst replacement = literalToSql(value);\n\t\tworking = working.slice(0, match.index) + replacement + working.slice(closeParenIndex + 1);\n\t}\n\n\treturn evaluateScalarExpression(working, rows[0] ?? {});\n}\n\n/**\n * Computes a single aggregate value (COUNT/MAX/MIN/SUM/AVG) for the provided rows.\n * @private\n */\nfunction computeAggregate(fnName: string, inner: string, rows: Record<string, unknown>[]): unknown {\n\tif (fnName === 'COUNT') {\n\t\tif (inner === '*') {\n\t\t\treturn rows.length;\n\t\t}\n\t\tconst isDistinct = /^distinct\\s+/i.test(inner);\n\t\tconst column = normalizeSqlIdentifier(inner.replace(/^distinct\\s+/i, ''));\n\t\tconst values = rows.map((row) => row[column]).filter((value) => value !== null && value !== undefined);\n\t\tif (isDistinct) {\n\t\t\treturn new Set(values.map((value) => String(value))).size;\n\t\t}\n\t\treturn values.length;\n\t}\n\n\tconst column = normalizeSqlIdentifier(inner);\n\tconst numericValues = rows.map((row) => toFiniteNumber(row[column])).filter((value): value is number => value !== undefined);\n\n\tif (numericValues.length === 0) {\n\t\treturn null;\n\t}\n\n\tswitch (fnName) {\n\t\tcase 'MAX':\n\t\t\treturn Math.max(...numericValues);\n\t\tcase 'MIN':\n\t\t\treturn Math.min(...numericValues);\n\t\tcase 'SUM':\n\t\t\treturn numericValues.reduce((sum, value) => sum + value, 0);\n\t\tcase 'AVG':\n\t\t\treturn numericValues.reduce((sum, value) => sum + value, 0) / numericValues.length;\n\t\tdefault:\n\t\t\treturn null;\n\t}\n}\n\n/**\n * Tiny expression evaluator for the residual scalar forms left after\n * aggregates have been substituted. Supports COALESCE/IFNULL, LOWER/UPPER,\n * LENGTH, ABS, and arithmetic / comparison via {@link safelyEvaluate}.\n * @private\n */\nfunction evaluateScalarExpression(expression: string, record: Record<string, unknown>): unknown {\n\tconst trimmed = expression.trim();\n\tif (trimmed.length === 0) return null;\n\n\tconst literal = parseLiteral(trimmed);\n\tif (literal.consumed) {\n\t\treturn literal.value;\n\t}\n\n\tconst scalarMatch = trimmed.match(/^([A-Za-z_][A-Za-z0-9_]*)\\s*\\(/);\n\tif (scalarMatch) {\n\t\tconst fnName = (scalarMatch[1] ?? '').toUpperCase();\n\t\tconst openParenIndex = trimmed.indexOf('(', scalarMatch.index);\n\t\tconst closeParenIndex = findMatchingParen(trimmed, openParenIndex);\n\t\tif (closeParenIndex !== -1) {\n\t\t\tconst inner = trimmed.slice(openParenIndex + 1, closeParenIndex);\n\t\t\tconst args = splitTopLevel(inner, ',').map((arg) => evaluateScalarExpression(arg, record));\n\t\t\tconst suffix = trimmed.slice(closeParenIndex + 1).trim();\n\t\t\tconst value = applyScalarFunction(fnName, args);\n\t\t\tif (suffix.length === 0) {\n\t\t\t\treturn value;\n\t\t\t}\n\t\t\treturn safelyEvaluate(`${literalToSql(value)} ${suffix}`, record);\n\t\t}\n\t}\n\n\tconst identifierMatch = trimmed.match(/^([`\"\\[]?[\\w.]+[`\"\\]]?)$/);\n\tif (identifierMatch) {\n\t\treturn record[normalizeSqlIdentifier(trimmed)] ?? null;\n\t}\n\n\treturn safelyEvaluate(trimmed, record);\n}\n\n/**\n * Applies a non-aggregate scalar function to its evaluated argument list.\n * @private\n */\nfunction applyScalarFunction(fnName: string, args: unknown[]): unknown {\n\tswitch (fnName) {\n\t\tcase 'COALESCE':\n\t\tcase 'IFNULL': {\n\t\t\tfor (const arg of args) {\n\t\t\t\tif (arg !== null && arg !== undefined) return arg;\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t\tcase 'LOWER':\n\t\t\treturn args[0] === null || args[0] === undefined ? null : String(args[0]).toLowerCase();\n\t\tcase 'UPPER':\n\t\t\treturn args[0] === null || args[0] === undefined ? null : String(args[0]).toUpperCase();\n\t\tcase 'LENGTH':\n\t\t\treturn args[0] === null || args[0] === undefined ? null : String(args[0]).length;\n\t\tcase 'ABS': {\n\t\t\tconst numeric = toFiniteNumber(args[0]);\n\t\t\treturn numeric === undefined ? null : Math.abs(numeric);\n\t\t}\n\t\tdefault:\n\t\t\treturn null;\n\t}\n}\n\n/**\n * Computes a constrained subset of scalar expressions — numeric arithmetic\n * over column references and constants. Anything outside that subset is\n * returned verbatim so the caller can decide whether the result is useful.\n *\n * The arithmetic path uses a token-based recursive-descent evaluator rather\n * than `new Function(...)` so the in-memory provider remains usable inside\n * Cloudflare Workers isolates, which disallow dynamic code evaluation.\n * @private\n */\nfunction safelyEvaluate(expression: string, record: Record<string, unknown>): unknown {\n\tconst trimmed = expression.trim();\n\tif (trimmed.length === 0) return null;\n\n\tconst literal = parseLiteral(trimmed);\n\tif (literal.consumed) return literal.value;\n\n\tconst numeric = evaluateNumericExpression(trimmed, record);\n\treturn numeric === undefined ? trimmed : numeric;\n}\n\n/**\n * Numeric expression token used by the in-memory arithmetic evaluator.\n * @private\n */\ntype NumericToken =\n\t| { type: 'number'; value: number }\n\t| { type: 'identifier'; name: string }\n\t| { type: 'null' }\n\t| { type: 'lparen' }\n\t| { type: 'rparen' }\n\t| { type: 'plus' }\n\t| { type: 'minus' }\n\t| { type: 'star' }\n\t| { type: 'slash' };\n\n/**\n * Tokenizes a numeric expression like `max_id + 1` or `(5 + 3) * 2`. Returns\n * `undefined` if any character falls outside the supported arithmetic subset\n * so the caller can bail out without attempting a parse.\n * @private\n */\nfunction tokenizeNumericExpression(expression: string): NumericToken[] | undefined {\n\tconst tokens: NumericToken[] = [];\n\tlet i = 0;\n\twhile (i < expression.length) {\n\t\tconst char = expression[i]!;\n\t\tif (/\\s/.test(char)) {\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === '(') {\n\t\t\ttokens.push({ type: 'lparen' });\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === ')') {\n\t\t\ttokens.push({ type: 'rparen' });\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === '+') {\n\t\t\ttokens.push({ type: 'plus' });\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === '-') {\n\t\t\ttokens.push({ type: 'minus' });\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === '*') {\n\t\t\ttokens.push({ type: 'star' });\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === '/') {\n\t\t\ttokens.push({ type: 'slash' });\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (/[0-9.]/.test(char)) {\n\t\t\tlet end = i;\n\t\t\twhile (end < expression.length && /[0-9.]/.test(expression[end]!)) end++;\n\t\t\tconst value = Number(expression.slice(i, end));\n\t\t\tif (!Number.isFinite(value)) return undefined;\n\t\t\ttokens.push({ type: 'number', value });\n\t\t\ti = end;\n\t\t\tcontinue;\n\t\t}\n\t\tif (/[A-Za-z_`\"\\[]/.test(char)) {\n\t\t\tlet end = i;\n\t\t\twhile (end < expression.length && /[A-Za-z0-9_`\"\\[\\].]/.test(expression[end]!)) end++;\n\t\t\tconst name = expression.slice(i, end);\n\t\t\tif (/^null$/i.test(name)) {\n\t\t\t\ttokens.push({ type: 'null' });\n\t\t\t} else {\n\t\t\t\ttokens.push({ type: 'identifier', name });\n\t\t\t}\n\t\t\ti = end;\n\t\t\tcontinue;\n\t\t}\n\t\treturn undefined;\n\t}\n\treturn tokens;\n}\n\n/**\n * Cursor state passed through the recursive-descent numeric parser.\n * @private\n */\ninterface NumericParser {\n\ttokens: NumericToken[];\n\tposition: number;\n}\n\n/**\n * Evaluates `<literal-or-column> (+|-|*|/) <literal-or-column>` style\n * expressions, with parentheses and unary +/-. Returns `undefined` when the\n * expression contains anything outside that subset — including string column\n * values, comparison operators, or unsupported syntax — so the caller can\n * fall back to returning the raw expression.\n * @private\n */\nfunction evaluateNumericExpression(expression: string, record: Record<string, unknown>): number | undefined {\n\tconst tokens = tokenizeNumericExpression(expression);\n\tif (!tokens || tokens.length === 0) return undefined;\n\n\tconst parser: NumericParser = { tokens, position: 0 };\n\tconst result = parseAdditive(parser, record);\n\tif (result === undefined) return undefined;\n\tif (parser.position !== tokens.length) return undefined;\n\treturn Number.isFinite(result) ? result : undefined;\n}\n\nfunction parseAdditive(parser: NumericParser, record: Record<string, unknown>): number | undefined {\n\tlet left = parseMultiplicative(parser, record);\n\tif (left === undefined) return undefined;\n\twhile (parser.position < parser.tokens.length) {\n\t\tconst next = parser.tokens[parser.position]!;\n\t\tif (next.type !== 'plus' && next.type !== 'minus') break;\n\t\tparser.position++;\n\t\tconst right = parseMultiplicative(parser, record);\n\t\tif (right === undefined) return undefined;\n\t\tleft = next.type === 'plus' ? left + right : left - right;\n\t}\n\treturn left;\n}\n\nfunction parseMultiplicative(parser: NumericParser, record: Record<string, unknown>): number | undefined {\n\tlet left = parseUnary(parser, record);\n\tif (left === undefined) return undefined;\n\twhile (parser.position < parser.tokens.length) {\n\t\tconst next = parser.tokens[parser.position]!;\n\t\tif (next.type !== 'star' && next.type !== 'slash') break;\n\t\tparser.position++;\n\t\tconst right = parseUnary(parser, record);\n\t\tif (right === undefined) return undefined;\n\t\tif (next.type === 'slash' && right === 0) return undefined;\n\t\tleft = next.type === 'star' ? left * right : left / right;\n\t}\n\treturn left;\n}\n\nfunction parseUnary(parser: NumericParser, record: Record<string, unknown>): number | undefined {\n\tconst next = parser.tokens[parser.position];\n\tif (!next) return undefined;\n\tif (next.type === 'plus') {\n\t\tparser.position++;\n\t\treturn parseUnary(parser, record);\n\t}\n\tif (next.type === 'minus') {\n\t\tparser.position++;\n\t\tconst value = parseUnary(parser, record);\n\t\treturn value === undefined ? undefined : -value;\n\t}\n\treturn parsePrimary(parser, record);\n}\n\nfunction parsePrimary(parser: NumericParser, record: Record<string, unknown>): number | undefined {\n\tconst token = parser.tokens[parser.position++];\n\tif (!token) return undefined;\n\tif (token.type === 'number') return token.value;\n\tif (token.type === 'null') return 0;\n\tif (token.type === 'identifier') {\n\t\tconst value = record[normalizeSqlIdentifier(token.name)];\n\t\tif (value === null || value === undefined) return 0;\n\t\treturn toFiniteNumber(value);\n\t}\n\tif (token.type === 'lparen') {\n\t\tconst inner = parseAdditive(parser, record);\n\t\tif (inner === undefined) return undefined;\n\t\tconst close = parser.tokens[parser.position++];\n\t\tif (!close || close.type !== 'rparen') return undefined;\n\t\treturn inner;\n\t}\n\treturn undefined;\n}\n\n/**\n * In-memory SQL backend used by tests and local sandboxes.\n *\n * Implements the {@link SQLDatabase} contract with a deliberately limited\n * subset of SQLite-flavored SQL. See the file-level docstring for the exact\n * features supported.\n */\nexport class InMemorySQLDatabase implements SQLDatabase {\n\tprivate tables = new Map<string, Map<string, Record<string, unknown>>>();\n\tprivate schemas = new Map<string, Map<string, ColumnInfo>>();\n\tprivate autoIncrementCounters = new Map<string, number>();\n\tprivate lastInsertRowId: number | string | null = null;\n\n\tprepare(sql: string): PreparedStatement {\n\t\treturn new InMemoryPreparedStatement(this, sql);\n\t}\n\n\tasync execute(query: string | InMemoryDrizzleQuery, bindings: any[] = []): Promise<QueryResult<Record<string, unknown>>> {\n\t\treturn await this.executeClientQuery(query, bindings);\n\t}\n\n\tasync run(query: string | InMemoryDrizzleQuery, bindings: any[] = []): Promise<QueryResult<Record<string, unknown>>> {\n\t\treturn await this.executeClientQuery(query, bindings);\n\t}\n\n\tasync all(query: string | InMemoryDrizzleQuery, bindings: any[] = []): Promise<QueryResult<Record<string, unknown>>> {\n\t\treturn await this.executeClientQuery(query, bindings);\n\t}\n\n\tasync get(query: string | InMemoryDrizzleQuery, bindings: any[] = []): Promise<QueryResult<Record<string, unknown>>> {\n\t\treturn await this.executeClientQuery(query, bindings);\n\t}\n\n\t/**\n\t * Routes a Drizzle-style query payload through the SQL emulator.\n\t * @private\n\t */\n\tprivate async executeClientQuery(query: string | InMemoryDrizzleQuery, bindings: any[]): Promise<QueryResult<Record<string, unknown>>> {\n\t\tconst normalized = normalizeInMemoryDrizzleQuery(query, bindings);\n\t\treturn await this.executeStatement(normalized.sql, normalized.bindings);\n\t}\n\n\t/**\n\t * Dispatches to the correct handler based on the SQL statement kind.\n\t * Public so the prepared-statement wrapper can target it directly.\n\t */\n\tasync executeStatement(sql: string, bindings: any[]): Promise<QueryResult<Record<string, unknown>>> {\n\t\tconst startTime = Date.now();\n\t\ttry {\n\t\t\tswitch (detectStatementType(sql)) {\n\t\t\t\tcase 'create-table':\n\t\t\t\t\treturn await this.handleCreateTable(sql);\n\t\t\t\tcase 'drop-table':\n\t\t\t\t\treturn await this.handleDropTable(sql);\n\t\t\t\tcase 'insert':\n\t\t\t\t\treturn await this.handleInsert(sql, bindings);\n\t\t\t\tcase 'update':\n\t\t\t\t\treturn await this.handleUpdate(sql, bindings);\n\t\t\t\tcase 'delete':\n\t\t\t\t\treturn await this.handleDelete(sql, bindings);\n\t\t\t\tcase 'select':\n\t\t\t\t\treturn await this.handleSelect(sql, bindings);\n\t\t\t\tcase 'sqlite-master-select':\n\t\t\t\t\treturn await this.handleSqliteMasterSelect(sql, bindings);\n\t\t\t\tcase 'pragma':\n\t\t\t\t\treturn await this.handlePragma(sql);\n\t\t\t\tcase 'other':\n\t\t\t\tdefault:\n\t\t\t\t\t// No-op success for unsupported statements (CREATE INDEX, ATTACH, etc.).\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\tresults: [],\n\t\t\t\t\t\tmeta: { duration: Date.now() - startTime }\n\t\t\t\t\t};\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tresults: [],\n\t\t\t\tmeta: { duration: Date.now() - startTime },\n\t\t\t\terror: message\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Convenience wrapper kept for backwards compatibility. Routes SELECT\n\t * statements through the emulator and rejects other statement kinds.\n\t */\n\tasync executeQuery(sql: string, bindings: any[]): Promise<QueryResult<Record<string, unknown>>> {\n\t\tconst startTime = Date.now();\n\t\tconst kind = detectStatementType(sql);\n\t\tif (kind === 'select' || kind === 'sqlite-master-select' || kind === 'pragma') {\n\t\t\treturn await this.executeStatement(sql, bindings);\n\t\t}\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tresults: [],\n\t\t\tmeta: { duration: Date.now() - startTime },\n\t\t\terror: 'Use executeStatement for non-SELECT queries'\n\t\t};\n\t}\n\n\tprivate async handleCreateTable(sql: string): Promise<QueryResult> {\n\t\tconst startTime = Date.now();\n\t\tconst tableName = extractTableName(sql);\n\n\t\tif (!tableName) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tresults: [],\n\t\t\t\tmeta: { duration: Date.now() - startTime },\n\t\t\t\terror: 'Could not extract table name'\n\t\t\t};\n\t\t}\n\n\t\tconst schema = new Map<string, ColumnInfo>();\n\t\tconst openParen = sql.indexOf('(');\n\t\tconst closeParen = openParen === -1 ? -1 : findMatchingParen(sql, openParen);\n\n\t\tif (openParen !== -1 && closeParen !== -1) {\n\t\t\tconst definitionBody = sql.slice(openParen + 1, closeParen);\n\t\t\tfor (const rawColumn of splitTopLevel(definitionBody, ',')) {\n\t\t\t\tconst tokens = rawColumn.trim().split(/\\s+/);\n\t\t\t\tif (tokens.length === 0) continue;\n\t\t\t\tconst firstUpper = tokens[0]?.toUpperCase() ?? '';\n\t\t\t\t// Skip table-level constraints such as PRIMARY KEY (...), FOREIGN KEY, CHECK, UNIQUE.\n\t\t\t\tif (['PRIMARY', 'FOREIGN', 'UNIQUE', 'CHECK', 'CONSTRAINT'].includes(firstUpper)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst colName = normalizeSqlIdentifier(tokens[0] ?? '');\n\t\t\t\tif (colName.length === 0) continue;\n\t\t\t\tconst colType = (tokens[1] ?? '').toUpperCase();\n\t\t\t\tconst modifiers = tokens.slice(2).join(' ').toUpperCase();\n\n\t\t\t\tschema.set(colName, {\n\t\t\t\t\tname: colName,\n\t\t\t\t\ttype: colType,\n\t\t\t\t\tisPrimaryKey: modifiers.includes('PRIMARY KEY'),\n\t\t\t\t\tisAutoIncrement:\n\t\t\t\t\t\tmodifiers.includes('AUTOINCREMENT') ||\n\t\t\t\t\t\tmodifiers.includes('AUTO_INCREMENT') ||\n\t\t\t\t\t\tmodifiers.includes('GENERATED BY DEFAULT AS IDENTITY'),\n\t\t\t\t\tdefaultValue: extractDefaultValue(tokens.slice(2).join(' ')),\n\t\t\t\t\tnotNull: modifiers.includes('NOT NULL')\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tthis.tables.set(tableName, new Map());\n\t\tthis.schemas.set(tableName, schema);\n\n\t\tfor (const column of schema.values()) {\n\t\t\tif (column.isAutoIncrement) {\n\t\t\t\tthis.autoIncrementCounters.set(tableName, this.autoIncrementCounters.get(tableName) ?? 0);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults: [],\n\t\t\tmeta: { duration: Date.now() - startTime }\n\t\t};\n\t}\n\n\tprivate async handleDropTable(sql: string): Promise<QueryResult> {\n\t\tconst startTime = Date.now();\n\t\tconst tableName = extractTableName(sql);\n\n\t\tif (!tableName) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tresults: [],\n\t\t\t\tmeta: { duration: Date.now() - startTime },\n\t\t\t\terror: 'Could not extract table name'\n\t\t\t};\n\t\t}\n\n\t\tthis.tables.delete(tableName);\n\t\tthis.schemas.delete(tableName);\n\t\tthis.autoIncrementCounters.delete(tableName);\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults: [],\n\t\t\tmeta: { duration: Date.now() - startTime }\n\t\t};\n\t}\n\n\tprivate async handleInsert(sql: string, bindings: any[]): Promise<QueryResult> {\n\t\tconst startTime = Date.now();\n\t\tconst tableName = extractTableName(sql);\n\n\t\tif (!tableName) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tresults: [],\n\t\t\t\tmeta: { duration: Date.now() - startTime },\n\t\t\t\terror: 'Could not extract table name'\n\t\t\t};\n\t\t}\n\n\t\tif (!this.tables.has(tableName)) {\n\t\t\tthis.tables.set(tableName, new Map());\n\t\t}\n\n\t\tconst table = this.tables.get(tableName)!;\n\t\tconst schema = this.schemas.get(tableName);\n\t\tconst schemaEntries = schema ? Array.from(schema.values()) : [];\n\t\tconst primaryKeyInfo = schemaEntries.find((column) => column.isPrimaryKey);\n\t\tconst autoIncrementInfo = schemaEntries.find((column) => column.isAutoIncrement);\n\n\t\tconst explicitColumns = extractInsertColumns(sql);\n\t\tconst isOrReplace = /\\binsert\\s+or\\s+replace\\b/i.test(sql);\n\t\tconst isOrIgnore = /\\binsert\\s+or\\s+(?:ignore|abort|fail|rollback)\\b/i.test(sql);\n\n\t\tconst valuesSegments = extractInsertValues(sql);\n\t\tconst insertedRows: Record<string, unknown>[] = [];\n\n\t\t// When values appear as a VALUES (...) list, evaluate each tuple. When the\n\t\t// caller omits VALUES (e.g. INSERT INTO ... SELECT ...) we fall back to\n\t\t// the binding-order behavior used by older versions of the emulator.\n\t\tconst tuples = valuesSegments.length > 0 ? valuesSegments : [null];\n\t\tlet bindingCursor = 0;\n\n\t\tfor (const tuple of tuples) {\n\t\t\tconst record: Record<string, unknown> = {};\n\n\t\t\tif (explicitColumns && explicitColumns.length > 0) {\n\t\t\t\tconst tupleExpressions = tuple ? splitTopLevel(tuple, ',').map((expression) => expression.trim()) : explicitColumns.map(() => '?');\n\n\t\t\t\texplicitColumns.forEach((columnName, index) => {\n\t\t\t\t\tconst expr = tupleExpressions[index];\n\t\t\t\t\tif (expr === undefined) return;\n\t\t\t\t\tif (expr === '?') {\n\t\t\t\t\t\trecord[columnName] = bindings[bindingCursor++];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst literal = parseLiteral(expr);\n\t\t\t\t\t\trecord[columnName] = literal.consumed ? literal.value : expr;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else if (schema) {\n\t\t\t\t// Without an explicit column list, fall back to schema order — the\n\t\t\t\t// historical default. Bindings are consumed in declaration order.\n\t\t\t\tfor (const column of schema.keys()) {\n\t\t\t\t\tif (bindingCursor < bindings.length) {\n\t\t\t\t\t\trecord[column] = bindings[bindingCursor++];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor (const value of bindings.slice(bindingCursor)) {\n\t\t\t\t\trecord[Object.keys(record).length === 0 ? 'id' : `column_${Object.keys(record).length}`] = value;\n\t\t\t\t\tbindingCursor++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Apply column defaults for omitted columns.\n\t\t\tif (schema) {\n\t\t\t\tfor (const column of schema.values()) {\n\t\t\t\t\tif (record[column.name] === undefined && column.defaultValue !== undefined) {\n\t\t\t\t\t\trecord[column.name] = column.defaultValue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst primaryKeyColumn = primaryKeyInfo?.name ?? 'id';\n\t\t\tlet primaryKeyValue = record[primaryKeyColumn];\n\n\t\t\tif ((primaryKeyValue === undefined || primaryKeyValue === null || primaryKeyValue === '') && autoIncrementInfo) {\n\t\t\t\tconst nextValue = (this.autoIncrementCounters.get(tableName) ?? 0) + 1;\n\t\t\t\tthis.autoIncrementCounters.set(tableName, nextValue);\n\t\t\t\trecord[autoIncrementInfo.name] = nextValue;\n\t\t\t\tif (primaryKeyColumn !== autoIncrementInfo.name) {\n\t\t\t\t\trecord[primaryKeyColumn] = nextValue;\n\t\t\t\t}\n\t\t\t\tprimaryKeyValue = nextValue;\n\t\t\t}\n\n\t\t\tif (primaryKeyValue === undefined || primaryKeyValue === null || primaryKeyValue === '') {\n\t\t\t\t// No primary key declared. Fall back to synthesized rowids so\n\t\t\t\t// downstream operations still find the inserted row.\n\t\t\t\tconst nextValue = (this.autoIncrementCounters.get(tableName) ?? 0) + 1;\n\t\t\t\tthis.autoIncrementCounters.set(tableName, nextValue);\n\t\t\t\tprimaryKeyValue = nextValue;\n\t\t\t\trecord[primaryKeyColumn] = nextValue;\n\t\t\t}\n\n\t\t\tif (autoIncrementInfo) {\n\t\t\t\tconst numericPrimaryKey = typeof primaryKeyValue === 'number' ? primaryKeyValue : Number(primaryKeyValue);\n\t\t\t\tif (Number.isFinite(numericPrimaryKey)) {\n\t\t\t\t\tthis.autoIncrementCounters.set(tableName, Math.max(this.autoIncrementCounters.get(tableName) ?? 0, numericPrimaryKey));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst key = String(primaryKeyValue);\n\t\t\tconst existed = table.has(key);\n\n\t\t\tif (existed && !isOrReplace) {\n\t\t\t\tif (isOrIgnore) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\tresults: [],\n\t\t\t\t\tmeta: { duration: Date.now() - startTime },\n\t\t\t\t\terror: `UNIQUE constraint failed: ${tableName}.${primaryKeyColumn}`\n\t\t\t\t};\n\t\t\t}\n\n\t\t\ttable.set(key, record);\n\t\t\tthis.lastInsertRowId =\n\t\t\t\ttypeof primaryKeyValue === 'number' || typeof primaryKeyValue === 'string' ? primaryKeyValue : String(primaryKeyValue);\n\t\t\tinsertedRows.push(record);\n\t\t}\n\n\t\tconst hasReturning = /\\breturning\\b/i.test(sql);\n\t\tconst returningColumns = hasReturning ? extractReturningColumns(sql) : null;\n\t\tconst results = hasReturning ? insertedRows.map((row) => projectReturningRow(row, returningColumns ?? ['*'])) : [];\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults,\n\t\t\tmeta: {\n\t\t\t\tduration: Date.now() - startTime,\n\t\t\t\tlast_row_id: this.lastInsertRowId ?? undefined,\n\t\t\t\tchanges: insertedRows.length\n\t\t\t}\n\t\t};\n\t}\n\n\tprivate async handleUpdate(sql: string, bindings: any[]): Promise<QueryResult> {\n\t\tconst startTime = Date.now();\n\t\tconst tableName = extractTableName(sql);\n\n\t\tif (!tableName) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tresults: [],\n\t\t\t\tmeta: { duration: Date.now() - startTime },\n\t\t\t\terror: 'Could not extract table name'\n\t\t\t};\n\t\t}\n\n\t\tif (!this.tables.has(tableName)) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tresults: [],\n\t\t\t\tmeta: { duration: Date.now() - startTime },\n\t\t\t\terror: `Table ${tableName} not found`\n\t\t\t};\n\t\t}\n\n\t\tconst setBody = extractSetBody(sql);\n\t\tif (!setBody) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tresults: [],\n\t\t\t\tmeta: { duration: Date.now() - startTime },\n\t\t\t\terror: 'UPDATE missing SET clause'\n\t\t\t};\n\t\t}\n\n\t\tconst assignments = parseSetAssignments(setBody);\n\n\t\tconst table = this.tables.get(tableName)!;\n\t\tconst records = Array.from(table.values());\n\n\t\t// Bindings are consumed first by the SET expressions (in order), then by\n\t\t// the WHERE expression. Aggregate this layout once so we can re-evaluate\n\t\t// WHERE per row without altering the binding cursor for later iterations.\n\t\tconst setPlaceholderCount = countQuestionPlaceholders(setBody);\n\t\tconst whereBindings = bindings.slice(setPlaceholderCount);\n\t\tconst setBindings = bindings.slice(0, setPlaceholderCount);\n\n\t\tconst { whereClause } = extractWhereSegment(sql);\n\t\tconst whereNode = whereClause ? new WhereParser(tokenizeWhere(whereClause)).parse() : ({ type: 'always-true' } as WhereNode);\n\n\t\tconst matched: Record<string, unknown>[] = [];\n\t\tfor (const record of records) {\n\t\t\tconst cursor = { value: 0 };\n\t\t\tif (evaluateWhere(whereNode, record, whereBindings, cursor)) {\n\t\t\t\tmatched.push(record);\n\t\t\t}\n\t\t}\n\n\t\tlet changes = 0;\n\t\tfor (const record of matched) {\n\t\t\tconst cursor = { value: 0 };\n\t\t\tfor (const { column, expression } of assignments) {\n\t\t\t\tconst placeholderCount = countQuestionPlaceholders(expression);\n\t\t\t\tconst slice = setBindings.slice(cursor.value, cursor.value + placeholderCount);\n\t\t\t\tcursor.value += placeholderCount;\n\t\t\t\trecord[column] = computeAssignmentValue(expression, slice, record);\n\t\t\t}\n\t\t\tchanges++;\n\t\t}\n\n\t\tconst hasReturning = /\\breturning\\b/i.test(sql);\n\t\tconst returningColumns = hasReturning ? extractReturningColumns(sql) : null;\n\t\tconst results = hasReturning ? matched.map((row) => projectReturningRow(row, returningColumns ?? ['*'])) : [];\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults,\n\t\t\tmeta: { duration: Date.now() - startTime, changes }\n\t\t};\n\t}\n\n\tprivate async handleDelete(sql: string, bindings: any[]): Promise<QueryResult> {\n\t\tconst startTime = Date.now();\n\t\tconst tableName = extractTableName(sql);\n\n\t\tif (!tableName) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tresults: [],\n\t\t\t\tmeta: { duration: Date.now() - startTime },\n\t\t\t\terror: 'Could not extract table name'\n\t\t\t};\n\t\t}\n\n\t\tif (!this.tables.has(tableName)) {\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tresults: [],\n\t\t\t\tmeta: { duration: Date.now() - startTime, changes: 0 }\n\t\t\t};\n\t\t}\n\n\t\tconst table = this.tables.get(tableName)!;\n\n\t\tconst { whereClause } = extractWhereSegment(sql);\n\t\tif (!whereClause) {\n\t\t\tconst removed = table.size;\n\t\t\ttable.clear();\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tresults: [],\n\t\t\t\tmeta: { duration: Date.now() - startTime, changes: removed }\n\t\t\t};\n\t\t}\n\n\t\tconst whereNode = new WhereParser(tokenizeWhere(whereClause)).parse();\n\t\tconst removedRows: Record<string, unknown>[] = [];\n\t\tfor (const [key, record] of Array.from(table.entries())) {\n\t\t\tconst cursor = { value: 0 };\n\t\t\tif (evaluateWhere(whereNode, record, bindings, cursor)) {\n\t\t\t\ttable.delete(key);\n\t\t\t\tremovedRows.push(record);\n\t\t\t}\n\t\t}\n\n\t\tconst hasReturning = /\\breturning\\b/i.test(sql);\n\t\tconst returningColumns = hasReturning ? extractReturningColumns(sql) : null;\n\t\tconst results = hasReturning ? removedRows.map((row) => projectReturningRow(row, returningColumns ?? ['*'])) : [];\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults,\n\t\t\tmeta: { duration: Date.now() - startTime, changes: removedRows.length }\n\t\t};\n\t}\n\n\tprivate async handleSelect(sql: string, bindings: any[]): Promise<QueryResult> {\n\t\tconst startTime = Date.now();\n\t\tconst tableName = extractTableName(sql);\n\n\t\tif (!tableName) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tresults: [],\n\t\t\t\tmeta: { duration: Date.now() - startTime },\n\t\t\t\terror: 'Could not extract table name'\n\t\t\t};\n\t\t}\n\n\t\tif (!this.tables.has(tableName)) {\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tresults: [],\n\t\t\t\tmeta: { duration: Date.now() - startTime }\n\t\t\t};\n\t\t}\n\n\t\tconst table = this.tables.get(tableName)!;\n\t\tconst allRows = Array.from(table.values());\n\n\t\t// Filter\n\t\tconst { whereClause, afterWhere } = extractWhereSegment(sql);\n\t\tconst whereNode = whereClause ? new WhereParser(tokenizeWhere(whereClause)).parse() : ({ type: 'always-true' } as WhereNode);\n\t\tconst selectBody = extractSelectBody(sql);\n\t\tconst selectColumns = parseSelectColumns(selectBody);\n\n\t\t// Bindings are split between SELECT projection (uncommon), WHERE, and\n\t\t// LIMIT/OFFSET. The current emulator does not support placeholders in\n\t\t// SELECT or LIMIT/OFFSET, so every binding feeds the WHERE evaluator.\n\t\tconst filtered: Record<string, unknown>[] = [];\n\t\tfor (const row of allRows) {\n\t\t\tconst cursor = { value: 0 };\n\t\t\tif (evaluateWhere(whereNode, row, bindings, cursor)) {\n\t\t\t\tfiltered.push(row);\n\t\t\t}\n\t\t}\n\n\t\t// ORDER BY\n\t\tconst orderBy = extractOrderBy(afterWhere || sql);\n\t\tlet orderedRows = filtered;\n\t\tif (orderBy) {\n\t\t\torderedRows = [...filtered].sort((left, right) => compareRowsByOrder(left, right, orderBy));\n\t\t}\n\n\t\tconst isAggregateSelect = selectColumns.some((col) => col.kind === 'aggregate');\n\t\tlet projectedRows: Record<string, unknown>[];\n\t\tif (isAggregateSelect) {\n\t\t\tconst aggregateRow: Record<string, unknown> = {};\n\t\t\tfor (const column of selectColumns) {\n\t\t\t\taggregateRow[column.alias] = evaluateSelectColumn(column, orderedRows, bindings, 0);\n\t\t\t}\n\t\t\tprojectedRows = [aggregateRow];\n\t\t} else if (selectColumns.length === 1 && selectColumns[0]?.kind === 'star') {\n\t\t\tprojectedRows = orderedRows.map((row) => ({ ...row }));\n\t\t} else {\n\t\t\tprojectedRows = orderedRows.map((row) => {\n\t\t\t\tconst projected: Record<string, unknown> = {};\n\t\t\t\tfor (const column of selectColumns) {\n\t\t\t\t\tif (column.kind === 'star') {\n\t\t\t\t\t\tObject.assign(projected, row);\n\t\t\t\t\t} else if (column.kind === 'column') {\n\t\t\t\t\t\tprojected[column.alias] = row[column.expression] ?? null;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tprojected[column.alias] = evaluateSelectColumn(column, [row], bindings, 0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn projected;\n\t\t\t});\n\t\t}\n\n\t\tconst { limit, offset } = extractLimitOffset(afterWhere);\n\t\tconst startIndex = offset ?? 0;\n\t\tconst endIndex = limit === undefined ? projectedRows.length : startIndex + limit;\n\t\tconst paginatedRows = projectedRows.slice(startIndex, endIndex);\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults: paginatedRows,\n\t\t\tmeta: { duration: Date.now() - startTime }\n\t\t};\n\t}\n\n\tprivate async handleSqliteMasterSelect(sql: string, bindings: any[]): Promise<QueryResult> {\n\t\tconst startTime = Date.now();\n\t\tconst rows: Record<string, unknown>[] = [];\n\t\tfor (const tableName of this.tables.keys()) {\n\t\t\trows.push({ name: tableName, type: 'table', tbl_name: tableName, sql: `CREATE TABLE ${tableName} (...)` });\n\t\t}\n\n\t\tconst { whereClause, afterWhere } = extractWhereSegment(sql);\n\t\tconst whereNode = whereClause ? new WhereParser(tokenizeWhere(whereClause)).parse() : ({ type: 'always-true' } as WhereNode);\n\n\t\tconst filtered = rows.filter((row) => {\n\t\t\tconst cursor = { value: 0 };\n\t\t\treturn evaluateWhere(whereNode, row, bindings, cursor);\n\t\t});\n\n\t\tconst selectBody = extractSelectBody(sql);\n\t\tconst projection = parseSelectColumns(selectBody);\n\t\tconst projected = filtered.map((row) => {\n\t\t\tif (projection.length === 1 && projection[0]?.kind === 'star') return { ...row };\n\t\t\tconst out: Record<string, unknown> = {};\n\t\t\tfor (const column of projection) {\n\t\t\t\tif (column.kind === 'star') {\n\t\t\t\t\tObject.assign(out, row);\n\t\t\t\t} else if (column.kind === 'column') {\n\t\t\t\t\tout[column.alias] = row[column.expression] ?? null;\n\t\t\t\t} else {\n\t\t\t\t\tout[column.alias] = evaluateSelectColumn(column, [row], bindings, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn out;\n\t\t});\n\n\t\tconst { limit, offset } = extractLimitOffset(afterWhere);\n\t\tconst start = offset ?? 0;\n\t\tconst end = limit === undefined ? projected.length : start + limit;\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults: projected.slice(start, end),\n\t\t\tmeta: { duration: Date.now() - startTime }\n\t\t};\n\t}\n\n\tprivate async handlePragma(sql: string): Promise<QueryResult> {\n\t\tconst startTime = Date.now();\n\t\tconst lower = sql.trim().toLowerCase();\n\n\t\tif (lower.startsWith('pragma page_count')) {\n\t\t\t// Approximate \"page count\" using a stable hash of the total row count\n\t\t\t// so size-based shard allocation still has a meaningful signal.\n\t\t\tlet totalRows = 0;\n\t\t\tfor (const table of this.tables.values()) {\n\t\t\t\ttotalRows += table.size;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tresults: [{ page_count: Math.max(1, totalRows) }],\n\t\t\t\tmeta: { duration: Date.now() - startTime }\n\t\t\t};\n\t\t}\n\n\t\tif (lower.startsWith('pragma page_size')) {\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tresults: [{ page_size: 4096 }],\n\t\t\t\tmeta: { duration: Date.now() - startTime }\n\t\t\t};\n\t\t}\n\n\t\tif (lower.startsWith('pragma table_info')) {\n\t\t\tconst match = lower.match(/pragma\\s+table_info\\s*\\(\\s*([`\"\\[]?[\\w.]+[`\"\\]]?)\\s*\\)/);\n\t\t\tif (match) {\n\t\t\t\tconst tableName = normalizeSqlIdentifier(match[1] ?? '');\n\t\t\t\tconst schema = this.schemas.get(tableName);\n\t\t\t\tif (schema) {\n\t\t\t\t\tconst rows = Array.from(schema.values()).map((column, index) => ({\n\t\t\t\t\t\tcid: index,\n\t\t\t\t\t\tname: column.name,\n\t\t\t\t\t\ttype: column.type,\n\t\t\t\t\t\tnotnull: column.notNull ? 1 : 0,\n\t\t\t\t\t\tdflt_value: column.defaultValue ?? null,\n\t\t\t\t\t\tpk: column.isPrimaryKey ? 1 : 0\n\t\t\t\t\t}));\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\tresults: rows,\n\t\t\t\t\t\tmeta: { duration: Date.now() - startTime }\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults: [],\n\t\t\tmeta: { duration: Date.now() - startTime }\n\t\t};\n\t}\n}\n\n/**\n * Helper used by `UPDATE ... SET col = <expr>` to compute the assigned value\n * for each row. Pure column references and the special form `col = col + 1`\n * are evaluated against the live row so updates can reference their previous\n * column values.\n * @private\n */\nfunction computeAssignmentValue(expression: string, slice: unknown[], row: Record<string, unknown>): unknown {\n\tif (expression === '?') {\n\t\treturn slice[0];\n\t}\n\n\tconst substituted = substituteBindings(expression, slice, 0).expression;\n\treturn evaluateScalarExpression(substituted, row);\n}\n\n/**\n * Returns the body of a SELECT projection — the substring between `SELECT`\n * (or a leading distinct/all keyword) and the matching `FROM`.\n * @private\n */\nfunction extractSelectBody(sql: string): string {\n\tconst upper = sql.toUpperCase();\n\tconst selectIdx = findKeyword(upper, sql, 'SELECT');\n\tif (selectIdx === -1) return '*';\n\tconst fromIdx = findKeyword(upper, sql, 'FROM', selectIdx + 'SELECT'.length);\n\tif (fromIdx === -1) return sql.slice(selectIdx + 'SELECT'.length).trim();\n\treturn sql\n\t\t.slice(selectIdx + 'SELECT'.length, fromIdx)\n\t\t.trim()\n\t\t.replace(/^distinct\\s+/i, '');\n}\n\n/**\n * Returns the body of a `SET` clause from an UPDATE statement.\n * @private\n */\nfunction extractSetBody(sql: string): string | null {\n\tconst upper = sql.toUpperCase();\n\tconst setIdx = findKeyword(upper, sql, 'SET');\n\tif (setIdx === -1) return null;\n\n\tconst startOfSet = setIdx + 'SET'.length;\n\tconst terminators = ['WHERE', 'RETURNING', 'ORDER BY', 'LIMIT'];\n\tlet endIdx = sql.length;\n\tfor (const terminator of terminators) {\n\t\tconst idx = findKeyword(upper, sql, terminator, startOfSet);\n\t\tif (idx !== -1 && idx < endIdx) {\n\t\t\tendIdx = idx;\n\t\t}\n\t}\n\treturn sql.slice(startOfSet, endIdx).trim();\n}\n\n/**\n * Returns the body of an ORDER BY clause.\n * @private\n */\ninterface OrderByClause {\n\tcolumn: string;\n\tdirection: 'asc' | 'desc';\n}\n\nfunction extractOrderBy(sql: string): OrderByClause | null {\n\tconst upper = sql.toUpperCase();\n\tconst orderIdx = findKeyword(upper, sql, 'ORDER BY');\n\tif (orderIdx === -1) return null;\n\n\tconst tail = sql.slice(orderIdx + 'ORDER BY'.length).trim();\n\tconst match = tail.match(/^([`\"\\[]?[\\w.]+[`\"\\]]?)(?:\\s+(asc|desc))?/i);\n\tif (!match) return null;\n\treturn {\n\t\tcolumn: normalizeSqlIdentifier(match[1] ?? ''),\n\t\tdirection: (match[2] ?? 'asc').toLowerCase() === 'desc' ? 'desc' : 'asc'\n\t};\n}\n\nfunction compareRowsByOrder(left: Record<string, unknown>, right: Record<string, unknown>, order: OrderByClause): number {\n\tconst leftValue = left[order.column];\n\tconst rightValue = right[order.column];\n\tif (leftValue === rightValue) return 0;\n\tif (leftValue === undefined || leftValue === null) {\n\t\treturn order.direction === 'desc' ? 1 : -1;\n\t}\n\tif (rightValue === undefined || rightValue === null) {\n\t\treturn order.direction === 'desc' ? -1 : 1;\n\t}\n\tconst leftNumber = toFiniteNumber(leftValue);\n\tconst rightNumber = toFiniteNumber(rightValue);\n\tlet comparison: number;\n\tif (leftNumber !== undefined && rightNumber !== undefined) {\n\t\tcomparison = leftNumber === rightNumber ? 0 : leftNumber < rightNumber ? -1 : 1;\n\t} else {\n\t\tcomparison = String(leftValue).localeCompare(String(rightValue));\n\t}\n\treturn order.direction === 'desc' ? -comparison : comparison;\n}\n\n/**\n * Extracts each `VALUES (...)` tuple body from an INSERT statement.\n * @private\n */\nfunction extractInsertValues(sql: string): string[] {\n\tconst upper = sql.toUpperCase();\n\tconst valuesIdx = findKeyword(upper, sql, 'VALUES');\n\tif (valuesIdx === -1) return [];\n\n\tconst tuples: string[] = [];\n\tlet i = valuesIdx + 'VALUES'.length;\n\twhile (i < sql.length) {\n\t\twhile (i < sql.length && /[\\s,]/.test(sql[i]!)) i++;\n\t\tif (sql[i] !== '(') break;\n\t\tconst close = findMatchingParen(sql, i);\n\t\tif (close === -1) break;\n\t\ttuples.push(sql.slice(i + 1, close).trim());\n\t\ti = close + 1;\n\t}\n\treturn tuples;\n}\n\n/**\n * Extracts the explicit column list from an INSERT statement, when present.\n * Distinguishes between `INSERT INTO t (a, b) VALUES (?, ?)` (column list) and\n * `INSERT INTO t VALUES (?, ?)` (no column list — first parenthesized group is\n * the VALUES tuple) by checking that the matched paren group appears before\n * any `VALUES` / `SELECT` keyword.\n * @private\n */\nfunction extractInsertColumns(sql: string): string[] | null {\n\tconst match = sql.match(/insert\\s+(?:or\\s+\\w+\\s+)?into\\s+[^()]+\\(([^)]+)\\)/i);\n\tif (!match || !match[1] || match.index === undefined) return null;\n\n\tconst beforeMatch = sql.slice(0, match.index + match[0].length);\n\tconst upper = beforeMatch.toUpperCase();\n\tif (upper.includes('VALUES') || upper.includes('SELECT')) {\n\t\t// The parenthesized group falls inside (or after) the VALUES clause,\n\t\t// not before it — that means the statement omits the column list.\n\t\treturn null;\n\t}\n\n\treturn match[1]\n\t\t.split(',')\n\t\t.map((column) => normalizeSqlIdentifier(column))\n\t\t.filter((column) => column.length > 0);\n}\n\n/**\n * Pulls the column list out of a RETURNING clause, if any.\n * @private\n */\nfunction extractReturningColumns(sql: string): string[] | null {\n\tconst match = sql.match(/\\breturning\\b\\s+([^;]+)/i);\n\tif (!match || !match[1]) return null;\n\treturn splitTopLevel(match[1], ',').map((entry) => entry.trim());\n}\n\nfunction projectReturningRow(row: Record<string, unknown>, columns: string[]): Record<string, unknown> {\n\tif (columns.length === 1 && columns[0] === '*') {\n\t\treturn { ...row };\n\t}\n\tconst projection = parseSelectColumns(columns.join(', '));\n\tconst output: Record<string, unknown> = {};\n\tfor (const column of projection) {\n\t\tif (column.kind === 'star') {\n\t\t\tObject.assign(output, row);\n\t\t} else if (column.kind === 'column') {\n\t\t\toutput[column.alias] = row[column.expression] ?? null;\n\t\t} else {\n\t\t\toutput[column.alias] = evaluateSelectColumn(column, [row], [], 0);\n\t\t}\n\t}\n\treturn output;\n}\n\n/**\n * Recognizes `DEFAULT <literal>` modifiers in column definitions and\n * normalizes the literal value.\n * @private\n */\nfunction extractDefaultValue(modifiers: string): unknown {\n\tconst match = modifiers.match(/default\\s+('([^']*)'|\"([^\"]*)\"|[\\w.-]+)/i);\n\tif (!match) return undefined;\n\tconst raw = match[1] ?? '';\n\tconst literal = parseLiteral(raw);\n\treturn literal.consumed ? literal.value : raw;\n}\n\n/**\n * Prepared statement wrapper that delegates execution back to the in-memory\n * database. The wrapper picks the right method on the underlying database\n * based on the statement kind, so callers can use the same `.run()` /\n * `.first()` / `.all()` API regardless of the SQL kind.\n * @private\n */\nclass InMemoryPreparedStatement implements PreparedStatement {\n\tprivate bindings: any[] = [];\n\n\tconstructor(\n\t\tprivate database: InMemorySQLDatabase,\n\t\tprivate sql: string\n\t) {}\n\n\tbind(...bindings: any[]): PreparedStatement {\n\t\tthis.bindings = bindings;\n\t\treturn this;\n\t}\n\n\tasync run<T = Record<string, unknown>>(): Promise<QueryResult<T>> {\n\t\treturn (await this.database.executeStatement(this.sql, this.bindings)) as QueryResult<T>;\n\t}\n\n\tasync all<T = Record<string, unknown>>(): Promise<QueryResult<T>> {\n\t\t// For non-SELECT statements `executeQuery` previously returned a failed\n\t\t// result. Route through `executeStatement` so RETURNING rows are still\n\t\t// surfaced via `.all()`.\n\t\treturn (await this.database.executeStatement(this.sql, this.bindings)) as QueryResult<T>;\n\t}\n\n\tasync first<T = Record<string, unknown>>(): Promise<T | null> {\n\t\tconst result = await this.database.executeStatement(this.sql, this.bindings);\n\t\treturn (result.results[0] as T) ?? null;\n\t}\n}\n\n/**\n * In-memory implementation of {@link KVStorage}.\n *\n * Implements every method on the contract plus a few NuxtHub-flavored aliases\n * (`set`, `del`, `keys`, `getItem`, `setItem`, `removeItem`, `getKeys`) so the\n * same instance can be wrapped by `createNuxtHubKVProvider` without any\n * additional adapter glue.\n */\nexport class InMemoryKVStorage implements KVStorage {\n\tprivate store = new Map<string, string>();\n\tprivate expirations = new Map<string, number>();\n\n\t/**\n\t * Removes any keys whose TTL has expired. Cheap to call as part of read\n\t * paths because the store stays small in test workloads.\n\t * @private\n\t */\n\tprivate pruneExpired(): void {\n\t\tif (this.expirations.size === 0) return;\n\t\tconst now = Date.now();\n\t\tfor (const [key, expiresAt] of this.expirations) {\n\t\t\tif (expiresAt < now) {\n\t\t\t\tthis.store.delete(key);\n\t\t\t\tthis.expirations.delete(key);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate normalizeValue(value: unknown): string {\n\t\treturn typeof value === 'string' ? value : (JSON.stringify(value) ?? String(value));\n\t}\n\n\tasync get<T = unknown>(key: string, type: 'json'): Promise<T | null>;\n\tasync get(key: string, type?: 'text'): Promise<string | null>;\n\tasync get<T = unknown>(key: string, type: 'text' | 'json' = 'text'): Promise<any> {\n\t\tconst expiration = this.expirations.get(key);\n\t\tif (expiration !== undefined && expiration < Date.now()) {\n\t\t\tthis.store.delete(key);\n\t\t\tthis.expirations.delete(key);\n\t\t\treturn null;\n\t\t}\n\n\t\tconst value = this.store.get(key);\n\t\tif (value === undefined) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (type === 'json') {\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(value) as T;\n\t\t\t} catch (error) {\n\t\t\t\tthrow new CollegeDBError(\n\t\t\t\t\t`Failed to parse JSON from KV for key ${key}: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t'KV_JSON_PARSE_FAILED'\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t}\n\n\tasync put(key: string, value: string, options?: { expirationTtl?: number }): Promise<void> {\n\t\tthis.store.set(key, value);\n\t\tif (options?.expirationTtl) {\n\t\t\tthis.expirations.set(key, Date.now() + options.expirationTtl * 1000);\n\t\t} else {\n\t\t\tthis.expirations.delete(key);\n\t\t}\n\t}\n\n\tasync set(key: string, value: unknown, options?: { ttl?: number }): Promise<void> {\n\t\tthis.store.set(key, this.normalizeValue(value));\n\t\tif (options?.ttl) {\n\t\t\tthis.expirations.set(key, Date.now() + options.ttl * 1000);\n\t\t} else {\n\t\t\tthis.expirations.delete(key);\n\t\t}\n\t}\n\n\tasync del(key: string): Promise<void> {\n\t\tawait this.delete(key);\n\t}\n\n\tasync keys(prefix: string = ''): Promise<string[]> {\n\t\tconst listed = await this.list({ prefix });\n\t\treturn listed.keys.map((key) => key.name);\n\t}\n\n\tasync getItem<T = unknown>(key: string): Promise<T | null> {\n\t\tconst value = await this.get(key, 'text');\n\t\treturn (value as T | null) ?? null;\n\t}\n\n\tasync setItem(key: string, value: unknown): Promise<void> {\n\t\tawait this.set(key, value);\n\t}\n\n\tasync removeItem(key: string): Promise<void> {\n\t\tawait this.delete(key);\n\t}\n\n\tasync getKeys(prefix: string = ''): Promise<string[]> {\n\t\treturn await this.keys(prefix);\n\t}\n\n\tasync delete(key: string): Promise<void> {\n\t\tthis.store.delete(key);\n\t\tthis.expirations.delete(key);\n\t}\n\n\tasync list(options?: { prefix?: string; cursor?: string; limit?: number }): Promise<KVListResult> {\n\t\tthis.pruneExpired();\n\n\t\tconst prefix = options?.prefix ?? '';\n\t\tconst limit = options?.limit ?? 1000;\n\t\tconst parsedCursor = options?.cursor ? Number.parseInt(options.cursor, 10) : 0;\n\t\tconst cursor = Number.isFinite(parsedCursor) && parsedCursor >= 0 ? parsedCursor : 0;\n\n\t\tconst allKeys: string[] = [];\n\t\tfor (const key of this.store.keys()) {\n\t\t\tif (key.startsWith(prefix)) {\n\t\t\t\tallKeys.push(key);\n\t\t\t}\n\t\t}\n\n\t\tconst slice = allKeys.slice(cursor, cursor + limit).map((name) => ({ name }));\n\t\tconst nextCursor = cursor + limit;\n\t\tconst listComplete = nextCursor >= allKeys.length;\n\n\t\treturn {\n\t\t\tkeys: slice,\n\t\t\tcursor: listComplete ? undefined : String(nextCursor),\n\t\t\tlist_complete: listComplete\n\t\t};\n\t}\n\n\t/**\n\t * Drops every entry from the store. Test utility only — production\n\t * implementations should not expose this affordance.\n\t */\n\tclear(): void {\n\t\tthis.store.clear();\n\t\tthis.expirations.clear();\n\t}\n\n\t/**\n\t * Returns the number of non-expired entries currently in the store. Useful\n\t * for asserting on cleanup behavior in tests.\n\t */\n\tsize(): number {\n\t\tthis.pruneExpired();\n\t\treturn this.store.size;\n\t}\n}\n\n/**\n * Factory function to create an in-memory SQL database provider.\n *\n * @returns InMemorySQLDatabase instance\n *\n * @example\n * ```typescript\n * import { createInMemorySQLProvider } from '@earth-app/collegedb';\n *\n * const db = createInMemorySQLProvider();\n * initialize({\n * kv: new InMemoryKVStorage(),\n * shards: {\n * 'shard-1': db,\n * 'shard-2': db\n * }\n * });\n * ```\n */\nexport function createInMemorySQLProvider(): InMemorySQLDatabase {\n\treturn new InMemorySQLDatabase();\n}\n\n/**\n * Factory function to create an in-memory KV storage provider.\n *\n * @returns InMemoryKVStorage instance\n *\n * @example\n * ```typescript\n * import { createInMemoryKVProvider } from '@earth-app/collegedb';\n *\n * const kv = createInMemoryKVProvider();\n * initialize({\n * kv,\n * shards: { /* ... *\\/ }\n * });\n * ```\n */\nexport function createInMemoryKVProvider(): InMemoryKVStorage {\n\treturn new InMemoryKVStorage();\n}\n"
|
|
13
13
|
],
|
|
14
|
-
"mappings": "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",
|
|
15
|
-
"debugId": "
|
|
14
|
+
"mappings": "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",
|
|
15
|
+
"debugId": "7DB2D43ECE710A4764756E2164756E21",
|
|
16
16
|
"names": []
|
|
17
17
|
}
|