@earth-app/collegedb 1.2.1 → 1.2.2
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/README.md +111 -0
- package/dist/index.js +8 -8
- package/dist/index.js.map +5 -5
- package/dist/kvmap.d.ts.map +1 -1
- package/dist/migrations.d.ts.map +1 -1
- package/dist/providers-memory.d.ts +65 -25
- package/dist/providers-memory.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -689,6 +689,117 @@ The in-memory providers are intentionally simple to avoid dependencies:
|
|
|
689
689
|
|
|
690
690
|
For production use, migrate to appropriate providers (D1, Redis, PostgreSQL, etc.). For testing/development, these limitations are intentional to keep the implementation lightweight and zero-dependency.
|
|
691
691
|
|
|
692
|
+
### Advanced In-Memory Example: `run`, `all`, `insert`, and Aggregates
|
|
693
|
+
|
|
694
|
+
The in-memory SQL emulator supports a useful subset of SQLite syntax — enough to drive routing tests for real-world ORM-style code. The example below exercises the full routing stack (`run`, `all`, `first`, `insert`, `insertShard`, `runShard`, `countAllShards`, `allAllShardsGlobal`) entirely in-process without spinning up a database container.
|
|
695
|
+
|
|
696
|
+
```typescript
|
|
697
|
+
import {
|
|
698
|
+
allAllShardsGlobal,
|
|
699
|
+
countAllShards,
|
|
700
|
+
createInMemoryKVProvider,
|
|
701
|
+
createInMemorySQLProvider,
|
|
702
|
+
first,
|
|
703
|
+
initialize,
|
|
704
|
+
insert,
|
|
705
|
+
insertShard,
|
|
706
|
+
resetConfig,
|
|
707
|
+
run,
|
|
708
|
+
runShard
|
|
709
|
+
} from '@earth-app/collegedb';
|
|
710
|
+
|
|
711
|
+
resetConfig();
|
|
712
|
+
|
|
713
|
+
initialize({
|
|
714
|
+
kv: createInMemoryKVProvider(),
|
|
715
|
+
shards: {
|
|
716
|
+
'db-east': createInMemorySQLProvider(),
|
|
717
|
+
'db-west': createInMemorySQLProvider(),
|
|
718
|
+
'db-central': createInMemorySQLProvider()
|
|
719
|
+
},
|
|
720
|
+
strategy: 'hash',
|
|
721
|
+
hashShardMappings: false,
|
|
722
|
+
disableAutoMigration: true
|
|
723
|
+
});
|
|
724
|
+
|
|
725
|
+
// 1. Schema setup: replicate the same DDL on every shard.
|
|
726
|
+
for (const shard of ['db-east', 'db-west', 'db-central']) {
|
|
727
|
+
await runShard(
|
|
728
|
+
shard,
|
|
729
|
+
`CREATE TABLE IF NOT EXISTS users (
|
|
730
|
+
id TEXT PRIMARY KEY,
|
|
731
|
+
name TEXT NOT NULL,
|
|
732
|
+
email TEXT UNIQUE,
|
|
733
|
+
created_at INTEGER
|
|
734
|
+
)`
|
|
735
|
+
);
|
|
736
|
+
await runShard(
|
|
737
|
+
shard,
|
|
738
|
+
`CREATE TABLE IF NOT EXISTS tickets (
|
|
739
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
740
|
+
user_id TEXT NOT NULL,
|
|
741
|
+
subject TEXT NOT NULL,
|
|
742
|
+
created_at INTEGER
|
|
743
|
+
)`
|
|
744
|
+
);
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
// 2. Routed inserts: CollegeDB picks the shard from a stable hash of the
|
|
748
|
+
// primary key, then records the mapping in KV.
|
|
749
|
+
await run('user-1', 'INSERT INTO users (id, name, email, created_at) VALUES (?, ?, ?, ?)', [
|
|
750
|
+
'user-1',
|
|
751
|
+
'Alice',
|
|
752
|
+
'alice@example.com',
|
|
753
|
+
Date.now()
|
|
754
|
+
]);
|
|
755
|
+
|
|
756
|
+
// 3. AUTOINCREMENT inserts: `insert()` allocates the shard and captures the
|
|
757
|
+
// generated id, storing it as a mapping so routed reads find the row.
|
|
758
|
+
const ticketA = await insert('INSERT INTO tickets (user_id, subject, created_at) VALUES (?, ?, ?)', [
|
|
759
|
+
'user-1',
|
|
760
|
+
'Cannot log in',
|
|
761
|
+
Date.now()
|
|
762
|
+
]);
|
|
763
|
+
|
|
764
|
+
// 4. Pinned inserts: `insertShard()` writes to a specific shard, still
|
|
765
|
+
// capturing the generated id mapping.
|
|
766
|
+
const ticketB = await insertShard('db-west', 'INSERT INTO tickets (user_id, subject, created_at) VALUES (?, ?, ?) RETURNING id', [
|
|
767
|
+
'user-1',
|
|
768
|
+
'Mobile sync is slow',
|
|
769
|
+
Date.now()
|
|
770
|
+
]);
|
|
771
|
+
|
|
772
|
+
// 5. Routed reads: `first` and `all` resolve the shard from the mapping.
|
|
773
|
+
const user = await first<{ id: string; name: string; email: string }>('user-1', 'SELECT id, name, email FROM users WHERE id = ?', [
|
|
774
|
+
'user-1'
|
|
775
|
+
]);
|
|
776
|
+
|
|
777
|
+
const ticket = await first<{ id: number; subject: string }>(String(ticketA.generatedId), 'SELECT id, subject FROM tickets WHERE id = ?', [
|
|
778
|
+
ticketA.generatedId
|
|
779
|
+
]);
|
|
780
|
+
|
|
781
|
+
// 6. Cross-shard aggregates: the emulator evaluates COUNT/MAX/MIN/SUM/AVG and
|
|
782
|
+
// COALESCE during SELECT, so utility queries like `SELECT COALESCE(MAX(id),
|
|
783
|
+
// 0) + 1 AS next FROM tickets` work the same way they do in production.
|
|
784
|
+
const totals = await countAllShards('tickets');
|
|
785
|
+
|
|
786
|
+
const recentTickets = await allAllShardsGlobal<{ id: number; subject: string; created_at: number }>(
|
|
787
|
+
'SELECT id, subject, created_at FROM tickets WHERE user_id = ?',
|
|
788
|
+
['user-1'],
|
|
789
|
+
{ sortBy: 'created_at', sortDirection: 'desc', limit: 10 }
|
|
790
|
+
);
|
|
791
|
+
|
|
792
|
+
console.log({ user, ticket, ticketB: ticketB.generatedId, totals, recent: recentTickets.results });
|
|
793
|
+
```
|
|
794
|
+
|
|
795
|
+
What this example demonstrates:
|
|
796
|
+
|
|
797
|
+
- **Routing through `run`, `first`, `all`, and `insert` works end-to-end** without a real database. The hash strategy assigns each new primary key to a shard the same way it would in production.
|
|
798
|
+
- **Auto-increment + RETURNING** are honored. `insert()` captures the generated id from either provider metadata or `RETURNING id` rows.
|
|
799
|
+
- **Aggregate SQL is evaluated** (`COUNT(*)`, `MIN`, `MAX`, `SUM`, `AVG`, `COALESCE`, simple arithmetic), and **compound `WHERE`** with `AND` / `OR` / parens / `LIKE` / `IS NULL` is honored on UPDATE, DELETE, and SELECT.
|
|
800
|
+
- **Cross-shard fanout helpers** (`countAllShards`, `allAllShardsGlobal`) operate over the in-memory store exactly as they would over D1/Postgres/MySQL.
|
|
801
|
+
- **No data leaks between tests**: call `resetConfig()` (and instantiate fresh providers) to start each test with a clean state.
|
|
802
|
+
|
|
692
803
|
### Migrating from In-Memory to Production Providers
|
|
693
804
|
|
|
694
805
|
When ready to migrate from testing to production:
|
package/dist/index.js
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
var A6=Object.defineProperty;var L6=(J)=>J;function V6(J,$){this[J]=L6.bind(null,$)}var vJ=(J,$)=>{for(var X in $)A6(J,X,{get:$[X],enumerable:!0,configurable:!0,set:V6.bind($,X)})};var HJ=(J,$)=>()=>(J&&($=J(J=0)),$);var j;var K=HJ(()=>{j=class j extends Error{code;constructor(J,$){super(J);if(this.name="CollegeDBError",this.code=$,Error.captureStackTrace)Error.captureStackTrace(this,j)}}});var _J={};vJ(_J,{KVShardMapper:()=>q});class q{kv;hashKeys;hashCache=new Map;mappingCache=new Map;knownShardsCache={shards:null,expiresAt:0};mappingCacheTtlMs;knownShardsCacheTtlMs;constructor(J,$={}){this.kv=J,this.hashKeys=$.hashShardMappings??!0,this.mappingCacheTtlMs=$.mappingCacheTtlMs??E6,this.knownShardsCacheTtlMs=$.knownShardsCacheTtlMs??T6}getCachedMapping(J){let $=this.mappingCache.get(J);if(!$)return;if($.expiresAt<Date.now()){this.mappingCache.delete(J);return}return $.mapping}setCachedMapping(J,$){if(this.mappingCache.size>50000){let X=this.mappingCache.keys().next().value;if(X)this.mappingCache.delete(X)}this.mappingCache.set(J,{mapping:$,expiresAt:Date.now()+this.mappingCacheTtlMs})}async cacheMappingForKeys(J,$){let X=await Promise.all(J.map((Y)=>this.hashKey(Y)));for(let Y of X)this.setCachedMapping(Y,$)}getCachedKnownShards(){if(this.knownShardsCache.shards&&this.knownShardsCache.expiresAt>=Date.now())return[...this.knownShardsCache.shards];return null}setCachedKnownShards(J){this.knownShardsCache.shards=[...J],this.knownShardsCache.expiresAt=Date.now()+this.knownShardsCacheTtlMs}async hashKey(J){if(!this.hashKeys)return J;let $=this.hashCache.get(J);if($)return $;let Y=new TextEncoder().encode(J),Z=await crypto.subtle.digest("SHA-256",Y),W=new Uint8Array(Z),G=Array.from(W).map((U)=>U.toString(16).padStart(2,"0")).join("");if(this.hashCache.size<1e4)this.hashCache.set(J,G);return G}async getShardMapping(J){let $=await this.hashKey(J),X=this.getCachedMapping($);if(X!==void 0)return X;let Y=`${x}${$}`,Z=await this.kv.get(Y,"json");if(Z)return this.setCachedMapping($,Z),Z;let W=await this.kv.get(`${k}${$}`,"json");if(W){let G={shard:W.shard,createdAt:W.createdAt,updatedAt:W.updatedAt,originalKey:this.hashKeys?void 0:J};if(this.setCachedMapping($,G),this.hashKeys)for(let U of W.keys)this.setCachedMapping(U,G);return G}return this.setCachedMapping($,null),null}async setShardMapping(J,$,X=[]){let Y=[J,...X],Z=Date.now(),W={shard:$,createdAt:Z,updatedAt:Z,originalKey:this.hashKeys?void 0:J};if(Y.length===1){let G=await this.hashKey(J),U=`${x}${G}`;await this.kv.put(U,JSON.stringify(W)),this.setCachedMapping(G,W)}else{let G=await this.hashKey(J),U=`${k}${G}`,H=this.hashKeys?await Promise.all(Y.map((F)=>this.hashKey(F))):Y,_={shard:$,createdAt:Z,updatedAt:Z,keys:H};await this.kv.put(U,JSON.stringify(_));let O=Y.map(async(F)=>{let A=await this.hashKey(F),T=`${x}${A}`,I={shard:$,createdAt:Z,updatedAt:Z,originalKey:this.hashKeys?void 0:F};return this.kv.put(T,JSON.stringify(I))});await Promise.all(O),await this.cacheMappingForKeys(Y,W)}}async updateShardMapping(J,$){let X=await this.getShardMapping(J);if(!X)throw new j(`No existing mapping found for primary key: ${J}`,"MAPPING_NOT_FOUND");let Y=await this.hashKey(J),Z=`${x}${Y}`,W=`${k}${Y}`,G=await this.kv.get(W,"json");if(G){let U=Date.now(),H={...G,shard:$,updatedAt:U};await this.kv.put(W,JSON.stringify(H));let _=G.keys.length>0?this.hashKeys?G.keys:G.keys:[await this.hashKey(J)],O=_.map(async(A)=>{let T=`${x}${A}`,I={...X,shard:$,updatedAt:U};return this.kv.put(T,JSON.stringify(I))});await Promise.all(O);let F={...X,shard:$,updatedAt:U};if(this.hashKeys)for(let A of _)this.setCachedMapping(A,F);this.setCachedMapping(Y,F)}else{let U={...X,shard:$,updatedAt:Date.now()};await this.kv.put(Z,JSON.stringify(U)),this.setCachedMapping(Y,U)}}async deleteShardMapping(J){let $=await this.hashKey(J),X=`${x}${$}`,Y=`${k}${$}`,Z=await this.kv.get(Y,"json");if(Z){await this.kv.delete(Y);let W=Z.keys.length>0?this.hashKeys?Z.keys:Z.keys:[await this.hashKey(J)],G=W.map(async(U)=>{let H=`${x}${U}`;return this.kv.delete(H)});if(await Promise.all(G),this.hashKeys)for(let U of W)this.setCachedMapping(U,null);this.setCachedMapping($,null)}else await this.kv.delete(X),this.setCachedMapping($,null)}async getKnownShards(){let J=this.getCachedKnownShards();if(J)return J;let X=await this.kv.get(CJ,"json")||[];return this.setCachedKnownShards(X),X}async setKnownShards(J){if(!J||J.length===0)return;let $=[...new Set(J.filter(Boolean))];if($.length===0)return;await this.kv.put(CJ,JSON.stringify($)),this.setCachedKnownShards($)}async addKnownShard(J){if(!J)return;let $=await this.getKnownShards();if(!$.includes(J))$.push(J),await this.setKnownShards($)}async getKeysForShard(J){let $=[],X=await this.kv.list({prefix:x});for(let Z of X.keys){let W=await this.kv.get(Z.name,"json");if(W?.shard===J){let G=Z.name.replace(x,"");if(W.originalKey)$.push(W.originalKey);else if(!this.hashKeys)$.push(G)}}let Y=await this.kv.list({prefix:k});for(let Z of Y.keys){let W=await this.kv.get(Z.name,"json");if(W?.shard===J)$.push(...W.keys)}return[...new Set($)]}async getShardKeyCounts(){let J={},$=await this.kv.list({prefix:x});for(let Y of $.keys){let Z=await this.kv.get(Y.name,"json");if(Z)J[Z.shard]=(J[Z.shard]||0)+1}let X=await this.kv.list({prefix:k});for(let Y of X.keys){let Z=await this.kv.get(Y.name,"json");if(Z)J[Z.shard]=(J[Z.shard]||0)+Z.keys.length}return J}async clearAllMappings(){let $=(await this.kv.list({prefix:x})).keys.map((Z)=>this.kv.delete(Z.name)),Y=(await this.kv.list({prefix:k})).keys.map((Z)=>this.kv.delete(Z.name));await Promise.all([...$,...Y]),this.mappingCache.clear()}async addLookupKeys(J,$){let X=await this.getShardMapping(J);if(!X)throw new j(`No existing mapping found for primary key: ${J}`,"MAPPING_NOT_FOUND");let Y=await this.hashKey(J),Z=`${k}${Y}`,W=await this.kv.get(Z,"json"),G=[J,...$],U=Date.now();if(!W){let O=this.hashKeys?await Promise.all(G.map((F)=>this.hashKey(F))):G;W={shard:X.shard,createdAt:X.createdAt,updatedAt:U,keys:O}}else{let O=this.hashKeys?await Promise.all(G.map((F)=>this.hashKey(F))):G;W={...W,updatedAt:U,keys:[...new Set([...W.keys,...O])]}}await this.kv.put(Z,JSON.stringify(W));let H=$.map(async(O)=>{let F=await this.hashKey(O),A=`${x}${F}`,T={shard:X.shard,createdAt:X.createdAt,updatedAt:U,originalKey:this.hashKeys?void 0:O};return this.kv.put(A,JSON.stringify(T))});await Promise.all(H);let _={shard:X.shard,createdAt:X.createdAt,updatedAt:U,originalKey:X.originalKey};await this.cacheMappingForKeys([J,...$],_)}async setShardMappingsBatch(J,$={}){if(J.length===0)return;let X=Math.max(1,$.concurrency??25),Y=0,Z=Array(Math.min(X,J.length)).fill(null).map(async()=>{while(Y<J.length){let W=Y++,G=J[W];if(!G)continue;await this.setShardMapping(G.primaryKey,G.shard,G.additionalKeys||[])}});await Promise.all(Z)}async getAllLookupKeys(J){let $=await this.hashKey(J),X=`${k}${$}`,Y=await this.kv.get(X,"json");if(Y)return Y.keys;let Z=await this.getShardMapping(J);if(Z)return Z.originalKey?[Z.originalKey]:[J];throw new j(`No mapping found for key: ${J}`,"MAPPING_NOT_FOUND")}}var x="shard:",k="multikey:",CJ="known_shards",E6=30000,T6=1e4;var d=HJ(()=>{K()});var e={};vJ(e,{validateTableForSharding:()=>r,schemaExists:()=>jJ,migrateRecord:()=>qJ,listTables:()=>p,integrateExistingDatabase:()=>bJ,dropSchema:()=>SJ,discoverExistingRecordsWithColumns:()=>a,discoverExistingPrimaryKeys:()=>i,createSchemaAcrossShards:()=>KJ,createSchema:()=>FJ,createMappingsForExistingKeys:()=>fJ,clearShardMigrationCache:()=>yJ,clearMigrationCache:()=>gJ,checkMigrationNeeded:()=>pJ,autoDetectAndMigrate:()=>hJ});async function kJ(J,$,X){if(J.length===0)return;let Y=Math.max(1,Math.min($,J.length)),Z=0,W=Array(Y).fill(null).map(async()=>{while(Z<J.length){let G=Z++,U=J[G];if(U===void 0)continue;await X(U,G)}});await Promise.all(W)}function I6(J,$,X,Y){let Z=X.length;switch(Y){case"hash":{let W=0;for(let U=0;U<J.length;U++){let H=J.charCodeAt(U);W=(W<<5)-W+H,W=W&W}let G=Math.abs(W)%Z;return X[G]}case"random":return X[Math.floor(Math.random()*Z)];default:return X[$%Z]}}async function FJ(J,$){let X=$.split(";").map((Y)=>Y.trim()).filter((Y)=>Y.length>0&&!Y.startsWith("--"));for(let Y of X)try{await J.prepare(Y).run()}catch(Z){throw console.error("Failed to execute schema statement:",Y,Z),new j(`Schema migration failed: ${Z}`,"SCHEMA_MIGRATION_FAILED")}}async function KJ(J,$){let X=Object.entries(J).map(([Y,Z])=>{return FJ(Z,$).catch((W)=>{throw new j(`Failed to create schema on shard ${Y}: ${W.message}`,"SCHEMA_CREATION_FAILED")})});await Promise.all(X)}async function jJ(J,$){try{return await J.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name=?").bind($).first()!==null}catch{return!1}}async function SJ(J,...$){for(let X of $)try{await J.prepare(`DROP TABLE IF EXISTS ${X}`).run()}catch(Y){console.error(`Failed to drop table ${X}:`,Y)}}async function p(J){try{return(await J.prepare("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name").all()).results.map((X)=>X.name)}catch{return[]}}async function qJ(J,$,X,Y){let Z=await J.prepare(`SELECT * FROM ${Y} WHERE id = ?`).bind(X).first();if(!Z)throw new j(`Record with primary key ${X} not found in source database`,"RECORD_NOT_FOUND");if(!await jJ($,Y))await FJ($,Y);let W=Object.keys(Z),G=W.map(()=>"?").join(", "),U=W.map((_)=>Z[_]),H=`INSERT OR REPLACE INTO ${Y} (${W.join(", ")}) VALUES (${G})`;await $.prepare(H).bind(...U).run(),await J.prepare(`DELETE FROM ${Y} WHERE id = ?`).bind(X).run()}async function i(J,$,X="id"){try{return(await J.prepare(`SELECT ${X} FROM ${$}`).all()).results.map((Z)=>String(Z[X]))}catch(Y){throw new j(`Failed to discover primary keys in table ${$}: ${Y}`,"DISCOVERY_FAILED")}}async function a(J,$,X="id"){try{let Y=`${$}_columns`,Z;if(OJ.has(Y))Z=OJ.get(Y).map((H)=>H.name);else{let _=(await J.prepare(`PRAGMA table_info(${$})`).all()).results.map((O)=>({name:O.name,type:O.type}));OJ.set(Y,_),Z=_.map((O)=>O.name)}let W=[X];if(Z.includes("username"))W.push("username");if(Z.includes("email"))W.push("email");if(Z.includes("name"))W.push("name");let G=`SELECT ${W.join(", ")} FROM ${$}`;return(await J.prepare(G).all()).results}catch(Y){throw new j(`Failed to discover records with columns in table ${$}: ${Y}`,"DISCOVERY_FAILED")}}async function fJ(J,$,X,Y,Z={}){if(J.length===0||$.length===0)return;let W=Math.max(1,Z.concurrency??25),G=J.map((U,H)=>({primaryKey:U,shard:I6(U,H,$,X)}));await Y.setShardMappingsBatch(G,{concurrency:W})}async function r(J,$,X){let Y=[],Z=0;try{if(!await J.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name=?").bind($).first())return Y.push(`Table '${$}' does not exist`),{isValid:!1,tableName:$,primaryKeyColumn:X,recordCount:0,issues:Y};if(!(await J.prepare(`PRAGMA table_info(${$})`).all()).results.some((_)=>_.name===X&&_.pk===1))Y.push(`Primary key column '${X}' not found or not set as primary key`);if(Z=(await J.prepare(`SELECT COUNT(*) as count FROM ${$}`).first())?.count||0,Z===0)Y.push(`Table '${$}' is empty`)}catch(W){Y.push(`Database validation error: ${W}`)}return{isValid:Y.length===0,tableName:$,primaryKeyColumn:X,recordCount:Z,issues:Y}}async function bJ(J,$,X,Y={}){let{tables:Z,primaryKeyColumn:W="id",strategy:G="hash",addShardMappingsTable:U=!0,dryRun:H=!1,migrateOtherColumns:_=!1,concurrency:O=25}=Y,F=Math.max(1,O),A=[],T=0,I=0,L=0;try{let V=(Z||await p(J)).filter((E)=>E!=="shard_mappings");for(let E of V)try{let M=await r(J,E,W);if(!M.isValid){A.push(`Table ${E}: ${M.issues.join(", ")}`);continue}if(_){let z=await a(J,E,W);if(z.length===0){A.push(`Table ${E} has no records to process`);continue}if(!H){let D=z.map((P)=>{let GJ=String(P[W]),h=[];if(P.username&&typeof P.username==="string")h.push(`username:${P.username}`);if(P.email&&typeof P.email==="string")h.push(`email:${P.email}`);if(P.name&&typeof P.name==="string")h.push(`name:${P.name}`);return{primaryKey:GJ,shard:$,additionalKeys:h}});await X.setShardMappingsBatch(D,{concurrency:F}),L+=D.length}I+=z.length}else{let z=await i(J,E,W);if(z.length===0){A.push(`Table ${E} has no records to process`);continue}if(!H){let D=z.map((P)=>({primaryKey:P,shard:$}));await X.setShardMappingsBatch(D,{concurrency:F}),L+=D.length}I+=z.length}T++}catch(M){A.push(`Failed to process table ${E}: ${M}`)}if(U&&!H){if(!(await p(J)).includes("shard_mappings"))await J.prepare(`
|
|
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(`
|
|
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(!
|
|
8
|
-
SELECT ${Z} FROM ${
|
|
7
|
+
);`.trim()).run()}if(!_)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 Y6(J,$,X,Y={}){let{primaryKeyColumn:Z="id",tablesToCheck:G,skipCache:H=!1,maxRecordsToCheck:U=1000,migrateOtherColumns:_=!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(),NJ)),P=new E(X.kv,{hashShardMappings:X.hashShardMappings,mappingCacheTtlMs:X.mappingCacheTtlMs,knownShardsCacheTtlMs:X.knownShardsCacheTtlMs}),M=await d(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(U,L.recordCount),h=await J.prepare(`
|
|
8
|
+
SELECT ${Z} FROM ${V}
|
|
9
9
|
ORDER BY ${Z}
|
|
10
|
-
LIMIT ?`.trim()).bind(
|
|
10
|
+
LIMIT ?`.trim()).bind(C).all(),I=0,IJ=h.results.slice(0,10).map(async(S)=>{let v=String(S[Z]);return{key:v,mapping:await P.getShardMapping(v)}}),m=await Promise.all(IJ);for(let S of m)if(!S.mapping)I++,T=!0;if(I>0){if(X.debug)console.log(`Auto-migrating table ${V} in shard ${$} (${L.recordCount} records)`);if(_){let S=await WJ(J,V,Z),v=[];if(await iJ(S,W,async(w)=>{let BJ=String(w[Z]);if(await P.getShardMapping(BJ))return;let _J=[];if(w.username&&typeof w.username==="string")_J.push(`username:${w.username}`);if(w.email&&typeof w.email==="string")_J.push(`email:${w.email}`);if(w.name&&typeof w.name==="string")_J.push(`name:${w.name}`);v.push({primaryKey:BJ,shard:$,additionalKeys:_J})}),v.length>0)await P.setShardMappingsBatch(v,{concurrency:W});Q+=v.length}else{let S=await FJ(J,V,Z),v=[];if(await iJ(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(f.set(F,!0),B&&X.debug)console.log(`Auto-migration completed for shard ${$}: ${T} records from ${I} tables`)}catch(V){A.push(`Auto-migration error: ${V}`)}return{migrationNeeded:L,migrationPerformed:B,recordsMigrated:T,tablesProcessed:I,issues:A}}async function pJ(J,$,X){let Y=`${$}_migration_check`;if(f.has(Y))return!1;try{let Z=await p(J);if(Z.includes("shard_mappings"))return f.set(Y,!0),!1;let{KVShardMapper:G}=await Promise.resolve().then(() => (d(),_J)),U=new G(X.kv,{hashShardMappings:X.hashShardMappings,mappingCacheTtlMs:X.mappingCacheTtlMs,knownShardsCacheTtlMs:X.knownShardsCacheTtlMs}),H=Z.filter((_)=>_!=="shard_mappings"&&!_.startsWith("sqlite_")&&_!=="sqlite_sequence");for(let _ of H.slice(0,3))try{if(((await J.prepare(`SELECT COUNT(*) as count FROM ${_} LIMIT 1`).first())?.count||0)>0){let A=await J.prepare(`SELECT id FROM ${_} LIMIT 1`).first();if(A){let T=String(A.id);if(!await U.getShardMapping(T))return!0}}}catch{continue}return!1}catch{return!1}}function gJ(){f.clear()}function yJ(J){let $=`${J}_migration_check`;f.delete($)}var f,OJ;var o=HJ(()=>{K();f=new Map,OJ=new Map});K();d();var n=null,g=null,m=new Map,y=0;function C(J){if(!g)g=new q(J.kv,{hashShardMappings:J.hashShardMappings,mappingCacheTtlMs:J.mappingCacheTtlMs,knownShardsCacheTtlMs:J.knownShardsCacheTtlMs});return g}function Q6(J){n=J,g=new q(J.kv,{hashShardMappings:J.hashShardMappings,mappingCacheTtlMs:J.mappingCacheTtlMs,knownShardsCacheTtlMs:J.knownShardsCacheTtlMs}),m.clear(),y=0;try{let $=C(J);Promise.resolve().then(async()=>{let X=await $.getKnownShards(),Y=Array.from(new Set([...X,...Object.keys(J.shards)]));await $.setKnownShards(Y)}).catch(()=>{return})}catch{}if(J.shards&&Object.keys(J.shards).length>0&&!J.disableAutoMigration)dJ(J).catch(($)=>{console.warn("Background auto-migration failed:",$)})}async function cJ(J){n=J,g=new q(J.kv,{hashShardMappings:J.hashShardMappings,mappingCacheTtlMs:J.mappingCacheTtlMs,knownShardsCacheTtlMs:J.knownShardsCacheTtlMs}),m.clear(),y=0;try{let $=C(J),X=await $.getKnownShards(),Y=Array.from(new Set([...X,...Object.keys(J.shards)]));await $.setKnownShards(Y)}catch{}if(J.shards&&Object.keys(J.shards).length>0&&!J.disableAutoMigration)try{await dJ(J)}catch($){console.warn("Auto migration failed:",$)}}async function P6(J,$){return await cJ(J),await $()}async function dJ(J){try{let{autoDetectAndMigrate:$}=await Promise.resolve().then(() => (o(),e)),X=Object.keys(J.shards);if(J.debug)console.log(`\uD83D\uDD0D Checking ${X.length} shards for existing data...`);let Y=X.map(async(G)=>{let U=J.shards[G];if(!U)return null;try{let H=await $(U,G,J,{maxRecordsToCheck:1000});return{shardName:G,...H}}catch(H){return console.warn(`Auto-migration failed for shard ${G}:`,H),null}}),W=(await Promise.all(Y)).filter((G)=>G?.migrationPerformed);if(J.debug)if(W.length>0){let G=W.reduce((U,H)=>U+(H?.recordsMigrated||0),0);console.log(`\uD83C\uDF89 Auto-migration completed! Migrated ${G} records across ${W.length} shards`),W.forEach((U)=>{if(U)console.log(` ✅ ${U.shardName}: ${U.recordsMigrated} records from ${U.tablesProcessed} tables`)})}else console.log("✅ All shards ready - no migration needed")}catch($){console.warn("Background auto-migration setup failed:",$)}}function D6(){n=null,g=null,m.clear(),y=0}function R(){if(!n)throw new j("CollegeDB not initialized. Call initialize() first.","NOT_INITIALIZED");return n}function R6(J){let $=J.trim().toUpperCase();if($.startsWith("SELECT")||$.startsWith("VALUES")||$.startsWith("TABLE")||$.startsWith("PRAGMA")||$.startsWith("EXPLAIN")||$.startsWith("WITH")||$.startsWith("SHOW"))return"read";return"write"}function oJ(J,$){let X=J.strategy||"hash";if(typeof X==="string")return X;let Y=X;return Y[$]||Y.write||Y.read||"hash"}function z6(J,$){if(J===$)return 0;let X={wnam:{lat:37.7749,lon:-122.4194},enam:{lat:40.7128,lon:-74.006},weur:{lat:51.5074,lon:-0.1278},eeur:{lat:52.52,lon:13.405},apac:{lat:35.6762,lon:139.6503},oc:{lat:-33.8688,lon:151.2093},me:{lat:25.2048,lon:55.2708},af:{lat:-26.2041,lon:28.0473}},Y=X[J],Z=X[$],W=Y.lat-Z.lat,G=Y.lon-Z.lon;return Math.sqrt(W*W+G*G)}function M6(J){let $=J.cf;if(!$||!$.country)return"wnam";let{country:X,continent:Y}=$;if(["US","CA","MX"].includes(X)){let Z=$.region||$.regionCode||"",W=$.timezone||"";if(Z.includes("CA")||Z.includes("WA")||Z.includes("OR")||Z.includes("NV")||Z.includes("AZ")||Z.includes("UT")||W.includes("Pacific")||W.includes("America/Los_Angeles"))return"wnam";return"enam"}if(["GL","PM","BM"].includes(X))return"enam";if(["GB","IE","FR","ES","PT","NL","BE","LU","CH","AT","IT"].includes(X))return"weur";if(["DE","PL","CZ","SK","HU","SI","HR","BA","RS","ME","MK","AL","BG","RO","MD","UA","BY","LT","LV","EE","FI","SE","NO","DK","IS"].includes(X))return"eeur";if(X==="RU")return"eeur";if(["JP","KR","CN","HK","TW","MO","MN","KP"].includes(X))return"apac";if(["TH","VN","SG","MY","ID","PH","BN","KH","LA","MM","TL","IN","PK","BD","LK","NP","BT","MV","AF"].includes(X))return"apac";if(["AU","NZ","PG","FJ","NC","VU","SB","WS","TO","KI","NR","PW","FM","MH","TV"].includes(X))return"oc";if(["AE","SA","QA","KW","BH","OM","YE","IQ","IR","SY","LB","JO","IL","PS","TR","CY"].includes(X))return"me";if(Y==="AF"||["EG","LY","TN","DZ","MA","SD","SS","ET","ER","DJ","SO"].includes(X))return"af";if(["KZ","UZ","TM","TJ","KG"].includes(X))return"eeur";if(Y==="SA"||["BR","AR","CL","PE","CO","VE","EC","BO","PY","UY","GY","SR","GF"].includes(X))return"enam";if(["GT","BZ","SV","HN","NI","CR","PA","CU","JM","HT","DO","PR","TT","BB","GD","VC","LC","DM","AG","KN"].includes(X))return"enam";return"wnam"}function B6(J){if(typeof J==="string")return J;return J.region||"wnam"}async function JJ(J){try{let[$,X]=await Promise.all([J.prepare("PRAGMA page_count").first(),J.prepare("PRAGMA page_size").first()]);if(!$?.page_count||!X?.page_size)throw new j("Failed to retrieve database size information","SIZE_QUERY_FAILED");return $.page_count*X.page_size}catch($){throw new j(`Failed to get database size: ${$ instanceof Error?$.message:"Unknown error"}`,"SIZE_QUERY_FAILED")}}async function w6(J,$){let X=Math.max(0,$.sizeCacheTtlMs??30000),Y=m.get(J);if(Y&&Y.expiresAt>=Date.now())return Y.size;let Z=$.shards[J];if(!Z)throw new j(`Shard ${J} not found in configuration`,"SHARD_NOT_FOUND");let W=await JJ(Z);if(X>0)m.set(J,{size:W,expiresAt:Date.now()+X});return W}async function nJ(J,$){if(typeof $.maxDatabaseSize!=="number"||!Number.isFinite($.maxDatabaseSize)||$.maxDatabaseSize<=0)return J;let X=$.maxDatabaseSize,Z=(await Promise.allSettled(J.map(async(W)=>{let G=await w6(W,$);return{shard:W,size:G,withinLimit:G<X}}))).filter((W)=>W.status==="fulfilled"&&W.value.withinLimit).map((W)=>W.value.shard);if(Z.length===0){if($.debug)console.warn("All shards exceed maxDatabaseSize limit. Allowing allocation to prevent failure.");return J}if($.debug&&Z.length<J.length){let W=J.filter((G)=>!Z.includes(G));console.log(`Excluded ${W.length} shards due to size limits: ${W.join(", ")}`)}return Z}function N6(J,$,X,Y){let Z=$.filter((O)=>X[O]);if(Z.length===0){let O=0;for(let A=0;A<Y.length;A++){let T=Y.charCodeAt(A);O=(O<<5)-O+T,O=O&O}let F=Math.abs(O)%$.length;return $[F]}let W=Z.map((O)=>{let F=X[O],A=z6(J,B6(F)),T=typeof F==="object"?F.priority||1:1,I=A-T*0.1;return{shard:O,score:I,distance:A,priority:T}});W.sort((O,F)=>O.score-F.score);let G=W[0].score,U=W.filter((O)=>Math.abs(O.score-G)<0.01);if(U.length===1)return U[0].shard;let H=0;for(let O=0;O<Y.length;O++){let F=Y.charCodeAt(O);H=(H<<5)-H+F,H=H&H}let _=Math.abs(H)%U.length;return U[_].shard}function u(J,$,X,Y){switch(J){case"hash":{let Z=0;for(let G=0;G<$.length;G++){let U=$.charCodeAt(G);Z=(Z<<5)-Z+U,Z=Z&Z}let W=Math.abs(Z)%X.length;return X[W]||X[0]}case"location":{if(!Y.targetRegion)return u("hash",$,X,Y);return N6(Y.targetRegion,X,Y.shardLocations||{},$)}case"random":return X[Math.floor(Math.random()*X.length)]||X[0];default:return u("hash",$,X,Y)}}async function lJ(J,$="write"){let X=R(),Y=C(X),Z=await Y.getShardMapping(J);if(Z)return Z.shard;let W=Object.keys(X.shards);if(W.length===0)throw new j("No shards configured","NO_SHARDS");let G=await nJ(W,X),U,H=oJ(X,$);if(X.coordinator)try{let _=X.coordinator.idFromName("default"),F=await X.coordinator.get(_).fetch("http://coordinator/allocate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({primaryKey:J,strategy:H,operationType:$,targetRegion:X.targetRegion,shardLocations:X.shardLocations,availableShards:G})});if(F.ok)U=(await F.json()).shard;else U=u(H,J,G,X)}catch(_){console.warn("Coordinator allocation failed, falling back to local strategy:",_),U=u(H,J,G,X)}else U=u(H,J,G,X);return await Y.setShardMapping(J,U),U}async function x6(J,$="write"){let X=R(),Y=await lJ(J,$),Z=X.shards[Y];if(!Z)throw new j(`Shard ${Y} not found in configuration`,"SHARD_NOT_FOUND");return Z}async function v6(J,$){let{createSchema:X}=await Promise.resolve().then(() => (o(),e));await X(J,$)}async function $J(J,$){let X=R6($);return(await x6(J,X)).prepare($)}async function sJ(J,$,X=[]){let Z=await(await $J(J,$)).bind(...X).run();if(!Z.success)throw new j(`Query failed: ${Z.error||"Unknown error"}`,"QUERY_FAILED");return Z}function C6(J){let $=J.results[0];if($&&typeof $==="object"){for(let Y of["id","ID","Id","rowid","ROWID","RowId","last_row_id","lastInsertId","insertId"]){let Z=$[Y];if(Z!==void 0&&Z!==null)return Z}for(let[Y,Z]of Object.entries($)){let W=Y.toLowerCase();if((W==="id"||W==="rowid")&&(typeof Z==="number"||typeof Z==="string"))return Z}for(let Y of Object.values($))if(typeof Y==="number"||typeof Y==="string")return Y}let X=J.meta.last_row_id;if(X!==void 0&&X!==null)return X;return}function k6(){return`insert:${Date.now()}:${Math.random().toString(36).slice(2)}`}async function K6(){let J=R(),$=Object.keys(J.shards);if($.length===0)throw new j("No shards configured","NO_SHARDS");let X=await nJ($,J);if(X.length===0)throw new j("No shards available for insert","NO_SHARDS");let Y=oJ(J,"write"),Z=k6();if(J.coordinator)try{let W=J.coordinator.idFromName("default"),U=await J.coordinator.get(W).fetch("http://coordinator/allocate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({primaryKey:Z,strategy:Y,operationType:"write",targetRegion:J.targetRegion,shardLocations:J.shardLocations,availableShards:X})});if(U.ok)return(await U.json()).shard}catch(W){console.warn("Coordinator allocation for insert failed, falling back to local strategy:",W)}if(Y==="round-robin"){let W=X[y%X.length];return y=(y+1)%X.length,W}return u(Y,Z,X,J)}async function tJ(J,$,X=[]){let Y=R();if(!Y.shards[J])throw new j(`Shard ${J} not found`,"SHARD_NOT_FOUND");let W=/\breturning\b/i.test($)?await XJ(J,$,X):await AJ(J,$,X),G=C6(W);if(G===void 0)throw new j("Insert did not return a generated primary key","GENERATED_KEY_UNAVAILABLE");return await C(Y).setShardMapping(String(G),J),{...W,generatedId:G}}async function S6(J,$=[]){let X=await K6();return await tJ(X,J,$)}async function q6(J,$,X=[]){return await tJ(J,$,X)}async function iJ(J,$,X=[]){let Z=await(await $J(J,$)).bind(...X).all();if(!Z.success)throw new j(`Query failed: ${Z.error||"Unknown error"}`,"QUERY_FAILED");return Z}async function aJ(J,$,X=[]){return await(await $J(J,$)).bind(...X).first()}async function f6(J,$,X=[],Y=50){let Z=R(),G=await C(Z).getShardMapping(J);if(G){if(Z.shards[G.shard]){let _=await XJ(G.shard,$,X);if(_.success&&_.results.length>0)return _}}let U=await YJ($,X,Y);return eJ(U)}async function b6(J,$,X=[],Y=50){let Z=R(),G=await C(Z).getShardMapping(J);if(G){if(Z.shards[G.shard]){let _=await LJ(G.shard,$,X);if(_!==null)return _}}return(await $6($,X,Y)).find((H)=>H!==null)??null}async function h6(J,$,X){let Y=R();if(!Y.shards[$])throw new j(`Shard ${$} not found in configuration`,"SHARD_NOT_FOUND");let Z=C(Y),W=await Z.getShardMapping(J);if(!W)throw new j(`No existing mapping found for primary key: ${J}`,"MAPPING_NOT_FOUND");if(W.shard!==$){let{migrateRecord:G}=await Promise.resolve().then(() => (o(),e)),U=Y.shards[W.shard],H=Y.shards[$];if(!U||!H)throw new j("Source or target shard not available","SHARD_UNAVAILABLE");await G(U,H,J,X)}await Z.updateShardMapping(J,$)}async function p6(){let J=R();if(J.coordinator)try{let $=J.coordinator.idFromName("default"),Y=await J.coordinator.get($).fetch("http://coordinator/shards");if(Y.ok)return await Y.json()}catch($){console.warn("Failed to get shards from coordinator:",$)}try{let X=await C(J).getKnownShards(),Y=new Set([...Object.keys(J.shards),...X]);return Array.from(Y)}catch{return Object.keys(J.shards)}}async function g6(){let J=R();if(J.coordinator)try{let Z=J.coordinator.idFromName("default"),G=await J.coordinator.get(Z).fetch("http://coordinator/stats");if(G.ok)return await G.json()}catch(Z){console.warn("Failed to get stats from coordinator:",Z)}let $=C(J),X=await $.getShardKeyCounts(),Y=Object.keys(J.shards);try{let Z=await $.getKnownShards();Y=Array.from(new Set([...Y,...Z]))}catch{}return Y.map((Z)=>({binding:Z,count:X[Z]||0}))}async function AJ(J,$,X=[]){let Z=R().shards[J];if(!Z)throw new j(`Shard ${J} not found`,"SHARD_NOT_FOUND");let W=await Z.prepare($).bind(...X).run();if(!W.success)throw new j(`Query failed: ${W.error||"Unknown error"}`,"QUERY_FAILED");return W}async function XJ(J,$,X=[]){let Z=R().shards[J];if(!Z)throw new j(`Shard ${J} not found`,"SHARD_NOT_FOUND");return await Z.prepare($).bind(...X).all()}async function LJ(J,$,X=[]){let Z=R().shards[J];if(!Z)throw new j(`Shard ${J} not found`,"SHARD_NOT_FOUND");return await Z.prepare($).bind(...X).first()}async function rJ(J,$=[],X=50){let Y=R(),Z=[];for(let[G,U]of Object.entries(Y.shards)){if(!G||!U){console.error(`Shard ${G??"<null>"} not found, skipping`);continue}Z.push(()=>U.prepare(J).bind(...$).run().catch((H)=>{return console.error(`Error executing query on shard ${G}:`,H),{success:!1,results:[],error:H instanceof Error?H.message:String(H),meta:{duration:0}}}))}let W=[];for(let G=0;G<Z.length;G+=X){let U=Z.slice(G,G+X).map((H)=>H());W.push(...await Promise.all(U))}return W}async function YJ(J,$=[],X=50){let Y=R(),Z=[];for(let[G,U]of Object.entries(Y.shards)){if(!G||!U){console.error(`Shard ${G??"<null>"} not found, skipping`);continue}Z.push(()=>U.prepare(J).bind(...$).all().catch((H)=>{return console.error(`Error executing query on shard ${G}:`,H),{success:!1,results:[],error:H instanceof Error?H.message:String(H),meta:{duration:0}}}))}let W=[];for(let G=0;G<Z.length;G+=X){let U=Z.slice(G,G+X).map((H)=>H());W.push(...await Promise.all(U))}return W}function l(J,$=50){if(!Number.isFinite(J??$))return $;return Math.max(1,Math.floor(J??$))}function y6(J){if(!Number.isFinite(J??0))return 0;return Math.max(0,Math.floor(J??0))}function u6(J){if(J===void 0)return;if(!Number.isFinite(J))return;return Math.max(0,Math.floor(J))}function uJ(J,$){if(typeof $==="function")return $(J);if(!$||typeof J!=="object"||J===null)return;return J[String($)]}function m6(J,$){if(J===$)return 0;if(J===null||J===void 0)return 1;if($===null||$===void 0)return-1;if(typeof J==="number"&&typeof $==="number")return J-$;if(typeof J==="bigint"&&typeof $==="bigint")return J<$?-1:1;if(J instanceof Date&&$ instanceof Date)return J.getTime()-$.getTime();if(typeof J==="boolean"&&typeof $==="boolean")return Number(J)-Number($);return String(J).localeCompare(String($),void 0,{numeric:!0,sensitivity:"base"})}function eJ(J){let $=J.flatMap((W)=>W.results||[]),X=J.filter((W)=>!W.success),Y=J.reduce((W,G)=>W+(G.meta?.duration||0),0);if(X.length===0)return{success:!0,results:$,meta:{duration:Y}};let Z=X.map((W)=>W.error||"Unknown shard query error").filter(Boolean).join("; ");return{success:!1,results:$,error:Z||"One or more shard queries failed",meta:{duration:Y}}}async function J6(J,$=[],X={}){let Y=l(X.batchSize),Z=y6(X.offset),W=u6(X.limit),G=eJ(await YJ(J,$,Y)),U=G.results;if(X.filter)U=U.filter((O)=>X.filter?.(O));if(X.comparator)U=[...U].sort(X.comparator);else if(X.sortBy){let O=X.sortDirection==="desc"?-1:1;U=[...U].sort((F,A)=>{let T=uJ(F,X.sortBy),I=uJ(A,X.sortBy);return m6(T,I)*O})}let H=W===void 0?void 0:Z+W,_=U.slice(Z,H);return{...G,results:_}}async function $6(J,$=[],X=50){let Y=R(),Z=[];for(let[G,U]of Object.entries(Y.shards)){if(!G||!U){console.error(`Shard ${G??"<null>"} not found, skipping`);continue}Z.push(()=>U.prepare(J).bind(...$).first().catch((H)=>{return console.error(`Error executing query on shard ${G}:`,H),null}))}let W=[];for(let G=0;G<Z.length;G+=X){let U=Z.slice(G,G+X).map((H)=>H());W.push(...await Promise.all(U))}return W}async function c6(J,$=[],X={}){return(await J6(J,$,{...X,limit:1})).results[0]??null}async function d6(){let J=R();if(await C(J).clearAllMappings(),m.clear(),J.coordinator)try{let X=J.coordinator.idFromName("default");await J.coordinator.get(X).fetch("http://coordinator/flush",{method:"POST"})}catch(X){console.warn("Failed to flush coordinator:",X)}}async function o6(J){let X=R().shards[J];if(!X)throw new j(`Shard ${J} not found`,"SHARD_NOT_FOUND");return await JJ(X)}var n6=/^[A-Za-z_][A-Za-z0-9_]*$/;function b(J){let $=J.trim();if(!$)throw new j("Identifier cannot be empty","INVALID_IDENTIFIER");let X=$.split(".").map((Y)=>Y.trim());if(X.some((Y)=>!Y||!n6.test(Y)))throw new j(`Invalid SQL identifier: ${J}`,"INVALID_IDENTIFIER");return X.map((Y)=>`"${Y}"`).join(".")}function mJ(J){return J.toLowerCase().replace(/[^a-z0-9_]+/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"")}function l6(J){if(typeof J==="string")return[{name:J}];if(!Array.isArray(J)||J.length===0)throw new j("At least one index column is required","INVALID_INDEX_COLUMNS");return J.map(($)=>{if(typeof $==="string")return{name:$};if(!$?.name)throw new j("Index column name is required","INVALID_INDEX_COLUMNS");return{name:$.name,order:$.order,collate:$.collate}})}function VJ(J,$,X={}){let Y=l6($),Z=b(J),W=X.indexName?X.indexName:["idx",mJ(J),...Y.map((F)=>mJ(F.name))].filter(Boolean).join("_").slice(0,120),G=b(W||"idx_auto"),U=Y.map((F)=>{let A=b(F.name),T=F.order?` ${F.order}`:"",I=F.collate?` COLLATE ${b(F.collate).replace(/"/g,"")}`:"";return`${A}${I}${T}`}).join(", "),H=X.ifNotExists===!1?"":" IF NOT EXISTS",_=X.unique?"UNIQUE ":"",O=X.where?.trim()?` WHERE ${X.where.trim()}`:"";return`CREATE ${_}INDEX${H} ${G} ON ${Z} (${U})${O}`}async function s6(J,$,X,Y={}){let Z=VJ($,X,Y);return sJ(J,Z)}async function t6(J,$,X,Y={}){let Z=VJ($,X,Y);return AJ(J,Z)}async function i6(J,$,X={}){let Y=VJ(J,$,X);return rJ(Y,[],l(X.batchSize))}function EJ(J,$="query-plan"){switch($){case"raw":return`EXPLAIN ${J}`;case"analyze":return`EXPLAIN ANALYZE ${J}`;case"query-plan":default:return`EXPLAIN QUERY PLAN ${J}`}}async function a6(J,$,X=[],Y={}){return iJ(J,EJ($,Y.mode),X)}async function r6(J,$,X=[],Y={}){return XJ(J,EJ($,Y.mode),X)}async function e6(J,$=[],X={}){return YJ(EJ(J,X.mode),$,l(X.batchSize))}async function J7(J,$){let X=b($),Y=await aJ(J,`SELECT COUNT(*) AS row_count FROM ${X}`);if(!Y||Y.row_count===void 0||Y.row_count===null)return 0;return Number(Y.row_count)||0}async function $7(J,$){let X=b($),Y=await LJ(J,`SELECT COUNT(*) AS row_count FROM ${X}`);if(!Y||Y.row_count===void 0||Y.row_count===null)return 0;return Number(Y.row_count)||0}async function X7(J,$=50){let X=R(),Y=l($),W=`SELECT COUNT(*) AS row_count FROM ${b(J)}`,G=[];for(let[_,O]of Object.entries(X.shards)){if(!_||!O)continue;G.push(async()=>{try{let F=await O.prepare(W).first(),A=Number(F?.row_count??0);return{shard:_,count:Number.isFinite(A)?A:0,success:!0}}catch(F){return{shard:_,count:null,success:!1,error:F instanceof Error?F.message:String(F)}}})}let U=[];for(let _=0;_<G.length;_+=Y){let O=G.slice(_,_+Y).map((F)=>F());U.push(...await Promise.all(O))}return{total:U.reduce((_,O)=>_+(O.count??0),0),shards:U}}async function Y7(J){let $=R(),X=await lJ(J,"read"),Y=$.shards[X];if(!Y)throw new j(`Shard ${X} not found in configuration`,"SHARD_NOT_FOUND");return JJ(Y)}async function X6(J=50){let $=R(),X=l(J),Y=[];for(let[W,G]of Object.entries($.shards)){if(!W||!G)continue;Y.push(async()=>{try{return{shard:W,size:await JJ(G),success:!0}}catch(U){return{shard:W,size:null,success:!1,error:U instanceof Error?U.message:String(U)}}})}let Z=[];for(let W=0;W<Y.length;W+=X){let G=Y.slice(W,W+X).map((U)=>U());Z.push(...await Promise.all(G))}return Z}async function Z7(J=50){return(await X6(J)).reduce((X,Y)=>X+(Y.size??0),0)}K();class Y6{state;constructor(J){this.state=J}async getState(){return await this.state.storage.get("coordinator_state")||{knownShards:[],shardStats:{},strategy:"round-robin",roundRobinIndex:0}}async saveState(J){await this.state.storage.put("coordinator_state",J)}async fetch(J){let X=new URL(J.url).pathname,Y=J.method;try{switch(`${Y} ${X}`){case"GET /shards":return this.handleListShards();case"POST /shards":return this.handleAddShard(J);case"DELETE /shards":return this.handleRemoveShard(J);case"GET /stats":return this.handleGetStats();case"POST /stats":return this.handleUpdateStats(J);case"POST /allocate":return this.handleAllocateShard(J);case"POST /flush":return this.handleFlush();case"GET /health":return new Response("OK",{status:200});default:return new Response("Not Found",{status:404})}}catch(Z){return console.error("ShardCoordinator error:",Z),new Response("Internal Server Error",{status:500})}}async handleListShards(){let J=await this.getState();return new Response(JSON.stringify(J.knownShards),{headers:{"Content-Type":"application/json"}})}async handleAddShard(J){let{shard:$}=await J.json();if(!$||typeof $!=="string")return new Response(JSON.stringify({error:"Missing or invalid shard parameter"}),{status:400,headers:{"Content-Type":"application/json"}});let X=await this.getState();if(!X.knownShards.includes($))X.knownShards.push($),X.shardStats[$]={binding:$,count:0,lastUpdated:Date.now()},await this.saveState(X);return new Response(JSON.stringify({success:!0}),{headers:{"Content-Type":"application/json"}})}async handleRemoveShard(J){let{shard:$}=await J.json();if(!$||typeof $!=="string")return new Response(JSON.stringify({error:"Missing or invalid shard parameter"}),{status:400,headers:{"Content-Type":"application/json"}});let X=await this.getState(),Y=X.knownShards.indexOf($);if(Y>-1){if(X.knownShards.splice(Y,1),delete X.shardStats[$],X.roundRobinIndex>=X.knownShards.length)X.roundRobinIndex=0;await this.saveState(X)}return new Response(JSON.stringify({success:!0}),{headers:{"Content-Type":"application/json"}})}async handleGetStats(){let J=await this.getState(),$=Object.values(J.shardStats);return new Response(JSON.stringify($),{headers:{"Content-Type":"application/json"}})}async handleUpdateStats(J){let{shard:$,count:X}=await J.json();if(!$||typeof $!=="string")return new Response(JSON.stringify({error:"Missing or invalid shard parameter"}),{status:400,headers:{"Content-Type":"application/json"}});if(X===void 0||typeof X!=="number")return new Response(JSON.stringify({error:"Missing or invalid count parameter"}),{status:400,headers:{"Content-Type":"application/json"}});let Y=await this.getState();if(Y.shardStats[$])Y.shardStats[$].count=X,Y.shardStats[$].lastUpdated=Date.now(),await this.saveState(Y);return new Response(JSON.stringify({success:!0}),{headers:{"Content-Type":"application/json"}})}async handleAllocateShard(J){let{primaryKey:$,strategy:X,operationType:Y,availableShards:Z}=await J.json();if(!$||typeof $!=="string")return new Response(JSON.stringify({error:"Missing or invalid primaryKey parameter"}),{status:400,headers:{"Content-Type":"application/json"}});let W=await this.getState(),G=Z||W.knownShards;if(G.length===0)return new Response(JSON.stringify({error:"No shards available"}),{status:400,headers:{"Content-Type":"application/json"}});let U=this.resolveStrategy(W.strategy,X,Y||"write"),H=this.selectShard($,W,U,G);if(U==="round-robin")W.roundRobinIndex=(W.roundRobinIndex+1)%G.length,await this.saveState(W);return new Response(JSON.stringify({shard:H}),{headers:{"Content-Type":"application/json"}})}async handleFlush(){return await this.state.storage.deleteAll(),new Response(JSON.stringify({success:!0}),{headers:{"Content-Type":"application/json"}})}resolveStrategy(J,$,X="write"){if($)return $;if(typeof J==="string")return J;return J[X]}selectShard(J,$,X,Y){let Z=Y||$.knownShards;if(Z.length===0)throw new j("No shards available","NO_SHARDS");switch(X){case"round-robin":return Z[$.roundRobinIndex]??Z[0];case"random":return Z[Math.floor(Math.random()*Z.length)];case"hash":{let W=0;for(let U=0;U<J.length;U++){let H=J.charCodeAt(U);W=(W<<5)-W+H,W=W&W}let G=Math.abs(W)%Z.length;return Z[G]}case"location":{let W=$.targetRegion,G=$.shardLocations||{},U=Z.filter((V)=>G[V]);if(!W||U.length===0){let V=0;for(let M=0;M<J.length;M++){let z=J.charCodeAt(M);V=(V<<5)-V+z,V=V&V}let E=Math.abs(V)%Z.length;return Z[E]}let H={wnam:{lat:37.7749,lon:-122.4194},enam:{lat:40.7357,lon:-74.1724},weur:{lat:51.5074,lon:-0.1278},eeur:{lat:52.2297,lon:21.0122},apac:{lat:35.6762,lon:139.6503},oc:{lat:-33.8688,lon:151.2093},me:{lat:25.2048,lon:55.2708},af:{lat:-26.2041,lon:28.0473}},_=(V,E)=>(E in V),O=(V)=>_(H,V)?V:"wnam",F=(V,E)=>{let M=H[O(V)],z=H[O(E)],D=M.lat-z.lat,P=M.lon-z.lon;return Math.sqrt(D*D+P*P)},A=U.map((V)=>{let E=G[V],M=F(W,E.region),z=E.priority||1;return{shard:V,score:M-z*0.1}});A.sort((V,E)=>V.score-E.score);let T=A[0].score,I=A.filter((V)=>Math.abs(V.score-T)<0.01);if(I.length===1)return I[0].shard;let L=0;for(let V=0;V<J.length;V++){let E=J.charCodeAt(V);L=(L<<5)-L+E,L=L&L}let B=Math.abs(L)%I.length;return I[B].shard}default:return Z[0]}}async incrementShardCount(J){let $=await this.getState();if($.shardStats[J])$.shardStats[J].count++,$.shardStats[J].lastUpdated=Date.now(),await this.saveState($)}async decrementShardCount(J){let $=await this.getState();if($.shardStats[J]&&$.shardStats[J].count>0)$.shardStats[J].count--,$.shardStats[J].lastUpdated=Date.now(),await this.saveState($)}}K();d();K();var W7=500;function G6(J,$={}){let X=$.scanCount??W7;return{async get(Y,Z="text"){let W=await J.get(Y);if(W===null)return null;if(Z!=="json")return W;try{return JSON.parse(W)}catch(G){throw new j(`Failed to parse JSON from Redis for key ${Y}: ${G instanceof Error?G.message:String(G)}`,"KV_JSON_PARSE_FAILED")}},async put(Y,Z){await J.set(Y,Z)},async delete(Y){await J.del(Y)},async list(Y){let Z=Y?.prefix??"",W=`${Z}*`,G=Y?.cursor??"0",U=Y?.limit,H=[];do{let _=await A7(J,G,W,X);G=_.cursor;for(let O of _.keys){if(!Z||O.startsWith(Z))H.push(O);if(U&&H.length>=U)break}if(U&&H.length>=U)break}while(G!=="0");return{keys:H.map((_)=>({name:_})),cursor:G,list_complete:G==="0"}}}}function G7(J,$={}){return G6(J,$)}function U6(J,$){if($)return WJ(J,$);return{prepare(X){return new RJ(J,X)}}}function H6(J,$){if($)return WJ(J,$);return{prepare(X){return new zJ(J,X)}}}function U7(J,$){if($)return WJ(J,$);return{prepare(X){return new MJ(J,X)}}}function WJ(J,$){return{prepare(X){return new BJ(J,$,X)}}}function H7(J){return{async get($,X="text"){let Y=await T7(J,$);if(Y===null||Y===void 0)return null;if(X==="json"){if(typeof Y==="string")try{return JSON.parse(Y)}catch(Z){throw new j(`Failed to parse JSON from NuxtHub KV for key ${$}: ${Z instanceof Error?Z.message:String(Z)}`,"KV_JSON_PARSE_FAILED")}return Y}return typeof Y==="string"?Y:JSON.stringify(Y)},async put($,X){await I7(J,$,X)},async delete($){await Q7(J,$)},async list($){let X=$?.prefix??"",Y=await P7(J,X);return{keys:(typeof $?.limit==="number"?Y.slice(0,$.limit):Y).map((W)=>({name:W})),list_complete:!0}}}}function _7(J,$){return U6({query:async(Y,Z=[])=>{let W=$(J.connectionString);if(typeof W.connect==="function")await W.connect();try{return await W.query(Y,Z)}finally{if(typeof W.release==="function")W.release();else if(typeof W.end==="function")await W.end()}}})}function O7(J,$){return H6({execute:async(Y,Z=[])=>{let W=$(J.connectionString);try{if(typeof W.execute==="function")return await W.execute(Y,Z);if(typeof W.query==="function")return await W.query(Y,Z);throw new j("Hyperdrive MySQL client is missing execute/query methods","MYSQL_CLIENT_INVALID")}finally{if(typeof W.end==="function")await W.end();else if(typeof W.close==="function")await W.close();else if(typeof W.destroy==="function")W.destroy()}}})}function F7(J){if(!J||typeof J!=="object")return!1;return typeof J.prepare==="function"}function j7(J){if(!J||typeof J!=="object")return!1;let $=J;return typeof $.get==="function"&&typeof $.put==="function"&&typeof $.delete==="function"&&typeof $.list==="function"}class RJ{client;sql;bindings;constructor(J,$,X=[]){this.client=J,this.sql=$,this.bindings=X}bind(...J){return new RJ(this.client,this.sql,J)}async run(){let J=Date.now(),$=DJ(this.sql),X=await this.client.query($,this.bindings);return{success:!0,results:X.rows??[],meta:v(J,{changes:typeof X.rowCount==="number"?X.rowCount:void 0,command:X.command})}}async all(){let J=Date.now(),$=DJ(this.sql),X=await this.client.query($,this.bindings);return{success:!0,results:X.rows??[],meta:v(J,{changes:typeof X.rowCount==="number"?X.rowCount:void 0,command:X.command})}}async first(){let J=DJ(this.sql);return(await this.client.query(J,this.bindings)).rows?.[0]??null}}class zJ{client;sql;bindings;constructor(J,$,X=[]){this.client=J,this.sql=$,this.bindings=X}bind(...J){return new zJ(this.client,this.sql,J)}async run(){let J=Date.now(),$=await TJ(this.client,this.sql,this.bindings);if(Array.isArray($))return{success:!0,results:$,meta:v(J)};let X=$;return{success:!0,results:[],meta:v(J,{changes:X.affectedRows,last_row_id:X.insertId,warningStatus:X.warningStatus})}}async all(){let J=Date.now(),$=await TJ(this.client,this.sql,this.bindings);return{success:!0,results:Array.isArray($)?$:[],meta:v(J,{changes:!Array.isArray($)?$.affectedRows:void 0})}}async first(){let J=await TJ(this.client,this.sql,this.bindings);if(!Array.isArray(J)||J.length===0)return null;return J[0]}}class MJ{client;sql;bindings;constructor(J,$,X=[]){this.client=J,this.sql=$,this.bindings=X}bind(...J){return new MJ(this.client,this.sql,J)}async run(){let J=Date.now();if(typeof this.client.execute==="function"){let Z=await this.client.execute(this.sql,this.bindings);return{success:!0,results:PJ(Z),meta:v(J)}}let $=this.client.prepare?.(this.sql);if(!$||typeof $.run!=="function")throw new j("SQLite client must expose execute() or prepare().run()","SQLITE_CLIENT_INVALID");let Y=await $.run(...this.bindings)??{};return{success:!0,results:[],meta:v(J,{changes:ZJ(Y.changes),last_row_id:Y.lastInsertRowid??Y.lastID})}}async all(){let J=Date.now();if(typeof this.client.execute==="function"){let Y=await this.client.execute(this.sql,this.bindings);return{success:!0,results:PJ(Y),meta:v(J)}}let $=this.client.prepare?.(this.sql);if(!$||typeof $.all!=="function")throw new j("SQLite client must expose execute() or prepare().all()","SQLITE_CLIENT_INVALID");let X=await $.all(...this.bindings);return{success:!0,results:Array.isArray(X)?X:[],meta:v(J)}}async first(){if(typeof this.client.execute==="function"){let $=await this.client.execute(this.sql,this.bindings);return PJ($)[0]??null}let J=this.client.prepare?.(this.sql);if(!J)throw new j("SQLite client must expose execute() or prepare().get()","SQLITE_CLIENT_INVALID");if(typeof J.get==="function"){let $=await J.get(...this.bindings);return $===void 0||$===null?null:$}if(typeof J.all==="function"){let $=await J.all(...this.bindings);if(!Array.isArray($)||$.length===0)return null;let X=$[0];return X===void 0||X===null?null:X}throw new j("SQLite prepare() result must expose get() or all()","SQLITE_CLIENT_INVALID")}}class BJ{client;sqlTag;sqlText;bindings;constructor(J,$,X,Y=[]){this.client=J,this.sqlTag=$,this.sqlText=X,this.bindings=Y}bind(...J){return new BJ(this.client,this.sqlTag,this.sqlText,J)}async run(){let J=Date.now(),$=IJ(this.sqlTag,this.sqlText,this.bindings),X=await L7(this.client,$);return{success:!0,results:QJ(X),meta:v(J,W6(X))}}async all(){let J=Date.now(),$=IJ(this.sqlTag,this.sqlText,this.bindings),X=await _6(this.client,$);return{success:!0,results:QJ(X),meta:v(J,W6(X))}}async first(){let J=IJ(this.sqlTag,this.sqlText,this.bindings),$=await V7(this.client,J),X=QJ($);if(X.length>0)return X[0]??null;if($&&typeof $==="object"&&"row"in $){let Y=$.row;return Y===void 0||Y===null?null:Y}if($&&typeof $==="object"&&!Array.isArray($)&&!("rows"in $)&&!("results"in $)&&!("data"in $))return $;return null}}async function A7(J,$,X,Y){try{let Z=await J.scan($,{MATCH:X,COUNT:Y});return Z6(Z)}catch{let Z=await J.scan($,"MATCH",X,"COUNT",String(Y));return Z6(Z)}}function Z6(J){if(Array.isArray(J))return{cursor:String(J[0]??"0"),keys:Array.isArray(J[1])?J[1]:[]};return{cursor:String(J.cursor??"0"),keys:Array.isArray(J.keys)?J.keys:[]}}async function TJ(J,$,X){if(typeof J.execute==="function"){let Y=await J.execute($,X);if(Array.isArray(Y))return Y[0];return Y}if(typeof J.query==="function"){let Y=await J.query($,X);if(Array.isArray(Y))return Y[0];return Y}throw new j("MySQL client must expose execute() or query()","MYSQL_CLIENT_INVALID")}async function L7(J,$){if(typeof J.run==="function")return await J.run($);if(typeof J.execute==="function")return await J.execute($);if(typeof J.all==="function")return await J.all($);throw new j("Drizzle client must expose run(), execute(), or all()","DRIZZLE_CLIENT_INVALID")}async function _6(J,$){if(typeof J.all==="function")return await J.all($);if(typeof J.execute==="function")return await J.execute($);if(typeof J.run==="function")return await J.run($);throw new j("Drizzle client must expose all(), execute(), or run()","DRIZZLE_CLIENT_INVALID")}async function V7(J,$){if(typeof J.get==="function")return await J.get($);return await _6(J,$)}function IJ(J,$,X){let Y=E7($),Z=Y.length-1;if(Z!==X.length)throw new j(`Drizzle binding mismatch: expected ${Z} bindings, received ${X.length}`,"DRIZZLE_BINDINGS_MISMATCH");if(Z===0)return J.raw($);let W=typeof J.empty==="function"?J.empty():J.raw("");for(let G=0;G<Y.length;G++){let U=Y[G];if(U)W.append(J.raw(U));if(G<Z)W.append(J`${X[G]}`)}return W}function E7(J){let $=[],X=0,Y=!1,Z=!1,W=!1,G=!1;for(let U=0;U<J.length;U++){let H=J[U],_=U+1<J.length?J[U+1]:"";if(W){if(H===`
|
|
17
|
-
`)
|
|
18
|
-
`)G=!1;continue}if(U){if(X+=_,_==="*"&&O==="/")X+="/",H++,U=!1;continue}if(!Z&&!W){if(_==="-"&&O==="-"){X+="--",H++,G=!0;continue}if(_==="/"&&O==="*"){X+="/*",H++,U=!0;continue}}if(_==="'"&&!W){Z=!Z,X+=_;continue}if(_==='"'&&!Z){W=!W,X+=_;continue}if(_==="?"&&!Z&&!W){Y++,X+=`$${Y}`;continue}X+=_}if(s.set(J,X),s.size>5000){let H=s.keys().next().value;if(H)s.delete(H)}return X}K();var D7={casing:{getColumnCasing(J){return J?.name??""}},escapeName(J){return J},escapeParam(){return"?"},escapeString(J){return J.replace(/'/g,"''")}};function c(J){return J.trim().replace(/^[`"\[]+|[`"\]]+$/g,"").split(".").pop()?.trim()??J.trim()}function R7(J){return J.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}class Q{static tokenize(J){return J.trim().split(/\s+/).map(($)=>$.toLowerCase())}static extractTableName(J){let $=this.tokenize(J);if($[0]==="create"&&$[1]==="table"){let W=2;if($[W]==="if")W+=3;return $[W]??null}if($[0]==="drop"&&$[1]==="table"){let W=2;if($[W]==="if")W+=2;return $[W]??null}let X=$.indexOf("from"),Y=$.indexOf("into"),Z=$.indexOf("update");if(X>=0&&X+1<$.length)return c($[X+1]??"");if(Y>=0&&Y+1<$.length)return c($[Y+1]??"");if(Z>=0&&Z+1<$.length)return c($[Z+1]??"");return null}static extractInsertColumns(J){let $=J.match(/insert\s+into\s+[^()]+\(([^)]+)\)/i);if(!$||!$[1])return null;return $[1].split(",").map((X)=>c(X)).filter((X)=>X.length>0)}static extractWhereClause(J){let $=J.match(/where\s+([`"\w.]+)\s*(=|like)\s*\?/i);if(!$||!$[1]||!$[2])return null;let X=$[2].toLowerCase()==="like"?"like":"=";return{column:c($[1]),operator:X}}static extractOrderByClause(J){let $=J.match(/order\s+by\s+([`"\w.]+)(?:\s+(asc|desc))?/i);if(!$||!$[1])return null;return{column:c($[1]),direction:$[2]?.toLowerCase()==="desc"?"desc":"asc"}}static matchesWhereClause(J,$,X){let Y=J[$.column];if($.operator==="like"){let Z=String(X??"");return new RegExp(`^${R7(Z).replace(/%/g,".*").replace(/_/g,".")}$`,"i").test(String(Y??""))}return String(Y??"")===String(X??"")}static isSelect(J){return this.tokenize(J)[0]==="select"}static isInsert(J){return this.tokenize(J)[0]==="insert"}static isCreateTable(J){let $=this.tokenize(J);return $[0]==="create"&&$[1]==="table"}static isDropTable(J){let $=this.tokenize(J);return $[0]==="drop"&&$[1]==="table"}static isDelete(J){return this.tokenize(J)[0]==="delete"}static isUpdate(J){return this.tokenize(J)[0]==="update"}static hasIdWhereClause(J){return J.includes("WHERE")&&J.includes("id")}static hasAutoIncrement(J){return J.includes("AUTOINCREMENT")||J.includes("AUTO_INCREMENT")||J.includes("GENERATED BY DEFAULT AS IDENTITY")}static hasReturning(J){return J.includes("RETURNING")}}function z7(J,$=[]){if(typeof J==="string")return{sql:J,bindings:$};if(!J||typeof J!=="object")throw new j("Unsupported query input","INVALID_QUERY_INPUT");if(typeof J.toQuery==="function"){let X=J.toQuery(D7);if(X&&typeof X.sql==="string")return{sql:X.sql,bindings:Array.isArray(X.params)?[...X.params]:$}}if(typeof J.sql==="string")return{sql:J.sql,bindings:Array.isArray(J.params)?[...J.params]:$};if(typeof J.text==="string")return{sql:J.text,bindings:Array.isArray(J.params)?[...J.params]:$};throw new j("Unsupported Drizzle-style query object","INVALID_QUERY_INPUT")}class wJ{tables=new Map;schemas=new Map;autoIncrementCounters=new Map;lastInsertRowId=null;prepare(J){return new O6(this,J)}async execute(J,$=[]){return await this.executeClientQuery(J,$)}async run(J,$=[]){return await this.executeClientQuery(J,$)}async all(J,$=[]){return await this.executeClientQuery(J,$)}async get(J,$=[]){return await this.executeClientQuery(J,$)}async executeClientQuery(J,$){let X=z7(J,$);return await this.executeStatement(X.sql,X.bindings)}async executeStatement(J,$){let X=Date.now();try{if(Q.isCreateTable(J))return await this.handleCreateTable(J,$);if(Q.isDropTable(J))return await this.handleDropTable(J,$);if(Q.isInsert(J))return await this.handleInsert(J,$);if(Q.isUpdate(J))return await this.handleUpdate(J,$);if(Q.isDelete(J))return await this.handleDelete(J,$);if(Q.isSelect(J))return await this.handleSelect(J,$);return{success:!0,results:[],meta:{duration:Date.now()-X}}}catch(Y){let Z=Y instanceof Error?Y.message:String(Y);return{success:!1,results:[],meta:{duration:Date.now()-X},error:Z}}}async executeQuery(J,$){let X=Date.now();try{if(Q.isSelect(J))return await this.handleSelect(J,$);return{success:!1,results:[],meta:{duration:Date.now()-X},error:"Use executeStatement for non-SELECT queries"}}catch(Y){let Z=Y instanceof Error?Y.message:String(Y);return{success:!1,results:[],meta:{duration:Date.now()-X},error:Z}}}async handleCreateTable(J,$){let X=Date.now(),Y=Q.extractTableName(J);if(!Y)return{success:!1,results:[],meta:{duration:Date.now()-X},error:"Could not extract table name"};let Z=new Map,W=J.match(/\((.*)\)/s);if(!W||!W[1])return this.tables.set(Y,new Map),this.schemas.set(Y,Z),{success:!0,results:[],meta:{duration:Date.now()-X}};let G=W[1],U=/(\w+)\s+([A-Z_]+)(\s+[^,)]*)?/gi,H;while((H=U.exec(G))!==null){let _=H[1]||"",O=H[2]||"",F=H[3]||"";Z.set(_,{name:_,type:O,isPrimaryKey:F.includes("PRIMARY KEY"),isAutoIncrement:F.includes("AUTOINCREMENT")||F.includes("AUTO_INCREMENT")||F.includes("GENERATED BY DEFAULT AS IDENTITY")})}if(this.tables.set(Y,new Map),this.schemas.set(Y,Z),Q.hasAutoIncrement(J))this.autoIncrementCounters.set(Y,0);return{success:!0,results:[],meta:{duration:Date.now()-X}}}async handleDropTable(J,$){let X=Date.now(),Y=Q.extractTableName(J);if(!Y)return{success:!1,results:[],meta:{duration:Date.now()-X},error:"Could not extract table name"};return this.tables.delete(Y),this.schemas.delete(Y),this.autoIncrementCounters.delete(Y),{success:!0,results:[],meta:{duration:Date.now()-X}}}async handleInsert(J,$){let X=Date.now(),Y=Q.extractTableName(J);if(!Y)return{success:!1,results:[],meta:{duration:Date.now()-X},error:"Could not extract table name"};if(!this.tables.has(Y))this.tables.set(Y,new Map);let Z=this.tables.get(Y),W=this.schemas.get(Y),G=W?Array.from(W.values()):[],U=G.find((L)=>L.isPrimaryKey),H=G.find((L)=>L.isAutoIncrement),_=Q.extractInsertColumns(J),O={};if(_&&_.length>0)_.forEach((L,B)=>{if(B<$.length)O[L]=$[B]});else if(W){let L=0;for(let[B]of W)if(L<$.length)O[B]=$[L],L++}else for(let L=0;L<$.length;L++)if(L===0)O.id=$[L];else O[`column_${L}`]=$[L];let F=U?.name??"id",A=O[F];if((A===void 0||A===null||A==="")&&H){let L=(this.autoIncrementCounters.get(Y)??0)+1;if(this.autoIncrementCounters.set(Y,L),O[H.name]=L,F!==H.name)O[F]=L;A=L}if(A===void 0||A===null||A==="")return{success:!1,results:[],meta:{duration:Date.now()-X},error:"No primary key value provided"};if(H){let L=typeof A==="number"?A:Number(A);if(Number.isFinite(L))this.autoIncrementCounters.set(Y,Math.max(this.autoIncrementCounters.get(Y)??0,L))}return Z.set(String(A),O),this.lastInsertRowId=A,{success:!0,results:Q.hasReturning(J)?[O]:[],meta:{duration:Date.now()-X,last_row_id:A,changes:1}}}async handleUpdate(J,$){let X=Date.now(),Y=Q.extractTableName(J);if(!Y)return{success:!1,results:[],meta:{duration:Date.now()-X},error:"Could not extract table name"};if(!this.tables.has(Y))return{success:!1,results:[],meta:{duration:Date.now()-X},error:`Table ${Y} not found`};let Z=this.tables.get(Y),W=Q.extractWhereClause(J);if(!W||$.length===0)return{success:!0,results:[],meta:{duration:Date.now()-X,changes:0}};let G=$[$.length-1],U=Array.from(Z.entries()).filter(([,H])=>Q.matchesWhereClause(H,W,G));if(U.length===0)return{success:!0,results:[],meta:{duration:Date.now()-X,changes:0}};for(let[,H]of U)for(let _=0;_<$.length-1;_++){let O=this.extractSetColumnName(J,_);if(O)H[O]=$[_]}return{success:!0,results:[],meta:{duration:Date.now()-X,changes:U.length}}}extractSetColumnName(J,$){let X=J.match(/SET\s+([^W]+?)(?:WHERE|$)/i);if(!X||!X[1])return null;return X[1].split(",").map((W)=>{let G=W.match(/(\w+)\s*=/);return G&&G[1]?G[1]:null})[$]??null}async handleDelete(J,$){let X=Date.now(),Y=Q.extractTableName(J);if(!Y)return{success:!1,results:[],meta:{duration:Date.now()-X},error:"Could not extract table name"};if(!this.tables.has(Y))return{success:!0,results:[],meta:{duration:Date.now()-X,changes:0}};let Z=this.tables.get(Y),W=Q.extractWhereClause(J);if(!W){let H=Z.size;return Z.clear(),{success:!0,results:[],meta:{duration:Date.now()-X,changes:H}}}let G=$[0],U=Array.from(Z.entries()).filter(([,H])=>Q.matchesWhereClause(H,W,G)).map(([H])=>H);for(let H of U)Z.delete(H);return{success:!0,results:[],meta:{duration:Date.now()-X,changes:U.length}}}async handleSelect(J,$){let X=Date.now(),Y=Q.extractTableName(J);if(!Y)return{success:!1,results:[],meta:{duration:Date.now()-X},error:"Could not extract table name"};if(!this.tables.has(Y))return{success:!0,results:[],meta:{duration:Date.now()-X}};let Z=this.tables.get(Y),W=Array.from(Z.values()),G=Q.extractWhereClause(J);if(G&&$.length>0)W=W.filter((H)=>Q.matchesWhereClause(H,G,$[0]));let U=Q.extractOrderByClause(J);if(U)W=[...W].sort((H,_)=>{let O=H[U.column],F=_[U.column];if(O===F)return 0;if(O===void 0||O===null)return U.direction==="desc"?1:-1;if(F===void 0||F===null)return U.direction==="desc"?-1:1;let A=String(O).localeCompare(String(F));return U.direction==="desc"?-A:A});if(J.includes("COUNT(*)")){let _=J.match(/COUNT\(\*\)\s+as\s+(\w+)/i)?.[1]??"COUNT(*)",O={};return O[_]=W.length,{success:!0,results:[O],meta:{duration:Date.now()-X}}}return{success:!0,results:W,meta:{duration:Date.now()-X}}}}class O6{database;sql;bindings=[];constructor(J,$){this.database=J;this.sql=$}bind(...J){return this.bindings=J,this}async run(){return await this.database.executeStatement(this.sql,this.bindings)}async all(){return await this.database.executeQuery(this.sql,this.bindings)}async first(){return(await this.database.executeQuery(this.sql,this.bindings)).results[0]||null}}class NJ{store=new Map;expirations=new Map;normalizeValue(J){return typeof J==="string"?J:JSON.stringify(J)??String(J)}async get(J,$="text"){let X=this.expirations.get(J);if(X&&X<Date.now())return this.store.delete(J),this.expirations.delete(J),null;let Y=this.store.get(J);if(Y===void 0)return null;if($==="json")try{return JSON.parse(Y)}catch(Z){throw new j(`Failed to parse JSON from KV for key ${J}: ${Z instanceof Error?Z.message:String(Z)}`,"KV_JSON_PARSE_FAILED")}return Y}async put(J,$,X){if(this.store.set(J,$),X?.expirationTtl)this.expirations.set(J,Date.now()+X.expirationTtl*1000);else this.expirations.delete(J)}async set(J,$,X){if(this.store.set(J,this.normalizeValue($)),X?.ttl)this.expirations.set(J,Date.now()+X.ttl*1000);else this.expirations.delete(J)}async del(J){await this.delete(J)}async keys(J=""){return(await this.list({prefix:J})).keys.map((X)=>X.name)}async getItem(J){return await this.get(J,"text")??null}async setItem(J,$){await this.set(J,$)}async removeItem(J){await this.delete(J)}async getKeys(J=""){return await this.keys(J)}async delete(J){this.store.delete(J),this.expirations.delete(J)}async list(J){let $=J?.prefix??"",X=J?.limit??1000,Y=J?.cursor?parseInt(J.cursor,10):0,Z=Date.now();for(let[_,O]of this.expirations)if(O<Z)this.store.delete(_),this.expirations.delete(_);let W=Array.from(this.store.keys()).filter((_)=>_.startsWith($)),G=W.slice(Y,Y+X).map((_)=>({name:_})),U=Y+X,H=U>=W.length;return{keys:G,cursor:H?void 0:String(U),list_complete:H}}clear(){this.store.clear(),this.expirations.clear()}size(){return this.store.size}}function M7(){return new wJ}function B7(){return new NJ}o();export{r as validateTableForSharding,jJ as schemaExists,AJ as runShard,rJ as runAllShards,sJ as run,D6 as resetConfig,h6 as reassignShard,$J as prepare,qJ as migrateRecord,p as listTables,p6 as listKnownShards,F7 as isSQLDatabase,j7 as isKVStorage,bJ as integrateExistingDatabase,q6 as insertShard,S6 as insert,cJ as initializeAsync,Q6 as initialize,t6 as indexShard,i6 as indexAllShards,s6 as index,Z7 as getTotalDatabaseSize,g6 as getShardStats,X6 as getDatabaseSizesAllShards,o6 as getDatabaseSizeForShard,Y7 as getDatabaseSizeForKey,M6 as getClosestRegionFromIP,d6 as flush,LJ as firstShard,b6 as firstByLookupKey,c6 as firstAllShardsGlobal,$6 as firstAllShards,aJ as first,r6 as explainShard,e6 as explainAllShards,a6 as explain,SJ as dropSchema,a as discoverExistingRecordsWithColumns,i as discoverExistingPrimaryKeys,G7 as createValkeyKVProvider,KJ as createSchemaAcrossShards,v6 as createSchema,U7 as createSQLiteProvider,G6 as createRedisKVProvider,U6 as createPostgreSQLProvider,H7 as createNuxtHubKVProvider,H6 as createMySQLProvider,fJ as createMappingsForExistingKeys,M7 as createInMemorySQLProvider,B7 as createInMemoryKVProvider,_7 as createHyperdrivePostgresProvider,O7 as createHyperdriveMySQLProvider,WJ as createDrizzleSQLProvider,$7 as countShard,X7 as countAllShards,J7 as count,P6 as collegedb,yJ as clearShardMigrationCache,gJ as clearMigrationCache,pJ as checkMigrationNeeded,hJ as autoDetectAndMigrate,XJ as allShard,f6 as allByLookupKey,J6 as allAllShardsGlobal,YJ as allAllShards,iJ as all,Y6 as ShardCoordinator,q as KVShardMapper,wJ as InMemorySQLDatabase,NJ as InMemoryKVStorage,j as CollegeDBError};
|
|
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(_==="*"&&F==="/")U++,H=!1;continue}if(!Y&&!Z){if(_==="-"&&F==="-"){U++,G=!0;continue}if(_==="/"&&F==="*"){U++,H=!0;continue}}if(_==="'"&&!Z){if(Y&&F==="'"){U++;continue}Y=!Y;continue}if(_==='"'&&!Y){if(Z&&F==='"'){U++;continue}Z=!Z;continue}if(_==="?"&&!Y&&!Z)$.push(J.slice(X,U)),X=U+1}return $.push(J.slice(X)),$}function qJ(J){let $=(Y)=>{if(!Y||typeof Y!=="object"||Array.isArray(Y))return;let Z=Y;if(Array.isArray(Z.rows))return Z.rows;if(Array.isArray(Z.results))return Z.results;if(Array.isArray(Z.data))return Z.data;return},X=(Y)=>{if(!Y||typeof Y!=="object"||Array.isArray(Y))return!1;return Object.keys(Y).length>0};if(Array.isArray(J)){if(J.length===2){let Y=$(J[0]);if(Y)return Y;let Z=$(J[1]);if(Z)return Z;if(!Array.isArray(J[0])&&!Array.isArray(J[1])){if(X(J[0]))return[J[0]];if(X(J[1]))return[J[1]]}if(Array.isArray(J[0]))return J[0];if(Array.isArray(J[1]))return J[1]}return J}if(J&&typeof J==="object"){let Y=$(J);if(Y)return Y}return[]}function R6(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 u7(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 c7(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 d7(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 l7(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 fJ(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 bJ(J){let $=ZJ.get(J);if($)return $;let X="",Y=0,Z=!1,G=!1,H=!1,U=!1;for(let _=0;_<J.length;_++){let F=J[_],W=_+1<J.length?J[_+1]:"";if(H){if(X+=F,F===`
|
|
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};
|
|
19
19
|
|
|
20
|
-
//# debugId=
|
|
20
|
+
//# debugId=95D2376A53E89F0B64756E2164756E21
|
|
21
21
|
//# sourceMappingURL=index.js.map
|