@earth-app/collegedb 1.2.2 → 1.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +7 -7
- package/dist/index.js.map +3 -3
- package/dist/providers-memory.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
var y6=Object.defineProperty;var g6=(J)=>J;function p6(J,$){this[J]=g6.bind(null,$)}var nJ=(J,$)=>{for(var X in $)y6(J,X,{get:$[X],enumerable:!0,configurable:!0,set:p6.bind($,X)})};var RJ=(J,$)=>()=>(J&&($=J(J=0)),$);var j;var b=RJ(()=>{j=class j extends Error{code;constructor(J,$){super(J);if(this.name="CollegeDBError",this.code=$,Error.captureStackTrace)Error.captureStackTrace(this,j)}}});var NJ={};nJ(NJ,{KVShardMapper:()=>y});async function c(J,$,X){if(J.length===0)return;let Y=Math.max(1,Math.min($,J.length)),Z=0,G=Array(Y).fill(null).map(async()=>{while(Z<J.length){let H=Z++,U=J[H];if(U===void 0)continue;await X(U)}});await Promise.all(G)}class y{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??m6,this.knownShardsCacheTtlMs=$.knownShardsCacheTtlMs??u6}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),G=new Uint8Array(Z),H=Array.from(G).map((U)=>U.toString(16).padStart(2,"0")).join("");if(this.hashCache.size<1e4)this.hashCache.set(J,H);return H}async getShardMapping(J){let $=await this.hashKey(J),X=this.getCachedMapping($);if(X!==void 0)return X;let Y=`${k}${$}`,Z=await this.kv.get(Y,"json");if(Z)return this.setCachedMapping($,Z),Z;let G=await this.kv.get(`${f}${$}`,"json");if(G){let H={shard:G.shard,createdAt:G.createdAt,updatedAt:G.updatedAt,originalKey:this.hashKeys?void 0:J};if(this.setCachedMapping($,H),this.hashKeys)for(let U of G.keys)this.setCachedMapping(U,H);return H}return this.setCachedMapping($,null),null}async setShardMapping(J,$,X=[]){let Y=[J,...X],Z=Date.now(),G={shard:$,createdAt:Z,updatedAt:Z,originalKey:this.hashKeys?void 0:J};if(Y.length===1){let H=await this.hashKey(J),U=`${k}${H}`;await this.kv.put(U,JSON.stringify(G)),this.setCachedMapping(H,G)}else{let H=await this.hashKey(J),U=`${f}${H}`,_=this.hashKeys?await Promise.all(Y.map((O)=>this.hashKey(O))):Y,F={shard:$,createdAt:Z,updatedAt:Z,keys:_};await this.kv.put(U,JSON.stringify(F));let W=Y.map(async(O)=>{let A=await this.hashKey(O),Q=`${k}${A}`,z={shard:$,createdAt:Z,updatedAt:Z,originalKey:this.hashKeys?void 0:O};return this.kv.put(Q,JSON.stringify(z))});await Promise.all(W),await this.cacheMappingForKeys(Y,G)}}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=`${k}${Y}`,G=`${f}${Y}`,H=await this.kv.get(G,"json");if(H){let U=Date.now(),_={...H,shard:$,updatedAt:U};await this.kv.put(G,JSON.stringify(_));let F=H.keys.length>0?H.keys:[await this.hashKey(J)],W=F.map(async(A)=>{let Q=`${k}${A}`,z={...X,shard:$,updatedAt:U};return this.kv.put(Q,JSON.stringify(z))});await Promise.all(W);let O={...X,shard:$,updatedAt:U};for(let A of F)if(this.hashKeys)this.setCachedMapping(A,O);else this.setCachedMapping(await this.hashKey(A),O);this.setCachedMapping(Y,O)}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=`${k}${$}`,Y=`${f}${$}`,Z=await this.kv.get(Y,"json");if(Z){await this.kv.delete(Y);let G=Z.keys.length>0?Z.keys:[await this.hashKey(J)],H=G.map(async(U)=>{let _=`${k}${U}`;return this.kv.delete(_)});await Promise.all(H);for(let U of G)if(this.hashKeys)this.setCachedMapping(U,null);else this.setCachedMapping(await this.hashKey(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(sJ,"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(sJ,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=new Set,Y=(H)=>{if(!X.has(H))X.add(H),$.push(H)},Z=await this.kv.list({prefix:k});await c(Z.keys,u,async(H)=>{let U=await this.kv.get(H.name,"json");if(U?.shard!==J)return;if(U.originalKey)Y(U.originalKey);else if(!this.hashKeys)Y(H.name.replace(k,""))});let G=await this.kv.list({prefix:f});return await c(G.keys,u,async(H)=>{let U=await this.kv.get(H.name,"json");if(U?.shard===J)for(let _ of U.keys)Y(_)}),$}async getShardKeyCounts(){let J={},$=await this.kv.list({prefix:k});await c($.keys,u,async(Y)=>{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:f});return await c(X.keys,u,async(Y)=>{let Z=await this.kv.get(Y.name,"json");if(Z)J[Z.shard]=(J[Z.shard]||0)+Z.keys.length}),J}async clearAllMappings(){let[J,$]=await Promise.all([this.kv.list({prefix:k}),this.kv.list({prefix:f})]);await Promise.all([c(J.keys,u,async(X)=>{await this.kv.delete(X.name)}),c($.keys,u,async(X)=>{await this.kv.delete(X.name)})]),this.mappingCache.clear(),this.hashCache.clear(),this.knownShardsCache.shards=null,this.knownShardsCache.expiresAt=0}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=`${f}${Y}`,G=await this.kv.get(Z,"json"),H=[J,...$],U=Date.now();if(!G){let W=this.hashKeys?await Promise.all(H.map((O)=>this.hashKey(O))):H;G={shard:X.shard,createdAt:X.createdAt,updatedAt:U,keys:W}}else{let W=this.hashKeys?await Promise.all(H.map((O)=>this.hashKey(O))):H;G={...G,updatedAt:U,keys:[...new Set([...G.keys,...W])]}}await this.kv.put(Z,JSON.stringify(G));let _=$.map(async(W)=>{let O=await this.hashKey(W),A=`${k}${O}`,Q={shard:X.shard,createdAt:X.createdAt,updatedAt:U,originalKey:this.hashKeys?void 0:W};return this.kv.put(A,JSON.stringify(Q))});await Promise.all(_);let F={shard:X.shard,createdAt:X.createdAt,updatedAt:U,originalKey:X.originalKey};await this.cacheMappingForKeys([J,...$],F)}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 G=Y++,H=J[G];if(!H)continue;await this.setShardMapping(H.primaryKey,H.shard,H.additionalKeys||[])}});await Promise.all(Z)}async getAllLookupKeys(J){let $=await this.hashKey(J),X=`${f}${$}`,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 k="shard:",f="multikey:",sJ="known_shards",m6=30000,u6=1e4,u=32;var JJ=RJ(()=>{b()});var AJ={};nJ(AJ,{validateTableForSharding:()=>OJ,schemaExists:()=>rJ,migrateRecord:()=>J6,listTables:()=>d,integrateExistingDatabase:()=>X6,dropSchema:()=>eJ,discoverExistingRecordsWithColumns:()=>WJ,discoverExistingPrimaryKeys:()=>FJ,createSchemaAcrossShards:()=>aJ,createSchema:()=>tJ,createMappingsForExistingKeys:()=>$6,clearShardMigrationCache:()=>H6,clearMigrationCache:()=>G6,checkMigrationNeeded:()=>Z6,autoDetectAndMigrate:()=>Y6});async function iJ(J,$,X){if(J.length===0)return;let Y=Math.max(1,Math.min($,J.length)),Z=0,G=Array(Y).fill(null).map(async()=>{while(Z<J.length){let H=Z++,U=J[H];if(U===void 0)continue;await X(U,H)}});await Promise.all(G)}function c6(J,$,X,Y){let Z=X.length;switch(Y){case"hash":{let G=0;for(let U=0;U<J.length;U++){let _=J.charCodeAt(U);G=(G<<5)-G+_,G=G&G}let H=Math.abs(G)%Z;return X[H]}case"random":return X[Math.floor(Math.random()*Z)];default:return X[$%Z]}}async function tJ(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 aJ(J,$){let X=Object.entries(J).map(([Y,Z])=>{return tJ(Z,$).catch((G)=>{throw new j(`Failed to create schema on shard ${Y}: ${G.message}`,"SCHEMA_CREATION_FAILED")})});await Promise.all(X)}async function rJ(J,$){try{return await J.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name=?").bind($).first()!==null}catch{return!1}}async function eJ(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 d(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 J6(J,$,X,Y){if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(Y))throw new j(`Invalid table name for migration: ${Y}`,"INVALID_TABLE_NAME");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");let G=Object.keys(Z);if(G.length===0)throw new j(`Source record for ${X} has no columns`,"EMPTY_SOURCE_RECORD");let H=G.map(()=>"?").join(", "),U=G.map((F)=>Z[F]),_=`INSERT OR REPLACE INTO ${Y} (${G.join(", ")}) VALUES (${H})`;await $.prepare(_).bind(...U).run(),await J.prepare(`DELETE FROM ${Y} WHERE id = ?`).bind(X).run()}async function FJ(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 WJ(J,$,X="id"){try{let Y=`${$}_columns`,Z;if(CJ.has(Y))Z=CJ.get(Y).map((_)=>_.name);else{let F=(await J.prepare(`PRAGMA table_info(${$})`).all()).results.map((W)=>({name:W.name,type:W.type}));CJ.set(Y,F),Z=F.map((W)=>W.name)}let G=[X];if(Z.includes("username"))G.push("username");if(Z.includes("email"))G.push("email");if(Z.includes("name"))G.push("name");let H=`SELECT ${G.join(", ")} FROM ${$}`;return(await J.prepare(H).all()).results}catch(Y){throw new j(`Failed to discover records with columns in table ${$}: ${Y}`,"DISCOVERY_FAILED")}}async function $6(J,$,X,Y,Z={}){if(J.length===0||$.length===0)return;let G=Math.max(1,Z.concurrency??25),H=J.map((U,_)=>({primaryKey:U,shard:c6(U,_,$,X)}));await Y.setShardMappingsBatch(H,{concurrency:G})}async function OJ(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((F)=>F.name===X&&F.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(G){Y.push(`Database validation error: ${G}`)}return{isValid:Y.length===0,tableName:$,primaryKeyColumn:X,recordCount:Z,issues:Y}}async function X6(J,$,X,Y={}){let{tables:Z,primaryKeyColumn:G="id",strategy:H="hash",addShardMappingsTable:U=!0,dryRun:_=!1,migrateOtherColumns:F=!1,concurrency:W=25}=Y,O=Math.max(1,W),A=[],Q=0,z=0,T=0;try{let E=(Z||await d(J)).filter((P)=>P!=="shard_mappings");for(let P of E)try{let M=await OJ(J,P,G);if(!M.isValid){A.push(`Table ${P}: ${M.issues.join(", ")}`);continue}if(F){let D=await WJ(J,P,G);if(D.length===0){A.push(`Table ${P} has no records to process`);continue}if(!_){let V=D.map((L)=>{let C=String(L[G]),h=[];if(L.username&&typeof L.username==="string")h.push(`username:${L.username}`);if(L.email&&typeof L.email==="string")h.push(`email:${L.email}`);if(L.name&&typeof L.name==="string")h.push(`name:${L.name}`);return{primaryKey:C,shard:$,additionalKeys:h}});await X.setShardMappingsBatch(V,{concurrency:O}),T+=V.length}z+=D.length}else{let D=await FJ(J,P,G);if(D.length===0){A.push(`Table ${P} has no records to process`);continue}if(!_){let V=D.map((L)=>({primaryKey:L,shard:$}));await X.setShardMappingsBatch(V,{concurrency:O}),T+=V.length}z+=D.length}Q++}catch(M){A.push(`Failed to process table ${P}: ${M}`)}if(U&&!_){if(!(await d(J)).includes("shard_mappings"))await J.prepare(`
|
|
1
|
+
var m6=Object.defineProperty;var u6=(J)=>J;function c6(J,$){this[J]=u6.bind(null,$)}var iJ=(J,$)=>{for(var X in $)m6(J,X,{get:$[X],enumerable:!0,configurable:!0,set:c6.bind($,X)})};var NJ=(J,$)=>()=>(J&&($=J(J=0)),$);var j;var b=NJ(()=>{j=class j extends Error{code;constructor(J,$){super(J);if(this.name="CollegeDBError",this.code=$,Error.captureStackTrace)Error.captureStackTrace(this,j)}}});var CJ={};iJ(CJ,{KVShardMapper:()=>y});async function d(J,$,X){if(J.length===0)return;let Y=Math.max(1,Math.min($,J.length)),Z=0,G=Array(Y).fill(null).map(async()=>{while(Z<J.length){let H=Z++,_=J[H];if(_===void 0)continue;await X(_)}});await Promise.all(G)}class y{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??d6,this.knownShardsCacheTtlMs=$.knownShardsCacheTtlMs??l6}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),G=new Uint8Array(Z),H=Array.from(G).map((_)=>_.toString(16).padStart(2,"0")).join("");if(this.hashCache.size<1e4)this.hashCache.set(J,H);return H}async getShardMapping(J){let $=await this.hashKey(J),X=this.getCachedMapping($);if(X!==void 0)return X;let Y=`${k}${$}`,Z=await this.kv.get(Y,"json");if(Z)return this.setCachedMapping($,Z),Z;let G=await this.kv.get(`${f}${$}`,"json");if(G){let H={shard:G.shard,createdAt:G.createdAt,updatedAt:G.updatedAt,originalKey:this.hashKeys?void 0:J};if(this.setCachedMapping($,H),this.hashKeys)for(let _ of G.keys)this.setCachedMapping(_,H);return H}return this.setCachedMapping($,null),null}async setShardMapping(J,$,X=[]){let Y=[J,...X],Z=Date.now(),G={shard:$,createdAt:Z,updatedAt:Z,originalKey:this.hashKeys?void 0:J};if(Y.length===1){let H=await this.hashKey(J),_=`${k}${H}`;await this.kv.put(_,JSON.stringify(G)),this.setCachedMapping(H,G)}else{let H=await this.hashKey(J),_=`${f}${H}`,U=this.hashKeys?await Promise.all(Y.map((O)=>this.hashKey(O))):Y,F={shard:$,createdAt:Z,updatedAt:Z,keys:U};await this.kv.put(_,JSON.stringify(F));let W=Y.map(async(O)=>{let A=await this.hashKey(O),Q=`${k}${A}`,z={shard:$,createdAt:Z,updatedAt:Z,originalKey:this.hashKeys?void 0:O};return this.kv.put(Q,JSON.stringify(z))});await Promise.all(W),await this.cacheMappingForKeys(Y,G)}}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=`${k}${Y}`,G=`${f}${Y}`,H=await this.kv.get(G,"json");if(H){let _=Date.now(),U={...H,shard:$,updatedAt:_};await this.kv.put(G,JSON.stringify(U));let F=H.keys.length>0?H.keys:[await this.hashKey(J)],W=F.map(async(A)=>{let Q=`${k}${A}`,z={...X,shard:$,updatedAt:_};return this.kv.put(Q,JSON.stringify(z))});await Promise.all(W);let O={...X,shard:$,updatedAt:_};for(let A of F)if(this.hashKeys)this.setCachedMapping(A,O);else this.setCachedMapping(await this.hashKey(A),O);this.setCachedMapping(Y,O)}else{let _={...X,shard:$,updatedAt:Date.now()};await this.kv.put(Z,JSON.stringify(_)),this.setCachedMapping(Y,_)}}async deleteShardMapping(J){let $=await this.hashKey(J),X=`${k}${$}`,Y=`${f}${$}`,Z=await this.kv.get(Y,"json");if(Z){await this.kv.delete(Y);let G=Z.keys.length>0?Z.keys:[await this.hashKey(J)],H=G.map(async(_)=>{let U=`${k}${_}`;return this.kv.delete(U)});await Promise.all(H);for(let _ of G)if(this.hashKeys)this.setCachedMapping(_,null);else this.setCachedMapping(await this.hashKey(_),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(sJ,"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(sJ,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=new Set,Y=(H)=>{if(!X.has(H))X.add(H),$.push(H)},Z=await this.kv.list({prefix:k});await d(Z.keys,c,async(H)=>{let _=await this.kv.get(H.name,"json");if(_?.shard!==J)return;if(_.originalKey)Y(_.originalKey);else if(!this.hashKeys)Y(H.name.replace(k,""))});let G=await this.kv.list({prefix:f});return await d(G.keys,c,async(H)=>{let _=await this.kv.get(H.name,"json");if(_?.shard===J)for(let U of _.keys)Y(U)}),$}async getShardKeyCounts(){let J={},$=await this.kv.list({prefix:k});await d($.keys,c,async(Y)=>{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:f});return await d(X.keys,c,async(Y)=>{let Z=await this.kv.get(Y.name,"json");if(Z)J[Z.shard]=(J[Z.shard]||0)+Z.keys.length}),J}async clearAllMappings(){let[J,$]=await Promise.all([this.kv.list({prefix:k}),this.kv.list({prefix:f})]);await Promise.all([d(J.keys,c,async(X)=>{await this.kv.delete(X.name)}),d($.keys,c,async(X)=>{await this.kv.delete(X.name)})]),this.mappingCache.clear(),this.hashCache.clear(),this.knownShardsCache.shards=null,this.knownShardsCache.expiresAt=0}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=`${f}${Y}`,G=await this.kv.get(Z,"json"),H=[J,...$],_=Date.now();if(!G){let W=this.hashKeys?await Promise.all(H.map((O)=>this.hashKey(O))):H;G={shard:X.shard,createdAt:X.createdAt,updatedAt:_,keys:W}}else{let W=this.hashKeys?await Promise.all(H.map((O)=>this.hashKey(O))):H;G={...G,updatedAt:_,keys:[...new Set([...G.keys,...W])]}}await this.kv.put(Z,JSON.stringify(G));let U=$.map(async(W)=>{let O=await this.hashKey(W),A=`${k}${O}`,Q={shard:X.shard,createdAt:X.createdAt,updatedAt:_,originalKey:this.hashKeys?void 0:W};return this.kv.put(A,JSON.stringify(Q))});await Promise.all(U);let F={shard:X.shard,createdAt:X.createdAt,updatedAt:_,originalKey:X.originalKey};await this.cacheMappingForKeys([J,...$],F)}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 G=Y++,H=J[G];if(!H)continue;await this.setShardMapping(H.primaryKey,H.shard,H.additionalKeys||[])}});await Promise.all(Z)}async getAllLookupKeys(J){let $=await this.hashKey(J),X=`${f}${$}`,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 k="shard:",f="multikey:",sJ="known_shards",d6=30000,l6=1e4,c=32;var JJ=NJ(()=>{b()});var AJ={};iJ(AJ,{validateTableForSharding:()=>OJ,schemaExists:()=>eJ,migrateRecord:()=>$6,listTables:()=>l,integrateExistingDatabase:()=>Y6,dropSchema:()=>J6,discoverExistingRecordsWithColumns:()=>WJ,discoverExistingPrimaryKeys:()=>FJ,createSchemaAcrossShards:()=>rJ,createSchema:()=>aJ,createMappingsForExistingKeys:()=>X6,clearShardMigrationCache:()=>_6,clearMigrationCache:()=>H6,checkMigrationNeeded:()=>G6,autoDetectAndMigrate:()=>Z6});async function tJ(J,$,X){if(J.length===0)return;let Y=Math.max(1,Math.min($,J.length)),Z=0,G=Array(Y).fill(null).map(async()=>{while(Z<J.length){let H=Z++,_=J[H];if(_===void 0)continue;await X(_,H)}});await Promise.all(G)}function o6(J,$,X,Y){let Z=X.length;switch(Y){case"hash":{let G=0;for(let _=0;_<J.length;_++){let U=J.charCodeAt(_);G=(G<<5)-G+U,G=G&G}let H=Math.abs(G)%Z;return X[H]}case"random":return X[Math.floor(Math.random()*Z)];default:return X[$%Z]}}async function aJ(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 rJ(J,$){let X=Object.entries(J).map(([Y,Z])=>{return aJ(Z,$).catch((G)=>{throw new j(`Failed to create schema on shard ${Y}: ${G.message}`,"SCHEMA_CREATION_FAILED")})});await Promise.all(X)}async function eJ(J,$){try{return await J.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name=?").bind($).first()!==null}catch{return!1}}async function J6(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 l(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 $6(J,$,X,Y){if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(Y))throw new j(`Invalid table name for migration: ${Y}`,"INVALID_TABLE_NAME");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");let G=Object.keys(Z);if(G.length===0)throw new j(`Source record for ${X} has no columns`,"EMPTY_SOURCE_RECORD");let H=G.map(()=>"?").join(", "),_=G.map((F)=>Z[F]),U=`INSERT OR REPLACE INTO ${Y} (${G.join(", ")}) VALUES (${H})`;await $.prepare(U).bind(..._).run(),await J.prepare(`DELETE FROM ${Y} WHERE id = ?`).bind(X).run()}async function FJ(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 WJ(J,$,X="id"){try{let Y=`${$}_columns`,Z;if(wJ.has(Y))Z=wJ.get(Y).map((U)=>U.name);else{let F=(await J.prepare(`PRAGMA table_info(${$})`).all()).results.map((W)=>({name:W.name,type:W.type}));wJ.set(Y,F),Z=F.map((W)=>W.name)}let G=[X];if(Z.includes("username"))G.push("username");if(Z.includes("email"))G.push("email");if(Z.includes("name"))G.push("name");let H=`SELECT ${G.join(", ")} FROM ${$}`;return(await J.prepare(H).all()).results}catch(Y){throw new j(`Failed to discover records with columns in table ${$}: ${Y}`,"DISCOVERY_FAILED")}}async function X6(J,$,X,Y,Z={}){if(J.length===0||$.length===0)return;let G=Math.max(1,Z.concurrency??25),H=J.map((_,U)=>({primaryKey:_,shard:o6(_,U,$,X)}));await Y.setShardMappingsBatch(H,{concurrency:G})}async function OJ(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((F)=>F.name===X&&F.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(G){Y.push(`Database validation error: ${G}`)}return{isValid:Y.length===0,tableName:$,primaryKeyColumn:X,recordCount:Z,issues:Y}}async function Y6(J,$,X,Y={}){let{tables:Z,primaryKeyColumn:G="id",strategy:H="hash",addShardMappingsTable:_=!0,dryRun:U=!1,migrateOtherColumns:F=!1,concurrency:W=25}=Y,O=Math.max(1,W),A=[],Q=0,z=0,T=0;try{let E=(Z||await l(J)).filter((P)=>P!=="shard_mappings");for(let P of E)try{let M=await OJ(J,P,G);if(!M.isValid){A.push(`Table ${P}: ${M.issues.join(", ")}`);continue}if(F){let D=await WJ(J,P,G);if(D.length===0){A.push(`Table ${P} has no records to process`);continue}if(!U){let V=D.map((L)=>{let C=String(L[G]),h=[];if(L.username&&typeof L.username==="string")h.push(`username:${L.username}`);if(L.email&&typeof L.email==="string")h.push(`email:${L.email}`);if(L.name&&typeof L.name==="string")h.push(`name:${L.name}`);return{primaryKey:C,shard:$,additionalKeys:h}});await X.setShardMappingsBatch(V,{concurrency:O}),T+=V.length}z+=D.length}else{let D=await FJ(J,P,G);if(D.length===0){A.push(`Table ${P} has no records to process`);continue}if(!U){let V=D.map((L)=>({primaryKey:L,shard:$}));await X.setShardMappingsBatch(V,{concurrency:O}),T+=V.length}z+=D.length}Q++}catch(M){A.push(`Failed to process table ${P}: ${M}`)}if(_&&!U){if(!(await l(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(!
|
|
7
|
+
);`.trim()).run()}if(!U)await X.addKnownShard($)}catch(B){A.push(`Integration failed: ${B}`)}return{success:A.length===0||A.length>0&&Q>0,shardName:$,tablesProcessed:Q,totalRecords:z,mappingsCreated:T,issues:A}}async function Z6(J,$,X,Y={}){let{primaryKeyColumn:Z="id",tablesToCheck:G,skipCache:H=!1,maxRecordsToCheck:_=1000,migrateOtherColumns:U=!1,concurrency:F=X.migrationConcurrency??25}=Y,W=Math.max(1,F),O=`${$}_migration_check`;if(!H&&g.has(O))return{migrationNeeded:!1,migrationPerformed:!1,recordsMigrated:0,tablesProcessed:0,issues:[]};let A=[],Q=0,z=0,T=!1,B=!1;try{let{KVShardMapper:E}=await Promise.resolve().then(() => (JJ(),CJ)),P=new E(X.kv,{hashShardMappings:X.hashShardMappings,mappingCacheTtlMs:X.mappingCacheTtlMs,knownShardsCacheTtlMs:X.knownShardsCacheTtlMs}),M=await l(J),D=G||M.filter((V)=>V!=="shard_mappings"&&!V.startsWith("sqlite_")&&V!=="sqlite_sequence");if(D.length===0)return g.set(O,!0),{migrationNeeded:!1,migrationPerformed:!1,recordsMigrated:0,tablesProcessed:0,issues:[]};for(let V of D)try{let L=await OJ(J,V,Z);if(!L.isValid||L.recordCount===0)continue;let C=Math.min(_,L.recordCount),h=await J.prepare(`
|
|
8
8
|
SELECT ${Z} FROM ${V}
|
|
9
9
|
ORDER BY ${Z}
|
|
10
|
-
LIMIT ?`.trim()).bind(C).all(),I=0,
|
|
10
|
+
LIMIT ?`.trim()).bind(C).all(),I=0,BJ=h.results.slice(0,10).map(async(S)=>{let v=String(S[Z]);return{key:v,mapping:await P.getShardMapping(v)}}),u=await Promise.all(BJ);for(let S of u)if(!S.mapping)I++,T=!0;if(I>0){if(X.debug)console.log(`Auto-migrating table ${V} in shard ${$} (${L.recordCount} records)`);if(U){let S=await WJ(J,V,Z),v=[];if(await tJ(S,W,async(w)=>{let RJ=String(w[Z]);if(await P.getShardMapping(RJ))return;let UJ=[];if(w.username&&typeof w.username==="string")UJ.push(`username:${w.username}`);if(w.email&&typeof w.email==="string")UJ.push(`email:${w.email}`);if(w.name&&typeof w.name==="string")UJ.push(`name:${w.name}`);v.push({primaryKey:RJ,shard:$,additionalKeys:UJ})}),v.length>0)await P.setShardMappingsBatch(v,{concurrency:W});Q+=v.length}else{let S=await FJ(J,V,Z),v=[];if(await tJ(S,W,async(w)=>{if(!await P.getShardMapping(w))v.push({primaryKey:w,shard:$})}),v.length>0)await P.setShardMappingsBatch(v,{concurrency:W});Q+=v.length}if(z++,B=!0,X.debug)console.log(`Auto-migrated ${Q} records from table ${V}`)}}catch(L){A.push(`Auto-migration failed for table ${V}: ${L}`)}if(B){if(await P.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(g.set(O,!0),B&&X.debug)console.log(`Auto-migration completed for shard ${$}: ${Q} records from ${z} tables`)}catch(E){A.push(`Auto-migration error: ${E}`)}return{migrationNeeded:T,migrationPerformed:B,recordsMigrated:Q,tablesProcessed:z,issues:A}}async function Z6(J,$,X){let Y=`${$}_migration_check`;if(g.has(Y))return!1;try{let Z=await d(J);if(Z.includes("shard_mappings"))return g.set(Y,!0),!1;let{KVShardMapper:H}=await Promise.resolve().then(() => (JJ(),NJ)),U=new H(X.kv,{hashShardMappings:X.hashShardMappings,mappingCacheTtlMs:X.mappingCacheTtlMs,knownShardsCacheTtlMs:X.knownShardsCacheTtlMs}),_=Z.filter((F)=>F!=="shard_mappings"&&!F.startsWith("sqlite_")&&F!=="sqlite_sequence");for(let F of _.slice(0,3))try{if(((await J.prepare(`SELECT COUNT(*) as count FROM ${F} LIMIT 1`).first())?.count||0)>0){let A=await J.prepare(`SELECT id FROM ${F} LIMIT 1`).first();if(A){let Q=String(A.id);if(!await U.getShardMapping(Q))return!0}}}catch{continue}return!1}catch{return!1}}function G6(){g.clear()}function H6(J){let $=`${J}_migration_check`;g.delete($)}var g,CJ;var $J=RJ(()=>{b();g=new Map,CJ=new Map});b();JJ();var XJ=null,l=null,s=new Map,o=0;function q(J){if(!l)l=new y(J.kv,{hashShardMappings:J.hashShardMappings,mappingCacheTtlMs:J.mappingCacheTtlMs,knownShardsCacheTtlMs:J.knownShardsCacheTtlMs});return l}function d6(J){XJ=J,l=new y(J.kv,{hashShardMappings:J.hashShardMappings,mappingCacheTtlMs:J.mappingCacheTtlMs,knownShardsCacheTtlMs:J.knownShardsCacheTtlMs}),s.clear(),o=0;try{let $=q(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)W6(J).catch(($)=>{console.warn("Background auto-migration failed:",$)})}async function F6(J){XJ=J,l=new y(J.kv,{hashShardMappings:J.hashShardMappings,mappingCacheTtlMs:J.mappingCacheTtlMs,knownShardsCacheTtlMs:J.knownShardsCacheTtlMs}),s.clear(),o=0;try{let $=q(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 W6(J)}catch($){console.warn("Auto migration failed:",$)}}async function l6(J,$){return await F6(J),await $()}async function W6(J){try{let{autoDetectAndMigrate:$}=await Promise.resolve().then(() => ($J(),AJ)),X=Object.keys(J.shards);if(J.debug)console.log(`\uD83D\uDD0D Checking ${X.length} shards for existing data...`);let Y=X.map(async(H)=>{let U=J.shards[H];if(!U)return null;try{let _=await $(U,H,J,{maxRecordsToCheck:1000});return{shardName:H,..._}}catch(_){return console.warn(`Auto-migration failed for shard ${H}:`,_),null}}),G=(await Promise.all(Y)).filter((H)=>H?.migrationPerformed);if(J.debug)if(G.length>0){let H=G.reduce((U,_)=>U+(_?.recordsMigrated||0),0);console.log(`\uD83C\uDF89 Auto-migration completed! Migrated ${H} records across ${G.length} shards`),G.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 o6(){XJ=null,l=null,s.clear(),o=0}function R(){if(!XJ)throw new j("CollegeDB not initialized. Call initialize() first.","NOT_INITIALIZED");return XJ}function n6(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 O6(J,$){let X=J.strategy||"hash";if(typeof X==="string")return X;let Y=X;return Y[$]||Y.write||Y.read||"hash"}function s6(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[$],G=Y.lat-Z.lat,H=Y.lon-Z.lon;return Math.sqrt(G*G+H*H)}function i6(J){let $=J.cf;if(!$||!$.country)return"wnam";let{country:X,continent:Y}=$;if(["US","CA","MX"].includes(X)){let Z=$.region||$.regionCode||"",G=$.timezone||"";if(Z.includes("CA")||Z.includes("WA")||Z.includes("OR")||Z.includes("NV")||Z.includes("AZ")||Z.includes("UT")||G.includes("Pacific")||G.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 t6(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 a6(J,$){let X=Math.max(0,$.sizeCacheTtlMs??30000),Y=s.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 G=await jJ(Z);if(X>0)s.set(J,{size:G,expiresAt:Date.now()+X});return G}async function A6(J,$){if(typeof $.maxDatabaseSize!=="number"||!Number.isFinite($.maxDatabaseSize)||$.maxDatabaseSize<=0)return J;let X=$.maxDatabaseSize,Z=(await Promise.allSettled(J.map(async(G)=>{let H=await a6(G,$);return{shard:G,size:H,withinLimit:H<X}}))).filter((G)=>G.status==="fulfilled"&&G.value.withinLimit).map((G)=>G.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 G=J.filter((H)=>!Z.includes(H));console.log(`Excluded ${G.length} shards due to size limits: ${G.join(", ")}`)}return Z}function r6(J,$,X,Y){let Z=$.filter((W)=>X[W]);if(Z.length===0){let W=0;for(let A=0;A<Y.length;A++){let Q=Y.charCodeAt(A);W=(W<<5)-W+Q,W=W&W}let O=Math.abs(W)%$.length;return $[O]}let G=Z.map((W)=>{let O=X[W],A=s6(J,t6(O)),Q=typeof O==="object"?O.priority||1:1,z=A-Q*0.1;return{shard:W,score:z,distance:A,priority:Q}});G.sort((W,O)=>W.score-O.score);let H=G[0].score,U=G.filter((W)=>Math.abs(W.score-H)<0.01);if(U.length===1)return U[0].shard;let _=0;for(let W=0;W<Y.length;W++){let O=Y.charCodeAt(W);_=(_<<5)-_+O,_=_&_}let F=Math.abs(_)%U.length;return U[F].shard}function n(J,$,X,Y){switch(J){case"hash":{let Z=0;for(let H=0;H<$.length;H++){let U=$.charCodeAt(H);Z=(Z<<5)-Z+U,Z=Z&Z}let G=Math.abs(Z)%X.length;return X[G]||X[0]}case"location":{if(!Y.targetRegion)return n("hash",$,X,Y);return r6(Y.targetRegion,X,Y.shardLocations||{},$)}case"random":return X[Math.floor(Math.random()*X.length)]||X[0];default:return n("hash",$,X,Y)}}async function j6(J,$="write"){let X=R(),Y=q(X),Z=await Y.getShardMapping(J);if(Z)return Z.shard;let G=Object.keys(X.shards);if(G.length===0)throw new j("No shards configured","NO_SHARDS");let H=await A6(G,X),U,_=O6(X,$);if(X.coordinator)try{let F=X.coordinator.idFromName("default"),O=await X.coordinator.get(F).fetch("http://coordinator/allocate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({primaryKey:J,strategy:_,operationType:$,targetRegion:X.targetRegion,shardLocations:X.shardLocations,availableShards:H})});if(O.ok)U=(await O.json()).shard;else U=n(_,J,H,X)}catch(F){console.warn("Coordinator allocation failed, falling back to local strategy:",F),U=n(_,J,H,X)}else U=n(_,J,H,X);return await Y.setShardMapping(J,U),U}async function e6(J,$="write"){let X=R(),Y=await j6(J,$),Z=X.shards[Y];if(!Z)throw new j(`Shard ${Y} not found in configuration`,"SHARD_NOT_FOUND");return Z}async function J7(J,$){let{createSchema:X}=await Promise.resolve().then(() => ($J(),AJ));await X(J,$)}async function LJ(J,$){let X=n6($);return(await e6(J,X)).prepare($)}async function L6(J,$,X=[]){let Z=await(await LJ(J,$)).bind(...X).run();if(!Z.success)throw new j(`Query failed: ${Z.error||"Unknown error"}`,"QUERY_FAILED");return Z}function $7(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 G=Y.toLowerCase();if((G==="id"||G==="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 X7(){return`insert:${Date.now()}:${Math.random().toString(36).slice(2)}`}async function Y7(){let J=R(),$=Object.keys(J.shards);if($.length===0)throw new j("No shards configured","NO_SHARDS");let X=await A6($,J);if(X.length===0)throw new j("No shards available for insert","NO_SHARDS");let Y=O6(J,"write"),Z=X7();if(J.coordinator)try{let G=J.coordinator.idFromName("default"),U=await J.coordinator.get(G).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(G){console.warn("Coordinator allocation for insert failed, falling back to local strategy:",G)}if(Y==="round-robin"){let G=X[o%X.length];return o=(o+1)%X.length,G}return n(Y,Z,X,J)}async function Q6(J,$,X=[]){let Y=R();if(!Y.shards[J])throw new j(`Shard ${J} not found`,"SHARD_NOT_FOUND");let G=/\breturning\b/i.test($)?await QJ(J,$,X):await wJ(J,$,X),H=$7(G);if(H===void 0)throw new j("Insert did not return a generated primary key","GENERATED_KEY_UNAVAILABLE");return await q(Y).setShardMapping(String(H),J),{...G,generatedId:H}}async function Z7(J,$=[]){let X=await Y7();return await Q6(X,J,$)}async function G7(J,$,X=[]){return await Q6(J,$,X)}async function V6(J,$,X=[]){let Z=await(await LJ(J,$)).bind(...X).all();if(!Z.success)throw new j(`Query failed: ${Z.error||"Unknown error"}`,"QUERY_FAILED");return Z}async function E6(J,$,X=[]){return await(await LJ(J,$)).bind(...X).first()}async function H7(J,$,X=[],Y=50){let Z=R(),H=await q(Z).getShardMapping(J);if(H){if(Z.shards[H.shard]){let F=await QJ(H.shard,$,X);if(F.success&&F.results.length>0)return F}}let U=await VJ($,X,Y);return T6(U)}async function U7(J,$,X=[],Y=50){let Z=R(),H=await q(Z).getShardMapping(J);if(H){if(Z.shards[H.shard]){let F=await vJ(H.shard,$,X);if(F!==null)return F}}return(await z6($,X,Y)).find((_)=>_!==null)??null}async function _7(J,$,X){let Y=R();if(!Y.shards[$])throw new j(`Shard ${$} not found in configuration`,"SHARD_NOT_FOUND");let Z=q(Y),G=await Z.getShardMapping(J);if(!G)throw new j(`No existing mapping found for primary key: ${J}`,"MAPPING_NOT_FOUND");if(G.shard!==$){let{migrateRecord:H}=await Promise.resolve().then(() => ($J(),AJ)),U=Y.shards[G.shard],_=Y.shards[$];if(!U||!_)throw new j("Source or target shard not available","SHARD_UNAVAILABLE");await H(U,_,J,X)}await Z.updateShardMapping(J,$)}async function F7(){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 q(J).getKnownShards(),Y=new Set([...Object.keys(J.shards),...X]);return Array.from(Y)}catch{return Object.keys(J.shards)}}async function W7(){let J=R();if(J.coordinator)try{let Z=J.coordinator.idFromName("default"),H=await J.coordinator.get(Z).fetch("http://coordinator/stats");if(H.ok)return await H.json()}catch(Z){console.warn("Failed to get stats from coordinator:",Z)}let $=q(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 wJ(J,$,X=[]){let Z=R().shards[J];if(!Z)throw new j(`Shard ${J} not found`,"SHARD_NOT_FOUND");let G=await Z.prepare($).bind(...X).run();if(!G.success)throw new j(`Query failed: ${G.error||"Unknown error"}`,"QUERY_FAILED");return G}async function QJ(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 vJ(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 P6(J,$=[],X=50){let Y=R(),Z=[];for(let[H,U]of Object.entries(Y.shards)){if(!H||!U){console.error(`Shard ${H??"<null>"} not found, skipping`);continue}Z.push(()=>U.prepare(J).bind(...$).run().catch((_)=>{return console.error(`Error executing query on shard ${H}:`,_),{success:!1,results:[],error:_ instanceof Error?_.message:String(_),meta:{duration:0}}}))}let G=[];for(let H=0;H<Z.length;H+=X){let U=Z.slice(H,H+X).map((_)=>_());G.push(...await Promise.all(U))}return G}async function VJ(J,$=[],X=50){let Y=R(),Z=[];for(let[H,U]of Object.entries(Y.shards)){if(!H||!U){console.error(`Shard ${H??"<null>"} not found, skipping`);continue}Z.push(()=>U.prepare(J).bind(...$).all().catch((_)=>{return console.error(`Error executing query on shard ${H}:`,_),{success:!1,results:[],error:_ instanceof Error?_.message:String(_),meta:{duration:0}}}))}let G=[];for(let H=0;H<Z.length;H+=X){let U=Z.slice(H,H+X).map((_)=>_());G.push(...await Promise.all(U))}return G}function YJ(J,$=50){if(!Number.isFinite(J??$))return $;return Math.max(1,Math.floor(J??$))}function O7(J){if(!Number.isFinite(J??0))return 0;return Math.max(0,Math.floor(J??0))}function A7(J){if(J===void 0)return;if(!Number.isFinite(J))return;return Math.max(0,Math.floor(J))}function U6(J,$){if(typeof $==="function")return $(J);if(!$||typeof J!=="object"||J===null)return;return J[String($)]}function j7(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 T6(J){let $=J.flatMap((G)=>G.results||[]),X=J.filter((G)=>!G.success),Y=J.reduce((G,H)=>G+(H.meta?.duration||0),0);if(X.length===0)return{success:!0,results:$,meta:{duration:Y}};let Z=X.map((G)=>G.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 D6(J,$=[],X={}){let Y=YJ(X.batchSize),Z=O7(X.offset),G=A7(X.limit),H=T6(await VJ(J,$,Y)),U=H.results;if(X.filter)U=U.filter((W)=>X.filter?.(W));if(X.comparator)U=[...U].sort(X.comparator);else if(X.sortBy){let W=X.sortDirection==="desc"?-1:1;U=[...U].sort((O,A)=>{let Q=U6(O,X.sortBy),z=U6(A,X.sortBy);return j7(Q,z)*W})}let _=G===void 0?void 0:Z+G,F=U.slice(Z,_);return{...H,results:F}}async function z6(J,$=[],X=50){let Y=R(),Z=[];for(let[H,U]of Object.entries(Y.shards)){if(!H||!U){console.error(`Shard ${H??"<null>"} not found, skipping`);continue}Z.push(()=>U.prepare(J).bind(...$).first().catch((_)=>{return console.error(`Error executing query on shard ${H}:`,_),null}))}let G=[];for(let H=0;H<Z.length;H+=X){let U=Z.slice(H,H+X).map((_)=>_());G.push(...await Promise.all(U))}return G}async function L7(J,$=[],X={}){return(await D6(J,$,{...X,limit:1})).results[0]??null}async function Q7(){let J=R();if(await q(J).clearAllMappings(),s.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 V7(J){let X=R().shards[J];if(!X)throw new j(`Shard ${J} not found`,"SHARD_NOT_FOUND");return await jJ(X)}var E7=/^[A-Za-z_][A-Za-z0-9_]*$/;function p(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||!E7.test(Y)))throw new j(`Invalid SQL identifier: ${J}`,"INVALID_IDENTIFIER");return X.map((Y)=>`"${Y}"`).join(".")}function _6(J){return J.toLowerCase().replace(/[^a-z0-9_]+/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"")}function P7(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 kJ(J,$,X={}){let Y=P7($),Z=p(J),G=X.indexName?X.indexName:["idx",_6(J),...Y.map((O)=>_6(O.name))].filter(Boolean).join("_").slice(0,120),H=p(G||"idx_auto"),U=Y.map((O)=>{let A=p(O.name),Q=O.order?` ${O.order}`:"",z=O.collate?` COLLATE ${p(O.collate).replace(/"/g,"")}`:"";return`${A}${z}${Q}`}).join(", "),_=X.ifNotExists===!1?"":" IF NOT EXISTS",F=X.unique?"UNIQUE ":"",W=X.where?.trim()?` WHERE ${X.where.trim()}`:"";return`CREATE ${F}INDEX${_} ${H} ON ${Z} (${U})${W}`}async function T7(J,$,X,Y={}){let Z=kJ($,X,Y);return L6(J,Z)}async function D7(J,$,X,Y={}){let Z=kJ($,X,Y);return wJ(J,Z)}async function z7(J,$,X={}){let Y=kJ(J,$,X);return P6(Y,[],YJ(X.batchSize))}function xJ(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 M7(J,$,X=[],Y={}){return V6(J,xJ($,Y.mode),X)}async function I7(J,$,X=[],Y={}){return QJ(J,xJ($,Y.mode),X)}async function B7(J,$=[],X={}){return VJ(xJ(J,X.mode),$,YJ(X.batchSize))}async function R7(J,$){let X=p($),Y=await E6(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 N7(J,$){let X=p($),Y=await vJ(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 C7(J,$=50){let X=R(),Y=YJ($),G=`SELECT COUNT(*) AS row_count FROM ${p(J)}`,H=[];for(let[F,W]of Object.entries(X.shards)){if(!F||!W)continue;H.push(async()=>{try{let O=await W.prepare(G).first(),A=Number(O?.row_count??0);return{shard:F,count:Number.isFinite(A)?A:0,success:!0}}catch(O){return{shard:F,count:null,success:!1,error:O instanceof Error?O.message:String(O)}}})}let U=[];for(let F=0;F<H.length;F+=Y){let W=H.slice(F,F+Y).map((O)=>O());U.push(...await Promise.all(W))}return{total:U.reduce((F,W)=>F+(W.count??0),0),shards:U}}async function w7(J){let $=R(),X=await j6(J,"read"),Y=$.shards[X];if(!Y)throw new j(`Shard ${X} not found in configuration`,"SHARD_NOT_FOUND");return jJ(Y)}async function M6(J=50){let $=R(),X=YJ(J),Y=[];for(let[G,H]of Object.entries($.shards)){if(!G||!H)continue;Y.push(async()=>{try{return{shard:G,size:await jJ(H),success:!0}}catch(U){return{shard:G,size:null,success:!1,error:U instanceof Error?U.message:String(U)}}})}let Z=[];for(let G=0;G<Y.length;G+=X){let H=Y.slice(G,G+X).map((U)=>U());Z.push(...await Promise.all(H))}return Z}async function v7(J=50){return(await M6(J)).reduce((X,Y)=>X+(Y.size??0),0)}b();class I6{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 G=await this.getState(),H=Z||G.knownShards;if(H.length===0)return new Response(JSON.stringify({error:"No shards available"}),{status:400,headers:{"Content-Type":"application/json"}});let U=this.resolveStrategy(G.strategy,X,Y||"write"),_=this.selectShard($,G,U,H);if(U==="round-robin")G.roundRobinIndex=(G.roundRobinIndex+1)%H.length,await this.saveState(G);return new Response(JSON.stringify({shard:_}),{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 G=0;for(let U=0;U<J.length;U++){let _=J.charCodeAt(U);G=(G<<5)-G+_,G=G&G}let H=Math.abs(G)%Z.length;return Z[H]}case"location":{let G=$.targetRegion,H=$.shardLocations||{},U=Z.filter((E)=>H[E]);if(!G||U.length===0){let E=0;for(let M=0;M<J.length;M++){let D=J.charCodeAt(M);E=(E<<5)-E+D,E=E&E}let P=Math.abs(E)%Z.length;return Z[P]}let _={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}},F=(E,P)=>(P in E),W=(E)=>F(_,E)?E:"wnam",O=(E,P)=>{let M=_[W(E)],D=_[W(P)],V=M.lat-D.lat,L=M.lon-D.lon;return Math.sqrt(V*V+L*L)},A=U.map((E)=>{let P=H[E],M=O(G,P.region),D=P.priority||1;return{shard:E,score:M-D*0.1}});A.sort((E,P)=>E.score-P.score);let Q=A[0].score,z=A.filter((E)=>Math.abs(E.score-Q)<0.01);if(z.length===1)return z[0].shard;let T=0;for(let E=0;E<J.length;E++){let P=J.charCodeAt(E);T=(T<<5)-T+P,T=T&T}let B=Math.abs(T)%z.length;return z[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($)}}b();JJ();b();var k7=500;function N6(J,$={}){let X=$.scanCount??k7;return{async get(Y,Z="text"){let G=await J.get(Y);if(G===null)return null;if(Z!=="json")return G;try{return JSON.parse(G)}catch(H){throw new j(`Failed to parse JSON from Redis for key ${Y}: ${H instanceof Error?H.message:String(H)}`,"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??"",G=`${Z}*`,H=Y?.cursor??"0",U=Y?.limit,_=[];do{let F=await y7(J,H,G,X);H=F.cursor;for(let W of F.keys){if(!Z||W.startsWith(Z))_.push(W);if(U&&_.length>=U)break}if(U&&_.length>=U)break}while(H!=="0");return{keys:_.map((F)=>({name:F})),cursor:H,list_complete:H==="0"}}}}function x7(J,$={}){return N6(J,$)}function C6(J,$){if($)return PJ(J,$);return{prepare(X){return new hJ(J,X)}}}function w6(J,$){if($)return PJ(J,$);return{prepare(X){return new yJ(J,X)}}}function K7(J,$){if($)return PJ(J,$);return{prepare(X){return new gJ(J,X)}}}function PJ(J,$){return{prepare(X){return new pJ(J,$,X)}}}function S7(J){return{async get($,X="text"){let Y=await u7(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 c7(J,$,X)},async delete($){await d7(J,$)},async list($){let X=$?.prefix??"",Y=await l7(J,X);return{keys:(typeof $?.limit==="number"?Y.slice(0,$.limit):Y).map((G)=>({name:G})),list_complete:!0}}}}function q7(J,$){return C6({query:async(Y,Z=[])=>{let G=$(J.connectionString);if(typeof G.connect==="function")await G.connect();try{return await G.query(Y,Z)}finally{if(typeof G.release==="function")G.release();else if(typeof G.end==="function")await G.end()}}})}function f7(J,$){return w6({execute:async(Y,Z=[])=>{let G=$(J.connectionString);try{if(typeof G.execute==="function")return await G.execute(Y,Z);if(typeof G.query==="function")return await G.query(Y,Z);throw new j("Hyperdrive MySQL client is missing execute/query methods","MYSQL_CLIENT_INVALID")}finally{if(typeof G.end==="function")await G.end();else if(typeof G.close==="function")await G.close();else if(typeof G.destroy==="function")G.destroy()}}})}function b7(J){if(!J||typeof J!=="object")return!1;return typeof J.prepare==="function"}function h7(J){if(!J||typeof J!=="object")return!1;let $=J;return typeof $.get==="function"&&typeof $.put==="function"&&typeof $.delete==="function"&&typeof $.list==="function"}class hJ{client;sql;bindings;constructor(J,$,X=[]){this.client=J,this.sql=$,this.bindings=X}bind(...J){return new hJ(this.client,this.sql,J)}async run(){let J=Date.now(),$=bJ(this.sql),X=await this.client.query($,this.bindings);return{success:!0,results:X.rows??[],meta:K(J,{changes:typeof X.rowCount==="number"?X.rowCount:void 0,command:X.command})}}async all(){let J=Date.now(),$=bJ(this.sql),X=await this.client.query($,this.bindings);return{success:!0,results:X.rows??[],meta:K(J,{changes:typeof X.rowCount==="number"?X.rowCount:void 0,command:X.command})}}async first(){let J=bJ(this.sql);return(await this.client.query(J,this.bindings)).rows?.[0]??null}}class yJ{client;sql;bindings;constructor(J,$,X=[]){this.client=J,this.sql=$,this.bindings=X}bind(...J){return new yJ(this.client,this.sql,J)}async run(){let J=Date.now(),$=await KJ(this.client,this.sql,this.bindings);if(Array.isArray($))return{success:!0,results:$,meta:K(J)};let X=$;return{success:!0,results:[],meta:K(J,{changes:X.affectedRows,last_row_id:X.insertId,warningStatus:X.warningStatus})}}async all(){let J=Date.now(),$=await KJ(this.client,this.sql,this.bindings);return{success:!0,results:Array.isArray($)?$:[],meta:K(J,{changes:!Array.isArray($)?$.affectedRows:void 0})}}async first(){let J=await KJ(this.client,this.sql,this.bindings);if(!Array.isArray(J)||J.length===0)return null;return J[0]}}class gJ{client;sql;bindings;constructor(J,$,X=[]){this.client=J,this.sql=$,this.bindings=X}bind(...J){return new gJ(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:fJ(Z),meta:K(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:K(J,{changes:EJ(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:fJ(Y),meta:K(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:K(J)}}async first(){if(typeof this.client.execute==="function"){let $=await this.client.execute(this.sql,this.bindings);return fJ($)[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 pJ{client;sqlTag;sqlText;bindings;constructor(J,$,X,Y=[]){this.client=J,this.sqlTag=$,this.sqlText=X,this.bindings=Y}bind(...J){return new pJ(this.client,this.sqlTag,this.sqlText,J)}async run(){let J=Date.now(),$=SJ(this.sqlTag,this.sqlText,this.bindings),X=await g7(this.client,$);return{success:!0,results:qJ(X),meta:K(J,R6(X))}}async all(){let J=Date.now(),$=SJ(this.sqlTag,this.sqlText,this.bindings),X=await v6(this.client,$);return{success:!0,results:qJ(X),meta:K(J,R6(X))}}async first(){let J=SJ(this.sqlTag,this.sqlText,this.bindings),$=await p7(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 y7(J,$,X,Y){try{let Z=await J.scan($,{MATCH:X,COUNT:Y});return B6(Z)}catch{let Z=await J.scan($,"MATCH",X,"COUNT",String(Y));return B6(Z)}}function B6(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 KJ(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 g7(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 v6(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 p7(J,$){if(typeof J.get==="function")return await J.get($);return await v6(J,$)}function SJ(J,$,X){let Y=m7($),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 G=typeof J.empty==="function"?J.empty():J.raw("");for(let H=0;H<Y.length;H++){let U=Y[H];if(U)G.append(J.raw(U));if(H<Z)G.append(J`${X[H]}`)}return G}function m7(J){let $=[],X=0,Y=!1,Z=!1,G=!1,H=!1;for(let U=0;U<J.length;U++){let _=J[U],F=U+1<J.length?J[U+1]:"";if(G){if(_===`
|
|
17
|
-
`)G=!1;continue}if(H){if(
|
|
18
|
-
`)H=!1;continue}if(U){if(X+=F,F==="*"&&W==="/")X+="/",_++,U=!1;continue}if(!Z&&!G){if(F==="-"&&W==="-"){X+="--",_++,H=!0;continue}if(F==="/"&&W==="*"){X+="/*",_++,U=!0;continue}}if(F==="'"&&!G){Z=!Z,X+=F;continue}if(F==='"'&&!Z){G=!G,X+=F;continue}if(F==="?"&&!Z&&!G){Y++,X+=`$${Y}`;continue}X+=F}if(ZJ.set(J,X),ZJ.size>5000){let _=ZJ.keys().next().value;if(_)ZJ.delete(_)}return X}b();var o7={casing:{getColumnCasing(J){return J?.name??""}},escapeName(J){return J},escapeParam(){return"?"},escapeString(J){return J.replace(/'/g,"''")}},f6=["<=",">=","!=","<>","=","<",">"],n7=new Set(["COUNT","MAX","MIN","SUM","AVG"]),s7=new Set(["COALESCE","IFNULL","LOWER","UPPER","LENGTH","ABS"]);function N(J){return J.trim().replace(/^[`"\[]+|[`"\]]+$/g,"").split(".").pop()?.trim()??J.trim()}function i7(J){return J.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function a(J){if(typeof J==="number"&&Number.isFinite(J))return J;if(typeof J==="bigint")return Number(J);if(typeof J==="string"){let $=J.trim();if($==="")return;let X=Number($);return Number.isFinite(X)?X:void 0}return}function r(J,$=","){let X=[],Y=0,Z="",G=!1,H=!1;for(let _=0;_<J.length;_++){let F=J[_];if(F==="'"&&!H){G=!G,Z+=F;continue}if(F==='"'&&!G){H=!H,Z+=F;continue}if(!G&&!H){if(F==="(")Y++;else if(F===")")Y=Math.max(0,Y-1);else if(Y===0&&F===$){X.push(Z.trim()),Z="";continue}}Z+=F}let U=Z.trim();if(U.length>0)X.push(U);return X}function MJ(J,$){let X=0,Y=!1,Z=!1;for(let G=$;G<J.length;G++){let H=J[G];if(H==="'"&&!Z){Y=!Y;continue}if(H==='"'&&!Y){Z=!Z;continue}if(Y||Z)continue;if(H==="(")X++;else if(H===")"){if(X--,X===0)return G}}return-1}function UJ(J){let $=J.trim();if($.length===0)return{value:null,consumed:!1};if($==="?")return{value:null,consumed:!1};if(/^null$/i.test($))return{value:null,consumed:!0};if(/^true$/i.test($))return{value:1,consumed:!0};if(/^false$/i.test($))return{value:0,consumed:!0};if($.startsWith("'")&&$.endsWith("'")||$.startsWith('"')&&$.endsWith('"'))return{value:$.slice(1,-1).replace(/''/g,"'").replace(/""/g,'"'),consumed:!0};let X=Number($);if(Number.isFinite(X)&&/^-?\d+(\.\d+)?$/.test($))return{value:X,consumed:!0};return{value:void 0,consumed:!1}}function TJ(J){let $=J.toUpperCase(),X=x($,J,"WHERE");if(X===-1){let H=x($,J,"FROM");return{whereClause:null,afterWhere:H===-1?"":J.slice(H+4)}}let Y=X+5,Z=["ORDER BY","GROUP BY","HAVING","LIMIT","OFFSET","RETURNING",";"],G=J.length;for(let H of Z){let U=x($,J,H,Y);if(U!==-1&&U<G)G=U}return{whereClause:J.slice(Y,G).trim(),afterWhere:J.slice(G)}}function x(J,$,X,Y=0){let Z=Y,G=!1,H=!1;while(Z<=J.length-X.length){let U=$[Z];if(U==="'"&&!H){G=!G,Z++;continue}if(U==='"'&&!G){H=!H,Z++;continue}if(!G&&!H){if(J.startsWith(X,Z)){let _=Z===0?" ":J[Z-1],F=J[Z+X.length]??" ",W=/[A-Z0-9_]/.test(_)===!1,O=/[A-Z0-9_]/.test(F)===!1;if(W&&O)return Z}}Z++}return-1}function k6(J){let $=J.toUpperCase(),X={},Y=x($,J,"LIMIT");if(Y!==-1){let H=J.slice(Y+5).trim().match(/^(\d+)(?:\s*,\s*(\d+))?/);if(H){let U=Number(H[1]),_=H[2]!==void 0?Number(H[2]):void 0;if(_!==void 0)X.offset=U,X.limit=_;else X.limit=U}}let Z=x($,J,"OFFSET");if(Z!==-1){let H=J.slice(Z+6).trim().match(/^(\d+)/);if(H)X.offset=Number(H[1])}return X}function t7(J){let $=[];for(let X of r(J,",")){let Y=X.indexOf("=");if(Y===-1)continue;let Z=N(X.slice(0,Y)),G=X.slice(Y+1).trim();if(Z.length===0)continue;$.push({column:Z,expression:G})}return $}function DJ(J){let $=[],X=0;while(X<J.length){let Y=J[X];if(/\s/.test(Y)){X++;continue}if(Y==="("||Y===")"){$.push(Y),X++;continue}if(Y==="?"){$.push("?"),X++;continue}if(Y==="'"||Y==='"'){let H=Y,U=X+1;while(U<J.length){if(J[U]===H){if(J[U+1]===H){U+=2;continue}U++;break}U++}$.push(J.slice(X,U)),X=U;continue}let Z=null;for(let H of f6)if(J.startsWith(H,X)){Z=H;break}if(Z){$.push(Z),X+=Z.length;continue}let G=X;while(G<J.length&&/[A-Za-z0-9_.$]/.test(J[G]))G++;if(G===X)$.push(Y),X++;else $.push(J.slice(X,G)),X=G}return $}class GJ{tokens;position=0;constructor(J){this.tokens=J}parse(){if(this.tokens.length===0)return{type:"always-true"};return this.parseOr()}peek(){return this.tokens[this.position]}take(){return this.tokens[this.position++]}isKeyword(J,$){return typeof J==="string"&&J.toUpperCase()===$}parseOr(){let J=this.parseAnd();while(this.isKeyword(this.peek(),"OR")){this.take();let $=this.parseAnd();J=J.type==="or"?{type:"or",children:[...J.children,$]}:{type:"or",children:[J,$]}}return J}parseAnd(){let J=this.parseTerm();while(this.isKeyword(this.peek(),"AND")){this.take();let $=this.parseTerm();J=J.type==="and"?{type:"and",children:[...J.children,$]}:{type:"and",children:[J,$]}}return J}parseTerm(){if(this.peek()==="("){this.take();let $=this.parseOr();if(this.peek()===")")this.take();return $}return this.parseComparison()}parseComparison(){let J=this.take();if(J===void 0)return{type:"always-true"};let $=N(J),X=this.take();if(X===void 0)return{type:"always-true"};let Y=X.toUpperCase();if(Y==="IS"){let U=this.peek();if(this.isKeyword(U,"NOT")){this.take();let F=this.take();if(this.isKeyword(F,"NULL"))return{type:"null-check",column:$,operator:"IS NOT NULL"}}let _=this.take();if(this.isKeyword(_,"NULL"))return{type:"null-check",column:$,operator:"IS NULL"};return{type:"always-true"}}let Z=null;if(Y==="LIKE")Z="LIKE";else if(Y==="NOT"){let U=this.take();if(this.isKeyword(U,"LIKE"))Z="NOT LIKE";else return{type:"always-true"}}else if(f6.includes(Y))Z=Y;if(!Z)return{type:"always-true"};let G=this.take();if(G==="?")return{type:"compare",column:$,operator:Z,value:{kind:"param"}};let H=UJ(G??"");return{type:"compare",column:$,operator:Z,value:{kind:"literal",value:H.consumed?H.value:G??null}}}}function t(J,$,X,Y){switch(J.type){case"always-true":return!0;case"and":return J.children.every((Z)=>t(Z,$,X,Y));case"or":{let Z=!1;for(let G of J.children)if(t(G,$,X,Y))Z=!0;return Z}case"null-check":{let Z=$[J.column],G=Z===null||Z===void 0;return J.operator==="IS NULL"?G:!G}case"compare":{let Z;if(J.value.kind==="param")Z=X[Y.value++];else Z=J.value.value;let G=$[J.column];if(J.operator==="LIKE"||J.operator==="NOT LIKE"){let F=String(Z??""),O=new RegExp(`^${i7(F).replace(/%/g,".*").replace(/_/g,".")}$`,"i").test(String(G??""));return J.operator==="LIKE"?O:!O}let H=a(G),U=a(Z),_;if(H!==void 0&&U!==void 0)_=H===U?0:H<U?-1:1;else if(G===null||G===void 0)if(Z===null||Z===void 0)_=0;else _=-1;else if(Z===null||Z===void 0)_=1;else{let F=String(G),W=String(Z);_=F===W?0:F<W?-1:1}switch(J.operator){case"=":return _===0;case"!=":case"<>":return _!==0;case"<":return _<0;case"<=":return _<=0;case">":return _>0;case">=":return _>=0;default:return!1}}}}function x6(J){let $=0,X=!1,Y=!1;for(let Z=0;Z<J.length;Z++){let G=J[Z];if(G==="'"&&!Y){X=!X;continue}if(G==='"'&&!X){Y=!Y;continue}if(!X&&!Y&&G==="?")$++}return $}function K6(J){let $=J.trim().toUpperCase();if($.startsWith("SELECT")||$.startsWith("WITH")){if($.includes("SQLITE_MASTER"))return"sqlite-master-select";return"select"}if($.startsWith("INSERT"))return"insert";if($.startsWith("UPDATE"))return"update";if($.startsWith("DELETE"))return"delete";if($.startsWith("CREATE TABLE"))return"create-table";if($.startsWith("DROP TABLE"))return"drop-table";if($.startsWith("PRAGMA"))return"pragma";return"other"}function i(J){let $=J.toUpperCase(),X=J.match(/create\s+table\s+(?:if\s+not\s+exists\s+)?([`"\[]?[\w.]+[`"\]]?)/i);if(X)return N(X[1]??"");let Y=J.match(/drop\s+table\s+(?:if\s+exists\s+)?([`"\[]?[\w.]+[`"\]]?)/i);if(Y)return N(Y[1]??"");let Z=J.match(/insert\s+(?:or\s+\w+\s+)?into\s+([`"\[]?[\w.]+[`"\]]?)/i);if(Z)return N(Z[1]??"");let G=J.match(/update\s+(?:or\s+\w+\s+)?([`"\[]?[\w.]+[`"\]]?)\s+set/i);if(G)return N(G[1]??"");let H=J.match(/delete\s+from\s+([`"\[]?[\w.]+[`"\]]?)/i);if(H)return N(H[1]??"");let U=x($,J,"FROM");if(U!==-1){let F=J.slice(U+4).trim().match(/^([`"\[]?[\w.]+[`"\]]?)/);if(F)return N(F[1]??"")}return null}function a7(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(o7);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")}function cJ(J){return r(J,",").map((X)=>{let Y=X.match(/\s+as\s+([`"\[]?[\w.]+[`"\]]?)\s*$/i),Z=Y?X.slice(0,Y.index).trim():X.trim(),G=Y?N(Y[1]??""):r7(Z);if(Z==="*")return{expression:Z,alias:"*",kind:"star"};let H=Z.toUpperCase(),U=Z.match(/^([A-Za-z_][A-Za-z0-9_]*)\s*\(/);if(U){let _=(U[1]??"").toUpperCase();if(n7.has(_)||/\b(?:COUNT|MAX|MIN|SUM|AVG)\s*\(/i.test(H))return{expression:Z,alias:G,kind:"aggregate"};if(s7.has(_))return{expression:Z,alias:G,kind:"scalar"}}if(/[+\-*/()]/.test(Z)||/\bCOUNT\s*\(/i.test(Z)||/\bMAX\s*\(/i.test(Z))return{expression:Z,alias:G,kind:"expression"};return{expression:Z,alias:G,kind:"column"}})}function r7(J){let $=J.trim();if($==="*")return"*";if($.match(/^([`"\[]?[\w.]+[`"\]]?)$/))return N($);return $}function b6(J,$,X){let Y="",Z=!1,G=!1,H=0,U=X;while(H<J.length){let _=J[H];if(_==="'"&&!G){Z=!Z,Y+=_,H++;continue}if(_==='"'&&!Z){G=!G,Y+=_,H++;continue}if(!Z&&!G&&_==="?"){let F=$[U++];Y+=dJ(F),H++;continue}Y+=_,H++}return{expression:Y,cursor:U}}function dJ(J){if(J===null||J===void 0)return"NULL";if(typeof J==="number"||typeof J==="bigint")return String(J);if(typeof J==="boolean")return J?"1":"0";return`'${String(J).replace(/'/g,"''")}'`}function zJ(J,$,X,Y){if(J.kind==="star")return;if(J.kind==="column"){let H=$[0];return H?H[J.expression]:null}let Z=b6(J.expression,X,Y).expression;if(J.kind==="aggregate"||/\b(?:COUNT|MAX|MIN|SUM|AVG)\s*\(/i.test(Z))return e7(Z,$);if(J.kind==="scalar"){let H=$[0]??{};return HJ(Z,H)}let G=$[0]??{};return HJ(Z,G)}function e7(J,$){let X=J,Y=/(COUNT|MAX|MIN|SUM|AVG)\s*\(/i,Z=0;while(Y.test(X)&&Z<25){Z++;let G=X.match(Y);if(!G||G.index===void 0)break;let H=X.indexOf("(",G.index);if(H===-1)break;let U=MJ(X,H);if(U===-1)break;let _=(G[1]??"").toUpperCase(),F=X.slice(H+1,U).trim(),W=J9(_,F,$),O=dJ(W);X=X.slice(0,G.index)+O+X.slice(U+1)}return HJ(X,$[0]??{})}function J9(J,$,X){if(J==="COUNT"){if($==="*")return X.length;let G=/^distinct\s+/i.test($),H=N($.replace(/^distinct\s+/i,"")),U=X.map((_)=>_[H]).filter((_)=>_!==null&&_!==void 0);if(G)return new Set(U.map((_)=>String(_))).size;return U.length}let Y=N($),Z=X.map((G)=>a(G[Y])).filter((G)=>G!==void 0);if(Z.length===0)return null;switch(J){case"MAX":return Math.max(...Z);case"MIN":return Math.min(...Z);case"SUM":return Z.reduce((G,H)=>G+H,0);case"AVG":return Z.reduce((G,H)=>G+H,0)/Z.length;default:return null}}function HJ(J,$){let X=J.trim();if(X.length===0)return null;let Y=UJ(X);if(Y.consumed)return Y.value;let Z=X.match(/^([A-Za-z_][A-Za-z0-9_]*)\s*\(/);if(Z){let H=(Z[1]??"").toUpperCase(),U=X.indexOf("(",Z.index),_=MJ(X,U);if(_!==-1){let F=X.slice(U+1,_),W=r(F,",").map((Q)=>HJ(Q,$)),O=X.slice(_+1).trim(),A=$9(H,W);if(O.length===0)return A;return S6(`${dJ(A)} ${O}`,$)}}if(X.match(/^([`"\[]?[\w.]+[`"\]]?)$/))return $[N(X)]??null;return S6(X,$)}function $9(J,$){switch(J){case"COALESCE":case"IFNULL":{for(let X of $)if(X!==null&&X!==void 0)return X;return null}case"LOWER":return $[0]===null||$[0]===void 0?null:String($[0]).toLowerCase();case"UPPER":return $[0]===null||$[0]===void 0?null:String($[0]).toUpperCase();case"LENGTH":return $[0]===null||$[0]===void 0?null:String($[0]).length;case"ABS":{let X=a($[0]);return X===void 0?null:Math.abs(X)}default:return null}}function S6(J,$){let X=J.trim();if(X.length===0)return null;let Y=UJ(X);if(Y.consumed)return Y.value;if(!/^[\d+\-*/().\s]+$/.test(X)){let G=X.split(/(\s|[+\-*/()])/).filter((H)=>H.trim().length>0).map((H)=>{if(/^[+\-*/()]$/.test(H))return H;let U=Number(H);if(Number.isFinite(U))return H;if(H.toLowerCase()==="null")return"null";let _=$[N(H)];if(_===null||_===void 0)return"null";if(typeof _==="number")return String(_);return JSON.stringify(_)}).join(" ");if(!/^[\d+\-*/().\s]+$/.test(G.replace(/null/g,"0")))return X;try{return Function(`return (${G.replace(/null/g,"0")});`)()}catch{return X}}try{return Function(`return (${X});`)()}catch{return X}}class lJ{tables=new Map;schemas=new Map;autoIncrementCounters=new Map;lastInsertRowId=null;prepare(J){return new h6(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=a7(J,$);return await this.executeStatement(X.sql,X.bindings)}async executeStatement(J,$){let X=Date.now();try{switch(K6(J)){case"create-table":return await this.handleCreateTable(J);case"drop-table":return await this.handleDropTable(J);case"insert":return await this.handleInsert(J,$);case"update":return await this.handleUpdate(J,$);case"delete":return await this.handleDelete(J,$);case"select":return await this.handleSelect(J,$);case"sqlite-master-select":return await this.handleSqliteMasterSelect(J,$);case"pragma":return await this.handlePragma(J);case"other":default: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(),Y=K6(J);if(Y==="select"||Y==="sqlite-master-select"||Y==="pragma")return await this.executeStatement(J,$);return{success:!1,results:[],meta:{duration:Date.now()-X},error:"Use executeStatement for non-SELECT queries"}}async handleCreateTable(J){let $=Date.now(),X=i(J);if(!X)return{success:!1,results:[],meta:{duration:Date.now()-$},error:"Could not extract table name"};let Y=new Map,Z=J.indexOf("("),G=Z===-1?-1:MJ(J,Z);if(Z!==-1&&G!==-1){let H=J.slice(Z+1,G);for(let U of r(H,",")){let _=U.trim().split(/\s+/);if(_.length===0)continue;let F=_[0]?.toUpperCase()??"";if(["PRIMARY","FOREIGN","UNIQUE","CHECK","CONSTRAINT"].includes(F))continue;let W=N(_[0]??"");if(W.length===0)continue;let O=(_[1]??"").toUpperCase(),A=_.slice(2).join(" ").toUpperCase();Y.set(W,{name:W,type:O,isPrimaryKey:A.includes("PRIMARY KEY"),isAutoIncrement:A.includes("AUTOINCREMENT")||A.includes("AUTO_INCREMENT")||A.includes("GENERATED BY DEFAULT AS IDENTITY"),defaultValue:_9(_.slice(2).join(" ")),notNull:A.includes("NOT NULL")})}}this.tables.set(X,new Map),this.schemas.set(X,Y);for(let H of Y.values())if(H.isAutoIncrement){this.autoIncrementCounters.set(X,this.autoIncrementCounters.get(X)??0);break}return{success:!0,results:[],meta:{duration:Date.now()-$}}}async handleDropTable(J){let $=Date.now(),X=i(J);if(!X)return{success:!1,results:[],meta:{duration:Date.now()-$},error:"Could not extract table name"};return this.tables.delete(X),this.schemas.delete(X),this.autoIncrementCounters.delete(X),{success:!0,results:[],meta:{duration:Date.now()-$}}}async handleInsert(J,$){let X=Date.now(),Y=i(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),G=this.schemas.get(Y),H=G?Array.from(G.values()):[],U=H.find((M)=>M.isPrimaryKey),_=H.find((M)=>M.isAutoIncrement),F=U9(J),W=/\binsert\s+or\s+replace\b/i.test(J),O=/\binsert\s+or\s+(?:ignore|abort|fail|rollback)\b/i.test(J),A=H9(J),Q=[],z=A.length>0?A:[null],T=0;for(let M of z){let D={};if(F&&F.length>0){let I=M?r(M,",").map((e)=>e.trim()):F.map(()=>"?");F.forEach((e,IJ)=>{let m=I[IJ];if(m===void 0)return;if(m==="?")D[e]=$[T++];else{let S=UJ(m);D[e]=S.consumed?S.value:m}})}else if(G){for(let I of G.keys())if(T<$.length)D[I]=$[T++]}else for(let I of $.slice(T))D[Object.keys(D).length===0?"id":`column_${Object.keys(D).length}`]=I,T++;if(G){for(let I of G.values())if(D[I.name]===void 0&&I.defaultValue!==void 0)D[I.name]=I.defaultValue}let V=U?.name??"id",L=D[V];if((L===void 0||L===null||L==="")&&_){let I=(this.autoIncrementCounters.get(Y)??0)+1;if(this.autoIncrementCounters.set(Y,I),D[_.name]=I,V!==_.name)D[V]=I;L=I}if(L===void 0||L===null||L===""){let I=(this.autoIncrementCounters.get(Y)??0)+1;this.autoIncrementCounters.set(Y,I),L=I,D[V]=I}if(_){let I=typeof L==="number"?L:Number(L);if(Number.isFinite(I))this.autoIncrementCounters.set(Y,Math.max(this.autoIncrementCounters.get(Y)??0,I))}let C=String(L);if(Z.has(C)&&!W){if(O)continue;return{success:!1,results:[],meta:{duration:Date.now()-X},error:`UNIQUE constraint failed: ${Y}.${V}`}}Z.set(C,D),this.lastInsertRowId=typeof L==="number"||typeof L==="string"?L:String(L),Q.push(D)}let B=/\breturning\b/i.test(J),E=B?mJ(J):null;return{success:!0,results:B?Q.map((M)=>uJ(M,E??["*"])):[],meta:{duration:Date.now()-X,last_row_id:this.lastInsertRowId??void 0,changes:Q.length}}}async handleUpdate(J,$){let X=Date.now(),Y=i(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=Y9(J);if(!Z)return{success:!1,results:[],meta:{duration:Date.now()-X},error:"UPDATE missing SET clause"};let G=t7(Z),H=this.tables.get(Y),U=Array.from(H.values()),_=x6(Z),F=$.slice(_),W=$.slice(0,_),{whereClause:O}=TJ(J),A=O?new GJ(DJ(O)).parse():{type:"always-true"},Q=[];for(let P of U)if(t(A,P,F,{value:0}))Q.push(P);let z=0;for(let P of Q){let M={value:0};for(let{column:D,expression:V}of G){let L=x6(V),C=W.slice(M.value,M.value+L);M.value+=L,P[D]=X9(V,C,P)}z++}let T=/\breturning\b/i.test(J),B=T?mJ(J):null;return{success:!0,results:T?Q.map((P)=>uJ(P,B??["*"])):[],meta:{duration:Date.now()-X,changes:z}}}async handleDelete(J,$){let X=Date.now(),Y=i(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),{whereClause:G}=TJ(J);if(!G){let O=Z.size;return Z.clear(),{success:!0,results:[],meta:{duration:Date.now()-X,changes:O}}}let H=new GJ(DJ(G)).parse(),U=[];for(let[O,A]of Array.from(Z.entries()))if(t(H,A,$,{value:0}))Z.delete(O),U.push(A);let _=/\breturning\b/i.test(J),F=_?mJ(J):null;return{success:!0,results:_?U.map((O)=>uJ(O,F??["*"])):[],meta:{duration:Date.now()-X,changes:U.length}}}async handleSelect(J,$){let X=Date.now(),Y=i(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),G=Array.from(Z.values()),{whereClause:H,afterWhere:U}=TJ(J),_=H?new GJ(DJ(H)).parse():{type:"always-true"},F=q6(J),W=cJ(F),O=[];for(let V of G)if(t(_,V,$,{value:0}))O.push(V);let A=Z9(U||J),Q=O;if(A)Q=[...O].sort((V,L)=>G9(V,L,A));let z=W.some((V)=>V.kind==="aggregate"),T;if(z){let V={};for(let L of W)V[L.alias]=zJ(L,Q,$,0);T=[V]}else if(W.length===1&&W[0]?.kind==="star")T=Q.map((V)=>({...V}));else T=Q.map((V)=>{let L={};for(let C of W)if(C.kind==="star")Object.assign(L,V);else if(C.kind==="column")L[C.alias]=V[C.expression]??null;else L[C.alias]=zJ(C,[V],$,0);return L});let{limit:B,offset:E}=k6(U),P=E??0,M=B===void 0?T.length:P+B;return{success:!0,results:T.slice(P,M),meta:{duration:Date.now()-X}}}async handleSqliteMasterSelect(J,$){let X=Date.now(),Y=[];for(let T of this.tables.keys())Y.push({name:T,type:"table",tbl_name:T,sql:`CREATE TABLE ${T} (...)`});let{whereClause:Z,afterWhere:G}=TJ(J),H=Z?new GJ(DJ(Z)).parse():{type:"always-true"},U=Y.filter((T)=>{return t(H,T,$,{value:0})}),_=q6(J),F=cJ(_),W=U.map((T)=>{if(F.length===1&&F[0]?.kind==="star")return{...T};let B={};for(let E of F)if(E.kind==="star")Object.assign(B,T);else if(E.kind==="column")B[E.alias]=T[E.expression]??null;else B[E.alias]=zJ(E,[T],$,0);return B}),{limit:O,offset:A}=k6(G),Q=A??0,z=O===void 0?W.length:Q+O;return{success:!0,results:W.slice(Q,z),meta:{duration:Date.now()-X}}}async handlePragma(J){let $=Date.now(),X=J.trim().toLowerCase();if(X.startsWith("pragma page_count")){let Y=0;for(let Z of this.tables.values())Y+=Z.size;return{success:!0,results:[{page_count:Math.max(1,Y)}],meta:{duration:Date.now()-$}}}if(X.startsWith("pragma page_size"))return{success:!0,results:[{page_size:4096}],meta:{duration:Date.now()-$}};if(X.startsWith("pragma table_info")){let Y=X.match(/pragma\s+table_info\s*\(\s*([`"\[]?[\w.]+[`"\]]?)\s*\)/);if(Y){let Z=N(Y[1]??""),G=this.schemas.get(Z);if(G)return{success:!0,results:Array.from(G.values()).map((U,_)=>({cid:_,name:U.name,type:U.type,notnull:U.notNull?1:0,dflt_value:U.defaultValue??null,pk:U.isPrimaryKey?1:0})),meta:{duration:Date.now()-$}}}}return{success:!0,results:[],meta:{duration:Date.now()-$}}}}function X9(J,$,X){if(J==="?")return $[0];let Y=b6(J,$,0).expression;return HJ(Y,X)}function q6(J){let $=J.toUpperCase(),X=x($,J,"SELECT");if(X===-1)return"*";let Y=x($,J,"FROM",X+6);if(Y===-1)return J.slice(X+6).trim();return J.slice(X+6,Y).trim().replace(/^distinct\s+/i,"")}function Y9(J){let $=J.toUpperCase(),X=x($,J,"SET");if(X===-1)return null;let Y=X+3,Z=["WHERE","RETURNING","ORDER BY","LIMIT"],G=J.length;for(let H of Z){let U=x($,J,H,Y);if(U!==-1&&U<G)G=U}return J.slice(Y,G).trim()}function Z9(J){let $=J.toUpperCase(),X=x($,J,"ORDER BY");if(X===-1)return null;let Z=J.slice(X+8).trim().match(/^([`"\[]?[\w.]+[`"\]]?)(?:\s+(asc|desc))?/i);if(!Z)return null;return{column:N(Z[1]??""),direction:(Z[2]??"asc").toLowerCase()==="desc"?"desc":"asc"}}function G9(J,$,X){let Y=J[X.column],Z=$[X.column];if(Y===Z)return 0;if(Y===void 0||Y===null)return X.direction==="desc"?1:-1;if(Z===void 0||Z===null)return X.direction==="desc"?-1:1;let G=a(Y),H=a(Z),U;if(G!==void 0&&H!==void 0)U=G===H?0:G<H?-1:1;else U=String(Y).localeCompare(String(Z));return X.direction==="desc"?-U:U}function H9(J){let $=J.toUpperCase(),X=x($,J,"VALUES");if(X===-1)return[];let Y=[],Z=X+6;while(Z<J.length){while(Z<J.length&&/[\s,]/.test(J[Z]))Z++;if(J[Z]!=="(")break;let G=MJ(J,Z);if(G===-1)break;Y.push(J.slice(Z+1,G).trim()),Z=G+1}return Y}function U9(J){let $=J.match(/insert\s+(?:or\s+\w+\s+)?into\s+[^()]+\(([^)]+)\)/i);if(!$||!$[1]||$.index===void 0)return null;let Y=J.slice(0,$.index+$[0].length).toUpperCase();if(Y.includes("VALUES")||Y.includes("SELECT"))return null;return $[1].split(",").map((Z)=>N(Z)).filter((Z)=>Z.length>0)}function mJ(J){let $=J.match(/\breturning\b\s+([^;]+)/i);if(!$||!$[1])return null;return r($[1],",").map((X)=>X.trim())}function uJ(J,$){if($.length===1&&$[0]==="*")return{...J};let X=cJ($.join(", ")),Y={};for(let Z of X)if(Z.kind==="star")Object.assign(Y,J);else if(Z.kind==="column")Y[Z.alias]=J[Z.expression]??null;else Y[Z.alias]=zJ(Z,[J],[],0);return Y}function _9(J){let $=J.match(/default\s+('([^']*)'|"([^"]*)"|[\w.-]+)/i);if(!$)return;let X=$[1]??"",Y=UJ(X);return Y.consumed?Y.value:X}class h6{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.executeStatement(this.sql,this.bindings)}async first(){return(await this.database.executeStatement(this.sql,this.bindings)).results[0]??null}}class oJ{store=new Map;expirations=new Map;pruneExpired(){if(this.expirations.size===0)return;let J=Date.now();for(let[$,X]of this.expirations)if(X<J)this.store.delete($),this.expirations.delete($)}normalizeValue(J){return typeof J==="string"?J:JSON.stringify(J)??String(J)}async get(J,$="text"){let X=this.expirations.get(J);if(X!==void 0&&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){this.pruneExpired();let $=J?.prefix??"",X=J?.limit??1000,Y=J?.cursor?Number.parseInt(J.cursor,10):0,Z=Number.isFinite(Y)&&Y>=0?Y:0,G=[];for(let F of this.store.keys())if(F.startsWith($))G.push(F);let H=G.slice(Z,Z+X).map((F)=>({name:F})),U=Z+X,_=U>=G.length;return{keys:H,cursor:_?void 0:String(U),list_complete:_}}clear(){this.store.clear(),this.expirations.clear()}size(){return this.pruneExpired(),this.store.size}}function F9(){return new lJ}function W9(){return new oJ}$J();export{OJ as validateTableForSharding,rJ as schemaExists,wJ as runShard,P6 as runAllShards,L6 as run,o6 as resetConfig,_7 as reassignShard,LJ as prepare,J6 as migrateRecord,d as listTables,F7 as listKnownShards,b7 as isSQLDatabase,h7 as isKVStorage,X6 as integrateExistingDatabase,G7 as insertShard,Z7 as insert,F6 as initializeAsync,d6 as initialize,D7 as indexShard,z7 as indexAllShards,T7 as index,v7 as getTotalDatabaseSize,W7 as getShardStats,M6 as getDatabaseSizesAllShards,V7 as getDatabaseSizeForShard,w7 as getDatabaseSizeForKey,i6 as getClosestRegionFromIP,Q7 as flush,vJ as firstShard,U7 as firstByLookupKey,L7 as firstAllShardsGlobal,z6 as firstAllShards,E6 as first,I7 as explainShard,B7 as explainAllShards,M7 as explain,eJ as dropSchema,WJ as discoverExistingRecordsWithColumns,FJ as discoverExistingPrimaryKeys,x7 as createValkeyKVProvider,aJ as createSchemaAcrossShards,J7 as createSchema,K7 as createSQLiteProvider,N6 as createRedisKVProvider,C6 as createPostgreSQLProvider,S7 as createNuxtHubKVProvider,w6 as createMySQLProvider,$6 as createMappingsForExistingKeys,F9 as createInMemorySQLProvider,W9 as createInMemoryKVProvider,q7 as createHyperdrivePostgresProvider,f7 as createHyperdriveMySQLProvider,PJ as createDrizzleSQLProvider,N7 as countShard,C7 as countAllShards,R7 as count,l6 as collegedb,H6 as clearShardMigrationCache,G6 as clearMigrationCache,Z6 as checkMigrationNeeded,Y6 as autoDetectAndMigrate,QJ as allShard,H7 as allByLookupKey,D6 as allAllShardsGlobal,VJ as allAllShards,V6 as all,I6 as ShardCoordinator,y as KVShardMapper,lJ as InMemorySQLDatabase,oJ as InMemoryKVStorage,j as CollegeDBError};
|
|
16
|
+
`).run()}if(g.set(O,!0),B&&X.debug)console.log(`Auto-migration completed for shard ${$}: ${Q} records from ${z} tables`)}catch(E){A.push(`Auto-migration error: ${E}`)}return{migrationNeeded:T,migrationPerformed:B,recordsMigrated:Q,tablesProcessed:z,issues:A}}async function G6(J,$,X){let Y=`${$}_migration_check`;if(g.has(Y))return!1;try{let Z=await l(J);if(Z.includes("shard_mappings"))return g.set(Y,!0),!1;let{KVShardMapper:H}=await Promise.resolve().then(() => (JJ(),CJ)),_=new H(X.kv,{hashShardMappings:X.hashShardMappings,mappingCacheTtlMs:X.mappingCacheTtlMs,knownShardsCacheTtlMs:X.knownShardsCacheTtlMs}),U=Z.filter((F)=>F!=="shard_mappings"&&!F.startsWith("sqlite_")&&F!=="sqlite_sequence");for(let F of U.slice(0,3))try{if(((await J.prepare(`SELECT COUNT(*) as count FROM ${F} LIMIT 1`).first())?.count||0)>0){let A=await J.prepare(`SELECT id FROM ${F} LIMIT 1`).first();if(A){let Q=String(A.id);if(!await _.getShardMapping(Q))return!0}}}catch{continue}return!1}catch{return!1}}function H6(){g.clear()}function _6(J){let $=`${J}_migration_check`;g.delete($)}var g,wJ;var $J=NJ(()=>{b();g=new Map,wJ=new Map});b();JJ();var XJ=null,o=null,s=new Map,n=0;function q(J){if(!o)o=new y(J.kv,{hashShardMappings:J.hashShardMappings,mappingCacheTtlMs:J.mappingCacheTtlMs,knownShardsCacheTtlMs:J.knownShardsCacheTtlMs});return o}function n6(J){XJ=J,o=new y(J.kv,{hashShardMappings:J.hashShardMappings,mappingCacheTtlMs:J.mappingCacheTtlMs,knownShardsCacheTtlMs:J.knownShardsCacheTtlMs}),s.clear(),n=0;try{let $=q(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)O6(J).catch(($)=>{console.warn("Background auto-migration failed:",$)})}async function W6(J){XJ=J,o=new y(J.kv,{hashShardMappings:J.hashShardMappings,mappingCacheTtlMs:J.mappingCacheTtlMs,knownShardsCacheTtlMs:J.knownShardsCacheTtlMs}),s.clear(),n=0;try{let $=q(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 O6(J)}catch($){console.warn("Auto migration failed:",$)}}async function i6(J,$){return await W6(J),await $()}async function O6(J){try{let{autoDetectAndMigrate:$}=await Promise.resolve().then(() => ($J(),AJ)),X=Object.keys(J.shards);if(J.debug)console.log(`\uD83D\uDD0D Checking ${X.length} shards for existing data...`);let Y=X.map(async(H)=>{let _=J.shards[H];if(!_)return null;try{let U=await $(_,H,J,{maxRecordsToCheck:1000});return{shardName:H,...U}}catch(U){return console.warn(`Auto-migration failed for shard ${H}:`,U),null}}),G=(await Promise.all(Y)).filter((H)=>H?.migrationPerformed);if(J.debug)if(G.length>0){let H=G.reduce((_,U)=>_+(U?.recordsMigrated||0),0);console.log(`\uD83C\uDF89 Auto-migration completed! Migrated ${H} records across ${G.length} shards`),G.forEach((_)=>{if(_)console.log(` ✅ ${_.shardName}: ${_.recordsMigrated} records from ${_.tablesProcessed} tables`)})}else console.log("✅ All shards ready - no migration needed")}catch($){console.warn("Background auto-migration setup failed:",$)}}function s6(){XJ=null,o=null,s.clear(),n=0}function R(){if(!XJ)throw new j("CollegeDB not initialized. Call initialize() first.","NOT_INITIALIZED");return XJ}function t6(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 A6(J,$){let X=J.strategy||"hash";if(typeof X==="string")return X;let Y=X;return Y[$]||Y.write||Y.read||"hash"}function a6(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[$],G=Y.lat-Z.lat,H=Y.lon-Z.lon;return Math.sqrt(G*G+H*H)}function r6(J){let $=J.cf;if(!$||!$.country)return"wnam";let{country:X,continent:Y}=$;if(["US","CA","MX"].includes(X)){let Z=$.region||$.regionCode||"",G=$.timezone||"";if(Z.includes("CA")||Z.includes("WA")||Z.includes("OR")||Z.includes("NV")||Z.includes("AZ")||Z.includes("UT")||G.includes("Pacific")||G.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 e6(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 J7(J,$){let X=Math.max(0,$.sizeCacheTtlMs??30000),Y=s.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 G=await jJ(Z);if(X>0)s.set(J,{size:G,expiresAt:Date.now()+X});return G}async function j6(J,$){if(typeof $.maxDatabaseSize!=="number"||!Number.isFinite($.maxDatabaseSize)||$.maxDatabaseSize<=0)return J;let X=$.maxDatabaseSize,Z=(await Promise.allSettled(J.map(async(G)=>{let H=await J7(G,$);return{shard:G,size:H,withinLimit:H<X}}))).filter((G)=>G.status==="fulfilled"&&G.value.withinLimit).map((G)=>G.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 G=J.filter((H)=>!Z.includes(H));console.log(`Excluded ${G.length} shards due to size limits: ${G.join(", ")}`)}return Z}function $7(J,$,X,Y){let Z=$.filter((W)=>X[W]);if(Z.length===0){let W=0;for(let A=0;A<Y.length;A++){let Q=Y.charCodeAt(A);W=(W<<5)-W+Q,W=W&W}let O=Math.abs(W)%$.length;return $[O]}let G=Z.map((W)=>{let O=X[W],A=a6(J,e6(O)),Q=typeof O==="object"?O.priority||1:1,z=A-Q*0.1;return{shard:W,score:z,distance:A,priority:Q}});G.sort((W,O)=>W.score-O.score);let H=G[0].score,_=G.filter((W)=>Math.abs(W.score-H)<0.01);if(_.length===1)return _[0].shard;let U=0;for(let W=0;W<Y.length;W++){let O=Y.charCodeAt(W);U=(U<<5)-U+O,U=U&U}let F=Math.abs(U)%_.length;return _[F].shard}function i(J,$,X,Y){switch(J){case"hash":{let Z=0;for(let H=0;H<$.length;H++){let _=$.charCodeAt(H);Z=(Z<<5)-Z+_,Z=Z&Z}let G=Math.abs(Z)%X.length;return X[G]||X[0]}case"location":{if(!Y.targetRegion)return i("hash",$,X,Y);return $7(Y.targetRegion,X,Y.shardLocations||{},$)}case"random":return X[Math.floor(Math.random()*X.length)]||X[0];default:return i("hash",$,X,Y)}}async function L6(J,$="write"){let X=R(),Y=q(X),Z=await Y.getShardMapping(J);if(Z)return Z.shard;let G=Object.keys(X.shards);if(G.length===0)throw new j("No shards configured","NO_SHARDS");let H=await j6(G,X),_,U=A6(X,$);if(X.coordinator)try{let F=X.coordinator.idFromName("default"),O=await X.coordinator.get(F).fetch("http://coordinator/allocate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({primaryKey:J,strategy:U,operationType:$,targetRegion:X.targetRegion,shardLocations:X.shardLocations,availableShards:H})});if(O.ok)_=(await O.json()).shard;else _=i(U,J,H,X)}catch(F){console.warn("Coordinator allocation failed, falling back to local strategy:",F),_=i(U,J,H,X)}else _=i(U,J,H,X);return await Y.setShardMapping(J,_),_}async function X7(J,$="write"){let X=R(),Y=await L6(J,$),Z=X.shards[Y];if(!Z)throw new j(`Shard ${Y} not found in configuration`,"SHARD_NOT_FOUND");return Z}async function Y7(J,$){let{createSchema:X}=await Promise.resolve().then(() => ($J(),AJ));await X(J,$)}async function LJ(J,$){let X=t6($);return(await X7(J,X)).prepare($)}async function Q6(J,$,X=[]){let Z=await(await LJ(J,$)).bind(...X).run();if(!Z.success)throw new j(`Query failed: ${Z.error||"Unknown error"}`,"QUERY_FAILED");return Z}function Z7(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 G=Y.toLowerCase();if((G==="id"||G==="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 G7(){return`insert:${Date.now()}:${Math.random().toString(36).slice(2)}`}async function H7(){let J=R(),$=Object.keys(J.shards);if($.length===0)throw new j("No shards configured","NO_SHARDS");let X=await j6($,J);if(X.length===0)throw new j("No shards available for insert","NO_SHARDS");let Y=A6(J,"write"),Z=G7();if(J.coordinator)try{let G=J.coordinator.idFromName("default"),_=await J.coordinator.get(G).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(_.ok)return(await _.json()).shard}catch(G){console.warn("Coordinator allocation for insert failed, falling back to local strategy:",G)}if(Y==="round-robin"){let G=X[n%X.length];return n=(n+1)%X.length,G}return i(Y,Z,X,J)}async function V6(J,$,X=[]){let Y=R();if(!Y.shards[J])throw new j(`Shard ${J} not found`,"SHARD_NOT_FOUND");let G=/\breturning\b/i.test($)?await QJ(J,$,X):await vJ(J,$,X),H=Z7(G);if(H===void 0)throw new j("Insert did not return a generated primary key","GENERATED_KEY_UNAVAILABLE");return await q(Y).setShardMapping(String(H),J),{...G,generatedId:H}}async function _7(J,$=[]){let X=await H7();return await V6(X,J,$)}async function U7(J,$,X=[]){return await V6(J,$,X)}async function E6(J,$,X=[]){let Z=await(await LJ(J,$)).bind(...X).all();if(!Z.success)throw new j(`Query failed: ${Z.error||"Unknown error"}`,"QUERY_FAILED");return Z}async function P6(J,$,X=[]){return await(await LJ(J,$)).bind(...X).first()}async function F7(J,$,X=[],Y=50){let Z=R(),H=await q(Z).getShardMapping(J);if(H){if(Z.shards[H.shard]){let F=await QJ(H.shard,$,X);if(F.success&&F.results.length>0)return F}}let _=await VJ($,X,Y);return D6(_)}async function W7(J,$,X=[],Y=50){let Z=R(),H=await q(Z).getShardMapping(J);if(H){if(Z.shards[H.shard]){let F=await kJ(H.shard,$,X);if(F!==null)return F}}return(await M6($,X,Y)).find((U)=>U!==null)??null}async function O7(J,$,X){let Y=R();if(!Y.shards[$])throw new j(`Shard ${$} not found in configuration`,"SHARD_NOT_FOUND");let Z=q(Y),G=await Z.getShardMapping(J);if(!G)throw new j(`No existing mapping found for primary key: ${J}`,"MAPPING_NOT_FOUND");if(G.shard!==$){let{migrateRecord:H}=await Promise.resolve().then(() => ($J(),AJ)),_=Y.shards[G.shard],U=Y.shards[$];if(!_||!U)throw new j("Source or target shard not available","SHARD_UNAVAILABLE");await H(_,U,J,X)}await Z.updateShardMapping(J,$)}async function A7(){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 q(J).getKnownShards(),Y=new Set([...Object.keys(J.shards),...X]);return Array.from(Y)}catch{return Object.keys(J.shards)}}async function j7(){let J=R();if(J.coordinator)try{let Z=J.coordinator.idFromName("default"),H=await J.coordinator.get(Z).fetch("http://coordinator/stats");if(H.ok)return await H.json()}catch(Z){console.warn("Failed to get stats from coordinator:",Z)}let $=q(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 vJ(J,$,X=[]){let Z=R().shards[J];if(!Z)throw new j(`Shard ${J} not found`,"SHARD_NOT_FOUND");let G=await Z.prepare($).bind(...X).run();if(!G.success)throw new j(`Query failed: ${G.error||"Unknown error"}`,"QUERY_FAILED");return G}async function QJ(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 kJ(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 T6(J,$=[],X=50){let Y=R(),Z=[];for(let[H,_]of Object.entries(Y.shards)){if(!H||!_){console.error(`Shard ${H??"<null>"} not found, skipping`);continue}Z.push(()=>_.prepare(J).bind(...$).run().catch((U)=>{return console.error(`Error executing query on shard ${H}:`,U),{success:!1,results:[],error:U instanceof Error?U.message:String(U),meta:{duration:0}}}))}let G=[];for(let H=0;H<Z.length;H+=X){let _=Z.slice(H,H+X).map((U)=>U());G.push(...await Promise.all(_))}return G}async function VJ(J,$=[],X=50){let Y=R(),Z=[];for(let[H,_]of Object.entries(Y.shards)){if(!H||!_){console.error(`Shard ${H??"<null>"} not found, skipping`);continue}Z.push(()=>_.prepare(J).bind(...$).all().catch((U)=>{return console.error(`Error executing query on shard ${H}:`,U),{success:!1,results:[],error:U instanceof Error?U.message:String(U),meta:{duration:0}}}))}let G=[];for(let H=0;H<Z.length;H+=X){let _=Z.slice(H,H+X).map((U)=>U());G.push(...await Promise.all(_))}return G}function YJ(J,$=50){if(!Number.isFinite(J??$))return $;return Math.max(1,Math.floor(J??$))}function L7(J){if(!Number.isFinite(J??0))return 0;return Math.max(0,Math.floor(J??0))}function Q7(J){if(J===void 0)return;if(!Number.isFinite(J))return;return Math.max(0,Math.floor(J))}function U6(J,$){if(typeof $==="function")return $(J);if(!$||typeof J!=="object"||J===null)return;return J[String($)]}function V7(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 D6(J){let $=J.flatMap((G)=>G.results||[]),X=J.filter((G)=>!G.success),Y=J.reduce((G,H)=>G+(H.meta?.duration||0),0);if(X.length===0)return{success:!0,results:$,meta:{duration:Y}};let Z=X.map((G)=>G.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 z6(J,$=[],X={}){let Y=YJ(X.batchSize),Z=L7(X.offset),G=Q7(X.limit),H=D6(await VJ(J,$,Y)),_=H.results;if(X.filter)_=_.filter((W)=>X.filter?.(W));if(X.comparator)_=[..._].sort(X.comparator);else if(X.sortBy){let W=X.sortDirection==="desc"?-1:1;_=[..._].sort((O,A)=>{let Q=U6(O,X.sortBy),z=U6(A,X.sortBy);return V7(Q,z)*W})}let U=G===void 0?void 0:Z+G,F=_.slice(Z,U);return{...H,results:F}}async function M6(J,$=[],X=50){let Y=R(),Z=[];for(let[H,_]of Object.entries(Y.shards)){if(!H||!_){console.error(`Shard ${H??"<null>"} not found, skipping`);continue}Z.push(()=>_.prepare(J).bind(...$).first().catch((U)=>{return console.error(`Error executing query on shard ${H}:`,U),null}))}let G=[];for(let H=0;H<Z.length;H+=X){let _=Z.slice(H,H+X).map((U)=>U());G.push(...await Promise.all(_))}return G}async function E7(J,$=[],X={}){return(await z6(J,$,{...X,limit:1})).results[0]??null}async function P7(){let J=R();if(await q(J).clearAllMappings(),s.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 T7(J){let X=R().shards[J];if(!X)throw new j(`Shard ${J} not found`,"SHARD_NOT_FOUND");return await jJ(X)}var D7=/^[A-Za-z_][A-Za-z0-9_]*$/;function p(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||!D7.test(Y)))throw new j(`Invalid SQL identifier: ${J}`,"INVALID_IDENTIFIER");return X.map((Y)=>`"${Y}"`).join(".")}function F6(J){return J.toLowerCase().replace(/[^a-z0-9_]+/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"")}function z7(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 xJ(J,$,X={}){let Y=z7($),Z=p(J),G=X.indexName?X.indexName:["idx",F6(J),...Y.map((O)=>F6(O.name))].filter(Boolean).join("_").slice(0,120),H=p(G||"idx_auto"),_=Y.map((O)=>{let A=p(O.name),Q=O.order?` ${O.order}`:"",z=O.collate?` COLLATE ${p(O.collate).replace(/"/g,"")}`:"";return`${A}${z}${Q}`}).join(", "),U=X.ifNotExists===!1?"":" IF NOT EXISTS",F=X.unique?"UNIQUE ":"",W=X.where?.trim()?` WHERE ${X.where.trim()}`:"";return`CREATE ${F}INDEX${U} ${H} ON ${Z} (${_})${W}`}async function M7(J,$,X,Y={}){let Z=xJ($,X,Y);return Q6(J,Z)}async function I7(J,$,X,Y={}){let Z=xJ($,X,Y);return vJ(J,Z)}async function B7(J,$,X={}){let Y=xJ(J,$,X);return T6(Y,[],YJ(X.batchSize))}function KJ(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 R7(J,$,X=[],Y={}){return E6(J,KJ($,Y.mode),X)}async function N7(J,$,X=[],Y={}){return QJ(J,KJ($,Y.mode),X)}async function C7(J,$=[],X={}){return VJ(KJ(J,X.mode),$,YJ(X.batchSize))}async function w7(J,$){let X=p($),Y=await P6(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 v7(J,$){let X=p($),Y=await kJ(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 k7(J,$=50){let X=R(),Y=YJ($),G=`SELECT COUNT(*) AS row_count FROM ${p(J)}`,H=[];for(let[F,W]of Object.entries(X.shards)){if(!F||!W)continue;H.push(async()=>{try{let O=await W.prepare(G).first(),A=Number(O?.row_count??0);return{shard:F,count:Number.isFinite(A)?A:0,success:!0}}catch(O){return{shard:F,count:null,success:!1,error:O instanceof Error?O.message:String(O)}}})}let _=[];for(let F=0;F<H.length;F+=Y){let W=H.slice(F,F+Y).map((O)=>O());_.push(...await Promise.all(W))}return{total:_.reduce((F,W)=>F+(W.count??0),0),shards:_}}async function x7(J){let $=R(),X=await L6(J,"read"),Y=$.shards[X];if(!Y)throw new j(`Shard ${X} not found in configuration`,"SHARD_NOT_FOUND");return jJ(Y)}async function I6(J=50){let $=R(),X=YJ(J),Y=[];for(let[G,H]of Object.entries($.shards)){if(!G||!H)continue;Y.push(async()=>{try{return{shard:G,size:await jJ(H),success:!0}}catch(_){return{shard:G,size:null,success:!1,error:_ instanceof Error?_.message:String(_)}}})}let Z=[];for(let G=0;G<Y.length;G+=X){let H=Y.slice(G,G+X).map((_)=>_());Z.push(...await Promise.all(H))}return Z}async function K7(J=50){return(await I6(J)).reduce((X,Y)=>X+(Y.size??0),0)}b();class B6{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 G=await this.getState(),H=Z||G.knownShards;if(H.length===0)return new Response(JSON.stringify({error:"No shards available"}),{status:400,headers:{"Content-Type":"application/json"}});let _=this.resolveStrategy(G.strategy,X,Y||"write"),U=this.selectShard($,G,_,H);if(_==="round-robin")G.roundRobinIndex=(G.roundRobinIndex+1)%H.length,await this.saveState(G);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(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 G=0;for(let _=0;_<J.length;_++){let U=J.charCodeAt(_);G=(G<<5)-G+U,G=G&G}let H=Math.abs(G)%Z.length;return Z[H]}case"location":{let G=$.targetRegion,H=$.shardLocations||{},_=Z.filter((E)=>H[E]);if(!G||_.length===0){let E=0;for(let M=0;M<J.length;M++){let D=J.charCodeAt(M);E=(E<<5)-E+D,E=E&E}let P=Math.abs(E)%Z.length;return Z[P]}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}},F=(E,P)=>(P in E),W=(E)=>F(U,E)?E:"wnam",O=(E,P)=>{let M=U[W(E)],D=U[W(P)],V=M.lat-D.lat,L=M.lon-D.lon;return Math.sqrt(V*V+L*L)},A=_.map((E)=>{let P=H[E],M=O(G,P.region),D=P.priority||1;return{shard:E,score:M-D*0.1}});A.sort((E,P)=>E.score-P.score);let Q=A[0].score,z=A.filter((E)=>Math.abs(E.score-Q)<0.01);if(z.length===1)return z[0].shard;let T=0;for(let E=0;E<J.length;E++){let P=J.charCodeAt(E);T=(T<<5)-T+P,T=T&T}let B=Math.abs(T)%z.length;return z[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($)}}b();JJ();b();var S7=500;function C6(J,$={}){let X=$.scanCount??S7;return{async get(Y,Z="text"){let G=await J.get(Y);if(G===null)return null;if(Z!=="json")return G;try{return JSON.parse(G)}catch(H){throw new j(`Failed to parse JSON from Redis for key ${Y}: ${H instanceof Error?H.message:String(H)}`,"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??"",G=`${Z}*`,H=Y?.cursor??"0",_=Y?.limit,U=[];do{let F=await m7(J,H,G,X);H=F.cursor;for(let W of F.keys){if(!Z||W.startsWith(Z))U.push(W);if(_&&U.length>=_)break}if(_&&U.length>=_)break}while(H!=="0");return{keys:U.map((F)=>({name:F})),cursor:H,list_complete:H==="0"}}}}function q7(J,$={}){return C6(J,$)}function w6(J,$){if($)return PJ(J,$);return{prepare(X){return new yJ(J,X)}}}function v6(J,$){if($)return PJ(J,$);return{prepare(X){return new gJ(J,X)}}}function f7(J,$){if($)return PJ(J,$);return{prepare(X){return new pJ(J,X)}}}function PJ(J,$){return{prepare(X){return new mJ(J,$,X)}}}function b7(J){return{async get($,X="text"){let Y=await l7(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 o7(J,$,X)},async delete($){await n7(J,$)},async list($){let X=$?.prefix??"",Y=await i7(J,X);return{keys:(typeof $?.limit==="number"?Y.slice(0,$.limit):Y).map((G)=>({name:G})),list_complete:!0}}}}function h7(J,$){return w6({query:async(Y,Z=[])=>{let G=$(J.connectionString);if(typeof G.connect==="function")await G.connect();try{return await G.query(Y,Z)}finally{if(typeof G.release==="function")G.release();else if(typeof G.end==="function")await G.end()}}})}function y7(J,$){return v6({execute:async(Y,Z=[])=>{let G=$(J.connectionString);try{if(typeof G.execute==="function")return await G.execute(Y,Z);if(typeof G.query==="function")return await G.query(Y,Z);throw new j("Hyperdrive MySQL client is missing execute/query methods","MYSQL_CLIENT_INVALID")}finally{if(typeof G.end==="function")await G.end();else if(typeof G.close==="function")await G.close();else if(typeof G.destroy==="function")G.destroy()}}})}function g7(J){if(!J||typeof J!=="object")return!1;return typeof J.prepare==="function"}function p7(J){if(!J||typeof J!=="object")return!1;let $=J;return typeof $.get==="function"&&typeof $.put==="function"&&typeof $.delete==="function"&&typeof $.list==="function"}class yJ{client;sql;bindings;constructor(J,$,X=[]){this.client=J,this.sql=$,this.bindings=X}bind(...J){return new yJ(this.client,this.sql,J)}async run(){let J=Date.now(),$=hJ(this.sql),X=await this.client.query($,this.bindings);return{success:!0,results:X.rows??[],meta:K(J,{changes:typeof X.rowCount==="number"?X.rowCount:void 0,command:X.command})}}async all(){let J=Date.now(),$=hJ(this.sql),X=await this.client.query($,this.bindings);return{success:!0,results:X.rows??[],meta:K(J,{changes:typeof X.rowCount==="number"?X.rowCount:void 0,command:X.command})}}async first(){let J=hJ(this.sql);return(await this.client.query(J,this.bindings)).rows?.[0]??null}}class gJ{client;sql;bindings;constructor(J,$,X=[]){this.client=J,this.sql=$,this.bindings=X}bind(...J){return new gJ(this.client,this.sql,J)}async run(){let J=Date.now(),$=await SJ(this.client,this.sql,this.bindings);if(Array.isArray($))return{success:!0,results:$,meta:K(J)};let X=$;return{success:!0,results:[],meta:K(J,{changes:X.affectedRows,last_row_id:X.insertId,warningStatus:X.warningStatus})}}async all(){let J=Date.now(),$=await SJ(this.client,this.sql,this.bindings);return{success:!0,results:Array.isArray($)?$:[],meta:K(J,{changes:!Array.isArray($)?$.affectedRows:void 0})}}async first(){let J=await SJ(this.client,this.sql,this.bindings);if(!Array.isArray(J)||J.length===0)return null;return J[0]}}class pJ{client;sql;bindings;constructor(J,$,X=[]){this.client=J,this.sql=$,this.bindings=X}bind(...J){return new pJ(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:bJ(Z),meta:K(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:K(J,{changes:EJ(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:bJ(Y),meta:K(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:K(J)}}async first(){if(typeof this.client.execute==="function"){let $=await this.client.execute(this.sql,this.bindings);return bJ($)[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 mJ{client;sqlTag;sqlText;bindings;constructor(J,$,X,Y=[]){this.client=J,this.sqlTag=$,this.sqlText=X,this.bindings=Y}bind(...J){return new mJ(this.client,this.sqlTag,this.sqlText,J)}async run(){let J=Date.now(),$=qJ(this.sqlTag,this.sqlText,this.bindings),X=await u7(this.client,$);return{success:!0,results:fJ(X),meta:K(J,N6(X))}}async all(){let J=Date.now(),$=qJ(this.sqlTag,this.sqlText,this.bindings),X=await k6(this.client,$);return{success:!0,results:fJ(X),meta:K(J,N6(X))}}async first(){let J=qJ(this.sqlTag,this.sqlText,this.bindings),$=await c7(this.client,J),X=fJ($);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 m7(J,$,X,Y){try{let Z=await J.scan($,{MATCH:X,COUNT:Y});return R6(Z)}catch{let Z=await J.scan($,"MATCH",X,"COUNT",String(Y));return R6(Z)}}function R6(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 SJ(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 u7(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 k6(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 c7(J,$){if(typeof J.get==="function")return await J.get($);return await k6(J,$)}function qJ(J,$,X){let Y=d7($),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 G=typeof J.empty==="function"?J.empty():J.raw("");for(let H=0;H<Y.length;H++){let _=Y[H];if(_)G.append(J.raw(_));if(H<Z)G.append(J`${X[H]}`)}return G}function d7(J){let $=[],X=0,Y=!1,Z=!1,G=!1,H=!1;for(let _=0;_<J.length;_++){let U=J[_],F=_+1<J.length?J[_+1]:"";if(G){if(U===`
|
|
17
|
+
`)G=!1;continue}if(H){if(U==="*"&&F==="/")_++,H=!1;continue}if(!Y&&!Z){if(U==="-"&&F==="-"){_++,G=!0;continue}if(U==="/"&&F==="*"){_++,H=!0;continue}}if(U==="'"&&!Z){if(Y&&F==="'"){_++;continue}Y=!Y;continue}if(U==='"'&&!Y){if(Z&&F==='"'){_++;continue}Z=!Z;continue}if(U==="?"&&!Y&&!Z)$.push(J.slice(X,_)),X=_+1}return $.push(J.slice(X)),$}function fJ(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 N6(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=EJ($.rowCount)??EJ($.changes)??EJ($.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 l7(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 o7(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 n7(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 i7(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 bJ(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 K(J,$={}){return{duration:Date.now()-J,...$}}function EJ(J){if(typeof J==="number"&&Number.isFinite(J))return J;return}var ZJ=new Map;function hJ(J){let $=ZJ.get(J);if($)return $;let X="",Y=0,Z=!1,G=!1,H=!1,_=!1;for(let U=0;U<J.length;U++){let F=J[U],W=U+1<J.length?J[U+1]:"";if(H){if(X+=F,F===`
|
|
18
|
+
`)H=!1;continue}if(_){if(X+=F,F==="*"&&W==="/")X+="/",U++,_=!1;continue}if(!Z&&!G){if(F==="-"&&W==="-"){X+="--",U++,H=!0;continue}if(F==="/"&&W==="*"){X+="/*",U++,_=!0;continue}}if(F==="'"&&!G){Z=!Z,X+=F;continue}if(F==='"'&&!Z){G=!G,X+=F;continue}if(F==="?"&&!Z&&!G){Y++,X+=`$${Y}`;continue}X+=F}if(ZJ.set(J,X),ZJ.size>5000){let U=ZJ.keys().next().value;if(U)ZJ.delete(U)}return X}b();var s7={casing:{getColumnCasing(J){return J?.name??""}},escapeName(J){return J},escapeParam(){return"?"},escapeString(J){return J.replace(/'/g,"''")}},h6=["<=",">=","!=","<>","=","<",">"],t7=new Set(["COUNT","MAX","MIN","SUM","AVG"]),a7=new Set(["COALESCE","IFNULL","LOWER","UPPER","LENGTH","ABS"]);function N(J){return J.trim().replace(/^[`"\[]+|[`"\]]+$/g,"").split(".").pop()?.trim()??J.trim()}function r7(J){return J.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function m(J){if(typeof J==="number"&&Number.isFinite(J))return J;if(typeof J==="bigint")return Number(J);if(typeof J==="string"){let $=J.trim();if($==="")return;let X=Number($);return Number.isFinite(X)?X:void 0}return}function r(J,$=","){let X=[],Y=0,Z="",G=!1,H=!1;for(let U=0;U<J.length;U++){let F=J[U];if(F==="'"&&!H){G=!G,Z+=F;continue}if(F==='"'&&!G){H=!H,Z+=F;continue}if(!G&&!H){if(F==="(")Y++;else if(F===")")Y=Math.max(0,Y-1);else if(Y===0&&F===$){X.push(Z.trim()),Z="";continue}}Z+=F}let _=Z.trim();if(_.length>0)X.push(_);return X}function IJ(J,$){let X=0,Y=!1,Z=!1;for(let G=$;G<J.length;G++){let H=J[G];if(H==="'"&&!Z){Y=!Y;continue}if(H==='"'&&!Y){Z=!Z;continue}if(Y||Z)continue;if(H==="(")X++;else if(H===")"){if(X--,X===0)return G}}return-1}function _J(J){let $=J.trim();if($.length===0)return{value:null,consumed:!1};if($==="?")return{value:null,consumed:!1};if(/^null$/i.test($))return{value:null,consumed:!0};if(/^true$/i.test($))return{value:1,consumed:!0};if(/^false$/i.test($))return{value:0,consumed:!0};if($.startsWith("'")&&$.endsWith("'")||$.startsWith('"')&&$.endsWith('"'))return{value:$.slice(1,-1).replace(/''/g,"'").replace(/""/g,'"'),consumed:!0};let X=Number($);if(Number.isFinite(X)&&/^-?\d+(\.\d+)?$/.test($))return{value:X,consumed:!0};return{value:void 0,consumed:!1}}function TJ(J){let $=J.toUpperCase(),X=x($,J,"WHERE");if(X===-1){let H=x($,J,"FROM");return{whereClause:null,afterWhere:H===-1?"":J.slice(H+4)}}let Y=X+5,Z=["ORDER BY","GROUP BY","HAVING","LIMIT","OFFSET","RETURNING",";"],G=J.length;for(let H of Z){let _=x($,J,H,Y);if(_!==-1&&_<G)G=_}return{whereClause:J.slice(Y,G).trim(),afterWhere:J.slice(G)}}function x(J,$,X,Y=0){let Z=Y,G=!1,H=!1;while(Z<=J.length-X.length){let _=$[Z];if(_==="'"&&!H){G=!G,Z++;continue}if(_==='"'&&!G){H=!H,Z++;continue}if(!G&&!H){if(J.startsWith(X,Z)){let U=Z===0?" ":J[Z-1],F=J[Z+X.length]??" ",W=/[A-Z0-9_]/.test(U)===!1,O=/[A-Z0-9_]/.test(F)===!1;if(W&&O)return Z}}Z++}return-1}function x6(J){let $=J.toUpperCase(),X={},Y=x($,J,"LIMIT");if(Y!==-1){let H=J.slice(Y+5).trim().match(/^(\d+)(?:\s*,\s*(\d+))?/);if(H){let _=Number(H[1]),U=H[2]!==void 0?Number(H[2]):void 0;if(U!==void 0)X.offset=_,X.limit=U;else X.limit=_}}let Z=x($,J,"OFFSET");if(Z!==-1){let H=J.slice(Z+6).trim().match(/^(\d+)/);if(H)X.offset=Number(H[1])}return X}function e7(J){let $=[];for(let X of r(J,",")){let Y=X.indexOf("=");if(Y===-1)continue;let Z=N(X.slice(0,Y)),G=X.slice(Y+1).trim();if(Z.length===0)continue;$.push({column:Z,expression:G})}return $}function DJ(J){let $=[],X=0;while(X<J.length){let Y=J[X];if(/\s/.test(Y)){X++;continue}if(Y==="("||Y===")"){$.push(Y),X++;continue}if(Y==="?"){$.push("?"),X++;continue}if(Y==="'"||Y==='"'){let H=Y,_=X+1;while(_<J.length){if(J[_]===H){if(J[_+1]===H){_+=2;continue}_++;break}_++}$.push(J.slice(X,_)),X=_;continue}let Z=null;for(let H of h6)if(J.startsWith(H,X)){Z=H;break}if(Z){$.push(Z),X+=Z.length;continue}let G=X;while(G<J.length&&/[A-Za-z0-9_.$]/.test(J[G]))G++;if(G===X)$.push(Y),X++;else $.push(J.slice(X,G)),X=G}return $}class GJ{tokens;position=0;constructor(J){this.tokens=J}parse(){if(this.tokens.length===0)return{type:"always-true"};return this.parseOr()}peek(){return this.tokens[this.position]}take(){return this.tokens[this.position++]}isKeyword(J,$){return typeof J==="string"&&J.toUpperCase()===$}parseOr(){let J=this.parseAnd();while(this.isKeyword(this.peek(),"OR")){this.take();let $=this.parseAnd();J=J.type==="or"?{type:"or",children:[...J.children,$]}:{type:"or",children:[J,$]}}return J}parseAnd(){let J=this.parseTerm();while(this.isKeyword(this.peek(),"AND")){this.take();let $=this.parseTerm();J=J.type==="and"?{type:"and",children:[...J.children,$]}:{type:"and",children:[J,$]}}return J}parseTerm(){if(this.peek()==="("){this.take();let $=this.parseOr();if(this.peek()===")")this.take();return $}return this.parseComparison()}parseComparison(){let J=this.take();if(J===void 0)return{type:"always-true"};let $=N(J),X=this.take();if(X===void 0)return{type:"always-true"};let Y=X.toUpperCase();if(Y==="IS"){let _=this.peek();if(this.isKeyword(_,"NOT")){this.take();let F=this.take();if(this.isKeyword(F,"NULL"))return{type:"null-check",column:$,operator:"IS NOT NULL"}}let U=this.take();if(this.isKeyword(U,"NULL"))return{type:"null-check",column:$,operator:"IS NULL"};return{type:"always-true"}}let Z=null;if(Y==="LIKE")Z="LIKE";else if(Y==="NOT"){let _=this.take();if(this.isKeyword(_,"LIKE"))Z="NOT LIKE";else return{type:"always-true"}}else if(h6.includes(Y))Z=Y;if(!Z)return{type:"always-true"};let G=this.take();if(G==="?")return{type:"compare",column:$,operator:Z,value:{kind:"param"}};let H=_J(G??"");return{type:"compare",column:$,operator:Z,value:{kind:"literal",value:H.consumed?H.value:G??null}}}}function a(J,$,X,Y){switch(J.type){case"always-true":return!0;case"and":return J.children.every((Z)=>a(Z,$,X,Y));case"or":{let Z=!1;for(let G of J.children)if(a(G,$,X,Y))Z=!0;return Z}case"null-check":{let Z=$[J.column],G=Z===null||Z===void 0;return J.operator==="IS NULL"?G:!G}case"compare":{let Z;if(J.value.kind==="param")Z=X[Y.value++];else Z=J.value.value;let G=$[J.column];if(J.operator==="LIKE"||J.operator==="NOT LIKE"){let F=String(Z??""),O=new RegExp(`^${r7(F).replace(/%/g,".*").replace(/_/g,".")}$`,"i").test(String(G??""));return J.operator==="LIKE"?O:!O}let H=m(G),_=m(Z),U;if(H!==void 0&&_!==void 0)U=H===_?0:H<_?-1:1;else if(G===null||G===void 0)if(Z===null||Z===void 0)U=0;else U=-1;else if(Z===null||Z===void 0)U=1;else{let F=String(G),W=String(Z);U=F===W?0:F<W?-1:1}switch(J.operator){case"=":return U===0;case"!=":case"<>":return U!==0;case"<":return U<0;case"<=":return U<=0;case">":return U>0;case">=":return U>=0;default:return!1}}}}function K6(J){let $=0,X=!1,Y=!1;for(let Z=0;Z<J.length;Z++){let G=J[Z];if(G==="'"&&!Y){X=!X;continue}if(G==='"'&&!X){Y=!Y;continue}if(!X&&!Y&&G==="?")$++}return $}function S6(J){let $=J.trim().toUpperCase();if($.startsWith("SELECT")||$.startsWith("WITH")){if($.includes("SQLITE_MASTER"))return"sqlite-master-select";return"select"}if($.startsWith("INSERT"))return"insert";if($.startsWith("UPDATE"))return"update";if($.startsWith("DELETE"))return"delete";if($.startsWith("CREATE TABLE"))return"create-table";if($.startsWith("DROP TABLE"))return"drop-table";if($.startsWith("PRAGMA"))return"pragma";return"other"}function t(J){let $=J.toUpperCase(),X=J.match(/create\s+table\s+(?:if\s+not\s+exists\s+)?([`"\[]?[\w.]+[`"\]]?)/i);if(X)return N(X[1]??"");let Y=J.match(/drop\s+table\s+(?:if\s+exists\s+)?([`"\[]?[\w.]+[`"\]]?)/i);if(Y)return N(Y[1]??"");let Z=J.match(/insert\s+(?:or\s+\w+\s+)?into\s+([`"\[]?[\w.]+[`"\]]?)/i);if(Z)return N(Z[1]??"");let G=J.match(/update\s+(?:or\s+\w+\s+)?([`"\[]?[\w.]+[`"\]]?)\s+set/i);if(G)return N(G[1]??"");let H=J.match(/delete\s+from\s+([`"\[]?[\w.]+[`"\]]?)/i);if(H)return N(H[1]??"");let _=x($,J,"FROM");if(_!==-1){let F=J.slice(_+4).trim().match(/^([`"\[]?[\w.]+[`"\]]?)/);if(F)return N(F[1]??"")}return null}function J9(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(s7);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")}function dJ(J){return r(J,",").map((X)=>{let Y=X.match(/\s+as\s+([`"\[]?[\w.]+[`"\]]?)\s*$/i),Z=Y?X.slice(0,Y.index).trim():X.trim(),G=Y?N(Y[1]??""):$9(Z);if(Z==="*")return{expression:Z,alias:"*",kind:"star"};let H=Z.toUpperCase(),_=Z.match(/^([A-Za-z_][A-Za-z0-9_]*)\s*\(/);if(_){let U=(_[1]??"").toUpperCase();if(t7.has(U)||/\b(?:COUNT|MAX|MIN|SUM|AVG)\s*\(/i.test(H))return{expression:Z,alias:G,kind:"aggregate"};if(a7.has(U))return{expression:Z,alias:G,kind:"scalar"}}if(/[+\-*/()]/.test(Z)||/\bCOUNT\s*\(/i.test(Z)||/\bMAX\s*\(/i.test(Z))return{expression:Z,alias:G,kind:"expression"};return{expression:Z,alias:G,kind:"column"}})}function $9(J){let $=J.trim();if($==="*")return"*";if($.match(/^([`"\[]?[\w.]+[`"\]]?)$/))return N($);return $}function y6(J,$,X){let Y="",Z=!1,G=!1,H=0,_=X;while(H<J.length){let U=J[H];if(U==="'"&&!G){Z=!Z,Y+=U,H++;continue}if(U==='"'&&!Z){G=!G,Y+=U,H++;continue}if(!Z&&!G&&U==="?"){let F=$[_++];Y+=lJ(F),H++;continue}Y+=U,H++}return{expression:Y,cursor:_}}function lJ(J){if(J===null||J===void 0)return"NULL";if(typeof J==="number"||typeof J==="bigint")return String(J);if(typeof J==="boolean")return J?"1":"0";return`'${String(J).replace(/'/g,"''")}'`}function zJ(J,$,X,Y){if(J.kind==="star")return;if(J.kind==="column"){let H=$[0];return H?H[J.expression]:null}let Z=y6(J.expression,X,Y).expression;if(J.kind==="aggregate"||/\b(?:COUNT|MAX|MIN|SUM|AVG)\s*\(/i.test(Z))return X9(Z,$);if(J.kind==="scalar"){let H=$[0]??{};return HJ(Z,H)}let G=$[0]??{};return HJ(Z,G)}function X9(J,$){let X=J,Y=/(COUNT|MAX|MIN|SUM|AVG)\s*\(/i,Z=0;while(Y.test(X)&&Z<25){Z++;let G=X.match(Y);if(!G||G.index===void 0)break;let H=X.indexOf("(",G.index);if(H===-1)break;let _=IJ(X,H);if(_===-1)break;let U=(G[1]??"").toUpperCase(),F=X.slice(H+1,_).trim(),W=Y9(U,F,$),O=lJ(W);X=X.slice(0,G.index)+O+X.slice(_+1)}return HJ(X,$[0]??{})}function Y9(J,$,X){if(J==="COUNT"){if($==="*")return X.length;let G=/^distinct\s+/i.test($),H=N($.replace(/^distinct\s+/i,"")),_=X.map((U)=>U[H]).filter((U)=>U!==null&&U!==void 0);if(G)return new Set(_.map((U)=>String(U))).size;return _.length}let Y=N($),Z=X.map((G)=>m(G[Y])).filter((G)=>G!==void 0);if(Z.length===0)return null;switch(J){case"MAX":return Math.max(...Z);case"MIN":return Math.min(...Z);case"SUM":return Z.reduce((G,H)=>G+H,0);case"AVG":return Z.reduce((G,H)=>G+H,0)/Z.length;default:return null}}function HJ(J,$){let X=J.trim();if(X.length===0)return null;let Y=_J(X);if(Y.consumed)return Y.value;let Z=X.match(/^([A-Za-z_][A-Za-z0-9_]*)\s*\(/);if(Z){let H=(Z[1]??"").toUpperCase(),_=X.indexOf("(",Z.index),U=IJ(X,_);if(U!==-1){let F=X.slice(_+1,U),W=r(F,",").map((Q)=>HJ(Q,$)),O=X.slice(U+1).trim(),A=Z9(H,W);if(O.length===0)return A;return q6(`${lJ(A)} ${O}`,$)}}if(X.match(/^([`"\[]?[\w.]+[`"\]]?)$/))return $[N(X)]??null;return q6(X,$)}function Z9(J,$){switch(J){case"COALESCE":case"IFNULL":{for(let X of $)if(X!==null&&X!==void 0)return X;return null}case"LOWER":return $[0]===null||$[0]===void 0?null:String($[0]).toLowerCase();case"UPPER":return $[0]===null||$[0]===void 0?null:String($[0]).toUpperCase();case"LENGTH":return $[0]===null||$[0]===void 0?null:String($[0]).length;case"ABS":{let X=m($[0]);return X===void 0?null:Math.abs(X)}default:return null}}function q6(J,$){let X=J.trim();if(X.length===0)return null;let Y=_J(X);if(Y.consumed)return Y.value;let Z=H9(X,$);return Z===void 0?X:Z}function G9(J){let $=[],X=0;while(X<J.length){let Y=J[X];if(/\s/.test(Y)){X++;continue}if(Y==="("){$.push({type:"lparen"}),X++;continue}if(Y===")"){$.push({type:"rparen"}),X++;continue}if(Y==="+"){$.push({type:"plus"}),X++;continue}if(Y==="-"){$.push({type:"minus"}),X++;continue}if(Y==="*"){$.push({type:"star"}),X++;continue}if(Y==="/"){$.push({type:"slash"}),X++;continue}if(/[0-9.]/.test(Y)){let Z=X;while(Z<J.length&&/[0-9.]/.test(J[Z]))Z++;let G=Number(J.slice(X,Z));if(!Number.isFinite(G))return;$.push({type:"number",value:G}),X=Z;continue}if(/[A-Za-z_`"\[]/.test(Y)){let Z=X;while(Z<J.length&&/[A-Za-z0-9_`"\[\].]/.test(J[Z]))Z++;let G=J.slice(X,Z);if(/^null$/i.test(G))$.push({type:"null"});else $.push({type:"identifier",name:G});X=Z;continue}return}return $}function H9(J,$){let X=G9(J);if(!X||X.length===0)return;let Y={tokens:X,position:0},Z=g6(Y,$);if(Z===void 0)return;if(Y.position!==X.length)return;return Number.isFinite(Z)?Z:void 0}function g6(J,$){let X=f6(J,$);if(X===void 0)return;while(J.position<J.tokens.length){let Y=J.tokens[J.position];if(Y.type!=="plus"&&Y.type!=="minus")break;J.position++;let Z=f6(J,$);if(Z===void 0)return;X=Y.type==="plus"?X+Z:X-Z}return X}function f6(J,$){let X=MJ(J,$);if(X===void 0)return;while(J.position<J.tokens.length){let Y=J.tokens[J.position];if(Y.type!=="star"&&Y.type!=="slash")break;J.position++;let Z=MJ(J,$);if(Z===void 0)return;if(Y.type==="slash"&&Z===0)return;X=Y.type==="star"?X*Z:X/Z}return X}function MJ(J,$){let X=J.tokens[J.position];if(!X)return;if(X.type==="plus")return J.position++,MJ(J,$);if(X.type==="minus"){J.position++;let Y=MJ(J,$);return Y===void 0?void 0:-Y}return _9(J,$)}function _9(J,$){let X=J.tokens[J.position++];if(!X)return;if(X.type==="number")return X.value;if(X.type==="null")return 0;if(X.type==="identifier"){let Y=$[N(X.name)];if(Y===null||Y===void 0)return 0;return m(Y)}if(X.type==="lparen"){let Y=g6(J,$);if(Y===void 0)return;let Z=J.tokens[J.position++];if(!Z||Z.type!=="rparen")return;return Y}return}class oJ{tables=new Map;schemas=new Map;autoIncrementCounters=new Map;lastInsertRowId=null;prepare(J){return new p6(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=J9(J,$);return await this.executeStatement(X.sql,X.bindings)}async executeStatement(J,$){let X=Date.now();try{switch(S6(J)){case"create-table":return await this.handleCreateTable(J);case"drop-table":return await this.handleDropTable(J);case"insert":return await this.handleInsert(J,$);case"update":return await this.handleUpdate(J,$);case"delete":return await this.handleDelete(J,$);case"select":return await this.handleSelect(J,$);case"sqlite-master-select":return await this.handleSqliteMasterSelect(J,$);case"pragma":return await this.handlePragma(J);case"other":default: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(),Y=S6(J);if(Y==="select"||Y==="sqlite-master-select"||Y==="pragma")return await this.executeStatement(J,$);return{success:!1,results:[],meta:{duration:Date.now()-X},error:"Use executeStatement for non-SELECT queries"}}async handleCreateTable(J){let $=Date.now(),X=t(J);if(!X)return{success:!1,results:[],meta:{duration:Date.now()-$},error:"Could not extract table name"};let Y=new Map,Z=J.indexOf("("),G=Z===-1?-1:IJ(J,Z);if(Z!==-1&&G!==-1){let H=J.slice(Z+1,G);for(let _ of r(H,",")){let U=_.trim().split(/\s+/);if(U.length===0)continue;let F=U[0]?.toUpperCase()??"";if(["PRIMARY","FOREIGN","UNIQUE","CHECK","CONSTRAINT"].includes(F))continue;let W=N(U[0]??"");if(W.length===0)continue;let O=(U[1]??"").toUpperCase(),A=U.slice(2).join(" ").toUpperCase();Y.set(W,{name:W,type:O,isPrimaryKey:A.includes("PRIMARY KEY"),isAutoIncrement:A.includes("AUTOINCREMENT")||A.includes("AUTO_INCREMENT")||A.includes("GENERATED BY DEFAULT AS IDENTITY"),defaultValue:L9(U.slice(2).join(" ")),notNull:A.includes("NOT NULL")})}}this.tables.set(X,new Map),this.schemas.set(X,Y);for(let H of Y.values())if(H.isAutoIncrement){this.autoIncrementCounters.set(X,this.autoIncrementCounters.get(X)??0);break}return{success:!0,results:[],meta:{duration:Date.now()-$}}}async handleDropTable(J){let $=Date.now(),X=t(J);if(!X)return{success:!1,results:[],meta:{duration:Date.now()-$},error:"Could not extract table name"};return this.tables.delete(X),this.schemas.delete(X),this.autoIncrementCounters.delete(X),{success:!0,results:[],meta:{duration:Date.now()-$}}}async handleInsert(J,$){let X=Date.now(),Y=t(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),G=this.schemas.get(Y),H=G?Array.from(G.values()):[],_=H.find((M)=>M.isPrimaryKey),U=H.find((M)=>M.isAutoIncrement),F=j9(J),W=/\binsert\s+or\s+replace\b/i.test(J),O=/\binsert\s+or\s+(?:ignore|abort|fail|rollback)\b/i.test(J),A=A9(J),Q=[],z=A.length>0?A:[null],T=0;for(let M of z){let D={};if(F&&F.length>0){let I=M?r(M,",").map((e)=>e.trim()):F.map(()=>"?");F.forEach((e,BJ)=>{let u=I[BJ];if(u===void 0)return;if(u==="?")D[e]=$[T++];else{let S=_J(u);D[e]=S.consumed?S.value:u}})}else if(G){for(let I of G.keys())if(T<$.length)D[I]=$[T++]}else for(let I of $.slice(T))D[Object.keys(D).length===0?"id":`column_${Object.keys(D).length}`]=I,T++;if(G){for(let I of G.values())if(D[I.name]===void 0&&I.defaultValue!==void 0)D[I.name]=I.defaultValue}let V=_?.name??"id",L=D[V];if((L===void 0||L===null||L==="")&&U){let I=(this.autoIncrementCounters.get(Y)??0)+1;if(this.autoIncrementCounters.set(Y,I),D[U.name]=I,V!==U.name)D[V]=I;L=I}if(L===void 0||L===null||L===""){let I=(this.autoIncrementCounters.get(Y)??0)+1;this.autoIncrementCounters.set(Y,I),L=I,D[V]=I}if(U){let I=typeof L==="number"?L:Number(L);if(Number.isFinite(I))this.autoIncrementCounters.set(Y,Math.max(this.autoIncrementCounters.get(Y)??0,I))}let C=String(L);if(Z.has(C)&&!W){if(O)continue;return{success:!1,results:[],meta:{duration:Date.now()-X},error:`UNIQUE constraint failed: ${Y}.${V}`}}Z.set(C,D),this.lastInsertRowId=typeof L==="number"||typeof L==="string"?L:String(L),Q.push(D)}let B=/\breturning\b/i.test(J),E=B?uJ(J):null;return{success:!0,results:B?Q.map((M)=>cJ(M,E??["*"])):[],meta:{duration:Date.now()-X,last_row_id:this.lastInsertRowId??void 0,changes:Q.length}}}async handleUpdate(J,$){let X=Date.now(),Y=t(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=F9(J);if(!Z)return{success:!1,results:[],meta:{duration:Date.now()-X},error:"UPDATE missing SET clause"};let G=e7(Z),H=this.tables.get(Y),_=Array.from(H.values()),U=K6(Z),F=$.slice(U),W=$.slice(0,U),{whereClause:O}=TJ(J),A=O?new GJ(DJ(O)).parse():{type:"always-true"},Q=[];for(let P of _)if(a(A,P,F,{value:0}))Q.push(P);let z=0;for(let P of Q){let M={value:0};for(let{column:D,expression:V}of G){let L=K6(V),C=W.slice(M.value,M.value+L);M.value+=L,P[D]=U9(V,C,P)}z++}let T=/\breturning\b/i.test(J),B=T?uJ(J):null;return{success:!0,results:T?Q.map((P)=>cJ(P,B??["*"])):[],meta:{duration:Date.now()-X,changes:z}}}async handleDelete(J,$){let X=Date.now(),Y=t(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),{whereClause:G}=TJ(J);if(!G){let O=Z.size;return Z.clear(),{success:!0,results:[],meta:{duration:Date.now()-X,changes:O}}}let H=new GJ(DJ(G)).parse(),_=[];for(let[O,A]of Array.from(Z.entries()))if(a(H,A,$,{value:0}))Z.delete(O),_.push(A);let U=/\breturning\b/i.test(J),F=U?uJ(J):null;return{success:!0,results:U?_.map((O)=>cJ(O,F??["*"])):[],meta:{duration:Date.now()-X,changes:_.length}}}async handleSelect(J,$){let X=Date.now(),Y=t(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),G=Array.from(Z.values()),{whereClause:H,afterWhere:_}=TJ(J),U=H?new GJ(DJ(H)).parse():{type:"always-true"},F=b6(J),W=dJ(F),O=[];for(let V of G)if(a(U,V,$,{value:0}))O.push(V);let A=W9(_||J),Q=O;if(A)Q=[...O].sort((V,L)=>O9(V,L,A));let z=W.some((V)=>V.kind==="aggregate"),T;if(z){let V={};for(let L of W)V[L.alias]=zJ(L,Q,$,0);T=[V]}else if(W.length===1&&W[0]?.kind==="star")T=Q.map((V)=>({...V}));else T=Q.map((V)=>{let L={};for(let C of W)if(C.kind==="star")Object.assign(L,V);else if(C.kind==="column")L[C.alias]=V[C.expression]??null;else L[C.alias]=zJ(C,[V],$,0);return L});let{limit:B,offset:E}=x6(_),P=E??0,M=B===void 0?T.length:P+B;return{success:!0,results:T.slice(P,M),meta:{duration:Date.now()-X}}}async handleSqliteMasterSelect(J,$){let X=Date.now(),Y=[];for(let T of this.tables.keys())Y.push({name:T,type:"table",tbl_name:T,sql:`CREATE TABLE ${T} (...)`});let{whereClause:Z,afterWhere:G}=TJ(J),H=Z?new GJ(DJ(Z)).parse():{type:"always-true"},_=Y.filter((T)=>{return a(H,T,$,{value:0})}),U=b6(J),F=dJ(U),W=_.map((T)=>{if(F.length===1&&F[0]?.kind==="star")return{...T};let B={};for(let E of F)if(E.kind==="star")Object.assign(B,T);else if(E.kind==="column")B[E.alias]=T[E.expression]??null;else B[E.alias]=zJ(E,[T],$,0);return B}),{limit:O,offset:A}=x6(G),Q=A??0,z=O===void 0?W.length:Q+O;return{success:!0,results:W.slice(Q,z),meta:{duration:Date.now()-X}}}async handlePragma(J){let $=Date.now(),X=J.trim().toLowerCase();if(X.startsWith("pragma page_count")){let Y=0;for(let Z of this.tables.values())Y+=Z.size;return{success:!0,results:[{page_count:Math.max(1,Y)}],meta:{duration:Date.now()-$}}}if(X.startsWith("pragma page_size"))return{success:!0,results:[{page_size:4096}],meta:{duration:Date.now()-$}};if(X.startsWith("pragma table_info")){let Y=X.match(/pragma\s+table_info\s*\(\s*([`"\[]?[\w.]+[`"\]]?)\s*\)/);if(Y){let Z=N(Y[1]??""),G=this.schemas.get(Z);if(G)return{success:!0,results:Array.from(G.values()).map((_,U)=>({cid:U,name:_.name,type:_.type,notnull:_.notNull?1:0,dflt_value:_.defaultValue??null,pk:_.isPrimaryKey?1:0})),meta:{duration:Date.now()-$}}}}return{success:!0,results:[],meta:{duration:Date.now()-$}}}}function U9(J,$,X){if(J==="?")return $[0];let Y=y6(J,$,0).expression;return HJ(Y,X)}function b6(J){let $=J.toUpperCase(),X=x($,J,"SELECT");if(X===-1)return"*";let Y=x($,J,"FROM",X+6);if(Y===-1)return J.slice(X+6).trim();return J.slice(X+6,Y).trim().replace(/^distinct\s+/i,"")}function F9(J){let $=J.toUpperCase(),X=x($,J,"SET");if(X===-1)return null;let Y=X+3,Z=["WHERE","RETURNING","ORDER BY","LIMIT"],G=J.length;for(let H of Z){let _=x($,J,H,Y);if(_!==-1&&_<G)G=_}return J.slice(Y,G).trim()}function W9(J){let $=J.toUpperCase(),X=x($,J,"ORDER BY");if(X===-1)return null;let Z=J.slice(X+8).trim().match(/^([`"\[]?[\w.]+[`"\]]?)(?:\s+(asc|desc))?/i);if(!Z)return null;return{column:N(Z[1]??""),direction:(Z[2]??"asc").toLowerCase()==="desc"?"desc":"asc"}}function O9(J,$,X){let Y=J[X.column],Z=$[X.column];if(Y===Z)return 0;if(Y===void 0||Y===null)return X.direction==="desc"?1:-1;if(Z===void 0||Z===null)return X.direction==="desc"?-1:1;let G=m(Y),H=m(Z),_;if(G!==void 0&&H!==void 0)_=G===H?0:G<H?-1:1;else _=String(Y).localeCompare(String(Z));return X.direction==="desc"?-_:_}function A9(J){let $=J.toUpperCase(),X=x($,J,"VALUES");if(X===-1)return[];let Y=[],Z=X+6;while(Z<J.length){while(Z<J.length&&/[\s,]/.test(J[Z]))Z++;if(J[Z]!=="(")break;let G=IJ(J,Z);if(G===-1)break;Y.push(J.slice(Z+1,G).trim()),Z=G+1}return Y}function j9(J){let $=J.match(/insert\s+(?:or\s+\w+\s+)?into\s+[^()]+\(([^)]+)\)/i);if(!$||!$[1]||$.index===void 0)return null;let Y=J.slice(0,$.index+$[0].length).toUpperCase();if(Y.includes("VALUES")||Y.includes("SELECT"))return null;return $[1].split(",").map((Z)=>N(Z)).filter((Z)=>Z.length>0)}function uJ(J){let $=J.match(/\breturning\b\s+([^;]+)/i);if(!$||!$[1])return null;return r($[1],",").map((X)=>X.trim())}function cJ(J,$){if($.length===1&&$[0]==="*")return{...J};let X=dJ($.join(", ")),Y={};for(let Z of X)if(Z.kind==="star")Object.assign(Y,J);else if(Z.kind==="column")Y[Z.alias]=J[Z.expression]??null;else Y[Z.alias]=zJ(Z,[J],[],0);return Y}function L9(J){let $=J.match(/default\s+('([^']*)'|"([^"]*)"|[\w.-]+)/i);if(!$)return;let X=$[1]??"",Y=_J(X);return Y.consumed?Y.value:X}class p6{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.executeStatement(this.sql,this.bindings)}async first(){return(await this.database.executeStatement(this.sql,this.bindings)).results[0]??null}}class nJ{store=new Map;expirations=new Map;pruneExpired(){if(this.expirations.size===0)return;let J=Date.now();for(let[$,X]of this.expirations)if(X<J)this.store.delete($),this.expirations.delete($)}normalizeValue(J){return typeof J==="string"?J:JSON.stringify(J)??String(J)}async get(J,$="text"){let X=this.expirations.get(J);if(X!==void 0&&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){this.pruneExpired();let $=J?.prefix??"",X=J?.limit??1000,Y=J?.cursor?Number.parseInt(J.cursor,10):0,Z=Number.isFinite(Y)&&Y>=0?Y:0,G=[];for(let F of this.store.keys())if(F.startsWith($))G.push(F);let H=G.slice(Z,Z+X).map((F)=>({name:F})),_=Z+X,U=_>=G.length;return{keys:H,cursor:U?void 0:String(_),list_complete:U}}clear(){this.store.clear(),this.expirations.clear()}size(){return this.pruneExpired(),this.store.size}}function Q9(){return new oJ}function V9(){return new nJ}$J();export{OJ as validateTableForSharding,eJ as schemaExists,vJ as runShard,T6 as runAllShards,Q6 as run,s6 as resetConfig,O7 as reassignShard,LJ as prepare,$6 as migrateRecord,l as listTables,A7 as listKnownShards,g7 as isSQLDatabase,p7 as isKVStorage,Y6 as integrateExistingDatabase,U7 as insertShard,_7 as insert,W6 as initializeAsync,n6 as initialize,I7 as indexShard,B7 as indexAllShards,M7 as index,K7 as getTotalDatabaseSize,j7 as getShardStats,I6 as getDatabaseSizesAllShards,T7 as getDatabaseSizeForShard,x7 as getDatabaseSizeForKey,r6 as getClosestRegionFromIP,P7 as flush,kJ as firstShard,W7 as firstByLookupKey,E7 as firstAllShardsGlobal,M6 as firstAllShards,P6 as first,N7 as explainShard,C7 as explainAllShards,R7 as explain,J6 as dropSchema,WJ as discoverExistingRecordsWithColumns,FJ as discoverExistingPrimaryKeys,q7 as createValkeyKVProvider,rJ as createSchemaAcrossShards,Y7 as createSchema,f7 as createSQLiteProvider,C6 as createRedisKVProvider,w6 as createPostgreSQLProvider,b7 as createNuxtHubKVProvider,v6 as createMySQLProvider,X6 as createMappingsForExistingKeys,Q9 as createInMemorySQLProvider,V9 as createInMemoryKVProvider,h7 as createHyperdrivePostgresProvider,y7 as createHyperdriveMySQLProvider,PJ as createDrizzleSQLProvider,v7 as countShard,k7 as countAllShards,w7 as count,i6 as collegedb,_6 as clearShardMigrationCache,H6 as clearMigrationCache,G6 as checkMigrationNeeded,Z6 as autoDetectAndMigrate,QJ as allShard,F7 as allByLookupKey,z6 as allAllShardsGlobal,VJ as allAllShards,E6 as all,B6 as ShardCoordinator,y as KVShardMapper,oJ as InMemorySQLDatabase,nJ as InMemoryKVStorage,j as CollegeDBError};
|
|
19
19
|
|
|
20
|
-
//# debugId=
|
|
20
|
+
//# debugId=7DB2D43ECE710A4764756E2164756E21
|
|
21
21
|
//# sourceMappingURL=index.js.map
|