@earth-app/collegedb 1.2.1 → 1.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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 m6=Object.defineProperty;var u6=(J)=>J;function c6(J,$){this[J]=u6.bind(null,$)}var iJ=(J,$)=>{for(var X in $)m6(J,X,{get:$[X],enumerable:!0,configurable:!0,set:c6.bind($,X)})};var NJ=(J,$)=>()=>(J&&($=J(J=0)),$);var j;var b=NJ(()=>{j=class j extends Error{code;constructor(J,$){super(J);if(this.name="CollegeDBError",this.code=$,Error.captureStackTrace)Error.captureStackTrace(this,j)}}});var CJ={};iJ(CJ,{KVShardMapper:()=>y});async function d(J,$,X){if(J.length===0)return;let Y=Math.max(1,Math.min($,J.length)),Z=0,G=Array(Y).fill(null).map(async()=>{while(Z<J.length){let H=Z++,_=J[H];if(_===void 0)continue;await X(_)}});await Promise.all(G)}class y{kv;hashKeys;hashCache=new Map;mappingCache=new Map;knownShardsCache={shards:null,expiresAt:0};mappingCacheTtlMs;knownShardsCacheTtlMs;constructor(J,$={}){this.kv=J,this.hashKeys=$.hashShardMappings??!0,this.mappingCacheTtlMs=$.mappingCacheTtlMs??d6,this.knownShardsCacheTtlMs=$.knownShardsCacheTtlMs??l6}getCachedMapping(J){let $=this.mappingCache.get(J);if(!$)return;if($.expiresAt<Date.now()){this.mappingCache.delete(J);return}return $.mapping}setCachedMapping(J,$){if(this.mappingCache.size>50000){let X=this.mappingCache.keys().next().value;if(X)this.mappingCache.delete(X)}this.mappingCache.set(J,{mapping:$,expiresAt:Date.now()+this.mappingCacheTtlMs})}async cacheMappingForKeys(J,$){let X=await Promise.all(J.map((Y)=>this.hashKey(Y)));for(let Y of X)this.setCachedMapping(Y,$)}getCachedKnownShards(){if(this.knownShardsCache.shards&&this.knownShardsCache.expiresAt>=Date.now())return[...this.knownShardsCache.shards];return null}setCachedKnownShards(J){this.knownShardsCache.shards=[...J],this.knownShardsCache.expiresAt=Date.now()+this.knownShardsCacheTtlMs}async hashKey(J){if(!this.hashKeys)return J;let $=this.hashCache.get(J);if($)return $;let Y=new TextEncoder().encode(J),Z=await crypto.subtle.digest("SHA-256",Y),G=new Uint8Array(Z),H=Array.from(G).map((_)=>_.toString(16).padStart(2,"0")).join("");if(this.hashCache.size<1e4)this.hashCache.set(J,H);return H}async getShardMapping(J){let $=await this.hashKey(J),X=this.getCachedMapping($);if(X!==void 0)return X;let Y=`${k}${$}`,Z=await this.kv.get(Y,"json");if(Z)return this.setCachedMapping($,Z),Z;let G=await this.kv.get(`${f}${$}`,"json");if(G){let H={shard:G.shard,createdAt:G.createdAt,updatedAt:G.updatedAt,originalKey:this.hashKeys?void 0:J};if(this.setCachedMapping($,H),this.hashKeys)for(let _ of G.keys)this.setCachedMapping(_,H);return H}return this.setCachedMapping($,null),null}async setShardMapping(J,$,X=[]){let Y=[J,...X],Z=Date.now(),G={shard:$,createdAt:Z,updatedAt:Z,originalKey:this.hashKeys?void 0:J};if(Y.length===1){let H=await this.hashKey(J),_=`${k}${H}`;await this.kv.put(_,JSON.stringify(G)),this.setCachedMapping(H,G)}else{let H=await this.hashKey(J),_=`${f}${H}`,U=this.hashKeys?await Promise.all(Y.map((O)=>this.hashKey(O))):Y,F={shard:$,createdAt:Z,updatedAt:Z,keys:U};await this.kv.put(_,JSON.stringify(F));let W=Y.map(async(O)=>{let A=await this.hashKey(O),Q=`${k}${A}`,z={shard:$,createdAt:Z,updatedAt:Z,originalKey:this.hashKeys?void 0:O};return this.kv.put(Q,JSON.stringify(z))});await Promise.all(W),await this.cacheMappingForKeys(Y,G)}}async updateShardMapping(J,$){let X=await this.getShardMapping(J);if(!X)throw new j(`No existing mapping found for primary key: ${J}`,"MAPPING_NOT_FOUND");let Y=await this.hashKey(J),Z=`${k}${Y}`,G=`${f}${Y}`,H=await this.kv.get(G,"json");if(H){let _=Date.now(),U={...H,shard:$,updatedAt:_};await this.kv.put(G,JSON.stringify(U));let F=H.keys.length>0?H.keys:[await this.hashKey(J)],W=F.map(async(A)=>{let Q=`${k}${A}`,z={...X,shard:$,updatedAt:_};return this.kv.put(Q,JSON.stringify(z))});await Promise.all(W);let O={...X,shard:$,updatedAt:_};for(let A of F)if(this.hashKeys)this.setCachedMapping(A,O);else this.setCachedMapping(await this.hashKey(A),O);this.setCachedMapping(Y,O)}else{let _={...X,shard:$,updatedAt:Date.now()};await this.kv.put(Z,JSON.stringify(_)),this.setCachedMapping(Y,_)}}async deleteShardMapping(J){let $=await this.hashKey(J),X=`${k}${$}`,Y=`${f}${$}`,Z=await this.kv.get(Y,"json");if(Z){await this.kv.delete(Y);let G=Z.keys.length>0?Z.keys:[await this.hashKey(J)],H=G.map(async(_)=>{let U=`${k}${_}`;return this.kv.delete(U)});await Promise.all(H);for(let _ of G)if(this.hashKeys)this.setCachedMapping(_,null);else this.setCachedMapping(await this.hashKey(_),null);this.setCachedMapping($,null)}else await this.kv.delete(X),this.setCachedMapping($,null)}async getKnownShards(){let J=this.getCachedKnownShards();if(J)return J;let X=await this.kv.get(sJ,"json")||[];return this.setCachedKnownShards(X),X}async setKnownShards(J){if(!J||J.length===0)return;let $=[...new Set(J.filter(Boolean))];if($.length===0)return;await this.kv.put(sJ,JSON.stringify($)),this.setCachedKnownShards($)}async addKnownShard(J){if(!J)return;let $=await this.getKnownShards();if(!$.includes(J))$.push(J),await this.setKnownShards($)}async getKeysForShard(J){let $=[],X=new Set,Y=(H)=>{if(!X.has(H))X.add(H),$.push(H)},Z=await this.kv.list({prefix:k});await d(Z.keys,c,async(H)=>{let _=await this.kv.get(H.name,"json");if(_?.shard!==J)return;if(_.originalKey)Y(_.originalKey);else if(!this.hashKeys)Y(H.name.replace(k,""))});let G=await this.kv.list({prefix:f});return await d(G.keys,c,async(H)=>{let _=await this.kv.get(H.name,"json");if(_?.shard===J)for(let U of _.keys)Y(U)}),$}async getShardKeyCounts(){let J={},$=await this.kv.list({prefix:k});await d($.keys,c,async(Y)=>{let Z=await this.kv.get(Y.name,"json");if(Z)J[Z.shard]=(J[Z.shard]||0)+1});let X=await this.kv.list({prefix:f});return await d(X.keys,c,async(Y)=>{let Z=await this.kv.get(Y.name,"json");if(Z)J[Z.shard]=(J[Z.shard]||0)+Z.keys.length}),J}async clearAllMappings(){let[J,$]=await Promise.all([this.kv.list({prefix:k}),this.kv.list({prefix:f})]);await Promise.all([d(J.keys,c,async(X)=>{await this.kv.delete(X.name)}),d($.keys,c,async(X)=>{await this.kv.delete(X.name)})]),this.mappingCache.clear(),this.hashCache.clear(),this.knownShardsCache.shards=null,this.knownShardsCache.expiresAt=0}async addLookupKeys(J,$){let X=await this.getShardMapping(J);if(!X)throw new j(`No existing mapping found for primary key: ${J}`,"MAPPING_NOT_FOUND");let Y=await this.hashKey(J),Z=`${f}${Y}`,G=await this.kv.get(Z,"json"),H=[J,...$],_=Date.now();if(!G){let W=this.hashKeys?await Promise.all(H.map((O)=>this.hashKey(O))):H;G={shard:X.shard,createdAt:X.createdAt,updatedAt:_,keys:W}}else{let W=this.hashKeys?await Promise.all(H.map((O)=>this.hashKey(O))):H;G={...G,updatedAt:_,keys:[...new Set([...G.keys,...W])]}}await this.kv.put(Z,JSON.stringify(G));let U=$.map(async(W)=>{let O=await this.hashKey(W),A=`${k}${O}`,Q={shard:X.shard,createdAt:X.createdAt,updatedAt:_,originalKey:this.hashKeys?void 0:W};return this.kv.put(A,JSON.stringify(Q))});await Promise.all(U);let F={shard:X.shard,createdAt:X.createdAt,updatedAt:_,originalKey:X.originalKey};await this.cacheMappingForKeys([J,...$],F)}async setShardMappingsBatch(J,$={}){if(J.length===0)return;let X=Math.max(1,$.concurrency??25),Y=0,Z=Array(Math.min(X,J.length)).fill(null).map(async()=>{while(Y<J.length){let G=Y++,H=J[G];if(!H)continue;await this.setShardMapping(H.primaryKey,H.shard,H.additionalKeys||[])}});await Promise.all(Z)}async getAllLookupKeys(J){let $=await this.hashKey(J),X=`${f}${$}`,Y=await this.kv.get(X,"json");if(Y)return Y.keys;let Z=await this.getShardMapping(J);if(Z)return Z.originalKey?[Z.originalKey]:[J];throw new j(`No mapping found for key: ${J}`,"MAPPING_NOT_FOUND")}}var k="shard:",f="multikey:",sJ="known_shards",d6=30000,l6=1e4,c=32;var JJ=NJ(()=>{b()});var AJ={};iJ(AJ,{validateTableForSharding:()=>OJ,schemaExists:()=>eJ,migrateRecord:()=>$6,listTables:()=>l,integrateExistingDatabase:()=>Y6,dropSchema:()=>J6,discoverExistingRecordsWithColumns:()=>WJ,discoverExistingPrimaryKeys:()=>FJ,createSchemaAcrossShards:()=>rJ,createSchema:()=>aJ,createMappingsForExistingKeys:()=>X6,clearShardMigrationCache:()=>_6,clearMigrationCache:()=>H6,checkMigrationNeeded:()=>G6,autoDetectAndMigrate:()=>Z6});async function tJ(J,$,X){if(J.length===0)return;let Y=Math.max(1,Math.min($,J.length)),Z=0,G=Array(Y).fill(null).map(async()=>{while(Z<J.length){let H=Z++,_=J[H];if(_===void 0)continue;await X(_,H)}});await Promise.all(G)}function o6(J,$,X,Y){let Z=X.length;switch(Y){case"hash":{let G=0;for(let _=0;_<J.length;_++){let U=J.charCodeAt(_);G=(G<<5)-G+U,G=G&G}let H=Math.abs(G)%Z;return X[H]}case"random":return X[Math.floor(Math.random()*Z)];default:return X[$%Z]}}async function aJ(J,$){let X=$.split(";").map((Y)=>Y.trim()).filter((Y)=>Y.length>0&&!Y.startsWith("--"));for(let Y of X)try{await J.prepare(Y).run()}catch(Z){throw console.error("Failed to execute schema statement:",Y,Z),new j(`Schema migration failed: ${Z}`,"SCHEMA_MIGRATION_FAILED")}}async function rJ(J,$){let X=Object.entries(J).map(([Y,Z])=>{return aJ(Z,$).catch((G)=>{throw new j(`Failed to create schema on shard ${Y}: ${G.message}`,"SCHEMA_CREATION_FAILED")})});await Promise.all(X)}async function eJ(J,$){try{return await J.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name=?").bind($).first()!==null}catch{return!1}}async function J6(J,...$){for(let X of $)try{await J.prepare(`DROP TABLE IF EXISTS ${X}`).run()}catch(Y){console.error(`Failed to drop table ${X}:`,Y)}}async function l(J){try{return(await J.prepare("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name").all()).results.map((X)=>X.name)}catch{return[]}}async function $6(J,$,X,Y){if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(Y))throw new j(`Invalid table name for migration: ${Y}`,"INVALID_TABLE_NAME");let Z=await J.prepare(`SELECT * FROM ${Y} WHERE id = ?`).bind(X).first();if(!Z)throw new j(`Record with primary key ${X} not found in source database`,"RECORD_NOT_FOUND");let G=Object.keys(Z);if(G.length===0)throw new j(`Source record for ${X} has no columns`,"EMPTY_SOURCE_RECORD");let H=G.map(()=>"?").join(", "),_=G.map((F)=>Z[F]),U=`INSERT OR REPLACE INTO ${Y} (${G.join(", ")}) VALUES (${H})`;await $.prepare(U).bind(..._).run(),await J.prepare(`DELETE FROM ${Y} WHERE id = ?`).bind(X).run()}async function FJ(J,$,X="id"){try{return(await J.prepare(`SELECT ${X} FROM ${$}`).all()).results.map((Z)=>String(Z[X]))}catch(Y){throw new j(`Failed to discover primary keys in table ${$}: ${Y}`,"DISCOVERY_FAILED")}}async function WJ(J,$,X="id"){try{let Y=`${$}_columns`,Z;if(wJ.has(Y))Z=wJ.get(Y).map((U)=>U.name);else{let F=(await J.prepare(`PRAGMA table_info(${$})`).all()).results.map((W)=>({name:W.name,type:W.type}));wJ.set(Y,F),Z=F.map((W)=>W.name)}let G=[X];if(Z.includes("username"))G.push("username");if(Z.includes("email"))G.push("email");if(Z.includes("name"))G.push("name");let H=`SELECT ${G.join(", ")} FROM ${$}`;return(await J.prepare(H).all()).results}catch(Y){throw new j(`Failed to discover records with columns in table ${$}: ${Y}`,"DISCOVERY_FAILED")}}async function X6(J,$,X,Y,Z={}){if(J.length===0||$.length===0)return;let G=Math.max(1,Z.concurrency??25),H=J.map((_,U)=>({primaryKey:_,shard:o6(_,U,$,X)}));await Y.setShardMappingsBatch(H,{concurrency:G})}async function OJ(J,$,X){let Y=[],Z=0;try{if(!await J.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name=?").bind($).first())return Y.push(`Table '${$}' does not exist`),{isValid:!1,tableName:$,primaryKeyColumn:X,recordCount:0,issues:Y};if(!(await J.prepare(`PRAGMA table_info(${$})`).all()).results.some((F)=>F.name===X&&F.pk===1))Y.push(`Primary key column '${X}' not found or not set as primary key`);if(Z=(await J.prepare(`SELECT COUNT(*) as count FROM ${$}`).first())?.count||0,Z===0)Y.push(`Table '${$}' is empty`)}catch(G){Y.push(`Database validation error: ${G}`)}return{isValid:Y.length===0,tableName:$,primaryKeyColumn:X,recordCount:Z,issues:Y}}async function Y6(J,$,X,Y={}){let{tables:Z,primaryKeyColumn:G="id",strategy:H="hash",addShardMappingsTable:_=!0,dryRun:U=!1,migrateOtherColumns:F=!1,concurrency:W=25}=Y,O=Math.max(1,W),A=[],Q=0,z=0,T=0;try{let E=(Z||await l(J)).filter((P)=>P!=="shard_mappings");for(let P of E)try{let M=await OJ(J,P,G);if(!M.isValid){A.push(`Table ${P}: ${M.issues.join(", ")}`);continue}if(F){let D=await WJ(J,P,G);if(D.length===0){A.push(`Table ${P} has no records to process`);continue}if(!U){let V=D.map((L)=>{let C=String(L[G]),h=[];if(L.username&&typeof L.username==="string")h.push(`username:${L.username}`);if(L.email&&typeof L.email==="string")h.push(`email:${L.email}`);if(L.name&&typeof L.name==="string")h.push(`name:${L.name}`);return{primaryKey:C,shard:$,additionalKeys:h}});await X.setShardMappingsBatch(V,{concurrency:O}),T+=V.length}z+=D.length}else{let D=await FJ(J,P,G);if(D.length===0){A.push(`Table ${P} has no records to process`);continue}if(!U){let V=D.map((L)=>({primaryKey:L,shard:$}));await X.setShardMappingsBatch(V,{concurrency:O}),T+=V.length}z+=D.length}Q++}catch(M){A.push(`Failed to process table ${P}: ${M}`)}if(_&&!U){if(!(await l(J)).includes("shard_mappings"))await J.prepare(`
|
|
2
2
|
CREATE TABLE IF NOT EXISTS shard_mappings (
|
|
3
3
|
primary_key TEXT PRIMARY KEY,
|
|
4
4
|
shard_name TEXT NOT NULL,
|
|
5
5
|
created_at INTEGER NOT NULL,
|
|
6
6
|
updated_at INTEGER NOT NULL
|
|
7
|
-
);`.trim()).run()}if(!
|
|
8
|
-
SELECT ${Z} FROM ${
|
|
7
|
+
);`.trim()).run()}if(!U)await X.addKnownShard($)}catch(B){A.push(`Integration failed: ${B}`)}return{success:A.length===0||A.length>0&&Q>0,shardName:$,tablesProcessed:Q,totalRecords:z,mappingsCreated:T,issues:A}}async function Z6(J,$,X,Y={}){let{primaryKeyColumn:Z="id",tablesToCheck:G,skipCache:H=!1,maxRecordsToCheck:_=1000,migrateOtherColumns:U=!1,concurrency:F=X.migrationConcurrency??25}=Y,W=Math.max(1,F),O=`${$}_migration_check`;if(!H&&g.has(O))return{migrationNeeded:!1,migrationPerformed:!1,recordsMigrated:0,tablesProcessed:0,issues:[]};let A=[],Q=0,z=0,T=!1,B=!1;try{let{KVShardMapper:E}=await Promise.resolve().then(() => (JJ(),CJ)),P=new E(X.kv,{hashShardMappings:X.hashShardMappings,mappingCacheTtlMs:X.mappingCacheTtlMs,knownShardsCacheTtlMs:X.knownShardsCacheTtlMs}),M=await l(J),D=G||M.filter((V)=>V!=="shard_mappings"&&!V.startsWith("sqlite_")&&V!=="sqlite_sequence");if(D.length===0)return g.set(O,!0),{migrationNeeded:!1,migrationPerformed:!1,recordsMigrated:0,tablesProcessed:0,issues:[]};for(let V of D)try{let L=await OJ(J,V,Z);if(!L.isValid||L.recordCount===0)continue;let C=Math.min(_,L.recordCount),h=await J.prepare(`
|
|
8
|
+
SELECT ${Z} FROM ${V}
|
|
9
9
|
ORDER BY ${Z}
|
|
10
|
-
LIMIT ?`.trim()).bind(
|
|
10
|
+
LIMIT ?`.trim()).bind(C).all(),I=0,BJ=h.results.slice(0,10).map(async(S)=>{let v=String(S[Z]);return{key:v,mapping:await P.getShardMapping(v)}}),u=await Promise.all(BJ);for(let S of u)if(!S.mapping)I++,T=!0;if(I>0){if(X.debug)console.log(`Auto-migrating table ${V} in shard ${$} (${L.recordCount} records)`);if(U){let S=await WJ(J,V,Z),v=[];if(await tJ(S,W,async(w)=>{let RJ=String(w[Z]);if(await P.getShardMapping(RJ))return;let UJ=[];if(w.username&&typeof w.username==="string")UJ.push(`username:${w.username}`);if(w.email&&typeof w.email==="string")UJ.push(`email:${w.email}`);if(w.name&&typeof w.name==="string")UJ.push(`name:${w.name}`);v.push({primaryKey:RJ,shard:$,additionalKeys:UJ})}),v.length>0)await P.setShardMappingsBatch(v,{concurrency:W});Q+=v.length}else{let S=await FJ(J,V,Z),v=[];if(await tJ(S,W,async(w)=>{if(!await P.getShardMapping(w))v.push({primaryKey:w,shard:$})}),v.length>0)await P.setShardMappingsBatch(v,{concurrency:W});Q+=v.length}if(z++,B=!0,X.debug)console.log(`Auto-migrated ${Q} records from table ${V}`)}}catch(L){A.push(`Auto-migration failed for table ${V}: ${L}`)}if(B){if(await P.addKnownShard($),!M.includes("shard_mappings"))await J.prepare(`CREATE TABLE IF NOT EXISTS shard_mappings (
|
|
11
11
|
primary_key TEXT PRIMARY KEY,
|
|
12
12
|
shard_name TEXT NOT NULL,
|
|
13
13
|
created_at INTEGER NOT NULL,
|
|
14
14
|
updated_at INTEGER NOT NULL
|
|
15
15
|
);
|
|
16
|
-
`).run()}if(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 G6(J,$,X){let Y=`${$}_migration_check`;if(g.has(Y))return!1;try{let Z=await l(J);if(Z.includes("shard_mappings"))return g.set(Y,!0),!1;let{KVShardMapper:H}=await Promise.resolve().then(() => (JJ(),CJ)),_=new H(X.kv,{hashShardMappings:X.hashShardMappings,mappingCacheTtlMs:X.mappingCacheTtlMs,knownShardsCacheTtlMs:X.knownShardsCacheTtlMs}),U=Z.filter((F)=>F!=="shard_mappings"&&!F.startsWith("sqlite_")&&F!=="sqlite_sequence");for(let F of U.slice(0,3))try{if(((await J.prepare(`SELECT COUNT(*) as count FROM ${F} LIMIT 1`).first())?.count||0)>0){let A=await J.prepare(`SELECT id FROM ${F} LIMIT 1`).first();if(A){let Q=String(A.id);if(!await _.getShardMapping(Q))return!0}}}catch{continue}return!1}catch{return!1}}function H6(){g.clear()}function _6(J){let $=`${J}_migration_check`;g.delete($)}var g,wJ;var $J=NJ(()=>{b();g=new Map,wJ=new Map});b();JJ();var XJ=null,o=null,s=new Map,n=0;function q(J){if(!o)o=new y(J.kv,{hashShardMappings:J.hashShardMappings,mappingCacheTtlMs:J.mappingCacheTtlMs,knownShardsCacheTtlMs:J.knownShardsCacheTtlMs});return o}function n6(J){XJ=J,o=new y(J.kv,{hashShardMappings:J.hashShardMappings,mappingCacheTtlMs:J.mappingCacheTtlMs,knownShardsCacheTtlMs:J.knownShardsCacheTtlMs}),s.clear(),n=0;try{let $=q(J);Promise.resolve().then(async()=>{let X=await $.getKnownShards(),Y=Array.from(new Set([...X,...Object.keys(J.shards)]));await $.setKnownShards(Y)}).catch(()=>{return})}catch{}if(J.shards&&Object.keys(J.shards).length>0&&!J.disableAutoMigration)O6(J).catch(($)=>{console.warn("Background auto-migration failed:",$)})}async function W6(J){XJ=J,o=new y(J.kv,{hashShardMappings:J.hashShardMappings,mappingCacheTtlMs:J.mappingCacheTtlMs,knownShardsCacheTtlMs:J.knownShardsCacheTtlMs}),s.clear(),n=0;try{let $=q(J),X=await $.getKnownShards(),Y=Array.from(new Set([...X,...Object.keys(J.shards)]));await $.setKnownShards(Y)}catch{}if(J.shards&&Object.keys(J.shards).length>0&&!J.disableAutoMigration)try{await O6(J)}catch($){console.warn("Auto migration failed:",$)}}async function i6(J,$){return await W6(J),await $()}async function O6(J){try{let{autoDetectAndMigrate:$}=await Promise.resolve().then(() => ($J(),AJ)),X=Object.keys(J.shards);if(J.debug)console.log(`\uD83D\uDD0D Checking ${X.length} shards for existing data...`);let Y=X.map(async(H)=>{let _=J.shards[H];if(!_)return null;try{let U=await $(_,H,J,{maxRecordsToCheck:1000});return{shardName:H,...U}}catch(U){return console.warn(`Auto-migration failed for shard ${H}:`,U),null}}),G=(await Promise.all(Y)).filter((H)=>H?.migrationPerformed);if(J.debug)if(G.length>0){let H=G.reduce((_,U)=>_+(U?.recordsMigrated||0),0);console.log(`\uD83C\uDF89 Auto-migration completed! Migrated ${H} records across ${G.length} shards`),G.forEach((_)=>{if(_)console.log(` ✅ ${_.shardName}: ${_.recordsMigrated} records from ${_.tablesProcessed} tables`)})}else console.log("✅ All shards ready - no migration needed")}catch($){console.warn("Background auto-migration setup failed:",$)}}function s6(){XJ=null,o=null,s.clear(),n=0}function R(){if(!XJ)throw new j("CollegeDB not initialized. Call initialize() first.","NOT_INITIALIZED");return XJ}function t6(J){let $=J.trim().toUpperCase();if($.startsWith("SELECT")||$.startsWith("VALUES")||$.startsWith("TABLE")||$.startsWith("PRAGMA")||$.startsWith("EXPLAIN")||$.startsWith("WITH")||$.startsWith("SHOW"))return"read";return"write"}function A6(J,$){let X=J.strategy||"hash";if(typeof X==="string")return X;let Y=X;return Y[$]||Y.write||Y.read||"hash"}function a6(J,$){if(J===$)return 0;let X={wnam:{lat:37.7749,lon:-122.4194},enam:{lat:40.7128,lon:-74.006},weur:{lat:51.5074,lon:-0.1278},eeur:{lat:52.52,lon:13.405},apac:{lat:35.6762,lon:139.6503},oc:{lat:-33.8688,lon:151.2093},me:{lat:25.2048,lon:55.2708},af:{lat:-26.2041,lon:28.0473}},Y=X[J],Z=X[$],G=Y.lat-Z.lat,H=Y.lon-Z.lon;return Math.sqrt(G*G+H*H)}function r6(J){let $=J.cf;if(!$||!$.country)return"wnam";let{country:X,continent:Y}=$;if(["US","CA","MX"].includes(X)){let Z=$.region||$.regionCode||"",G=$.timezone||"";if(Z.includes("CA")||Z.includes("WA")||Z.includes("OR")||Z.includes("NV")||Z.includes("AZ")||Z.includes("UT")||G.includes("Pacific")||G.includes("America/Los_Angeles"))return"wnam";return"enam"}if(["GL","PM","BM"].includes(X))return"enam";if(["GB","IE","FR","ES","PT","NL","BE","LU","CH","AT","IT"].includes(X))return"weur";if(["DE","PL","CZ","SK","HU","SI","HR","BA","RS","ME","MK","AL","BG","RO","MD","UA","BY","LT","LV","EE","FI","SE","NO","DK","IS"].includes(X))return"eeur";if(X==="RU")return"eeur";if(["JP","KR","CN","HK","TW","MO","MN","KP"].includes(X))return"apac";if(["TH","VN","SG","MY","ID","PH","BN","KH","LA","MM","TL","IN","PK","BD","LK","NP","BT","MV","AF"].includes(X))return"apac";if(["AU","NZ","PG","FJ","NC","VU","SB","WS","TO","KI","NR","PW","FM","MH","TV"].includes(X))return"oc";if(["AE","SA","QA","KW","BH","OM","YE","IQ","IR","SY","LB","JO","IL","PS","TR","CY"].includes(X))return"me";if(Y==="AF"||["EG","LY","TN","DZ","MA","SD","SS","ET","ER","DJ","SO"].includes(X))return"af";if(["KZ","UZ","TM","TJ","KG"].includes(X))return"eeur";if(Y==="SA"||["BR","AR","CL","PE","CO","VE","EC","BO","PY","UY","GY","SR","GF"].includes(X))return"enam";if(["GT","BZ","SV","HN","NI","CR","PA","CU","JM","HT","DO","PR","TT","BB","GD","VC","LC","DM","AG","KN"].includes(X))return"enam";return"wnam"}function e6(J){if(typeof J==="string")return J;return J.region||"wnam"}async function jJ(J){try{let[$,X]=await Promise.all([J.prepare("PRAGMA page_count").first(),J.prepare("PRAGMA page_size").first()]);if(!$?.page_count||!X?.page_size)throw new j("Failed to retrieve database size information","SIZE_QUERY_FAILED");return $.page_count*X.page_size}catch($){throw new j(`Failed to get database size: ${$ instanceof Error?$.message:"Unknown error"}`,"SIZE_QUERY_FAILED")}}async function J7(J,$){let X=Math.max(0,$.sizeCacheTtlMs??30000),Y=s.get(J);if(Y&&Y.expiresAt>=Date.now())return Y.size;let Z=$.shards[J];if(!Z)throw new j(`Shard ${J} not found in configuration`,"SHARD_NOT_FOUND");let G=await jJ(Z);if(X>0)s.set(J,{size:G,expiresAt:Date.now()+X});return G}async function j6(J,$){if(typeof $.maxDatabaseSize!=="number"||!Number.isFinite($.maxDatabaseSize)||$.maxDatabaseSize<=0)return J;let X=$.maxDatabaseSize,Z=(await Promise.allSettled(J.map(async(G)=>{let H=await J7(G,$);return{shard:G,size:H,withinLimit:H<X}}))).filter((G)=>G.status==="fulfilled"&&G.value.withinLimit).map((G)=>G.value.shard);if(Z.length===0){if($.debug)console.warn("All shards exceed maxDatabaseSize limit. Allowing allocation to prevent failure.");return J}if($.debug&&Z.length<J.length){let G=J.filter((H)=>!Z.includes(H));console.log(`Excluded ${G.length} shards due to size limits: ${G.join(", ")}`)}return Z}function $7(J,$,X,Y){let Z=$.filter((W)=>X[W]);if(Z.length===0){let W=0;for(let A=0;A<Y.length;A++){let Q=Y.charCodeAt(A);W=(W<<5)-W+Q,W=W&W}let O=Math.abs(W)%$.length;return $[O]}let G=Z.map((W)=>{let O=X[W],A=a6(J,e6(O)),Q=typeof O==="object"?O.priority||1:1,z=A-Q*0.1;return{shard:W,score:z,distance:A,priority:Q}});G.sort((W,O)=>W.score-O.score);let H=G[0].score,_=G.filter((W)=>Math.abs(W.score-H)<0.01);if(_.length===1)return _[0].shard;let U=0;for(let W=0;W<Y.length;W++){let O=Y.charCodeAt(W);U=(U<<5)-U+O,U=U&U}let F=Math.abs(U)%_.length;return _[F].shard}function i(J,$,X,Y){switch(J){case"hash":{let Z=0;for(let H=0;H<$.length;H++){let _=$.charCodeAt(H);Z=(Z<<5)-Z+_,Z=Z&Z}let G=Math.abs(Z)%X.length;return X[G]||X[0]}case"location":{if(!Y.targetRegion)return i("hash",$,X,Y);return $7(Y.targetRegion,X,Y.shardLocations||{},$)}case"random":return X[Math.floor(Math.random()*X.length)]||X[0];default:return i("hash",$,X,Y)}}async function L6(J,$="write"){let X=R(),Y=q(X),Z=await Y.getShardMapping(J);if(Z)return Z.shard;let G=Object.keys(X.shards);if(G.length===0)throw new j("No shards configured","NO_SHARDS");let H=await j6(G,X),_,U=A6(X,$);if(X.coordinator)try{let F=X.coordinator.idFromName("default"),O=await X.coordinator.get(F).fetch("http://coordinator/allocate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({primaryKey:J,strategy:U,operationType:$,targetRegion:X.targetRegion,shardLocations:X.shardLocations,availableShards:H})});if(O.ok)_=(await O.json()).shard;else _=i(U,J,H,X)}catch(F){console.warn("Coordinator allocation failed, falling back to local strategy:",F),_=i(U,J,H,X)}else _=i(U,J,H,X);return await Y.setShardMapping(J,_),_}async function X7(J,$="write"){let X=R(),Y=await L6(J,$),Z=X.shards[Y];if(!Z)throw new j(`Shard ${Y} not found in configuration`,"SHARD_NOT_FOUND");return Z}async function Y7(J,$){let{createSchema:X}=await Promise.resolve().then(() => ($J(),AJ));await X(J,$)}async function LJ(J,$){let X=t6($);return(await X7(J,X)).prepare($)}async function Q6(J,$,X=[]){let Z=await(await LJ(J,$)).bind(...X).run();if(!Z.success)throw new j(`Query failed: ${Z.error||"Unknown error"}`,"QUERY_FAILED");return Z}function Z7(J){let $=J.results[0];if($&&typeof $==="object"){for(let Y of["id","ID","Id","rowid","ROWID","RowId","last_row_id","lastInsertId","insertId"]){let Z=$[Y];if(Z!==void 0&&Z!==null)return Z}for(let[Y,Z]of Object.entries($)){let G=Y.toLowerCase();if((G==="id"||G==="rowid")&&(typeof Z==="number"||typeof Z==="string"))return Z}for(let Y of Object.values($))if(typeof Y==="number"||typeof Y==="string")return Y}let X=J.meta.last_row_id;if(X!==void 0&&X!==null)return X;return}function G7(){return`insert:${Date.now()}:${Math.random().toString(36).slice(2)}`}async function H7(){let J=R(),$=Object.keys(J.shards);if($.length===0)throw new j("No shards configured","NO_SHARDS");let X=await j6($,J);if(X.length===0)throw new j("No shards available for insert","NO_SHARDS");let Y=A6(J,"write"),Z=G7();if(J.coordinator)try{let G=J.coordinator.idFromName("default"),_=await J.coordinator.get(G).fetch("http://coordinator/allocate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({primaryKey:Z,strategy:Y,operationType:"write",targetRegion:J.targetRegion,shardLocations:J.shardLocations,availableShards:X})});if(_.ok)return(await _.json()).shard}catch(G){console.warn("Coordinator allocation for insert failed, falling back to local strategy:",G)}if(Y==="round-robin"){let G=X[n%X.length];return n=(n+1)%X.length,G}return i(Y,Z,X,J)}async function V6(J,$,X=[]){let Y=R();if(!Y.shards[J])throw new j(`Shard ${J} not found`,"SHARD_NOT_FOUND");let G=/\breturning\b/i.test($)?await QJ(J,$,X):await vJ(J,$,X),H=Z7(G);if(H===void 0)throw new j("Insert did not return a generated primary key","GENERATED_KEY_UNAVAILABLE");return await q(Y).setShardMapping(String(H),J),{...G,generatedId:H}}async function _7(J,$=[]){let X=await H7();return await V6(X,J,$)}async function U7(J,$,X=[]){return await V6(J,$,X)}async function E6(J,$,X=[]){let Z=await(await LJ(J,$)).bind(...X).all();if(!Z.success)throw new j(`Query failed: ${Z.error||"Unknown error"}`,"QUERY_FAILED");return Z}async function P6(J,$,X=[]){return await(await LJ(J,$)).bind(...X).first()}async function F7(J,$,X=[],Y=50){let Z=R(),H=await q(Z).getShardMapping(J);if(H){if(Z.shards[H.shard]){let F=await QJ(H.shard,$,X);if(F.success&&F.results.length>0)return F}}let _=await VJ($,X,Y);return D6(_)}async function W7(J,$,X=[],Y=50){let Z=R(),H=await q(Z).getShardMapping(J);if(H){if(Z.shards[H.shard]){let F=await kJ(H.shard,$,X);if(F!==null)return F}}return(await M6($,X,Y)).find((U)=>U!==null)??null}async function O7(J,$,X){let Y=R();if(!Y.shards[$])throw new j(`Shard ${$} not found in configuration`,"SHARD_NOT_FOUND");let Z=q(Y),G=await Z.getShardMapping(J);if(!G)throw new j(`No existing mapping found for primary key: ${J}`,"MAPPING_NOT_FOUND");if(G.shard!==$){let{migrateRecord:H}=await Promise.resolve().then(() => ($J(),AJ)),_=Y.shards[G.shard],U=Y.shards[$];if(!_||!U)throw new j("Source or target shard not available","SHARD_UNAVAILABLE");await H(_,U,J,X)}await Z.updateShardMapping(J,$)}async function A7(){let J=R();if(J.coordinator)try{let $=J.coordinator.idFromName("default"),Y=await J.coordinator.get($).fetch("http://coordinator/shards");if(Y.ok)return await Y.json()}catch($){console.warn("Failed to get shards from coordinator:",$)}try{let X=await q(J).getKnownShards(),Y=new Set([...Object.keys(J.shards),...X]);return Array.from(Y)}catch{return Object.keys(J.shards)}}async function j7(){let J=R();if(J.coordinator)try{let Z=J.coordinator.idFromName("default"),H=await J.coordinator.get(Z).fetch("http://coordinator/stats");if(H.ok)return await H.json()}catch(Z){console.warn("Failed to get stats from coordinator:",Z)}let $=q(J),X=await $.getShardKeyCounts(),Y=Object.keys(J.shards);try{let Z=await $.getKnownShards();Y=Array.from(new Set([...Y,...Z]))}catch{}return Y.map((Z)=>({binding:Z,count:X[Z]||0}))}async function vJ(J,$,X=[]){let Z=R().shards[J];if(!Z)throw new j(`Shard ${J} not found`,"SHARD_NOT_FOUND");let G=await Z.prepare($).bind(...X).run();if(!G.success)throw new j(`Query failed: ${G.error||"Unknown error"}`,"QUERY_FAILED");return G}async function QJ(J,$,X=[]){let Z=R().shards[J];if(!Z)throw new j(`Shard ${J} not found`,"SHARD_NOT_FOUND");return await Z.prepare($).bind(...X).all()}async function kJ(J,$,X=[]){let Z=R().shards[J];if(!Z)throw new j(`Shard ${J} not found`,"SHARD_NOT_FOUND");return await Z.prepare($).bind(...X).first()}async function T6(J,$=[],X=50){let Y=R(),Z=[];for(let[H,_]of Object.entries(Y.shards)){if(!H||!_){console.error(`Shard ${H??"<null>"} not found, skipping`);continue}Z.push(()=>_.prepare(J).bind(...$).run().catch((U)=>{return console.error(`Error executing query on shard ${H}:`,U),{success:!1,results:[],error:U instanceof Error?U.message:String(U),meta:{duration:0}}}))}let G=[];for(let H=0;H<Z.length;H+=X){let _=Z.slice(H,H+X).map((U)=>U());G.push(...await Promise.all(_))}return G}async function VJ(J,$=[],X=50){let Y=R(),Z=[];for(let[H,_]of Object.entries(Y.shards)){if(!H||!_){console.error(`Shard ${H??"<null>"} not found, skipping`);continue}Z.push(()=>_.prepare(J).bind(...$).all().catch((U)=>{return console.error(`Error executing query on shard ${H}:`,U),{success:!1,results:[],error:U instanceof Error?U.message:String(U),meta:{duration:0}}}))}let G=[];for(let H=0;H<Z.length;H+=X){let _=Z.slice(H,H+X).map((U)=>U());G.push(...await Promise.all(_))}return G}function YJ(J,$=50){if(!Number.isFinite(J??$))return $;return Math.max(1,Math.floor(J??$))}function L7(J){if(!Number.isFinite(J??0))return 0;return Math.max(0,Math.floor(J??0))}function Q7(J){if(J===void 0)return;if(!Number.isFinite(J))return;return Math.max(0,Math.floor(J))}function U6(J,$){if(typeof $==="function")return $(J);if(!$||typeof J!=="object"||J===null)return;return J[String($)]}function V7(J,$){if(J===$)return 0;if(J===null||J===void 0)return 1;if($===null||$===void 0)return-1;if(typeof J==="number"&&typeof $==="number")return J-$;if(typeof J==="bigint"&&typeof $==="bigint")return J<$?-1:1;if(J instanceof Date&&$ instanceof Date)return J.getTime()-$.getTime();if(typeof J==="boolean"&&typeof $==="boolean")return Number(J)-Number($);return String(J).localeCompare(String($),void 0,{numeric:!0,sensitivity:"base"})}function D6(J){let $=J.flatMap((G)=>G.results||[]),X=J.filter((G)=>!G.success),Y=J.reduce((G,H)=>G+(H.meta?.duration||0),0);if(X.length===0)return{success:!0,results:$,meta:{duration:Y}};let Z=X.map((G)=>G.error||"Unknown shard query error").filter(Boolean).join("; ");return{success:!1,results:$,error:Z||"One or more shard queries failed",meta:{duration:Y}}}async function z6(J,$=[],X={}){let Y=YJ(X.batchSize),Z=L7(X.offset),G=Q7(X.limit),H=D6(await VJ(J,$,Y)),_=H.results;if(X.filter)_=_.filter((W)=>X.filter?.(W));if(X.comparator)_=[..._].sort(X.comparator);else if(X.sortBy){let W=X.sortDirection==="desc"?-1:1;_=[..._].sort((O,A)=>{let Q=U6(O,X.sortBy),z=U6(A,X.sortBy);return V7(Q,z)*W})}let U=G===void 0?void 0:Z+G,F=_.slice(Z,U);return{...H,results:F}}async function M6(J,$=[],X=50){let Y=R(),Z=[];for(let[H,_]of Object.entries(Y.shards)){if(!H||!_){console.error(`Shard ${H??"<null>"} not found, skipping`);continue}Z.push(()=>_.prepare(J).bind(...$).first().catch((U)=>{return console.error(`Error executing query on shard ${H}:`,U),null}))}let G=[];for(let H=0;H<Z.length;H+=X){let _=Z.slice(H,H+X).map((U)=>U());G.push(...await Promise.all(_))}return G}async function E7(J,$=[],X={}){return(await z6(J,$,{...X,limit:1})).results[0]??null}async function P7(){let J=R();if(await q(J).clearAllMappings(),s.clear(),J.coordinator)try{let X=J.coordinator.idFromName("default");await J.coordinator.get(X).fetch("http://coordinator/flush",{method:"POST"})}catch(X){console.warn("Failed to flush coordinator:",X)}}async function T7(J){let X=R().shards[J];if(!X)throw new j(`Shard ${J} not found`,"SHARD_NOT_FOUND");return await jJ(X)}var D7=/^[A-Za-z_][A-Za-z0-9_]*$/;function p(J){let $=J.trim();if(!$)throw new j("Identifier cannot be empty","INVALID_IDENTIFIER");let X=$.split(".").map((Y)=>Y.trim());if(X.some((Y)=>!Y||!D7.test(Y)))throw new j(`Invalid SQL identifier: ${J}`,"INVALID_IDENTIFIER");return X.map((Y)=>`"${Y}"`).join(".")}function F6(J){return J.toLowerCase().replace(/[^a-z0-9_]+/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"")}function z7(J){if(typeof J==="string")return[{name:J}];if(!Array.isArray(J)||J.length===0)throw new j("At least one index column is required","INVALID_INDEX_COLUMNS");return J.map(($)=>{if(typeof $==="string")return{name:$};if(!$?.name)throw new j("Index column name is required","INVALID_INDEX_COLUMNS");return{name:$.name,order:$.order,collate:$.collate}})}function xJ(J,$,X={}){let Y=z7($),Z=p(J),G=X.indexName?X.indexName:["idx",F6(J),...Y.map((O)=>F6(O.name))].filter(Boolean).join("_").slice(0,120),H=p(G||"idx_auto"),_=Y.map((O)=>{let A=p(O.name),Q=O.order?` ${O.order}`:"",z=O.collate?` COLLATE ${p(O.collate).replace(/"/g,"")}`:"";return`${A}${z}${Q}`}).join(", "),U=X.ifNotExists===!1?"":" IF NOT EXISTS",F=X.unique?"UNIQUE ":"",W=X.where?.trim()?` WHERE ${X.where.trim()}`:"";return`CREATE ${F}INDEX${U} ${H} ON ${Z} (${_})${W}`}async function M7(J,$,X,Y={}){let Z=xJ($,X,Y);return Q6(J,Z)}async function I7(J,$,X,Y={}){let Z=xJ($,X,Y);return vJ(J,Z)}async function B7(J,$,X={}){let Y=xJ(J,$,X);return T6(Y,[],YJ(X.batchSize))}function KJ(J,$="query-plan"){switch($){case"raw":return`EXPLAIN ${J}`;case"analyze":return`EXPLAIN ANALYZE ${J}`;case"query-plan":default:return`EXPLAIN QUERY PLAN ${J}`}}async function R7(J,$,X=[],Y={}){return E6(J,KJ($,Y.mode),X)}async function N7(J,$,X=[],Y={}){return QJ(J,KJ($,Y.mode),X)}async function C7(J,$=[],X={}){return VJ(KJ(J,X.mode),$,YJ(X.batchSize))}async function w7(J,$){let X=p($),Y=await P6(J,`SELECT COUNT(*) AS row_count FROM ${X}`);if(!Y||Y.row_count===void 0||Y.row_count===null)return 0;return Number(Y.row_count)||0}async function v7(J,$){let X=p($),Y=await kJ(J,`SELECT COUNT(*) AS row_count FROM ${X}`);if(!Y||Y.row_count===void 0||Y.row_count===null)return 0;return Number(Y.row_count)||0}async function k7(J,$=50){let X=R(),Y=YJ($),G=`SELECT COUNT(*) AS row_count FROM ${p(J)}`,H=[];for(let[F,W]of Object.entries(X.shards)){if(!F||!W)continue;H.push(async()=>{try{let O=await W.prepare(G).first(),A=Number(O?.row_count??0);return{shard:F,count:Number.isFinite(A)?A:0,success:!0}}catch(O){return{shard:F,count:null,success:!1,error:O instanceof Error?O.message:String(O)}}})}let _=[];for(let F=0;F<H.length;F+=Y){let W=H.slice(F,F+Y).map((O)=>O());_.push(...await Promise.all(W))}return{total:_.reduce((F,W)=>F+(W.count??0),0),shards:_}}async function x7(J){let $=R(),X=await L6(J,"read"),Y=$.shards[X];if(!Y)throw new j(`Shard ${X} not found in configuration`,"SHARD_NOT_FOUND");return jJ(Y)}async function I6(J=50){let $=R(),X=YJ(J),Y=[];for(let[G,H]of Object.entries($.shards)){if(!G||!H)continue;Y.push(async()=>{try{return{shard:G,size:await jJ(H),success:!0}}catch(_){return{shard:G,size:null,success:!1,error:_ instanceof Error?_.message:String(_)}}})}let Z=[];for(let G=0;G<Y.length;G+=X){let H=Y.slice(G,G+X).map((_)=>_());Z.push(...await Promise.all(H))}return Z}async function K7(J=50){return(await I6(J)).reduce((X,Y)=>X+(Y.size??0),0)}b();class B6{state;constructor(J){this.state=J}async getState(){return await this.state.storage.get("coordinator_state")||{knownShards:[],shardStats:{},strategy:"round-robin",roundRobinIndex:0}}async saveState(J){await this.state.storage.put("coordinator_state",J)}async fetch(J){let X=new URL(J.url).pathname,Y=J.method;try{switch(`${Y} ${X}`){case"GET /shards":return this.handleListShards();case"POST /shards":return this.handleAddShard(J);case"DELETE /shards":return this.handleRemoveShard(J);case"GET /stats":return this.handleGetStats();case"POST /stats":return this.handleUpdateStats(J);case"POST /allocate":return this.handleAllocateShard(J);case"POST /flush":return this.handleFlush();case"GET /health":return new Response("OK",{status:200});default:return new Response("Not Found",{status:404})}}catch(Z){return console.error("ShardCoordinator error:",Z),new Response("Internal Server Error",{status:500})}}async handleListShards(){let J=await this.getState();return new Response(JSON.stringify(J.knownShards),{headers:{"Content-Type":"application/json"}})}async handleAddShard(J){let{shard:$}=await J.json();if(!$||typeof $!=="string")return new Response(JSON.stringify({error:"Missing or invalid shard parameter"}),{status:400,headers:{"Content-Type":"application/json"}});let X=await this.getState();if(!X.knownShards.includes($))X.knownShards.push($),X.shardStats[$]={binding:$,count:0,lastUpdated:Date.now()},await this.saveState(X);return new Response(JSON.stringify({success:!0}),{headers:{"Content-Type":"application/json"}})}async handleRemoveShard(J){let{shard:$}=await J.json();if(!$||typeof $!=="string")return new Response(JSON.stringify({error:"Missing or invalid shard parameter"}),{status:400,headers:{"Content-Type":"application/json"}});let X=await this.getState(),Y=X.knownShards.indexOf($);if(Y>-1){if(X.knownShards.splice(Y,1),delete X.shardStats[$],X.roundRobinIndex>=X.knownShards.length)X.roundRobinIndex=0;await this.saveState(X)}return new Response(JSON.stringify({success:!0}),{headers:{"Content-Type":"application/json"}})}async handleGetStats(){let J=await this.getState(),$=Object.values(J.shardStats);return new Response(JSON.stringify($),{headers:{"Content-Type":"application/json"}})}async handleUpdateStats(J){let{shard:$,count:X}=await J.json();if(!$||typeof $!=="string")return new Response(JSON.stringify({error:"Missing or invalid shard parameter"}),{status:400,headers:{"Content-Type":"application/json"}});if(X===void 0||typeof X!=="number")return new Response(JSON.stringify({error:"Missing or invalid count parameter"}),{status:400,headers:{"Content-Type":"application/json"}});let Y=await this.getState();if(Y.shardStats[$])Y.shardStats[$].count=X,Y.shardStats[$].lastUpdated=Date.now(),await this.saveState(Y);return new Response(JSON.stringify({success:!0}),{headers:{"Content-Type":"application/json"}})}async handleAllocateShard(J){let{primaryKey:$,strategy:X,operationType:Y,availableShards:Z}=await J.json();if(!$||typeof $!=="string")return new Response(JSON.stringify({error:"Missing or invalid primaryKey parameter"}),{status:400,headers:{"Content-Type":"application/json"}});let G=await this.getState(),H=Z||G.knownShards;if(H.length===0)return new Response(JSON.stringify({error:"No shards available"}),{status:400,headers:{"Content-Type":"application/json"}});let _=this.resolveStrategy(G.strategy,X,Y||"write"),U=this.selectShard($,G,_,H);if(_==="round-robin")G.roundRobinIndex=(G.roundRobinIndex+1)%H.length,await this.saveState(G);return new Response(JSON.stringify({shard:U}),{headers:{"Content-Type":"application/json"}})}async handleFlush(){return await this.state.storage.deleteAll(),new Response(JSON.stringify({success:!0}),{headers:{"Content-Type":"application/json"}})}resolveStrategy(J,$,X="write"){if($)return $;if(typeof J==="string")return J;return J[X]}selectShard(J,$,X,Y){let Z=Y||$.knownShards;if(Z.length===0)throw new j("No shards available","NO_SHARDS");switch(X){case"round-robin":return Z[$.roundRobinIndex]??Z[0];case"random":return Z[Math.floor(Math.random()*Z.length)];case"hash":{let G=0;for(let _=0;_<J.length;_++){let U=J.charCodeAt(_);G=(G<<5)-G+U,G=G&G}let H=Math.abs(G)%Z.length;return Z[H]}case"location":{let G=$.targetRegion,H=$.shardLocations||{},_=Z.filter((E)=>H[E]);if(!G||_.length===0){let E=0;for(let M=0;M<J.length;M++){let D=J.charCodeAt(M);E=(E<<5)-E+D,E=E&E}let P=Math.abs(E)%Z.length;return Z[P]}let U={wnam:{lat:37.7749,lon:-122.4194},enam:{lat:40.7357,lon:-74.1724},weur:{lat:51.5074,lon:-0.1278},eeur:{lat:52.2297,lon:21.0122},apac:{lat:35.6762,lon:139.6503},oc:{lat:-33.8688,lon:151.2093},me:{lat:25.2048,lon:55.2708},af:{lat:-26.2041,lon:28.0473}},F=(E,P)=>(P in E),W=(E)=>F(U,E)?E:"wnam",O=(E,P)=>{let M=U[W(E)],D=U[W(P)],V=M.lat-D.lat,L=M.lon-D.lon;return Math.sqrt(V*V+L*L)},A=_.map((E)=>{let P=H[E],M=O(G,P.region),D=P.priority||1;return{shard:E,score:M-D*0.1}});A.sort((E,P)=>E.score-P.score);let Q=A[0].score,z=A.filter((E)=>Math.abs(E.score-Q)<0.01);if(z.length===1)return z[0].shard;let T=0;for(let E=0;E<J.length;E++){let P=J.charCodeAt(E);T=(T<<5)-T+P,T=T&T}let B=Math.abs(T)%z.length;return z[B].shard}default:return Z[0]}}async incrementShardCount(J){let $=await this.getState();if($.shardStats[J])$.shardStats[J].count++,$.shardStats[J].lastUpdated=Date.now(),await this.saveState($)}async decrementShardCount(J){let $=await this.getState();if($.shardStats[J]&&$.shardStats[J].count>0)$.shardStats[J].count--,$.shardStats[J].lastUpdated=Date.now(),await this.saveState($)}}b();JJ();b();var S7=500;function C6(J,$={}){let X=$.scanCount??S7;return{async get(Y,Z="text"){let G=await J.get(Y);if(G===null)return null;if(Z!=="json")return G;try{return JSON.parse(G)}catch(H){throw new j(`Failed to parse JSON from Redis for key ${Y}: ${H instanceof Error?H.message:String(H)}`,"KV_JSON_PARSE_FAILED")}},async put(Y,Z){await J.set(Y,Z)},async delete(Y){await J.del(Y)},async list(Y){let Z=Y?.prefix??"",G=`${Z}*`,H=Y?.cursor??"0",_=Y?.limit,U=[];do{let F=await m7(J,H,G,X);H=F.cursor;for(let W of F.keys){if(!Z||W.startsWith(Z))U.push(W);if(_&&U.length>=_)break}if(_&&U.length>=_)break}while(H!=="0");return{keys:U.map((F)=>({name:F})),cursor:H,list_complete:H==="0"}}}}function q7(J,$={}){return C6(J,$)}function w6(J,$){if($)return PJ(J,$);return{prepare(X){return new yJ(J,X)}}}function v6(J,$){if($)return PJ(J,$);return{prepare(X){return new gJ(J,X)}}}function f7(J,$){if($)return PJ(J,$);return{prepare(X){return new pJ(J,X)}}}function PJ(J,$){return{prepare(X){return new mJ(J,$,X)}}}function b7(J){return{async get($,X="text"){let Y=await l7(J,$);if(Y===null||Y===void 0)return null;if(X==="json"){if(typeof Y==="string")try{return JSON.parse(Y)}catch(Z){throw new j(`Failed to parse JSON from NuxtHub KV for key ${$}: ${Z instanceof Error?Z.message:String(Z)}`,"KV_JSON_PARSE_FAILED")}return Y}return typeof Y==="string"?Y:JSON.stringify(Y)},async put($,X){await o7(J,$,X)},async delete($){await n7(J,$)},async list($){let X=$?.prefix??"",Y=await i7(J,X);return{keys:(typeof $?.limit==="number"?Y.slice(0,$.limit):Y).map((G)=>({name:G})),list_complete:!0}}}}function h7(J,$){return w6({query:async(Y,Z=[])=>{let G=$(J.connectionString);if(typeof G.connect==="function")await G.connect();try{return await G.query(Y,Z)}finally{if(typeof G.release==="function")G.release();else if(typeof G.end==="function")await G.end()}}})}function y7(J,$){return v6({execute:async(Y,Z=[])=>{let G=$(J.connectionString);try{if(typeof G.execute==="function")return await G.execute(Y,Z);if(typeof G.query==="function")return await G.query(Y,Z);throw new j("Hyperdrive MySQL client is missing execute/query methods","MYSQL_CLIENT_INVALID")}finally{if(typeof G.end==="function")await G.end();else if(typeof G.close==="function")await G.close();else if(typeof G.destroy==="function")G.destroy()}}})}function g7(J){if(!J||typeof J!=="object")return!1;return typeof J.prepare==="function"}function p7(J){if(!J||typeof J!=="object")return!1;let $=J;return typeof $.get==="function"&&typeof $.put==="function"&&typeof $.delete==="function"&&typeof $.list==="function"}class yJ{client;sql;bindings;constructor(J,$,X=[]){this.client=J,this.sql=$,this.bindings=X}bind(...J){return new yJ(this.client,this.sql,J)}async run(){let J=Date.now(),$=hJ(this.sql),X=await this.client.query($,this.bindings);return{success:!0,results:X.rows??[],meta:K(J,{changes:typeof X.rowCount==="number"?X.rowCount:void 0,command:X.command})}}async all(){let J=Date.now(),$=hJ(this.sql),X=await this.client.query($,this.bindings);return{success:!0,results:X.rows??[],meta:K(J,{changes:typeof X.rowCount==="number"?X.rowCount:void 0,command:X.command})}}async first(){let J=hJ(this.sql);return(await this.client.query(J,this.bindings)).rows?.[0]??null}}class gJ{client;sql;bindings;constructor(J,$,X=[]){this.client=J,this.sql=$,this.bindings=X}bind(...J){return new gJ(this.client,this.sql,J)}async run(){let J=Date.now(),$=await SJ(this.client,this.sql,this.bindings);if(Array.isArray($))return{success:!0,results:$,meta:K(J)};let X=$;return{success:!0,results:[],meta:K(J,{changes:X.affectedRows,last_row_id:X.insertId,warningStatus:X.warningStatus})}}async all(){let J=Date.now(),$=await SJ(this.client,this.sql,this.bindings);return{success:!0,results:Array.isArray($)?$:[],meta:K(J,{changes:!Array.isArray($)?$.affectedRows:void 0})}}async first(){let J=await SJ(this.client,this.sql,this.bindings);if(!Array.isArray(J)||J.length===0)return null;return J[0]}}class pJ{client;sql;bindings;constructor(J,$,X=[]){this.client=J,this.sql=$,this.bindings=X}bind(...J){return new pJ(this.client,this.sql,J)}async run(){let J=Date.now();if(typeof this.client.execute==="function"){let Z=await this.client.execute(this.sql,this.bindings);return{success:!0,results:bJ(Z),meta:K(J)}}let $=this.client.prepare?.(this.sql);if(!$||typeof $.run!=="function")throw new j("SQLite client must expose execute() or prepare().run()","SQLITE_CLIENT_INVALID");let Y=await $.run(...this.bindings)??{};return{success:!0,results:[],meta:K(J,{changes:EJ(Y.changes),last_row_id:Y.lastInsertRowid??Y.lastID})}}async all(){let J=Date.now();if(typeof this.client.execute==="function"){let Y=await this.client.execute(this.sql,this.bindings);return{success:!0,results:bJ(Y),meta:K(J)}}let $=this.client.prepare?.(this.sql);if(!$||typeof $.all!=="function")throw new j("SQLite client must expose execute() or prepare().all()","SQLITE_CLIENT_INVALID");let X=await $.all(...this.bindings);return{success:!0,results:Array.isArray(X)?X:[],meta:K(J)}}async first(){if(typeof this.client.execute==="function"){let $=await this.client.execute(this.sql,this.bindings);return bJ($)[0]??null}let J=this.client.prepare?.(this.sql);if(!J)throw new j("SQLite client must expose execute() or prepare().get()","SQLITE_CLIENT_INVALID");if(typeof J.get==="function"){let $=await J.get(...this.bindings);return $===void 0||$===null?null:$}if(typeof J.all==="function"){let $=await J.all(...this.bindings);if(!Array.isArray($)||$.length===0)return null;let X=$[0];return X===void 0||X===null?null:X}throw new j("SQLite prepare() result must expose get() or all()","SQLITE_CLIENT_INVALID")}}class mJ{client;sqlTag;sqlText;bindings;constructor(J,$,X,Y=[]){this.client=J,this.sqlTag=$,this.sqlText=X,this.bindings=Y}bind(...J){return new mJ(this.client,this.sqlTag,this.sqlText,J)}async run(){let J=Date.now(),$=qJ(this.sqlTag,this.sqlText,this.bindings),X=await u7(this.client,$);return{success:!0,results:fJ(X),meta:K(J,N6(X))}}async all(){let J=Date.now(),$=qJ(this.sqlTag,this.sqlText,this.bindings),X=await k6(this.client,$);return{success:!0,results:fJ(X),meta:K(J,N6(X))}}async first(){let J=qJ(this.sqlTag,this.sqlText,this.bindings),$=await c7(this.client,J),X=fJ($);if(X.length>0)return X[0]??null;if($&&typeof $==="object"&&"row"in $){let Y=$.row;return Y===void 0||Y===null?null:Y}if($&&typeof $==="object"&&!Array.isArray($)&&!("rows"in $)&&!("results"in $)&&!("data"in $))return $;return null}}async function m7(J,$,X,Y){try{let Z=await J.scan($,{MATCH:X,COUNT:Y});return R6(Z)}catch{let Z=await J.scan($,"MATCH",X,"COUNT",String(Y));return R6(Z)}}function R6(J){if(Array.isArray(J))return{cursor:String(J[0]??"0"),keys:Array.isArray(J[1])?J[1]:[]};return{cursor:String(J.cursor??"0"),keys:Array.isArray(J.keys)?J.keys:[]}}async function SJ(J,$,X){if(typeof J.execute==="function"){let Y=await J.execute($,X);if(Array.isArray(Y))return Y[0];return Y}if(typeof J.query==="function"){let Y=await J.query($,X);if(Array.isArray(Y))return Y[0];return Y}throw new j("MySQL client must expose execute() or query()","MYSQL_CLIENT_INVALID")}async function u7(J,$){if(typeof J.run==="function")return await J.run($);if(typeof J.execute==="function")return await J.execute($);if(typeof J.all==="function")return await J.all($);throw new j("Drizzle client must expose run(), execute(), or all()","DRIZZLE_CLIENT_INVALID")}async function k6(J,$){if(typeof J.all==="function")return await J.all($);if(typeof J.execute==="function")return await J.execute($);if(typeof J.run==="function")return await J.run($);throw new j("Drizzle client must expose all(), execute(), or run()","DRIZZLE_CLIENT_INVALID")}async function c7(J,$){if(typeof J.get==="function")return await J.get($);return await k6(J,$)}function qJ(J,$,X){let Y=d7($),Z=Y.length-1;if(Z!==X.length)throw new j(`Drizzle binding mismatch: expected ${Z} bindings, received ${X.length}`,"DRIZZLE_BINDINGS_MISMATCH");if(Z===0)return J.raw($);let G=typeof J.empty==="function"?J.empty():J.raw("");for(let H=0;H<Y.length;H++){let _=Y[H];if(_)G.append(J.raw(_));if(H<Z)G.append(J`${X[H]}`)}return G}function d7(J){let $=[],X=0,Y=!1,Z=!1,G=!1,H=!1;for(let _=0;_<J.length;_++){let U=J[_],F=_+1<J.length?J[_+1]:"";if(G){if(U===`
|
|
17
|
+
`)G=!1;continue}if(H){if(U==="*"&&F==="/")_++,H=!1;continue}if(!Y&&!Z){if(U==="-"&&F==="-"){_++,G=!0;continue}if(U==="/"&&F==="*"){_++,H=!0;continue}}if(U==="'"&&!Z){if(Y&&F==="'"){_++;continue}Y=!Y;continue}if(U==='"'&&!Y){if(Z&&F==='"'){_++;continue}Z=!Z;continue}if(U==="?"&&!Y&&!Z)$.push(J.slice(X,_)),X=_+1}return $.push(J.slice(X)),$}function fJ(J){let $=(Y)=>{if(!Y||typeof Y!=="object"||Array.isArray(Y))return;let Z=Y;if(Array.isArray(Z.rows))return Z.rows;if(Array.isArray(Z.results))return Z.results;if(Array.isArray(Z.data))return Z.data;return},X=(Y)=>{if(!Y||typeof Y!=="object"||Array.isArray(Y))return!1;return Object.keys(Y).length>0};if(Array.isArray(J)){if(J.length===2){let Y=$(J[0]);if(Y)return Y;let Z=$(J[1]);if(Z)return Z;if(!Array.isArray(J[0])&&!Array.isArray(J[1])){if(X(J[0]))return[J[0]];if(X(J[1]))return[J[1]]}if(Array.isArray(J[0]))return J[0];if(Array.isArray(J[1]))return J[1]}return J}if(J&&typeof J==="object"){let Y=$(J);if(Y)return Y}return[]}function N6(J){if(!J)return{};let $;if(Array.isArray(J)){if(J.length===2){if(J[0]&&typeof J[0]==="object"&&!Array.isArray(J[0]))$=J[0];else if(J[1]&&typeof J[1]==="object"&&!Array.isArray(J[1]))$=J[1]}}else if(typeof J==="object"&&!Array.isArray(J))$=J;if(!$)return{};let X={},Y=EJ($.rowCount)??EJ($.changes)??EJ($.affectedRows);if(Y!==void 0)X.changes=Y;let Z=$.lastInsertRowid??$.lastInsertId??$.lastID??$.lastRowID??$.insertId??$.insertID;if(typeof Z==="number"||typeof Z==="string")X.last_row_id=Z;if($.meta&&typeof $.meta==="object")Object.assign(X,$.meta);return X}async function l7(J,$){if(typeof J.get==="function")return await J.get($);if(typeof J.getItem==="function")return await J.getItem($);throw new j("NuxtHub KV client must expose get() or getItem()","NUXTHUB_KV_CLIENT_INVALID")}async function o7(J,$,X){if(typeof J.set==="function"){await J.set($,X);return}if(typeof J.setItem==="function"){await J.setItem($,X);return}throw new j("NuxtHub KV client must expose set() or setItem()","NUXTHUB_KV_CLIENT_INVALID")}async function n7(J,$){if(typeof J.del==="function"){await J.del($);return}if(typeof J.removeItem==="function"){await J.removeItem($);return}throw new j("NuxtHub KV client must expose del() or removeItem()","NUXTHUB_KV_CLIENT_INVALID")}async function i7(J,$){let X;if(typeof J.keys==="function")X=await J.keys($);else if(typeof J.getKeys==="function")X=await J.getKeys($);else throw new j("NuxtHub KV client must expose keys() or getKeys()","NUXTHUB_KV_CLIENT_INVALID");if(!Array.isArray(X))return[];if(!$)return[...X];return X.filter((Y)=>Y.startsWith($))}function bJ(J){if(Array.isArray(J))return J;if(J&&typeof J==="object"){let $=J;if(Array.isArray($.rows))return $.rows;if(Array.isArray($.results))return $.results}return[]}function K(J,$={}){return{duration:Date.now()-J,...$}}function EJ(J){if(typeof J==="number"&&Number.isFinite(J))return J;return}var ZJ=new Map;function hJ(J){let $=ZJ.get(J);if($)return $;let X="",Y=0,Z=!1,G=!1,H=!1,_=!1;for(let U=0;U<J.length;U++){let F=J[U],W=U+1<J.length?J[U+1]:"";if(H){if(X+=F,F===`
|
|
18
|
+
`)H=!1;continue}if(_){if(X+=F,F==="*"&&W==="/")X+="/",U++,_=!1;continue}if(!Z&&!G){if(F==="-"&&W==="-"){X+="--",U++,H=!0;continue}if(F==="/"&&W==="*"){X+="/*",U++,_=!0;continue}}if(F==="'"&&!G){Z=!Z,X+=F;continue}if(F==='"'&&!Z){G=!G,X+=F;continue}if(F==="?"&&!Z&&!G){Y++,X+=`$${Y}`;continue}X+=F}if(ZJ.set(J,X),ZJ.size>5000){let U=ZJ.keys().next().value;if(U)ZJ.delete(U)}return X}b();var s7={casing:{getColumnCasing(J){return J?.name??""}},escapeName(J){return J},escapeParam(){return"?"},escapeString(J){return J.replace(/'/g,"''")}},h6=["<=",">=","!=","<>","=","<",">"],t7=new Set(["COUNT","MAX","MIN","SUM","AVG"]),a7=new Set(["COALESCE","IFNULL","LOWER","UPPER","LENGTH","ABS"]);function N(J){return J.trim().replace(/^[`"\[]+|[`"\]]+$/g,"").split(".").pop()?.trim()??J.trim()}function r7(J){return J.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function m(J){if(typeof J==="number"&&Number.isFinite(J))return J;if(typeof J==="bigint")return Number(J);if(typeof J==="string"){let $=J.trim();if($==="")return;let X=Number($);return Number.isFinite(X)?X:void 0}return}function r(J,$=","){let X=[],Y=0,Z="",G=!1,H=!1;for(let U=0;U<J.length;U++){let F=J[U];if(F==="'"&&!H){G=!G,Z+=F;continue}if(F==='"'&&!G){H=!H,Z+=F;continue}if(!G&&!H){if(F==="(")Y++;else if(F===")")Y=Math.max(0,Y-1);else if(Y===0&&F===$){X.push(Z.trim()),Z="";continue}}Z+=F}let _=Z.trim();if(_.length>0)X.push(_);return X}function IJ(J,$){let X=0,Y=!1,Z=!1;for(let G=$;G<J.length;G++){let H=J[G];if(H==="'"&&!Z){Y=!Y;continue}if(H==='"'&&!Y){Z=!Z;continue}if(Y||Z)continue;if(H==="(")X++;else if(H===")"){if(X--,X===0)return G}}return-1}function _J(J){let $=J.trim();if($.length===0)return{value:null,consumed:!1};if($==="?")return{value:null,consumed:!1};if(/^null$/i.test($))return{value:null,consumed:!0};if(/^true$/i.test($))return{value:1,consumed:!0};if(/^false$/i.test($))return{value:0,consumed:!0};if($.startsWith("'")&&$.endsWith("'")||$.startsWith('"')&&$.endsWith('"'))return{value:$.slice(1,-1).replace(/''/g,"'").replace(/""/g,'"'),consumed:!0};let X=Number($);if(Number.isFinite(X)&&/^-?\d+(\.\d+)?$/.test($))return{value:X,consumed:!0};return{value:void 0,consumed:!1}}function TJ(J){let $=J.toUpperCase(),X=x($,J,"WHERE");if(X===-1){let H=x($,J,"FROM");return{whereClause:null,afterWhere:H===-1?"":J.slice(H+4)}}let Y=X+5,Z=["ORDER BY","GROUP BY","HAVING","LIMIT","OFFSET","RETURNING",";"],G=J.length;for(let H of Z){let _=x($,J,H,Y);if(_!==-1&&_<G)G=_}return{whereClause:J.slice(Y,G).trim(),afterWhere:J.slice(G)}}function x(J,$,X,Y=0){let Z=Y,G=!1,H=!1;while(Z<=J.length-X.length){let _=$[Z];if(_==="'"&&!H){G=!G,Z++;continue}if(_==='"'&&!G){H=!H,Z++;continue}if(!G&&!H){if(J.startsWith(X,Z)){let U=Z===0?" ":J[Z-1],F=J[Z+X.length]??" ",W=/[A-Z0-9_]/.test(U)===!1,O=/[A-Z0-9_]/.test(F)===!1;if(W&&O)return Z}}Z++}return-1}function x6(J){let $=J.toUpperCase(),X={},Y=x($,J,"LIMIT");if(Y!==-1){let H=J.slice(Y+5).trim().match(/^(\d+)(?:\s*,\s*(\d+))?/);if(H){let _=Number(H[1]),U=H[2]!==void 0?Number(H[2]):void 0;if(U!==void 0)X.offset=_,X.limit=U;else X.limit=_}}let Z=x($,J,"OFFSET");if(Z!==-1){let H=J.slice(Z+6).trim().match(/^(\d+)/);if(H)X.offset=Number(H[1])}return X}function e7(J){let $=[];for(let X of r(J,",")){let Y=X.indexOf("=");if(Y===-1)continue;let Z=N(X.slice(0,Y)),G=X.slice(Y+1).trim();if(Z.length===0)continue;$.push({column:Z,expression:G})}return $}function DJ(J){let $=[],X=0;while(X<J.length){let Y=J[X];if(/\s/.test(Y)){X++;continue}if(Y==="("||Y===")"){$.push(Y),X++;continue}if(Y==="?"){$.push("?"),X++;continue}if(Y==="'"||Y==='"'){let H=Y,_=X+1;while(_<J.length){if(J[_]===H){if(J[_+1]===H){_+=2;continue}_++;break}_++}$.push(J.slice(X,_)),X=_;continue}let Z=null;for(let H of h6)if(J.startsWith(H,X)){Z=H;break}if(Z){$.push(Z),X+=Z.length;continue}let G=X;while(G<J.length&&/[A-Za-z0-9_.$]/.test(J[G]))G++;if(G===X)$.push(Y),X++;else $.push(J.slice(X,G)),X=G}return $}class GJ{tokens;position=0;constructor(J){this.tokens=J}parse(){if(this.tokens.length===0)return{type:"always-true"};return this.parseOr()}peek(){return this.tokens[this.position]}take(){return this.tokens[this.position++]}isKeyword(J,$){return typeof J==="string"&&J.toUpperCase()===$}parseOr(){let J=this.parseAnd();while(this.isKeyword(this.peek(),"OR")){this.take();let $=this.parseAnd();J=J.type==="or"?{type:"or",children:[...J.children,$]}:{type:"or",children:[J,$]}}return J}parseAnd(){let J=this.parseTerm();while(this.isKeyword(this.peek(),"AND")){this.take();let $=this.parseTerm();J=J.type==="and"?{type:"and",children:[...J.children,$]}:{type:"and",children:[J,$]}}return J}parseTerm(){if(this.peek()==="("){this.take();let $=this.parseOr();if(this.peek()===")")this.take();return $}return this.parseComparison()}parseComparison(){let J=this.take();if(J===void 0)return{type:"always-true"};let $=N(J),X=this.take();if(X===void 0)return{type:"always-true"};let Y=X.toUpperCase();if(Y==="IS"){let _=this.peek();if(this.isKeyword(_,"NOT")){this.take();let F=this.take();if(this.isKeyword(F,"NULL"))return{type:"null-check",column:$,operator:"IS NOT NULL"}}let U=this.take();if(this.isKeyword(U,"NULL"))return{type:"null-check",column:$,operator:"IS NULL"};return{type:"always-true"}}let Z=null;if(Y==="LIKE")Z="LIKE";else if(Y==="NOT"){let _=this.take();if(this.isKeyword(_,"LIKE"))Z="NOT LIKE";else return{type:"always-true"}}else if(h6.includes(Y))Z=Y;if(!Z)return{type:"always-true"};let G=this.take();if(G==="?")return{type:"compare",column:$,operator:Z,value:{kind:"param"}};let H=_J(G??"");return{type:"compare",column:$,operator:Z,value:{kind:"literal",value:H.consumed?H.value:G??null}}}}function a(J,$,X,Y){switch(J.type){case"always-true":return!0;case"and":return J.children.every((Z)=>a(Z,$,X,Y));case"or":{let Z=!1;for(let G of J.children)if(a(G,$,X,Y))Z=!0;return Z}case"null-check":{let Z=$[J.column],G=Z===null||Z===void 0;return J.operator==="IS NULL"?G:!G}case"compare":{let Z;if(J.value.kind==="param")Z=X[Y.value++];else Z=J.value.value;let G=$[J.column];if(J.operator==="LIKE"||J.operator==="NOT LIKE"){let F=String(Z??""),O=new RegExp(`^${r7(F).replace(/%/g,".*").replace(/_/g,".")}$`,"i").test(String(G??""));return J.operator==="LIKE"?O:!O}let H=m(G),_=m(Z),U;if(H!==void 0&&_!==void 0)U=H===_?0:H<_?-1:1;else if(G===null||G===void 0)if(Z===null||Z===void 0)U=0;else U=-1;else if(Z===null||Z===void 0)U=1;else{let F=String(G),W=String(Z);U=F===W?0:F<W?-1:1}switch(J.operator){case"=":return U===0;case"!=":case"<>":return U!==0;case"<":return U<0;case"<=":return U<=0;case">":return U>0;case">=":return U>=0;default:return!1}}}}function K6(J){let $=0,X=!1,Y=!1;for(let Z=0;Z<J.length;Z++){let G=J[Z];if(G==="'"&&!Y){X=!X;continue}if(G==='"'&&!X){Y=!Y;continue}if(!X&&!Y&&G==="?")$++}return $}function S6(J){let $=J.trim().toUpperCase();if($.startsWith("SELECT")||$.startsWith("WITH")){if($.includes("SQLITE_MASTER"))return"sqlite-master-select";return"select"}if($.startsWith("INSERT"))return"insert";if($.startsWith("UPDATE"))return"update";if($.startsWith("DELETE"))return"delete";if($.startsWith("CREATE TABLE"))return"create-table";if($.startsWith("DROP TABLE"))return"drop-table";if($.startsWith("PRAGMA"))return"pragma";return"other"}function t(J){let $=J.toUpperCase(),X=J.match(/create\s+table\s+(?:if\s+not\s+exists\s+)?([`"\[]?[\w.]+[`"\]]?)/i);if(X)return N(X[1]??"");let Y=J.match(/drop\s+table\s+(?:if\s+exists\s+)?([`"\[]?[\w.]+[`"\]]?)/i);if(Y)return N(Y[1]??"");let Z=J.match(/insert\s+(?:or\s+\w+\s+)?into\s+([`"\[]?[\w.]+[`"\]]?)/i);if(Z)return N(Z[1]??"");let G=J.match(/update\s+(?:or\s+\w+\s+)?([`"\[]?[\w.]+[`"\]]?)\s+set/i);if(G)return N(G[1]??"");let H=J.match(/delete\s+from\s+([`"\[]?[\w.]+[`"\]]?)/i);if(H)return N(H[1]??"");let _=x($,J,"FROM");if(_!==-1){let F=J.slice(_+4).trim().match(/^([`"\[]?[\w.]+[`"\]]?)/);if(F)return N(F[1]??"")}return null}function J9(J,$=[]){if(typeof J==="string")return{sql:J,bindings:$};if(!J||typeof J!=="object")throw new j("Unsupported query input","INVALID_QUERY_INPUT");if(typeof J.toQuery==="function"){let X=J.toQuery(s7);if(X&&typeof X.sql==="string")return{sql:X.sql,bindings:Array.isArray(X.params)?[...X.params]:$}}if(typeof J.sql==="string")return{sql:J.sql,bindings:Array.isArray(J.params)?[...J.params]:$};if(typeof J.text==="string")return{sql:J.text,bindings:Array.isArray(J.params)?[...J.params]:$};throw new j("Unsupported Drizzle-style query object","INVALID_QUERY_INPUT")}function dJ(J){return r(J,",").map((X)=>{let Y=X.match(/\s+as\s+([`"\[]?[\w.]+[`"\]]?)\s*$/i),Z=Y?X.slice(0,Y.index).trim():X.trim(),G=Y?N(Y[1]??""):$9(Z);if(Z==="*")return{expression:Z,alias:"*",kind:"star"};let H=Z.toUpperCase(),_=Z.match(/^([A-Za-z_][A-Za-z0-9_]*)\s*\(/);if(_){let U=(_[1]??"").toUpperCase();if(t7.has(U)||/\b(?:COUNT|MAX|MIN|SUM|AVG)\s*\(/i.test(H))return{expression:Z,alias:G,kind:"aggregate"};if(a7.has(U))return{expression:Z,alias:G,kind:"scalar"}}if(/[+\-*/()]/.test(Z)||/\bCOUNT\s*\(/i.test(Z)||/\bMAX\s*\(/i.test(Z))return{expression:Z,alias:G,kind:"expression"};return{expression:Z,alias:G,kind:"column"}})}function $9(J){let $=J.trim();if($==="*")return"*";if($.match(/^([`"\[]?[\w.]+[`"\]]?)$/))return N($);return $}function y6(J,$,X){let Y="",Z=!1,G=!1,H=0,_=X;while(H<J.length){let U=J[H];if(U==="'"&&!G){Z=!Z,Y+=U,H++;continue}if(U==='"'&&!Z){G=!G,Y+=U,H++;continue}if(!Z&&!G&&U==="?"){let F=$[_++];Y+=lJ(F),H++;continue}Y+=U,H++}return{expression:Y,cursor:_}}function lJ(J){if(J===null||J===void 0)return"NULL";if(typeof J==="number"||typeof J==="bigint")return String(J);if(typeof J==="boolean")return J?"1":"0";return`'${String(J).replace(/'/g,"''")}'`}function zJ(J,$,X,Y){if(J.kind==="star")return;if(J.kind==="column"){let H=$[0];return H?H[J.expression]:null}let Z=y6(J.expression,X,Y).expression;if(J.kind==="aggregate"||/\b(?:COUNT|MAX|MIN|SUM|AVG)\s*\(/i.test(Z))return X9(Z,$);if(J.kind==="scalar"){let H=$[0]??{};return HJ(Z,H)}let G=$[0]??{};return HJ(Z,G)}function X9(J,$){let X=J,Y=/(COUNT|MAX|MIN|SUM|AVG)\s*\(/i,Z=0;while(Y.test(X)&&Z<25){Z++;let G=X.match(Y);if(!G||G.index===void 0)break;let H=X.indexOf("(",G.index);if(H===-1)break;let _=IJ(X,H);if(_===-1)break;let U=(G[1]??"").toUpperCase(),F=X.slice(H+1,_).trim(),W=Y9(U,F,$),O=lJ(W);X=X.slice(0,G.index)+O+X.slice(_+1)}return HJ(X,$[0]??{})}function Y9(J,$,X){if(J==="COUNT"){if($==="*")return X.length;let G=/^distinct\s+/i.test($),H=N($.replace(/^distinct\s+/i,"")),_=X.map((U)=>U[H]).filter((U)=>U!==null&&U!==void 0);if(G)return new Set(_.map((U)=>String(U))).size;return _.length}let Y=N($),Z=X.map((G)=>m(G[Y])).filter((G)=>G!==void 0);if(Z.length===0)return null;switch(J){case"MAX":return Math.max(...Z);case"MIN":return Math.min(...Z);case"SUM":return Z.reduce((G,H)=>G+H,0);case"AVG":return Z.reduce((G,H)=>G+H,0)/Z.length;default:return null}}function HJ(J,$){let X=J.trim();if(X.length===0)return null;let Y=_J(X);if(Y.consumed)return Y.value;let Z=X.match(/^([A-Za-z_][A-Za-z0-9_]*)\s*\(/);if(Z){let H=(Z[1]??"").toUpperCase(),_=X.indexOf("(",Z.index),U=IJ(X,_);if(U!==-1){let F=X.slice(_+1,U),W=r(F,",").map((Q)=>HJ(Q,$)),O=X.slice(U+1).trim(),A=Z9(H,W);if(O.length===0)return A;return q6(`${lJ(A)} ${O}`,$)}}if(X.match(/^([`"\[]?[\w.]+[`"\]]?)$/))return $[N(X)]??null;return q6(X,$)}function Z9(J,$){switch(J){case"COALESCE":case"IFNULL":{for(let X of $)if(X!==null&&X!==void 0)return X;return null}case"LOWER":return $[0]===null||$[0]===void 0?null:String($[0]).toLowerCase();case"UPPER":return $[0]===null||$[0]===void 0?null:String($[0]).toUpperCase();case"LENGTH":return $[0]===null||$[0]===void 0?null:String($[0]).length;case"ABS":{let X=m($[0]);return X===void 0?null:Math.abs(X)}default:return null}}function q6(J,$){let X=J.trim();if(X.length===0)return null;let Y=_J(X);if(Y.consumed)return Y.value;let Z=H9(X,$);return Z===void 0?X:Z}function G9(J){let $=[],X=0;while(X<J.length){let Y=J[X];if(/\s/.test(Y)){X++;continue}if(Y==="("){$.push({type:"lparen"}),X++;continue}if(Y===")"){$.push({type:"rparen"}),X++;continue}if(Y==="+"){$.push({type:"plus"}),X++;continue}if(Y==="-"){$.push({type:"minus"}),X++;continue}if(Y==="*"){$.push({type:"star"}),X++;continue}if(Y==="/"){$.push({type:"slash"}),X++;continue}if(/[0-9.]/.test(Y)){let Z=X;while(Z<J.length&&/[0-9.]/.test(J[Z]))Z++;let G=Number(J.slice(X,Z));if(!Number.isFinite(G))return;$.push({type:"number",value:G}),X=Z;continue}if(/[A-Za-z_`"\[]/.test(Y)){let Z=X;while(Z<J.length&&/[A-Za-z0-9_`"\[\].]/.test(J[Z]))Z++;let G=J.slice(X,Z);if(/^null$/i.test(G))$.push({type:"null"});else $.push({type:"identifier",name:G});X=Z;continue}return}return $}function H9(J,$){let X=G9(J);if(!X||X.length===0)return;let Y={tokens:X,position:0},Z=g6(Y,$);if(Z===void 0)return;if(Y.position!==X.length)return;return Number.isFinite(Z)?Z:void 0}function g6(J,$){let X=f6(J,$);if(X===void 0)return;while(J.position<J.tokens.length){let Y=J.tokens[J.position];if(Y.type!=="plus"&&Y.type!=="minus")break;J.position++;let Z=f6(J,$);if(Z===void 0)return;X=Y.type==="plus"?X+Z:X-Z}return X}function f6(J,$){let X=MJ(J,$);if(X===void 0)return;while(J.position<J.tokens.length){let Y=J.tokens[J.position];if(Y.type!=="star"&&Y.type!=="slash")break;J.position++;let Z=MJ(J,$);if(Z===void 0)return;if(Y.type==="slash"&&Z===0)return;X=Y.type==="star"?X*Z:X/Z}return X}function MJ(J,$){let X=J.tokens[J.position];if(!X)return;if(X.type==="plus")return J.position++,MJ(J,$);if(X.type==="minus"){J.position++;let Y=MJ(J,$);return Y===void 0?void 0:-Y}return _9(J,$)}function _9(J,$){let X=J.tokens[J.position++];if(!X)return;if(X.type==="number")return X.value;if(X.type==="null")return 0;if(X.type==="identifier"){let Y=$[N(X.name)];if(Y===null||Y===void 0)return 0;return m(Y)}if(X.type==="lparen"){let Y=g6(J,$);if(Y===void 0)return;let Z=J.tokens[J.position++];if(!Z||Z.type!=="rparen")return;return Y}return}class oJ{tables=new Map;schemas=new Map;autoIncrementCounters=new Map;lastInsertRowId=null;prepare(J){return new p6(this,J)}async execute(J,$=[]){return await this.executeClientQuery(J,$)}async run(J,$=[]){return await this.executeClientQuery(J,$)}async all(J,$=[]){return await this.executeClientQuery(J,$)}async get(J,$=[]){return await this.executeClientQuery(J,$)}async executeClientQuery(J,$){let X=J9(J,$);return await this.executeStatement(X.sql,X.bindings)}async executeStatement(J,$){let X=Date.now();try{switch(S6(J)){case"create-table":return await this.handleCreateTable(J);case"drop-table":return await this.handleDropTable(J);case"insert":return await this.handleInsert(J,$);case"update":return await this.handleUpdate(J,$);case"delete":return await this.handleDelete(J,$);case"select":return await this.handleSelect(J,$);case"sqlite-master-select":return await this.handleSqliteMasterSelect(J,$);case"pragma":return await this.handlePragma(J);case"other":default:return{success:!0,results:[],meta:{duration:Date.now()-X}}}}catch(Y){let Z=Y instanceof Error?Y.message:String(Y);return{success:!1,results:[],meta:{duration:Date.now()-X},error:Z}}}async executeQuery(J,$){let X=Date.now(),Y=S6(J);if(Y==="select"||Y==="sqlite-master-select"||Y==="pragma")return await this.executeStatement(J,$);return{success:!1,results:[],meta:{duration:Date.now()-X},error:"Use executeStatement for non-SELECT queries"}}async handleCreateTable(J){let $=Date.now(),X=t(J);if(!X)return{success:!1,results:[],meta:{duration:Date.now()-$},error:"Could not extract table name"};let Y=new Map,Z=J.indexOf("("),G=Z===-1?-1:IJ(J,Z);if(Z!==-1&&G!==-1){let H=J.slice(Z+1,G);for(let _ of r(H,",")){let U=_.trim().split(/\s+/);if(U.length===0)continue;let F=U[0]?.toUpperCase()??"";if(["PRIMARY","FOREIGN","UNIQUE","CHECK","CONSTRAINT"].includes(F))continue;let W=N(U[0]??"");if(W.length===0)continue;let O=(U[1]??"").toUpperCase(),A=U.slice(2).join(" ").toUpperCase();Y.set(W,{name:W,type:O,isPrimaryKey:A.includes("PRIMARY KEY"),isAutoIncrement:A.includes("AUTOINCREMENT")||A.includes("AUTO_INCREMENT")||A.includes("GENERATED BY DEFAULT AS IDENTITY"),defaultValue:L9(U.slice(2).join(" ")),notNull:A.includes("NOT NULL")})}}this.tables.set(X,new Map),this.schemas.set(X,Y);for(let H of Y.values())if(H.isAutoIncrement){this.autoIncrementCounters.set(X,this.autoIncrementCounters.get(X)??0);break}return{success:!0,results:[],meta:{duration:Date.now()-$}}}async handleDropTable(J){let $=Date.now(),X=t(J);if(!X)return{success:!1,results:[],meta:{duration:Date.now()-$},error:"Could not extract table name"};return this.tables.delete(X),this.schemas.delete(X),this.autoIncrementCounters.delete(X),{success:!0,results:[],meta:{duration:Date.now()-$}}}async handleInsert(J,$){let X=Date.now(),Y=t(J);if(!Y)return{success:!1,results:[],meta:{duration:Date.now()-X},error:"Could not extract table name"};if(!this.tables.has(Y))this.tables.set(Y,new Map);let Z=this.tables.get(Y),G=this.schemas.get(Y),H=G?Array.from(G.values()):[],_=H.find((M)=>M.isPrimaryKey),U=H.find((M)=>M.isAutoIncrement),F=j9(J),W=/\binsert\s+or\s+replace\b/i.test(J),O=/\binsert\s+or\s+(?:ignore|abort|fail|rollback)\b/i.test(J),A=A9(J),Q=[],z=A.length>0?A:[null],T=0;for(let M of z){let D={};if(F&&F.length>0){let I=M?r(M,",").map((e)=>e.trim()):F.map(()=>"?");F.forEach((e,BJ)=>{let u=I[BJ];if(u===void 0)return;if(u==="?")D[e]=$[T++];else{let S=_J(u);D[e]=S.consumed?S.value:u}})}else if(G){for(let I of G.keys())if(T<$.length)D[I]=$[T++]}else for(let I of $.slice(T))D[Object.keys(D).length===0?"id":`column_${Object.keys(D).length}`]=I,T++;if(G){for(let I of G.values())if(D[I.name]===void 0&&I.defaultValue!==void 0)D[I.name]=I.defaultValue}let V=_?.name??"id",L=D[V];if((L===void 0||L===null||L==="")&&U){let I=(this.autoIncrementCounters.get(Y)??0)+1;if(this.autoIncrementCounters.set(Y,I),D[U.name]=I,V!==U.name)D[V]=I;L=I}if(L===void 0||L===null||L===""){let I=(this.autoIncrementCounters.get(Y)??0)+1;this.autoIncrementCounters.set(Y,I),L=I,D[V]=I}if(U){let I=typeof L==="number"?L:Number(L);if(Number.isFinite(I))this.autoIncrementCounters.set(Y,Math.max(this.autoIncrementCounters.get(Y)??0,I))}let C=String(L);if(Z.has(C)&&!W){if(O)continue;return{success:!1,results:[],meta:{duration:Date.now()-X},error:`UNIQUE constraint failed: ${Y}.${V}`}}Z.set(C,D),this.lastInsertRowId=typeof L==="number"||typeof L==="string"?L:String(L),Q.push(D)}let B=/\breturning\b/i.test(J),E=B?uJ(J):null;return{success:!0,results:B?Q.map((M)=>cJ(M,E??["*"])):[],meta:{duration:Date.now()-X,last_row_id:this.lastInsertRowId??void 0,changes:Q.length}}}async handleUpdate(J,$){let X=Date.now(),Y=t(J);if(!Y)return{success:!1,results:[],meta:{duration:Date.now()-X},error:"Could not extract table name"};if(!this.tables.has(Y))return{success:!1,results:[],meta:{duration:Date.now()-X},error:`Table ${Y} not found`};let Z=F9(J);if(!Z)return{success:!1,results:[],meta:{duration:Date.now()-X},error:"UPDATE missing SET clause"};let G=e7(Z),H=this.tables.get(Y),_=Array.from(H.values()),U=K6(Z),F=$.slice(U),W=$.slice(0,U),{whereClause:O}=TJ(J),A=O?new GJ(DJ(O)).parse():{type:"always-true"},Q=[];for(let P of _)if(a(A,P,F,{value:0}))Q.push(P);let z=0;for(let P of Q){let M={value:0};for(let{column:D,expression:V}of G){let L=K6(V),C=W.slice(M.value,M.value+L);M.value+=L,P[D]=U9(V,C,P)}z++}let T=/\breturning\b/i.test(J),B=T?uJ(J):null;return{success:!0,results:T?Q.map((P)=>cJ(P,B??["*"])):[],meta:{duration:Date.now()-X,changes:z}}}async handleDelete(J,$){let X=Date.now(),Y=t(J);if(!Y)return{success:!1,results:[],meta:{duration:Date.now()-X},error:"Could not extract table name"};if(!this.tables.has(Y))return{success:!0,results:[],meta:{duration:Date.now()-X,changes:0}};let Z=this.tables.get(Y),{whereClause:G}=TJ(J);if(!G){let O=Z.size;return Z.clear(),{success:!0,results:[],meta:{duration:Date.now()-X,changes:O}}}let H=new GJ(DJ(G)).parse(),_=[];for(let[O,A]of Array.from(Z.entries()))if(a(H,A,$,{value:0}))Z.delete(O),_.push(A);let U=/\breturning\b/i.test(J),F=U?uJ(J):null;return{success:!0,results:U?_.map((O)=>cJ(O,F??["*"])):[],meta:{duration:Date.now()-X,changes:_.length}}}async handleSelect(J,$){let X=Date.now(),Y=t(J);if(!Y)return{success:!1,results:[],meta:{duration:Date.now()-X},error:"Could not extract table name"};if(!this.tables.has(Y))return{success:!0,results:[],meta:{duration:Date.now()-X}};let Z=this.tables.get(Y),G=Array.from(Z.values()),{whereClause:H,afterWhere:_}=TJ(J),U=H?new GJ(DJ(H)).parse():{type:"always-true"},F=b6(J),W=dJ(F),O=[];for(let V of G)if(a(U,V,$,{value:0}))O.push(V);let A=W9(_||J),Q=O;if(A)Q=[...O].sort((V,L)=>O9(V,L,A));let z=W.some((V)=>V.kind==="aggregate"),T;if(z){let V={};for(let L of W)V[L.alias]=zJ(L,Q,$,0);T=[V]}else if(W.length===1&&W[0]?.kind==="star")T=Q.map((V)=>({...V}));else T=Q.map((V)=>{let L={};for(let C of W)if(C.kind==="star")Object.assign(L,V);else if(C.kind==="column")L[C.alias]=V[C.expression]??null;else L[C.alias]=zJ(C,[V],$,0);return L});let{limit:B,offset:E}=x6(_),P=E??0,M=B===void 0?T.length:P+B;return{success:!0,results:T.slice(P,M),meta:{duration:Date.now()-X}}}async handleSqliteMasterSelect(J,$){let X=Date.now(),Y=[];for(let T of this.tables.keys())Y.push({name:T,type:"table",tbl_name:T,sql:`CREATE TABLE ${T} (...)`});let{whereClause:Z,afterWhere:G}=TJ(J),H=Z?new GJ(DJ(Z)).parse():{type:"always-true"},_=Y.filter((T)=>{return a(H,T,$,{value:0})}),U=b6(J),F=dJ(U),W=_.map((T)=>{if(F.length===1&&F[0]?.kind==="star")return{...T};let B={};for(let E of F)if(E.kind==="star")Object.assign(B,T);else if(E.kind==="column")B[E.alias]=T[E.expression]??null;else B[E.alias]=zJ(E,[T],$,0);return B}),{limit:O,offset:A}=x6(G),Q=A??0,z=O===void 0?W.length:Q+O;return{success:!0,results:W.slice(Q,z),meta:{duration:Date.now()-X}}}async handlePragma(J){let $=Date.now(),X=J.trim().toLowerCase();if(X.startsWith("pragma page_count")){let Y=0;for(let Z of this.tables.values())Y+=Z.size;return{success:!0,results:[{page_count:Math.max(1,Y)}],meta:{duration:Date.now()-$}}}if(X.startsWith("pragma page_size"))return{success:!0,results:[{page_size:4096}],meta:{duration:Date.now()-$}};if(X.startsWith("pragma table_info")){let Y=X.match(/pragma\s+table_info\s*\(\s*([`"\[]?[\w.]+[`"\]]?)\s*\)/);if(Y){let Z=N(Y[1]??""),G=this.schemas.get(Z);if(G)return{success:!0,results:Array.from(G.values()).map((_,U)=>({cid:U,name:_.name,type:_.type,notnull:_.notNull?1:0,dflt_value:_.defaultValue??null,pk:_.isPrimaryKey?1:0})),meta:{duration:Date.now()-$}}}}return{success:!0,results:[],meta:{duration:Date.now()-$}}}}function U9(J,$,X){if(J==="?")return $[0];let Y=y6(J,$,0).expression;return HJ(Y,X)}function b6(J){let $=J.toUpperCase(),X=x($,J,"SELECT");if(X===-1)return"*";let Y=x($,J,"FROM",X+6);if(Y===-1)return J.slice(X+6).trim();return J.slice(X+6,Y).trim().replace(/^distinct\s+/i,"")}function F9(J){let $=J.toUpperCase(),X=x($,J,"SET");if(X===-1)return null;let Y=X+3,Z=["WHERE","RETURNING","ORDER BY","LIMIT"],G=J.length;for(let H of Z){let _=x($,J,H,Y);if(_!==-1&&_<G)G=_}return J.slice(Y,G).trim()}function W9(J){let $=J.toUpperCase(),X=x($,J,"ORDER BY");if(X===-1)return null;let Z=J.slice(X+8).trim().match(/^([`"\[]?[\w.]+[`"\]]?)(?:\s+(asc|desc))?/i);if(!Z)return null;return{column:N(Z[1]??""),direction:(Z[2]??"asc").toLowerCase()==="desc"?"desc":"asc"}}function O9(J,$,X){let Y=J[X.column],Z=$[X.column];if(Y===Z)return 0;if(Y===void 0||Y===null)return X.direction==="desc"?1:-1;if(Z===void 0||Z===null)return X.direction==="desc"?-1:1;let G=m(Y),H=m(Z),_;if(G!==void 0&&H!==void 0)_=G===H?0:G<H?-1:1;else _=String(Y).localeCompare(String(Z));return X.direction==="desc"?-_:_}function A9(J){let $=J.toUpperCase(),X=x($,J,"VALUES");if(X===-1)return[];let Y=[],Z=X+6;while(Z<J.length){while(Z<J.length&&/[\s,]/.test(J[Z]))Z++;if(J[Z]!=="(")break;let G=IJ(J,Z);if(G===-1)break;Y.push(J.slice(Z+1,G).trim()),Z=G+1}return Y}function j9(J){let $=J.match(/insert\s+(?:or\s+\w+\s+)?into\s+[^()]+\(([^)]+)\)/i);if(!$||!$[1]||$.index===void 0)return null;let Y=J.slice(0,$.index+$[0].length).toUpperCase();if(Y.includes("VALUES")||Y.includes("SELECT"))return null;return $[1].split(",").map((Z)=>N(Z)).filter((Z)=>Z.length>0)}function uJ(J){let $=J.match(/\breturning\b\s+([^;]+)/i);if(!$||!$[1])return null;return r($[1],",").map((X)=>X.trim())}function cJ(J,$){if($.length===1&&$[0]==="*")return{...J};let X=dJ($.join(", ")),Y={};for(let Z of X)if(Z.kind==="star")Object.assign(Y,J);else if(Z.kind==="column")Y[Z.alias]=J[Z.expression]??null;else Y[Z.alias]=zJ(Z,[J],[],0);return Y}function L9(J){let $=J.match(/default\s+('([^']*)'|"([^"]*)"|[\w.-]+)/i);if(!$)return;let X=$[1]??"",Y=_J(X);return Y.consumed?Y.value:X}class p6{database;sql;bindings=[];constructor(J,$){this.database=J;this.sql=$}bind(...J){return this.bindings=J,this}async run(){return await this.database.executeStatement(this.sql,this.bindings)}async all(){return await this.database.executeStatement(this.sql,this.bindings)}async first(){return(await this.database.executeStatement(this.sql,this.bindings)).results[0]??null}}class nJ{store=new Map;expirations=new Map;pruneExpired(){if(this.expirations.size===0)return;let J=Date.now();for(let[$,X]of this.expirations)if(X<J)this.store.delete($),this.expirations.delete($)}normalizeValue(J){return typeof J==="string"?J:JSON.stringify(J)??String(J)}async get(J,$="text"){let X=this.expirations.get(J);if(X!==void 0&&X<Date.now())return this.store.delete(J),this.expirations.delete(J),null;let Y=this.store.get(J);if(Y===void 0)return null;if($==="json")try{return JSON.parse(Y)}catch(Z){throw new j(`Failed to parse JSON from KV for key ${J}: ${Z instanceof Error?Z.message:String(Z)}`,"KV_JSON_PARSE_FAILED")}return Y}async put(J,$,X){if(this.store.set(J,$),X?.expirationTtl)this.expirations.set(J,Date.now()+X.expirationTtl*1000);else this.expirations.delete(J)}async set(J,$,X){if(this.store.set(J,this.normalizeValue($)),X?.ttl)this.expirations.set(J,Date.now()+X.ttl*1000);else this.expirations.delete(J)}async del(J){await this.delete(J)}async keys(J=""){return(await this.list({prefix:J})).keys.map((X)=>X.name)}async getItem(J){return await this.get(J,"text")??null}async setItem(J,$){await this.set(J,$)}async removeItem(J){await this.delete(J)}async getKeys(J=""){return await this.keys(J)}async delete(J){this.store.delete(J),this.expirations.delete(J)}async list(J){this.pruneExpired();let $=J?.prefix??"",X=J?.limit??1000,Y=J?.cursor?Number.parseInt(J.cursor,10):0,Z=Number.isFinite(Y)&&Y>=0?Y:0,G=[];for(let F of this.store.keys())if(F.startsWith($))G.push(F);let H=G.slice(Z,Z+X).map((F)=>({name:F})),_=Z+X,U=_>=G.length;return{keys:H,cursor:U?void 0:String(_),list_complete:U}}clear(){this.store.clear(),this.expirations.clear()}size(){return this.pruneExpired(),this.store.size}}function Q9(){return new oJ}function V9(){return new nJ}$J();export{OJ as validateTableForSharding,eJ as schemaExists,vJ as runShard,T6 as runAllShards,Q6 as run,s6 as resetConfig,O7 as reassignShard,LJ as prepare,$6 as migrateRecord,l as listTables,A7 as listKnownShards,g7 as isSQLDatabase,p7 as isKVStorage,Y6 as integrateExistingDatabase,U7 as insertShard,_7 as insert,W6 as initializeAsync,n6 as initialize,I7 as indexShard,B7 as indexAllShards,M7 as index,K7 as getTotalDatabaseSize,j7 as getShardStats,I6 as getDatabaseSizesAllShards,T7 as getDatabaseSizeForShard,x7 as getDatabaseSizeForKey,r6 as getClosestRegionFromIP,P7 as flush,kJ as firstShard,W7 as firstByLookupKey,E7 as firstAllShardsGlobal,M6 as firstAllShards,P6 as first,N7 as explainShard,C7 as explainAllShards,R7 as explain,J6 as dropSchema,WJ as discoverExistingRecordsWithColumns,FJ as discoverExistingPrimaryKeys,q7 as createValkeyKVProvider,rJ as createSchemaAcrossShards,Y7 as createSchema,f7 as createSQLiteProvider,C6 as createRedisKVProvider,w6 as createPostgreSQLProvider,b7 as createNuxtHubKVProvider,v6 as createMySQLProvider,X6 as createMappingsForExistingKeys,Q9 as createInMemorySQLProvider,V9 as createInMemoryKVProvider,h7 as createHyperdrivePostgresProvider,y7 as createHyperdriveMySQLProvider,PJ as createDrizzleSQLProvider,v7 as countShard,k7 as countAllShards,w7 as count,i6 as collegedb,_6 as clearShardMigrationCache,H6 as clearMigrationCache,G6 as checkMigrationNeeded,Z6 as autoDetectAndMigrate,QJ as allShard,F7 as allByLookupKey,z6 as allAllShardsGlobal,VJ as allAllShards,E6 as all,B6 as ShardCoordinator,y as KVShardMapper,oJ as InMemorySQLDatabase,nJ as InMemoryKVStorage,j as CollegeDBError};
|
|
19
19
|
|
|
20
|
-
//# debugId=
|
|
20
|
+
//# debugId=7DB2D43ECE710A4764756E2164756E21
|
|
21
21
|
//# sourceMappingURL=index.js.map
|