@earth-app/collegedb 1.2.0 → 1.2.1

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 CHANGED
@@ -1,21 +1,21 @@
1
- var jY=Object.defineProperty;var AY=(J)=>J;function VY(J,Y){this[J]=AY.bind(null,Y)}var xJ=(J,Y)=>{for(var Z in Y)jY(J,Z,{get:Y[Z],enumerable:!0,configurable:!0,set:VY.bind(Y,Z)})};var UJ=(J,Y)=>()=>(J&&(Y=J(J=0)),Y);var j;var q=UJ(()=>{j=class j extends Error{code;constructor(J,Y){super(J);if(this.name="CollegeDBError",this.code=Y,Error.captureStackTrace)Error.captureStackTrace(this,j)}}});var HJ={};xJ(HJ,{KVShardMapper:()=>K});class K{kv;hashKeys;hashCache=new Map;mappingCache=new Map;knownShardsCache={shards:null,expiresAt:0};mappingCacheTtlMs;knownShardsCacheTtlMs;constructor(J,Y={}){this.kv=J,this.hashKeys=Y.hashShardMappings??!0,this.mappingCacheTtlMs=Y.mappingCacheTtlMs??LY,this.knownShardsCacheTtlMs=Y.knownShardsCacheTtlMs??EY}getCachedMapping(J){let Y=this.mappingCache.get(J);if(!Y)return;if(Y.expiresAt<Date.now()){this.mappingCache.delete(J);return}return Y.mapping}setCachedMapping(J,Y){if(this.mappingCache.size>50000){let Z=this.mappingCache.keys().next().value;if(Z)this.mappingCache.delete(Z)}this.mappingCache.set(J,{mapping:Y,expiresAt:Date.now()+this.mappingCacheTtlMs})}async cacheMappingForKeys(J,Y){let Z=await Promise.all(J.map(($)=>this.hashKey($)));for(let $ of Z)this.setCachedMapping($,Y)}getCachedKnownShards(){if(this.knownShardsCache.shards&&this.knownShardsCache.expiresAt>=Date.now())return[...this.knownShardsCache.shards];return null}setCachedKnownShards(J){this.knownShardsCache.shards=[...J],this.knownShardsCache.expiresAt=Date.now()+this.knownShardsCacheTtlMs}async hashKey(J){if(!this.hashKeys)return J;let Y=this.hashCache.get(J);if(Y)return Y;let $=new TextEncoder().encode(J),X=await crypto.subtle.digest("SHA-256",$),W=new Uint8Array(X),G=Array.from(W).map((U)=>U.toString(16).padStart(2,"0")).join("");if(this.hashCache.size<1e4)this.hashCache.set(J,G);return G}async getShardMapping(J){let Y=await this.hashKey(J),Z=this.getCachedMapping(Y);if(Z!==void 0)return Z;let $=`${N}${Y}`,X=await this.kv.get($,"json");if(X)return this.setCachedMapping(Y,X),X;let W=await this.kv.get(`${k}${Y}`,"json");if(W){let G={shard:W.shard,createdAt:W.createdAt,updatedAt:W.updatedAt,originalKey:this.hashKeys?void 0:J};if(this.setCachedMapping(Y,G),this.hashKeys)for(let U of W.keys)this.setCachedMapping(U,G);return G}return this.setCachedMapping(Y,null),null}async setShardMapping(J,Y,Z=[]){let $=[J,...Z],X=Date.now(),W={shard:Y,createdAt:X,updatedAt:X,originalKey:this.hashKeys?void 0:J};if($.length===1){let G=await this.hashKey(J),U=`${N}${G}`;await this.kv.put(U,JSON.stringify(W)),this.setCachedMapping(G,W)}else{let G=await this.hashKey(J),U=`${k}${G}`,H=this.hashKeys?await Promise.all($.map((F)=>this.hashKey(F))):$,_={shard:Y,createdAt:X,updatedAt:X,keys:H};await this.kv.put(U,JSON.stringify(_));let O=$.map(async(F)=>{let A=await this.hashKey(F),E=`${N}${A}`,I={shard:Y,createdAt:X,updatedAt:X,originalKey:this.hashKeys?void 0:F};return this.kv.put(E,JSON.stringify(I))});await Promise.all(O),await this.cacheMappingForKeys($,W)}}async updateShardMapping(J,Y){let Z=await this.getShardMapping(J);if(!Z)throw new j(`No existing mapping found for primary key: ${J}`,"MAPPING_NOT_FOUND");let $=await this.hashKey(J),X=`${N}${$}`,W=`${k}${$}`,G=await this.kv.get(W,"json");if(G){let U=Date.now(),H={...G,shard:Y,updatedAt:U};await this.kv.put(W,JSON.stringify(H));let _=G.keys.length>0?this.hashKeys?G.keys:G.keys:[await this.hashKey(J)],O=_.map(async(A)=>{let E=`${N}${A}`,I={...Z,shard:Y,updatedAt:U};return this.kv.put(E,JSON.stringify(I))});await Promise.all(O);let F={...Z,shard:Y,updatedAt:U};if(this.hashKeys)for(let A of _)this.setCachedMapping(A,F);this.setCachedMapping($,F)}else{let U={...Z,shard:Y,updatedAt:Date.now()};await this.kv.put(X,JSON.stringify(U)),this.setCachedMapping($,U)}}async deleteShardMapping(J){let Y=await this.hashKey(J),Z=`${N}${Y}`,$=`${k}${Y}`,X=await this.kv.get($,"json");if(X){await this.kv.delete($);let W=X.keys.length>0?this.hashKeys?X.keys:X.keys:[await this.hashKey(J)],G=W.map(async(U)=>{let H=`${N}${U}`;return this.kv.delete(H)});if(await Promise.all(G),this.hashKeys)for(let U of W)this.setCachedMapping(U,null);this.setCachedMapping(Y,null)}else await this.kv.delete(Z),this.setCachedMapping(Y,null)}async getKnownShards(){let J=this.getCachedKnownShards();if(J)return J;let Z=await this.kv.get(vJ,"json")||[];return this.setCachedKnownShards(Z),Z}async setKnownShards(J){if(!J||J.length===0)return;let Y=[...new Set(J.filter(Boolean))];if(Y.length===0)return;await this.kv.put(vJ,JSON.stringify(Y)),this.setCachedKnownShards(Y)}async addKnownShard(J){if(!J)return;let Y=await this.getKnownShards();if(!Y.includes(J))Y.push(J),await this.setKnownShards(Y)}async getKeysForShard(J){let Y=[],Z=await this.kv.list({prefix:N});for(let X of Z.keys){let W=await this.kv.get(X.name,"json");if(W?.shard===J){let G=X.name.replace(N,"");if(W.originalKey)Y.push(W.originalKey);else if(!this.hashKeys)Y.push(G)}}let $=await this.kv.list({prefix:k});for(let X of $.keys){let W=await this.kv.get(X.name,"json");if(W?.shard===J)Y.push(...W.keys)}return[...new Set(Y)]}async getShardKeyCounts(){let J={},Y=await this.kv.list({prefix:N});for(let $ of Y.keys){let X=await this.kv.get($.name,"json");if(X)J[X.shard]=(J[X.shard]||0)+1}let Z=await this.kv.list({prefix:k});for(let $ of Z.keys){let X=await this.kv.get($.name,"json");if(X)J[X.shard]=(J[X.shard]||0)+X.keys.length}return J}async clearAllMappings(){let Y=(await this.kv.list({prefix:N})).keys.map((X)=>this.kv.delete(X.name)),$=(await this.kv.list({prefix:k})).keys.map((X)=>this.kv.delete(X.name));await Promise.all([...Y,...$]),this.mappingCache.clear()}async addLookupKeys(J,Y){let Z=await this.getShardMapping(J);if(!Z)throw new j(`No existing mapping found for primary key: ${J}`,"MAPPING_NOT_FOUND");let $=await this.hashKey(J),X=`${k}${$}`,W=await this.kv.get(X,"json"),G=[J,...Y],U=Date.now();if(!W){let O=this.hashKeys?await Promise.all(G.map((F)=>this.hashKey(F))):G;W={shard:Z.shard,createdAt:Z.createdAt,updatedAt:U,keys:O}}else{let O=this.hashKeys?await Promise.all(G.map((F)=>this.hashKey(F))):G;W={...W,updatedAt:U,keys:[...new Set([...W.keys,...O])]}}await this.kv.put(X,JSON.stringify(W));let H=Y.map(async(O)=>{let F=await this.hashKey(O),A=`${N}${F}`,E={shard:Z.shard,createdAt:Z.createdAt,updatedAt:U,originalKey:this.hashKeys?void 0:O};return this.kv.put(A,JSON.stringify(E))});await Promise.all(H);let _={shard:Z.shard,createdAt:Z.createdAt,updatedAt:U,originalKey:Z.originalKey};await this.cacheMappingForKeys([J,...Y],_)}async setShardMappingsBatch(J,Y={}){if(J.length===0)return;let Z=Math.max(1,Y.concurrency??25),$=0,X=Array(Math.min(Z,J.length)).fill(null).map(async()=>{while($<J.length){let W=$++,G=J[W];if(!G)continue;await this.setShardMapping(G.primaryKey,G.shard,G.additionalKeys||[])}});await Promise.all(X)}async getAllLookupKeys(J){let Y=await this.hashKey(J),Z=`${k}${Y}`,$=await this.kv.get(Z,"json");if($)return $.keys;let X=await this.getShardMapping(J);if(X)return X.originalKey?[X.originalKey]:[J];throw new j(`No mapping found for key: ${J}`,"MAPPING_NOT_FOUND")}}var N="shard:",k="multikey:",vJ="known_shards",LY=30000,EY=1e4;var c=UJ(()=>{q()});var r={};xJ(r,{validateTableForSharding:()=>a,schemaExists:()=>FJ,migrateRecord:()=>SJ,listTables:()=>p,integrateExistingDatabase:()=>fJ,dropSchema:()=>qJ,discoverExistingRecordsWithColumns:()=>t,discoverExistingPrimaryKeys:()=>i,createSchemaAcrossShards:()=>kJ,createSchema:()=>OJ,createMappingsForExistingKeys:()=>KJ,clearShardMigrationCache:()=>yJ,clearMigrationCache:()=>pJ,checkMigrationNeeded:()=>hJ,autoDetectAndMigrate:()=>bJ});async function CJ(J,Y,Z){if(J.length===0)return;let $=Math.max(1,Math.min(Y,J.length)),X=0,W=Array($).fill(null).map(async()=>{while(X<J.length){let G=X++,U=J[G];if(U===void 0)continue;await Z(U,G)}});await Promise.all(W)}function IY(J,Y,Z,$){let X=Z.length;switch($){case"hash":{let W=0;for(let U=0;U<J.length;U++){let H=J.charCodeAt(U);W=(W<<5)-W+H,W=W&W}let G=Math.abs(W)%X;return Z[G]}case"random":return Z[Math.floor(Math.random()*X)];default:return Z[Y%X]}}async function OJ(J,Y){let Z=Y.split(";").map(($)=>$.trim()).filter(($)=>$.length>0&&!$.startsWith("--"));for(let $ of Z)try{await J.prepare($).run()}catch(X){throw console.error("Failed to execute schema statement:",$,X),new j(`Schema migration failed: ${X}`,"SCHEMA_MIGRATION_FAILED")}}async function kJ(J,Y){let Z=Object.entries(J).map(([$,X])=>{return OJ(X,Y).catch((W)=>{throw new j(`Failed to create schema on shard ${$}: ${W.message}`,"SCHEMA_CREATION_FAILED")})});await Promise.all(Z)}async function FJ(J,Y){try{return await J.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name=?").bind(Y).first()!==null}catch{return!1}}async function qJ(J,...Y){for(let Z of Y)try{await J.prepare(`DROP TABLE IF EXISTS ${Z}`).run()}catch($){console.error(`Failed to drop table ${Z}:`,$)}}async function p(J){try{return(await J.prepare("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name").all()).results.map((Z)=>Z.name)}catch{return[]}}async function SJ(J,Y,Z,$){let X=await J.prepare(`SELECT * FROM ${$} WHERE id = ?`).bind(Z).first();if(!X)throw new j(`Record with primary key ${Z} not found in source database`,"RECORD_NOT_FOUND");if(!await FJ(Y,$))await OJ(Y,$);let W=Object.keys(X),G=W.map(()=>"?").join(", "),U=W.map((_)=>X[_]),H=`INSERT OR REPLACE INTO ${$} (${W.join(", ")}) VALUES (${G})`;await Y.prepare(H).bind(...U).run(),await J.prepare(`DELETE FROM ${$} WHERE id = ?`).bind(Z).run()}async function i(J,Y,Z="id"){try{return(await J.prepare(`SELECT ${Z} FROM ${Y}`).all()).results.map((X)=>String(X[Z]))}catch($){throw new j(`Failed to discover primary keys in table ${Y}: ${$}`,"DISCOVERY_FAILED")}}async function t(J,Y,Z="id"){try{let $=`${Y}_columns`,X;if(_J.has($))X=_J.get($).map((H)=>H.name);else{let _=(await J.prepare(`PRAGMA table_info(${Y})`).all()).results.map((O)=>({name:O.name,type:O.type}));_J.set($,_),X=_.map((O)=>O.name)}let W=[Z];if(X.includes("username"))W.push("username");if(X.includes("email"))W.push("email");if(X.includes("name"))W.push("name");let G=`SELECT ${W.join(", ")} FROM ${Y}`;return(await J.prepare(G).all()).results}catch($){throw new j(`Failed to discover records with columns in table ${Y}: ${$}`,"DISCOVERY_FAILED")}}async function KJ(J,Y,Z,$,X={}){if(J.length===0||Y.length===0)return;let W=Math.max(1,X.concurrency??25),G=J.map((U,H)=>({primaryKey:U,shard:IY(U,H,Y,Z)}));await $.setShardMappingsBatch(G,{concurrency:W})}async function a(J,Y,Z){let $=[],X=0;try{if(!await J.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name=?").bind(Y).first())return $.push(`Table '${Y}' does not exist`),{isValid:!1,tableName:Y,primaryKeyColumn:Z,recordCount:0,issues:$};if(!(await J.prepare(`PRAGMA table_info(${Y})`).all()).results.some((_)=>_.name===Z&&_.pk===1))$.push(`Primary key column '${Z}' not found or not set as primary key`);if(X=(await J.prepare(`SELECT COUNT(*) as count FROM ${Y}`).first())?.count||0,X===0)$.push(`Table '${Y}' is empty`)}catch(W){$.push(`Database validation error: ${W}`)}return{isValid:$.length===0,tableName:Y,primaryKeyColumn:Z,recordCount:X,issues:$}}async function fJ(J,Y,Z,$={}){let{tables:X,primaryKeyColumn:W="id",strategy:G="hash",addShardMappingsTable:U=!0,dryRun:H=!1,migrateOtherColumns:_=!1,concurrency:O=25}=$,F=Math.max(1,O),A=[],E=0,I=0,M=0;try{let V=(X||await p(J)).filter((L)=>L!=="shard_mappings");for(let L of V)try{let z=await a(J,L,W);if(!z.isValid){A.push(`Table ${L}: ${z.issues.join(", ")}`);continue}if(_){let R=await t(J,L,W);if(R.length===0){A.push(`Table ${L} has no records to process`);continue}if(!H){let P=R.map((Q)=>{let WJ=String(Q[W]),h=[];if(Q.username&&typeof Q.username==="string")h.push(`username:${Q.username}`);if(Q.email&&typeof Q.email==="string")h.push(`email:${Q.email}`);if(Q.name&&typeof Q.name==="string")h.push(`name:${Q.name}`);return{primaryKey:WJ,shard:Y,additionalKeys:h}});await Z.setShardMappingsBatch(P,{concurrency:F}),M+=P.length}I+=R.length}else{let R=await i(J,L,W);if(R.length===0){A.push(`Table ${L} has no records to process`);continue}if(!H){let P=R.map((Q)=>({primaryKey:Q,shard:Y}));await Z.setShardMappingsBatch(P,{concurrency:F}),M+=P.length}I+=R.length}E++}catch(z){A.push(`Failed to process table ${L}: ${z}`)}if(U&&!H){if(!(await p(J)).includes("shard_mappings"))await J.prepare(`
1
+ var A6=Object.defineProperty;var L6=(J)=>J;function V6(J,$){this[J]=L6.bind(null,$)}var vJ=(J,$)=>{for(var X in $)A6(J,X,{get:$[X],enumerable:!0,configurable:!0,set:V6.bind($,X)})};var HJ=(J,$)=>()=>(J&&($=J(J=0)),$);var j;var K=HJ(()=>{j=class j extends Error{code;constructor(J,$){super(J);if(this.name="CollegeDBError",this.code=$,Error.captureStackTrace)Error.captureStackTrace(this,j)}}});var _J={};vJ(_J,{KVShardMapper:()=>q});class q{kv;hashKeys;hashCache=new Map;mappingCache=new Map;knownShardsCache={shards:null,expiresAt:0};mappingCacheTtlMs;knownShardsCacheTtlMs;constructor(J,$={}){this.kv=J,this.hashKeys=$.hashShardMappings??!0,this.mappingCacheTtlMs=$.mappingCacheTtlMs??E6,this.knownShardsCacheTtlMs=$.knownShardsCacheTtlMs??T6}getCachedMapping(J){let $=this.mappingCache.get(J);if(!$)return;if($.expiresAt<Date.now()){this.mappingCache.delete(J);return}return $.mapping}setCachedMapping(J,$){if(this.mappingCache.size>50000){let X=this.mappingCache.keys().next().value;if(X)this.mappingCache.delete(X)}this.mappingCache.set(J,{mapping:$,expiresAt:Date.now()+this.mappingCacheTtlMs})}async cacheMappingForKeys(J,$){let X=await Promise.all(J.map((Y)=>this.hashKey(Y)));for(let Y of X)this.setCachedMapping(Y,$)}getCachedKnownShards(){if(this.knownShardsCache.shards&&this.knownShardsCache.expiresAt>=Date.now())return[...this.knownShardsCache.shards];return null}setCachedKnownShards(J){this.knownShardsCache.shards=[...J],this.knownShardsCache.expiresAt=Date.now()+this.knownShardsCacheTtlMs}async hashKey(J){if(!this.hashKeys)return J;let $=this.hashCache.get(J);if($)return $;let Y=new TextEncoder().encode(J),Z=await crypto.subtle.digest("SHA-256",Y),W=new Uint8Array(Z),G=Array.from(W).map((U)=>U.toString(16).padStart(2,"0")).join("");if(this.hashCache.size<1e4)this.hashCache.set(J,G);return G}async getShardMapping(J){let $=await this.hashKey(J),X=this.getCachedMapping($);if(X!==void 0)return X;let Y=`${x}${$}`,Z=await this.kv.get(Y,"json");if(Z)return this.setCachedMapping($,Z),Z;let W=await this.kv.get(`${k}${$}`,"json");if(W){let G={shard:W.shard,createdAt:W.createdAt,updatedAt:W.updatedAt,originalKey:this.hashKeys?void 0:J};if(this.setCachedMapping($,G),this.hashKeys)for(let U of W.keys)this.setCachedMapping(U,G);return G}return this.setCachedMapping($,null),null}async setShardMapping(J,$,X=[]){let Y=[J,...X],Z=Date.now(),W={shard:$,createdAt:Z,updatedAt:Z,originalKey:this.hashKeys?void 0:J};if(Y.length===1){let G=await this.hashKey(J),U=`${x}${G}`;await this.kv.put(U,JSON.stringify(W)),this.setCachedMapping(G,W)}else{let G=await this.hashKey(J),U=`${k}${G}`,H=this.hashKeys?await Promise.all(Y.map((F)=>this.hashKey(F))):Y,_={shard:$,createdAt:Z,updatedAt:Z,keys:H};await this.kv.put(U,JSON.stringify(_));let O=Y.map(async(F)=>{let A=await this.hashKey(F),T=`${x}${A}`,I={shard:$,createdAt:Z,updatedAt:Z,originalKey:this.hashKeys?void 0:F};return this.kv.put(T,JSON.stringify(I))});await Promise.all(O),await this.cacheMappingForKeys(Y,W)}}async updateShardMapping(J,$){let X=await this.getShardMapping(J);if(!X)throw new j(`No existing mapping found for primary key: ${J}`,"MAPPING_NOT_FOUND");let Y=await this.hashKey(J),Z=`${x}${Y}`,W=`${k}${Y}`,G=await this.kv.get(W,"json");if(G){let U=Date.now(),H={...G,shard:$,updatedAt:U};await this.kv.put(W,JSON.stringify(H));let _=G.keys.length>0?this.hashKeys?G.keys:G.keys:[await this.hashKey(J)],O=_.map(async(A)=>{let T=`${x}${A}`,I={...X,shard:$,updatedAt:U};return this.kv.put(T,JSON.stringify(I))});await Promise.all(O);let F={...X,shard:$,updatedAt:U};if(this.hashKeys)for(let A of _)this.setCachedMapping(A,F);this.setCachedMapping(Y,F)}else{let U={...X,shard:$,updatedAt:Date.now()};await this.kv.put(Z,JSON.stringify(U)),this.setCachedMapping(Y,U)}}async deleteShardMapping(J){let $=await this.hashKey(J),X=`${x}${$}`,Y=`${k}${$}`,Z=await this.kv.get(Y,"json");if(Z){await this.kv.delete(Y);let W=Z.keys.length>0?this.hashKeys?Z.keys:Z.keys:[await this.hashKey(J)],G=W.map(async(U)=>{let H=`${x}${U}`;return this.kv.delete(H)});if(await Promise.all(G),this.hashKeys)for(let U of W)this.setCachedMapping(U,null);this.setCachedMapping($,null)}else await this.kv.delete(X),this.setCachedMapping($,null)}async getKnownShards(){let J=this.getCachedKnownShards();if(J)return J;let X=await this.kv.get(CJ,"json")||[];return this.setCachedKnownShards(X),X}async setKnownShards(J){if(!J||J.length===0)return;let $=[...new Set(J.filter(Boolean))];if($.length===0)return;await this.kv.put(CJ,JSON.stringify($)),this.setCachedKnownShards($)}async addKnownShard(J){if(!J)return;let $=await this.getKnownShards();if(!$.includes(J))$.push(J),await this.setKnownShards($)}async getKeysForShard(J){let $=[],X=await this.kv.list({prefix:x});for(let Z of X.keys){let W=await this.kv.get(Z.name,"json");if(W?.shard===J){let G=Z.name.replace(x,"");if(W.originalKey)$.push(W.originalKey);else if(!this.hashKeys)$.push(G)}}let Y=await this.kv.list({prefix:k});for(let Z of Y.keys){let W=await this.kv.get(Z.name,"json");if(W?.shard===J)$.push(...W.keys)}return[...new Set($)]}async getShardKeyCounts(){let J={},$=await this.kv.list({prefix:x});for(let Y of $.keys){let Z=await this.kv.get(Y.name,"json");if(Z)J[Z.shard]=(J[Z.shard]||0)+1}let X=await this.kv.list({prefix:k});for(let Y of X.keys){let Z=await this.kv.get(Y.name,"json");if(Z)J[Z.shard]=(J[Z.shard]||0)+Z.keys.length}return J}async clearAllMappings(){let $=(await this.kv.list({prefix:x})).keys.map((Z)=>this.kv.delete(Z.name)),Y=(await this.kv.list({prefix:k})).keys.map((Z)=>this.kv.delete(Z.name));await Promise.all([...$,...Y]),this.mappingCache.clear()}async addLookupKeys(J,$){let X=await this.getShardMapping(J);if(!X)throw new j(`No existing mapping found for primary key: ${J}`,"MAPPING_NOT_FOUND");let Y=await this.hashKey(J),Z=`${k}${Y}`,W=await this.kv.get(Z,"json"),G=[J,...$],U=Date.now();if(!W){let O=this.hashKeys?await Promise.all(G.map((F)=>this.hashKey(F))):G;W={shard:X.shard,createdAt:X.createdAt,updatedAt:U,keys:O}}else{let O=this.hashKeys?await Promise.all(G.map((F)=>this.hashKey(F))):G;W={...W,updatedAt:U,keys:[...new Set([...W.keys,...O])]}}await this.kv.put(Z,JSON.stringify(W));let H=$.map(async(O)=>{let F=await this.hashKey(O),A=`${x}${F}`,T={shard:X.shard,createdAt:X.createdAt,updatedAt:U,originalKey:this.hashKeys?void 0:O};return this.kv.put(A,JSON.stringify(T))});await Promise.all(H);let _={shard:X.shard,createdAt:X.createdAt,updatedAt:U,originalKey:X.originalKey};await this.cacheMappingForKeys([J,...$],_)}async setShardMappingsBatch(J,$={}){if(J.length===0)return;let X=Math.max(1,$.concurrency??25),Y=0,Z=Array(Math.min(X,J.length)).fill(null).map(async()=>{while(Y<J.length){let W=Y++,G=J[W];if(!G)continue;await this.setShardMapping(G.primaryKey,G.shard,G.additionalKeys||[])}});await Promise.all(Z)}async getAllLookupKeys(J){let $=await this.hashKey(J),X=`${k}${$}`,Y=await this.kv.get(X,"json");if(Y)return Y.keys;let Z=await this.getShardMapping(J);if(Z)return Z.originalKey?[Z.originalKey]:[J];throw new j(`No mapping found for key: ${J}`,"MAPPING_NOT_FOUND")}}var x="shard:",k="multikey:",CJ="known_shards",E6=30000,T6=1e4;var d=HJ(()=>{K()});var e={};vJ(e,{validateTableForSharding:()=>r,schemaExists:()=>jJ,migrateRecord:()=>qJ,listTables:()=>p,integrateExistingDatabase:()=>bJ,dropSchema:()=>SJ,discoverExistingRecordsWithColumns:()=>a,discoverExistingPrimaryKeys:()=>i,createSchemaAcrossShards:()=>KJ,createSchema:()=>FJ,createMappingsForExistingKeys:()=>fJ,clearShardMigrationCache:()=>yJ,clearMigrationCache:()=>gJ,checkMigrationNeeded:()=>pJ,autoDetectAndMigrate:()=>hJ});async function kJ(J,$,X){if(J.length===0)return;let Y=Math.max(1,Math.min($,J.length)),Z=0,W=Array(Y).fill(null).map(async()=>{while(Z<J.length){let G=Z++,U=J[G];if(U===void 0)continue;await X(U,G)}});await Promise.all(W)}function I6(J,$,X,Y){let Z=X.length;switch(Y){case"hash":{let W=0;for(let U=0;U<J.length;U++){let H=J.charCodeAt(U);W=(W<<5)-W+H,W=W&W}let G=Math.abs(W)%Z;return X[G]}case"random":return X[Math.floor(Math.random()*Z)];default:return X[$%Z]}}async function FJ(J,$){let X=$.split(";").map((Y)=>Y.trim()).filter((Y)=>Y.length>0&&!Y.startsWith("--"));for(let Y of X)try{await J.prepare(Y).run()}catch(Z){throw console.error("Failed to execute schema statement:",Y,Z),new j(`Schema migration failed: ${Z}`,"SCHEMA_MIGRATION_FAILED")}}async function KJ(J,$){let X=Object.entries(J).map(([Y,Z])=>{return FJ(Z,$).catch((W)=>{throw new j(`Failed to create schema on shard ${Y}: ${W.message}`,"SCHEMA_CREATION_FAILED")})});await Promise.all(X)}async function jJ(J,$){try{return await J.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name=?").bind($).first()!==null}catch{return!1}}async function SJ(J,...$){for(let X of $)try{await J.prepare(`DROP TABLE IF EXISTS ${X}`).run()}catch(Y){console.error(`Failed to drop table ${X}:`,Y)}}async function p(J){try{return(await J.prepare("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name").all()).results.map((X)=>X.name)}catch{return[]}}async function qJ(J,$,X,Y){let Z=await J.prepare(`SELECT * FROM ${Y} WHERE id = ?`).bind(X).first();if(!Z)throw new j(`Record with primary key ${X} not found in source database`,"RECORD_NOT_FOUND");if(!await jJ($,Y))await FJ($,Y);let W=Object.keys(Z),G=W.map(()=>"?").join(", "),U=W.map((_)=>Z[_]),H=`INSERT OR REPLACE INTO ${Y} (${W.join(", ")}) VALUES (${G})`;await $.prepare(H).bind(...U).run(),await J.prepare(`DELETE FROM ${Y} WHERE id = ?`).bind(X).run()}async function i(J,$,X="id"){try{return(await J.prepare(`SELECT ${X} FROM ${$}`).all()).results.map((Z)=>String(Z[X]))}catch(Y){throw new j(`Failed to discover primary keys in table ${$}: ${Y}`,"DISCOVERY_FAILED")}}async function a(J,$,X="id"){try{let Y=`${$}_columns`,Z;if(OJ.has(Y))Z=OJ.get(Y).map((H)=>H.name);else{let _=(await J.prepare(`PRAGMA table_info(${$})`).all()).results.map((O)=>({name:O.name,type:O.type}));OJ.set(Y,_),Z=_.map((O)=>O.name)}let W=[X];if(Z.includes("username"))W.push("username");if(Z.includes("email"))W.push("email");if(Z.includes("name"))W.push("name");let G=`SELECT ${W.join(", ")} FROM ${$}`;return(await J.prepare(G).all()).results}catch(Y){throw new j(`Failed to discover records with columns in table ${$}: ${Y}`,"DISCOVERY_FAILED")}}async function fJ(J,$,X,Y,Z={}){if(J.length===0||$.length===0)return;let W=Math.max(1,Z.concurrency??25),G=J.map((U,H)=>({primaryKey:U,shard:I6(U,H,$,X)}));await Y.setShardMappingsBatch(G,{concurrency:W})}async function r(J,$,X){let Y=[],Z=0;try{if(!await J.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name=?").bind($).first())return Y.push(`Table '${$}' does not exist`),{isValid:!1,tableName:$,primaryKeyColumn:X,recordCount:0,issues:Y};if(!(await J.prepare(`PRAGMA table_info(${$})`).all()).results.some((_)=>_.name===X&&_.pk===1))Y.push(`Primary key column '${X}' not found or not set as primary key`);if(Z=(await J.prepare(`SELECT COUNT(*) as count FROM ${$}`).first())?.count||0,Z===0)Y.push(`Table '${$}' is empty`)}catch(W){Y.push(`Database validation error: ${W}`)}return{isValid:Y.length===0,tableName:$,primaryKeyColumn:X,recordCount:Z,issues:Y}}async function bJ(J,$,X,Y={}){let{tables:Z,primaryKeyColumn:W="id",strategy:G="hash",addShardMappingsTable:U=!0,dryRun:H=!1,migrateOtherColumns:_=!1,concurrency:O=25}=Y,F=Math.max(1,O),A=[],T=0,I=0,L=0;try{let V=(Z||await p(J)).filter((E)=>E!=="shard_mappings");for(let E of V)try{let M=await r(J,E,W);if(!M.isValid){A.push(`Table ${E}: ${M.issues.join(", ")}`);continue}if(_){let z=await a(J,E,W);if(z.length===0){A.push(`Table ${E} has no records to process`);continue}if(!H){let D=z.map((P)=>{let GJ=String(P[W]),h=[];if(P.username&&typeof P.username==="string")h.push(`username:${P.username}`);if(P.email&&typeof P.email==="string")h.push(`email:${P.email}`);if(P.name&&typeof P.name==="string")h.push(`name:${P.name}`);return{primaryKey:GJ,shard:$,additionalKeys:h}});await X.setShardMappingsBatch(D,{concurrency:F}),L+=D.length}I+=z.length}else{let z=await i(J,E,W);if(z.length===0){A.push(`Table ${E} has no records to process`);continue}if(!H){let D=z.map((P)=>({primaryKey:P,shard:$}));await X.setShardMappingsBatch(D,{concurrency:F}),L+=D.length}I+=z.length}T++}catch(M){A.push(`Failed to process table ${E}: ${M}`)}if(U&&!H){if(!(await p(J)).includes("shard_mappings"))await J.prepare(`
2
2
  CREATE TABLE IF NOT EXISTS shard_mappings (
3
3
  primary_key TEXT PRIMARY KEY,
4
4
  shard_name TEXT NOT NULL,
5
5
  created_at INTEGER NOT NULL,
6
6
  updated_at INTEGER NOT NULL
7
- );`.trim()).run()}if(!H)await Z.addKnownShard(Y)}catch(C){A.push(`Integration failed: ${C}`)}return{success:A.length===0||A.length>0&&E>0,shardName:Y,tablesProcessed:E,totalRecords:I,mappingsCreated:M,issues:A}}async function bJ(J,Y,Z,$={}){let{primaryKeyColumn:X="id",tablesToCheck:W,skipCache:G=!1,maxRecordsToCheck:U=1000,migrateOtherColumns:H=!1,concurrency:_=Z.migrationConcurrency??25}=$,O=Math.max(1,_),F=`${Y}_migration_check`;if(!G&&f.has(F))return{migrationNeeded:!1,migrationPerformed:!1,recordsMigrated:0,tablesProcessed:0,issues:[]};let A=[],E=0,I=0,M=!1,C=!1;try{let{KVShardMapper:V}=await Promise.resolve().then(() => (c(),HJ)),L=new V(Z.kv,{hashShardMappings:Z.hashShardMappings,mappingCacheTtlMs:Z.mappingCacheTtlMs,knownShardsCacheTtlMs:Z.knownShardsCacheTtlMs}),z=await p(J),R=W||z.filter((P)=>P!=="shard_mappings"&&!P.startsWith("sqlite_")&&P!=="sqlite_sequence");if(R.length===0)return f.set(F,!0),{migrationNeeded:!1,migrationPerformed:!1,recordsMigrated:0,tablesProcessed:0,issues:[]};for(let P of R)try{let Q=await a(J,P,X);if(!Q.isValid||Q.recordCount===0)continue;let WJ=Math.min(U,Q.recordCount),h=await J.prepare(`
8
- SELECT ${X} FROM ${P}
9
- ORDER BY ${X}
10
- LIMIT ?`.trim()).bind(WJ).all(),NJ=0,OY=h.results.slice(0,10).map(async(S)=>{let w=String(S[X]);return{key:w,mapping:await L.getShardMapping(w)}}),FY=await Promise.all(OY);for(let S of FY)if(!S.mapping)NJ++,M=!0;if(NJ>0){if(Z.debug)console.log(`Auto-migrating table ${P} in shard ${Y} (${Q.recordCount} records)`);if(H){let S=await t(J,P,X),w=[];if(await CJ(S,O,async(B)=>{let GJ=String(B[X]);if(await L.getShardMapping(GJ))return;let s=[];if(B.username&&typeof B.username==="string")s.push(`username:${B.username}`);if(B.email&&typeof B.email==="string")s.push(`email:${B.email}`);if(B.name&&typeof B.name==="string")s.push(`name:${B.name}`);w.push({primaryKey:GJ,shard:Y,additionalKeys:s})}),w.length>0)await L.setShardMappingsBatch(w,{concurrency:O});E+=w.length}else{let S=await i(J,P,X),w=[];if(await CJ(S,O,async(B)=>{if(!await L.getShardMapping(B))w.push({primaryKey:B,shard:Y})}),w.length>0)await L.setShardMappingsBatch(w,{concurrency:O});E+=w.length}if(I++,C=!0,Z.debug)console.log(`Auto-migrated ${E} records from table ${P}`)}}catch(Q){A.push(`Auto-migration failed for table ${P}: ${Q}`)}if(C){if(await L.addKnownShard(Y),!z.includes("shard_mappings"))await J.prepare(`CREATE TABLE IF NOT EXISTS shard_mappings (
7
+ );`.trim()).run()}if(!H)await X.addKnownShard($)}catch(B){A.push(`Integration failed: ${B}`)}return{success:A.length===0||A.length>0&&T>0,shardName:$,tablesProcessed:T,totalRecords:I,mappingsCreated:L,issues:A}}async function hJ(J,$,X,Y={}){let{primaryKeyColumn:Z="id",tablesToCheck:W,skipCache:G=!1,maxRecordsToCheck:U=1000,migrateOtherColumns:H=!1,concurrency:_=X.migrationConcurrency??25}=Y,O=Math.max(1,_),F=`${$}_migration_check`;if(!G&&f.has(F))return{migrationNeeded:!1,migrationPerformed:!1,recordsMigrated:0,tablesProcessed:0,issues:[]};let A=[],T=0,I=0,L=!1,B=!1;try{let{KVShardMapper:V}=await Promise.resolve().then(() => (d(),_J)),E=new V(X.kv,{hashShardMappings:X.hashShardMappings,mappingCacheTtlMs:X.mappingCacheTtlMs,knownShardsCacheTtlMs:X.knownShardsCacheTtlMs}),M=await p(J),z=W||M.filter((D)=>D!=="shard_mappings"&&!D.startsWith("sqlite_")&&D!=="sqlite_sequence");if(z.length===0)return f.set(F,!0),{migrationNeeded:!1,migrationPerformed:!1,recordsMigrated:0,tablesProcessed:0,issues:[]};for(let D of z)try{let P=await r(J,D,Z);if(!P.isValid||P.recordCount===0)continue;let GJ=Math.min(U,P.recordCount),h=await J.prepare(`
8
+ SELECT ${Z} FROM ${D}
9
+ ORDER BY ${Z}
10
+ LIMIT ?`.trim()).bind(GJ).all(),xJ=0,F6=h.results.slice(0,10).map(async(S)=>{let N=String(S[Z]);return{key:N,mapping:await E.getShardMapping(N)}}),j6=await Promise.all(F6);for(let S of j6)if(!S.mapping)xJ++,L=!0;if(xJ>0){if(X.debug)console.log(`Auto-migrating table ${D} in shard ${$} (${P.recordCount} records)`);if(H){let S=await a(J,D,Z),N=[];if(await kJ(S,O,async(w)=>{let UJ=String(w[Z]);if(await E.getShardMapping(UJ))return;let t=[];if(w.username&&typeof w.username==="string")t.push(`username:${w.username}`);if(w.email&&typeof w.email==="string")t.push(`email:${w.email}`);if(w.name&&typeof w.name==="string")t.push(`name:${w.name}`);N.push({primaryKey:UJ,shard:$,additionalKeys:t})}),N.length>0)await E.setShardMappingsBatch(N,{concurrency:O});T+=N.length}else{let S=await i(J,D,Z),N=[];if(await kJ(S,O,async(w)=>{if(!await E.getShardMapping(w))N.push({primaryKey:w,shard:$})}),N.length>0)await E.setShardMappingsBatch(N,{concurrency:O});T+=N.length}if(I++,B=!0,X.debug)console.log(`Auto-migrated ${T} records from table ${D}`)}}catch(P){A.push(`Auto-migration failed for table ${D}: ${P}`)}if(B){if(await E.addKnownShard($),!M.includes("shard_mappings"))await J.prepare(`CREATE TABLE IF NOT EXISTS shard_mappings (
11
11
  primary_key TEXT PRIMARY KEY,
12
12
  shard_name TEXT NOT NULL,
13
13
  created_at INTEGER NOT NULL,
14
14
  updated_at INTEGER NOT NULL
15
15
  );
16
- `).run()}if(f.set(F,!0),C&&Z.debug)console.log(`Auto-migration completed for shard ${Y}: ${E} records from ${I} tables`)}catch(V){A.push(`Auto-migration error: ${V}`)}return{migrationNeeded:M,migrationPerformed:C,recordsMigrated:E,tablesProcessed:I,issues:A}}async function hJ(J,Y,Z){let $=`${Y}_migration_check`;if(f.has($))return!1;try{let X=await p(J);if(X.includes("shard_mappings"))return f.set($,!0),!1;let{KVShardMapper:G}=await Promise.resolve().then(() => (c(),HJ)),U=new G(Z.kv,{hashShardMappings:Z.hashShardMappings,mappingCacheTtlMs:Z.mappingCacheTtlMs,knownShardsCacheTtlMs:Z.knownShardsCacheTtlMs}),H=X.filter((_)=>_!=="shard_mappings"&&!_.startsWith("sqlite_")&&_!=="sqlite_sequence");for(let _ of H.slice(0,3))try{if(((await J.prepare(`SELECT COUNT(*) as count FROM ${_} LIMIT 1`).first())?.count||0)>0){let A=await J.prepare(`SELECT id FROM ${_} LIMIT 1`).first();if(A){let E=String(A.id);if(!await U.getShardMapping(E))return!0}}}catch{continue}return!1}catch{return!1}}function pJ(){f.clear()}function yJ(J){let Y=`${J}_migration_check`;f.delete(Y)}var f,_J;var d=UJ(()=>{q();f=new Map,_J=new Map});q();c();var o=null,y=null,m=new Map,u=0;function v(J){if(!y)y=new K(J.kv,{hashShardMappings:J.hashShardMappings,mappingCacheTtlMs:J.mappingCacheTtlMs,knownShardsCacheTtlMs:J.knownShardsCacheTtlMs});return y}function QY(J){o=J,y=new K(J.kv,{hashShardMappings:J.hashShardMappings,mappingCacheTtlMs:J.mappingCacheTtlMs,knownShardsCacheTtlMs:J.knownShardsCacheTtlMs}),m.clear(),u=0;try{let Y=v(J);Promise.resolve().then(async()=>{let Z=await Y.getKnownShards(),$=Array.from(new Set([...Z,...Object.keys(J.shards)]));await Y.setKnownShards($)}).catch(()=>{return})}catch{}if(J.shards&&Object.keys(J.shards).length>0&&!J.disableAutoMigration)cJ(J).catch((Y)=>{console.warn("Background auto-migration failed:",Y)})}async function mJ(J){o=J,y=new K(J.kv,{hashShardMappings:J.hashShardMappings,mappingCacheTtlMs:J.mappingCacheTtlMs,knownShardsCacheTtlMs:J.knownShardsCacheTtlMs}),m.clear(),u=0;try{let Y=v(J),Z=await Y.getKnownShards(),$=Array.from(new Set([...Z,...Object.keys(J.shards)]));await Y.setKnownShards($)}catch{}if(J.shards&&Object.keys(J.shards).length>0&&!J.disableAutoMigration)try{await cJ(J)}catch(Y){console.warn("Auto migration failed:",Y)}}async function PY(J,Y){return await mJ(J),await Y()}async function cJ(J){try{let{autoDetectAndMigrate:Y}=await Promise.resolve().then(() => (d(),r)),Z=Object.keys(J.shards);if(J.debug)console.log(`\uD83D\uDD0D Checking ${Z.length} shards for existing data...`);let $=Z.map(async(G)=>{let U=J.shards[G];if(!U)return null;try{let H=await Y(U,G,J,{maxRecordsToCheck:1000});return{shardName:G,...H}}catch(H){return console.warn(`Auto-migration failed for shard ${G}:`,H),null}}),W=(await Promise.all($)).filter((G)=>G?.migrationPerformed);if(J.debug)if(W.length>0){let G=W.reduce((U,H)=>U+(H?.recordsMigrated||0),0);console.log(`\uD83C\uDF89 Auto-migration completed! Migrated ${G} records across ${W.length} shards`),W.forEach((U)=>{if(U)console.log(` ✅ ${U.shardName}: ${U.recordsMigrated} records from ${U.tablesProcessed} tables`)})}else console.log("✅ All shards ready - no migration needed")}catch(Y){console.warn("Background auto-migration setup failed:",Y)}}function TY(){o=null,y=null,m.clear(),u=0}function T(){if(!o)throw new j("CollegeDB not initialized. Call initialize() first.","NOT_INITIALIZED");return o}function DY(J){let Y=J.trim().toUpperCase();if(Y.startsWith("SELECT")||Y.startsWith("VALUES")||Y.startsWith("TABLE")||Y.startsWith("PRAGMA")||Y.startsWith("EXPLAIN")||Y.startsWith("WITH")||Y.startsWith("SHOW"))return"read";return"write"}function dJ(J,Y){let Z=J.strategy||"hash";if(typeof Z==="string")return Z;let $=Z;return $[Y]||$.write||$.read||"hash"}function RY(J,Y){if(J===Y)return 0;let Z={wnam:{lat:37.7749,lon:-122.4194},enam:{lat:40.7128,lon:-74.006},weur:{lat:51.5074,lon:-0.1278},eeur:{lat:52.52,lon:13.405},apac:{lat:35.6762,lon:139.6503},oc:{lat:-33.8688,lon:151.2093},me:{lat:25.2048,lon:55.2708},af:{lat:-26.2041,lon:28.0473}},$=Z[J],X=Z[Y],W=$.lat-X.lat,G=$.lon-X.lon;return Math.sqrt(W*W+G*G)}function zY(J){let Y=J.cf;if(!Y||!Y.country)return"wnam";let{country:Z,continent:$}=Y;if(["US","CA","MX"].includes(Z)){let X=Y.region||Y.regionCode||"",W=Y.timezone||"";if(X.includes("CA")||X.includes("WA")||X.includes("OR")||X.includes("NV")||X.includes("AZ")||X.includes("UT")||W.includes("Pacific")||W.includes("America/Los_Angeles"))return"wnam";return"enam"}if(["GL","PM","BM"].includes(Z))return"enam";if(["GB","IE","FR","ES","PT","NL","BE","LU","CH","AT","IT"].includes(Z))return"weur";if(["DE","PL","CZ","SK","HU","SI","HR","BA","RS","ME","MK","AL","BG","RO","MD","UA","BY","LT","LV","EE","FI","SE","NO","DK","IS"].includes(Z))return"eeur";if(Z==="RU")return"eeur";if(["JP","KR","CN","HK","TW","MO","MN","KP"].includes(Z))return"apac";if(["TH","VN","SG","MY","ID","PH","BN","KH","LA","MM","TL","IN","PK","BD","LK","NP","BT","MV","AF"].includes(Z))return"apac";if(["AU","NZ","PG","FJ","NC","VU","SB","WS","TO","KI","NR","PW","FM","MH","TV"].includes(Z))return"oc";if(["AE","SA","QA","KW","BH","OM","YE","IQ","IR","SY","LB","JO","IL","PS","TR","CY"].includes(Z))return"me";if($==="AF"||["EG","LY","TN","DZ","MA","SD","SS","ET","ER","DJ","SO"].includes(Z))return"af";if(["KZ","UZ","TM","TJ","KG"].includes(Z))return"eeur";if($==="SA"||["BR","AR","CL","PE","CO","VE","EC","BO","PY","UY","GY","SR","GF"].includes(Z))return"enam";if(["GT","BZ","SV","HN","NI","CR","PA","CU","JM","HT","DO","PR","TT","BB","GD","VC","LC","DM","AG","KN"].includes(Z))return"enam";return"wnam"}function MY(J){if(typeof J==="string")return J;return J.region||"wnam"}async function e(J){try{let[Y,Z]=await Promise.all([J.prepare("PRAGMA page_count").first(),J.prepare("PRAGMA page_size").first()]);if(!Y?.page_count||!Z?.page_size)throw new j("Failed to retrieve database size information","SIZE_QUERY_FAILED");return Y.page_count*Z.page_size}catch(Y){throw new j(`Failed to get database size: ${Y instanceof Error?Y.message:"Unknown error"}`,"SIZE_QUERY_FAILED")}}async function BY(J,Y){let Z=Math.max(0,Y.sizeCacheTtlMs??30000),$=m.get(J);if($&&$.expiresAt>=Date.now())return $.size;let X=Y.shards[J];if(!X)throw new j(`Shard ${J} not found in configuration`,"SHARD_NOT_FOUND");let W=await e(X);if(Z>0)m.set(J,{size:W,expiresAt:Date.now()+Z});return W}async function oJ(J,Y){if(typeof Y.maxDatabaseSize!=="number"||!Number.isFinite(Y.maxDatabaseSize)||Y.maxDatabaseSize<=0)return J;let Z=Y.maxDatabaseSize,X=(await Promise.allSettled(J.map(async(W)=>{let G=await BY(W,Y);return{shard:W,size:G,withinLimit:G<Z}}))).filter((W)=>W.status==="fulfilled"&&W.value.withinLimit).map((W)=>W.value.shard);if(X.length===0){if(Y.debug)console.warn("All shards exceed maxDatabaseSize limit. Allowing allocation to prevent failure.");return J}if(Y.debug&&X.length<J.length){let W=J.filter((G)=>!X.includes(G));console.log(`Excluded ${W.length} shards due to size limits: ${W.join(", ")}`)}return X}function wY(J,Y,Z,$){let X=Y.filter((O)=>Z[O]);if(X.length===0){let O=0;for(let A=0;A<$.length;A++){let E=$.charCodeAt(A);O=(O<<5)-O+E,O=O&O}let F=Math.abs(O)%Y.length;return Y[F]}let W=X.map((O)=>{let F=Z[O],A=RY(J,MY(F)),E=typeof F==="object"?F.priority||1:1,I=A-E*0.1;return{shard:O,score:I,distance:A,priority:E}});W.sort((O,F)=>O.score-F.score);let G=W[0].score,U=W.filter((O)=>Math.abs(O.score-G)<0.01);if(U.length===1)return U[0].shard;let H=0;for(let O=0;O<$.length;O++){let F=$.charCodeAt(O);H=(H<<5)-H+F,H=H&H}let _=Math.abs(H)%U.length;return U[_].shard}function g(J,Y,Z,$){switch(J){case"hash":{let X=0;for(let G=0;G<Y.length;G++){let U=Y.charCodeAt(G);X=(X<<5)-X+U,X=X&X}let W=Math.abs(X)%Z.length;return Z[W]||Z[0]}case"location":{if(!$.targetRegion)return g("hash",Y,Z,$);return wY($.targetRegion,Z,$.shardLocations||{},Y)}case"random":return Z[Math.floor(Math.random()*Z.length)]||Z[0];default:return g("hash",Y,Z,$)}}async function nJ(J,Y="write"){let Z=T(),$=v(Z),X=await $.getShardMapping(J);if(X)return X.shard;let W=Object.keys(Z.shards);if(W.length===0)throw new j("No shards configured","NO_SHARDS");let G=await oJ(W,Z),U,H=dJ(Z,Y);if(Z.coordinator)try{let _=Z.coordinator.idFromName("default"),F=await Z.coordinator.get(_).fetch("http://coordinator/allocate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({primaryKey:J,strategy:H,operationType:Y,targetRegion:Z.targetRegion,shardLocations:Z.shardLocations,availableShards:G})});if(F.ok)U=(await F.json()).shard;else U=g(H,J,G,Z)}catch(_){console.warn("Coordinator allocation failed, falling back to local strategy:",_),U=g(H,J,G,Z)}else U=g(H,J,G,Z);return await $.setShardMapping(J,U),U}async function NY(J,Y="write"){let Z=T(),$=await nJ(J,Y),X=Z.shards[$];if(!X)throw new j(`Shard ${$} not found in configuration`,"SHARD_NOT_FOUND");return X}async function xY(J,Y){let{createSchema:Z}=await Promise.resolve().then(() => (d(),r));await Z(J,Y)}async function JJ(J,Y){let Z=DY(Y);return(await NY(J,Z)).prepare(Y)}async function lJ(J,Y,Z=[]){let X=await(await JJ(J,Y)).bind(...Z).run();if(!X.success)throw new j(`Query failed: ${X.error||"Unknown error"}`,"QUERY_FAILED");return X}function vY(J){let Y=J.results[0];if(Y&&typeof Y==="object"){for(let $ of["id","ID","Id","rowid","ROWID","RowId","last_row_id","lastInsertId","insertId"]){let X=Y[$];if(X!==void 0&&X!==null)return X}for(let[$,X]of Object.entries(Y)){let W=$.toLowerCase();if((W==="id"||W==="rowid")&&(typeof X==="number"||typeof X==="string"))return X}for(let $ of Object.values(Y))if(typeof $==="number"||typeof $==="string")return $}let Z=J.meta.last_row_id;if(Z!==void 0&&Z!==null)return Z;return}function CY(){return`insert:${Date.now()}:${Math.random().toString(36).slice(2)}`}async function kY(){let J=T(),Y=Object.keys(J.shards);if(Y.length===0)throw new j("No shards configured","NO_SHARDS");let Z=await oJ(Y,J);if(Z.length===0)throw new j("No shards available for insert","NO_SHARDS");let $=dJ(J,"write"),X=CY();if(J.coordinator)try{let W=J.coordinator.idFromName("default"),U=await J.coordinator.get(W).fetch("http://coordinator/allocate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({primaryKey:X,strategy:$,operationType:"write",targetRegion:J.targetRegion,shardLocations:J.shardLocations,availableShards:Z})});if(U.ok)return(await U.json()).shard}catch(W){console.warn("Coordinator allocation for insert failed, falling back to local strategy:",W)}if($==="round-robin"){let W=Z[u%Z.length];return u=(u+1)%Z.length,W}return g($,X,Z,J)}async function sJ(J,Y,Z=[]){let $=T();if(!$.shards[J])throw new j(`Shard ${J} not found`,"SHARD_NOT_FOUND");let W=/\breturning\b/i.test(Y)?await YJ(J,Y,Z):await jJ(J,Y,Z),G=vY(W);if(G===void 0)throw new j("Insert did not return a generated primary key","GENERATED_KEY_UNAVAILABLE");return await v($).setShardMapping(String(G),J),{...W,generatedId:G}}async function qY(J,Y=[]){let Z=await kY();return await sJ(Z,J,Y)}async function SY(J,Y,Z=[]){return await sJ(J,Y,Z)}async function iJ(J,Y,Z=[]){let X=await(await JJ(J,Y)).bind(...Z).all();if(!X.success)throw new j(`Query failed: ${X.error||"Unknown error"}`,"QUERY_FAILED");return X}async function tJ(J,Y,Z=[]){return await(await JJ(J,Y)).bind(...Z).first()}async function KY(J,Y,Z=[],$=50){let X=T(),G=await v(X).getShardMapping(J);if(G){if(X.shards[G.shard]){let _=await YJ(G.shard,Y,Z);if(_.success&&_.results.length>0)return _}}let U=await ZJ(Y,Z,$);return rJ(U)}async function fY(J,Y,Z=[],$=50){let X=T(),G=await v(X).getShardMapping(J);if(G){if(X.shards[G.shard]){let _=await AJ(G.shard,Y,Z);if(_!==null)return _}}return(await JY(Y,Z,$)).find((H)=>H!==null)??null}async function bY(J,Y,Z){let $=T();if(!$.shards[Y])throw new j(`Shard ${Y} not found in configuration`,"SHARD_NOT_FOUND");let X=v($),W=await X.getShardMapping(J);if(!W)throw new j(`No existing mapping found for primary key: ${J}`,"MAPPING_NOT_FOUND");if(W.shard!==Y){let{migrateRecord:G}=await Promise.resolve().then(() => (d(),r)),U=$.shards[W.shard],H=$.shards[Y];if(!U||!H)throw new j("Source or target shard not available","SHARD_UNAVAILABLE");await G(U,H,J,Z)}await X.updateShardMapping(J,Y)}async function hY(){let J=T();if(J.coordinator)try{let Y=J.coordinator.idFromName("default"),$=await J.coordinator.get(Y).fetch("http://coordinator/shards");if($.ok)return await $.json()}catch(Y){console.warn("Failed to get shards from coordinator:",Y)}try{let Z=await v(J).getKnownShards(),$=new Set([...Object.keys(J.shards),...Z]);return Array.from($)}catch{return Object.keys(J.shards)}}async function pY(){let J=T();if(J.coordinator)try{let X=J.coordinator.idFromName("default"),G=await J.coordinator.get(X).fetch("http://coordinator/stats");if(G.ok)return await G.json()}catch(X){console.warn("Failed to get stats from coordinator:",X)}let Y=v(J),Z=await Y.getShardKeyCounts(),$=Object.keys(J.shards);try{let X=await Y.getKnownShards();$=Array.from(new Set([...$,...X]))}catch{}return $.map((X)=>({binding:X,count:Z[X]||0}))}async function jJ(J,Y,Z=[]){let X=T().shards[J];if(!X)throw new j(`Shard ${J} not found`,"SHARD_NOT_FOUND");let W=await X.prepare(Y).bind(...Z).run();if(!W.success)throw new j(`Query failed: ${W.error||"Unknown error"}`,"QUERY_FAILED");return W}async function YJ(J,Y,Z=[]){let X=T().shards[J];if(!X)throw new j(`Shard ${J} not found`,"SHARD_NOT_FOUND");return await X.prepare(Y).bind(...Z).all()}async function AJ(J,Y,Z=[]){let X=T().shards[J];if(!X)throw new j(`Shard ${J} not found`,"SHARD_NOT_FOUND");return await X.prepare(Y).bind(...Z).first()}async function aJ(J,Y=[],Z=50){let $=T(),X=[];for(let[G,U]of Object.entries($.shards)){if(!G||!U){console.error(`Shard ${G??"<null>"} not found, skipping`);continue}X.push(()=>U.prepare(J).bind(...Y).run().catch((H)=>{return console.error(`Error executing query on shard ${G}:`,H),{success:!1,results:[],error:H instanceof Error?H.message:String(H),meta:{duration:0}}}))}let W=[];for(let G=0;G<X.length;G+=Z){let U=X.slice(G,G+Z).map((H)=>H());W.push(...await Promise.all(U))}return W}async function ZJ(J,Y=[],Z=50){let $=T(),X=[];for(let[G,U]of Object.entries($.shards)){if(!G||!U){console.error(`Shard ${G??"<null>"} not found, skipping`);continue}X.push(()=>U.prepare(J).bind(...Y).all().catch((H)=>{return console.error(`Error executing query on shard ${G}:`,H),{success:!1,results:[],error:H instanceof Error?H.message:String(H),meta:{duration:0}}}))}let W=[];for(let G=0;G<X.length;G+=Z){let U=X.slice(G,G+Z).map((H)=>H());W.push(...await Promise.all(U))}return W}function n(J,Y=50){if(!Number.isFinite(J??Y))return Y;return Math.max(1,Math.floor(J??Y))}function yY(J){if(!Number.isFinite(J??0))return 0;return Math.max(0,Math.floor(J??0))}function uY(J){if(J===void 0)return;if(!Number.isFinite(J))return;return Math.max(0,Math.floor(J))}function uJ(J,Y){if(typeof Y==="function")return Y(J);if(!Y||typeof J!=="object"||J===null)return;return J[String(Y)]}function gY(J,Y){if(J===Y)return 0;if(J===null||J===void 0)return 1;if(Y===null||Y===void 0)return-1;if(typeof J==="number"&&typeof Y==="number")return J-Y;if(typeof J==="bigint"&&typeof Y==="bigint")return J<Y?-1:1;if(J instanceof Date&&Y instanceof Date)return J.getTime()-Y.getTime();if(typeof J==="boolean"&&typeof Y==="boolean")return Number(J)-Number(Y);return String(J).localeCompare(String(Y),void 0,{numeric:!0,sensitivity:"base"})}function rJ(J){let Y=J.flatMap((W)=>W.results||[]),Z=J.filter((W)=>!W.success),$=J.reduce((W,G)=>W+(G.meta?.duration||0),0);if(Z.length===0)return{success:!0,results:Y,meta:{duration:$}};let X=Z.map((W)=>W.error||"Unknown shard query error").filter(Boolean).join("; ");return{success:!1,results:Y,error:X||"One or more shard queries failed",meta:{duration:$}}}async function eJ(J,Y=[],Z={}){let $=n(Z.batchSize),X=yY(Z.offset),W=uY(Z.limit),G=rJ(await ZJ(J,Y,$)),U=G.results;if(Z.filter)U=U.filter((O)=>Z.filter?.(O));if(Z.comparator)U=[...U].sort(Z.comparator);else if(Z.sortBy){let O=Z.sortDirection==="desc"?-1:1;U=[...U].sort((F,A)=>{let E=uJ(F,Z.sortBy),I=uJ(A,Z.sortBy);return gY(E,I)*O})}let H=W===void 0?void 0:X+W,_=U.slice(X,H);return{...G,results:_}}async function JY(J,Y=[],Z=50){let $=T(),X=[];for(let[G,U]of Object.entries($.shards)){if(!G||!U){console.error(`Shard ${G??"<null>"} not found, skipping`);continue}X.push(()=>U.prepare(J).bind(...Y).first().catch((H)=>{return console.error(`Error executing query on shard ${G}:`,H),null}))}let W=[];for(let G=0;G<X.length;G+=Z){let U=X.slice(G,G+Z).map((H)=>H());W.push(...await Promise.all(U))}return W}async function mY(J,Y=[],Z={}){return(await eJ(J,Y,{...Z,limit:1})).results[0]??null}async function cY(){let J=T();if(await v(J).clearAllMappings(),m.clear(),J.coordinator)try{let Z=J.coordinator.idFromName("default");await J.coordinator.get(Z).fetch("http://coordinator/flush",{method:"POST"})}catch(Z){console.warn("Failed to flush coordinator:",Z)}}async function dY(J){let Z=T().shards[J];if(!Z)throw new j(`Shard ${J} not found`,"SHARD_NOT_FOUND");return await e(Z)}var oY=/^[A-Za-z_][A-Za-z0-9_]*$/;function b(J){let Y=J.trim();if(!Y)throw new j("Identifier cannot be empty","INVALID_IDENTIFIER");let Z=Y.split(".").map(($)=>$.trim());if(Z.some(($)=>!$||!oY.test($)))throw new j(`Invalid SQL identifier: ${J}`,"INVALID_IDENTIFIER");return Z.map(($)=>`"${$}"`).join(".")}function gJ(J){return J.toLowerCase().replace(/[^a-z0-9_]+/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"")}function nY(J){if(typeof J==="string")return[{name:J}];if(!Array.isArray(J)||J.length===0)throw new j("At least one index column is required","INVALID_INDEX_COLUMNS");return J.map((Y)=>{if(typeof Y==="string")return{name:Y};if(!Y?.name)throw new j("Index column name is required","INVALID_INDEX_COLUMNS");return{name:Y.name,order:Y.order,collate:Y.collate}})}function VJ(J,Y,Z={}){let $=nY(Y),X=b(J),W=Z.indexName?Z.indexName:["idx",gJ(J),...$.map((F)=>gJ(F.name))].filter(Boolean).join("_").slice(0,120),G=b(W||"idx_auto"),U=$.map((F)=>{let A=b(F.name),E=F.order?` ${F.order}`:"",I=F.collate?` COLLATE ${b(F.collate).replace(/"/g,"")}`:"";return`${A}${I}${E}`}).join(", "),H=Z.ifNotExists===!1?"":" IF NOT EXISTS",_=Z.unique?"UNIQUE ":"",O=Z.where?.trim()?` WHERE ${Z.where.trim()}`:"";return`CREATE ${_}INDEX${H} ${G} ON ${X} (${U})${O}`}async function lY(J,Y,Z,$={}){let X=VJ(Y,Z,$);return lJ(J,X)}async function sY(J,Y,Z,$={}){let X=VJ(Y,Z,$);return jJ(J,X)}async function iY(J,Y,Z={}){let $=VJ(J,Y,Z);return aJ($,[],n(Z.batchSize))}function LJ(J,Y="query-plan"){switch(Y){case"raw":return`EXPLAIN ${J}`;case"analyze":return`EXPLAIN ANALYZE ${J}`;case"query-plan":default:return`EXPLAIN QUERY PLAN ${J}`}}async function tY(J,Y,Z=[],$={}){return iJ(J,LJ(Y,$.mode),Z)}async function aY(J,Y,Z=[],$={}){return YJ(J,LJ(Y,$.mode),Z)}async function rY(J,Y=[],Z={}){return ZJ(LJ(J,Z.mode),Y,n(Z.batchSize))}async function eY(J,Y){let Z=b(Y),$=await tJ(J,`SELECT COUNT(*) AS row_count FROM ${Z}`);if(!$||$.row_count===void 0||$.row_count===null)return 0;return Number($.row_count)||0}async function JZ(J,Y){let Z=b(Y),$=await AJ(J,`SELECT COUNT(*) AS row_count FROM ${Z}`);if(!$||$.row_count===void 0||$.row_count===null)return 0;return Number($.row_count)||0}async function YZ(J,Y=50){let Z=T(),$=n(Y),W=`SELECT COUNT(*) AS row_count FROM ${b(J)}`,G=[];for(let[_,O]of Object.entries(Z.shards)){if(!_||!O)continue;G.push(async()=>{try{let F=await O.prepare(W).first(),A=Number(F?.row_count??0);return{shard:_,count:Number.isFinite(A)?A:0,success:!0}}catch(F){return{shard:_,count:null,success:!1,error:F instanceof Error?F.message:String(F)}}})}let U=[];for(let _=0;_<G.length;_+=$){let O=G.slice(_,_+$).map((F)=>F());U.push(...await Promise.all(O))}return{total:U.reduce((_,O)=>_+(O.count??0),0),shards:U}}async function ZZ(J){let Y=T(),Z=await nJ(J,"read"),$=Y.shards[Z];if(!$)throw new j(`Shard ${Z} not found in configuration`,"SHARD_NOT_FOUND");return e($)}async function YY(J=50){let Y=T(),Z=n(J),$=[];for(let[W,G]of Object.entries(Y.shards)){if(!W||!G)continue;$.push(async()=>{try{return{shard:W,size:await e(G),success:!0}}catch(U){return{shard:W,size:null,success:!1,error:U instanceof Error?U.message:String(U)}}})}let X=[];for(let W=0;W<$.length;W+=Z){let G=$.slice(W,W+Z).map((U)=>U());X.push(...await Promise.all(G))}return X}async function $Z(J=50){return(await YY(J)).reduce((Z,$)=>Z+($.size??0),0)}q();class ZY{state;constructor(J){this.state=J}async getState(){return await this.state.storage.get("coordinator_state")||{knownShards:[],shardStats:{},strategy:"round-robin",roundRobinIndex:0}}async saveState(J){await this.state.storage.put("coordinator_state",J)}async fetch(J){let Z=new URL(J.url).pathname,$=J.method;try{switch(`${$} ${Z}`){case"GET /shards":return this.handleListShards();case"POST /shards":return this.handleAddShard(J);case"DELETE /shards":return this.handleRemoveShard(J);case"GET /stats":return this.handleGetStats();case"POST /stats":return this.handleUpdateStats(J);case"POST /allocate":return this.handleAllocateShard(J);case"POST /flush":return this.handleFlush();case"GET /health":return new Response("OK",{status:200});default:return new Response("Not Found",{status:404})}}catch(X){return console.error("ShardCoordinator error:",X),new Response("Internal Server Error",{status:500})}}async handleListShards(){let J=await this.getState();return new Response(JSON.stringify(J.knownShards),{headers:{"Content-Type":"application/json"}})}async handleAddShard(J){let{shard:Y}=await J.json();if(!Y||typeof Y!=="string")return new Response(JSON.stringify({error:"Missing or invalid shard parameter"}),{status:400,headers:{"Content-Type":"application/json"}});let Z=await this.getState();if(!Z.knownShards.includes(Y))Z.knownShards.push(Y),Z.shardStats[Y]={binding:Y,count:0,lastUpdated:Date.now()},await this.saveState(Z);return new Response(JSON.stringify({success:!0}),{headers:{"Content-Type":"application/json"}})}async handleRemoveShard(J){let{shard:Y}=await J.json();if(!Y||typeof Y!=="string")return new Response(JSON.stringify({error:"Missing or invalid shard parameter"}),{status:400,headers:{"Content-Type":"application/json"}});let Z=await this.getState(),$=Z.knownShards.indexOf(Y);if($>-1){if(Z.knownShards.splice($,1),delete Z.shardStats[Y],Z.roundRobinIndex>=Z.knownShards.length)Z.roundRobinIndex=0;await this.saveState(Z)}return new Response(JSON.stringify({success:!0}),{headers:{"Content-Type":"application/json"}})}async handleGetStats(){let J=await this.getState(),Y=Object.values(J.shardStats);return new Response(JSON.stringify(Y),{headers:{"Content-Type":"application/json"}})}async handleUpdateStats(J){let{shard:Y,count:Z}=await J.json();if(!Y||typeof Y!=="string")return new Response(JSON.stringify({error:"Missing or invalid shard parameter"}),{status:400,headers:{"Content-Type":"application/json"}});if(Z===void 0||typeof Z!=="number")return new Response(JSON.stringify({error:"Missing or invalid count parameter"}),{status:400,headers:{"Content-Type":"application/json"}});let $=await this.getState();if($.shardStats[Y])$.shardStats[Y].count=Z,$.shardStats[Y].lastUpdated=Date.now(),await this.saveState($);return new Response(JSON.stringify({success:!0}),{headers:{"Content-Type":"application/json"}})}async handleAllocateShard(J){let{primaryKey:Y,strategy:Z,operationType:$,availableShards:X}=await J.json();if(!Y||typeof Y!=="string")return new Response(JSON.stringify({error:"Missing or invalid primaryKey parameter"}),{status:400,headers:{"Content-Type":"application/json"}});let W=await this.getState(),G=X||W.knownShards;if(G.length===0)return new Response(JSON.stringify({error:"No shards available"}),{status:400,headers:{"Content-Type":"application/json"}});let U=this.resolveStrategy(W.strategy,Z,$||"write"),H=this.selectShard(Y,W,U,G);if(U==="round-robin")W.roundRobinIndex=(W.roundRobinIndex+1)%G.length,await this.saveState(W);return new Response(JSON.stringify({shard:H}),{headers:{"Content-Type":"application/json"}})}async handleFlush(){return await this.state.storage.deleteAll(),new Response(JSON.stringify({success:!0}),{headers:{"Content-Type":"application/json"}})}resolveStrategy(J,Y,Z="write"){if(Y)return Y;if(typeof J==="string")return J;return J[Z]}selectShard(J,Y,Z,$){let X=$||Y.knownShards;if(X.length===0)throw new j("No shards available","NO_SHARDS");switch(Z){case"round-robin":return X[Y.roundRobinIndex]??X[0];case"random":return X[Math.floor(Math.random()*X.length)];case"hash":{let W=0;for(let U=0;U<J.length;U++){let H=J.charCodeAt(U);W=(W<<5)-W+H,W=W&W}let G=Math.abs(W)%X.length;return X[G]}case"location":{let W=Y.targetRegion,G=Y.shardLocations||{},U=X.filter((V)=>G[V]);if(!W||U.length===0){let V=0;for(let z=0;z<J.length;z++){let R=J.charCodeAt(z);V=(V<<5)-V+R,V=V&V}let L=Math.abs(V)%X.length;return X[L]}let H={wnam:{lat:37.7749,lon:-122.4194},enam:{lat:40.7357,lon:-74.1724},weur:{lat:51.5074,lon:-0.1278},eeur:{lat:52.2297,lon:21.0122},apac:{lat:35.6762,lon:139.6503},oc:{lat:-33.8688,lon:151.2093},me:{lat:25.2048,lon:55.2708},af:{lat:-26.2041,lon:28.0473}},_=(V,L)=>(L in V),O=(V)=>_(H,V)?V:"wnam",F=(V,L)=>{let z=H[O(V)],R=H[O(L)],P=z.lat-R.lat,Q=z.lon-R.lon;return Math.sqrt(P*P+Q*Q)},A=U.map((V)=>{let L=G[V],z=F(W,L.region),R=L.priority||1;return{shard:V,score:z-R*0.1}});A.sort((V,L)=>V.score-L.score);let E=A[0].score,I=A.filter((V)=>Math.abs(V.score-E)<0.01);if(I.length===1)return I[0].shard;let M=0;for(let V=0;V<J.length;V++){let L=J.charCodeAt(V);M=(M<<5)-M+L,M=M&M}let C=Math.abs(M)%I.length;return I[C].shard}default:return X[0]}}async incrementShardCount(J){let Y=await this.getState();if(Y.shardStats[J])Y.shardStats[J].count++,Y.shardStats[J].lastUpdated=Date.now(),await this.saveState(Y)}async decrementShardCount(J){let Y=await this.getState();if(Y.shardStats[J]&&Y.shardStats[J].count>0)Y.shardStats[J].count--,Y.shardStats[J].lastUpdated=Date.now(),await this.saveState(Y)}}q();c();q();var XZ=500;function WY(J,Y={}){let Z=Y.scanCount??XZ;return{async get($,X="text"){let W=await J.get($);if(W===null)return null;if(X!=="json")return W;try{return JSON.parse(W)}catch(G){throw new j(`Failed to parse JSON from Redis for key ${$}: ${G instanceof Error?G.message:String(G)}`,"KV_JSON_PARSE_FAILED")}},async put($,X){await J.set($,X)},async delete($){await J.del($)},async list($){let X=$?.prefix??"",W=`${X}*`,G=$?.cursor??"0",U=$?.limit,H=[];do{let _=await jZ(J,G,W,Z);G=_.cursor;for(let O of _.keys){if(!X||O.startsWith(X))H.push(O);if(U&&H.length>=U)break}if(U&&H.length>=U)break}while(G!=="0");return{keys:H.map((_)=>({name:_})),cursor:G,list_complete:G==="0"}}}}function WZ(J,Y={}){return WY(J,Y)}function GY(J,Y){if(Y)return XJ(J,Y);return{prepare(Z){return new DJ(J,Z)}}}function UY(J,Y){if(Y)return XJ(J,Y);return{prepare(Z){return new RJ(J,Z)}}}function GZ(J,Y){if(Y)return XJ(J,Y);return{prepare(Z){return new zJ(J,Z)}}}function XJ(J,Y){return{prepare(Z){return new MJ(J,Y,Z)}}}function UZ(J){return{async get(Y,Z="text"){let $=await EZ(J,Y);if($===null||$===void 0)return null;if(Z==="json"){if(typeof $==="string")try{return JSON.parse($)}catch(X){throw new j(`Failed to parse JSON from NuxtHub KV for key ${Y}: ${X instanceof Error?X.message:String(X)}`,"KV_JSON_PARSE_FAILED")}return $}return typeof $==="string"?$:JSON.stringify($)},async put(Y,Z){await IZ(J,Y,Z)},async delete(Y){await QZ(J,Y)},async list(Y){let Z=Y?.prefix??"",$=await PZ(J,Z);return{keys:(typeof Y?.limit==="number"?$.slice(0,Y.limit):$).map((W)=>({name:W})),list_complete:!0}}}}function HZ(J,Y){return GY({query:async($,X=[])=>{let W=Y(J.connectionString);if(typeof W.connect==="function")await W.connect();try{return await W.query($,X)}finally{if(typeof W.release==="function")W.release();else if(typeof W.end==="function")await W.end()}}})}function _Z(J,Y){return UY({execute:async($,X=[])=>{let W=Y(J.connectionString);try{if(typeof W.execute==="function")return await W.execute($,X);if(typeof W.query==="function")return await W.query($,X);throw new j("Hyperdrive MySQL client is missing execute/query methods","MYSQL_CLIENT_INVALID")}finally{if(typeof W.end==="function")await W.end();else if(typeof W.close==="function")await W.close();else if(typeof W.destroy==="function")W.destroy()}}})}function OZ(J){if(!J||typeof J!=="object")return!1;return typeof J.prepare==="function"}function FZ(J){if(!J||typeof J!=="object")return!1;let Y=J;return typeof Y.get==="function"&&typeof Y.put==="function"&&typeof Y.delete==="function"&&typeof Y.list==="function"}class DJ{client;sql;bindings;constructor(J,Y,Z=[]){this.client=J,this.sql=Y,this.bindings=Z}bind(...J){return new DJ(this.client,this.sql,J)}async run(){let J=Date.now(),Y=TJ(this.sql),Z=await this.client.query(Y,this.bindings);return{success:!0,results:Z.rows??[],meta:x(J,{changes:typeof Z.rowCount==="number"?Z.rowCount:void 0,command:Z.command})}}async all(){let J=Date.now(),Y=TJ(this.sql),Z=await this.client.query(Y,this.bindings);return{success:!0,results:Z.rows??[],meta:x(J,{changes:typeof Z.rowCount==="number"?Z.rowCount:void 0,command:Z.command})}}async first(){let J=TJ(this.sql);return(await this.client.query(J,this.bindings)).rows?.[0]??null}}class RJ{client;sql;bindings;constructor(J,Y,Z=[]){this.client=J,this.sql=Y,this.bindings=Z}bind(...J){return new RJ(this.client,this.sql,J)}async run(){let J=Date.now(),Y=await EJ(this.client,this.sql,this.bindings);if(Array.isArray(Y))return{success:!0,results:Y,meta:x(J)};let Z=Y;return{success:!0,results:[],meta:x(J,{changes:Z.affectedRows,last_row_id:Z.insertId,warningStatus:Z.warningStatus})}}async all(){let J=Date.now(),Y=await EJ(this.client,this.sql,this.bindings);return{success:!0,results:Array.isArray(Y)?Y:[],meta:x(J,{changes:!Array.isArray(Y)?Y.affectedRows:void 0})}}async first(){let J=await EJ(this.client,this.sql,this.bindings);if(!Array.isArray(J)||J.length===0)return null;return J[0]}}class zJ{client;sql;bindings;constructor(J,Y,Z=[]){this.client=J,this.sql=Y,this.bindings=Z}bind(...J){return new zJ(this.client,this.sql,J)}async run(){let J=Date.now();if(typeof this.client.execute==="function"){let X=await this.client.execute(this.sql,this.bindings);return{success:!0,results:PJ(X),meta:x(J)}}let Y=this.client.prepare?.(this.sql);if(!Y||typeof Y.run!=="function")throw new j("SQLite client must expose execute() or prepare().run()","SQLITE_CLIENT_INVALID");let $=await Y.run(...this.bindings)??{};return{success:!0,results:[],meta:x(J,{changes:$J($.changes),last_row_id:$.lastInsertRowid??$.lastID})}}async all(){let J=Date.now();if(typeof this.client.execute==="function"){let $=await this.client.execute(this.sql,this.bindings);return{success:!0,results:PJ($),meta:x(J)}}let Y=this.client.prepare?.(this.sql);if(!Y||typeof Y.all!=="function")throw new j("SQLite client must expose execute() or prepare().all()","SQLITE_CLIENT_INVALID");let Z=await Y.all(...this.bindings);return{success:!0,results:Array.isArray(Z)?Z:[],meta:x(J)}}async first(){if(typeof this.client.execute==="function"){let Y=await this.client.execute(this.sql,this.bindings);return PJ(Y)[0]??null}let J=this.client.prepare?.(this.sql);if(!J)throw new j("SQLite client must expose execute() or prepare().get()","SQLITE_CLIENT_INVALID");if(typeof J.get==="function"){let Y=await J.get(...this.bindings);return Y===void 0||Y===null?null:Y}if(typeof J.all==="function"){let Y=await J.all(...this.bindings);if(!Array.isArray(Y)||Y.length===0)return null;let Z=Y[0];return Z===void 0||Z===null?null:Z}throw new j("SQLite prepare() result must expose get() or all()","SQLITE_CLIENT_INVALID")}}class MJ{client;sqlTag;sqlText;bindings;constructor(J,Y,Z,$=[]){this.client=J,this.sqlTag=Y,this.sqlText=Z,this.bindings=$}bind(...J){return new MJ(this.client,this.sqlTag,this.sqlText,J)}async run(){let J=Date.now(),Y=IJ(this.sqlTag,this.sqlText,this.bindings),Z=await AZ(this.client,Y);return{success:!0,results:QJ(Z),meta:x(J,XY(Z))}}async all(){let J=Date.now(),Y=IJ(this.sqlTag,this.sqlText,this.bindings),Z=await HY(this.client,Y);return{success:!0,results:QJ(Z),meta:x(J,XY(Z))}}async first(){let J=IJ(this.sqlTag,this.sqlText,this.bindings),Y=await VZ(this.client,J),Z=QJ(Y);if(Z.length>0)return Z[0]??null;if(Y&&typeof Y==="object"&&"row"in Y){let $=Y.row;return $===void 0||$===null?null:$}if(Y&&typeof Y==="object"&&!Array.isArray(Y)&&!("rows"in Y)&&!("results"in Y)&&!("data"in Y))return Y;return null}}async function jZ(J,Y,Z,$){try{let X=await J.scan(Y,{MATCH:Z,COUNT:$});return $Y(X)}catch{let X=await J.scan(Y,"MATCH",Z,"COUNT",String($));return $Y(X)}}function $Y(J){if(Array.isArray(J))return{cursor:String(J[0]??"0"),keys:Array.isArray(J[1])?J[1]:[]};return{cursor:String(J.cursor??"0"),keys:Array.isArray(J.keys)?J.keys:[]}}async function EJ(J,Y,Z){if(typeof J.execute==="function"){let $=await J.execute(Y,Z);if(Array.isArray($))return $[0];return $}if(typeof J.query==="function"){let $=await J.query(Y,Z);if(Array.isArray($))return $[0];return $}throw new j("MySQL client must expose execute() or query()","MYSQL_CLIENT_INVALID")}async function AZ(J,Y){if(typeof J.run==="function")return await J.run(Y);if(typeof J.execute==="function")return await J.execute(Y);if(typeof J.all==="function")return await J.all(Y);throw new j("Drizzle client must expose run(), execute(), or all()","DRIZZLE_CLIENT_INVALID")}async function HY(J,Y){if(typeof J.all==="function")return await J.all(Y);if(typeof J.execute==="function")return await J.execute(Y);if(typeof J.run==="function")return await J.run(Y);throw new j("Drizzle client must expose all(), execute(), or run()","DRIZZLE_CLIENT_INVALID")}async function VZ(J,Y){if(typeof J.get==="function")return await J.get(Y);return await HY(J,Y)}function IJ(J,Y,Z){let $=LZ(Y),X=$.length-1;if(X!==Z.length)throw new j(`Drizzle binding mismatch: expected ${X} bindings, received ${Z.length}`,"DRIZZLE_BINDINGS_MISMATCH");if(X===0)return J.raw(Y);let W=typeof J.empty==="function"?J.empty():J.raw("");for(let G=0;G<$.length;G++){let U=$[G];if(U)W.append(J.raw(U));if(G<X)W.append(J`${Z[G]}`)}return W}function LZ(J){let Y=[],Z=0,$=!1,X=!1,W=!1,G=!1;for(let U=0;U<J.length;U++){let H=J[U],_=U+1<J.length?J[U+1]:"";if(W){if(H===`
17
- `)W=!1;continue}if(G){if(H==="*"&&_==="/")U++,G=!1;continue}if(!$&&!X){if(H==="-"&&_==="-"){U++,W=!0;continue}if(H==="/"&&_==="*"){U++,G=!0;continue}}if(H==="'"&&!X){if($&&_==="'"){U++;continue}$=!$;continue}if(H==='"'&&!$){if(X&&_==='"'){U++;continue}X=!X;continue}if(H==="?"&&!$&&!X)Y.push(J.slice(Z,U)),Z=U+1}return Y.push(J.slice(Z)),Y}function QJ(J){let Y=($)=>{if(!$||typeof $!=="object"||Array.isArray($))return;let X=$;if(Array.isArray(X.rows))return X.rows;if(Array.isArray(X.results))return X.results;if(Array.isArray(X.data))return X.data;return},Z=($)=>{if(!$||typeof $!=="object"||Array.isArray($))return!1;return Object.keys($).length>0};if(Array.isArray(J)){if(J.length===2){let $=Y(J[0]);if($)return $;let X=Y(J[1]);if(X)return X;if(!Array.isArray(J[0])&&!Array.isArray(J[1])){if(Z(J[0]))return[J[0]];if(Z(J[1]))return[J[1]]}if(Array.isArray(J[0]))return J[0];if(Array.isArray(J[1]))return J[1]}return J}if(J&&typeof J==="object"){let $=Y(J);if($)return $}return[]}function XY(J){if(!J)return{};let Y;if(Array.isArray(J)){if(J.length===2){if(J[0]&&typeof J[0]==="object"&&!Array.isArray(J[0]))Y=J[0];else if(J[1]&&typeof J[1]==="object"&&!Array.isArray(J[1]))Y=J[1]}}else if(typeof J==="object"&&!Array.isArray(J))Y=J;if(!Y)return{};let Z={},$=$J(Y.rowCount)??$J(Y.changes)??$J(Y.affectedRows);if($!==void 0)Z.changes=$;let X=Y.lastInsertRowid??Y.lastInsertId??Y.lastID??Y.lastRowID??Y.insertId??Y.insertID;if(typeof X==="number"||typeof X==="string")Z.last_row_id=X;if(Y.meta&&typeof Y.meta==="object")Object.assign(Z,Y.meta);return Z}async function EZ(J,Y){if(typeof J.get==="function")return await J.get(Y);if(typeof J.getItem==="function")return await J.getItem(Y);throw new j("NuxtHub KV client must expose get() or getItem()","NUXTHUB_KV_CLIENT_INVALID")}async function IZ(J,Y,Z){if(typeof J.set==="function"){await J.set(Y,Z);return}if(typeof J.setItem==="function"){await J.setItem(Y,Z);return}throw new j("NuxtHub KV client must expose set() or setItem()","NUXTHUB_KV_CLIENT_INVALID")}async function QZ(J,Y){if(typeof J.del==="function"){await J.del(Y);return}if(typeof J.removeItem==="function"){await J.removeItem(Y);return}throw new j("NuxtHub KV client must expose del() or removeItem()","NUXTHUB_KV_CLIENT_INVALID")}async function PZ(J,Y){let Z;if(typeof J.keys==="function")Z=await J.keys(Y);else if(typeof J.getKeys==="function")Z=await J.getKeys(Y);else throw new j("NuxtHub KV client must expose keys() or getKeys()","NUXTHUB_KV_CLIENT_INVALID");if(!Array.isArray(Z))return[];if(!Y)return[...Z];return Z.filter(($)=>$.startsWith(Y))}function PJ(J){if(Array.isArray(J))return J;if(J&&typeof J==="object"){let Y=J;if(Array.isArray(Y.rows))return Y.rows;if(Array.isArray(Y.results))return Y.results}return[]}function x(J,Y={}){return{duration:Date.now()-J,...Y}}function $J(J){if(typeof J==="number"&&Number.isFinite(J))return J;return}var l=new Map;function TJ(J){let Y=l.get(J);if(Y)return Y;let Z="",$=0,X=!1,W=!1,G=!1,U=!1;for(let H=0;H<J.length;H++){let _=J[H],O=H+1<J.length?J[H+1]:"";if(G){if(Z+=_,_===`
18
- `)G=!1;continue}if(U){if(Z+=_,_==="*"&&O==="/")Z+="/",H++,U=!1;continue}if(!X&&!W){if(_==="-"&&O==="-"){Z+="--",H++,G=!0;continue}if(_==="/"&&O==="*"){Z+="/*",H++,U=!0;continue}}if(_==="'"&&!W){X=!X,Z+=_;continue}if(_==='"'&&!X){W=!W,Z+=_;continue}if(_==="?"&&!X&&!W){$++,Z+=`$${$}`;continue}Z+=_}if(l.set(J,Z),l.size>5000){let H=l.keys().next().value;if(H)l.delete(H)}return Z}q();class D{static tokenize(J){return J.trim().split(/\s+/).map((Y)=>Y.toLowerCase())}static extractTableName(J){let Y=this.tokenize(J);if(Y[0]==="create"&&Y[1]==="table"){let W=2;if(Y[W]==="if")W+=3;return Y[W]??null}if(Y[0]==="drop"&&Y[1]==="table"){let W=2;if(Y[W]==="if")W+=2;return Y[W]??null}let Z=Y.indexOf("from"),$=Y.indexOf("into"),X=Y.indexOf("update");if(Z>=0&&Z+1<Y.length)return Y[Z+1]??null;if($>=0&&$+1<Y.length)return Y[$+1]??null;if(X>=0&&X+1<Y.length)return Y[X+1]??null;return null}static isSelect(J){return this.tokenize(J)[0]==="select"}static isInsert(J){return this.tokenize(J)[0]==="insert"}static isCreateTable(J){let Y=this.tokenize(J);return Y[0]==="create"&&Y[1]==="table"}static isDropTable(J){let Y=this.tokenize(J);return Y[0]==="drop"&&Y[1]==="table"}static isDelete(J){return this.tokenize(J)[0]==="delete"}static isUpdate(J){return this.tokenize(J)[0]==="update"}static hasIdWhereClause(J){return J.includes("WHERE")&&J.includes("id")}static hasAutoIncrement(J){return J.includes("AUTOINCREMENT")||J.includes("AUTO_INCREMENT")||J.includes("GENERATED BY DEFAULT AS IDENTITY")}static hasReturning(J){return J.includes("RETURNING")}}class BJ{tables=new Map;schemas=new Map;autoIncrementCounters=new Map;lastInsertRowId=null;prepare(J){return new _Y(this,J)}async executeStatement(J,Y){let Z=Date.now();try{if(D.isCreateTable(J))return await this.handleCreateTable(J,Y);if(D.isDropTable(J))return await this.handleDropTable(J,Y);if(D.isInsert(J))return await this.handleInsert(J,Y);if(D.isUpdate(J))return await this.handleUpdate(J,Y);if(D.isDelete(J))return await this.handleDelete(J,Y);if(D.isSelect(J))return await this.handleSelect(J,Y);return{success:!0,results:[],meta:{duration:Date.now()-Z}}}catch($){let X=$ instanceof Error?$.message:String($);return{success:!1,results:[],meta:{duration:Date.now()-Z},error:X}}}async executeQuery(J,Y){let Z=Date.now();try{if(D.isSelect(J))return await this.handleSelect(J,Y);return{success:!1,results:[],meta:{duration:Date.now()-Z},error:"Use executeStatement for non-SELECT queries"}}catch($){let X=$ instanceof Error?$.message:String($);return{success:!1,results:[],meta:{duration:Date.now()-Z},error:X}}}async handleCreateTable(J,Y){let Z=Date.now(),$=D.extractTableName(J);if(!$)return{success:!1,results:[],meta:{duration:Date.now()-Z},error:"Could not extract table name"};let X=new Map,W=J.match(/\((.*)\)/s);if(!W||!W[1])return this.tables.set($,new Map),this.schemas.set($,X),{success:!0,results:[],meta:{duration:Date.now()-Z}};let G=W[1],U=/(\w+)\s+([A-Z_]+)(\s+[^,)]*)?/gi,H;while((H=U.exec(G))!==null){let _=H[1]||"",O=H[2]||"",F=H[3]||"";X.set(_,{name:_,type:O,isPrimaryKey:F.includes("PRIMARY KEY"),isAutoIncrement:F.includes("AUTOINCREMENT")||F.includes("AUTO_INCREMENT")||F.includes("GENERATED BY DEFAULT AS IDENTITY")})}if(this.tables.set($,new Map),this.schemas.set($,X),D.hasAutoIncrement(J))this.autoIncrementCounters.set($,0);return{success:!0,results:[],meta:{duration:Date.now()-Z}}}async handleDropTable(J,Y){let Z=Date.now(),$=D.extractTableName(J);if(!$)return{success:!1,results:[],meta:{duration:Date.now()-Z},error:"Could not extract table name"};return this.tables.delete($),this.schemas.delete($),this.autoIncrementCounters.delete($),{success:!0,results:[],meta:{duration:Date.now()-Z}}}async handleInsert(J,Y){let Z=Date.now(),$=D.extractTableName(J);if(!$)return{success:!1,results:[],meta:{duration:Date.now()-Z},error:"Could not extract table name"};if(!this.tables.has($))this.tables.set($,new Map);let X=this.tables.get($),W=this.schemas.get($),G=Y[0];if(!G)return{success:!1,results:[],meta:{duration:Date.now()-Z},error:"No primary key value provided"};let U={};if(W){let O=0;for(let[F,A]of W)if(O<Y.length)U[F]=Y[O],O++}else for(let O=0;O<Y.length;O++)if(O===0)U.id=Y[O];else U[`column_${O}`]=Y[O];return X.set(String(G),U),this.lastInsertRowId=G,{success:!0,results:D.hasReturning(J)?[U]:[],meta:{duration:Date.now()-Z,last_row_id:G,changes:1}}}async handleUpdate(J,Y){let Z=Date.now(),$=D.extractTableName(J);if(!$)return{success:!1,results:[],meta:{duration:Date.now()-Z},error:"Could not extract table name"};if(!this.tables.has($))return{success:!1,results:[],meta:{duration:Date.now()-Z},error:`Table ${$} not found`};let X=this.tables.get($);if(!D.hasIdWhereClause(J))return{success:!0,results:[],meta:{duration:Date.now()-Z,changes:0}};let W=Y[Y.length-1],G=X.get(String(W));if(!G)return{success:!0,results:[],meta:{duration:Date.now()-Z,changes:0}};for(let U=0;U<Y.length-1;U++){let H=this.extractSetColumnName(J,U);if(H)G[H]=Y[U]}return{success:!0,results:[],meta:{duration:Date.now()-Z,changes:1}}}extractSetColumnName(J,Y){let Z=J.match(/SET\s+([^W]+?)(?:WHERE|$)/i);if(!Z||!Z[1])return null;return Z[1].split(",").map((W)=>{let G=W.match(/(\w+)\s*=/);return G&&G[1]?G[1]:null})[Y]??null}async handleDelete(J,Y){let Z=Date.now(),$=D.extractTableName(J);if(!$)return{success:!1,results:[],meta:{duration:Date.now()-Z},error:"Could not extract table name"};if(!this.tables.has($))return{success:!0,results:[],meta:{duration:Date.now()-Z,changes:0}};let X=this.tables.get($);if(!D.hasIdWhereClause(J)){let U=X.size;return X.clear(),{success:!0,results:[],meta:{duration:Date.now()-Z,changes:U}}}let W=Y[0],G=X.has(String(W));if(G)X.delete(String(W));return{success:!0,results:[],meta:{duration:Date.now()-Z,changes:G?1:0}}}async handleSelect(J,Y){let Z=Date.now(),$=D.extractTableName(J);if(!$)return{success:!1,results:[],meta:{duration:Date.now()-Z},error:"Could not extract table name"};if(!this.tables.has($))return{success:!0,results:[],meta:{duration:Date.now()-Z}};let X=this.tables.get($);if(J.includes("COUNT(*)")){let U=J.match(/COUNT\(\*\)\s+as\s+(\w+)/i)?.[1]??"COUNT(*)",H={};return H[U]=X.size,{success:!0,results:[H],meta:{duration:Date.now()-Z}}}let W=Array.from(X.values());if(D.hasIdWhereClause(J)&&Y.length>0){let G=Y[0],U=X.get(String(G));W=U?[U]:[]}return{success:!0,results:W,meta:{duration:Date.now()-Z}}}}class _Y{database;sql;bindings=[];constructor(J,Y){this.database=J;this.sql=Y}bind(...J){return this.bindings=J,this}async run(){return await this.database.executeStatement(this.sql,this.bindings)}async all(){return await this.database.executeQuery(this.sql,this.bindings)}async first(){return(await this.database.executeQuery(this.sql,this.bindings)).results[0]||null}}class wJ{store=new Map;expirations=new Map;async get(J,Y="text"){let Z=this.expirations.get(J);if(Z&&Z<Date.now())return this.store.delete(J),this.expirations.delete(J),null;let $=this.store.get(J);if($===void 0)return null;if(Y==="json")try{return JSON.parse($)}catch(X){throw new j(`Failed to parse JSON from KV for key ${J}: ${X instanceof Error?X.message:String(X)}`,"KV_JSON_PARSE_FAILED")}return $}async put(J,Y,Z){if(this.store.set(J,Y),Z?.expirationTtl)this.expirations.set(J,Date.now()+Z.expirationTtl*1000);else this.expirations.delete(J)}async delete(J){this.store.delete(J),this.expirations.delete(J)}async list(J){let Y=J?.prefix??"",Z=J?.limit??1000,$=J?.cursor?parseInt(J.cursor,10):0,X=Date.now();for(let[_,O]of this.expirations)if(O<X)this.store.delete(_),this.expirations.delete(_);let W=Array.from(this.store.keys()).filter((_)=>_.startsWith(Y)),G=W.slice($,$+Z).map((_)=>({name:_})),U=$+Z,H=U>=W.length;return{keys:G,cursor:H?void 0:String(U),list_complete:H}}clear(){this.store.clear(),this.expirations.clear()}size(){return this.store.size}}function TZ(){return new BJ}function DZ(){return new wJ}d();export{a as validateTableForSharding,FJ as schemaExists,jJ as runShard,aJ as runAllShards,lJ as run,TY as resetConfig,bY as reassignShard,JJ as prepare,SJ as migrateRecord,p as listTables,hY as listKnownShards,OZ as isSQLDatabase,FZ as isKVStorage,fJ as integrateExistingDatabase,SY as insertShard,qY as insert,mJ as initializeAsync,QY as initialize,sY as indexShard,iY as indexAllShards,lY as index,$Z as getTotalDatabaseSize,pY as getShardStats,YY as getDatabaseSizesAllShards,dY as getDatabaseSizeForShard,ZZ as getDatabaseSizeForKey,zY as getClosestRegionFromIP,cY as flush,AJ as firstShard,fY as firstByLookupKey,mY as firstAllShardsGlobal,JY as firstAllShards,tJ as first,aY as explainShard,rY as explainAllShards,tY as explain,qJ as dropSchema,t as discoverExistingRecordsWithColumns,i as discoverExistingPrimaryKeys,WZ as createValkeyKVProvider,kJ as createSchemaAcrossShards,xY as createSchema,GZ as createSQLiteProvider,WY as createRedisKVProvider,GY as createPostgreSQLProvider,UZ as createNuxtHubKVProvider,UY as createMySQLProvider,KJ as createMappingsForExistingKeys,TZ as createInMemorySQLProvider,DZ as createInMemoryKVProvider,HZ as createHyperdrivePostgresProvider,_Z as createHyperdriveMySQLProvider,XJ as createDrizzleSQLProvider,JZ as countShard,YZ as countAllShards,eY as count,PY as collegedb,yJ as clearShardMigrationCache,pJ as clearMigrationCache,hJ as checkMigrationNeeded,bJ as autoDetectAndMigrate,YJ as allShard,KY as allByLookupKey,eJ as allAllShardsGlobal,ZJ as allAllShards,iJ as all,ZY as ShardCoordinator,K as KVShardMapper,BJ as InMemorySQLDatabase,wJ as InMemoryKVStorage,j as CollegeDBError};
16
+ `).run()}if(f.set(F,!0),B&&X.debug)console.log(`Auto-migration completed for shard ${$}: ${T} records from ${I} tables`)}catch(V){A.push(`Auto-migration error: ${V}`)}return{migrationNeeded:L,migrationPerformed:B,recordsMigrated:T,tablesProcessed:I,issues:A}}async function pJ(J,$,X){let Y=`${$}_migration_check`;if(f.has(Y))return!1;try{let Z=await p(J);if(Z.includes("shard_mappings"))return f.set(Y,!0),!1;let{KVShardMapper:G}=await Promise.resolve().then(() => (d(),_J)),U=new G(X.kv,{hashShardMappings:X.hashShardMappings,mappingCacheTtlMs:X.mappingCacheTtlMs,knownShardsCacheTtlMs:X.knownShardsCacheTtlMs}),H=Z.filter((_)=>_!=="shard_mappings"&&!_.startsWith("sqlite_")&&_!=="sqlite_sequence");for(let _ of H.slice(0,3))try{if(((await J.prepare(`SELECT COUNT(*) as count FROM ${_} LIMIT 1`).first())?.count||0)>0){let A=await J.prepare(`SELECT id FROM ${_} LIMIT 1`).first();if(A){let T=String(A.id);if(!await U.getShardMapping(T))return!0}}}catch{continue}return!1}catch{return!1}}function gJ(){f.clear()}function yJ(J){let $=`${J}_migration_check`;f.delete($)}var f,OJ;var o=HJ(()=>{K();f=new Map,OJ=new Map});K();d();var n=null,g=null,m=new Map,y=0;function C(J){if(!g)g=new q(J.kv,{hashShardMappings:J.hashShardMappings,mappingCacheTtlMs:J.mappingCacheTtlMs,knownShardsCacheTtlMs:J.knownShardsCacheTtlMs});return g}function Q6(J){n=J,g=new q(J.kv,{hashShardMappings:J.hashShardMappings,mappingCacheTtlMs:J.mappingCacheTtlMs,knownShardsCacheTtlMs:J.knownShardsCacheTtlMs}),m.clear(),y=0;try{let $=C(J);Promise.resolve().then(async()=>{let X=await $.getKnownShards(),Y=Array.from(new Set([...X,...Object.keys(J.shards)]));await $.setKnownShards(Y)}).catch(()=>{return})}catch{}if(J.shards&&Object.keys(J.shards).length>0&&!J.disableAutoMigration)dJ(J).catch(($)=>{console.warn("Background auto-migration failed:",$)})}async function cJ(J){n=J,g=new q(J.kv,{hashShardMappings:J.hashShardMappings,mappingCacheTtlMs:J.mappingCacheTtlMs,knownShardsCacheTtlMs:J.knownShardsCacheTtlMs}),m.clear(),y=0;try{let $=C(J),X=await $.getKnownShards(),Y=Array.from(new Set([...X,...Object.keys(J.shards)]));await $.setKnownShards(Y)}catch{}if(J.shards&&Object.keys(J.shards).length>0&&!J.disableAutoMigration)try{await dJ(J)}catch($){console.warn("Auto migration failed:",$)}}async function P6(J,$){return await cJ(J),await $()}async function dJ(J){try{let{autoDetectAndMigrate:$}=await Promise.resolve().then(() => (o(),e)),X=Object.keys(J.shards);if(J.debug)console.log(`\uD83D\uDD0D Checking ${X.length} shards for existing data...`);let Y=X.map(async(G)=>{let U=J.shards[G];if(!U)return null;try{let H=await $(U,G,J,{maxRecordsToCheck:1000});return{shardName:G,...H}}catch(H){return console.warn(`Auto-migration failed for shard ${G}:`,H),null}}),W=(await Promise.all(Y)).filter((G)=>G?.migrationPerformed);if(J.debug)if(W.length>0){let G=W.reduce((U,H)=>U+(H?.recordsMigrated||0),0);console.log(`\uD83C\uDF89 Auto-migration completed! Migrated ${G} records across ${W.length} shards`),W.forEach((U)=>{if(U)console.log(` ✅ ${U.shardName}: ${U.recordsMigrated} records from ${U.tablesProcessed} tables`)})}else console.log("✅ All shards ready - no migration needed")}catch($){console.warn("Background auto-migration setup failed:",$)}}function D6(){n=null,g=null,m.clear(),y=0}function R(){if(!n)throw new j("CollegeDB not initialized. Call initialize() first.","NOT_INITIALIZED");return n}function R6(J){let $=J.trim().toUpperCase();if($.startsWith("SELECT")||$.startsWith("VALUES")||$.startsWith("TABLE")||$.startsWith("PRAGMA")||$.startsWith("EXPLAIN")||$.startsWith("WITH")||$.startsWith("SHOW"))return"read";return"write"}function oJ(J,$){let X=J.strategy||"hash";if(typeof X==="string")return X;let Y=X;return Y[$]||Y.write||Y.read||"hash"}function z6(J,$){if(J===$)return 0;let X={wnam:{lat:37.7749,lon:-122.4194},enam:{lat:40.7128,lon:-74.006},weur:{lat:51.5074,lon:-0.1278},eeur:{lat:52.52,lon:13.405},apac:{lat:35.6762,lon:139.6503},oc:{lat:-33.8688,lon:151.2093},me:{lat:25.2048,lon:55.2708},af:{lat:-26.2041,lon:28.0473}},Y=X[J],Z=X[$],W=Y.lat-Z.lat,G=Y.lon-Z.lon;return Math.sqrt(W*W+G*G)}function M6(J){let $=J.cf;if(!$||!$.country)return"wnam";let{country:X,continent:Y}=$;if(["US","CA","MX"].includes(X)){let Z=$.region||$.regionCode||"",W=$.timezone||"";if(Z.includes("CA")||Z.includes("WA")||Z.includes("OR")||Z.includes("NV")||Z.includes("AZ")||Z.includes("UT")||W.includes("Pacific")||W.includes("America/Los_Angeles"))return"wnam";return"enam"}if(["GL","PM","BM"].includes(X))return"enam";if(["GB","IE","FR","ES","PT","NL","BE","LU","CH","AT","IT"].includes(X))return"weur";if(["DE","PL","CZ","SK","HU","SI","HR","BA","RS","ME","MK","AL","BG","RO","MD","UA","BY","LT","LV","EE","FI","SE","NO","DK","IS"].includes(X))return"eeur";if(X==="RU")return"eeur";if(["JP","KR","CN","HK","TW","MO","MN","KP"].includes(X))return"apac";if(["TH","VN","SG","MY","ID","PH","BN","KH","LA","MM","TL","IN","PK","BD","LK","NP","BT","MV","AF"].includes(X))return"apac";if(["AU","NZ","PG","FJ","NC","VU","SB","WS","TO","KI","NR","PW","FM","MH","TV"].includes(X))return"oc";if(["AE","SA","QA","KW","BH","OM","YE","IQ","IR","SY","LB","JO","IL","PS","TR","CY"].includes(X))return"me";if(Y==="AF"||["EG","LY","TN","DZ","MA","SD","SS","ET","ER","DJ","SO"].includes(X))return"af";if(["KZ","UZ","TM","TJ","KG"].includes(X))return"eeur";if(Y==="SA"||["BR","AR","CL","PE","CO","VE","EC","BO","PY","UY","GY","SR","GF"].includes(X))return"enam";if(["GT","BZ","SV","HN","NI","CR","PA","CU","JM","HT","DO","PR","TT","BB","GD","VC","LC","DM","AG","KN"].includes(X))return"enam";return"wnam"}function B6(J){if(typeof J==="string")return J;return J.region||"wnam"}async function JJ(J){try{let[$,X]=await Promise.all([J.prepare("PRAGMA page_count").first(),J.prepare("PRAGMA page_size").first()]);if(!$?.page_count||!X?.page_size)throw new j("Failed to retrieve database size information","SIZE_QUERY_FAILED");return $.page_count*X.page_size}catch($){throw new j(`Failed to get database size: ${$ instanceof Error?$.message:"Unknown error"}`,"SIZE_QUERY_FAILED")}}async function w6(J,$){let X=Math.max(0,$.sizeCacheTtlMs??30000),Y=m.get(J);if(Y&&Y.expiresAt>=Date.now())return Y.size;let Z=$.shards[J];if(!Z)throw new j(`Shard ${J} not found in configuration`,"SHARD_NOT_FOUND");let W=await JJ(Z);if(X>0)m.set(J,{size:W,expiresAt:Date.now()+X});return W}async function nJ(J,$){if(typeof $.maxDatabaseSize!=="number"||!Number.isFinite($.maxDatabaseSize)||$.maxDatabaseSize<=0)return J;let X=$.maxDatabaseSize,Z=(await Promise.allSettled(J.map(async(W)=>{let G=await w6(W,$);return{shard:W,size:G,withinLimit:G<X}}))).filter((W)=>W.status==="fulfilled"&&W.value.withinLimit).map((W)=>W.value.shard);if(Z.length===0){if($.debug)console.warn("All shards exceed maxDatabaseSize limit. Allowing allocation to prevent failure.");return J}if($.debug&&Z.length<J.length){let W=J.filter((G)=>!Z.includes(G));console.log(`Excluded ${W.length} shards due to size limits: ${W.join(", ")}`)}return Z}function N6(J,$,X,Y){let Z=$.filter((O)=>X[O]);if(Z.length===0){let O=0;for(let A=0;A<Y.length;A++){let T=Y.charCodeAt(A);O=(O<<5)-O+T,O=O&O}let F=Math.abs(O)%$.length;return $[F]}let W=Z.map((O)=>{let F=X[O],A=z6(J,B6(F)),T=typeof F==="object"?F.priority||1:1,I=A-T*0.1;return{shard:O,score:I,distance:A,priority:T}});W.sort((O,F)=>O.score-F.score);let G=W[0].score,U=W.filter((O)=>Math.abs(O.score-G)<0.01);if(U.length===1)return U[0].shard;let H=0;for(let O=0;O<Y.length;O++){let F=Y.charCodeAt(O);H=(H<<5)-H+F,H=H&H}let _=Math.abs(H)%U.length;return U[_].shard}function u(J,$,X,Y){switch(J){case"hash":{let Z=0;for(let G=0;G<$.length;G++){let U=$.charCodeAt(G);Z=(Z<<5)-Z+U,Z=Z&Z}let W=Math.abs(Z)%X.length;return X[W]||X[0]}case"location":{if(!Y.targetRegion)return u("hash",$,X,Y);return N6(Y.targetRegion,X,Y.shardLocations||{},$)}case"random":return X[Math.floor(Math.random()*X.length)]||X[0];default:return u("hash",$,X,Y)}}async function lJ(J,$="write"){let X=R(),Y=C(X),Z=await Y.getShardMapping(J);if(Z)return Z.shard;let W=Object.keys(X.shards);if(W.length===0)throw new j("No shards configured","NO_SHARDS");let G=await nJ(W,X),U,H=oJ(X,$);if(X.coordinator)try{let _=X.coordinator.idFromName("default"),F=await X.coordinator.get(_).fetch("http://coordinator/allocate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({primaryKey:J,strategy:H,operationType:$,targetRegion:X.targetRegion,shardLocations:X.shardLocations,availableShards:G})});if(F.ok)U=(await F.json()).shard;else U=u(H,J,G,X)}catch(_){console.warn("Coordinator allocation failed, falling back to local strategy:",_),U=u(H,J,G,X)}else U=u(H,J,G,X);return await Y.setShardMapping(J,U),U}async function x6(J,$="write"){let X=R(),Y=await lJ(J,$),Z=X.shards[Y];if(!Z)throw new j(`Shard ${Y} not found in configuration`,"SHARD_NOT_FOUND");return Z}async function v6(J,$){let{createSchema:X}=await Promise.resolve().then(() => (o(),e));await X(J,$)}async function $J(J,$){let X=R6($);return(await x6(J,X)).prepare($)}async function sJ(J,$,X=[]){let Z=await(await $J(J,$)).bind(...X).run();if(!Z.success)throw new j(`Query failed: ${Z.error||"Unknown error"}`,"QUERY_FAILED");return Z}function C6(J){let $=J.results[0];if($&&typeof $==="object"){for(let Y of["id","ID","Id","rowid","ROWID","RowId","last_row_id","lastInsertId","insertId"]){let Z=$[Y];if(Z!==void 0&&Z!==null)return Z}for(let[Y,Z]of Object.entries($)){let W=Y.toLowerCase();if((W==="id"||W==="rowid")&&(typeof Z==="number"||typeof Z==="string"))return Z}for(let Y of Object.values($))if(typeof Y==="number"||typeof Y==="string")return Y}let X=J.meta.last_row_id;if(X!==void 0&&X!==null)return X;return}function k6(){return`insert:${Date.now()}:${Math.random().toString(36).slice(2)}`}async function K6(){let J=R(),$=Object.keys(J.shards);if($.length===0)throw new j("No shards configured","NO_SHARDS");let X=await nJ($,J);if(X.length===0)throw new j("No shards available for insert","NO_SHARDS");let Y=oJ(J,"write"),Z=k6();if(J.coordinator)try{let W=J.coordinator.idFromName("default"),U=await J.coordinator.get(W).fetch("http://coordinator/allocate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({primaryKey:Z,strategy:Y,operationType:"write",targetRegion:J.targetRegion,shardLocations:J.shardLocations,availableShards:X})});if(U.ok)return(await U.json()).shard}catch(W){console.warn("Coordinator allocation for insert failed, falling back to local strategy:",W)}if(Y==="round-robin"){let W=X[y%X.length];return y=(y+1)%X.length,W}return u(Y,Z,X,J)}async function tJ(J,$,X=[]){let Y=R();if(!Y.shards[J])throw new j(`Shard ${J} not found`,"SHARD_NOT_FOUND");let W=/\breturning\b/i.test($)?await XJ(J,$,X):await AJ(J,$,X),G=C6(W);if(G===void 0)throw new j("Insert did not return a generated primary key","GENERATED_KEY_UNAVAILABLE");return await C(Y).setShardMapping(String(G),J),{...W,generatedId:G}}async function S6(J,$=[]){let X=await K6();return await tJ(X,J,$)}async function q6(J,$,X=[]){return await tJ(J,$,X)}async function iJ(J,$,X=[]){let Z=await(await $J(J,$)).bind(...X).all();if(!Z.success)throw new j(`Query failed: ${Z.error||"Unknown error"}`,"QUERY_FAILED");return Z}async function aJ(J,$,X=[]){return await(await $J(J,$)).bind(...X).first()}async function f6(J,$,X=[],Y=50){let Z=R(),G=await C(Z).getShardMapping(J);if(G){if(Z.shards[G.shard]){let _=await XJ(G.shard,$,X);if(_.success&&_.results.length>0)return _}}let U=await YJ($,X,Y);return eJ(U)}async function b6(J,$,X=[],Y=50){let Z=R(),G=await C(Z).getShardMapping(J);if(G){if(Z.shards[G.shard]){let _=await LJ(G.shard,$,X);if(_!==null)return _}}return(await $6($,X,Y)).find((H)=>H!==null)??null}async function h6(J,$,X){let Y=R();if(!Y.shards[$])throw new j(`Shard ${$} not found in configuration`,"SHARD_NOT_FOUND");let Z=C(Y),W=await Z.getShardMapping(J);if(!W)throw new j(`No existing mapping found for primary key: ${J}`,"MAPPING_NOT_FOUND");if(W.shard!==$){let{migrateRecord:G}=await Promise.resolve().then(() => (o(),e)),U=Y.shards[W.shard],H=Y.shards[$];if(!U||!H)throw new j("Source or target shard not available","SHARD_UNAVAILABLE");await G(U,H,J,X)}await Z.updateShardMapping(J,$)}async function p6(){let J=R();if(J.coordinator)try{let $=J.coordinator.idFromName("default"),Y=await J.coordinator.get($).fetch("http://coordinator/shards");if(Y.ok)return await Y.json()}catch($){console.warn("Failed to get shards from coordinator:",$)}try{let X=await C(J).getKnownShards(),Y=new Set([...Object.keys(J.shards),...X]);return Array.from(Y)}catch{return Object.keys(J.shards)}}async function g6(){let J=R();if(J.coordinator)try{let Z=J.coordinator.idFromName("default"),G=await J.coordinator.get(Z).fetch("http://coordinator/stats");if(G.ok)return await G.json()}catch(Z){console.warn("Failed to get stats from coordinator:",Z)}let $=C(J),X=await $.getShardKeyCounts(),Y=Object.keys(J.shards);try{let Z=await $.getKnownShards();Y=Array.from(new Set([...Y,...Z]))}catch{}return Y.map((Z)=>({binding:Z,count:X[Z]||0}))}async function AJ(J,$,X=[]){let Z=R().shards[J];if(!Z)throw new j(`Shard ${J} not found`,"SHARD_NOT_FOUND");let W=await Z.prepare($).bind(...X).run();if(!W.success)throw new j(`Query failed: ${W.error||"Unknown error"}`,"QUERY_FAILED");return W}async function XJ(J,$,X=[]){let Z=R().shards[J];if(!Z)throw new j(`Shard ${J} not found`,"SHARD_NOT_FOUND");return await Z.prepare($).bind(...X).all()}async function LJ(J,$,X=[]){let Z=R().shards[J];if(!Z)throw new j(`Shard ${J} not found`,"SHARD_NOT_FOUND");return await Z.prepare($).bind(...X).first()}async function rJ(J,$=[],X=50){let Y=R(),Z=[];for(let[G,U]of Object.entries(Y.shards)){if(!G||!U){console.error(`Shard ${G??"<null>"} not found, skipping`);continue}Z.push(()=>U.prepare(J).bind(...$).run().catch((H)=>{return console.error(`Error executing query on shard ${G}:`,H),{success:!1,results:[],error:H instanceof Error?H.message:String(H),meta:{duration:0}}}))}let W=[];for(let G=0;G<Z.length;G+=X){let U=Z.slice(G,G+X).map((H)=>H());W.push(...await Promise.all(U))}return W}async function YJ(J,$=[],X=50){let Y=R(),Z=[];for(let[G,U]of Object.entries(Y.shards)){if(!G||!U){console.error(`Shard ${G??"<null>"} not found, skipping`);continue}Z.push(()=>U.prepare(J).bind(...$).all().catch((H)=>{return console.error(`Error executing query on shard ${G}:`,H),{success:!1,results:[],error:H instanceof Error?H.message:String(H),meta:{duration:0}}}))}let W=[];for(let G=0;G<Z.length;G+=X){let U=Z.slice(G,G+X).map((H)=>H());W.push(...await Promise.all(U))}return W}function l(J,$=50){if(!Number.isFinite(J??$))return $;return Math.max(1,Math.floor(J??$))}function y6(J){if(!Number.isFinite(J??0))return 0;return Math.max(0,Math.floor(J??0))}function u6(J){if(J===void 0)return;if(!Number.isFinite(J))return;return Math.max(0,Math.floor(J))}function uJ(J,$){if(typeof $==="function")return $(J);if(!$||typeof J!=="object"||J===null)return;return J[String($)]}function m6(J,$){if(J===$)return 0;if(J===null||J===void 0)return 1;if($===null||$===void 0)return-1;if(typeof J==="number"&&typeof $==="number")return J-$;if(typeof J==="bigint"&&typeof $==="bigint")return J<$?-1:1;if(J instanceof Date&&$ instanceof Date)return J.getTime()-$.getTime();if(typeof J==="boolean"&&typeof $==="boolean")return Number(J)-Number($);return String(J).localeCompare(String($),void 0,{numeric:!0,sensitivity:"base"})}function eJ(J){let $=J.flatMap((W)=>W.results||[]),X=J.filter((W)=>!W.success),Y=J.reduce((W,G)=>W+(G.meta?.duration||0),0);if(X.length===0)return{success:!0,results:$,meta:{duration:Y}};let Z=X.map((W)=>W.error||"Unknown shard query error").filter(Boolean).join("; ");return{success:!1,results:$,error:Z||"One or more shard queries failed",meta:{duration:Y}}}async function J6(J,$=[],X={}){let Y=l(X.batchSize),Z=y6(X.offset),W=u6(X.limit),G=eJ(await YJ(J,$,Y)),U=G.results;if(X.filter)U=U.filter((O)=>X.filter?.(O));if(X.comparator)U=[...U].sort(X.comparator);else if(X.sortBy){let O=X.sortDirection==="desc"?-1:1;U=[...U].sort((F,A)=>{let T=uJ(F,X.sortBy),I=uJ(A,X.sortBy);return m6(T,I)*O})}let H=W===void 0?void 0:Z+W,_=U.slice(Z,H);return{...G,results:_}}async function $6(J,$=[],X=50){let Y=R(),Z=[];for(let[G,U]of Object.entries(Y.shards)){if(!G||!U){console.error(`Shard ${G??"<null>"} not found, skipping`);continue}Z.push(()=>U.prepare(J).bind(...$).first().catch((H)=>{return console.error(`Error executing query on shard ${G}:`,H),null}))}let W=[];for(let G=0;G<Z.length;G+=X){let U=Z.slice(G,G+X).map((H)=>H());W.push(...await Promise.all(U))}return W}async function c6(J,$=[],X={}){return(await J6(J,$,{...X,limit:1})).results[0]??null}async function d6(){let J=R();if(await C(J).clearAllMappings(),m.clear(),J.coordinator)try{let X=J.coordinator.idFromName("default");await J.coordinator.get(X).fetch("http://coordinator/flush",{method:"POST"})}catch(X){console.warn("Failed to flush coordinator:",X)}}async function o6(J){let X=R().shards[J];if(!X)throw new j(`Shard ${J} not found`,"SHARD_NOT_FOUND");return await JJ(X)}var n6=/^[A-Za-z_][A-Za-z0-9_]*$/;function b(J){let $=J.trim();if(!$)throw new j("Identifier cannot be empty","INVALID_IDENTIFIER");let X=$.split(".").map((Y)=>Y.trim());if(X.some((Y)=>!Y||!n6.test(Y)))throw new j(`Invalid SQL identifier: ${J}`,"INVALID_IDENTIFIER");return X.map((Y)=>`"${Y}"`).join(".")}function mJ(J){return J.toLowerCase().replace(/[^a-z0-9_]+/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"")}function l6(J){if(typeof J==="string")return[{name:J}];if(!Array.isArray(J)||J.length===0)throw new j("At least one index column is required","INVALID_INDEX_COLUMNS");return J.map(($)=>{if(typeof $==="string")return{name:$};if(!$?.name)throw new j("Index column name is required","INVALID_INDEX_COLUMNS");return{name:$.name,order:$.order,collate:$.collate}})}function VJ(J,$,X={}){let Y=l6($),Z=b(J),W=X.indexName?X.indexName:["idx",mJ(J),...Y.map((F)=>mJ(F.name))].filter(Boolean).join("_").slice(0,120),G=b(W||"idx_auto"),U=Y.map((F)=>{let A=b(F.name),T=F.order?` ${F.order}`:"",I=F.collate?` COLLATE ${b(F.collate).replace(/"/g,"")}`:"";return`${A}${I}${T}`}).join(", "),H=X.ifNotExists===!1?"":" IF NOT EXISTS",_=X.unique?"UNIQUE ":"",O=X.where?.trim()?` WHERE ${X.where.trim()}`:"";return`CREATE ${_}INDEX${H} ${G} ON ${Z} (${U})${O}`}async function s6(J,$,X,Y={}){let Z=VJ($,X,Y);return sJ(J,Z)}async function t6(J,$,X,Y={}){let Z=VJ($,X,Y);return AJ(J,Z)}async function i6(J,$,X={}){let Y=VJ(J,$,X);return rJ(Y,[],l(X.batchSize))}function EJ(J,$="query-plan"){switch($){case"raw":return`EXPLAIN ${J}`;case"analyze":return`EXPLAIN ANALYZE ${J}`;case"query-plan":default:return`EXPLAIN QUERY PLAN ${J}`}}async function a6(J,$,X=[],Y={}){return iJ(J,EJ($,Y.mode),X)}async function r6(J,$,X=[],Y={}){return XJ(J,EJ($,Y.mode),X)}async function e6(J,$=[],X={}){return YJ(EJ(J,X.mode),$,l(X.batchSize))}async function J7(J,$){let X=b($),Y=await aJ(J,`SELECT COUNT(*) AS row_count FROM ${X}`);if(!Y||Y.row_count===void 0||Y.row_count===null)return 0;return Number(Y.row_count)||0}async function $7(J,$){let X=b($),Y=await LJ(J,`SELECT COUNT(*) AS row_count FROM ${X}`);if(!Y||Y.row_count===void 0||Y.row_count===null)return 0;return Number(Y.row_count)||0}async function X7(J,$=50){let X=R(),Y=l($),W=`SELECT COUNT(*) AS row_count FROM ${b(J)}`,G=[];for(let[_,O]of Object.entries(X.shards)){if(!_||!O)continue;G.push(async()=>{try{let F=await O.prepare(W).first(),A=Number(F?.row_count??0);return{shard:_,count:Number.isFinite(A)?A:0,success:!0}}catch(F){return{shard:_,count:null,success:!1,error:F instanceof Error?F.message:String(F)}}})}let U=[];for(let _=0;_<G.length;_+=Y){let O=G.slice(_,_+Y).map((F)=>F());U.push(...await Promise.all(O))}return{total:U.reduce((_,O)=>_+(O.count??0),0),shards:U}}async function Y7(J){let $=R(),X=await lJ(J,"read"),Y=$.shards[X];if(!Y)throw new j(`Shard ${X} not found in configuration`,"SHARD_NOT_FOUND");return JJ(Y)}async function X6(J=50){let $=R(),X=l(J),Y=[];for(let[W,G]of Object.entries($.shards)){if(!W||!G)continue;Y.push(async()=>{try{return{shard:W,size:await JJ(G),success:!0}}catch(U){return{shard:W,size:null,success:!1,error:U instanceof Error?U.message:String(U)}}})}let Z=[];for(let W=0;W<Y.length;W+=X){let G=Y.slice(W,W+X).map((U)=>U());Z.push(...await Promise.all(G))}return Z}async function Z7(J=50){return(await X6(J)).reduce((X,Y)=>X+(Y.size??0),0)}K();class Y6{state;constructor(J){this.state=J}async getState(){return await this.state.storage.get("coordinator_state")||{knownShards:[],shardStats:{},strategy:"round-robin",roundRobinIndex:0}}async saveState(J){await this.state.storage.put("coordinator_state",J)}async fetch(J){let X=new URL(J.url).pathname,Y=J.method;try{switch(`${Y} ${X}`){case"GET /shards":return this.handleListShards();case"POST /shards":return this.handleAddShard(J);case"DELETE /shards":return this.handleRemoveShard(J);case"GET /stats":return this.handleGetStats();case"POST /stats":return this.handleUpdateStats(J);case"POST /allocate":return this.handleAllocateShard(J);case"POST /flush":return this.handleFlush();case"GET /health":return new Response("OK",{status:200});default:return new Response("Not Found",{status:404})}}catch(Z){return console.error("ShardCoordinator error:",Z),new Response("Internal Server Error",{status:500})}}async handleListShards(){let J=await this.getState();return new Response(JSON.stringify(J.knownShards),{headers:{"Content-Type":"application/json"}})}async handleAddShard(J){let{shard:$}=await J.json();if(!$||typeof $!=="string")return new Response(JSON.stringify({error:"Missing or invalid shard parameter"}),{status:400,headers:{"Content-Type":"application/json"}});let X=await this.getState();if(!X.knownShards.includes($))X.knownShards.push($),X.shardStats[$]={binding:$,count:0,lastUpdated:Date.now()},await this.saveState(X);return new Response(JSON.stringify({success:!0}),{headers:{"Content-Type":"application/json"}})}async handleRemoveShard(J){let{shard:$}=await J.json();if(!$||typeof $!=="string")return new Response(JSON.stringify({error:"Missing or invalid shard parameter"}),{status:400,headers:{"Content-Type":"application/json"}});let X=await this.getState(),Y=X.knownShards.indexOf($);if(Y>-1){if(X.knownShards.splice(Y,1),delete X.shardStats[$],X.roundRobinIndex>=X.knownShards.length)X.roundRobinIndex=0;await this.saveState(X)}return new Response(JSON.stringify({success:!0}),{headers:{"Content-Type":"application/json"}})}async handleGetStats(){let J=await this.getState(),$=Object.values(J.shardStats);return new Response(JSON.stringify($),{headers:{"Content-Type":"application/json"}})}async handleUpdateStats(J){let{shard:$,count:X}=await J.json();if(!$||typeof $!=="string")return new Response(JSON.stringify({error:"Missing or invalid shard parameter"}),{status:400,headers:{"Content-Type":"application/json"}});if(X===void 0||typeof X!=="number")return new Response(JSON.stringify({error:"Missing or invalid count parameter"}),{status:400,headers:{"Content-Type":"application/json"}});let Y=await this.getState();if(Y.shardStats[$])Y.shardStats[$].count=X,Y.shardStats[$].lastUpdated=Date.now(),await this.saveState(Y);return new Response(JSON.stringify({success:!0}),{headers:{"Content-Type":"application/json"}})}async handleAllocateShard(J){let{primaryKey:$,strategy:X,operationType:Y,availableShards:Z}=await J.json();if(!$||typeof $!=="string")return new Response(JSON.stringify({error:"Missing or invalid primaryKey parameter"}),{status:400,headers:{"Content-Type":"application/json"}});let W=await this.getState(),G=Z||W.knownShards;if(G.length===0)return new Response(JSON.stringify({error:"No shards available"}),{status:400,headers:{"Content-Type":"application/json"}});let U=this.resolveStrategy(W.strategy,X,Y||"write"),H=this.selectShard($,W,U,G);if(U==="round-robin")W.roundRobinIndex=(W.roundRobinIndex+1)%G.length,await this.saveState(W);return new Response(JSON.stringify({shard:H}),{headers:{"Content-Type":"application/json"}})}async handleFlush(){return await this.state.storage.deleteAll(),new Response(JSON.stringify({success:!0}),{headers:{"Content-Type":"application/json"}})}resolveStrategy(J,$,X="write"){if($)return $;if(typeof J==="string")return J;return J[X]}selectShard(J,$,X,Y){let Z=Y||$.knownShards;if(Z.length===0)throw new j("No shards available","NO_SHARDS");switch(X){case"round-robin":return Z[$.roundRobinIndex]??Z[0];case"random":return Z[Math.floor(Math.random()*Z.length)];case"hash":{let W=0;for(let U=0;U<J.length;U++){let H=J.charCodeAt(U);W=(W<<5)-W+H,W=W&W}let G=Math.abs(W)%Z.length;return Z[G]}case"location":{let W=$.targetRegion,G=$.shardLocations||{},U=Z.filter((V)=>G[V]);if(!W||U.length===0){let V=0;for(let M=0;M<J.length;M++){let z=J.charCodeAt(M);V=(V<<5)-V+z,V=V&V}let E=Math.abs(V)%Z.length;return Z[E]}let H={wnam:{lat:37.7749,lon:-122.4194},enam:{lat:40.7357,lon:-74.1724},weur:{lat:51.5074,lon:-0.1278},eeur:{lat:52.2297,lon:21.0122},apac:{lat:35.6762,lon:139.6503},oc:{lat:-33.8688,lon:151.2093},me:{lat:25.2048,lon:55.2708},af:{lat:-26.2041,lon:28.0473}},_=(V,E)=>(E in V),O=(V)=>_(H,V)?V:"wnam",F=(V,E)=>{let M=H[O(V)],z=H[O(E)],D=M.lat-z.lat,P=M.lon-z.lon;return Math.sqrt(D*D+P*P)},A=U.map((V)=>{let E=G[V],M=F(W,E.region),z=E.priority||1;return{shard:V,score:M-z*0.1}});A.sort((V,E)=>V.score-E.score);let T=A[0].score,I=A.filter((V)=>Math.abs(V.score-T)<0.01);if(I.length===1)return I[0].shard;let L=0;for(let V=0;V<J.length;V++){let E=J.charCodeAt(V);L=(L<<5)-L+E,L=L&L}let B=Math.abs(L)%I.length;return I[B].shard}default:return Z[0]}}async incrementShardCount(J){let $=await this.getState();if($.shardStats[J])$.shardStats[J].count++,$.shardStats[J].lastUpdated=Date.now(),await this.saveState($)}async decrementShardCount(J){let $=await this.getState();if($.shardStats[J]&&$.shardStats[J].count>0)$.shardStats[J].count--,$.shardStats[J].lastUpdated=Date.now(),await this.saveState($)}}K();d();K();var W7=500;function G6(J,$={}){let X=$.scanCount??W7;return{async get(Y,Z="text"){let W=await J.get(Y);if(W===null)return null;if(Z!=="json")return W;try{return JSON.parse(W)}catch(G){throw new j(`Failed to parse JSON from Redis for key ${Y}: ${G instanceof Error?G.message:String(G)}`,"KV_JSON_PARSE_FAILED")}},async put(Y,Z){await J.set(Y,Z)},async delete(Y){await J.del(Y)},async list(Y){let Z=Y?.prefix??"",W=`${Z}*`,G=Y?.cursor??"0",U=Y?.limit,H=[];do{let _=await A7(J,G,W,X);G=_.cursor;for(let O of _.keys){if(!Z||O.startsWith(Z))H.push(O);if(U&&H.length>=U)break}if(U&&H.length>=U)break}while(G!=="0");return{keys:H.map((_)=>({name:_})),cursor:G,list_complete:G==="0"}}}}function G7(J,$={}){return G6(J,$)}function U6(J,$){if($)return WJ(J,$);return{prepare(X){return new RJ(J,X)}}}function H6(J,$){if($)return WJ(J,$);return{prepare(X){return new zJ(J,X)}}}function U7(J,$){if($)return WJ(J,$);return{prepare(X){return new MJ(J,X)}}}function WJ(J,$){return{prepare(X){return new BJ(J,$,X)}}}function H7(J){return{async get($,X="text"){let Y=await T7(J,$);if(Y===null||Y===void 0)return null;if(X==="json"){if(typeof Y==="string")try{return JSON.parse(Y)}catch(Z){throw new j(`Failed to parse JSON from NuxtHub KV for key ${$}: ${Z instanceof Error?Z.message:String(Z)}`,"KV_JSON_PARSE_FAILED")}return Y}return typeof Y==="string"?Y:JSON.stringify(Y)},async put($,X){await I7(J,$,X)},async delete($){await Q7(J,$)},async list($){let X=$?.prefix??"",Y=await P7(J,X);return{keys:(typeof $?.limit==="number"?Y.slice(0,$.limit):Y).map((W)=>({name:W})),list_complete:!0}}}}function _7(J,$){return U6({query:async(Y,Z=[])=>{let W=$(J.connectionString);if(typeof W.connect==="function")await W.connect();try{return await W.query(Y,Z)}finally{if(typeof W.release==="function")W.release();else if(typeof W.end==="function")await W.end()}}})}function O7(J,$){return H6({execute:async(Y,Z=[])=>{let W=$(J.connectionString);try{if(typeof W.execute==="function")return await W.execute(Y,Z);if(typeof W.query==="function")return await W.query(Y,Z);throw new j("Hyperdrive MySQL client is missing execute/query methods","MYSQL_CLIENT_INVALID")}finally{if(typeof W.end==="function")await W.end();else if(typeof W.close==="function")await W.close();else if(typeof W.destroy==="function")W.destroy()}}})}function F7(J){if(!J||typeof J!=="object")return!1;return typeof J.prepare==="function"}function j7(J){if(!J||typeof J!=="object")return!1;let $=J;return typeof $.get==="function"&&typeof $.put==="function"&&typeof $.delete==="function"&&typeof $.list==="function"}class RJ{client;sql;bindings;constructor(J,$,X=[]){this.client=J,this.sql=$,this.bindings=X}bind(...J){return new RJ(this.client,this.sql,J)}async run(){let J=Date.now(),$=DJ(this.sql),X=await this.client.query($,this.bindings);return{success:!0,results:X.rows??[],meta:v(J,{changes:typeof X.rowCount==="number"?X.rowCount:void 0,command:X.command})}}async all(){let J=Date.now(),$=DJ(this.sql),X=await this.client.query($,this.bindings);return{success:!0,results:X.rows??[],meta:v(J,{changes:typeof X.rowCount==="number"?X.rowCount:void 0,command:X.command})}}async first(){let J=DJ(this.sql);return(await this.client.query(J,this.bindings)).rows?.[0]??null}}class zJ{client;sql;bindings;constructor(J,$,X=[]){this.client=J,this.sql=$,this.bindings=X}bind(...J){return new zJ(this.client,this.sql,J)}async run(){let J=Date.now(),$=await TJ(this.client,this.sql,this.bindings);if(Array.isArray($))return{success:!0,results:$,meta:v(J)};let X=$;return{success:!0,results:[],meta:v(J,{changes:X.affectedRows,last_row_id:X.insertId,warningStatus:X.warningStatus})}}async all(){let J=Date.now(),$=await TJ(this.client,this.sql,this.bindings);return{success:!0,results:Array.isArray($)?$:[],meta:v(J,{changes:!Array.isArray($)?$.affectedRows:void 0})}}async first(){let J=await TJ(this.client,this.sql,this.bindings);if(!Array.isArray(J)||J.length===0)return null;return J[0]}}class MJ{client;sql;bindings;constructor(J,$,X=[]){this.client=J,this.sql=$,this.bindings=X}bind(...J){return new MJ(this.client,this.sql,J)}async run(){let J=Date.now();if(typeof this.client.execute==="function"){let Z=await this.client.execute(this.sql,this.bindings);return{success:!0,results:PJ(Z),meta:v(J)}}let $=this.client.prepare?.(this.sql);if(!$||typeof $.run!=="function")throw new j("SQLite client must expose execute() or prepare().run()","SQLITE_CLIENT_INVALID");let Y=await $.run(...this.bindings)??{};return{success:!0,results:[],meta:v(J,{changes:ZJ(Y.changes),last_row_id:Y.lastInsertRowid??Y.lastID})}}async all(){let J=Date.now();if(typeof this.client.execute==="function"){let Y=await this.client.execute(this.sql,this.bindings);return{success:!0,results:PJ(Y),meta:v(J)}}let $=this.client.prepare?.(this.sql);if(!$||typeof $.all!=="function")throw new j("SQLite client must expose execute() or prepare().all()","SQLITE_CLIENT_INVALID");let X=await $.all(...this.bindings);return{success:!0,results:Array.isArray(X)?X:[],meta:v(J)}}async first(){if(typeof this.client.execute==="function"){let $=await this.client.execute(this.sql,this.bindings);return PJ($)[0]??null}let J=this.client.prepare?.(this.sql);if(!J)throw new j("SQLite client must expose execute() or prepare().get()","SQLITE_CLIENT_INVALID");if(typeof J.get==="function"){let $=await J.get(...this.bindings);return $===void 0||$===null?null:$}if(typeof J.all==="function"){let $=await J.all(...this.bindings);if(!Array.isArray($)||$.length===0)return null;let X=$[0];return X===void 0||X===null?null:X}throw new j("SQLite prepare() result must expose get() or all()","SQLITE_CLIENT_INVALID")}}class BJ{client;sqlTag;sqlText;bindings;constructor(J,$,X,Y=[]){this.client=J,this.sqlTag=$,this.sqlText=X,this.bindings=Y}bind(...J){return new BJ(this.client,this.sqlTag,this.sqlText,J)}async run(){let J=Date.now(),$=IJ(this.sqlTag,this.sqlText,this.bindings),X=await L7(this.client,$);return{success:!0,results:QJ(X),meta:v(J,W6(X))}}async all(){let J=Date.now(),$=IJ(this.sqlTag,this.sqlText,this.bindings),X=await _6(this.client,$);return{success:!0,results:QJ(X),meta:v(J,W6(X))}}async first(){let J=IJ(this.sqlTag,this.sqlText,this.bindings),$=await V7(this.client,J),X=QJ($);if(X.length>0)return X[0]??null;if($&&typeof $==="object"&&"row"in $){let Y=$.row;return Y===void 0||Y===null?null:Y}if($&&typeof $==="object"&&!Array.isArray($)&&!("rows"in $)&&!("results"in $)&&!("data"in $))return $;return null}}async function A7(J,$,X,Y){try{let Z=await J.scan($,{MATCH:X,COUNT:Y});return Z6(Z)}catch{let Z=await J.scan($,"MATCH",X,"COUNT",String(Y));return Z6(Z)}}function Z6(J){if(Array.isArray(J))return{cursor:String(J[0]??"0"),keys:Array.isArray(J[1])?J[1]:[]};return{cursor:String(J.cursor??"0"),keys:Array.isArray(J.keys)?J.keys:[]}}async function TJ(J,$,X){if(typeof J.execute==="function"){let Y=await J.execute($,X);if(Array.isArray(Y))return Y[0];return Y}if(typeof J.query==="function"){let Y=await J.query($,X);if(Array.isArray(Y))return Y[0];return Y}throw new j("MySQL client must expose execute() or query()","MYSQL_CLIENT_INVALID")}async function L7(J,$){if(typeof J.run==="function")return await J.run($);if(typeof J.execute==="function")return await J.execute($);if(typeof J.all==="function")return await J.all($);throw new j("Drizzle client must expose run(), execute(), or all()","DRIZZLE_CLIENT_INVALID")}async function _6(J,$){if(typeof J.all==="function")return await J.all($);if(typeof J.execute==="function")return await J.execute($);if(typeof J.run==="function")return await J.run($);throw new j("Drizzle client must expose all(), execute(), or run()","DRIZZLE_CLIENT_INVALID")}async function V7(J,$){if(typeof J.get==="function")return await J.get($);return await _6(J,$)}function IJ(J,$,X){let Y=E7($),Z=Y.length-1;if(Z!==X.length)throw new j(`Drizzle binding mismatch: expected ${Z} bindings, received ${X.length}`,"DRIZZLE_BINDINGS_MISMATCH");if(Z===0)return J.raw($);let W=typeof J.empty==="function"?J.empty():J.raw("");for(let G=0;G<Y.length;G++){let U=Y[G];if(U)W.append(J.raw(U));if(G<Z)W.append(J`${X[G]}`)}return W}function E7(J){let $=[],X=0,Y=!1,Z=!1,W=!1,G=!1;for(let U=0;U<J.length;U++){let H=J[U],_=U+1<J.length?J[U+1]:"";if(W){if(H===`
17
+ `)W=!1;continue}if(G){if(H==="*"&&_==="/")U++,G=!1;continue}if(!Y&&!Z){if(H==="-"&&_==="-"){U++,W=!0;continue}if(H==="/"&&_==="*"){U++,G=!0;continue}}if(H==="'"&&!Z){if(Y&&_==="'"){U++;continue}Y=!Y;continue}if(H==='"'&&!Y){if(Z&&_==='"'){U++;continue}Z=!Z;continue}if(H==="?"&&!Y&&!Z)$.push(J.slice(X,U)),X=U+1}return $.push(J.slice(X)),$}function QJ(J){let $=(Y)=>{if(!Y||typeof Y!=="object"||Array.isArray(Y))return;let Z=Y;if(Array.isArray(Z.rows))return Z.rows;if(Array.isArray(Z.results))return Z.results;if(Array.isArray(Z.data))return Z.data;return},X=(Y)=>{if(!Y||typeof Y!=="object"||Array.isArray(Y))return!1;return Object.keys(Y).length>0};if(Array.isArray(J)){if(J.length===2){let Y=$(J[0]);if(Y)return Y;let Z=$(J[1]);if(Z)return Z;if(!Array.isArray(J[0])&&!Array.isArray(J[1])){if(X(J[0]))return[J[0]];if(X(J[1]))return[J[1]]}if(Array.isArray(J[0]))return J[0];if(Array.isArray(J[1]))return J[1]}return J}if(J&&typeof J==="object"){let Y=$(J);if(Y)return Y}return[]}function W6(J){if(!J)return{};let $;if(Array.isArray(J)){if(J.length===2){if(J[0]&&typeof J[0]==="object"&&!Array.isArray(J[0]))$=J[0];else if(J[1]&&typeof J[1]==="object"&&!Array.isArray(J[1]))$=J[1]}}else if(typeof J==="object"&&!Array.isArray(J))$=J;if(!$)return{};let X={},Y=ZJ($.rowCount)??ZJ($.changes)??ZJ($.affectedRows);if(Y!==void 0)X.changes=Y;let Z=$.lastInsertRowid??$.lastInsertId??$.lastID??$.lastRowID??$.insertId??$.insertID;if(typeof Z==="number"||typeof Z==="string")X.last_row_id=Z;if($.meta&&typeof $.meta==="object")Object.assign(X,$.meta);return X}async function T7(J,$){if(typeof J.get==="function")return await J.get($);if(typeof J.getItem==="function")return await J.getItem($);throw new j("NuxtHub KV client must expose get() or getItem()","NUXTHUB_KV_CLIENT_INVALID")}async function I7(J,$,X){if(typeof J.set==="function"){await J.set($,X);return}if(typeof J.setItem==="function"){await J.setItem($,X);return}throw new j("NuxtHub KV client must expose set() or setItem()","NUXTHUB_KV_CLIENT_INVALID")}async function Q7(J,$){if(typeof J.del==="function"){await J.del($);return}if(typeof J.removeItem==="function"){await J.removeItem($);return}throw new j("NuxtHub KV client must expose del() or removeItem()","NUXTHUB_KV_CLIENT_INVALID")}async function P7(J,$){let X;if(typeof J.keys==="function")X=await J.keys($);else if(typeof J.getKeys==="function")X=await J.getKeys($);else throw new j("NuxtHub KV client must expose keys() or getKeys()","NUXTHUB_KV_CLIENT_INVALID");if(!Array.isArray(X))return[];if(!$)return[...X];return X.filter((Y)=>Y.startsWith($))}function PJ(J){if(Array.isArray(J))return J;if(J&&typeof J==="object"){let $=J;if(Array.isArray($.rows))return $.rows;if(Array.isArray($.results))return $.results}return[]}function v(J,$={}){return{duration:Date.now()-J,...$}}function ZJ(J){if(typeof J==="number"&&Number.isFinite(J))return J;return}var s=new Map;function DJ(J){let $=s.get(J);if($)return $;let X="",Y=0,Z=!1,W=!1,G=!1,U=!1;for(let H=0;H<J.length;H++){let _=J[H],O=H+1<J.length?J[H+1]:"";if(G){if(X+=_,_===`
18
+ `)G=!1;continue}if(U){if(X+=_,_==="*"&&O==="/")X+="/",H++,U=!1;continue}if(!Z&&!W){if(_==="-"&&O==="-"){X+="--",H++,G=!0;continue}if(_==="/"&&O==="*"){X+="/*",H++,U=!0;continue}}if(_==="'"&&!W){Z=!Z,X+=_;continue}if(_==='"'&&!Z){W=!W,X+=_;continue}if(_==="?"&&!Z&&!W){Y++,X+=`$${Y}`;continue}X+=_}if(s.set(J,X),s.size>5000){let H=s.keys().next().value;if(H)s.delete(H)}return X}K();var D7={casing:{getColumnCasing(J){return J?.name??""}},escapeName(J){return J},escapeParam(){return"?"},escapeString(J){return J.replace(/'/g,"''")}};function c(J){return J.trim().replace(/^[`"\[]+|[`"\]]+$/g,"").split(".").pop()?.trim()??J.trim()}function R7(J){return J.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}class Q{static tokenize(J){return J.trim().split(/\s+/).map(($)=>$.toLowerCase())}static extractTableName(J){let $=this.tokenize(J);if($[0]==="create"&&$[1]==="table"){let W=2;if($[W]==="if")W+=3;return $[W]??null}if($[0]==="drop"&&$[1]==="table"){let W=2;if($[W]==="if")W+=2;return $[W]??null}let X=$.indexOf("from"),Y=$.indexOf("into"),Z=$.indexOf("update");if(X>=0&&X+1<$.length)return c($[X+1]??"");if(Y>=0&&Y+1<$.length)return c($[Y+1]??"");if(Z>=0&&Z+1<$.length)return c($[Z+1]??"");return null}static extractInsertColumns(J){let $=J.match(/insert\s+into\s+[^()]+\(([^)]+)\)/i);if(!$||!$[1])return null;return $[1].split(",").map((X)=>c(X)).filter((X)=>X.length>0)}static extractWhereClause(J){let $=J.match(/where\s+([`"\w.]+)\s*(=|like)\s*\?/i);if(!$||!$[1]||!$[2])return null;let X=$[2].toLowerCase()==="like"?"like":"=";return{column:c($[1]),operator:X}}static extractOrderByClause(J){let $=J.match(/order\s+by\s+([`"\w.]+)(?:\s+(asc|desc))?/i);if(!$||!$[1])return null;return{column:c($[1]),direction:$[2]?.toLowerCase()==="desc"?"desc":"asc"}}static matchesWhereClause(J,$,X){let Y=J[$.column];if($.operator==="like"){let Z=String(X??"");return new RegExp(`^${R7(Z).replace(/%/g,".*").replace(/_/g,".")}$`,"i").test(String(Y??""))}return String(Y??"")===String(X??"")}static isSelect(J){return this.tokenize(J)[0]==="select"}static isInsert(J){return this.tokenize(J)[0]==="insert"}static isCreateTable(J){let $=this.tokenize(J);return $[0]==="create"&&$[1]==="table"}static isDropTable(J){let $=this.tokenize(J);return $[0]==="drop"&&$[1]==="table"}static isDelete(J){return this.tokenize(J)[0]==="delete"}static isUpdate(J){return this.tokenize(J)[0]==="update"}static hasIdWhereClause(J){return J.includes("WHERE")&&J.includes("id")}static hasAutoIncrement(J){return J.includes("AUTOINCREMENT")||J.includes("AUTO_INCREMENT")||J.includes("GENERATED BY DEFAULT AS IDENTITY")}static hasReturning(J){return J.includes("RETURNING")}}function z7(J,$=[]){if(typeof J==="string")return{sql:J,bindings:$};if(!J||typeof J!=="object")throw new j("Unsupported query input","INVALID_QUERY_INPUT");if(typeof J.toQuery==="function"){let X=J.toQuery(D7);if(X&&typeof X.sql==="string")return{sql:X.sql,bindings:Array.isArray(X.params)?[...X.params]:$}}if(typeof J.sql==="string")return{sql:J.sql,bindings:Array.isArray(J.params)?[...J.params]:$};if(typeof J.text==="string")return{sql:J.text,bindings:Array.isArray(J.params)?[...J.params]:$};throw new j("Unsupported Drizzle-style query object","INVALID_QUERY_INPUT")}class wJ{tables=new Map;schemas=new Map;autoIncrementCounters=new Map;lastInsertRowId=null;prepare(J){return new O6(this,J)}async execute(J,$=[]){return await this.executeClientQuery(J,$)}async run(J,$=[]){return await this.executeClientQuery(J,$)}async all(J,$=[]){return await this.executeClientQuery(J,$)}async get(J,$=[]){return await this.executeClientQuery(J,$)}async executeClientQuery(J,$){let X=z7(J,$);return await this.executeStatement(X.sql,X.bindings)}async executeStatement(J,$){let X=Date.now();try{if(Q.isCreateTable(J))return await this.handleCreateTable(J,$);if(Q.isDropTable(J))return await this.handleDropTable(J,$);if(Q.isInsert(J))return await this.handleInsert(J,$);if(Q.isUpdate(J))return await this.handleUpdate(J,$);if(Q.isDelete(J))return await this.handleDelete(J,$);if(Q.isSelect(J))return await this.handleSelect(J,$);return{success:!0,results:[],meta:{duration:Date.now()-X}}}catch(Y){let Z=Y instanceof Error?Y.message:String(Y);return{success:!1,results:[],meta:{duration:Date.now()-X},error:Z}}}async executeQuery(J,$){let X=Date.now();try{if(Q.isSelect(J))return await this.handleSelect(J,$);return{success:!1,results:[],meta:{duration:Date.now()-X},error:"Use executeStatement for non-SELECT queries"}}catch(Y){let Z=Y instanceof Error?Y.message:String(Y);return{success:!1,results:[],meta:{duration:Date.now()-X},error:Z}}}async handleCreateTable(J,$){let X=Date.now(),Y=Q.extractTableName(J);if(!Y)return{success:!1,results:[],meta:{duration:Date.now()-X},error:"Could not extract table name"};let Z=new Map,W=J.match(/\((.*)\)/s);if(!W||!W[1])return this.tables.set(Y,new Map),this.schemas.set(Y,Z),{success:!0,results:[],meta:{duration:Date.now()-X}};let G=W[1],U=/(\w+)\s+([A-Z_]+)(\s+[^,)]*)?/gi,H;while((H=U.exec(G))!==null){let _=H[1]||"",O=H[2]||"",F=H[3]||"";Z.set(_,{name:_,type:O,isPrimaryKey:F.includes("PRIMARY KEY"),isAutoIncrement:F.includes("AUTOINCREMENT")||F.includes("AUTO_INCREMENT")||F.includes("GENERATED BY DEFAULT AS IDENTITY")})}if(this.tables.set(Y,new Map),this.schemas.set(Y,Z),Q.hasAutoIncrement(J))this.autoIncrementCounters.set(Y,0);return{success:!0,results:[],meta:{duration:Date.now()-X}}}async handleDropTable(J,$){let X=Date.now(),Y=Q.extractTableName(J);if(!Y)return{success:!1,results:[],meta:{duration:Date.now()-X},error:"Could not extract table name"};return this.tables.delete(Y),this.schemas.delete(Y),this.autoIncrementCounters.delete(Y),{success:!0,results:[],meta:{duration:Date.now()-X}}}async handleInsert(J,$){let X=Date.now(),Y=Q.extractTableName(J);if(!Y)return{success:!1,results:[],meta:{duration:Date.now()-X},error:"Could not extract table name"};if(!this.tables.has(Y))this.tables.set(Y,new Map);let Z=this.tables.get(Y),W=this.schemas.get(Y),G=W?Array.from(W.values()):[],U=G.find((L)=>L.isPrimaryKey),H=G.find((L)=>L.isAutoIncrement),_=Q.extractInsertColumns(J),O={};if(_&&_.length>0)_.forEach((L,B)=>{if(B<$.length)O[L]=$[B]});else if(W){let L=0;for(let[B]of W)if(L<$.length)O[B]=$[L],L++}else for(let L=0;L<$.length;L++)if(L===0)O.id=$[L];else O[`column_${L}`]=$[L];let F=U?.name??"id",A=O[F];if((A===void 0||A===null||A==="")&&H){let L=(this.autoIncrementCounters.get(Y)??0)+1;if(this.autoIncrementCounters.set(Y,L),O[H.name]=L,F!==H.name)O[F]=L;A=L}if(A===void 0||A===null||A==="")return{success:!1,results:[],meta:{duration:Date.now()-X},error:"No primary key value provided"};if(H){let L=typeof A==="number"?A:Number(A);if(Number.isFinite(L))this.autoIncrementCounters.set(Y,Math.max(this.autoIncrementCounters.get(Y)??0,L))}return Z.set(String(A),O),this.lastInsertRowId=A,{success:!0,results:Q.hasReturning(J)?[O]:[],meta:{duration:Date.now()-X,last_row_id:A,changes:1}}}async handleUpdate(J,$){let X=Date.now(),Y=Q.extractTableName(J);if(!Y)return{success:!1,results:[],meta:{duration:Date.now()-X},error:"Could not extract table name"};if(!this.tables.has(Y))return{success:!1,results:[],meta:{duration:Date.now()-X},error:`Table ${Y} not found`};let Z=this.tables.get(Y),W=Q.extractWhereClause(J);if(!W||$.length===0)return{success:!0,results:[],meta:{duration:Date.now()-X,changes:0}};let G=$[$.length-1],U=Array.from(Z.entries()).filter(([,H])=>Q.matchesWhereClause(H,W,G));if(U.length===0)return{success:!0,results:[],meta:{duration:Date.now()-X,changes:0}};for(let[,H]of U)for(let _=0;_<$.length-1;_++){let O=this.extractSetColumnName(J,_);if(O)H[O]=$[_]}return{success:!0,results:[],meta:{duration:Date.now()-X,changes:U.length}}}extractSetColumnName(J,$){let X=J.match(/SET\s+([^W]+?)(?:WHERE|$)/i);if(!X||!X[1])return null;return X[1].split(",").map((W)=>{let G=W.match(/(\w+)\s*=/);return G&&G[1]?G[1]:null})[$]??null}async handleDelete(J,$){let X=Date.now(),Y=Q.extractTableName(J);if(!Y)return{success:!1,results:[],meta:{duration:Date.now()-X},error:"Could not extract table name"};if(!this.tables.has(Y))return{success:!0,results:[],meta:{duration:Date.now()-X,changes:0}};let Z=this.tables.get(Y),W=Q.extractWhereClause(J);if(!W){let H=Z.size;return Z.clear(),{success:!0,results:[],meta:{duration:Date.now()-X,changes:H}}}let G=$[0],U=Array.from(Z.entries()).filter(([,H])=>Q.matchesWhereClause(H,W,G)).map(([H])=>H);for(let H of U)Z.delete(H);return{success:!0,results:[],meta:{duration:Date.now()-X,changes:U.length}}}async handleSelect(J,$){let X=Date.now(),Y=Q.extractTableName(J);if(!Y)return{success:!1,results:[],meta:{duration:Date.now()-X},error:"Could not extract table name"};if(!this.tables.has(Y))return{success:!0,results:[],meta:{duration:Date.now()-X}};let Z=this.tables.get(Y),W=Array.from(Z.values()),G=Q.extractWhereClause(J);if(G&&$.length>0)W=W.filter((H)=>Q.matchesWhereClause(H,G,$[0]));let U=Q.extractOrderByClause(J);if(U)W=[...W].sort((H,_)=>{let O=H[U.column],F=_[U.column];if(O===F)return 0;if(O===void 0||O===null)return U.direction==="desc"?1:-1;if(F===void 0||F===null)return U.direction==="desc"?-1:1;let A=String(O).localeCompare(String(F));return U.direction==="desc"?-A:A});if(J.includes("COUNT(*)")){let _=J.match(/COUNT\(\*\)\s+as\s+(\w+)/i)?.[1]??"COUNT(*)",O={};return O[_]=W.length,{success:!0,results:[O],meta:{duration:Date.now()-X}}}return{success:!0,results:W,meta:{duration:Date.now()-X}}}}class O6{database;sql;bindings=[];constructor(J,$){this.database=J;this.sql=$}bind(...J){return this.bindings=J,this}async run(){return await this.database.executeStatement(this.sql,this.bindings)}async all(){return await this.database.executeQuery(this.sql,this.bindings)}async first(){return(await this.database.executeQuery(this.sql,this.bindings)).results[0]||null}}class NJ{store=new Map;expirations=new Map;normalizeValue(J){return typeof J==="string"?J:JSON.stringify(J)??String(J)}async get(J,$="text"){let X=this.expirations.get(J);if(X&&X<Date.now())return this.store.delete(J),this.expirations.delete(J),null;let Y=this.store.get(J);if(Y===void 0)return null;if($==="json")try{return JSON.parse(Y)}catch(Z){throw new j(`Failed to parse JSON from KV for key ${J}: ${Z instanceof Error?Z.message:String(Z)}`,"KV_JSON_PARSE_FAILED")}return Y}async put(J,$,X){if(this.store.set(J,$),X?.expirationTtl)this.expirations.set(J,Date.now()+X.expirationTtl*1000);else this.expirations.delete(J)}async set(J,$,X){if(this.store.set(J,this.normalizeValue($)),X?.ttl)this.expirations.set(J,Date.now()+X.ttl*1000);else this.expirations.delete(J)}async del(J){await this.delete(J)}async keys(J=""){return(await this.list({prefix:J})).keys.map((X)=>X.name)}async getItem(J){return await this.get(J,"text")??null}async setItem(J,$){await this.set(J,$)}async removeItem(J){await this.delete(J)}async getKeys(J=""){return await this.keys(J)}async delete(J){this.store.delete(J),this.expirations.delete(J)}async list(J){let $=J?.prefix??"",X=J?.limit??1000,Y=J?.cursor?parseInt(J.cursor,10):0,Z=Date.now();for(let[_,O]of this.expirations)if(O<Z)this.store.delete(_),this.expirations.delete(_);let W=Array.from(this.store.keys()).filter((_)=>_.startsWith($)),G=W.slice(Y,Y+X).map((_)=>({name:_})),U=Y+X,H=U>=W.length;return{keys:G,cursor:H?void 0:String(U),list_complete:H}}clear(){this.store.clear(),this.expirations.clear()}size(){return this.store.size}}function M7(){return new wJ}function B7(){return new NJ}o();export{r as validateTableForSharding,jJ as schemaExists,AJ as runShard,rJ as runAllShards,sJ as run,D6 as resetConfig,h6 as reassignShard,$J as prepare,qJ as migrateRecord,p as listTables,p6 as listKnownShards,F7 as isSQLDatabase,j7 as isKVStorage,bJ as integrateExistingDatabase,q6 as insertShard,S6 as insert,cJ as initializeAsync,Q6 as initialize,t6 as indexShard,i6 as indexAllShards,s6 as index,Z7 as getTotalDatabaseSize,g6 as getShardStats,X6 as getDatabaseSizesAllShards,o6 as getDatabaseSizeForShard,Y7 as getDatabaseSizeForKey,M6 as getClosestRegionFromIP,d6 as flush,LJ as firstShard,b6 as firstByLookupKey,c6 as firstAllShardsGlobal,$6 as firstAllShards,aJ as first,r6 as explainShard,e6 as explainAllShards,a6 as explain,SJ as dropSchema,a as discoverExistingRecordsWithColumns,i as discoverExistingPrimaryKeys,G7 as createValkeyKVProvider,KJ as createSchemaAcrossShards,v6 as createSchema,U7 as createSQLiteProvider,G6 as createRedisKVProvider,U6 as createPostgreSQLProvider,H7 as createNuxtHubKVProvider,H6 as createMySQLProvider,fJ as createMappingsForExistingKeys,M7 as createInMemorySQLProvider,B7 as createInMemoryKVProvider,_7 as createHyperdrivePostgresProvider,O7 as createHyperdriveMySQLProvider,WJ as createDrizzleSQLProvider,$7 as countShard,X7 as countAllShards,J7 as count,P6 as collegedb,yJ as clearShardMigrationCache,gJ as clearMigrationCache,pJ as checkMigrationNeeded,hJ as autoDetectAndMigrate,XJ as allShard,f6 as allByLookupKey,J6 as allAllShardsGlobal,YJ as allAllShards,iJ as all,Y6 as ShardCoordinator,q as KVShardMapper,wJ as InMemorySQLDatabase,NJ as InMemoryKVStorage,j as CollegeDBError};
19
19
 
20
- //# debugId=C7AC24BF7882481C64756E2164756E21
20
+ //# debugId=9AFB8B23169E96D364756E2164756E21
21
21
  //# sourceMappingURL=index.js.map
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 * This module provides lightweight, zero-dependency in-memory implementations of\n * CollegeDB's KVStorage and SQLDatabase interfaces, perfect for:\n *\n * - Unit testing without external dependencies\n * - Integration testing with multiple shard combinations\n * - Local development and rapid iteration\n * - Sandboxed playtesting of routing logic\n *\n * Both providers are suitable for Cloudflare Workers, Node.js, and Deno environments.\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 extracted from CREATE TABLE statements.\n */\ninterface ColumnInfo {\n\tname: string;\n\ttype: string;\n\tisPrimaryKey: boolean;\n\tisAutoIncrement: boolean;\n}\n\n/**\n * Simple in-memory SQL query result parser for common patterns.\n * Not a full SQL parser - handles the most common CRUD operations.\n */\nclass SimpleQueryParser {\n\t/**\n\t * Parse a SQL string into tokens for basic analysis.\n\t */\n\tstatic tokenize(sql: string): string[] {\n\t\treturn sql\n\t\t\t.trim()\n\t\t\t.split(/\\s+/)\n\t\t\t.map((t) => t.toLowerCase());\n\t}\n\n\t/**\n\t * Extract table name from SQL statement.\n\t */\n\tstatic extractTableName(sql: string): string | null {\n\t\tconst tokens = this.tokenize(sql);\n\n\t\t// Handle CREATE TABLE [IF NOT EXISTS] table_name\n\t\tif (tokens[0] === 'create' && tokens[1] === 'table') {\n\t\t\tlet idx = 2;\n\t\t\tif (tokens[idx] === 'if') {\n\t\t\t\tidx += 3; // Skip 'if not exists'\n\t\t\t}\n\t\t\treturn tokens[idx] ?? null;\n\t\t}\n\n\t\t// Handle DROP TABLE [IF EXISTS] table_name\n\t\tif (tokens[0] === 'drop' && tokens[1] === 'table') {\n\t\t\tlet idx = 2;\n\t\t\tif (tokens[idx] === 'if') {\n\t\t\t\tidx += 2; // Skip 'if exists'\n\t\t\t}\n\t\t\treturn tokens[idx] ?? null;\n\t\t}\n\n\t\t// Handle SELECT, INSERT, UPDATE, DELETE\n\t\tconst fromIdx = tokens.indexOf('from');\n\t\tconst intoIdx = tokens.indexOf('into');\n\t\tconst updateIdx = tokens.indexOf('update');\n\n\t\tif (fromIdx >= 0 && fromIdx + 1 < tokens.length) {\n\t\t\treturn tokens[fromIdx + 1] ?? null;\n\t\t}\n\t\tif (intoIdx >= 0 && intoIdx + 1 < tokens.length) {\n\t\t\treturn tokens[intoIdx + 1] ?? null;\n\t\t}\n\t\tif (updateIdx >= 0 && updateIdx + 1 < tokens.length) {\n\t\t\treturn tokens[updateIdx + 1] ?? null;\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Check if SQL is a SELECT statement.\n\t */\n\tstatic isSelect(sql: string): boolean {\n\t\treturn this.tokenize(sql)[0] === 'select';\n\t}\n\n\t/**\n\t * Check if SQL is an INSERT statement.\n\t */\n\tstatic isInsert(sql: string): boolean {\n\t\treturn this.tokenize(sql)[0] === 'insert';\n\t}\n\n\t/**\n\t * Check if SQL is a CREATE TABLE statement.\n\t */\n\tstatic isCreateTable(sql: string): boolean {\n\t\tconst tokens = this.tokenize(sql);\n\t\treturn tokens[0] === 'create' && tokens[1] === 'table';\n\t}\n\n\t/**\n\t * Check if SQL is a DROP TABLE statement.\n\t */\n\tstatic isDropTable(sql: string): boolean {\n\t\tconst tokens = this.tokenize(sql);\n\t\treturn tokens[0] === 'drop' && tokens[1] === 'table';\n\t}\n\n\t/**\n\t * Check if SQL is a DELETE statement.\n\t */\n\tstatic isDelete(sql: string): boolean {\n\t\treturn this.tokenize(sql)[0] === 'delete';\n\t}\n\n\t/**\n\t * Check if SQL is an UPDATE statement.\n\t */\n\tstatic isUpdate(sql: string): boolean {\n\t\treturn this.tokenize(sql)[0] === 'update';\n\t}\n\n\t/**\n\t * Check if SQL has a WHERE clause with \"id = ?\".\n\t */\n\tstatic hasIdWhereClause(sql: string): boolean {\n\t\treturn sql.includes('WHERE') && sql.includes('id');\n\t}\n\n\t/**\n\t * Check for AUTOINCREMENT or AUTO_INCREMENT pattern.\n\t */\n\tstatic hasAutoIncrement(sql: string): boolean {\n\t\treturn sql.includes('AUTOINCREMENT') || sql.includes('AUTO_INCREMENT') || sql.includes('GENERATED BY DEFAULT AS IDENTITY');\n\t}\n\n\t/**\n\t * Check for RETURNING clause.\n\t */\n\tstatic hasReturning(sql: string): boolean {\n\t\treturn sql.includes('RETURNING');\n\t}\n}\n\n/**\n * In-memory implementation of SQLDatabase for testing.\n *\n * Supports basic CRUD operations without external dependencies.\n * Suitable for unit tests, integration tests, and development.\n */\nexport class InMemorySQLDatabase implements SQLDatabase {\n\tprivate tables = new Map<string, Map<string, Record<string, any>>>();\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\t/**\n\t * Internal method to execute a statement.\n\t */\n\tasync executeStatement(sql: string, bindings: any[]): Promise<QueryResult<Record<string, any>>> {\n\t\tconst startTime = Date.now();\n\n\t\ttry {\n\t\t\tif (SimpleQueryParser.isCreateTable(sql)) {\n\t\t\t\treturn await this.handleCreateTable(sql, bindings);\n\t\t\t}\n\n\t\t\tif (SimpleQueryParser.isDropTable(sql)) {\n\t\t\t\treturn await this.handleDropTable(sql, bindings);\n\t\t\t}\n\n\t\t\tif (SimpleQueryParser.isInsert(sql)) {\n\t\t\t\treturn await this.handleInsert(sql, bindings);\n\t\t\t}\n\n\t\t\tif (SimpleQueryParser.isUpdate(sql)) {\n\t\t\t\treturn await this.handleUpdate(sql, bindings);\n\t\t\t}\n\n\t\t\tif (SimpleQueryParser.isDelete(sql)) {\n\t\t\t\treturn await this.handleDelete(sql, bindings);\n\t\t\t}\n\n\t\t\tif (SimpleQueryParser.isSelect(sql)) {\n\t\t\t\treturn await this.handleSelect(sql, bindings);\n\t\t\t}\n\n\t\t\t// For other statements (PRAGMA, etc), return success\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} 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 * Internal method to execute a query.\n\t */\n\tasync executeQuery(sql: string, bindings: any[]): Promise<QueryResult<Record<string, any>>> {\n\t\tconst startTime = Date.now();\n\n\t\ttry {\n\t\t\tif (SimpleQueryParser.isSelect(sql)) {\n\t\t\t\treturn await this.handleSelect(sql, bindings);\n\t\t\t}\n\n\t\t\t// Non-SELECT queries should use executeStatement\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: 'Use executeStatement for non-SELECT queries'\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\tprivate async handleCreateTable(sql: string, bindings: any[]): Promise<QueryResult> {\n\t\tconst startTime = Date.now();\n\t\tconst tableName = SimpleQueryParser.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\t// Parse schema from CREATE TABLE statement\n\t\tconst schema = new Map<string, any>();\n\n\t\t// Extract the content between parentheses\n\t\tconst parenMatch = sql.match(/\\((.*)\\)/s);\n\t\tif (!parenMatch || !parenMatch[1]) {\n\t\t\tthis.tables.set(tableName, new Map());\n\t\t\tthis.schemas.set(tableName, schema);\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 tableDefinition = parenMatch[1];\n\t\tconst columnPattern = /(\\w+)\\s+([A-Z_]+)(\\s+[^,)]*)?/gi;\n\t\tlet match;\n\n\t\twhile ((match = columnPattern.exec(tableDefinition)) !== null) {\n\t\t\tconst colName = match[1] || '';\n\t\t\tconst colType = match[2] || '';\n\t\t\tconst modifiers = match[3] || '';\n\n\t\t\tschema.set(colName, {\n\t\t\t\tname: colName,\n\t\t\t\ttype: colType,\n\t\t\t\tisPrimaryKey: modifiers.includes('PRIMARY KEY'),\n\t\t\t\tisAutoIncrement:\n\t\t\t\t\tmodifiers.includes('AUTOINCREMENT') ||\n\t\t\t\t\tmodifiers.includes('AUTO_INCREMENT') ||\n\t\t\t\t\tmodifiers.includes('GENERATED BY DEFAULT AS IDENTITY')\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\tif (SimpleQueryParser.hasAutoIncrement(sql)) {\n\t\t\tthis.autoIncrementCounters.set(tableName, 0);\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, bindings: any[]): Promise<QueryResult> {\n\t\tconst startTime = Date.now();\n\t\tconst tableName = SimpleQueryParser.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 = SimpleQueryParser.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\n\t\t// For now, assume first binding is the primary key (for simple inserts)\n\t\t// This is a simplification - real SQL parsing would be more complex\n\t\tconst primaryKeyValue = bindings[0];\n\n\t\tif (!primaryKeyValue) {\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: 'No primary key value provided'\n\t\t\t};\n\t\t}\n\n\t\t// Build record from bindings\n\t\t// Assume column order matches binding order\n\t\tconst record: Record<string, any> = {};\n\n\t\t// Try to get column names from schema\n\t\tif (schema) {\n\t\t\tlet bindingIdx = 0;\n\t\t\tfor (const [colName, colInfo] of schema) {\n\t\t\t\tif (bindingIdx < bindings.length) {\n\t\t\t\t\trecord[colName] = bindings[bindingIdx];\n\t\t\t\t\tbindingIdx++;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// Fallback: generic column naming\n\t\t\tfor (let i = 0; i < bindings.length; i++) {\n\t\t\t\tif (i === 0) {\n\t\t\t\t\trecord['id'] = bindings[i];\n\t\t\t\t} else {\n\t\t\t\t\trecord[`column_${i}`] = bindings[i];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\ttable.set(String(primaryKeyValue), record);\n\t\tthis.lastInsertRowId = primaryKeyValue;\n\n\t\tconst hasReturning = SimpleQueryParser.hasReturning(sql);\n\t\tconst results = hasReturning ? [record] : [];\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: primaryKeyValue,\n\t\t\t\tchanges: 1\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 = SimpleQueryParser.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 table = this.tables.get(tableName)!;\n\n\t\tif (!SimpleQueryParser.hasIdWhereClause(sql)) {\n\t\t\t// Generic update without WHERE id - skip\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\t// Assume last binding is the id in WHERE clause\n\t\tconst primaryKeyValue = bindings[bindings.length - 1];\n\t\tconst record = table.get(String(primaryKeyValue));\n\n\t\tif (!record) {\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\t// Apply updates to the record\n\t\t// Assume bindings before the last one are the updated values in SET order\n\t\tfor (let i = 0; i < bindings.length - 1; i++) {\n\t\t\tconst colName = this.extractSetColumnName(sql, i);\n\t\t\tif (colName) {\n\t\t\t\trecord[colName] = bindings[i];\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, changes: 1 }\n\t\t};\n\t}\n\n\tprivate extractSetColumnName(sql: string, setIndex: number): string | null {\n\t\t// Extract column names from SET clause\n\t\tconst setMatch = sql.match(/SET\\s+([^W]+?)(?:WHERE|$)/i);\n\t\tif (!setMatch || !setMatch[1]) return null;\n\n\t\tconst setPart = setMatch[1];\n\t\tconst columns = setPart.split(',').map((part) => {\n\t\t\tconst match = part.match(/(\\w+)\\s*=/);\n\t\t\treturn match && match[1] ? match[1] : null;\n\t\t});\n\n\t\treturn columns[setIndex] ?? null;\n\t}\n\n\tprivate async handleDelete(sql: string, bindings: any[]): Promise<QueryResult> {\n\t\tconst startTime = Date.now();\n\t\tconst tableName = SimpleQueryParser.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\tif (!SimpleQueryParser.hasIdWhereClause(sql)) {\n\t\t\t// DELETE without WHERE id - delete all\n\t\t\tconst size = 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: size }\n\t\t\t};\n\t\t}\n\n\t\tconst primaryKeyValue = bindings[0];\n\t\tconst hadRecord = table.has(String(primaryKeyValue));\n\n\t\tif (hadRecord) {\n\t\t\ttable.delete(String(primaryKeyValue));\n\t\t}\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults: [],\n\t\t\tmeta: { duration: Date.now() - startTime, changes: hadRecord ? 1 : 0 }\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 = SimpleQueryParser.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\n\t\t// Handle COUNT queries\n\t\tif (sql.includes('COUNT(*)')) {\n\t\t\t// Extract alias if present (e.g., \"COUNT(*) as count\")\n\t\t\tconst aliasMatch = sql.match(/COUNT\\(\\*\\)\\s+as\\s+(\\w+)/i);\n\t\t\tconst countKey = aliasMatch?.[1] ?? 'COUNT(*)';\n\t\t\tconst result: Record<string, number> = {};\n\t\t\tresult[countKey] = table.size;\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tresults: [result],\n\t\t\t\tmeta: { duration: Date.now() - startTime }\n\t\t\t};\n\t\t}\n\n\t\tlet results = Array.from(table.values());\n\n\t\t// Handle WHERE id = ? clause\n\t\tif (SimpleQueryParser.hasIdWhereClause(sql) && bindings.length > 0) {\n\t\t\tconst primaryKeyValue = bindings[0];\n\t\t\tconst record = table.get(String(primaryKeyValue));\n\t\t\tresults = record ? [record] : [];\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 * Prepared statement wrapper for in-memory SQL database.\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\treturn (await this.database.executeQuery(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.executeQuery(this.sql, this.bindings);\n\t\treturn (result.results[0] as T) || null;\n\t}\n}\n\n/**\n * In-memory implementation of KVStorage for testing.\n *\n * Simple key-value store with support for prefix listing and cursor-based pagination.\n * Suitable for unit tests, integration tests, and development.\n */\nexport class InMemoryKVStorage implements KVStorage {\n\tprivate store = new Map<string, string>();\n\tprivate expirations = new Map<string, number>();\n\n\tasync get<T = unknown>(key: string, type: 'text' | 'json' = 'text'): Promise<T | string | null> {\n\t\t// Check expiration\n\t\tconst expiration = this.expirations.get(key);\n\t\tif (expiration && 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\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 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\tconst prefix = options?.prefix ?? '';\n\t\tconst limit = options?.limit ?? 1000;\n\t\tlet cursor = options?.cursor ? parseInt(options.cursor, 10) : 0;\n\n\t\t// Clean up expired keys first\n\t\tconst now = Date.now();\n\t\tfor (const [key, expiration] of this.expirations) {\n\t\t\tif (expiration < 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\n\t\t// Filter keys by prefix\n\t\tconst allKeys = Array.from(this.store.keys()).filter((k) => k.startsWith(prefix));\n\n\t\t// Apply cursor-based pagination\n\t\tconst keys = 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,\n\t\t\tcursor: listComplete ? undefined : String(nextCursor),\n\t\t\tlist_complete: listComplete\n\t\t};\n\t}\n\n\t/**\n\t * Clear all data from the store.\n\t */\n\tclear(): void {\n\t\tthis.store.clear();\n\t\tthis.expirations.clear();\n\t}\n\n\t/**\n\t * Get the current size of the store.\n\t */\n\tsize(): number {\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(): SQLDatabase {\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(): KVStorage {\n\treturn new InMemoryKVStorage();\n}\n"
12
+ "/**\n * @fileoverview In-memory mock providers for testing and development.\n *\n * This module provides lightweight, zero-dependency in-memory implementations of\n * CollegeDB's KVStorage and SQLDatabase interfaces, perfect for:\n *\n * - Unit testing without external dependencies\n * - Integration testing with multiple shard combinations\n * - Local development and rapid iteration\n * - Sandboxed playtesting of routing logic\n *\n * Both providers are suitable for Cloudflare Workers, Node.js, and Deno environments.\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 extracted from CREATE TABLE statements.\n */\ninterface ColumnInfo {\n\tname: string;\n\ttype: string;\n\tisPrimaryKey: boolean;\n\tisAutoIncrement: boolean;\n}\n\ntype InMemoryDrizzleQuery = {\n\ttoQuery?: (config: Record<string, unknown>) => { sql?: string; params?: unknown[] };\n\tsql?: string;\n\tparams?: unknown[];\n\ttext?: string;\n};\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\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\nfunction escapeRegExp(value: string): string {\n\treturn value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Simple in-memory SQL query result parser for common patterns.\n * Not a full SQL parser - handles the most common CRUD operations.\n */\nclass SimpleQueryParser {\n\t/**\n\t * Parse a SQL string into tokens for basic analysis.\n\t */\n\tstatic tokenize(sql: string): string[] {\n\t\treturn sql\n\t\t\t.trim()\n\t\t\t.split(/\\s+/)\n\t\t\t.map((t) => t.toLowerCase());\n\t}\n\n\t/**\n\t * Extract table name from SQL statement.\n\t */\n\tstatic extractTableName(sql: string): string | null {\n\t\tconst tokens = this.tokenize(sql);\n\n\t\t// Handle CREATE TABLE [IF NOT EXISTS] table_name\n\t\tif (tokens[0] === 'create' && tokens[1] === 'table') {\n\t\t\tlet idx = 2;\n\t\t\tif (tokens[idx] === 'if') {\n\t\t\t\tidx += 3; // Skip 'if not exists'\n\t\t\t}\n\t\t\treturn tokens[idx] ?? null;\n\t\t}\n\n\t\t// Handle DROP TABLE [IF EXISTS] table_name\n\t\tif (tokens[0] === 'drop' && tokens[1] === 'table') {\n\t\t\tlet idx = 2;\n\t\t\tif (tokens[idx] === 'if') {\n\t\t\t\tidx += 2; // Skip 'if exists'\n\t\t\t}\n\t\t\treturn tokens[idx] ?? null;\n\t\t}\n\n\t\t// Handle SELECT, INSERT, UPDATE, DELETE\n\t\tconst fromIdx = tokens.indexOf('from');\n\t\tconst intoIdx = tokens.indexOf('into');\n\t\tconst updateIdx = tokens.indexOf('update');\n\n\t\tif (fromIdx >= 0 && fromIdx + 1 < tokens.length) {\n\t\t\treturn normalizeSqlIdentifier(tokens[fromIdx + 1] ?? '');\n\t\t}\n\t\tif (intoIdx >= 0 && intoIdx + 1 < tokens.length) {\n\t\t\treturn normalizeSqlIdentifier(tokens[intoIdx + 1] ?? '');\n\t\t}\n\t\tif (updateIdx >= 0 && updateIdx + 1 < tokens.length) {\n\t\t\treturn normalizeSqlIdentifier(tokens[updateIdx + 1] ?? '');\n\t\t}\n\t\treturn null;\n\t}\n\n\tstatic extractInsertColumns(sql: string): string[] | null {\n\t\tconst match = sql.match(/insert\\s+into\\s+[^()]+\\(([^)]+)\\)/i);\n\t\tif (!match || !match[1]) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn match[1]\n\t\t\t.split(',')\n\t\t\t.map((column) => normalizeSqlIdentifier(column))\n\t\t\t.filter((column) => column.length > 0);\n\t}\n\n\tstatic extractWhereClause(sql: string): { column: string; operator: '=' | 'like' } | null {\n\t\tconst match = sql.match(/where\\s+([`\"\\w.]+)\\s*(=|like)\\s*\\?/i);\n\t\tif (!match || !match[1] || !match[2]) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst operator = match[2].toLowerCase() === 'like' ? 'like' : '=';\n\t\treturn {\n\t\t\tcolumn: normalizeSqlIdentifier(match[1]),\n\t\t\toperator\n\t\t};\n\t}\n\n\tstatic extractOrderByClause(sql: string): { column: string; direction: 'asc' | 'desc' } | null {\n\t\tconst match = sql.match(/order\\s+by\\s+([`\"\\w.]+)(?:\\s+(asc|desc))?/i);\n\t\tif (!match || !match[1]) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn {\n\t\t\tcolumn: normalizeSqlIdentifier(match[1]),\n\t\t\tdirection: match[2]?.toLowerCase() === 'desc' ? 'desc' : 'asc'\n\t\t};\n\t}\n\n\tstatic matchesWhereClause(record: Record<string, any>, clause: { column: string; operator: '=' | 'like' }, value: unknown): boolean {\n\t\tconst fieldValue = record[clause.column];\n\n\t\tif (clause.operator === 'like') {\n\t\t\tconst pattern = String(value ?? '');\n\t\t\tconst regex = new RegExp(`^${escapeRegExp(pattern).replace(/%/g, '.*').replace(/_/g, '.')}$`, 'i');\n\t\t\treturn regex.test(String(fieldValue ?? ''));\n\t\t}\n\n\t\treturn String(fieldValue ?? '') === String(value ?? '');\n\t}\n\n\t/**\n\t * Check if SQL is a SELECT statement.\n\t */\n\tstatic isSelect(sql: string): boolean {\n\t\treturn this.tokenize(sql)[0] === 'select';\n\t}\n\n\t/**\n\t * Check if SQL is an INSERT statement.\n\t */\n\tstatic isInsert(sql: string): boolean {\n\t\treturn this.tokenize(sql)[0] === 'insert';\n\t}\n\n\t/**\n\t * Check if SQL is a CREATE TABLE statement.\n\t */\n\tstatic isCreateTable(sql: string): boolean {\n\t\tconst tokens = this.tokenize(sql);\n\t\treturn tokens[0] === 'create' && tokens[1] === 'table';\n\t}\n\n\t/**\n\t * Check if SQL is a DROP TABLE statement.\n\t */\n\tstatic isDropTable(sql: string): boolean {\n\t\tconst tokens = this.tokenize(sql);\n\t\treturn tokens[0] === 'drop' && tokens[1] === 'table';\n\t}\n\n\t/**\n\t * Check if SQL is a DELETE statement.\n\t */\n\tstatic isDelete(sql: string): boolean {\n\t\treturn this.tokenize(sql)[0] === 'delete';\n\t}\n\n\t/**\n\t * Check if SQL is an UPDATE statement.\n\t */\n\tstatic isUpdate(sql: string): boolean {\n\t\treturn this.tokenize(sql)[0] === 'update';\n\t}\n\n\t/**\n\t * Check if SQL has a WHERE clause with \"id = ?\".\n\t */\n\tstatic hasIdWhereClause(sql: string): boolean {\n\t\treturn sql.includes('WHERE') && sql.includes('id');\n\t}\n\n\t/**\n\t * Check for AUTOINCREMENT or AUTO_INCREMENT pattern.\n\t */\n\tstatic hasAutoIncrement(sql: string): boolean {\n\t\treturn sql.includes('AUTOINCREMENT') || sql.includes('AUTO_INCREMENT') || sql.includes('GENERATED BY DEFAULT AS IDENTITY');\n\t}\n\n\t/**\n\t * Check for RETURNING clause.\n\t */\n\tstatic hasReturning(sql: string): boolean {\n\t\treturn sql.includes('RETURNING');\n\t}\n}\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 * In-memory implementation of SQLDatabase for testing.\n *\n * Supports basic CRUD operations without external dependencies.\n * Suitable for unit tests, integration tests, and development.\n */\nexport class InMemorySQLDatabase implements SQLDatabase {\n\tprivate tables = new Map<string, Map<string, Record<string, any>>>();\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, any>>> {\n\t\treturn await this.executeClientQuery(query, bindings);\n\t}\n\n\tasync run(query: string | InMemoryDrizzleQuery, bindings: any[] = []): Promise<QueryResult<Record<string, any>>> {\n\t\treturn await this.executeClientQuery(query, bindings);\n\t}\n\n\tasync all(query: string | InMemoryDrizzleQuery, bindings: any[] = []): Promise<QueryResult<Record<string, any>>> {\n\t\treturn await this.executeClientQuery(query, bindings);\n\t}\n\n\tasync get(query: string | InMemoryDrizzleQuery, bindings: any[] = []): Promise<QueryResult<Record<string, any>>> {\n\t\treturn await this.executeClientQuery(query, bindings);\n\t}\n\n\tprivate async executeClientQuery(query: string | InMemoryDrizzleQuery, bindings: any[]): Promise<QueryResult<Record<string, any>>> {\n\t\tconst normalized = normalizeInMemoryDrizzleQuery(query, bindings);\n\t\treturn await this.executeStatement(normalized.sql, normalized.bindings);\n\t}\n\n\t/**\n\t * Internal method to execute a statement.\n\t */\n\tasync executeStatement(sql: string, bindings: any[]): Promise<QueryResult<Record<string, any>>> {\n\t\tconst startTime = Date.now();\n\n\t\ttry {\n\t\t\tif (SimpleQueryParser.isCreateTable(sql)) {\n\t\t\t\treturn await this.handleCreateTable(sql, bindings);\n\t\t\t}\n\n\t\t\tif (SimpleQueryParser.isDropTable(sql)) {\n\t\t\t\treturn await this.handleDropTable(sql, bindings);\n\t\t\t}\n\n\t\t\tif (SimpleQueryParser.isInsert(sql)) {\n\t\t\t\treturn await this.handleInsert(sql, bindings);\n\t\t\t}\n\n\t\t\tif (SimpleQueryParser.isUpdate(sql)) {\n\t\t\t\treturn await this.handleUpdate(sql, bindings);\n\t\t\t}\n\n\t\t\tif (SimpleQueryParser.isDelete(sql)) {\n\t\t\t\treturn await this.handleDelete(sql, bindings);\n\t\t\t}\n\n\t\t\tif (SimpleQueryParser.isSelect(sql)) {\n\t\t\t\treturn await this.handleSelect(sql, bindings);\n\t\t\t}\n\n\t\t\t// For other statements (PRAGMA, etc), return success\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} 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 * Internal method to execute a query.\n\t */\n\tasync executeQuery(sql: string, bindings: any[]): Promise<QueryResult<Record<string, any>>> {\n\t\tconst startTime = Date.now();\n\n\t\ttry {\n\t\t\tif (SimpleQueryParser.isSelect(sql)) {\n\t\t\t\treturn await this.handleSelect(sql, bindings);\n\t\t\t}\n\n\t\t\t// Non-SELECT queries should use executeStatement\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: 'Use executeStatement for non-SELECT queries'\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\tprivate async handleCreateTable(sql: string, bindings: any[]): Promise<QueryResult> {\n\t\tconst startTime = Date.now();\n\t\tconst tableName = SimpleQueryParser.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\t// Parse schema from CREATE TABLE statement\n\t\tconst schema = new Map<string, any>();\n\n\t\t// Extract the content between parentheses\n\t\tconst parenMatch = sql.match(/\\((.*)\\)/s);\n\t\tif (!parenMatch || !parenMatch[1]) {\n\t\t\tthis.tables.set(tableName, new Map());\n\t\t\tthis.schemas.set(tableName, schema);\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 tableDefinition = parenMatch[1];\n\t\tconst columnPattern = /(\\w+)\\s+([A-Z_]+)(\\s+[^,)]*)?/gi;\n\t\tlet match;\n\n\t\twhile ((match = columnPattern.exec(tableDefinition)) !== null) {\n\t\t\tconst colName = match[1] || '';\n\t\t\tconst colType = match[2] || '';\n\t\t\tconst modifiers = match[3] || '';\n\n\t\t\tschema.set(colName, {\n\t\t\t\tname: colName,\n\t\t\t\ttype: colType,\n\t\t\t\tisPrimaryKey: modifiers.includes('PRIMARY KEY'),\n\t\t\t\tisAutoIncrement:\n\t\t\t\t\tmodifiers.includes('AUTOINCREMENT') ||\n\t\t\t\t\tmodifiers.includes('AUTO_INCREMENT') ||\n\t\t\t\t\tmodifiers.includes('GENERATED BY DEFAULT AS IDENTITY')\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\tif (SimpleQueryParser.hasAutoIncrement(sql)) {\n\t\t\tthis.autoIncrementCounters.set(tableName, 0);\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, bindings: any[]): Promise<QueryResult> {\n\t\tconst startTime = Date.now();\n\t\tconst tableName = SimpleQueryParser.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 = SimpleQueryParser.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\t\tconst insertColumns = SimpleQueryParser.extractInsertColumns(sql);\n\t\tconst record: Record<string, any> = {};\n\n\t\t// Build record from the explicit INSERT column order when available.\n\t\t// Otherwise fall back to schema order for simple legacy statements.\n\t\tif (insertColumns && insertColumns.length > 0) {\n\t\t\tinsertColumns.forEach((columnName, index) => {\n\t\t\t\tif (index < bindings.length) {\n\t\t\t\t\trecord[columnName] = bindings[index];\n\t\t\t\t}\n\t\t\t});\n\t\t} else if (schema) {\n\t\t\tlet bindingIdx = 0;\n\t\t\tfor (const [colName] of schema) {\n\t\t\t\tif (bindingIdx < bindings.length) {\n\t\t\t\t\trecord[colName] = bindings[bindingIdx];\n\t\t\t\t\tbindingIdx++;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor (let i = 0; i < bindings.length; i++) {\n\t\t\t\tif (i === 0) {\n\t\t\t\t\trecord.id = bindings[i];\n\t\t\t\t} else {\n\t\t\t\t\trecord[`column_${i}`] = bindings[i];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst primaryKeyColumn = primaryKeyInfo?.name ?? 'id';\n\t\tlet primaryKeyValue = record[primaryKeyColumn];\n\n\t\tif ((primaryKeyValue === undefined || primaryKeyValue === null || primaryKeyValue === '') && autoIncrementInfo) {\n\t\t\tconst nextValue = (this.autoIncrementCounters.get(tableName) ?? 0) + 1;\n\t\t\tthis.autoIncrementCounters.set(tableName, nextValue);\n\t\t\trecord[autoIncrementInfo.name] = nextValue;\n\t\t\tif (primaryKeyColumn !== autoIncrementInfo.name) {\n\t\t\t\trecord[primaryKeyColumn] = nextValue;\n\t\t\t}\n\t\t\tprimaryKeyValue = nextValue;\n\t\t}\n\n\t\tif (primaryKeyValue === undefined || primaryKeyValue === null || primaryKeyValue === '') {\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: 'No primary key value provided'\n\t\t\t};\n\t\t}\n\n\t\tif (autoIncrementInfo) {\n\t\t\tconst numericPrimaryKey = typeof primaryKeyValue === 'number' ? primaryKeyValue : Number(primaryKeyValue);\n\t\t\tif (Number.isFinite(numericPrimaryKey)) {\n\t\t\t\tthis.autoIncrementCounters.set(tableName, Math.max(this.autoIncrementCounters.get(tableName) ?? 0, numericPrimaryKey));\n\t\t\t}\n\t\t}\n\n\t\ttable.set(String(primaryKeyValue), record);\n\t\tthis.lastInsertRowId = primaryKeyValue;\n\n\t\tconst hasReturning = SimpleQueryParser.hasReturning(sql);\n\t\tconst results = hasReturning ? [record] : [];\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: primaryKeyValue,\n\t\t\t\tchanges: 1\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 = SimpleQueryParser.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 table = this.tables.get(tableName)!;\n\t\tconst whereClause = SimpleQueryParser.extractWhereClause(sql);\n\t\tif (!whereClause || bindings.length === 0) {\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 whereValue = bindings[bindings.length - 1];\n\t\tconst records = Array.from(table.entries()).filter(([, record]) =>\n\t\t\tSimpleQueryParser.matchesWhereClause(record, whereClause, whereValue)\n\t\t);\n\n\t\tif (records.length === 0) {\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\t// Apply updates to each matched record.\n\t\t// Assume bindings before the last one are the updated values in SET order.\n\t\tfor (const [, record] of records) {\n\t\t\tfor (let i = 0; i < bindings.length - 1; i++) {\n\t\t\t\tconst colName = this.extractSetColumnName(sql, i);\n\t\t\t\tif (colName) {\n\t\t\t\t\trecord[colName] = bindings[i];\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, changes: records.length }\n\t\t};\n\t}\n\n\tprivate extractSetColumnName(sql: string, setIndex: number): string | null {\n\t\t// Extract column names from SET clause\n\t\tconst setMatch = sql.match(/SET\\s+([^W]+?)(?:WHERE|$)/i);\n\t\tif (!setMatch || !setMatch[1]) return null;\n\n\t\tconst setPart = setMatch[1];\n\t\tconst columns = setPart.split(',').map((part) => {\n\t\t\tconst match = part.match(/(\\w+)\\s*=/);\n\t\t\treturn match && match[1] ? match[1] : null;\n\t\t});\n\n\t\treturn columns[setIndex] ?? null;\n\t}\n\n\tprivate async handleDelete(sql: string, bindings: any[]): Promise<QueryResult> {\n\t\tconst startTime = Date.now();\n\t\tconst tableName = SimpleQueryParser.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 = SimpleQueryParser.extractWhereClause(sql);\n\t\tif (!whereClause) {\n\t\t\t// DELETE without a WHERE clause - delete all\n\t\t\tconst size = 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: size }\n\t\t\t};\n\t\t}\n\n\t\tconst whereValue = bindings[0];\n\t\tconst matchingKeys = Array.from(table.entries())\n\t\t\t.filter(([, record]) => SimpleQueryParser.matchesWhereClause(record, whereClause, whereValue))\n\t\t\t.map(([key]) => key);\n\n\t\tfor (const key of matchingKeys) {\n\t\t\ttable.delete(key);\n\t\t}\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults: [],\n\t\t\tmeta: { duration: Date.now() - startTime, changes: matchingKeys.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 = SimpleQueryParser.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\tlet results = Array.from(table.values());\n\n\t\tconst whereClause = SimpleQueryParser.extractWhereClause(sql);\n\t\tif (whereClause && bindings.length > 0) {\n\t\t\tresults = results.filter((record) => SimpleQueryParser.matchesWhereClause(record, whereClause, bindings[0]));\n\t\t}\n\n\t\tconst orderByClause = SimpleQueryParser.extractOrderByClause(sql);\n\t\tif (orderByClause) {\n\t\t\tresults = [...results].sort((left, right) => {\n\t\t\t\tconst leftValue = left[orderByClause.column];\n\t\t\t\tconst rightValue = right[orderByClause.column];\n\n\t\t\t\tif (leftValue === rightValue) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\tif (leftValue === undefined || leftValue === null) {\n\t\t\t\t\treturn orderByClause.direction === 'desc' ? 1 : -1;\n\t\t\t\t}\n\n\t\t\t\tif (rightValue === undefined || rightValue === null) {\n\t\t\t\t\treturn orderByClause.direction === 'desc' ? -1 : 1;\n\t\t\t\t}\n\n\t\t\t\tconst comparison = String(leftValue).localeCompare(String(rightValue));\n\t\t\t\treturn orderByClause.direction === 'desc' ? -comparison : comparison;\n\t\t\t});\n\t\t}\n\n\t\t// Handle COUNT queries after filters are applied.\n\t\tif (sql.includes('COUNT(*)')) {\n\t\t\tconst aliasMatch = sql.match(/COUNT\\(\\*\\)\\s+as\\s+(\\w+)/i);\n\t\t\tconst countKey = aliasMatch?.[1] ?? 'COUNT(*)';\n\t\t\tconst result: Record<string, number> = {};\n\t\t\tresult[countKey] = results.length;\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tresults: [result],\n\t\t\t\tmeta: { duration: Date.now() - startTime }\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 * Prepared statement wrapper for in-memory SQL database.\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\treturn (await this.database.executeQuery(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.executeQuery(this.sql, this.bindings);\n\t\treturn (result.results[0] as T) || null;\n\t}\n}\n\n/**\n * In-memory implementation of KVStorage for testing.\n *\n * Simple key-value store with support for prefix listing and cursor-based pagination.\n * Suitable for unit tests, integration tests, and development.\n */\nexport class InMemoryKVStorage implements KVStorage {\n\tprivate store = new Map<string, string>();\n\tprivate expirations = new Map<string, number>();\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\t// Check expiration\n\t\tconst expiration = this.expirations.get(key);\n\t\tif (expiration && 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\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\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\tconst prefix = options?.prefix ?? '';\n\t\tconst limit = options?.limit ?? 1000;\n\t\tlet cursor = options?.cursor ? parseInt(options.cursor, 10) : 0;\n\n\t\t// Clean up expired keys first\n\t\tconst now = Date.now();\n\t\tfor (const [key, expiration] of this.expirations) {\n\t\t\tif (expiration < 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\n\t\t// Filter keys by prefix\n\t\tconst allKeys = Array.from(this.store.keys()).filter((k) => k.startsWith(prefix));\n\n\t\t// Apply cursor-based pagination\n\t\tconst keys = 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,\n\t\t\tcursor: listComplete ? undefined : String(nextCursor),\n\t\t\tlist_complete: listComplete\n\t\t};\n\t}\n\n\t/**\n\t * Clear all data from the store.\n\t */\n\tclear(): void {\n\t\tthis.store.clear();\n\t\tthis.expirations.clear();\n\t}\n\n\t/**\n\t * Get the current size of the store.\n\t */\n\tsize(): number {\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": "C7AC24BF7882481C64756E2164756E21",
14
+ "mappings": "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",
15
+ "debugId": "9AFB8B23169E96D364756E2164756E21",
16
16
  "names": []
17
17
  }
@@ -15,6 +15,15 @@
15
15
  * @since 1.2.0
16
16
  */
17
17
  import type { KVListResult, KVStorage, PreparedStatement, QueryResult, SQLDatabase } from './types';
18
+ type InMemoryDrizzleQuery = {
19
+ toQuery?: (config: Record<string, unknown>) => {
20
+ sql?: string;
21
+ params?: unknown[];
22
+ };
23
+ sql?: string;
24
+ params?: unknown[];
25
+ text?: string;
26
+ };
18
27
  /**
19
28
  * In-memory implementation of SQLDatabase for testing.
20
29
  *
@@ -27,6 +36,11 @@ export declare class InMemorySQLDatabase implements SQLDatabase {
27
36
  private autoIncrementCounters;
28
37
  private lastInsertRowId;
29
38
  prepare(sql: string): PreparedStatement;
39
+ execute(query: string | InMemoryDrizzleQuery, bindings?: any[]): Promise<QueryResult<Record<string, any>>>;
40
+ run(query: string | InMemoryDrizzleQuery, bindings?: any[]): Promise<QueryResult<Record<string, any>>>;
41
+ all(query: string | InMemoryDrizzleQuery, bindings?: any[]): Promise<QueryResult<Record<string, any>>>;
42
+ get(query: string | InMemoryDrizzleQuery, bindings?: any[]): Promise<QueryResult<Record<string, any>>>;
43
+ private executeClientQuery;
30
44
  /**
31
45
  * Internal method to execute a statement.
32
46
  */
@@ -52,10 +66,21 @@ export declare class InMemorySQLDatabase implements SQLDatabase {
52
66
  export declare class InMemoryKVStorage implements KVStorage {
53
67
  private store;
54
68
  private expirations;
55
- get<T = unknown>(key: string, type?: 'text' | 'json'): Promise<T | string | null>;
69
+ private normalizeValue;
70
+ get<T = unknown>(key: string, type: 'json'): Promise<T | null>;
71
+ get(key: string, type?: 'text'): Promise<string | null>;
56
72
  put(key: string, value: string, options?: {
57
73
  expirationTtl?: number;
58
74
  }): Promise<void>;
75
+ set(key: string, value: unknown, options?: {
76
+ ttl?: number;
77
+ }): Promise<void>;
78
+ del(key: string): Promise<void>;
79
+ keys(prefix?: string): Promise<string[]>;
80
+ getItem<T = unknown>(key: string): Promise<T | null>;
81
+ setItem(key: string, value: unknown): Promise<void>;
82
+ removeItem(key: string): Promise<void>;
83
+ getKeys(prefix?: string): Promise<string[]>;
59
84
  delete(key: string): Promise<void>;
60
85
  list(options?: {
61
86
  prefix?: string;
@@ -90,7 +115,7 @@ export declare class InMemoryKVStorage implements KVStorage {
90
115
  * });
91
116
  * ```
92
117
  */
93
- export declare function createInMemorySQLProvider(): SQLDatabase;
118
+ export declare function createInMemorySQLProvider(): InMemorySQLDatabase;
94
119
  /**
95
120
  * Factory function to create an in-memory KV storage provider.
96
121
  *
@@ -107,5 +132,6 @@ export declare function createInMemorySQLProvider(): SQLDatabase;
107
132
  * });
108
133
  * ```
109
134
  */
110
- export declare function createInMemoryKVProvider(): KVStorage;
135
+ export declare function createInMemoryKVProvider(): InMemoryKVStorage;
136
+ export {};
111
137
  //# sourceMappingURL=providers-memory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"providers-memory.d.ts","sourceRoot":"","sources":["../src/providers-memory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,iBAAiB,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAsIpG;;;;;GAKG;AACH,qBAAa,mBAAoB,YAAW,WAAW;IACtD,OAAO,CAAC,MAAM,CAAuD;IACrE,OAAO,CAAC,OAAO,CAA8C;IAC7D,OAAO,CAAC,qBAAqB,CAA6B;IAC1D,OAAO,CAAC,eAAe,CAAgC;IAEvD,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB;IAIvC;;OAEG;IACG,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IA6C/F;;OAEG;IACG,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;YA0B7E,iBAAiB;YA8DjB,eAAe;YAwBf,YAAY;YA0EZ,YAAY;IA6D1B,OAAO,CAAC,oBAAoB;YAcd,YAAY;YAgDZ,YAAY;CAoD1B;AAgCD;;;;;GAKG;AACH,qBAAa,iBAAkB,YAAW,SAAS;IAClD,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,WAAW,CAA6B;IAE1C,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,GAAG,MAAe,GAAG,OAAO,CAAC,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;IA4BzF,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAUpF,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlC,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,CAAC;IA6BjG;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;OAEG;IACH,IAAI,IAAI,MAAM;CAGd;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,yBAAyB,IAAI,WAAW,CAEvD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,wBAAwB,IAAI,SAAS,CAEpD"}
1
+ {"version":3,"file":"providers-memory.d.ts","sourceRoot":"","sources":["../src/providers-memory.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "type": "module",
7
- "version": "1.2.0",
7
+ "version": "1.2.1",
8
8
  "files": [
9
9
  "dist/**/*",
10
10
  "README.md",