@earth-app/collegedb 1.1.4 → 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 UJ=Object.defineProperty;var _J=(G)=>G;function OJ(G,J){this[G]=_J.bind(null,J)}var zG=(G,J)=>{for(var Y in J)UJ(G,Y,{get:J[Y],enumerable:!0,configurable:!0,set:OJ.bind(J,Y)})};var WG=(G,J)=>()=>(G&&(J=G(G=0)),J);var F;var q=WG(()=>{F=class F extends Error{code;constructor(G,J){super(G);if(this.name="CollegeDBError",this.code=J,Error.captureStackTrace)Error.captureStackTrace(this,F)}}});var HG={};zG(HG,{KVShardMapper:()=>S});class S{kv;hashKeys;hashCache=new Map;mappingCache=new Map;knownShardsCache={shards:null,expiresAt:0};mappingCacheTtlMs;knownShardsCacheTtlMs;constructor(G,J={}){this.kv=G,this.hashKeys=J.hashShardMappings??!0,this.mappingCacheTtlMs=J.mappingCacheTtlMs??FJ,this.knownShardsCacheTtlMs=J.knownShardsCacheTtlMs??VJ}getCachedMapping(G){let J=this.mappingCache.get(G);if(!J)return;if(J.expiresAt<Date.now()){this.mappingCache.delete(G);return}return J.mapping}setCachedMapping(G,J){if(this.mappingCache.size>50000){let Y=this.mappingCache.keys().next().value;if(Y)this.mappingCache.delete(Y)}this.mappingCache.set(G,{mapping:J,expiresAt:Date.now()+this.mappingCacheTtlMs})}async cacheMappingForKeys(G,J){let Y=await Promise.all(G.map((Z)=>this.hashKey(Z)));for(let Z of Y)this.setCachedMapping(Z,J)}getCachedKnownShards(){if(this.knownShardsCache.shards&&this.knownShardsCache.expiresAt>=Date.now())return[...this.knownShardsCache.shards];return null}setCachedKnownShards(G){this.knownShardsCache.shards=[...G],this.knownShardsCache.expiresAt=Date.now()+this.knownShardsCacheTtlMs}async hashKey(G){if(!this.hashKeys)return G;let J=this.hashCache.get(G);if(J)return J;let Z=new TextEncoder().encode(G),$=await crypto.subtle.digest("SHA-256",Z),X=new Uint8Array($),W=Array.from(X).map((H)=>H.toString(16).padStart(2,"0")).join("");if(this.hashCache.size<1e4)this.hashCache.set(G,W);return W}async getShardMapping(G){let J=await this.hashKey(G),Y=this.getCachedMapping(J);if(Y!==void 0)return Y;let Z=`${N}${J}`,$=await this.kv.get(Z,"json");if($)return this.setCachedMapping(J,$),$;let X=await this.kv.get(`${C}${J}`,"json");if(X){let W={shard:X.shard,createdAt:X.createdAt,updatedAt:X.updatedAt,originalKey:this.hashKeys?void 0:G};if(this.setCachedMapping(J,W),this.hashKeys)for(let H of X.keys)this.setCachedMapping(H,W);return W}return this.setCachedMapping(J,null),null}async setShardMapping(G,J,Y=[]){let Z=[G,...Y],$=Date.now(),X={shard:J,createdAt:$,updatedAt:$,originalKey:this.hashKeys?void 0:G};if(Z.length===1){let W=await this.hashKey(G),H=`${N}${W}`;await this.kv.put(H,JSON.stringify(X)),this.setCachedMapping(W,X)}else{let W=await this.hashKey(G),H=`${C}${W}`,U=this.hashKeys?await Promise.all(Z.map((V)=>this.hashKey(V))):Z,_={shard:J,createdAt:$,updatedAt:$,keys:U};await this.kv.put(H,JSON.stringify(_));let O=Z.map(async(V)=>{let A=await this.hashKey(V),P=`${N}${A}`,Q={shard:J,createdAt:$,updatedAt:$,originalKey:this.hashKeys?void 0:V};return this.kv.put(P,JSON.stringify(Q))});await Promise.all(O),await this.cacheMappingForKeys(Z,X)}}async updateShardMapping(G,J){let Y=await this.getShardMapping(G);if(!Y)throw new F(`No existing mapping found for primary key: ${G}`,"MAPPING_NOT_FOUND");let Z=await this.hashKey(G),$=`${N}${Z}`,X=`${C}${Z}`,W=await this.kv.get(X,"json");if(W){let H=Date.now(),U={...W,shard:J,updatedAt:H};await this.kv.put(X,JSON.stringify(U));let _=W.keys.length>0?this.hashKeys?W.keys:W.keys:[await this.hashKey(G)],O=_.map(async(A)=>{let P=`${N}${A}`,Q={...Y,shard:J,updatedAt:H};return this.kv.put(P,JSON.stringify(Q))});await Promise.all(O);let V={...Y,shard:J,updatedAt:H};if(this.hashKeys)for(let A of _)this.setCachedMapping(A,V);this.setCachedMapping(Z,V)}else{let H={...Y,shard:J,updatedAt:Date.now()};await this.kv.put($,JSON.stringify(H)),this.setCachedMapping(Z,H)}}async deleteShardMapping(G){let J=await this.hashKey(G),Y=`${N}${J}`,Z=`${C}${J}`,$=await this.kv.get(Z,"json");if($){await this.kv.delete(Z);let X=$.keys.length>0?this.hashKeys?$.keys:$.keys:[await this.hashKey(G)],W=X.map(async(H)=>{let U=`${N}${H}`;return this.kv.delete(U)});if(await Promise.all(W),this.hashKeys)for(let H of X)this.setCachedMapping(H,null);this.setCachedMapping(J,null)}else await this.kv.delete(Y),this.setCachedMapping(J,null)}async getKnownShards(){let G=this.getCachedKnownShards();if(G)return G;let Y=await this.kv.get(NG,"json")||[];return this.setCachedKnownShards(Y),Y}async setKnownShards(G){if(!G||G.length===0)return;let J=[...new Set(G.filter(Boolean))];if(J.length===0)return;await this.kv.put(NG,JSON.stringify(J)),this.setCachedKnownShards(J)}async addKnownShard(G){if(!G)return;let J=await this.getKnownShards();if(!J.includes(G))J.push(G),await this.setKnownShards(J)}async getKeysForShard(G){let J=[],Y=await this.kv.list({prefix:N});for(let $ of Y.keys){let X=await this.kv.get($.name,"json");if(X?.shard===G){let W=$.name.replace(N,"");if(X.originalKey)J.push(X.originalKey);else if(!this.hashKeys)J.push(W)}}let Z=await this.kv.list({prefix:C});for(let $ of Z.keys){let X=await this.kv.get($.name,"json");if(X?.shard===G)J.push(...X.keys)}return[...new Set(J)]}async getShardKeyCounts(){let G={},J=await this.kv.list({prefix:N});for(let Z of J.keys){let $=await this.kv.get(Z.name,"json");if($)G[$.shard]=(G[$.shard]||0)+1}let Y=await this.kv.list({prefix:C});for(let Z of Y.keys){let $=await this.kv.get(Z.name,"json");if($)G[$.shard]=(G[$.shard]||0)+$.keys.length}return G}async clearAllMappings(){let J=(await this.kv.list({prefix:N})).keys.map(($)=>this.kv.delete($.name)),Z=(await this.kv.list({prefix:C})).keys.map(($)=>this.kv.delete($.name));await Promise.all([...J,...Z]),this.mappingCache.clear()}async addLookupKeys(G,J){let Y=await this.getShardMapping(G);if(!Y)throw new F(`No existing mapping found for primary key: ${G}`,"MAPPING_NOT_FOUND");let Z=await this.hashKey(G),$=`${C}${Z}`,X=await this.kv.get($,"json"),W=[G,...J],H=Date.now();if(!X){let O=this.hashKeys?await Promise.all(W.map((V)=>this.hashKey(V))):W;X={shard:Y.shard,createdAt:Y.createdAt,updatedAt:H,keys:O}}else{let O=this.hashKeys?await Promise.all(W.map((V)=>this.hashKey(V))):W;X={...X,updatedAt:H,keys:[...new Set([...X.keys,...O])]}}await this.kv.put($,JSON.stringify(X));let U=J.map(async(O)=>{let V=await this.hashKey(O),A=`${N}${V}`,P={shard:Y.shard,createdAt:Y.createdAt,updatedAt:H,originalKey:this.hashKeys?void 0:O};return this.kv.put(A,JSON.stringify(P))});await Promise.all(U);let _={shard:Y.shard,createdAt:Y.createdAt,updatedAt:H,originalKey:Y.originalKey};await this.cacheMappingForKeys([G,...J],_)}async setShardMappingsBatch(G,J={}){if(G.length===0)return;let Y=Math.max(1,J.concurrency??25),Z=0,$=Array(Math.min(Y,G.length)).fill(null).map(async()=>{while(Z<G.length){let X=Z++,W=G[X];if(!W)continue;await this.setShardMapping(W.primaryKey,W.shard,W.additionalKeys||[])}});await Promise.all($)}async getAllLookupKeys(G){let J=await this.hashKey(G),Y=`${C}${J}`,Z=await this.kv.get(Y,"json");if(Z)return Z.keys;let $=await this.getShardMapping(G);if($)return $.originalKey?[$.originalKey]:[G];throw new F(`No mapping found for key: ${G}`,"MAPPING_NOT_FOUND")}}var N="shard:",C="multikey:",NG="known_shards",FJ=30000,VJ=1e4;var g=WG(()=>{q()});var a={};zG(a,{validateTableForSharding:()=>t,schemaExists:()=>OG,migrateRecord:()=>CG,listTables:()=>h,integrateExistingDatabase:()=>qG,dropSchema:()=>wG,discoverExistingRecordsWithColumns:()=>i,discoverExistingPrimaryKeys:()=>s,createSchemaAcrossShards:()=>vG,createSchema:()=>_G,createMappingsForExistingKeys:()=>kG,clearShardMigrationCache:()=>bG,clearMigrationCache:()=>fG,checkMigrationNeeded:()=>KG,autoDetectAndMigrate:()=>SG});async function BG(G,J,Y){if(G.length===0)return;let Z=Math.max(1,Math.min(J,G.length)),$=0,X=Array(Z).fill(null).map(async()=>{while($<G.length){let W=$++,H=G[W];if(H===void 0)continue;await Y(H,W)}});await Promise.all(X)}function AJ(G,J,Y,Z){let $=Y.length;switch(Z){case"hash":{let X=0;for(let H=0;H<G.length;H++){let U=G.charCodeAt(H);X=(X<<5)-X+U,X=X&X}let W=Math.abs(X)%$;return Y[W]}case"random":return Y[Math.floor(Math.random()*$)];default:return Y[J%$]}}async function _G(G,J){let Y=J.split(";").map((Z)=>Z.trim()).filter((Z)=>Z.length>0&&!Z.startsWith("--"));for(let Z of Y)try{await G.prepare(Z).run()}catch($){throw console.error("Failed to execute schema statement:",Z,$),new F(`Schema migration failed: ${$}`,"SCHEMA_MIGRATION_FAILED")}}async function vG(G,J){let Y=Object.entries(G).map(([Z,$])=>{return _G($,J).catch((X)=>{throw new F(`Failed to create schema on shard ${Z}: ${X.message}`,"SCHEMA_CREATION_FAILED")})});await Promise.all(Y)}async function OG(G,J){try{return await G.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name=?").bind(J).first()!==null}catch{return!1}}async function wG(G,...J){for(let Y of J)try{await G.prepare(`DROP TABLE IF EXISTS ${Y}`).run()}catch(Z){console.error(`Failed to drop table ${Y}:`,Z)}}async function h(G){try{return(await G.prepare("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name").all()).results.map((Y)=>Y.name)}catch{return[]}}async function CG(G,J,Y,Z){let $=await G.prepare(`SELECT * FROM ${Z} WHERE id = ?`).bind(Y).first();if(!$)throw new F(`Record with primary key ${Y} not found in source database`,"RECORD_NOT_FOUND");if(!await OG(J,Z))await _G(J,Z);let X=Object.keys($),W=X.map(()=>"?").join(", "),H=X.map((_)=>$[_]),U=`INSERT OR REPLACE INTO ${Z} (${X.join(", ")}) VALUES (${W})`;await J.prepare(U).bind(...H).run(),await G.prepare(`DELETE FROM ${Z} WHERE id = ?`).bind(Y).run()}async function s(G,J,Y="id"){try{return(await G.prepare(`SELECT ${Y} FROM ${J}`).all()).results.map(($)=>String($[Y]))}catch(Z){throw new F(`Failed to discover primary keys in table ${J}: ${Z}`,"DISCOVERY_FAILED")}}async function i(G,J,Y="id"){try{let Z=`${J}_columns`,$;if(UG.has(Z))$=UG.get(Z).map((U)=>U.name);else{let _=(await G.prepare(`PRAGMA table_info(${J})`).all()).results.map((O)=>({name:O.name,type:O.type}));UG.set(Z,_),$=_.map((O)=>O.name)}let X=[Y];if($.includes("username"))X.push("username");if($.includes("email"))X.push("email");if($.includes("name"))X.push("name");let W=`SELECT ${X.join(", ")} FROM ${J}`;return(await G.prepare(W).all()).results}catch(Z){throw new F(`Failed to discover records with columns in table ${J}: ${Z}`,"DISCOVERY_FAILED")}}async function kG(G,J,Y,Z,$={}){if(G.length===0||J.length===0)return;let X=Math.max(1,$.concurrency??25),W=G.map((H,U)=>({primaryKey:H,shard:AJ(H,U,J,Y)}));await Z.setShardMappingsBatch(W,{concurrency:X})}async function t(G,J,Y){let Z=[],$=0;try{if(!await G.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name=?").bind(J).first())return Z.push(`Table '${J}' does not exist`),{isValid:!1,tableName:J,primaryKeyColumn:Y,recordCount:0,issues:Z};if(!(await G.prepare(`PRAGMA table_info(${J})`).all()).results.some((_)=>_.name===Y&&_.pk===1))Z.push(`Primary key column '${Y}' not found or not set as primary key`);if($=(await G.prepare(`SELECT COUNT(*) as count FROM ${J}`).first())?.count||0,$===0)Z.push(`Table '${J}' is empty`)}catch(X){Z.push(`Database validation error: ${X}`)}return{isValid:Z.length===0,tableName:J,primaryKeyColumn:Y,recordCount:$,issues:Z}}async function qG(G,J,Y,Z={}){let{tables:$,primaryKeyColumn:X="id",strategy:W="hash",addShardMappingsTable:H=!0,dryRun:U=!1,migrateOtherColumns:_=!1,concurrency:O=25}=Z,V=Math.max(1,O),A=[],P=0,Q=0,x=0;try{let L=($||await h(G)).filter((j)=>j!=="shard_mappings");for(let j of L)try{let R=await t(G,j,X);if(!R.isValid){A.push(`Table ${j}: ${R.issues.join(", ")}`);continue}if(_){let D=await i(G,j,X);if(D.length===0){A.push(`Table ${j} has no records to process`);continue}if(!U){let E=D.map((I)=>{let $G=String(I[X]),b=[];if(I.username&&typeof I.username==="string")b.push(`username:${I.username}`);if(I.email&&typeof I.email==="string")b.push(`email:${I.email}`);if(I.name&&typeof I.name==="string")b.push(`name:${I.name}`);return{primaryKey:$G,shard:J,additionalKeys:b}});await Y.setShardMappingsBatch(E,{concurrency:V}),x+=E.length}Q+=D.length}else{let D=await s(G,j,X);if(D.length===0){A.push(`Table ${j} has no records to process`);continue}if(!U){let E=D.map((I)=>({primaryKey:I,shard:J}));await Y.setShardMappingsBatch(E,{concurrency:V}),x+=E.length}Q+=D.length}P++}catch(R){A.push(`Failed to process table ${j}: ${R}`)}if(H&&!U){if(!(await h(G)).includes("shard_mappings"))await G.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(!U)await Y.addKnownShard(J)}catch(w){A.push(`Integration failed: ${w}`)}return{success:A.length===0||A.length>0&&P>0,shardName:J,tablesProcessed:P,totalRecords:Q,mappingsCreated:x,issues:A}}async function SG(G,J,Y,Z={}){let{primaryKeyColumn:$="id",tablesToCheck:X,skipCache:W=!1,maxRecordsToCheck:H=1000,migrateOtherColumns:U=!1,concurrency:_=Y.migrationConcurrency??25}=Z,O=Math.max(1,_),V=`${J}_migration_check`;if(!W&&K.has(V))return{migrationNeeded:!1,migrationPerformed:!1,recordsMigrated:0,tablesProcessed:0,issues:[]};let A=[],P=0,Q=0,x=!1,w=!1;try{let{KVShardMapper:L}=await Promise.resolve().then(() => (g(),HG)),j=new L(Y.kv,{hashShardMappings:Y.hashShardMappings,mappingCacheTtlMs:Y.mappingCacheTtlMs,knownShardsCacheTtlMs:Y.knownShardsCacheTtlMs}),R=await h(G),D=X||R.filter((E)=>E!=="shard_mappings"&&!E.startsWith("sqlite_")&&E!=="sqlite_sequence");if(D.length===0)return K.set(V,!0),{migrationNeeded:!1,migrationPerformed:!1,recordsMigrated:0,tablesProcessed:0,issues:[]};for(let E of D)try{let I=await t(G,E,$);if(!I.isValid||I.recordCount===0)continue;let $G=Math.min(H,I.recordCount),b=await G.prepare(`
8
- SELECT ${$} FROM ${E}
9
- ORDER BY ${$}
10
- LIMIT ?`.trim()).bind($G).all(),MG=0,WJ=b.results.slice(0,10).map(async(k)=>{let z=String(k[$]);return{key:z,mapping:await j.getShardMapping(z)}}),HJ=await Promise.all(WJ);for(let k of HJ)if(!k.mapping)MG++,x=!0;if(MG>0){if(Y.debug)console.log(`Auto-migrating table ${E} in shard ${J} (${I.recordCount} records)`);if(U){let k=await i(G,E,$),z=[];if(await BG(k,O,async(M)=>{let XG=String(M[$]);if(await j.getShardMapping(XG))return;let l=[];if(M.username&&typeof M.username==="string")l.push(`username:${M.username}`);if(M.email&&typeof M.email==="string")l.push(`email:${M.email}`);if(M.name&&typeof M.name==="string")l.push(`name:${M.name}`);z.push({primaryKey:XG,shard:J,additionalKeys:l})}),z.length>0)await j.setShardMappingsBatch(z,{concurrency:O});P+=z.length}else{let k=await s(G,E,$),z=[];if(await BG(k,O,async(M)=>{if(!await j.getShardMapping(M))z.push({primaryKey:M,shard:J})}),z.length>0)await j.setShardMappingsBatch(z,{concurrency:O});P+=z.length}if(Q++,w=!0,Y.debug)console.log(`Auto-migrated ${P} records from table ${E}`)}}catch(I){A.push(`Auto-migration failed for table ${E}: ${I}`)}if(w){if(await j.addKnownShard(J),!R.includes("shard_mappings"))await G.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(K.set(V,!0),w&&Y.debug)console.log(`Auto-migration completed for shard ${J}: ${P} records from ${Q} tables`)}catch(L){A.push(`Auto-migration error: ${L}`)}return{migrationNeeded:x,migrationPerformed:w,recordsMigrated:P,tablesProcessed:Q,issues:A}}async function KG(G,J,Y){let Z=`${J}_migration_check`;if(K.has(Z))return!1;try{let $=await h(G);if($.includes("shard_mappings"))return K.set(Z,!0),!1;let{KVShardMapper:W}=await Promise.resolve().then(() => (g(),HG)),H=new W(Y.kv,{hashShardMappings:Y.hashShardMappings,mappingCacheTtlMs:Y.mappingCacheTtlMs,knownShardsCacheTtlMs:Y.knownShardsCacheTtlMs}),U=$.filter((_)=>_!=="shard_mappings"&&!_.startsWith("sqlite_")&&_!=="sqlite_sequence");for(let _ of U.slice(0,3))try{if(((await G.prepare(`SELECT COUNT(*) as count FROM ${_} LIMIT 1`).first())?.count||0)>0){let A=await G.prepare(`SELECT id FROM ${_} LIMIT 1`).first();if(A){let P=String(A.id);if(!await H.getShardMapping(P))return!0}}}catch{continue}return!1}catch{return!1}}function fG(){K.clear()}function bG(G){let J=`${G}_migration_check`;K.delete(J)}var K,UG;var c=WG(()=>{q();K=new Map,UG=new Map});q();g();var d=null,p=null,u=new Map,y=0;function v(G){if(!p)p=new S(G.kv,{hashShardMappings:G.hashShardMappings,mappingCacheTtlMs:G.mappingCacheTtlMs,knownShardsCacheTtlMs:G.knownShardsCacheTtlMs});return p}function LJ(G){d=G,p=new S(G.kv,{hashShardMappings:G.hashShardMappings,mappingCacheTtlMs:G.mappingCacheTtlMs,knownShardsCacheTtlMs:G.knownShardsCacheTtlMs}),u.clear(),y=0;try{let J=v(G);Promise.resolve().then(async()=>{let Y=await J.getKnownShards(),Z=Array.from(new Set([...Y,...Object.keys(G.shards)]));await J.setKnownShards(Z)}).catch(()=>{return})}catch{}if(G.shards&&Object.keys(G.shards).length>0&&!G.disableAutoMigration)mG(G).catch((J)=>{console.warn("Background auto-migration failed:",J)})}async function yG(G){d=G,p=new S(G.kv,{hashShardMappings:G.hashShardMappings,mappingCacheTtlMs:G.mappingCacheTtlMs,knownShardsCacheTtlMs:G.knownShardsCacheTtlMs}),u.clear(),y=0;try{let J=v(G),Y=await J.getKnownShards(),Z=Array.from(new Set([...Y,...Object.keys(G.shards)]));await J.setKnownShards(Z)}catch{}if(G.shards&&Object.keys(G.shards).length>0&&!G.disableAutoMigration)try{await mG(G)}catch(J){console.warn("Auto migration failed:",J)}}async function jJ(G,J){return await yG(G),await J()}async function mG(G){try{let{autoDetectAndMigrate:J}=await Promise.resolve().then(() => (c(),a)),Y=Object.keys(G.shards);if(G.debug)console.log(`\uD83D\uDD0D Checking ${Y.length} shards for existing data...`);let Z=Y.map(async(W)=>{let H=G.shards[W];if(!H)return null;try{let U=await J(H,W,G,{maxRecordsToCheck:1000});return{shardName:W,...U}}catch(U){return console.warn(`Auto-migration failed for shard ${W}:`,U),null}}),X=(await Promise.all(Z)).filter((W)=>W?.migrationPerformed);if(G.debug)if(X.length>0){let W=X.reduce((H,U)=>H+(U?.recordsMigrated||0),0);console.log(`\uD83C\uDF89 Auto-migration completed! Migrated ${W} records across ${X.length} shards`),X.forEach((H)=>{if(H)console.log(` ✅ ${H.shardName}: ${H.recordsMigrated} records from ${H.tablesProcessed} tables`)})}else console.log("✅ All shards ready - no migration needed")}catch(J){console.warn("Background auto-migration setup failed:",J)}}function PJ(){d=null,p=null,u.clear(),y=0}function T(){if(!d)throw new F("CollegeDB not initialized. Call initialize() first.","NOT_INITIALIZED");return d}function QJ(G){let J=G.trim().toUpperCase();if(J.startsWith("SELECT")||J.startsWith("VALUES")||J.startsWith("TABLE")||J.startsWith("PRAGMA")||J.startsWith("EXPLAIN")||J.startsWith("WITH")||J.startsWith("SHOW"))return"read";return"write"}function uG(G,J){let Y=G.strategy||"hash";if(typeof Y==="string")return Y;let Z=Y;return Z[J]||Z.write||Z.read||"hash"}function IJ(G,J){if(G===J)return 0;let Y={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=Y[G],$=Y[J],X=Z.lat-$.lat,W=Z.lon-$.lon;return Math.sqrt(X*X+W*W)}function EJ(G){let J=G.cf;if(!J||!J.country)return"wnam";let{country:Y,continent:Z}=J;if(["US","CA","MX"].includes(Y)){let $=J.region||J.regionCode||"",X=J.timezone||"";if($.includes("CA")||$.includes("WA")||$.includes("OR")||$.includes("NV")||$.includes("AZ")||$.includes("UT")||X.includes("Pacific")||X.includes("America/Los_Angeles"))return"wnam";return"enam"}if(["GL","PM","BM"].includes(Y))return"enam";if(["GB","IE","FR","ES","PT","NL","BE","LU","CH","AT","IT"].includes(Y))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(Y))return"eeur";if(Y==="RU")return"eeur";if(["JP","KR","CN","HK","TW","MO","MN","KP"].includes(Y))return"apac";if(["TH","VN","SG","MY","ID","PH","BN","KH","LA","MM","TL","IN","PK","BD","LK","NP","BT","MV","AF"].includes(Y))return"apac";if(["AU","NZ","PG","FJ","NC","VU","SB","WS","TO","KI","NR","PW","FM","MH","TV"].includes(Y))return"oc";if(["AE","SA","QA","KW","BH","OM","YE","IQ","IR","SY","LB","JO","IL","PS","TR","CY"].includes(Y))return"me";if(Z==="AF"||["EG","LY","TN","DZ","MA","SD","SS","ET","ER","DJ","SO"].includes(Y))return"af";if(["KZ","UZ","TM","TJ","KG"].includes(Y))return"eeur";if(Z==="SA"||["BR","AR","CL","PE","CO","VE","EC","BO","PY","UY","GY","SR","GF"].includes(Y))return"enam";if(["GT","BZ","SV","HN","NI","CR","PA","CU","JM","HT","DO","PR","TT","BB","GD","VC","LC","DM","AG","KN"].includes(Y))return"enam";return"wnam"}function TJ(G){if(typeof G==="string")return G;return G.region||"wnam"}async function r(G){try{let[J,Y]=await Promise.all([G.prepare("PRAGMA page_count").first(),G.prepare("PRAGMA page_size").first()]);if(!J?.page_count||!Y?.page_size)throw new F("Failed to retrieve database size information","SIZE_QUERY_FAILED");return J.page_count*Y.page_size}catch(J){throw new F(`Failed to get database size: ${J instanceof Error?J.message:"Unknown error"}`,"SIZE_QUERY_FAILED")}}async function DJ(G,J){let Y=Math.max(0,J.sizeCacheTtlMs??30000),Z=u.get(G);if(Z&&Z.expiresAt>=Date.now())return Z.size;let $=J.shards[G];if(!$)throw new F(`Shard ${G} not found in configuration`,"SHARD_NOT_FOUND");let X=await r($);if(Y>0)u.set(G,{size:X,expiresAt:Date.now()+Y});return X}async function gG(G,J){if(typeof J.maxDatabaseSize!=="number"||!Number.isFinite(J.maxDatabaseSize)||J.maxDatabaseSize<=0)return G;let Y=J.maxDatabaseSize,$=(await Promise.allSettled(G.map(async(X)=>{let W=await DJ(X,J);return{shard:X,size:W,withinLimit:W<Y}}))).filter((X)=>X.status==="fulfilled"&&X.value.withinLimit).map((X)=>X.value.shard);if($.length===0){if(J.debug)console.warn("All shards exceed maxDatabaseSize limit. Allowing allocation to prevent failure.");return G}if(J.debug&&$.length<G.length){let X=G.filter((W)=>!$.includes(W));console.log(`Excluded ${X.length} shards due to size limits: ${X.join(", ")}`)}return $}function RJ(G,J,Y,Z){let $=J.filter((O)=>Y[O]);if($.length===0){let O=0;for(let A=0;A<Z.length;A++){let P=Z.charCodeAt(A);O=(O<<5)-O+P,O=O&O}let V=Math.abs(O)%J.length;return J[V]}let X=$.map((O)=>{let V=Y[O],A=IJ(G,TJ(V)),P=typeof V==="object"?V.priority||1:1,Q=A-P*0.1;return{shard:O,score:Q,distance:A,priority:P}});X.sort((O,V)=>O.score-V.score);let W=X[0].score,H=X.filter((O)=>Math.abs(O.score-W)<0.01);if(H.length===1)return H[0].shard;let U=0;for(let O=0;O<Z.length;O++){let V=Z.charCodeAt(O);U=(U<<5)-U+V,U=U&U}let _=Math.abs(U)%H.length;return H[_].shard}function m(G,J,Y,Z){switch(G){case"hash":{let $=0;for(let W=0;W<J.length;W++){let H=J.charCodeAt(W);$=($<<5)-$+H,$=$&$}let X=Math.abs($)%Y.length;return Y[X]||Y[0]}case"location":{if(!Z.targetRegion)return m("hash",J,Y,Z);return RJ(Z.targetRegion,Y,Z.shardLocations||{},J)}case"random":return Y[Math.floor(Math.random()*Y.length)]||Y[0];default:return m("hash",J,Y,Z)}}async function cG(G,J="write"){let Y=T(),Z=v(Y),$=await Z.getShardMapping(G);if($)return $.shard;let X=Object.keys(Y.shards);if(X.length===0)throw new F("No shards configured","NO_SHARDS");let W=await gG(X,Y),H,U=uG(Y,J);if(Y.coordinator)try{let _=Y.coordinator.idFromName("default"),V=await Y.coordinator.get(_).fetch("http://coordinator/allocate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({primaryKey:G,strategy:U,operationType:J,targetRegion:Y.targetRegion,shardLocations:Y.shardLocations,availableShards:W})});if(V.ok)H=(await V.json()).shard;else H=m(U,G,W,Y)}catch(_){console.warn("Coordinator allocation failed, falling back to local strategy:",_),H=m(U,G,W,Y)}else H=m(U,G,W,Y);return await Z.setShardMapping(G,H),H}async function xJ(G,J="write"){let Y=T(),Z=await cG(G,J),$=Y.shards[Z];if(!$)throw new F(`Shard ${Z} not found in configuration`,"SHARD_NOT_FOUND");return $}async function MJ(G,J){let{createSchema:Y}=await Promise.resolve().then(() => (c(),a));await Y(G,J)}async function e(G,J){let Y=QJ(J);return(await xJ(G,Y)).prepare(J)}async function dG(G,J,Y=[]){let $=await(await e(G,J)).bind(...Y).run();if(!$.success)throw new F(`Query failed: ${$.error||"Unknown error"}`,"QUERY_FAILED");return $}function zJ(G){let J=G.results[0];if(J&&typeof J==="object"){for(let Z of["id","ID","Id","rowid","ROWID","RowId","last_row_id","lastInsertId","insertId"]){let $=J[Z];if($!==void 0&&$!==null)return $}for(let[Z,$]of Object.entries(J)){let X=Z.toLowerCase();if((X==="id"||X==="rowid")&&(typeof $==="number"||typeof $==="string"))return $}for(let Z of Object.values(J))if(typeof Z==="number"||typeof Z==="string")return Z}let Y=G.meta.last_row_id;if(Y!==void 0&&Y!==null)return Y;return}function NJ(){return`insert:${Date.now()}:${Math.random().toString(36).slice(2)}`}async function BJ(){let G=T(),J=Object.keys(G.shards);if(J.length===0)throw new F("No shards configured","NO_SHARDS");let Y=await gG(J,G);if(Y.length===0)throw new F("No shards available for insert","NO_SHARDS");let Z=uG(G,"write"),$=NJ();if(G.coordinator)try{let X=G.coordinator.idFromName("default"),H=await G.coordinator.get(X).fetch("http://coordinator/allocate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({primaryKey:$,strategy:Z,operationType:"write",targetRegion:G.targetRegion,shardLocations:G.shardLocations,availableShards:Y})});if(H.ok)return(await H.json()).shard}catch(X){console.warn("Coordinator allocation for insert failed, falling back to local strategy:",X)}if(Z==="round-robin"){let X=Y[y%Y.length];return y=(y+1)%Y.length,X}return m(Z,$,Y,G)}async function oG(G,J,Y=[]){let Z=T();if(!Z.shards[G])throw new F(`Shard ${G} not found`,"SHARD_NOT_FOUND");let X=/\breturning\b/i.test(J)?await GG(G,J,Y):await FG(G,J,Y),W=zJ(X);if(W===void 0)throw new F("Insert did not return a generated primary key","GENERATED_KEY_UNAVAILABLE");return await v(Z).setShardMapping(String(W),G),{...X,generatedId:W}}async function vJ(G,J=[]){let Y=await BJ();return await oG(Y,G,J)}async function wJ(G,J,Y=[]){return await oG(G,J,Y)}async function nG(G,J,Y=[]){let $=await(await e(G,J)).bind(...Y).all();if(!$.success)throw new F(`Query failed: ${$.error||"Unknown error"}`,"QUERY_FAILED");return $}async function lG(G,J,Y=[]){return await(await e(G,J)).bind(...Y).first()}async function CJ(G,J,Y=[],Z=50){let $=T(),W=await v($).getShardMapping(G);if(W){if($.shards[W.shard]){let _=await GG(W.shard,J,Y);if(_.success&&_.results.length>0)return _}}let H=await JG(J,Y,Z);return iG(H)}async function kJ(G,J,Y=[],Z=50){let $=T(),W=await v($).getShardMapping(G);if(W){if($.shards[W.shard]){let _=await VG(W.shard,J,Y);if(_!==null)return _}}return(await aG(J,Y,Z)).find((U)=>U!==null)??null}async function qJ(G,J,Y){let Z=T();if(!Z.shards[J])throw new F(`Shard ${J} not found in configuration`,"SHARD_NOT_FOUND");let $=v(Z),X=await $.getShardMapping(G);if(!X)throw new F(`No existing mapping found for primary key: ${G}`,"MAPPING_NOT_FOUND");if(X.shard!==J){let{migrateRecord:W}=await Promise.resolve().then(() => (c(),a)),H=Z.shards[X.shard],U=Z.shards[J];if(!H||!U)throw new F("Source or target shard not available","SHARD_UNAVAILABLE");await W(H,U,G,Y)}await $.updateShardMapping(G,J)}async function SJ(){let G=T();if(G.coordinator)try{let J=G.coordinator.idFromName("default"),Z=await G.coordinator.get(J).fetch("http://coordinator/shards");if(Z.ok)return await Z.json()}catch(J){console.warn("Failed to get shards from coordinator:",J)}try{let Y=await v(G).getKnownShards(),Z=new Set([...Object.keys(G.shards),...Y]);return Array.from(Z)}catch{return Object.keys(G.shards)}}async function KJ(){let G=T();if(G.coordinator)try{let $=G.coordinator.idFromName("default"),W=await G.coordinator.get($).fetch("http://coordinator/stats");if(W.ok)return await W.json()}catch($){console.warn("Failed to get stats from coordinator:",$)}let J=v(G),Y=await J.getShardKeyCounts(),Z=Object.keys(G.shards);try{let $=await J.getKnownShards();Z=Array.from(new Set([...Z,...$]))}catch{}return Z.map(($)=>({binding:$,count:Y[$]||0}))}async function FG(G,J,Y=[]){let $=T().shards[G];if(!$)throw new F(`Shard ${G} not found`,"SHARD_NOT_FOUND");let X=await $.prepare(J).bind(...Y).run();if(!X.success)throw new F(`Query failed: ${X.error||"Unknown error"}`,"QUERY_FAILED");return X}async function GG(G,J,Y=[]){let $=T().shards[G];if(!$)throw new F(`Shard ${G} not found`,"SHARD_NOT_FOUND");return await $.prepare(J).bind(...Y).all()}async function VG(G,J,Y=[]){let $=T().shards[G];if(!$)throw new F(`Shard ${G} not found`,"SHARD_NOT_FOUND");return await $.prepare(J).bind(...Y).first()}async function sG(G,J=[],Y=50){let Z=T(),$=[];for(let[W,H]of Object.entries(Z.shards)){if(!W||!H){console.error(`Shard ${W??"<null>"} not found, skipping`);continue}$.push(()=>H.prepare(G).bind(...J).run().catch((U)=>{return console.error(`Error executing query on shard ${W}:`,U),{success:!1,results:[],error:U instanceof Error?U.message:String(U),meta:{duration:0}}}))}let X=[];for(let W=0;W<$.length;W+=Y){let H=$.slice(W,W+Y).map((U)=>U());X.push(...await Promise.all(H))}return X}async function JG(G,J=[],Y=50){let Z=T(),$=[];for(let[W,H]of Object.entries(Z.shards)){if(!W||!H){console.error(`Shard ${W??"<null>"} not found, skipping`);continue}$.push(()=>H.prepare(G).bind(...J).all().catch((U)=>{return console.error(`Error executing query on shard ${W}:`,U),{success:!1,results:[],error:U instanceof Error?U.message:String(U),meta:{duration:0}}}))}let X=[];for(let W=0;W<$.length;W+=Y){let H=$.slice(W,W+Y).map((U)=>U());X.push(...await Promise.all(H))}return X}function o(G,J=50){if(!Number.isFinite(G??J))return J;return Math.max(1,Math.floor(G??J))}function fJ(G){if(!Number.isFinite(G??0))return 0;return Math.max(0,Math.floor(G??0))}function bJ(G){if(G===void 0)return;if(!Number.isFinite(G))return;return Math.max(0,Math.floor(G))}function hG(G,J){if(typeof J==="function")return J(G);if(!J||typeof G!=="object"||G===null)return;return G[String(J)]}function hJ(G,J){if(G===J)return 0;if(G===null||G===void 0)return 1;if(J===null||J===void 0)return-1;if(typeof G==="number"&&typeof J==="number")return G-J;if(typeof G==="bigint"&&typeof J==="bigint")return G<J?-1:1;if(G instanceof Date&&J instanceof Date)return G.getTime()-J.getTime();if(typeof G==="boolean"&&typeof J==="boolean")return Number(G)-Number(J);return String(G).localeCompare(String(J),void 0,{numeric:!0,sensitivity:"base"})}function iG(G){let J=G.flatMap((X)=>X.results||[]),Y=G.filter((X)=>!X.success),Z=G.reduce((X,W)=>X+(W.meta?.duration||0),0);if(Y.length===0)return{success:!0,results:J,meta:{duration:Z}};let $=Y.map((X)=>X.error||"Unknown shard query error").filter(Boolean).join("; ");return{success:!1,results:J,error:$||"One or more shard queries failed",meta:{duration:Z}}}async function tG(G,J=[],Y={}){let Z=o(Y.batchSize),$=fJ(Y.offset),X=bJ(Y.limit),W=iG(await JG(G,J,Z)),H=W.results;if(Y.filter)H=H.filter((O)=>Y.filter?.(O));if(Y.comparator)H=[...H].sort(Y.comparator);else if(Y.sortBy){let O=Y.sortDirection==="desc"?-1:1;H=[...H].sort((V,A)=>{let P=hG(V,Y.sortBy),Q=hG(A,Y.sortBy);return hJ(P,Q)*O})}let U=X===void 0?void 0:$+X,_=H.slice($,U);return{...W,results:_}}async function aG(G,J=[],Y=50){let Z=T(),$=[];for(let[W,H]of Object.entries(Z.shards)){if(!W||!H){console.error(`Shard ${W??"<null>"} not found, skipping`);continue}$.push(()=>H.prepare(G).bind(...J).first().catch((U)=>{return console.error(`Error executing query on shard ${W}:`,U),null}))}let X=[];for(let W=0;W<$.length;W+=Y){let H=$.slice(W,W+Y).map((U)=>U());X.push(...await Promise.all(H))}return X}async function pJ(G,J=[],Y={}){return(await tG(G,J,{...Y,limit:1})).results[0]??null}async function yJ(){let G=T();if(await v(G).clearAllMappings(),u.clear(),G.coordinator)try{let Y=G.coordinator.idFromName("default");await G.coordinator.get(Y).fetch("http://coordinator/flush",{method:"POST"})}catch(Y){console.warn("Failed to flush coordinator:",Y)}}async function mJ(G){let Y=T().shards[G];if(!Y)throw new F(`Shard ${G} not found`,"SHARD_NOT_FOUND");return await r(Y)}var uJ=/^[A-Za-z_][A-Za-z0-9_]*$/;function f(G){let J=G.trim();if(!J)throw new F("Identifier cannot be empty","INVALID_IDENTIFIER");let Y=J.split(".").map((Z)=>Z.trim());if(Y.some((Z)=>!Z||!uJ.test(Z)))throw new F(`Invalid SQL identifier: ${G}`,"INVALID_IDENTIFIER");return Y.map((Z)=>`"${Z}"`).join(".")}function pG(G){return G.toLowerCase().replace(/[^a-z0-9_]+/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"")}function gJ(G){if(typeof G==="string")return[{name:G}];if(!Array.isArray(G)||G.length===0)throw new F("At least one index column is required","INVALID_INDEX_COLUMNS");return G.map((J)=>{if(typeof J==="string")return{name:J};if(!J?.name)throw new F("Index column name is required","INVALID_INDEX_COLUMNS");return{name:J.name,order:J.order,collate:J.collate}})}function AG(G,J,Y={}){let Z=gJ(J),$=f(G),X=Y.indexName?Y.indexName:["idx",pG(G),...Z.map((V)=>pG(V.name))].filter(Boolean).join("_").slice(0,120),W=f(X||"idx_auto"),H=Z.map((V)=>{let A=f(V.name),P=V.order?` ${V.order}`:"",Q=V.collate?` COLLATE ${f(V.collate).replace(/"/g,"")}`:"";return`${A}${Q}${P}`}).join(", "),U=Y.ifNotExists===!1?"":" IF NOT EXISTS",_=Y.unique?"UNIQUE ":"",O=Y.where?.trim()?` WHERE ${Y.where.trim()}`:"";return`CREATE ${_}INDEX${U} ${W} ON ${$} (${H})${O}`}async function cJ(G,J,Y,Z={}){let $=AG(J,Y,Z);return dG(G,$)}async function dJ(G,J,Y,Z={}){let $=AG(J,Y,Z);return FG(G,$)}async function oJ(G,J,Y={}){let Z=AG(G,J,Y);return sG(Z,[],o(Y.batchSize))}function LG(G,J="query-plan"){switch(J){case"raw":return`EXPLAIN ${G}`;case"analyze":return`EXPLAIN ANALYZE ${G}`;case"query-plan":default:return`EXPLAIN QUERY PLAN ${G}`}}async function nJ(G,J,Y=[],Z={}){return nG(G,LG(J,Z.mode),Y)}async function lJ(G,J,Y=[],Z={}){return GG(G,LG(J,Z.mode),Y)}async function sJ(G,J=[],Y={}){return JG(LG(G,Y.mode),J,o(Y.batchSize))}async function iJ(G,J){let Y=f(J),Z=await lG(G,`SELECT COUNT(*) AS row_count FROM ${Y}`);if(!Z||Z.row_count===void 0||Z.row_count===null)return 0;return Number(Z.row_count)||0}async function tJ(G,J){let Y=f(J),Z=await VG(G,`SELECT COUNT(*) AS row_count FROM ${Y}`);if(!Z||Z.row_count===void 0||Z.row_count===null)return 0;return Number(Z.row_count)||0}async function aJ(G,J=50){let Y=T(),Z=o(J),X=`SELECT COUNT(*) AS row_count FROM ${f(G)}`,W=[];for(let[_,O]of Object.entries(Y.shards)){if(!_||!O)continue;W.push(async()=>{try{let V=await O.prepare(X).first(),A=Number(V?.row_count??0);return{shard:_,count:Number.isFinite(A)?A:0,success:!0}}catch(V){return{shard:_,count:null,success:!1,error:V instanceof Error?V.message:String(V)}}})}let H=[];for(let _=0;_<W.length;_+=Z){let O=W.slice(_,_+Z).map((V)=>V());H.push(...await Promise.all(O))}return{total:H.reduce((_,O)=>_+(O.count??0),0),shards:H}}async function rJ(G){let J=T(),Y=await cG(G,"read"),Z=J.shards[Y];if(!Z)throw new F(`Shard ${Y} not found in configuration`,"SHARD_NOT_FOUND");return r(Z)}async function rG(G=50){let J=T(),Y=o(G),Z=[];for(let[X,W]of Object.entries(J.shards)){if(!X||!W)continue;Z.push(async()=>{try{return{shard:X,size:await r(W),success:!0}}catch(H){return{shard:X,size:null,success:!1,error:H instanceof Error?H.message:String(H)}}})}let $=[];for(let X=0;X<Z.length;X+=Y){let W=Z.slice(X,X+Y).map((H)=>H());$.push(...await Promise.all(W))}return $}async function eJ(G=50){return(await rG(G)).reduce((Y,Z)=>Y+(Z.size??0),0)}q();class eG{state;constructor(G){this.state=G}async getState(){return await this.state.storage.get("coordinator_state")||{knownShards:[],shardStats:{},strategy:"round-robin",roundRobinIndex:0}}async saveState(G){await this.state.storage.put("coordinator_state",G)}async fetch(G){let Y=new URL(G.url).pathname,Z=G.method;try{switch(`${Z} ${Y}`){case"GET /shards":return this.handleListShards();case"POST /shards":return this.handleAddShard(G);case"DELETE /shards":return this.handleRemoveShard(G);case"GET /stats":return this.handleGetStats();case"POST /stats":return this.handleUpdateStats(G);case"POST /allocate":return this.handleAllocateShard(G);case"POST /flush":return this.handleFlush();case"GET /health":return new Response("OK",{status:200});default:return new Response("Not Found",{status:404})}}catch($){return console.error("ShardCoordinator error:",$),new Response("Internal Server Error",{status:500})}}async handleListShards(){let G=await this.getState();return new Response(JSON.stringify(G.knownShards),{headers:{"Content-Type":"application/json"}})}async handleAddShard(G){let{shard:J}=await G.json();if(!J||typeof J!=="string")return new Response(JSON.stringify({error:"Missing or invalid shard parameter"}),{status:400,headers:{"Content-Type":"application/json"}});let Y=await this.getState();if(!Y.knownShards.includes(J))Y.knownShards.push(J),Y.shardStats[J]={binding:J,count:0,lastUpdated:Date.now()},await this.saveState(Y);return new Response(JSON.stringify({success:!0}),{headers:{"Content-Type":"application/json"}})}async handleRemoveShard(G){let{shard:J}=await G.json();if(!J||typeof J!=="string")return new Response(JSON.stringify({error:"Missing or invalid shard parameter"}),{status:400,headers:{"Content-Type":"application/json"}});let Y=await this.getState(),Z=Y.knownShards.indexOf(J);if(Z>-1){if(Y.knownShards.splice(Z,1),delete Y.shardStats[J],Y.roundRobinIndex>=Y.knownShards.length)Y.roundRobinIndex=0;await this.saveState(Y)}return new Response(JSON.stringify({success:!0}),{headers:{"Content-Type":"application/json"}})}async handleGetStats(){let G=await this.getState(),J=Object.values(G.shardStats);return new Response(JSON.stringify(J),{headers:{"Content-Type":"application/json"}})}async handleUpdateStats(G){let{shard:J,count:Y}=await G.json();if(!J||typeof J!=="string")return new Response(JSON.stringify({error:"Missing or invalid shard parameter"}),{status:400,headers:{"Content-Type":"application/json"}});if(Y===void 0||typeof Y!=="number")return new Response(JSON.stringify({error:"Missing or invalid count parameter"}),{status:400,headers:{"Content-Type":"application/json"}});let Z=await this.getState();if(Z.shardStats[J])Z.shardStats[J].count=Y,Z.shardStats[J].lastUpdated=Date.now(),await this.saveState(Z);return new Response(JSON.stringify({success:!0}),{headers:{"Content-Type":"application/json"}})}async handleAllocateShard(G){let{primaryKey:J,strategy:Y,operationType:Z,availableShards:$}=await G.json();if(!J||typeof J!=="string")return new Response(JSON.stringify({error:"Missing or invalid primaryKey parameter"}),{status:400,headers:{"Content-Type":"application/json"}});let X=await this.getState(),W=$||X.knownShards;if(W.length===0)return new Response(JSON.stringify({error:"No shards available"}),{status:400,headers:{"Content-Type":"application/json"}});let H=this.resolveStrategy(X.strategy,Y,Z||"write"),U=this.selectShard(J,X,H,W);if(H==="round-robin")X.roundRobinIndex=(X.roundRobinIndex+1)%W.length,await this.saveState(X);return new Response(JSON.stringify({shard:U}),{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(G,J,Y="write"){if(J)return J;if(typeof G==="string")return G;return G[Y]}selectShard(G,J,Y,Z){let $=Z||J.knownShards;if($.length===0)throw new F("No shards available","NO_SHARDS");switch(Y){case"round-robin":return $[J.roundRobinIndex]??$[0];case"random":return $[Math.floor(Math.random()*$.length)];case"hash":{let X=0;for(let H=0;H<G.length;H++){let U=G.charCodeAt(H);X=(X<<5)-X+U,X=X&X}let W=Math.abs(X)%$.length;return $[W]}case"location":{let X=J.targetRegion,W=J.shardLocations||{},H=$.filter((L)=>W[L]);if(!X||H.length===0){let L=0;for(let R=0;R<G.length;R++){let D=G.charCodeAt(R);L=(L<<5)-L+D,L=L&L}let j=Math.abs(L)%$.length;return $[j]}let U={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}},_=(L,j)=>(j in L),O=(L)=>_(U,L)?L:"wnam",V=(L,j)=>{let R=U[O(L)],D=U[O(j)],E=R.lat-D.lat,I=R.lon-D.lon;return Math.sqrt(E*E+I*I)},A=H.map((L)=>{let j=W[L],R=V(X,j.region),D=j.priority||1;return{shard:L,score:R-D*0.1}});A.sort((L,j)=>L.score-j.score);let P=A[0].score,Q=A.filter((L)=>Math.abs(L.score-P)<0.01);if(Q.length===1)return Q[0].shard;let x=0;for(let L=0;L<G.length;L++){let j=G.charCodeAt(L);x=(x<<5)-x+j,x=x&x}let w=Math.abs(x)%Q.length;return Q[w].shard}default:return $[0]}}async incrementShardCount(G){let J=await this.getState();if(J.shardStats[G])J.shardStats[G].count++,J.shardStats[G].lastUpdated=Date.now(),await this.saveState(J)}async decrementShardCount(G){let J=await this.getState();if(J.shardStats[G]&&J.shardStats[G].count>0)J.shardStats[G].count--,J.shardStats[G].lastUpdated=Date.now(),await this.saveState(J)}}q();g();q();var GY=500;function YJ(G,J={}){let Y=J.scanCount??GY;return{async get(Z,$="text"){let X=await G.get(Z);if(X===null)return null;if($!=="json")return X;try{return JSON.parse(X)}catch(W){throw new F(`Failed to parse JSON from Redis for key ${Z}: ${W instanceof Error?W.message:String(W)}`,"KV_JSON_PARSE_FAILED")}},async put(Z,$){await G.set(Z,$)},async delete(Z){await G.del(Z)},async list(Z){let $=Z?.prefix??"",X=`${$}*`,W=Z?.cursor??"0",H=Z?.limit,U=[];do{let _=await UY(G,W,X,Y);W=_.cursor;for(let O of _.keys){if(!$||O.startsWith($))U.push(O);if(H&&U.length>=H)break}if(H&&U.length>=H)break}while(W!=="0");return{keys:U.map((_)=>({name:_})),cursor:W,list_complete:W==="0"}}}}function JY(G,J={}){return YJ(G,J)}function ZJ(G,J){if(J)return ZG(G,J);return{prepare(Y){return new TG(G,Y)}}}function $J(G,J){if(J)return ZG(G,J);return{prepare(Y){return new DG(G,Y)}}}function YY(G,J){if(J)return ZG(G,J);return{prepare(Y){return new RG(G,Y)}}}function ZG(G,J){return{prepare(Y){return new xG(G,J,Y)}}}function ZY(G){return{async get(J,Y="text"){let Z=await VY(G,J);if(Z===null||Z===void 0)return null;if(Y==="json"){if(typeof Z==="string")try{return JSON.parse(Z)}catch($){throw new F(`Failed to parse JSON from NuxtHub KV for key ${J}: ${$ instanceof Error?$.message:String($)}`,"KV_JSON_PARSE_FAILED")}return Z}return typeof Z==="string"?Z:JSON.stringify(Z)},async put(J,Y){await AY(G,J,Y)},async delete(J){await LY(G,J)},async list(J){let Y=J?.prefix??"",Z=await jY(G,Y);return{keys:(typeof J?.limit==="number"?Z.slice(0,J.limit):Z).map((X)=>({name:X})),list_complete:!0}}}}function $Y(G,J){return ZJ({query:async(Z,$=[])=>{let X=J(G.connectionString);if(typeof X.connect==="function")await X.connect();try{return await X.query(Z,$)}finally{if(typeof X.release==="function")X.release();else if(typeof X.end==="function")await X.end()}}})}function XY(G,J){return $J({execute:async(Z,$=[])=>{let X=J(G.connectionString);try{if(typeof X.execute==="function")return await X.execute(Z,$);if(typeof X.query==="function")return await X.query(Z,$);throw new F("Hyperdrive MySQL client is missing execute/query methods","MYSQL_CLIENT_INVALID")}finally{if(typeof X.end==="function")await X.end();else if(typeof X.close==="function")await X.close();else if(typeof X.destroy==="function")X.destroy()}}})}function WY(G){if(!G||typeof G!=="object")return!1;return typeof G.prepare==="function"}function HY(G){if(!G||typeof G!=="object")return!1;let J=G;return typeof J.get==="function"&&typeof J.put==="function"&&typeof J.delete==="function"&&typeof J.list==="function"}class TG{client;sql;bindings;constructor(G,J,Y=[]){this.client=G,this.sql=J,this.bindings=Y}bind(...G){return new TG(this.client,this.sql,G)}async run(){let G=Date.now(),J=EG(this.sql),Y=await this.client.query(J,this.bindings);return{success:!0,results:Y.rows??[],meta:B(G,{changes:typeof Y.rowCount==="number"?Y.rowCount:void 0,command:Y.command})}}async all(){let G=Date.now(),J=EG(this.sql),Y=await this.client.query(J,this.bindings);return{success:!0,results:Y.rows??[],meta:B(G,{changes:typeof Y.rowCount==="number"?Y.rowCount:void 0,command:Y.command})}}async first(){let G=EG(this.sql);return(await this.client.query(G,this.bindings)).rows?.[0]??null}}class DG{client;sql;bindings;constructor(G,J,Y=[]){this.client=G,this.sql=J,this.bindings=Y}bind(...G){return new DG(this.client,this.sql,G)}async run(){let G=Date.now(),J=await jG(this.client,this.sql,this.bindings);if(Array.isArray(J))return{success:!0,results:J,meta:B(G)};let Y=J;return{success:!0,results:[],meta:B(G,{changes:Y.affectedRows,last_row_id:Y.insertId,warningStatus:Y.warningStatus})}}async all(){let G=Date.now(),J=await jG(this.client,this.sql,this.bindings);return{success:!0,results:Array.isArray(J)?J:[],meta:B(G,{changes:!Array.isArray(J)?J.affectedRows:void 0})}}async first(){let G=await jG(this.client,this.sql,this.bindings);if(!Array.isArray(G)||G.length===0)return null;return G[0]}}class RG{client;sql;bindings;constructor(G,J,Y=[]){this.client=G,this.sql=J,this.bindings=Y}bind(...G){return new RG(this.client,this.sql,G)}async run(){let G=Date.now();if(typeof this.client.execute==="function"){let $=await this.client.execute(this.sql,this.bindings);return{success:!0,results:IG($),meta:B(G)}}let J=this.client.prepare?.(this.sql);if(!J||typeof J.run!=="function")throw new F("SQLite client must expose execute() or prepare().run()","SQLITE_CLIENT_INVALID");let Z=await J.run(...this.bindings)??{};return{success:!0,results:[],meta:B(G,{changes:YG(Z.changes),last_row_id:Z.lastInsertRowid??Z.lastID})}}async all(){let G=Date.now();if(typeof this.client.execute==="function"){let Z=await this.client.execute(this.sql,this.bindings);return{success:!0,results:IG(Z),meta:B(G)}}let J=this.client.prepare?.(this.sql);if(!J||typeof J.all!=="function")throw new F("SQLite client must expose execute() or prepare().all()","SQLITE_CLIENT_INVALID");let Y=await J.all(...this.bindings);return{success:!0,results:Array.isArray(Y)?Y:[],meta:B(G)}}async first(){if(typeof this.client.execute==="function"){let J=await this.client.execute(this.sql,this.bindings);return IG(J)[0]??null}let G=this.client.prepare?.(this.sql);if(!G)throw new F("SQLite client must expose execute() or prepare().get()","SQLITE_CLIENT_INVALID");if(typeof G.get==="function"){let J=await G.get(...this.bindings);return J===void 0||J===null?null:J}if(typeof G.all==="function"){let J=await G.all(...this.bindings);if(!Array.isArray(J)||J.length===0)return null;let Y=J[0];return Y===void 0||Y===null?null:Y}throw new F("SQLite prepare() result must expose get() or all()","SQLITE_CLIENT_INVALID")}}class xG{client;sqlTag;sqlText;bindings;constructor(G,J,Y,Z=[]){this.client=G,this.sqlTag=J,this.sqlText=Y,this.bindings=Z}bind(...G){return new xG(this.client,this.sqlTag,this.sqlText,G)}async run(){let G=Date.now(),J=PG(this.sqlTag,this.sqlText,this.bindings),Y=await _Y(this.client,J);return{success:!0,results:QG(Y),meta:B(G,JJ(Y))}}async all(){let G=Date.now(),J=PG(this.sqlTag,this.sqlText,this.bindings),Y=await XJ(this.client,J);return{success:!0,results:QG(Y),meta:B(G,JJ(Y))}}async first(){let G=PG(this.sqlTag,this.sqlText,this.bindings),J=await OY(this.client,G),Y=QG(J);if(Y.length>0)return Y[0]??null;if(J&&typeof J==="object"&&"row"in J){let Z=J.row;return Z===void 0||Z===null?null:Z}if(J&&typeof J==="object"&&!Array.isArray(J)&&!("rows"in J)&&!("results"in J)&&!("data"in J))return J;return null}}async function UY(G,J,Y,Z){try{let $=await G.scan(J,{MATCH:Y,COUNT:Z});return GJ($)}catch{let $=await G.scan(J,"MATCH",Y,"COUNT",String(Z));return GJ($)}}function GJ(G){if(Array.isArray(G))return{cursor:String(G[0]??"0"),keys:Array.isArray(G[1])?G[1]:[]};return{cursor:String(G.cursor??"0"),keys:Array.isArray(G.keys)?G.keys:[]}}async function jG(G,J,Y){if(typeof G.execute==="function"){let Z=await G.execute(J,Y);if(Array.isArray(Z))return Z[0];return Z}if(typeof G.query==="function"){let Z=await G.query(J,Y);if(Array.isArray(Z))return Z[0];return Z}throw new F("MySQL client must expose execute() or query()","MYSQL_CLIENT_INVALID")}async function _Y(G,J){if(typeof G.run==="function")return await G.run(J);if(typeof G.execute==="function")return await G.execute(J);if(typeof G.all==="function")return await G.all(J);throw new F("Drizzle client must expose run(), execute(), or all()","DRIZZLE_CLIENT_INVALID")}async function XJ(G,J){if(typeof G.all==="function")return await G.all(J);if(typeof G.execute==="function")return await G.execute(J);if(typeof G.run==="function")return await G.run(J);throw new F("Drizzle client must expose all(), execute(), or run()","DRIZZLE_CLIENT_INVALID")}async function OY(G,J){if(typeof G.get==="function")return await G.get(J);return await XJ(G,J)}function PG(G,J,Y){let Z=FY(J),$=Z.length-1;if($!==Y.length)throw new F(`Drizzle binding mismatch: expected ${$} bindings, received ${Y.length}`,"DRIZZLE_BINDINGS_MISMATCH");if($===0)return G.raw(J);let X=typeof G.empty==="function"?G.empty():G.raw("");for(let W=0;W<Z.length;W++){let H=Z[W];if(H)X.append(G.raw(H));if(W<$)X.append(G`${Y[W]}`)}return X}function FY(G){let J=[],Y=0,Z=!1,$=!1,X=!1,W=!1;for(let H=0;H<G.length;H++){let U=G[H],_=H+1<G.length?G[H+1]:"";if(X){if(U===`
17
- `)X=!1;continue}if(W){if(U==="*"&&_==="/")H++,W=!1;continue}if(!Z&&!$){if(U==="-"&&_==="-"){H++,X=!0;continue}if(U==="/"&&_==="*"){H++,W=!0;continue}}if(U==="'"&&!$){if(Z&&_==="'"){H++;continue}Z=!Z;continue}if(U==='"'&&!Z){if($&&_==='"'){H++;continue}$=!$;continue}if(U==="?"&&!Z&&!$)J.push(G.slice(Y,H)),Y=H+1}return J.push(G.slice(Y)),J}function QG(G){let J=(Z)=>{if(!Z||typeof Z!=="object"||Array.isArray(Z))return;let $=Z;if(Array.isArray($.rows))return $.rows;if(Array.isArray($.results))return $.results;if(Array.isArray($.data))return $.data;return},Y=(Z)=>{if(!Z||typeof Z!=="object"||Array.isArray(Z))return!1;return Object.keys(Z).length>0};if(Array.isArray(G)){if(G.length===2){let Z=J(G[0]);if(Z)return Z;let $=J(G[1]);if($)return $;if(!Array.isArray(G[0])&&!Array.isArray(G[1])){if(Y(G[0]))return[G[0]];if(Y(G[1]))return[G[1]]}if(Array.isArray(G[0]))return G[0];if(Array.isArray(G[1]))return G[1]}return G}if(G&&typeof G==="object"){let Z=J(G);if(Z)return Z}return[]}function JJ(G){if(!G)return{};let J;if(Array.isArray(G)){if(G.length===2){if(G[0]&&typeof G[0]==="object"&&!Array.isArray(G[0]))J=G[0];else if(G[1]&&typeof G[1]==="object"&&!Array.isArray(G[1]))J=G[1]}}else if(typeof G==="object"&&!Array.isArray(G))J=G;if(!J)return{};let Y={},Z=YG(J.rowCount)??YG(J.changes)??YG(J.affectedRows);if(Z!==void 0)Y.changes=Z;let $=J.lastInsertRowid??J.lastInsertId??J.lastID??J.lastRowID??J.insertId??J.insertID;if(typeof $==="number"||typeof $==="string")Y.last_row_id=$;if(J.meta&&typeof J.meta==="object")Object.assign(Y,J.meta);return Y}async function VY(G,J){if(typeof G.get==="function")return await G.get(J);if(typeof G.getItem==="function")return await G.getItem(J);throw new F("NuxtHub KV client must expose get() or getItem()","NUXTHUB_KV_CLIENT_INVALID")}async function AY(G,J,Y){if(typeof G.set==="function"){await G.set(J,Y);return}if(typeof G.setItem==="function"){await G.setItem(J,Y);return}throw new F("NuxtHub KV client must expose set() or setItem()","NUXTHUB_KV_CLIENT_INVALID")}async function LY(G,J){if(typeof G.del==="function"){await G.del(J);return}if(typeof G.removeItem==="function"){await G.removeItem(J);return}throw new F("NuxtHub KV client must expose del() or removeItem()","NUXTHUB_KV_CLIENT_INVALID")}async function jY(G,J){let Y;if(typeof G.keys==="function")Y=await G.keys(J);else if(typeof G.getKeys==="function")Y=await G.getKeys(J);else throw new F("NuxtHub KV client must expose keys() or getKeys()","NUXTHUB_KV_CLIENT_INVALID");if(!Array.isArray(Y))return[];if(!J)return[...Y];return Y.filter((Z)=>Z.startsWith(J))}function IG(G){if(Array.isArray(G))return G;if(G&&typeof G==="object"){let J=G;if(Array.isArray(J.rows))return J.rows;if(Array.isArray(J.results))return J.results}return[]}function B(G,J={}){return{duration:Date.now()-G,...J}}function YG(G){if(typeof G==="number"&&Number.isFinite(G))return G;return}var n=new Map;function EG(G){let J=n.get(G);if(J)return J;let Y="",Z=0,$=!1,X=!1,W=!1,H=!1;for(let U=0;U<G.length;U++){let _=G[U],O=U+1<G.length?G[U+1]:"";if(W){if(Y+=_,_===`
18
- `)W=!1;continue}if(H){if(Y+=_,_==="*"&&O==="/")Y+="/",U++,H=!1;continue}if(!$&&!X){if(_==="-"&&O==="-"){Y+="--",U++,W=!0;continue}if(_==="/"&&O==="*"){Y+="/*",U++,H=!0;continue}}if(_==="'"&&!X){$=!$,Y+=_;continue}if(_==='"'&&!$){X=!X,Y+=_;continue}if(_==="?"&&!$&&!X){Z++,Y+=`$${Z}`;continue}Y+=_}if(n.set(G,Y),n.size>5000){let U=n.keys().next().value;if(U)n.delete(U)}return Y}c();export{t as validateTableForSharding,OG as schemaExists,FG as runShard,sG as runAllShards,dG as run,PJ as resetConfig,qJ as reassignShard,e as prepare,CG as migrateRecord,h as listTables,SJ as listKnownShards,WY as isSQLDatabase,HY as isKVStorage,qG as integrateExistingDatabase,wJ as insertShard,vJ as insert,yG as initializeAsync,LJ as initialize,dJ as indexShard,oJ as indexAllShards,cJ as index,eJ as getTotalDatabaseSize,KJ as getShardStats,rG as getDatabaseSizesAllShards,mJ as getDatabaseSizeForShard,rJ as getDatabaseSizeForKey,EJ as getClosestRegionFromIP,yJ as flush,VG as firstShard,kJ as firstByLookupKey,pJ as firstAllShardsGlobal,aG as firstAllShards,lG as first,lJ as explainShard,sJ as explainAllShards,nJ as explain,wG as dropSchema,i as discoverExistingRecordsWithColumns,s as discoverExistingPrimaryKeys,JY as createValkeyKVProvider,vG as createSchemaAcrossShards,MJ as createSchema,YY as createSQLiteProvider,YJ as createRedisKVProvider,ZJ as createPostgreSQLProvider,ZY as createNuxtHubKVProvider,$J as createMySQLProvider,kG as createMappingsForExistingKeys,$Y as createHyperdrivePostgresProvider,XY as createHyperdriveMySQLProvider,ZG as createDrizzleSQLProvider,tJ as countShard,aJ as countAllShards,iJ as count,jJ as collegedb,bG as clearShardMigrationCache,fG as clearMigrationCache,KG as checkMigrationNeeded,SG as autoDetectAndMigrate,GG as allShard,CJ as allByLookupKey,tG as allAllShardsGlobal,JG as allAllShards,nG as all,eG as ShardCoordinator,S as KVShardMapper,F 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=46EBE6102EC18AED64756E2164756E21
20
+ //# debugId=9AFB8B23169E96D364756E2164756E21
21
21
  //# sourceMappingURL=index.js.map