bun-query-builder 0.2.65 → 0.2.67

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.
@@ -1,383 +0,0 @@
1
- // @bun
2
- import{r,e,H,t,s,Q,qe,Ce,w,We,n,p,y,Tt,x,o,Re,A,Ae,Me,M}from"./chunk-2phsm8dt.js";import{c}from"./chunk-55jccfgb.js";var ni=import.meta.require;import{existsSync as Xn,mkdirSync as qs,mkdtempSync as Ra,readdirSync as Ks,readFileSync as Rr,rmSync as Fs,unlinkSync as Xr,writeFileSync as Us}from"fs";import{tmpdir as xa}from"os";import{isAbsolute as Na,join as Kn}from"path";import Zr from"process";function ri(d){let h=2166136261;for(let D=0;D<d.length;D++)h^=d.charCodeAt(D),h=Math.imul(h,16777619)>>>0;return h.toString(36).padStart(7,"0").slice(-7)}function si(d,h=63){if(d.length<=h)return d;let D=`_${ri(d)}`;return d.slice(0,h-D.length)+D}function Jn(d,h){let D=`${d}_`,E=h.startsWith(D)?h:`${D}${h}`;return si(E)}class a{quoteIdentifier(d){return`\`${d.replace(/`/g,"``")}\``}getColumnType(d){switch(d.type){case"string":return`varchar(${d.maxLength??255})`;case"text":return"text";case"boolean":return"tinyint(1)";case"integer":return"integer";case"bigint":return"bigint";case"float":return"real";case"double":return"double precision";case"decimal":return"decimal(10,2)";case"date":return"date";case"datetime":return"datetime";case"timestamptz":return"datetime";case"json":return"json";case"enum":if(d.enumValues&&d.enumValues.length>0)return`ENUM(${d.enumValues.map((D)=>`'${D.replace(/'/g,"''")}'`).join(", ")})`;return"text";default:return"text"}}getPrimaryKeyType(d){return this.getColumnType(d)}getAutoIncrementClause(d){if(d.isPrimaryKey&&(d.type==="integer"||d.type==="bigint"))return"auto_increment";return""}getDefaultValue(d){if(!d.hasDefault||d.defaultValue===void 0)return"";let h=d.defaultValue;if(typeof h==="string"){let D=h.toUpperCase();if(D==="UTC_TIMESTAMP")return"default (UTC_TIMESTAMP)";if(["CURRENT_TIMESTAMP","NOW()","NULL","CURRENT_DATE","CURRENT_TIME"].includes(D))return`default ${D}`;let V=`'${h.replace(/'/g,"''")}'`;if(d.type==="text"||d.type==="json"||d.type==="enum"&&!d.enumValues?.length)return`default (${V})`;return`default ${V}`}else if(typeof h==="number"||typeof h==="bigint")return`default ${h}`;else if(typeof h==="boolean")return`default ${h?1:0}`;else if(h instanceof Date)return`default '${h.toISOString()}'`;return""}createEnumType(d,h){return""}foreignKeyClauses(d){return d.columns.filter((h)=>h.references).map((h)=>{let D=h.references,E=`${d.table}_${h.name}_fk`,V=`CONSTRAINT ${this.quoteIdentifier(E)} FOREIGN KEY (${this.quoteIdentifier(h.name)}) REFERENCES ${this.quoteIdentifier(D.table)}(${this.quoteIdentifier(D.column)})`;if(D.onDelete)V+=` ON DELETE ${D.onDelete.toUpperCase()}`;if(D.onUpdate)V+=` ON UPDATE ${D.onUpdate.toUpperCase()}`;return V})}createTable(d){let h=[...d.columns.map((D)=>this.renderColumn(D)),...this.foreignKeyClauses(d)];return`CREATE TABLE IF NOT EXISTS ${this.quoteIdentifier(d.table)} (
3
- ${h.join(`,
4
- `)}
5
- ) DEFAULT CHARSET=utf8mb4;`}static KEY_PREFIX_CHARACTERS=255;static MAX_KEY_BYTES=3072;static BYTES_PER_CHARACTER=4;keyPartWidth(d){let h=this.getColumnType(d).toLowerCase();if(h.includes("text")||h.includes("blob")||h==="json")return{bytes:Number.POSITIVE_INFINITY,indexableWhole:!1};let D=h.match(/^(?:var)?char\((\d+)\)$/)?.[1];if(D!==void 0)return{bytes:Number(D)*a.BYTES_PER_CHARACTER,indexableWhole:!0};return{bytes:8,indexableWhole:!0}}keyParts(d,h,D){let E=h.columns.map((Ne)=>{let xe=D?.find((Ve)=>Ve.name===Ne),Fe=xe?this.keyPartWidth(xe):{bytes:0,indexableWhole:!0},Ie=!Fe.indexableWhole;return{name:Ne,prefixed:Ie,bytes:Ie?a.KEY_PREFIX_CHARACTERS*a.BYTES_PER_CHARACTER:Fe.bytes,narrowable:!Fe.indexableWhole||Fe.bytes>a.KEY_PREFIX_CHARACTERS*a.BYTES_PER_CHARACTER}}),V=()=>E.reduce((Ne,xe)=>Ne+xe.bytes,0);while(V()>a.MAX_KEY_BYTES){let Ne=E.filter((xe)=>xe.narrowable&&!xe.prefixed).sort((xe,Fe)=>Fe.bytes-xe.bytes)[0];if(!Ne)throw Error(`[migrations] Index '${h.name}' on table '${d}' needs ${V()} bytes of key, over MySQL's ${a.MAX_KEY_BYTES}. Every column in it is already at its ${a.KEY_PREFIX_CHARACTERS}-character prefix, so shorten a column or drop one from the index.`);Ne.prefixed=!0,Ne.bytes=a.KEY_PREFIX_CHARACTERS*a.BYTES_PER_CHARACTER}return E.map((Ne)=>Ne.prefixed?`${this.quoteIdentifier(Ne.name)}(${a.KEY_PREFIX_CHARACTERS})`:this.quoteIdentifier(Ne.name))}createIndex(d,h,D){if(h.where)throw Error(`[migrations] Partial indexes (CompositeIndex.where) are not supported on MySQL. Index '${h.name}' on table '${d}' uses WHERE clause: ${h.where}`);let E=h.type==="unique"?"UNIQUE ":"",V=Jn(d,h.name),Ne=this.keyParts(d,h,D).join(", ");return`CREATE ${E}INDEX ${this.quoteIdentifier(V)} ON ${this.quoteIdentifier(d)} (${Ne});`}addForeignKey(d,h,D,E,V,Ne,xe=[]){let Fe=`${d}_${h}_fk`,Ie=`ALTER TABLE ${this.quoteIdentifier(d)} ADD CONSTRAINT ${this.quoteIdentifier(Fe)} FOREIGN KEY (${this.quoteIdentifier(h)}) REFERENCES ${this.quoteIdentifier(D)}(${this.quoteIdentifier(E)})`;if(V)Ie+=` ON DELETE ${V.toUpperCase()}`;if(Ne)Ie+=` ON UPDATE ${Ne.toUpperCase()}`;let Ve=[...new Set(xe)].map((gt)=>`ALTER TABLE ${this.quoteIdentifier(d)} DROP FOREIGN KEY ${this.quoteIdentifier(gt)};`).join(`
6
- `);return Ve?`${Ve}
7
- ${Ie};`:`${Ie};`}addColumn(d,h){let D=this.getColumnType(h),E=[this.quoteIdentifier(h.name),D];if(!h.isNullable&&!h.isPrimaryKey)E.push("not null");let V=this.getDefaultValue(h);if(V)E.push(V);return`ALTER TABLE ${this.quoteIdentifier(d)} ADD COLUMN ${E.join(" ")};`}modifyColumn(d,h){let D=this.getColumnType(h),E=[this.quoteIdentifier(h.name),D];if(!h.isNullable&&!h.isPrimaryKey)E.push("not null");let V=this.getDefaultValue(h);if(V)E.push(V);let Ne=this.getAutoIncrementClause(h);if(Ne)E.push(Ne);return`ALTER TABLE ${this.quoteIdentifier(d)} MODIFY COLUMN ${E.join(" ")};`}renameColumn(d,h,D){return`ALTER TABLE ${this.quoteIdentifier(d)} RENAME COLUMN ${this.quoteIdentifier(h)} TO ${this.quoteIdentifier(D)};`}renameTable(d,h){return`RENAME TABLE ${this.quoteIdentifier(d)} TO ${this.quoteIdentifier(h)};`}rebuildTable(){throw Error("[migrations] rebuildTable is only implemented for SQLite; MySQL uses in-place ALTER.")}dropTable(d){return`DROP TABLE IF EXISTS ${this.quoteIdentifier(d)}`}dropColumn(d,h){return`ALTER TABLE ${this.quoteIdentifier(d)} DROP COLUMN ${this.quoteIdentifier(h)};`}dropIndex(d,h){let D=Jn(d,h);return`DROP INDEX ${this.quoteIdentifier(D)} ON ${this.quoteIdentifier(d)};`}dropEnumType(d){return""}createMigrationsTable(){return`CREATE TABLE IF NOT EXISTS migrations (
8
- id INT AUTO_INCREMENT PRIMARY KEY,
9
- migration VARCHAR(255) NOT NULL UNIQUE,
10
- executed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
11
- )`}getExecutedMigrationsQuery(){return"SELECT migration, executed_at FROM migrations ORDER BY executed_at"}recordMigrationQuery(){return"INSERT INTO migrations (migration) VALUES (?)"}jsonExtract(d,h){return`JSON_UNQUOTE(JSON_EXTRACT(${d}, CONCAT('$.', ${h})))`}dateBucket(d,h,D=0){let E=D===0?d:`DATE_ADD(${d}, INTERVAL ${D} HOUR)`;switch(h){case"hour":return`DATE_FORMAT(${E}, '%Y-%m-%dT%H:00:00.000Z')`;case"week":return`DATE_FORMAT(DATE_SUB(${E}, INTERVAL WEEKDAY(${E}) DAY), '%Y-%m-%dT00:00:00.000Z')`;case"month":return`DATE_FORMAT(${E}, '%Y-%m-01T00:00:00.000Z')`;case"year":return`DATE_FORMAT(${E}, '%Y-01-01T00:00:00.000Z')`;case"day":default:return`DATE_FORMAT(${E}, '%Y-%m-%dT00:00:00.000Z')`}}booleanLiteral(d){return d?"TRUE":"FALSE"}renderColumn(d){let h=this.getColumnType(d),D=[this.quoteIdentifier(d.name),h];if(d.isPrimaryKey){D.push("PRIMARY KEY");let V=this.getAutoIncrementClause(d);if(V)D.push(V)}if(!d.isNullable&&!d.isPrimaryKey)D.push("not null");let E=this.getDefaultValue(d);if(E)D.push(E);return D.join(" ")}}class ce{quoteIdentifier(d){return`"${d.replace(/"/g,'""')}"`}getColumnType(d){switch(d.type){case"string":return`varchar(${d.maxLength??255})`;case"text":return"text";case"boolean":return"boolean";case"integer":return"integer";case"bigint":return"bigint";case"float":return"real";case"double":return"double precision";case"decimal":return"decimal(10,2)";case"date":return"date";case"datetime":return"timestamp";case"timestamptz":return"timestamptz";case"json":return"jsonb";case"enum":if(d.enumValues&&d.enumValues.length>0)return d.enumTypeName?this.quoteIdentifier(d.enumTypeName):"text";return"text";default:return"text"}}getPrimaryKeyType(d){switch(d.type){case"integer":return"SERIAL";case"bigint":return"BIGSERIAL";default:return this.getColumnType(d)}}getAutoIncrementClause(d){return""}getDefaultValue(d){if(!d.hasDefault||d.defaultValue===void 0)return"";let h=d.defaultValue;if(typeof h==="string"){let D=h.toUpperCase();if(D==="UTC_TIMESTAMP")return"default (now() AT TIME ZONE 'utc')";if(["CURRENT_TIMESTAMP","NOW()","NULL","CURRENT_DATE","CURRENT_TIME"].includes(D))return`default ${D}`;return`default '${h.replace(/'/g,"''")}'`}else if(typeof h==="number"||typeof h==="bigint")return`default ${h}`;else if(typeof h==="boolean")return`default ${h?"true":"false"}`;else if(h instanceof Date)return`default '${h.toISOString()}'`;return""}createEnumType(d,h){let D=h.map((E)=>`'${E.replace(/'/g,"''")}'`).join(", ");return`CREATE TYPE ${this.quoteIdentifier(d)} AS ENUM (${D});`}createTable(d){let h=d.columns.map((D)=>this.renderColumn(D)).join(`,
12
- `);return`CREATE TABLE IF NOT EXISTS ${this.quoteIdentifier(d.table)} (
13
- ${h}
14
- );`}createIndex(d,h){let D=h.type==="unique"?"UNIQUE ":"",E=Jn(d,h.name),V=h.columns.map((xe)=>this.quoteIdentifier(xe)).join(", "),Ne=h.where?` WHERE ${h.where}`:"";return`CREATE ${D}INDEX IF NOT EXISTS ${this.quoteIdentifier(E)} ON ${this.quoteIdentifier(d)} (${V})${Ne};`}addForeignKey(d,h,D,E,V,Ne,xe=[]){let Fe=`${d}_${h}_fk`,Ie=`ALTER TABLE ${this.quoteIdentifier(d)} ADD CONSTRAINT ${this.quoteIdentifier(Fe)} FOREIGN KEY (${this.quoteIdentifier(h)}) REFERENCES ${this.quoteIdentifier(D)}(${this.quoteIdentifier(E)})`;if(V)Ie+=` ON DELETE ${V.toUpperCase()}`;if(Ne)Ie+=` ON UPDATE ${Ne.toUpperCase()}`;let Ve=[...new Set(xe)].map((gt)=>`ALTER TABLE ${this.quoteIdentifier(d)} DROP CONSTRAINT ${this.quoteIdentifier(gt)};`).join(`
15
- `);return Ve?`${Ve}
16
- ${Ie};`:`${Ie};`}addColumn(d,h){let D=this.getColumnType(h),E=[this.quoteIdentifier(h.name),D];if(!h.isNullable&&!h.isPrimaryKey)E.push("not null");let V=this.getDefaultValue(h);if(V)E.push(V);return`ALTER TABLE ${this.quoteIdentifier(d)} ADD COLUMN ${E.join(" ")};`}modifyColumn(d,h){let D=this.getColumnType(h),E=this.quoteIdentifier(d),V=this.quoteIdentifier(h.name),Ne=[`ALTER TABLE ${E} ALTER COLUMN ${V} DROP DEFAULT;`,`ALTER TABLE ${E} ALTER COLUMN ${V} TYPE ${D} USING ${V}::${D};`];if(!h.isPrimaryKey)Ne.push(`ALTER TABLE ${E} ALTER COLUMN ${V} ${h.isNullable?"DROP NOT NULL":"SET NOT NULL"};`);let xe=this.getDefaultValue(h);if(xe)Ne.push(`ALTER TABLE ${E} ALTER COLUMN ${V} SET ${xe};`);return Ne.join(`
17
- `)}renameColumn(d,h,D){return`ALTER TABLE ${this.quoteIdentifier(d)} RENAME COLUMN ${this.quoteIdentifier(h)} TO ${this.quoteIdentifier(D)};`}renameTable(d,h){return`ALTER TABLE ${this.quoteIdentifier(d)} RENAME TO ${this.quoteIdentifier(h)};`}rebuildTable(){throw Error("[migrations] rebuildTable is only implemented for SQLite; Postgres uses in-place ALTER.")}dropTable(d){return`DROP TABLE IF EXISTS ${this.quoteIdentifier(d)} CASCADE`}dropColumn(d,h){return`ALTER TABLE ${this.quoteIdentifier(d)} DROP COLUMN ${this.quoteIdentifier(h)};`}dropIndex(d,h){let D=Jn(d,h);return`DROP INDEX IF EXISTS ${this.quoteIdentifier(D)};`}dropEnumType(d){return`DROP TYPE IF EXISTS ${this.quoteIdentifier(d)} CASCADE`}createMigrationsTable(){return`CREATE TABLE IF NOT EXISTS migrations (
18
- id SERIAL PRIMARY KEY,
19
- migration VARCHAR(255) NOT NULL UNIQUE,
20
- executed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
21
- )`}getExecutedMigrationsQuery(){return"SELECT migration, executed_at FROM migrations ORDER BY executed_at"}recordMigrationQuery(){return"INSERT INTO migrations (migration) VALUES ($1)"}jsonExtract(d,h){return`(${d}::jsonb ->> ${h})`}dateBucket(d,h,D=0){let E=D===0?`${d}::timestamp`:`(${d}::timestamp ${D>=0?"+":"-"} interval '${Math.abs(D)} hours')`,V=h==="week"?`date_trunc('week', ${E})`:E;switch(h){case"hour":return`to_char(${V}, 'YYYY-MM-DD"T"HH24:00:00.000"Z"')`;case"month":return`to_char(${V}, 'YYYY-MM-01"T"00:00:00.000"Z"')`;case"year":return`to_char(${V}, 'YYYY-01-01"T"00:00:00.000"Z"')`;case"week":case"day":default:return`to_char(${V}, 'YYYY-MM-DD"T"00:00:00.000"Z"')`}}booleanLiteral(d){return d?"TRUE":"FALSE"}renderColumn(d){let h=d.isPrimaryKey?this.getPrimaryKeyType(d):this.getColumnType(d),D=[this.quoteIdentifier(d.name),h];if(d.isPrimaryKey)D.push("PRIMARY KEY");if(!d.isNullable&&!d.isPrimaryKey)D.push("not null");let E=this.getDefaultValue(d);if(E)D.push(E);if(d.references){let V=`REFERENCES ${this.quoteIdentifier(d.references.table)}(${this.quoteIdentifier(d.references.column)})`;if(d.references.onDelete)V+=` ON DELETE ${d.references.onDelete.toUpperCase()}`;if(d.references.onUpdate)V+=` ON UPDATE ${d.references.onUpdate.toUpperCase()}`;D.push(V)}return D.join(" ")}}class ue extends a{createTable(d){let h=d.columns.map((Ne)=>this.renderColumn(Ne)).join(`,
22
- `),D=[];if(d.tableKind!=="reference"){let Ne=d.shardKey?.length?d.shardKey:d.columns.filter((xe)=>xe.isPrimaryKey).map((xe)=>xe.name);if(Ne&&Ne.length>0)D.push(`SHARD KEY (${Ne.map((xe)=>this.quoteIdentifier(xe)).join(", ")})`)}if(d.tableKind!=="rowstore"&&d.tableKind!=="reference"){let Ne=d.sortKey?.length?d.sortKey:void 0;D.push(`SORT KEY (${(Ne??[]).map((xe)=>this.quoteIdentifier(xe)).join(", ")})`)}let E=[h,...D].join(`,
23
- `);return`CREATE${this.tableKindSuffix(d.tableKind)} TABLE IF NOT EXISTS ${this.quoteIdentifier(d.table)} (
24
- ${E}
25
- );`}tableKindSuffix(d){switch(d){case"rowstore":return" ROWSTORE";case"reference":return" REFERENCE";default:return""}}addForeignKey(){return""}createIndex(d,h,D){if(h.where)throw Error(`[migrations] Partial indexes (CompositeIndex.where) are not supported on SingleStore. Index '${h.name}' on table '${d}' uses WHERE clause: ${h.where}`);return super.createIndex(d,h,D)}}class de extends a{sharded;constructor(d=!0){super();this.sharded=d}getAutoIncrementClause(d){return this.sharded?"":super.getAutoIncrementClause(d)}renderColumn(d){if(!this.sharded||!d.references)return super.renderColumn(d);let{references:h,...D}=d;return super.renderColumn(D)}foreignKeyClauses(d){return this.sharded?[]:super.foreignKeyClauses(d)}createTable(d){return super.createTable(d)}addForeignKey(...d){return this.sharded?"":super.addForeignKey(...d)}createMigrationsTable(){if(!this.sharded)return super.createMigrationsTable();return`CREATE TABLE IF NOT EXISTS migrations (
26
- migration VARCHAR(255) NOT NULL PRIMARY KEY,
27
- executed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
28
- )`}}class fe{quoteIdentifier(d){return`"${d.replace(/"/g,'""')}"`}getColumnType(d){if(d.name.endsWith("_id")&&A(d.type))return"INTEGER";if(d.type==="enum"){if(d.enumValues&&d.enumValues.length>0){let h=d.enumValues.map((D)=>`'${D.replace(/'/g,"''")}'`).join(", ");return`TEXT CHECK (${this.quoteIdentifier(d.name)} IN (${h}))`}return"TEXT"}return Ae(d.type)}getPrimaryKeyType(d){return this.getColumnType(d)}getAutoIncrementClause(d){if(d.isPrimaryKey&&(d.type==="integer"||d.type==="bigint"))return"AUTOINCREMENT";return""}getDefaultValue(d){if(!d.hasDefault||d.defaultValue===void 0)return"";let h=d.defaultValue;if(typeof h==="string"){if(h.toUpperCase()==="UTC_TIMESTAMP")return"default CURRENT_TIMESTAMP";if(["CURRENT_TIMESTAMP","CURRENT_DATE","CURRENT_TIME","NOW()","NULL","TRUE","FALSE"].includes(h.toUpperCase()))return`default ${h.toUpperCase()}`;return`default '${h.replace(/'/g,"''")}'`}else if(typeof h==="number"||typeof h==="bigint")return`default ${h}`;else if(typeof h==="boolean")return`default ${h?1:0}`;else if(h instanceof Date)return`default '${h.toISOString()}'`;return""}createEnumType(d,h){return""}createTable(d){let h=d.columns.map((D)=>this.renderColumn(D)).join(`,
29
- `);return`CREATE TABLE IF NOT EXISTS ${this.quoteIdentifier(d.table)} (
30
- ${h}
31
- );`}createIndex(d,h){let D=h.type==="unique"?"UNIQUE ":"",E=Jn(d,h.name),V=h.columns.map((xe)=>this.quoteIdentifier(xe)).join(", "),Ne=h.where?` WHERE ${h.where}`:"";return`CREATE ${D}INDEX IF NOT EXISTS ${this.quoteIdentifier(E)} ON ${this.quoteIdentifier(d)} (${V})${Ne};`}addForeignKey(d,h,D,E,V,Ne){return""}addColumn(d,h){let D=this.getColumnType(h),E=[this.quoteIdentifier(h.name),D];if(!h.isNullable&&!h.isPrimaryKey)E.push("not null");let V=this.getDefaultValue(h);if(V)E.push(V);return`ALTER TABLE ${this.quoteIdentifier(d)} ADD COLUMN ${E.join(" ")};`}modifyColumn(d,h){return`-- SQLite does not support ALTER COLUMN; a table rebuild is required to change ${this.quoteIdentifier(d)}.${this.quoteIdentifier(h.name)}`}renameColumn(d,h,D){return`ALTER TABLE ${this.quoteIdentifier(d)} RENAME COLUMN ${this.quoteIdentifier(h)} TO ${this.quoteIdentifier(D)};`}renameTable(d,h){return`ALTER TABLE ${this.quoteIdentifier(d)} RENAME TO ${this.quoteIdentifier(h)};`}rebuildTable(d){let{target:h,tempName:D,columnSource:E}=d,V=(Ve)=>this.quoteIdentifier(Ve),Ne=h.columns.map((Ve)=>this.renderColumn(Ve)).join(`,
32
- `),xe=`CREATE TABLE ${V(D)} (
33
- ${Ne}
34
- );`,Fe=h.columns.map((Ve)=>Ve.name).filter((Ve)=>E[Ve]!==void 0),Ie=["PRAGMA foreign_keys=OFF;","BEGIN;",xe];if(Fe.length>0){let Ve=Fe.map(V).join(", "),gt=Fe.map((bt)=>V(E[bt])).join(", ");Ie.push(`INSERT INTO ${V(D)} (${Ve}) SELECT ${gt} FROM ${V(h.table)};`)}Ie.push(`DROP TABLE ${V(h.table)};`),Ie.push(`ALTER TABLE ${V(D)} RENAME TO ${V(h.table)};`);for(let Ve of h.indexes)Ie.push(this.createIndex(h.table,Ve));return Ie.push("PRAGMA foreign_key_check;"),Ie.push("COMMIT;"),Ie.push("PRAGMA foreign_keys=ON;"),Ie.join(`
35
- `)}dropTable(d){return`DROP TABLE IF EXISTS ${this.quoteIdentifier(d)}`}dropColumn(d,h){return`ALTER TABLE ${this.quoteIdentifier(d)} DROP COLUMN ${this.quoteIdentifier(h)};`}dropIndex(d,h){let D=Jn(d,h);return`DROP INDEX IF EXISTS ${this.quoteIdentifier(D)};`}dropEnumType(d){return""}createMigrationsTable(){return`CREATE TABLE IF NOT EXISTS migrations (
36
- id INTEGER PRIMARY KEY AUTOINCREMENT,
37
- migration TEXT NOT NULL UNIQUE,
38
- executed_at DATETIME DEFAULT CURRENT_TIMESTAMP
39
- )`}getExecutedMigrationsQuery(){return"SELECT migration, executed_at FROM migrations ORDER BY executed_at"}recordMigrationQuery(){return"INSERT INTO migrations (migration) VALUES (?)"}jsonExtract(d,h){return`json_extract(${d}, '$.' || ${h})`}dateBucket(d,h,D=0){let E=D===0?d:`datetime(${d}, '${D>=0?"+":"-"}${Math.abs(D)} hours')`;switch(h){case"hour":return`strftime('%Y-%m-%dT%H:00:00.000Z', ${E})`;case"week":return`strftime('%Y-%m-%dT00:00:00.000Z', ${E}, '-6 days', 'weekday 1')`;case"month":return`strftime('%Y-%m-01T00:00:00.000Z', ${E})`;case"year":return`strftime('%Y-01-01T00:00:00.000Z', ${E})`;case"day":default:return`strftime('%Y-%m-%dT00:00:00.000Z', ${E})`}}booleanLiteral(d){return d?"TRUE":"FALSE"}renderColumn(d){let h=this.getColumnType(d),D=[this.quoteIdentifier(d.name),h];if(d.isPrimaryKey){D.push("PRIMARY KEY");let V=this.getAutoIncrementClause(d);if(V)D.push(V)}if(!d.isNullable&&!d.isPrimaryKey)D.push("not null");let E=this.getDefaultValue(d);if(E)D.push(E);if(d.references){if(D.push(`REFERENCES ${this.quoteIdentifier(d.references.table)}(${this.quoteIdentifier(d.references.column)})`),d.references.onDelete)D.push(`ON DELETE ${d.references.onDelete.toUpperCase()}`);if(d.references.onUpdate)D.push(`ON UPDATE ${d.references.onUpdate.toUpperCase()}`)}return D.join(" ")}}function f(d,h={}){switch(d){case"postgres":return new ce;case"mysql":return new a;case"singlestore":return new ue;case"vitess":return new de(h.vitessSharded??e.vitess?.sharded??!0);case"sqlite":return new fe;default:throw Error(`Unsupported dialect: ${d}`)}}async function J(d={}){let h=d.iterations||1000,D=d.operations?.split(",")||["select","insert","update","delete","count"];console.log("-- Running Query Builder Benchmarks"),console.log(`-- Iterations: ${h}`),console.log(`-- Operations: ${D.join(", ")}`),console.log();let E=i();console.log("-- Setting up test table...");try{await n.unsafe("DROP TABLE IF EXISTS bench_users").execute(),await n.unsafe(`
40
- CREATE TABLE bench_users (
41
- id INTEGER PRIMARY KEY AUTOINCREMENT,
42
- name TEXT NOT NULL,
43
- email TEXT NOT NULL,
44
- active INTEGER DEFAULT 1,
45
- created_at TEXT
46
- )
47
- `).execute();for(let xe=0;xe<100;xe++)await n.unsafe(`
48
- INSERT INTO bench_users (name, email, created_at)
49
- VALUES (?, ?, ?)
50
- `,[`User ${xe}`,`user${xe}@example.com`,new Date().toISOString()]).execute();console.log("-- \u2713 Test table ready with 100 rows"),console.log()}catch(xe){throw console.error("-- Failed to setup test table:",xe),xe}let V=[];if(D.includes("select")){let xe=[];for(let Fe=0;Fe<h;Fe++){let Ie=performance.now();await E.selectFrom("bench_users").where({active:1}).limit(10).execute(),xe.push(performance.now()-Ie)}V.push({operation:"SELECT with WHERE + LIMIT",avgTime:xe.reduce((Fe,Ie)=>Fe+Ie,0)/xe.length,minTime:Math.min(...xe),maxTime:Math.max(...xe),iterations:h})}if(D.includes("select")){let xe=[];for(let Fe=0;Fe<h;Fe++){let Ie=performance.now();await E.selectFrom("bench_users").where({id:1}).first(),xe.push(performance.now()-Ie)}V.push({operation:"SELECT by ID (first)",avgTime:xe.reduce((Fe,Ie)=>Fe+Ie,0)/xe.length,minTime:Math.min(...xe),maxTime:Math.max(...xe),iterations:h})}if(D.includes("count")){let xe=[];for(let Fe=0;Fe<h;Fe++){let Ie=performance.now();await E.selectFrom("bench_users").count(),xe.push(performance.now()-Ie)}V.push({operation:"COUNT",avgTime:xe.reduce((Fe,Ie)=>Fe+Ie,0)/xe.length,minTime:Math.min(...xe),maxTime:Math.max(...xe),iterations:h})}if(D.includes("insert")){let xe=[];for(let Fe=0;Fe<h;Fe++){let Ie=performance.now();await E.insertInto("bench_users").values({name:`Bench User ${Fe}`,email:`bench${Fe}@example.com`,created_at:new Date().toISOString()}).execute(),xe.push(performance.now()-Ie)}V.push({operation:"INSERT",avgTime:xe.reduce((Fe,Ie)=>Fe+Ie,0)/xe.length,minTime:Math.min(...xe),maxTime:Math.max(...xe),iterations:h})}if(D.includes("update")){let xe=[];for(let Fe=0;Fe<h;Fe++){let Ie=performance.now();await E.updateTable("bench_users").set({active:0}).where({id:1}).execute(),xe.push(performance.now()-Ie)}V.push({operation:"UPDATE by ID",avgTime:xe.reduce((Fe,Ie)=>Fe+Ie,0)/xe.length,minTime:Math.min(...xe),maxTime:Math.max(...xe),iterations:h})}if(D.includes("delete")){let xe=[],Fe=[];for(let Ie=0;Ie<h;Ie++){let Ve=await E.insertInto("bench_users").values({name:"To Delete",email:`delete${Ie}@example.com`,created_at:new Date().toISOString()}).execute();Fe.push(Ve)}for(let Ie=0;Ie<h;Ie++){let Ve=performance.now();await E.deleteFrom("bench_users").where({id:Fe[Ie]}).execute(),xe.push(performance.now()-Ve)}V.push({operation:"DELETE by ID",avgTime:xe.reduce((Ie,Ve)=>Ie+Ve,0)/xe.length,minTime:Math.min(...xe),maxTime:Math.max(...xe),iterations:h})}console.log("-- Benchmark Results"),console.log();let Ne=Math.max(...V.map((xe)=>xe.operation.length));console.log("Operation".padEnd(Ne+2)+"Avg (ms)".padStart(12)+"Min (ms)".padStart(12)+"Max (ms)".padStart(12)+"Ops/sec".padStart(12)),console.log("-".repeat(Ne+2+12+12+12+12));for(let xe of V){let Fe=xe.operation.padEnd(Ne+2),Ie=xe.avgTime.toFixed(3).padStart(12),Ve=xe.minTime.toFixed(3).padStart(12),gt=xe.maxTime.toFixed(3).padStart(12),bt=(1000/xe.avgTime).toFixed(0).padStart(12);console.log(`${Fe}${Ie}${Ve}${gt}${bt}`)}console.log();try{await n.unsafe("DROP TABLE IF EXISTS bench_users").execute(),console.log("-- \u2713 Cleanup complete")}catch(xe){console.error("-- Warning: Failed to cleanup test table:",xe)}}function ii(d){return y(e.relations?.singularizeStrategy)(d)}function S(d,h,D,E={}){let V=E.singularize??ii,xe=d.relations?.[h]?.belongsToMany?.[D];if(xe==null)return null;let Fe=typeof xe==="object",Ie=Fe?xe:null,Ve=Fe?Ie.model:xe,gt=d.modelToTable[Ve]||Ve,bt,pt;if(Ie?.table)bt=Ie.table;else if(Ie?.through){if(pt=Ie.through,bt=d.modelToTable[Ie.through],!bt)throw Error(`[query-builder] belongsToMany relation '${D}' on '${h}' references unknown through model '${Ie.through}'. Make sure '${Ie.through}' is registered via defineModels({...}).`)}else{let ke=V(h),ve=V(gt);bt=[ke,ve].sort().join("_")}let xt=Ie?.foreignKey??`${V(h)}_id`,jt=Ie?.relatedKey??`${V(gt)}_id`,Ht={};if(Ie?.pivot?.columns)Object.assign(Ht,Ie.pivot.columns);if(pt&&E.models){let ke=E.models[pt],ve=ke?.definition??ke?.getDefinition?.()??ke,yt=ve?.attributes??{};for(let[He,zt]of Object.entries(yt)){if(He===xt||He===jt||He===(ve?.primaryKey??"id"))continue;Ht[He]={default:zt?.default,nullable:zt?.nullable,validation:zt?.validation}}}let Le=Boolean(Ie?.pivot?.timestamps),Ue=Object.keys(Ht);return{pivotTable:bt,fkParent:xt,fkRelated:jt,pivotColumns:Ue,pivotColumnDefs:Ht,pivotModelName:pt,timestamps:Le,relatedModelName:Ve,relatedTable:gt,hasConfig:Fe}}function*Zt(d,h={}){let D=d.relations;if(!D)return;for(let[E,V]of Object.entries(D)){let Ne=V?.belongsToMany;if(!Ne)continue;for(let xe of Object.keys(Ne)){let Fe=S(d,E,xe,h);if(Fe)yield{parentTable:E,relationKey:xe,resolved:Fe}}}}function zn(d){return typeof d==="object"&&d!==null&&"raw"in d&&typeof d.raw==="string"}function Kr(d,h,D){if(Array.isArray(h)){let V=s(h.length,D.length+1),Ne=o(d,h,!1,V);return D.push(...h),Ne}let E=`${d} = ${t(D.length+1)}`;return D.push(h),E}function hr(d){return typeof d==="object"&&d!==null&&"sql"in d&&typeof d.sql==="string"&&(!("parameters"in d)||Array.isArray(d.parameters))}function Tr(d,h){let D=d.parameters??[];if(e.dialect!=="postgres"||D.length===0)return{text:d.sql,parameters:D};let E=0,V=d.sql.replace(/\?/g,(Ne)=>{if(E>=D.length)return Ne;return t(h+E++)});if(E!==D.length)throw TypeError(`[query-builder] SQL expression declares ${D.length} parameters but contains only ${E} placeholders`);return{text:V,parameters:D}}function en(d,...h){if(typeof d==="string")return{raw:d};let D=d[0];for(let E=0;E<h.length;E++)D+=er(h[E])+d[E+1];return{raw:D}}function Qn(d){return r(e.dialect)?`\`${d.replace(/`/g,"``")}\``:`"${d.replace(/"/g,'""')}"`}function Ar(d,h=1){let D=Object.keys(d[0]??{}),E=[],V=h,Ne=d.map((xe)=>`(${D.map((Ie)=>(E.push(xe[Ie]),t(V++))).join(", ")})`);return{colsSql:D.map(Qn).join(", "),valuesSql:Ne.join(", "),params:E,nextIndex:V}}function br(d){return Boolean(d&&(d.onSlowQuery||d.slowQueryThresholdMs!=null&&d.slowQueryThresholdMs>=0))}function l(d,h=e.dialect){if(!r(h))return d;let D=/^([A-Z_][\w$]*)(?:\.([A-Z_][\w$]*))?(?:\s+as\s+([A-Z_][\w$]*))?$/i.exec(d.trim());if(!D)return d;let[,E,V,Ne]=D,xe=V?`\`${E}\`.\`${V}\``:`\`${E}\``;return Ne?`${xe} AS \`${Ne}\``:xe}function kt(d,h=e.dialect){if(!r(h)||d===null||d===void 0)return d;if(typeof d==="string"){let D=/^(\d{4}-\d{2}-\d{2})[T ](\d{2}:\d{2}(?::\d{2})?)(?:\.\d+)?(?:Z|[+-]\d{2}:?\d{2})?$/.exec(d);if(!D)return d;let[,E,V]=D;return`${E} ${V.length===5?`${V}:00`:V}`}if(!(d instanceof Date)||Number.isNaN(d.getTime()))return d;return d.toISOString().replace("T"," ").replace(/\.\d+Z$/,"")}function ns(d){if(typeof d==="string")return l(d);if(zn(d))return d.raw;if(d&&typeof d==="object"){let h=d;if(typeof h.raw==="function")return String(h.raw());if(typeof h.sql==="string")return h.sql;let D=String(d);if(D!=="[object Object]")return D}throw TypeError(`[query-builder] select(): unsupported column ${String(d)} \u2014 pass a column name, a string[], or a SQL fragment (e.g. sql\`count(*) as c\`)`)}function ai(d){let h=/\(|\)|\bORDER\s+BY\b/gi,D=0,E;while(E=h.exec(d))if(E[0]==="(")D++;else if(E[0]===")")D=Math.max(0,D-1);else if(D===0)return!0;return!1}var Bn={SELECT_STAR:/^SELECT\s+\*/i,SELECT:/^SELECT\s+/i,SELECT_FROM:/^SELECT\s+(.+?)\s+FROM/i,WHERE:/\bWHERE\b/i,ORDER_BY:/\bORDER\s+BY\b/i,GROUP_BY:/\bGROUP\s+BY\b/i,LIMIT:/\sLIMIT\s+\d+/i,OFFSET:/\sOFFSET\s+\d+/i,IDENTIFIER:/^[A-Z_][\w.]*$/i,DELETED_AT:/\bdeleted_at\b/i},rs=new Set(["=","!=","<>","<","<=",">",">=","like","not like","ilike","not ilike","in","not in","is","is not","between","not between"]);function Xt(d,h){if(!Bn.IDENTIFIER.test(d)){let D=h?` in ${h}`:"";throw Error(`[query-builder] Invalid identifier${D}: '${d}'. Identifiers must start with a letter or underscore and contain only alphanumeric characters, underscores, and dots.`)}}function vn(d,h){if(typeof d!=="string")throw TypeError(`[query-builder] ${h}: operator must be a string, got ${typeof d}`);let D=d.toLowerCase();if(!rs.has(D))throw TypeError(`[query-builder] ${h}: refusing to use '${d}' as a SQL operator \u2014 not in the allowed set (${[...rs].join(", ")})`);return d}function Wn(d,h){if(typeof d!=="string"||d.length===0)throw TypeError(`[query-builder] ${h}: identifier must be a non-empty string, got ${typeof d}`);if(d.length>129)throw TypeError(`[query-builder] ${h}: identifier '${d}' too long`);let D=d.split(".");if(D.length>2)throw TypeError(`[query-builder] ${h}: identifier '${d}' has more than one dot \u2014 only \`table.column\` is allowed`);for(let E of D)if(!/^[A-Z_][A-Z0-9_]*$/i.test(E))throw TypeError(`[query-builder] ${h}: identifier segment '${E}' contains characters outside [A-Za-z0-9_]`)}function or(d,h){if(typeof d==="string")return oi(h),d;if(d===null||d===void 0)throw TypeError(`[query-builder] ${h}: fragment must be a SqlFragment, got ${d}`);if(zn(d))return d.raw;if(typeof d==="object"){let D=d;if(typeof D.raw==="string")return D.raw;if(typeof D.raw==="function"){let V=D.raw();if(typeof V==="string")return V}if(typeof D.sql==="string")return D.sql;let E=String(d);if(E!=="[object Object]"&&E!=="[object Promise]")return E}throw TypeError(`[query-builder] ${h}: cannot render this value as a SQL fragment. `+"A Bun `sql`...`` query object cannot be converted to SQL text \u2014 pass a "+"string, or use the exported `raw` helper: raw`count(*) as c` / raw('age > 18').")}var ss=new Set;function oi(d){if(ss.has(d))return;ss.add(d),console.warn(`[query-builder] ${d}: bare string passed to a *Raw method. Prefer the \`raw\`...\`\` tagged template, which escapes interpolated `+"values for the configured dialect \u2014 concatenating request input into SQL "+"is an injection vector. This will become a hard error in a future release.")}function Ct(d,h=e.dialect){return r(h)?d.replace(/\\/g,"\\\\").replace(/'/g,"''"):d.replace(/'/g,"''")}function er(d){if(d===null)return"NULL";if(typeof d==="number"&&Number.isFinite(d))return String(d);if(typeof d==="boolean")return d?"1":"0";if(typeof d==="string")return`'${Ct(d)}'`;if(d instanceof Date)return`'${d.toISOString()}'`;throw TypeError(`[query-builder] subquery condition: refusing to interpolate value of type ${typeof d}`)}function li(d,h){let D=Array.isArray(d)?d:d?[d]:[],E=[];if(D.length)E.push(`PARTITION BY ${D.join(", ")}`);if(h&&h.length)E.push(`ORDER BY ${h.map(([V,Ne])=>`${V} ${Ne==="desc"?"DESC":"ASC"}`).join(", ")}`);return E.length?`OVER (${E.join(" ")})`:"OVER ()"}class is{cache=new Map;maxSize=100;get(d){let h=this.cache.get(d);if(!h)return null;if(Date.now()>h.expiresAt)return this.cache.delete(d),null;return this.cache.delete(d),this.cache.set(d,h),h.data}set(d,h,D){if(this.cache.has(d))this.cache.delete(d);if(this.cache.size>=this.maxSize){let E=Date.now(),V=!1;for(let[Ne,xe]of this.cache)if(E>xe.expiresAt){if(this.cache.delete(Ne),V=!0,this.cache.size<this.maxSize)break}if(!V){let Ne=this.cache.keys().next().value;if(Ne!==void 0)this.cache.delete(Ne)}}this.cache.set(d,{data:h,expiresAt:Date.now()+D})}clear(){this.cache.clear()}setMaxSize(d){this.maxSize=Math.max(0,Math.floor(d));while(this.cache.size>this.maxSize){let h=this.cache.keys().next().value;if(h===void 0)break;this.cache.delete(h)}}}var Mr=new is;function ui(d){let h=String(d?.message||"").toLowerCase();return h.includes("deadlock")||h.includes("serialization failure")||h.includes("could not serialize access")||h.includes("deadlock found when trying to get lock")||h.includes("lock wait timeout exceeded")||h.includes("database is locked")||h.includes("busy")}function ci(d,h){if(!h||h.length===0)return!1;let D=d&&(d.code||d.sqlState||d.sqlstate);if(!D)return!1;return h.includes(D)}function di(d){return new Promise((h)=>setTimeout(h,d))}var Or=new Map,fi=500,mi=[{key:"GROUP_BY",pattern:/GROUP\s+BY\b/iy},{key:"ORDER_BY",pattern:/ORDER\s+BY\b/iy},{key:"HAVING",pattern:/HAVING\b/iy},{key:"OFFSET",pattern:/OFFSET\b/iy},{key:"LIMIT",pattern:/LIMIT\b/iy},{key:"WHERE",pattern:/WHERE\b/iy}],gi=[{key:"tail",pattern:/GROUP\s+BY\b/iy},{key:"tail",pattern:/ORDER\s+BY\b/iy},{key:"tail",pattern:/HAVING\b/iy},{key:"tail",pattern:/LIMIT\b/iy},{key:"tail",pattern:/OFFSET\b/iy},{key:"tail",pattern:/WINDOW\b/iy},{key:"tail",pattern:/UNION\b/iy},{key:"tail",pattern:/INTERSECT\b/iy},{key:"tail",pattern:/EXCEPT\b/iy},{key:"tail",pattern:/FOR\s+UPDATE\b/iy},{key:"tail",pattern:/FOR\s+SHARE\b/iy},{key:"tail",pattern:/LOCK\s+IN\s+SHARE\s+MODE\b/iy}],yi=[{key:"cut",pattern:/GROUP\s+BY\b/iy},{key:"cut",pattern:/ORDER\s+BY\b/iy},{key:"cut",pattern:/WHERE\b/iy},{key:"cut",pattern:/HAVING\b/iy},{key:"cut",pattern:/LIMIT\b/iy},{key:"cut",pattern:/OFFSET\b/iy},{key:"cut",pattern:/UNION\b/iy}];function Sr(d){let h=Or.get(d);if(h!==void 0)return h;let D=pi(d);if(Or.size>=fi)Or.clear();return Or.set(d,D),D}function pi(d){let h=Re(d,mi);if(h.length<=1)return d;let D=d.slice(0,h[0].start).trimEnd(),E={};for(let xe=0;xe<h.length;xe++){let Fe=h[xe].start,Ie=xe+1<h.length?h[xe+1].start:d.length,Ve=d.slice(Fe,Ie).trim();if(!E[h[xe].key])E[h[xe].key]=[];E[h[xe].key].push(Ve)}let Ne=["WHERE","GROUP_BY","HAVING","ORDER_BY","LIMIT","OFFSET"].filter((xe)=>E[xe]).map((xe)=>E[xe].join(" ")).join(" ");return Ne?`${D} ${Ne}`:D}function hi(d,h){let D=Math.max(1,h?.baseMs??50),E=Math.max(1,h?.factor??2),V=Math.max(D,h?.maxMs??2000),Ne=Math.min(V,D*E**Math.max(0,d-1));if(h?.jitter)Ne=Math.min(V,Ne*(0.9+Math.random()*0.2));return Math.floor(Ne)}function i(d){let h=d?.sql??w(),D=d?.meta,E=d?.schema,V=(Le,Ue)=>{let ke=D?.temporalColumns?.[Le];if(!ke||ke.length===0||!r(e.dialect))return Ue;return Ue.map((ve)=>{let yt=null;for(let He of ke){if(!(He in ve))continue;let zt=kt(ve[He]);if(zt!==ve[He])yt=yt??{...ve},yt[He]=zt}return yt??ve})};function Ne(Le){if(typeof Le==="number")return Le;let Ue=String(Le),ke=7;for(let ve=0;ve<Ue.length;ve++)ke=ke*31+Ue.charCodeAt(ve)|0;return Math.abs(ke)}function xe(){if(!d?.hooks)return e.hooks;return{...e.hooks,...d.hooks}}let Fe=new Map;function Ie(Le){if(Array.isArray(Le)){let[He,zt,It]=Le;Xt(He,"where(column)");let Wt=String(He);switch(zt){case"in":if(Array.isArray(It)){let $t=s(It.length);return h.unsafe(`${Wt} IN (${$t})`,It)}return h.unsafe(`${Wt} IN (${t(1)})`,[It]);case"not in":if(Array.isArray(It)){let $t=s(It.length);return h.unsafe(`${Wt} NOT IN (${$t})`,It)}return h.unsafe(`${Wt} NOT IN (${t(1)})`,[It]);case"like":return h.unsafe(`${Wt} LIKE ${t(1)}`,[It]);case"is":case"is not":{if(It!==null&&It!==void 0)throw TypeError(`[query-builder] where(..., '${zt}', ?): operator '${zt}' only accepts NULL/undefined as value, got ${typeof It} (${String(It)})`);return h.unsafe(`${Wt} IS ${zt==="is not"?"NOT ":""}NULL`)}case"!=":return h.unsafe(`${Wt} <> ${t(1)}`,[It]);case"<":case">":case"<=":case">=":case"=":return h.unsafe(`${Wt} ${zt} ${t(1)}`,[It]);default:throw TypeError(`[query-builder] where(..., '${String(zt)}', ?): unsupported operator. Allowed: =, !=, <>, <, <=, >, >=, like, in, not in, is, is not`)}}if("raw"in Le)return Le.raw;let Ue=Object.keys(Le);if(Ue.length===0)return h.unsafe("");let ke=[],ve=[],yt=1;for(let He of Ue){Xt(He,"where(object key)");let zt=Le[He];if(Array.isArray(zt)){let It=s(zt.length,yt);ke.push(`${He} IN (${It})`),ve.push(...zt),yt+=zt.length}else ke.push(`${He} = ${t(yt++)}`),ve.push(zt)}return h.unsafe(ke.join(" AND "),ve)}function Ve(Le,Ue,ke){if(!ke)return Ue;let ve=Ie(ke);return h`${Ue} WHERE ${ve}`}function gt(Le){let Ue=e.debug?.captureText;if(e.debug)e.debug.captureText=!0;let ke=String(Le);if(e.debug)e.debug.captureText=Ue;return ke}function bt(Le){if(!Le||typeof Le!=="object")return;if(Array.isArray(Le.values))return Le.values;if(Array.isArray(Le.parameters))return Le.parameters;if(Array.isArray(Le.params))return Le.params;return}function pt(Le,Ue,ke){let ve=xe(),yt=ve?.slowQueryThresholdMs,He=yt!=null&&yt>=0,zt=Boolean(ve?.onSlowQuery||He),It=ve&&(ve.onQueryStart||ve.onQueryEnd||ve.onQueryError||ve.startSpan||zt),Wt=ke?.timeoutMs&&ke.timeoutMs>0||ke?.signal;if(!It&&!Wt)return Le.execute();let $t=gt(Le),ht=bt(Le),wt=Date.now(),St;try{if(ve?.onQueryStart?.({sql:$t,params:ht,kind:Ue}),ve?.startSpan)St=ve.startSpan({sql:$t,params:ht,kind:Ue})}catch{}let vt=!1,Ft=(Qt,yn)=>{if(vt)return;vt=!0;let _t=Date.now()-wt;try{if(Qt)ve?.onQueryError?.({sql:$t,params:ht,error:Qt,durationMs:_t,kind:Ue});else if(ve?.onQueryEnd?.({sql:$t,params:ht,durationMs:_t,rowCount:yn,kind:Ue}),He&&_t>=yt)if(ve?.onSlowQuery)ve.onSlowQuery({sql:$t,params:ht,durationMs:_t,kind:Ue});else console.warn(`[query-builder] slow query (${_t}ms >= ${yt}ms): ${$t}`)}catch{}try{St?.end(Qt)}catch{}},Yt=Le.execute(),Et=[Yt],Jt;if(ke?.timeoutMs&&ke.timeoutMs>0){let Qt=new Promise((yn,_t)=>{Jt=setTimeout(()=>{try{Le.cancel?.()}catch{}let Vt=Error(`Query timed out after ${ke.timeoutMs}ms`);Vt.code="EBQBTIMEOUT",_t(Vt)},ke.timeoutMs)});Et.push(Qt)}if(ke?.signal){if(ke.signal.aborted){try{Le.cancel?.()}catch{}let yn=Error("Query aborted");return yn.code="EBQBABORT",Ft(yn),Promise.reject(yn)}let Qt=()=>{try{Le.cancel?.()}catch{}};ke.signal.addEventListener("abort",Qt,{once:!0}),Yt.finally(()=>{ke.signal?.removeEventListener("abort",Qt)})}return Promise.race(Et).then((Qt)=>{clearTimeout(Jt);let yn=Array.isArray(Qt)?Qt.length:typeof Qt==="number"?Qt:void 0;return Ft(void 0,yn),Qt}).catch((Qt)=>{throw clearTimeout(Jt),Ft(Qt),Qt})}function xt(Le){if(typeof Le==="number")return Number.isFinite(Le)?Le:0;if(typeof Le==="bigint")return Number(Le);if(!Le||typeof Le!=="object")return 0;let Ue=Le;for(let ke of["changes","affectedRows","count","rowCount","numAffectedRows","numUpdatedRows","numDeletedRows","numInsertedOrUpdatedRows"])if(Ue[ke]!==void 0&&Ue[ke]!==null)return xt(Ue[ke]);if(Array.isArray(Le))return Le.reduce((ke,ve)=>ke+xt(ve),0);return 0}function jt(Le,Ue){let ke=Ue??gt(Le);return{sql:ke,toString:()=>ke,execute:()=>Le.execute(),values:()=>Le.values(),raw:()=>Le.raw()}}function Ht(Le,Ue){let ke=h,ve=Ue&&Ue.length>0?`SELECT ${Ue.join(", ")} FROM ${String(Le)}`:`SELECT * FROM ${String(Le)}`,yt=[],He=[],zt=!1,It=!1,Wt=!1,$t=null,ht=()=>{if($t===null){let U=Sr(Ft());$t=He.length>0?h.unsafe(U,He):h.unsafe(U)}return $t},wt=(U,G)=>{yt.push({conn:U,sql:G}),$t=null},St=(U,G)=>{wt(U==="OR"?"OR":"AND",G)},vt=(U)=>{let G=Re(U,gi,1);return G.length>0?G[0].start:-1},Ft=(U)=>{let G=x(U?[...yt,U]:yt);if(!G)return ve;if(zt)return`${ve} ${It?"AND":"WHERE"} ${G}`;let Ke=vt(ve);return Ke>=0?`${ve.slice(0,Ke)}WHERE ${G} ${ve.slice(Ke)}`:`${ve} WHERE ${G}`},Yt=(U,G)=>{let Ke=Ht(Le);G(Ke);let je=Ke.__whereState?.();if(!je||!je.body)throw TypeError("[query-builder] whereGroup(callback): the callback added no conditions. Add at least one where()/orWhere() to the builder it receives.");let Dt=He.length,Ot=Dt>0&&e.dialect==="postgres"?je.body.replace(/\$(\d+)/g,(qt,Kt)=>`$${Number(Kt)+Dt}`):je.body;He.push(...je.params),wt(U,`(${Ot})`)},Et=(U,G,Ke,je,Dt,Ot)=>{if(typeof je==="string"&&Dt!==void 0){Xt(String(je),`${Ke}(column)`),vn(Dt,`${Ke}(operator)`);let qt=He.length+1;return He.push(Ot),wt(G,`${String(je)} ${String(Dt)} ${t(qt)}`),U}if(Array.isArray(je)){let[qt,Kt,Gt]=je,Lt=String(qt);Xt(Lt,`${Ke}(column)`);let Ut=vn(Kt,`${Ke}(operator)`);if(Ut==="in"||Ut==="not in"){let Tn=Array.isArray(Gt)?Gt:[Gt],En=s(Tn.length,He.length+1),In=o(l(Lt),Tn,Ut==="not in",En);He.push(...Tn),wt(G,In)}else{let Tn=He.length+1;He.push(Gt),wt(G,`${Lt} ${Ut} ${t(Tn)}`)}return U}if(typeof je==="function")return Yt(G,je),U;if(je&&typeof je==="object"&&!("raw"in je)){let qt=[];for(let Kt of Object.keys(je)){Xt(Kt,`${Ke}(column)`);let Gt=je[Kt];if(Array.isArray(Gt)){let Lt=s(Gt.length,He.length+1);qt.push(o(l(Kt),Gt,!1,Lt)),He.push(...Gt)}else{let Lt=He.length+1;qt.push(`${Kt} = ${t(Lt)}`),He.push(Gt)}}if(qt.length>0)wt(G,qt.length>1?`(${qt.join(" AND ")})`:qt[0]);return U}if(je&&typeof je.raw<"u")return wt(G,je.raw),U;return U},Jt=(U,G)=>{if(yt.length>0)ve=Ft(),yt.length=0;zt=!0;let Ke=G.__rawState?.();if(Ke){let je=He.length,Dt=e.dialect==="postgres"?Ke.sql.replace(/\$(\d+)/g,(Ot,qt)=>`$${Number(qt)+je}`):Ke.sql;ve+=` ${U} ${Dt}`,He.push(...Ke.params),It=G.__hasPredicate?.()??Bn.WHERE.test(Dt)}else{let je=String(G.toSQL());ve+=` ${U} ${je}`,It=G.__hasPredicate?.()??Bn.WHERE.test(je)}$t=null},Qt=(U)=>{let G=Re(ve,yi,1),Ke=G.length>0?G[0].start:-1;ve=Ke>=0?`${ve.slice(0,Ke)}${U} ${ve.slice(Ke)}`:`${ve} ${U}`,$t=null},yn=new Set,_t,Vt,wn=!1,Dn=!1,Nn=!1,Vn=new Map,jn=new Set,ur=60000,On=(U)=>y(e.relations.singularizeStrategy)(U),Hn=(U)=>{if(!D)return null;return S(D,String(Le),U,{singularize:On,models:D.models})},ar=(U)=>{if(!U||typeof U!=="object"||jn.size===0)return U;let G;for(let Ke of Object.keys(U))if(Ke.startsWith("pivot_")){if(!G)G={};G[Ke.slice(6)]=U[Ke],delete U[Ke]}if(G)U.pivot=G;return U},Zn=(U)=>{if(jn.size===0||!U)return U;if(Array.isArray(U))for(let G=0;G<U.length;G++)ar(U[G]);else ar(U);return U},gr=(U)=>{if(!D)return;if(yn.has(U.pivotTable))return;let G=String(Le),Ke=D.primaryKeys[G]??"id";Xt(U.pivotTable,"wherePivot auto-join (pivot table)"),Xt(U.fkParent,"wherePivot auto-join (parent FK)"),Xt(G,"wherePivot auto-join (parent table)"),Xt(Ke,"wherePivot auto-join (parent PK)"),$t=ke`${ht()} LEFT JOIN ${ke(U.pivotTable)} ON ${ke(`${U.pivotTable}.${U.fkParent}`)} = ${ke(`${G}.${Ke}`)}`,ve=`${ve} LEFT JOIN ${U.pivotTable} ON ${U.pivotTable}.${U.fkParent} = ${G}.${Ke}`,yn.add(U.pivotTable)},yr=(U)=>{if(Bn.SELECT_STAR.test(ve))ve=ve.replace(Bn.SELECT_STAR,`SELECT *, ${U}`);else if(Bn.SELECT.test(ve))ve=ve.replace(Bn.SELECT_FROM,`SELECT $1, ${U} FROM`);let G=String(ht());if(Bn.SELECT_STAR.test(G)){let Ke=G.replace(Bn.SELECT_STAR,`SELECT *, ${U}`);$t=h.unsafe(Ke)}else if(Bn.SELECT.test(G)){if(Bn.SELECT_FROM.exec(G)){let je=G.replace(Bn.SELECT_FROM,`SELECT $1, ${U} FROM`);$t=h.unsafe(je)}}},Yn=(U,G,Ke,je)=>{yr(`${U} ${li(Ke,je)} AS ${G}`)},xr=(U,G,Ke,je)=>{Xt(U,"relationship subquery (parent table)"),Xt(G,"relationship subquery (target table)"),Xt(Ke,"relationship subquery (primary key)");let Dt=`${U.endsWith("s")?U.slice(0,-1):U}_id`;Xt(Dt,"relationship subquery (foreign key)");let Ot=`SELECT 1 FROM ${G} WHERE ${G}.${Dt} = ${U}.${Ke}`;if(je){let Kt=je({where:(Gt,Lt,Ut)=>(Xt(Gt,"relationship subquery condition"),`${G}.${Gt} ${vn(Lt,"whereHas callback")} ${er(Ut)}`)});if(Kt)Ot+=` AND ${Kt}`}return Ot},Nr=(U,G,Ke,je)=>{Xt(U,"relationship subquery (parent table)"),Xt(G,"relationship subquery (target table)"),Xt(Ke,"relationship subquery (primary key)");let Dt=`${G.endsWith("s")?G.slice(0,-1):G}_id`;Xt(Dt,"relationship subquery (foreign key)");let Ot=`SELECT 1 FROM ${G} WHERE ${G}.${Ke} = ${U}.${Dt}`;if(je){let Kt=je({where:(Gt,Lt,Ut)=>(Xt(Gt,"relationship subquery condition"),`${G}.${Gt} ${vn(Lt,"whereHas callback")} ${er(Ut)}`)});if(Kt)Ot+=` AND ${Kt}`}return Ot},kr=(U,G,Ke,je,Dt,Ot)=>{Xt(U,"relationship subquery (parent table)"),Xt(G,"relationship subquery (target table)"),Xt(Ke,"relationship subquery (primary key)"),Xt(je,"relationship subquery (target primary key)");let qt=Ot&&D?S(D,U,Ot,{singularize:On,models:D.models}):null,Kt=On(U),Gt=On(G),Lt=qt?.pivotTable??[Kt,Gt].sort().join("_"),Ut=qt?.fkParent??`${Kt}_id`,Tn=qt?.fkRelated??`${Gt}_id`;Xt(Lt,"relationship subquery (pivot table)"),Xt(Ut,"relationship subquery (foreign key A)"),Xt(Tn,"relationship subquery (foreign key B)");let En=`SELECT 1 FROM ${Lt} JOIN ${G} ON ${G}.${je} = ${Lt}.${Tn} WHERE ${Lt}.${Ut} = ${U}.${Ke}`;if(Dt){let bn=Dt({where:(Pn,qn,Fn)=>(Xt(Pn,"relationship subquery condition"),`${G}.${Pn} ${vn(qn,"whereHas callback")} ${er(Fn)}`)});if(bn)En+=` AND ${bn}`}return En},Hs=(U,G,Ke)=>{Xt(U,"withCount (parent table)"),Xt(G,"withCount (target table)"),Xt(Ke,"withCount (primary key)");let je=`${U.endsWith("s")?U.slice(0,-1):U}_id`;return Xt(je,"withCount (foreign key)"),`(SELECT COUNT(*) FROM ${G} WHERE ${G}.${je} = ${U}.${Ke})`},Ys=(U,G,Ke,je)=>{Xt(U,"withCount (parent table)"),Xt(G,"withCount (target table)"),Xt(Ke,"withCount (primary key)");let Dt=je&&D?S(D,U,je,{singularize:On,models:D.models}):null,Ot=On(U),qt=On(G),Kt=Dt?.pivotTable??[Ot,qt].sort().join("_"),Gt=Dt?.fkParent??`${Ot}_id`;return Xt(Kt,"withCount (pivot table)"),Xt(Gt,"withCount (foreign key)"),`(SELECT COUNT(*) FROM ${Kt} WHERE ${Kt}.${Gt} = ${U}.${Ke})`},Br=(U,G,Ke)=>{if(!D)return;Xt(Ke,`with${U[0]}${U.slice(1).toLowerCase()} (column)`);let je=String(Le),Dt=D.relations?.[je];if(!Dt)return;let Ot=Object.entries(Dt).find(([bn,Pn])=>Pn&&typeof Pn==="object"&&(G in Pn));if(!Ot)return;let[qt,Kt]=Ot,Gt=Kt[G],Lt=typeof Gt==="string"?Gt:Gt?.model||Gt?.target||Gt,Ut=D.modelToTable[Lt]||Lt,Tn=D.primaryKeys[je]??"id";Xt(Ut,`with${U} (target table)`);let En=`${U}(${Ut}.${Ke})`,In;if(qt==="hasMany"||qt==="hasOne"){let bn=`${je.endsWith("s")?je.slice(0,-1):je}_id`;Xt(bn,`with${U} (foreign key)`),In=`(SELECT ${En} FROM ${Ut} WHERE ${Ut}.${bn} = ${je}.${Tn})`}else if(qt==="belongsToMany"){let bn=D?S(D,je,G,{singularize:On,models:D.models}):null,Pn=On(je),qn=On(Ut),Fn=bn?.pivotTable??[Pn,qn].sort().join("_"),Ln=bn?.fkParent??`${Pn}_id`,$n=bn?.fkRelated??`${qn}_id`,pr=D.primaryKeys[Ut]??"id";Xt(Fn,`with${U} (pivot table)`),Xt(Ln,`with${U} (foreign key)`),Xt($n,`with${U} (related key)`),In=`(SELECT ${En} FROM ${Fn} JOIN ${Ut} ON ${Ut}.${pr} = ${Fn}.${$n} WHERE ${Fn}.${Ln} = ${je}.${Tn})`}else return;yr(`${In} AS ${G}_${U.toLowerCase()}_${Ke}`)},ts=()=>{if(Vn.size===0)return;let U=[];for(let[G,Ke]of Vn.entries()){let je=Hn(G);if(!je)continue;for(let Ot of Ke)Xt(Ot,"withPivot");let Dt=Ke.map((Ot)=>`${je.pivotTable}.${Ot} AS pivot_${Ot}`);U.push(...Dt)}if(U.length>0){let G=U.join(", ");yr(G)}};return new Proxy({distinct(){return ve=ve.replace(/^SELECT\s+/i,"SELECT DISTINCT "),$t=null,this},distinctOn(...U){let G=U.map(String).join(", ");return ve=ve.replace(/^SELECT\s+/i,`SELECT DISTINCT ON (${G}) `),$t=null,this},selectRaw(U){let G=or(U,"selectRaw(fragment)"),Ke=ve.indexOf(" FROM ");if(Ke!==-1)ve=`${ve.substring(0,Ke)}, ${G}${ve.substring(Ke)}`;else ve+=`, ${G}`;return $t=null,this},rowNumber(U="row_number",G,Ke){let je=[];if(G){let Kt=Array.isArray(G)?G:[G];je.push(`PARTITION BY ${Kt.join(", ")}`)}if(Ke&&Ke.length)je.push(`ORDER BY ${Ke.map(([Kt,Gt])=>`${Kt} ${Gt==="desc"?"DESC":"ASC"}`).join(", ")}`);let Ot=`ROW_NUMBER() ${je.length?`OVER (${je.join(" ")})`:"OVER ()"} AS ${U}`,qt=ve.indexOf(" FROM ");if(qt!==-1)ve=`${ve.substring(0,qt)}, ${Ot}${ve.substring(qt)}`;else ve+=`, ${Ot}`;return $t=null,this},denseRank(U="dense_rank",G,Ke){let je=Array.isArray(G)?G:G?[G]:[],Dt=[];if(je.length)Dt.push(`PARTITION BY ${je.join(", ")}`);if(Ke&&Ke.length)Dt.push(`ORDER BY ${Ke.map(([Gt,Lt])=>`${Gt} ${Lt==="desc"?"DESC":"ASC"}`).join(", ")}`);let qt=`DENSE_RANK() ${Dt.length?`OVER (${Dt.join(" ")})`:"OVER ()"} AS ${U}`,Kt=ve.indexOf(" FROM ");if(Kt!==-1)ve=`${ve.substring(0,Kt)}, ${qt}${ve.substring(Kt)}`;else ve+=`, ${qt}`;return $t=null,this},rank(U="rank",G,Ke){let je=Array.isArray(G)?G:G?[G]:[],Dt=[];if(je.length)Dt.push(`PARTITION BY ${je.join(", ")}`);if(Ke&&Ke.length)Dt.push(`ORDER BY ${Ke.map(([Gt,Lt])=>`${Gt} ${Lt==="desc"?"DESC":"ASC"}`).join(", ")}`);let qt=`RANK() ${Dt.length?`OVER (${Dt.join(" ")})`:"OVER ()"} AS ${U}`,Kt=ve.indexOf(" FROM ");if(Kt!==-1)ve=`${ve.substring(0,Kt)}, ${qt}${ve.substring(Kt)}`;else ve+=`, ${qt}`;return $t=null,this},over(U,G,Ke={}){return Yn(U,G,Ke.partitionBy,Ke.orderBy),this},lag(U,G={}){let Ke=[U,String(G.offset??1)];if(G.defaultValue!==void 0)Ke.push(String(G.defaultValue));return Yn(`LAG(${Ke.join(", ")})`,G.alias??`${U}_lag`,G.partitionBy,G.orderBy),this},lead(U,G={}){let Ke=[U,String(G.offset??1)];if(G.defaultValue!==void 0)Ke.push(String(G.defaultValue));return Yn(`LEAD(${Ke.join(", ")})`,G.alias??`${U}_lead`,G.partitionBy,G.orderBy),this},sumOver(U,G={}){return Yn(`SUM(${U})`,G.alias??`${U}_sum`,G.partitionBy,G.orderBy),this},avgOver(U,G={}){return Yn(`AVG(${U})`,G.alias??`${U}_avg`,G.partitionBy,G.orderBy),this},countOver(U="*",G={}){return Yn(`COUNT(${U})`,G.alias??"count_over",G.partitionBy,G.orderBy),this},minOver(U,G={}){return Yn(`MIN(${U})`,G.alias??`${U}_min`,G.partitionBy,G.orderBy),this},maxOver(U,G={}){return Yn(`MAX(${U})`,G.alias??`${U}_max`,G.partitionBy,G.orderBy),this},firstValue(U,G={}){return Yn(`FIRST_VALUE(${U})`,G.alias??`${U}_first`,G.partitionBy,G.orderBy),this},lastValue(U,G={}){return Yn(`LAST_VALUE(${U})`,G.alias??`${U}_last`,G.partitionBy,G.orderBy),this},selectAll(){return this},select(U){if(!U)return this;let G=Array.isArray(U)?U:[U];if(G.length===0)return this;let Ke=G.map(ns),je=/^SELECT\s+(DISTINCT(?:\s+ON\s+\([^)]*\))?\s+)/i.exec(ve),Dt=je?je[1]:"",Ot=ve.indexOf(" FROM ");if(Ot!==-1)ve=`SELECT ${Dt}${Ke.join(", ")}${ve.substring(Ot)}`;else ve=`SELECT ${Dt}${Ke.join(", ")} FROM ${Le}`;return $t=null,this},addSelect(...U){if(!U.length)return this;let G=U.map(ns),Ke=ve.indexOf(" FROM ");if(Ke!==-1)ve=`${ve.substring(0,Ke)}, ${G.join(", ")}${ve.substring(Ke)}`;else ve+=`, ${G.join(", ")}`;return $t=null,this},with(...U){if(!D||!U||U.length===0)return this;let G=[];for(let Lt of U){if(!Lt)continue;if(typeof Lt==="string")G.push({name:Lt});else if(typeof Lt==="object"&&!Array.isArray(Lt))for(let[Ut,Tn]of Object.entries(Lt))if(typeof Tn==="function")G.push({name:Ut,callback:Tn});else G.push({name:Ut})}if(G.length===0)return this;let Ke=e.relations.maxEagerLoad??50;if(G.length>Ke)throw Error(`[query-builder] Too many relationships to eager load (${G.length}). Maximum allowed: ${Ke}`);let je=String(Le),Dt=new Set,Ot=new Set,qt=new Map,Kt=(Lt)=>{let Ut=D.relations?.[Lt];if(!Ut)return[];return[...Object.keys(Ut.hasOne||{}),...Object.keys(Ut.hasMany||{}),...Object.keys(Ut.belongsTo||{}),...Object.keys(Ut.belongsToMany||{}),...Object.keys(Ut.hasOneThrough||{}),...Object.keys(Ut.hasManyThrough||{}),...Object.keys(Ut.morphOne||{}),...Object.keys(Ut.morphMany||{}),...Object.keys(Ut.morphToMany||{}),...Object.keys(Ut.morphedByMany||{})]},Gt=(Lt,Ut,Tn=0,En)=>{let In=e.relations.maxDepth??10;if(Tn>=In)throw Error(`[query-builder] Maximum relationship depth (${In}) exceeded at '${Ut}'. Consider using separate queries or increasing maxDepth.`);let bn=D.relations?.[Lt];if(!bn)return Lt;let Pn=(Rn)=>{if(e.softDeletes?.enabled&&e.softDeletes?.defaultFilter){let xn=e.softDeletes.column||"deleted_at";return` AND ${Rn}.${xn} IS NULL`}return""},qn=(Rn)=>{if(!En)return"";let xn=[],Mn=(kn,Un,Gn)=>{Xt(String(kn),"with() constraint column");let cr=vn(Un,"with() constraint operator");xn.push(`${Rn}.${String(kn)} ${cr} ${er(Gn)}`)},An=(kn)=>()=>{throw Error(`[query-builder] with('${Ut}', ...): ${kn} is not supported inside a constraint callback on the JOIN-based builder \u2014 apply it to the outer query, or use the model layer's eager loading. (Silently ignoring it would return wrong data.)`)},Cn={where:(kn,Un,Gn)=>{if(Array.isArray(kn))Mn(kn[0],kn[1],kn[2]);else if(kn&&typeof kn==="object")for(let cr of Object.keys(kn))Mn(cr,"=",kn[cr]);else if(Un!==void 0&&Gn!==void 0)Mn(kn,Un,Gn);else if(Un!==void 0)Mn(kn,"=",Un);return Cn},whereIn:(kn,Un)=>(Xt(String(kn),"with() constraint column"),xn.push(`${Rn}.${String(kn)} IN (${Un.map(er).join(", ")})`),Cn),whereNull:(kn)=>(Xt(String(kn),"with() constraint column"),xn.push(`${Rn}.${String(kn)} IS NULL`),Cn),whereNotNull:(kn)=>(Xt(String(kn),"with() constraint column"),xn.push(`${Rn}.${String(kn)} IS NOT NULL`),Cn),orderBy:An("orderBy()"),limit:An("limit()"),offset:An("offset()"),take:An("take()")};return En(Cn),xn.length?` AND ${xn.join(" AND ")}`:""},Fn=()=>{let Rn=(An)=>{let Cn=An?.[Ut];return Cn?D.modelToTable[Cn]:void 0},xn=(An)=>{let Cn=An?.[Ut],kn=typeof Cn==="string"?Cn:Cn?.model;return kn?D.modelToTable[kn]:void 0},Mn=(An)=>{let Cn=An?.[Ut];return Cn?.target?D.modelToTable[Cn.target]:void 0};return Rn(bn?.hasOne)||Rn(bn?.hasMany)||Rn(bn?.belongsTo)||xn(bn?.belongsToMany)||Mn(bn?.hasOneThrough)||Mn(bn?.hasManyThrough)||Rn(bn?.morphOne)||Rn(bn?.morphMany)||Rn(bn?.morphToMany)||Rn(bn?.morphedByMany)},Ln=Fn()??(D.modelToTable[Ut]||D.tableToModel[Ut]?D.modelToTable[Ut]??Ut:Ut),$n=String(Ln);if(!Ln||!Fn()&&!D.modelToTable[Ut]&&!D.tableToModel[Ut]){let Rn=Kt(Lt);if(Rn.length>0&&!Rn.includes(Ut)){let xn=` Available relationships: ${Rn.join(", ")}`;throw Error(`[query-builder] Relationship '${Ut}' not found on table '${Lt}'.${xn}`)}}if(e.relations.detectCycles!==!1){let Rn=`${Lt}->${$n}`;if(Dt.has(Rn))throw Error(`[query-builder] Circular relationship detected: ${Rn}. This would cause an infinite loop.`);Dt.add(Rn)}if(!$n||$n===Lt)return Lt;let pr=bn?.hasOneThrough?.[Ut]||bn?.hasManyThrough?.[Ut];if(pr){let{through:Rn,target:xn}=pr,Mn=D.modelToTable[Rn]||Rn,An=D.modelToTable[xn]||xn,Cn=D.primaryKeys[Lt]??"id",kn=D.primaryKeys[Mn]??"id",Un=`${On(Lt)}_id`,Gn=`${On(Mn)}_id`;return Qt(`LEFT JOIN ${Mn} ON ${Mn}.${Un} = ${Lt}.${Cn} LEFT JOIN ${An} ON ${An}.${Gn} = ${Mn}.${kn}`),yn.add(Mn),yn.add(An),An}if(Boolean(bn?.belongsToMany?.[Ut])){let Rn=S(D,Lt,Ut,{singularize:On,models:D.models}),xn=Rn?.pivotTable??[On(Lt),On($n)].sort().join("_"),Mn=D.primaryKeys[Lt]??"id",An=D.primaryKeys[$n]??"id",Cn=Rn?.fkParent??`${On(Lt)}_id`,kn=Rn?.fkRelated??`${On($n)}_id`;return Qt(`LEFT JOIN ${xn} ON ${xn}.${Cn} = ${Lt}.${Mn} LEFT JOIN ${$n} ON ${$n}.${An} = ${xn}.${kn}${qn($n)}`),yn.add(xn),yn.add($n),$n}if(Boolean(bn?.morphToMany?.[Ut])){let Rn=Ut,xn=`${On($n)}_${Rn}`,Mn=D.primaryKeys[Lt]??"id",An=D.primaryKeys[$n]??"id",Cn=`${Rn}_type`,kn=`${Rn}_id`,Un=`${On($n)}_id`,Gn=er(D.tableToModel[Lt]||Lt);return Qt(`LEFT JOIN ${xn} ON ${xn}.${kn} = ${Lt}.${Mn} AND ${xn}.${Cn} = ${Gn} LEFT JOIN ${$n} ON ${$n}.${An} = ${xn}.${Un}`),yn.add(xn),yn.add($n),$n}if(Boolean(bn?.morphedByMany?.[Ut])){let Rn=bn.morphedByMany?.[Ut]||Ut,xn=D.modelToTable[Rn]||Rn,Mn=On(Lt),An=`${On(xn)}_${Mn}`,Cn=D.primaryKeys[Lt]??"id",kn=D.primaryKeys[xn]??"id",Un=`${Mn}_type`,Gn=`${Mn}_id`,cr=`${On(xn)}_id`,ti=er(D.tableToModel[xn]||xn);return Qt(`LEFT JOIN ${An} ON ${An}.${cr} = ${Lt}.${Cn} LEFT JOIN ${xn} ON ${xn}.${kn} = ${An}.${Gn} AND ${An}.${Un} = ${ti}`),yn.add(An),yn.add(xn),xn}if(Boolean(bn?.belongsTo?.[Ut])){let Rn=`${On($n)}_id`,xn=D.primaryKeys[$n]??"id";return Qt(`LEFT JOIN ${$n} ON ${Lt}.${Rn} = ${$n}.${xn}${qn($n)}`),yn.add($n),$n}let Gs=Boolean(bn?.morphOne?.[Ut]),zs=Boolean(bn?.morphMany?.[Ut]);if(Gs||zs){let Rn=`${Ut}_type`,xn=`${Ut}_id`,Mn=D.primaryKeys[Lt]??"id",An=er(D.tableToModel[Lt]||Lt);return Qt(`LEFT JOIN ${$n} ON ${$n}.${xn} = ${Lt}.${Mn} AND ${$n}.${Rn} = ${An}`),yn.add($n),$n}let Xs=`${On(Lt)}_id`,Zs=D.primaryKeys[Lt]??"id",ei=`${Pn($n)}${qn($n)}`;return Qt(`LEFT JOIN ${$n} ON ${$n}.${Xs} = ${Lt}.${Zs}${ei}`),yn.add($n),$n};for(let Lt of G){let Ut=Lt.name.trim();if(Lt.callback)qt.set(Ut,Lt.callback);let Tn=Ut.split("."),En=je,In=0;for(let bn of Tn){if(!bn||bn.trim().length===0)continue;let Pn=bn.trim(),qn=qt.get(Pn);En=Gt(En,Pn,In,qn)||En,In++}Ot.add(Ut)}if(Vn.size>0){let Lt=[];for(let[Ut,Tn]of Vn.entries()){let En=Hn(Ut);if(!En)continue;let In=Tn.map((bn)=>`${En.pivotTable}.${bn} AS pivot_${bn}`);Lt.push(...In)}if(Lt.length>0){let Ut=Lt.join(", ");yr(Ut)}}return $t=null,this},whereHas(U,G){if(!D)return this;let Ke=String(Le),je=D.relations?.[Ke];if(!je)throw Error(`[query-builder] No relationships defined for table '${Ke}'`);let Dt=Object.entries(je).find(([Tn,En])=>En&&typeof En==="object"&&(U in En));if(!Dt)throw Error(`[query-builder] Relationship '${U}' not found on table '${Ke}'`);let[Ot,qt]=Dt,Kt=qt[U],Gt=typeof Kt==="string"?Kt:Kt?.model||Kt?.target||Kt,Lt=D.modelToTable[Gt]||Gt,Ut;if(Ot==="hasMany"||Ot==="hasOne"){let Tn=D.primaryKeys[Ke]??"id";Ut=xr(Ke,Lt,Tn,G)}else if(Ot==="belongsTo"){let Tn=D.primaryKeys[Lt]??"id";Ut=Nr(Ke,Lt,Tn,G)}else if(Ot==="belongsToMany"){let Tn=D.primaryKeys[Ke]??"id",En=D.primaryKeys[Lt]??"id";Ut=kr(Ke,Lt,Tn,En,G,U)}else throw Error(`[query-builder] Unsupported relationship type '${Ot}' for whereHas`);return St("WHERE",`EXISTS (${Ut})`),this},whereDoesntHave(U,G){if(!D)return this;let Ke=String(Le),je=D.relations?.[Ke];if(!je)throw Error(`[query-builder] No relationships defined for table '${Ke}'`);let Dt=Object.entries(je).find(([Tn,En])=>En&&typeof En==="object"&&(U in En));if(!Dt)throw Error(`[query-builder] Relationship '${U}' not found on table '${Ke}'`);let[Ot,qt]=Dt,Kt=qt[U],Gt=typeof Kt==="string"?Kt:Kt?.model||Kt?.target||Kt,Lt=D.modelToTable[Gt]||Gt,Ut;if(Ot==="hasMany"||Ot==="hasOne"){let Tn=D.primaryKeys[Ke]??"id";Ut=xr(Ke,Lt,Tn,G)}else if(Ot==="belongsTo"){let Tn=D.primaryKeys[Lt]??"id";Ut=Nr(Ke,Lt,Tn,G)}else if(Ot==="belongsToMany"){let Tn=D.primaryKeys[Ke]??"id",En=D.primaryKeys[Lt]??"id";Ut=kr(Ke,Lt,Tn,En,G,U)}else throw Error(`[query-builder] Unsupported relationship type '${Ot}' for whereDoesntHave`);return St("WHERE",`NOT EXISTS (${Ut})`),this},has(U){if(!D)return this;let G=String(Le),Ke=D.relations?.[G];if(!Ke)throw Error(`[query-builder] No relationships defined for table '${G}'`);let je=Object.entries(Ke).find(([Ut,Tn])=>Tn&&typeof Tn==="object"&&(U in Tn));if(!je)throw Error(`[query-builder] Relationship '${U}' not found on table '${G}'`);let[Dt,Ot]=je,qt=Ot[U],Kt=typeof qt==="string"?qt:qt?.model||qt?.target||qt,Gt=D.modelToTable[Kt]||Kt,Lt;if(Dt==="hasMany"||Dt==="hasOne"){let Ut=D.primaryKeys[G]??"id";Lt=xr(G,Gt,Ut)}else if(Dt==="belongsTo"){let Ut=D.primaryKeys[Gt]??"id";Lt=Nr(G,Gt,Ut)}else if(Dt==="belongsToMany"){let Ut=D.primaryKeys[G]??"id",Tn=D.primaryKeys[Gt]??"id";Lt=kr(G,Gt,Ut,Tn,void 0,U)}else throw Error(`[query-builder] Unsupported relationship type '${Dt}' for has`);return St("WHERE",`EXISTS (${Lt})`),this},doesntHave(U){if(!D)return this;let G=String(Le),Ke=D.relations?.[G];if(!Ke)throw Error(`[query-builder] No relationships defined for table '${G}'`);let je=Object.entries(Ke).find(([Ut,Tn])=>Tn&&typeof Tn==="object"&&(U in Tn));if(!je)throw Error(`[query-builder] Relationship '${U}' not found on table '${G}'`);let[Dt,Ot]=je,qt=Ot[U],Kt=typeof qt==="string"?qt:qt?.model||qt?.target||qt,Gt=D.modelToTable[Kt]||Kt,Lt;if(Dt==="hasMany"||Dt==="hasOne"){let Ut=D.primaryKeys[G]??"id";Lt=xr(G,Gt,Ut)}else if(Dt==="belongsTo"){let Ut=D.primaryKeys[Gt]??"id";Lt=Nr(G,Gt,Ut)}else if(Dt==="belongsToMany"){let Ut=D.primaryKeys[G]??"id",Tn=D.primaryKeys[Gt]??"id";Lt=kr(G,Gt,Ut,Tn,void 0,U)}else throw Error(`[query-builder] Unsupported relationship type '${Dt}' for doesntHave`);return St("WHERE",`NOT EXISTS (${Lt})`),this},withCount(...U){if(!D||!U||U.length===0)return this;let G=String(Le);for(let Ke of U){let je=D.relations?.[G];if(!je)continue;let Dt=Object.entries(je).find(([In,bn])=>bn&&typeof bn==="object"&&(Ke in bn));if(!Dt)continue;let[Ot,qt]=Dt,Kt=qt[Ke],Gt=typeof Kt==="string"?Kt:Kt?.model||Kt?.target||Kt,Lt=D.modelToTable[Gt]||Gt,Ut=D.primaryKeys[G]??"id",Tn;if(Ot==="hasMany"||Ot==="hasOne")Tn=Hs(G,Lt,Ut);else if(Ot==="belongsToMany")Tn=Ys(G,Lt,Ut,Ke);else continue;let En=`${Ke}_count`;yr(`${Tn} AS ${En}`)}return this},withSum(U,G){return Br("SUM",U,G),this},withAvg(U,G){return Br("AVG",U,G),this},withMax(U,G){return Br("MAX",U,G),this},withMin(U,G){return Br("MIN",U,G),this},applyPivotColumns(){return ts(),this},withPivot(U,...G){if(!D)return this;let Ke=String(Le),je=Hn(U);if(!je)throw Error(`[query-builder] Relationship '${U}' is not a belongsToMany relationship on table '${Ke}'`);let Dt=G&&G.length>0?G:je.hasConfig?je.pivotColumns:[];if(Dt.length===0)return this;if(Vn.set(U,Dt),je.hasConfig)jn.add(U);return ts(),this},wherePivot(U,G,Ke,je){if(!D)return this;let Dt=Hn(U);if(!Dt)throw Error(`[query-builder] Relationship '${U}' is not a belongsToMany relationship on table '${String(Le)}'`);Xt(Dt.pivotTable,"wherePivot (pivot table)"),Xt(G,"wherePivot (column)"),gr(Dt);let Ot=je===void 0?"=":String(Ke),qt=je===void 0?Ke:je,Kt=He.length+1,Gt=`${Dt.pivotTable}.${G} ${Ot} ${t(Kt)}`;if(He.push(qt),wt("AND",Gt),Dt.hasConfig)jn.add(U);return this},wherePivotIn(U,G,Ke){if(!D||!Array.isArray(Ke))return this;let je=Hn(U);if(!je)throw Error(`[query-builder] Relationship '${U}' is not a belongsToMany relationship on table '${String(Le)}'`);Xt(je.pivotTable,"wherePivotIn (pivot table)"),Xt(G,"wherePivotIn (column)"),gr(je);let Dt=s(Ke.length,He.length+1),Ot=o(`${je.pivotTable}.${G}`,Ke,!1,Dt);if(He.push(...Ke),wt("AND",Ot),je.hasConfig)jn.add(U);return this},wherePivotNotIn(U,G,Ke){if(!D||!Array.isArray(Ke)||Ke.length===0)return this;let je=Hn(U);if(!je)throw Error(`[query-builder] Relationship '${U}' is not a belongsToMany relationship on table '${String(Le)}'`);Xt(je.pivotTable,"wherePivotNotIn (pivot table)"),Xt(G,"wherePivotNotIn (column)"),gr(je);let Dt=s(Ke.length,He.length+1),Ot=`${je.pivotTable}.${G} NOT IN (${Dt})`;if(He.push(...Ke),wt("AND",Ot),je.hasConfig)jn.add(U);return this},wherePivotNull(U,G){if(!D)return this;let Ke=Hn(U);if(!Ke)throw Error(`[query-builder] Relationship '${U}' is not a belongsToMany relationship on table '${String(Le)}'`);if(Xt(Ke.pivotTable,"wherePivotNull (pivot table)"),Xt(G,"wherePivotNull (column)"),gr(Ke),wt("AND",`${Ke.pivotTable}.${G} IS NULL`),Ke.hasConfig)jn.add(U);return this},wherePivotNotNull(U,G){if(!D)return this;let Ke=Hn(U);if(!Ke)throw Error(`[query-builder] Relationship '${U}' is not a belongsToMany relationship on table '${String(Le)}'`);if(Xt(Ke.pivotTable,"wherePivotNotNull (pivot table)"),Xt(G,"wherePivotNotNull (column)"),gr(Ke),wt("AND",`${Ke.pivotTable}.${G} IS NOT NULL`),Ke.hasConfig)jn.add(U);return this},where(U,G,Ke){if(typeof U==="string"&&G!==void 0){Xt(String(U),"where(column)"),vn(G,"where(operator)");let je=String(G).toLowerCase();if(je==="in"||je==="not in"){let Ot=Array.isArray(Ke)?Ke:[Ke],qt=s(Ot.length,He.length+1),Kt=o(l(String(U)),Ot,je==="not in",qt);return He.push(...Ot),wt("AND",Kt),this}let Dt=He.length+1;return He.push(Ke),wt("AND",`${l(String(U))} ${String(G)} ${t(Dt)}`),this}if(Array.isArray(U)){let[je,Dt,Ot]=U,qt=String(je);Xt(qt,"where(column)");let Kt=vn(Dt,"where(operator)");if(Kt==="in"||Kt==="not in"){let Gt=Array.isArray(Ot)?Ot:[Ot],Lt=s(Gt.length,He.length+1),Ut=o(l(qt),Gt,Kt==="not in",Lt);He.push(...Gt),wt("AND",Ut)}else{let Gt=He.length+1;He.push(Ot),wt("AND",`${l(qt)} ${Kt} ${t(Gt)}`)}return this}if(U&&typeof U==="object"&&!zn(U)){let je=U,Dt=Object.keys(je),Ot=[];for(let qt of Dt){Xt(qt,"where(column)");let Kt=je[qt];if(Array.isArray(Kt)){let Gt=s(Kt.length,He.length+1);Ot.push(o(l(qt),Kt,!1,Gt)),He.push(...Kt)}else{let Gt=He.length+1;Ot.push(`${l(qt)} = ${t(Gt)}`),He.push(Kt)}}if(Ot.length>0)wt("AND",Ot.length>1?`(${Ot.join(" AND ")})`:Ot[0]);return this}if(zn(U))return wt("AND",U.raw),this;if(typeof U==="function")return Yt("AND",U),this;if(U===void 0||U===null)throw TypeError("where() was called with no condition.");if(typeof U==="string")throw TypeError(`where(${JSON.stringify(U)}) is missing an operator and a value. Pass where(column, operator, value), or whereRaw() for a raw fragment.`);throw TypeError(`where() does not understand a condition of type ${typeof U}.`)},whereNull(U){return Xt(String(U),"whereNull(column)"),wt("AND",`${String(U)} IS NULL`),this},whereNotNull(U){return Xt(String(U),"whereNotNull(column)"),wt("AND",`${String(U)} IS NOT NULL`),this},orWhereNull(U){return Xt(String(U),"orWhereNull(column)"),wt("OR",`${String(U)} IS NULL`),this},orWhereNotNull(U){return Xt(String(U),"orWhereNotNull(column)"),wt("OR",`${String(U)} IS NOT NULL`),this},whereBetween(U,G,Ke){Xt(String(U),"whereBetween(column)");let je=He.length+1;return He.push(G,Ke),wt("AND",`${String(U)} BETWEEN ${t(je)} AND ${t(je+1)}`),this},orWhereBetween(U,G,Ke){Xt(String(U),"orWhereBetween(column)");let je=He.length+1;return He.push(G,Ke),wt("OR",`${String(U)} BETWEEN ${t(je)} AND ${t(je+1)}`),this},whereExists(U){return wt("AND",`EXISTS (${U.toSQL()})`),this},orWhereExists(U){return wt("OR",`EXISTS (${U.toSQL()})`),this},whereGroup(U){return Yt("AND",U),this},orWhereGroup(U){return Yt("OR",U),this},__whereState(){return{body:x(yt),params:[...He]}},whereJsonContains(U,G){Xt(String(U),"whereJsonContains(column)");let Ke=e.dialect,je=He.length+1;if(Ke==="postgres"){let Ot=typeof G==="number"||typeof G==="boolean"?`to_jsonb(${t(je)})`:t(je);if(e.sql?.jsonContainsMode==="function")wt("AND",`jsonb_contains(${U}, ${Ot})`);else wt("AND",`${U} @> ${Ot}`);He.push(G)}else if(r(Ke))wt("AND",`JSON_CONTAINS(${U}, ${t(je)})`),He.push(JSON.stringify(G));else if(Array.isArray(G)){let Dt=G.map((Ot,qt)=>`EXISTS (SELECT 1 FROM json_each(${U}) WHERE json_each.value = ${t(je+qt)})`);wt("AND",`(${Dt.join(" AND ")})`);for(let Ot of G)He.push(Ot)}else if(G!==null&&typeof G==="object")throw Error("[query-builder] whereJsonContains: object containment is not supported on SQLite \u2014 pass a scalar or array, or use whereJsonPath.");else wt("AND",`EXISTS (SELECT 1 FROM json_each(${U}) WHERE json_each.value = ${t(je)})`),He.push(G);return this},whereJsonPath(U,G,Ke){if(vn(G,"whereJsonPath(op)"),typeof U!=="string"||U.length===0||U.length>256)throw TypeError(`[query-builder] whereJsonPath(path): expected non-empty string up to 256 chars, got ${typeof U==="string"?`'${U.slice(0,32)}...'`:typeof U}`);if(!/^[A-Za-z0-9_.[\]$'\->* ,]+$/.test(U))throw TypeError(`[query-builder] whereJsonPath(path): refusing to use '${U}' \u2014 contains characters outside the allowed JSON-path set`);let je=e.dialect,Dt=He.length+1;if(je==="postgres")wt("AND",`${U} ${G} ${t(Dt)}`);else if(r(je))wt("AND",`JSON_EXTRACT(${U}) ${G} ${t(Dt)}`);else wt("AND",`json_extract(${U}) ${G} ${t(Dt)}`);return He.push(Ke),this},whereLike(U,G,Ke=!1){let je=t(He.length+1);return St("WHERE",`${Ke?String(U):`LOWER(${String(U)})`} LIKE ${Ke?je:`LOWER(${je})`}`),He.push(G),$t=null,this},whereILike(U,G){let Ke=t(He.length+1);if(e.dialect==="postgres")St("WHERE",`${String(U)} ILIKE ${Ke}`);else St("WHERE",`LOWER(${String(U)}) LIKE LOWER(${Ke})`);return He.push(G),$t=null,this},orWhereLike(U,G,Ke=!1){let je=t(He.length+1);return St("OR",`${Ke?String(U):`LOWER(${String(U)})`} LIKE ${Ke?je:`LOWER(${je})`}`),He.push(G),$t=null,this},orWhereILike(U,G){let Ke=t(He.length+1);if(e.dialect==="postgres")St("OR",`${String(U)} ILIKE ${Ke}`);else St("OR",`LOWER(${String(U)}) LIKE LOWER(${Ke})`);return He.push(G),$t=null,this},whereNotLike(U,G,Ke=!1){let je=t(He.length+1);return St("WHERE",`${Ke?String(U):`LOWER(${String(U)})`} NOT LIKE ${Ke?je:`LOWER(${je})`}`),He.push(G),$t=null,this},whereNotILike(U,G){let Ke=t(He.length+1);if(e.dialect==="postgres")St("WHERE",`${String(U)} NOT ILIKE ${Ke}`);else St("WHERE",`LOWER(${String(U)}) NOT LIKE LOWER(${Ke})`);return He.push(G),$t=null,this},orWhereNotLike(U,G,Ke=!1){let je=t(He.length+1);return St("OR",`${Ke?String(U):`LOWER(${String(U)})`} NOT LIKE ${Ke?je:`LOWER(${je})`}`),He.push(G),$t=null,this},orWhereNotILike(U,G){let Ke=t(He.length+1);if(e.dialect==="postgres")St("OR",`${String(U)} NOT ILIKE ${Ke}`);else St("OR",`LOWER(${String(U)}) NOT LIKE LOWER(${Ke})`);return He.push(G),$t=null,this},whereAny(U,G,Ke){if(U.length===0)return wt("AND",`(${Tt})`),this;let je=He.length+1,Dt=U.map((Ot,qt)=>`${Ot} ${G} ${t(je+qt)}`);for(let Ot=0;Ot<U.length;Ot++)He.push(Ke);return wt("AND",`(${Dt.join(" OR ")})`),this},whereAll(U,G,Ke){if(U.length===0)return this;let je=He.length+1,Dt=U.map((Ot,qt)=>`${Ot} ${G} ${t(je+qt)}`);for(let Ot=0;Ot<U.length;Ot++)He.push(Ke);return wt("AND",`(${Dt.join(" AND ")})`),this},whereNone(U,G,Ke){if(U.length===0)return this;let je=He.length+1,Dt=U.map((Ot,qt)=>`${Ot} ${G} ${t(je+qt)}`);for(let Ot=0;Ot<U.length;Ot++)He.push(Ke);return wt("AND",`NOT (${Dt.join(" OR ")})`),this},whereNotBetween(U,G,Ke){Xt(String(U),"whereNotBetween(column)");let je=He.length+1;return He.push(G,Ke),wt("AND",`${U} NOT BETWEEN ${t(je)} AND ${t(je+1)}`),this},whereDate(U,G,Ke){Xt(U,"whereDate(column)");let je=Ke instanceof Date?Ke.toISOString():typeof Ke==="string"?Ke:(()=>{throw TypeError(`[query-builder] whereDate(date): expected string or Date, got ${typeof Ke}`)})(),Dt=He.length+1;return He.push(je),wt("AND",`${U} ${G} ${t(Dt)}`),this},whereRaw(U){return wt("AND",or(U,"whereRaw(fragment)")),this},orWhereRaw(U){return wt("OR",or(U,"orWhereRaw(fragment)")),this},whereColumn(U,G,Ke){return Xt(U,"whereColumn(left)"),Xt(Ke,"whereColumn(right)"),wt("AND",`${U} ${G} ${Ke}`),this},orWhereColumn(U,G,Ke){return Xt(U,"orWhereColumn(left)"),Xt(Ke,"orWhereColumn(right)"),wt("OR",`${U} ${G} ${Ke}`),this},whereIn(U,G){if(Xt(String(U),"whereIn(column)"),Array.isArray(G)){let Ke=s(G.length,He.length+1),je=o(U,G,!1,Ke);He.push(...G),wt("AND",je)}else wt("AND",`${U} IN (${String(G.toSQL())})`);return this},orWhereIn(U,G){if(Xt(String(U),"orWhereIn(column)"),Array.isArray(G)){let Ke=s(G.length,He.length+1),je=o(U,G,!1,Ke);He.push(...G),wt("OR",je)}else wt("OR",`${U} IN (${String(G.toSQL())})`);return this},whereNotIn(U,G){if(Xt(String(U),"whereNotIn(column)"),Array.isArray(G)){let Ke=s(G.length,He.length+1),je=o(U,G,!0,Ke);He.push(...G),wt("AND",je)}else wt("AND",`${U} NOT IN (${String(G.toSQL())})`);return this},orWhereNotIn(U,G){if(Xt(String(U),"orWhereNotIn(column)"),Array.isArray(G)){let Ke=s(G.length,He.length+1),je=o(U,G,!0,Ke);He.push(...G),wt("OR",je)}else wt("OR",`${U} NOT IN (${String(G.toSQL())})`);return this},whereNested(U){let G=U.toSQL?String(U.toSQL()):String(U);return wt("AND",`(${G})`),this},orWhereNested(U){let G=U.toSQL?String(U.toSQL()):String(U);return wt("OR",`(${G})`),this},andWhere(U,G,Ke){return Et(this,"AND","andWhere",U,G,Ke)},orWhere(U,G,Ke){return Et(this,"OR","orWhere",U,G,Ke)},orderBy(U,G="asc"){let Ke=G==="asc"?"ASC":"DESC",je=l(String(U));return ve=Bn.ORDER_BY.test(ve)?`${ve}, ${je} ${Ke}`:`${ve} ORDER BY ${je} ${Ke}`,$t=null,this},orderByDesc(U){return ve=Bn.ORDER_BY.test(ve)?`${ve}, ${U} DESC`:`${ve} ORDER BY ${U} DESC`,$t=null,this},inRandomOrder(){let U=e.sql.randomFunction==="RAND()"?"RAND()":"RANDOM()";return ve=Bn.ORDER_BY.test(ve)?`${ve}, ${U}`:`${ve} ORDER BY ${U}`,$t=null,this},reorder(U,G="asc"){return ve=ve.replace(/ORDER BY[\s\S]*$/i,""),ve+=` ORDER BY ${U} ${G==="asc"?"ASC":"DESC"}`,$t=null,this},latest(U){let G=U??e.timestamps.defaultOrderColumn;return ve=Bn.ORDER_BY.test(ve)?`${ve}, ${G} DESC`:`${ve} ORDER BY ${G} DESC`,$t=null,this},oldest(U){let G=U??e.timestamps.defaultOrderColumn;return ve=Bn.ORDER_BY.test(ve)?`${ve}, ${G} ASC`:`${ve} ORDER BY ${G} ASC`,$t=null,this},limit(U){if(!Number.isFinite(U)||U<0||!Number.isInteger(U))throw TypeError(`[bun-query-builder] limit(n): expected non-negative integer, got ${U}`);return ve=Bn.LIMIT.test(ve)?ve.replace(Bn.LIMIT,` LIMIT ${U}`):`${ve} LIMIT ${U}`,$t=null,this},offset(U){if(!Number.isFinite(U)||U<0||!Number.isInteger(U))throw TypeError(`[bun-query-builder] offset(n): expected non-negative integer, got ${U}`);return ve=Bn.OFFSET.test(ve)?ve.replace(Bn.OFFSET,` OFFSET ${U}`):`${ve} OFFSET ${U}`,$t=null,this},join(U,G,Ke,je){return Xt(U,"join(table)"),Wn(G,"join(onLeft)"),Wn(je,"join(onRight)"),vn(Ke,"join(operator)"),Qt(`JOIN ${U} ON ${G} ${Ke} ${je}`),yn.add(U),this},joinSub(U,G,Ke,je,Dt){return Xt(G,"joinSub(alias)"),Wn(Ke,"joinSub(onLeft)"),Wn(Dt,"joinSub(onRight)"),vn(je,"joinSub(operator)"),Qt(`JOIN (${String(U.toSQL())}) AS ${G} ON ${Ke} ${je} ${Dt}`),yn.add(G),this},innerJoin(U,G,Ke,je){return Xt(U,"innerJoin(table)"),Wn(G,"innerJoin(onLeft)"),Wn(je,"innerJoin(onRight)"),vn(Ke,"innerJoin(operator)"),Qt(`INNER JOIN ${U} ON ${G} ${Ke} ${je}`),yn.add(U),this},leftJoin(U,G,Ke,je){return Xt(U,"leftJoin(table)"),Wn(G,"leftJoin(onLeft)"),Wn(je,"leftJoin(onRight)"),vn(Ke,"leftJoin(operator)"),Qt(`LEFT JOIN ${U} ON ${G} ${Ke} ${je}`),yn.add(U),this},leftJoinSub(U,G,Ke,je,Dt){return Xt(G,"leftJoinSub(alias)"),Wn(Ke,"leftJoinSub(onLeft)"),Wn(Dt,"leftJoinSub(onRight)"),vn(je,"leftJoinSub(operator)"),Qt(`LEFT JOIN (${String(U.toSQL())}) AS ${G} ON ${Ke} ${je} ${Dt}`),yn.add(G),this},rightJoin(U,G,Ke,je){return Xt(U,"rightJoin(table)"),Wn(G,"rightJoin(onLeft)"),Wn(je,"rightJoin(onRight)"),vn(Ke,"rightJoin(operator)"),Qt(`RIGHT JOIN ${U} ON ${G} ${Ke} ${je}`),yn.add(U),this},crossJoin(U){return Xt(U,"crossJoin(table)"),Qt(`CROSS JOIN ${U}`),yn.add(U),this},crossJoinSub(U,G){return Xt(G,"crossJoinSub(alias)"),Qt(`CROSS JOIN (${String(U.toSQL())}) AS ${G}`),yn.add(G),this},selectAllRelations(){if(!E)return this;let U=String(Le),G=Object.keys(E[U]?.columns??{}),Ke=[];if(G.length>0)Ke.push(ke`${ke(U)}.*`);for(let je of yn){let Dt=Object.keys(E[je]?.columns??{});for(let Ot of Dt){let qt=e.aliasing.relationColumnAliasFormat==="camelCase"?`${je}_${Ot}`.replace(/_([a-z])/g,(Kt,Gt)=>Gt.toUpperCase()):e.aliasing.relationColumnAliasFormat==="table.dot.column"?`${je}.${Ot}`:`${je}_${Ot}`;Ke.push(ke`${ke(`${je}.${Ot}`)} AS ${ke(qt)}`)}}if(Ke.length>0){let je=G.length>0?`${U}.*`:"",Dt=[];for(let Kt of yn){let Gt=Object.keys(E[Kt]?.columns??{});for(let Lt of Gt){let Ut=e.aliasing.relationColumnAliasFormat==="camelCase"?`${Kt}_${Lt}`.replace(/_([a-z])/g,(Tn,En)=>En.toUpperCase()):e.aliasing.relationColumnAliasFormat==="table.dot.column"?`${Kt}.${Lt}`:`${Kt}_${Lt}`;Dt.push(`${Kt}.${Lt} AS ${Ut}`)}}let Ot=[je,...Dt].filter(Boolean).join(", "),qt=ve.indexOf(" FROM ");if(qt!==-1)ve=`SELECT ${Ot}${ve.substring(qt)}`;else ve=`SELECT ${Ot} FROM ${U}`;$t=null}return this},groupBy(...U){if(U.length)ve=Bn.GROUP_BY.test(ve)?`${ve}, ${U.map((G)=>l(String(G))).join(", ")}`:`${ve} GROUP BY ${U.map((G)=>l(String(G))).join(", ")}`,$t=null;return this},groupByRaw(U){let G=or(U,"groupByRaw(fragment)");return ve=Bn.GROUP_BY.test(ve)?`${ve}, ${G}`:`${ve} GROUP BY ${G}`,$t=null,this},having(U){let G=Wt?"AND":"HAVING";if(Array.isArray(U)){let Ke=He.length+1;ve=`${ve} ${G} ${U[0]} ${U[1]} ${t(Ke)}`,He.push(U[2]),Wt=!0,$t=null}else if(U&&typeof U==="object"&&!("raw"in U)){let Ke=Object.keys(U),je=Ke.length;if(je){let Dt=He.length,Ot=Array.from({length:je});for(let qt=0;qt<je;qt++){let Kt=Ke[qt];Ot[qt]=`${Kt} = ${t(Dt+qt+1)}`,He.push(U[Kt])}ve=`${ve} ${G} ${Ot.join(" AND ")}`,Wt=!0,$t=null}}else if(U&&typeof U.raw<"u")ve+=` ${G} ${U.raw}`,Wt=!0,$t=null;return this},havingRaw(U){let G=or(U,"havingRaw(fragment)");return ve+=` ${Wt?"AND":"HAVING"} ${G}`,Wt=!0,$t=null,this},orderByRaw(U){let G=or(U,"orderByRaw(fragment)");return ve=Bn.ORDER_BY.test(ve)?`${ve}, ${G}`:`${ve} ORDER BY ${G}`,$t=null,this},$call(U){return U(this),this},union(U){return Jt("UNION",U),this},unionAll(U){return Jt("UNION ALL",U),this},intersect(U){return Jt("INTERSECT",U),this},intersectAll(U){return Jt("INTERSECT ALL",U),this},except(U){return Jt("EXCEPT",U),this},exceptAll(U){return Jt("EXCEPT ALL",U),this},forPage(U,G){let Ke=Math.max(1,Math.floor(U)),je=Math.max(1,Math.floor(G));return ve+=` LIMIT ${je} OFFSET ${(Ke-1)*je}`,$t=null,this},toSQL(){let U=Sr(Ft());return{sql:U,toString:()=>U,execute:()=>ht().execute(),values:()=>ht().values(),raw:()=>ht().raw()}},async value(U){let G=ke`${ht()} LIMIT 1`,Ke=await pt(G,"select",{signal:Vt,timeoutMs:_t}),[je]=Ke;return je?.[U]},async pluck(U,G){let Ke=await pt(ht(),"select",{signal:Vt,timeoutMs:_t});if(G){let je={};for(let Dt of Ke){let Ot=String(Dt?.[G]);if(Object.prototype.hasOwnProperty.call(je,Ot))throw Error(`[query-builder] pluck(${U}, ${G}): duplicate key '${Ot}' \u2014 multiple rows share this value, so the resulting map would silently drop data. Use a unique key column or pluck without a key to get an array.`);je[Ot]=Dt?.[U]}return je}return Ke.map((je)=>je?.[U])},async exists(){let U=ke`SELECT EXISTS (${ht()}) as e`,G=await pt(U,"select",{signal:Vt,timeoutMs:_t}),[Ke]=G;return Boolean(Ke?.e)},async doesntExist(){return!await this.exists()},async paginate(U,G=1,Ke={}){if(typeof U==="object"&&U!==null){let Tn=U;G=Tn.page??1,Ke=Tn.tx?{tx:Tn.tx}:{},U=Tn.perPage??10}if(!Number.isFinite(U)||U<=0||!Number.isInteger(U))throw TypeError(`[query-builder] paginate(perPage): expected positive integer, got ${U}`);if(!Number.isFinite(G)||G<1||!Number.isInteger(G))throw TypeError(`[query-builder] paginate(page): expected integer >= 1, got ${G}`);if(Ke.tx){let Tn=Sr(Ft()),En=[...He],In=await Ke.tx.unsafe(`SELECT COUNT(*) as c FROM (${Tn}) as sub`,En),bn=Number(In?.[0]?.c??0),Pn=Math.max(1,Math.ceil(bn/U)),qn=Math.max(1,Math.min(G,Pn)),Fn=(qn-1)*U;return{data:await Ke.tx.unsafe(`${Tn} LIMIT ${U} OFFSET ${Fn}`,En),meta:{perPage:U,page:qn,total:bn,lastPage:Pn}}}let je=ke`SELECT COUNT(*) as c FROM (${ht()}) as sub`,Dt=await pt(je,"select",{signal:Vt,timeoutMs:_t}),[Ot]=Dt,qt=Number(Ot?.c??0),Kt=Math.max(1,Math.ceil(qt/U)),Gt=Math.max(1,Math.min(G,Kt)),Lt=(Gt-1)*U;return{data:await pt(ke`${ht()} LIMIT ${U} OFFSET ${Lt}`,"select",{signal:Vt,timeoutMs:_t}),meta:{perPage:U,page:Gt,total:qt,lastPage:Kt}}},async simplePaginate(U,G=1){let Ke=Math.max(1,G),je=(Ke-1)*U,Dt=await pt(ke`${ht()} LIMIT ${U+1} OFFSET ${je}`,"select",{signal:Vt,timeoutMs:_t}),Ot=Dt.length>U;return{data:Ot?Dt.slice(0,U):Dt,meta:{perPage:U,page:Ke,hasMore:Ot}}},async cursorPaginate(U,G,Ke="id",je="asc"){if(!Number.isInteger(U)||U<=0)throw TypeError(`[query-builder] cursorPaginate(perPage): expected positive integer, got ${U}`);let Dt=(Array.isArray(Ke)?Ke:[Ke]).map(String);for(let Ln of Dt)Xt(Ln,"cursorPaginate(column)");let Ot=je==="asc"?">":"<",qt=je==="asc"?"ASC":"DESC",Kt=[...He],Gt="";if(G!==void 0&&G!==null)if(Array.isArray(Ke)){let Ln=G.map(($n)=>(Kt.push($n),t(Kt.length)));Gt=`(${Dt.join(", ")}) ${Ot} (${Ln.join(", ")})`}else Kt.push(G),Gt=`${Dt[0]} ${Ot} ${t(Kt.length)}`;let Lt=Sr(Gt?Ft({conn:"AND",sql:Gt}):Ft()),Ut=Dt.map((Ln)=>`${Ln} ${qt}`).join(", ");if(ai(Lt))throw TypeError("[query-builder] cursorPaginate() cannot be combined with orderBy() \u2014 it orders by "+`${Ut} itself, and a cursor is only meaningful in that order. Remove the orderBy(), or pass the column and direction to cursorPaginate().`);let Tn=Kt.length>0?h.unsafe(`${Lt} ORDER BY ${Ut} LIMIT ${U+1}`,Kt):h.unsafe(`${Lt} ORDER BY ${Ut} LIMIT ${U+1}`),En=await pt(Tn,"select",{signal:Vt,timeoutMs:_t}),In=En.length>U,bn=En.slice(0,U),Pn=bn[bn.length-1],qn=In&&Pn?Array.isArray(Ke)?Ke.map((Ln)=>Pn[Ln]):Pn[Ke]:null,Fn=bn.length?Array.isArray(Ke)?Ke.map((Ln)=>bn[0]?.[Ln]):bn[0]?.[Ke]:null;return{data:bn,meta:{perPage:U,nextCursor:qn??null,prevCursor:Fn}}},async chunk(U,G){let Ke=1;while(!0){let{data:je,meta:Dt}=await this.paginate(U,Ke);if(je.length===0)break;if(await G(je),Ke>=Dt.lastPage)break;Ke+=1}},async chunkById(U,G="id",Ke){let je;while(!0){let{data:Dt,meta:Ot}=await this.cursorPaginate(U,je,G,"asc");if(Dt.length===0)break;if(Ke)await Ke(Dt);if(je=Ot.nextCursor,!je)break}},async eachById(U,G="id",Ke){await this.chunkById(U,G,async(je)=>{for(let Dt of je)await Ke?.(Dt)})},withTimeout(U){return _t=Math.max(1,Math.floor(U)),this},abort(U){return Vt=U,this},withTrashed(){return wn=!0,Dn=!1,this},onlyTrashed(){wn=!0,Dn=!0;let U=e.softDeletes?.column||"deleted_at",G=(Dt,Ot)=>{let qt=Dt.toUpperCase(),Kt=0;for(let Gt=0;Gt<Dt.length;Gt++){let Lt=Dt[Gt];if(Lt==="(")Kt++;else if(Lt===")")Kt--;else if(Kt===0&&qt.substring(Gt,Gt+5)==="WHERE"&&(Gt===0||/\s/.test(Dt[Gt-1]??""))&&/\s/.test(Dt[Gt+5]??""))return`${Dt.substring(0,Gt)}WHERE ${Ot} AND ${Dt.substring(Gt+6)}`}return`${Dt} WHERE ${Ot}`},Ke=`${Le}.${U} IS NOT NULL`;ve=G(ve,Ke);let je=String(ht());return $t=ke([G(je,Ke)]),this},scope(U,G){let Ke=String(Le),Dt=D?.scopes?.[Ke]?.[U];if(Dt)return Dt(this,G);return this},when(U,G,Ke){if(U)return G(this);if(Ke)return Ke(this);return this},tap(U){return U(this),this},dump(){return console.log(String(ht())),this},dd(){throw console.log(String(ht())),Error("Dump and Die")},cache(U=60000){return ur=U,Nn=!0,this},async explain(){let U=ke`EXPLAIN ${ht()}`;return await pt(U,"select",{signal:Vt,timeoutMs:_t})},simple(){return ht().simple()},toText(){return Ft()},async get(){let U=xe(),G=U&&(U.onQueryStart||U.onQueryEnd||U.onQueryError||U.startSpan||br(U));if(!e.softDeletes?.enabled&&!Nn&&!_t&&!Vt&&!G){let qt=h._prepareStatement;if(qt){let Kt=qt(Ft());return Zn(He.length>0?Kt.all(...He):Kt.all())}}let Ke=Ft();if($t=He.length>0?h.unsafe(Ke,He):h.unsafe(Ke),!e.softDeletes?.enabled&&!Nn&&!_t&&!Vt&&!G){let qt=ht()._stmt,Kt=ht()._params;if(qt)return Zn(Kt&&Kt.length>0?qt.all(...Kt):qt.all());return Zn(await ht().execute())}if(!e.softDeletes?.enabled&&!Nn&&!_t&&!Vt)return Zn(await pt(ht(),"select"));let je=ht();if(e.softDeletes?.enabled&&e.softDeletes.defaultFilter&&!wn){let qt=e.softDeletes.column,Kt=String(Le);if((E?Boolean(E[Kt]?.columns?.[qt]):!0)&&!Bn.DELETED_AT.test(Ft()))St("WHERE",`${String(qt)} IS ${Dn?"NOT ":""}NULL`),je=ht()}let Dt=Nn?`${String(je)}\x00${JSON.stringify(He)}`:"";if(Nn){let qt=Mr.get(Dt);if(qt)return qt}let Ot=await pt(je,"select",{signal:Vt,timeoutMs:_t});if(Nn)Mr.set(Dt,Ot,ur);return Zn(Ot)},async executeTakeFirst(){let U=await pt(ht(),"select",{signal:Vt,timeoutMs:_t});return ar(Array.isArray(U)?U[0]:U)},async executeTakeFirstOrThrow(){let U=await this.executeTakeFirst();if(!U)throw Error("Record not found");return U},async first(){let U=xe(),G=U&&(U.onQueryStart||U.onQueryEnd||U.onQueryError||U.startSpan||br(U));if(!e.softDeletes?.enabled&&!Nn&&!_t&&!Vt&&!G){let Dt=h._prepareStatement;if(Dt){let Ot=Ft(),qt=Ot.includes(" LIMIT ")?Ot:`${Ot} LIMIT 1`,Kt=Dt(qt),Gt=He.length>0?Kt.all(...He):Kt.all();return ar(Gt[0])}}let Ke=await pt(ke`${ht()} LIMIT 1`,"select",{signal:Vt,timeoutMs:_t}),[je]=Ke;return ar(je)},async firstOrFail(){let U=await this.first();if(!U)throw Error("Record not found");return U},async find(U){let G=D?.primaryKeys[String(Le)]??"id",Ke=await pt(ke`${ht()} WHERE ${ke(G)} = ${U} LIMIT 1`,"select",{signal:Vt,timeoutMs:_t}),[je]=Ke;return je},async findOrFail(U){let G=await this.find(U);if(!G)throw Error("Record not found");return G},async findMany(U){let G=D?.primaryKeys[String(Le)]??"id";return await pt(ke`${ht()} WHERE ${ke(String(G))} IN ${ke(U)}`,"select",{signal:Vt,timeoutMs:_t})},async*lazy(){let U,G=D?.primaryKeys[String(Le)]??"id";while(!0){let je=await(U==null?ke`${ht()} ORDER BY ${ke(String(G))} ASC LIMIT 100`:ke`${ht()} WHERE ${ke(String(G))} > ${U} ORDER BY ${ke(String(G))} ASC LIMIT 100`).execute();if(je.length===0)break;for(let Dt of je)yield Dt;if(U=je[je.length-1]?.[G],U==null)break}},async*lazyById(){let U=D?.primaryKeys[String(Le)]??"id",G;while(!0){let je=await(G==null?ke`${ht()} ORDER BY ${ke(String(U))} ASC LIMIT 100`:ke`${ht()} WHERE ${ke(String(U))} > ${G} ORDER BY ${ke(String(U))} ASC LIMIT 100`).execute();if(je.length===0)break;for(let Dt of je)yield Dt;if(G=je[je.length-1]?.[U],G==null)break}},pipe(U){return U(this)},async count(){let U=Ft(),G=U.indexOf(" FROM "),Ke=/ GROUP BY /i.test(U),je;if(Ke)je=`SELECT COUNT(*) as c FROM (${U}) AS _bqb_count_sub`;else if(G!==-1)je=`SELECT COUNT(*) as c${U.substring(G)}`;else je=`SELECT COUNT(*) as c FROM ${Le}`;let Dt=xe(),Ot=Dt&&(Dt.onQueryStart||Dt.onQueryEnd||Dt.onQueryError||Dt.startSpan||br(Dt));if(!e.softDeletes?.enabled&&!Nn&&!_t&&!Vt&&!Ot){let Lt=h._prepareStatement;if(Lt){let Ut=Lt(je),Tn=He.length>0?Ut.all(...He):Ut.all();return Number(Tn[0]?.c??0)}}let qt=He.length>0?h.unsafe(je,He):h.unsafe(je),Kt=await pt(qt,"select",{signal:Vt,timeoutMs:_t}),[Gt]=Kt;return Number(Gt?.c??0)},async avg(U){let G=Ft(),Ke=G.indexOf(" FROM "),je=Ke!==-1?`SELECT AVG(${U}) as a${G.substring(Ke)}`:`SELECT AVG(${U}) as a FROM ${Le}`,Dt=xe(),Ot=Dt&&(Dt.onQueryStart||Dt.onQueryEnd||Dt.onQueryError||Dt.startSpan||br(Dt));if(!e.softDeletes?.enabled&&!Nn&&!_t&&!Vt&&!Ot){let Lt=h._prepareStatement;if(Lt){let Ut=Lt(je),Tn=He.length>0?Ut.all(...He):Ut.all();return Number(Tn[0]?.a??0)}}let qt=He.length>0?h.unsafe(je,He):h.unsafe(je),Kt=await pt(qt,"select",{signal:Vt,timeoutMs:_t}),[Gt]=Kt;return Number(Gt?.a??0)},async sum(U){let G=Ft(),Ke=G.indexOf(" FROM "),je=Ke!==-1?`SELECT SUM(${U}) as s${G.substring(Ke)}`:`SELECT SUM(${U}) as s FROM ${Le}`,Dt=He.length>0?h.unsafe(je,He):h.unsafe(je),Ot=await pt(Dt,"select",{signal:Vt,timeoutMs:_t}),[qt]=Ot;return Number(qt?.s??0)},async max(U){let G=Ft(),Ke=G.indexOf(" FROM "),je=Ke!==-1?`SELECT MAX(${U}) as m${G.substring(Ke)}`:`SELECT MAX(${U}) as m FROM ${Le}`,Dt=He.length>0?h.unsafe(je,He):h.unsafe(je),Ot=await pt(Dt,"select",{signal:Vt,timeoutMs:_t}),[qt]=Ot;return qt?.m},async min(U){let G=Ft(),Ke=G.indexOf(" FROM "),je=Ke!==-1?`SELECT MIN(${U}) as m${G.substring(Ke)}`:`SELECT MIN(${U}) as m FROM ${Le}`,Dt=He.length>0?h.unsafe(je,He):h.unsafe(je),Ot=await pt(Dt,"select",{signal:Vt,timeoutMs:_t}),[qt]=Ot;return qt?.m},lockForUpdate(){return ve+=" FOR UPDATE",$t=null,this},sharedLock(){let U=e.sql.sharedLockSyntax==="LOCK IN SHARE MODE"?"LOCK IN SHARE MODE":"FOR SHARE";return ve+=` ${U}`,$t=null,this},withCTE(U,G){return Xt(U,"withCTE(name)"),ve=`WITH ${U} AS (${String(G.toSQL())}) ${ve}`,$t=null,this},withRecursive(U,G){return Xt(U,"withRecursive(name)"),ve=`WITH RECURSIVE ${U} AS (${String(G.toSQL())}) ${ve}`,$t=null,this},execute(){return pt(ht(),"select",{signal:Vt,timeoutMs:_t})},values(){return ht().values()},toParams(){return[...He]},__rawState(){return{sql:Sr(Ft()),params:[...He]}},__hasPredicate(){return yt.length>0||It},raw(){return ht().raw()},get rows(){return},get row(){return},cancel(){try{ht().cancel()}catch{}}},{get(U,G,Ke){let je=Reflect.get(U,G,Ke);if(je!==void 0)return je;if(typeof G==="string"&&(G.startsWith("where")||G.startsWith("orWhere")||G.startsWith("andWhere"))){let Dt=G.startsWith("orWhere"),Ot=G.startsWith("andWhere"),qt=`${String(Le)}|${G}`,Kt=Fe.get(qt);if(Kt===void 0){let Lt=G.replace(/^(?:or|and)?where/i,"");if(!Lt)Fe.set(qt,""),Kt="";else{let Ut=Lt.charAt(0).toLowerCase()+Lt.slice(1),Tn=Lt.replace(/([A-Z])/g,"_$1").toLowerCase().replace(/^_/,""),En=E?Object.keys(E[String(Le)]?.columns??{}):[];Kt=[Tn,Ut,Ut.toLowerCase()].find((In)=>En.includes(In))??Tn,Fe.set(qt,Kt)}}if(Kt==="")return()=>Ke;let Gt=Kt;return(Lt)=>{if(Array.isArray(Lt)){let Ut=s(Lt.length,He.length+1);St(Dt?"OR":Ot?"AND":"WHERE",`${Gt} IN (${Ut})`),He.push(...Lt)}else{let Ut=t(He.length+1);St(Dt?"OR":Ot?"AND":"WHERE",`${Gt} = ${Ut}`),He.push(Lt)}return Ke}}return Reflect.get(U,G,Ke)}})}return{configure(Le){return qe(Le),this},id(Le){if(!Bn.IDENTIFIER.test(Le))throw Error(`[query-builder] Invalid identifier: '${Le}'. Identifiers must start with a letter or underscore and contain only alphanumeric characters, underscores, and dots.`);return h(String(Le))},ids(...Le){for(let Ue of Le)if(!Bn.IDENTIFIER.test(Ue))throw Error(`[query-builder] Invalid identifier: '${Ue}'. Identifiers must start with a letter or underscore and contain only alphanumeric characters, underscores, and dots.`);return h(Le)},select(Le,...Ue){return Ht(Le,Ue)},selectFrom(Le){return Ht(Le)},selectFromSub(Le,Ue){function ke(ht){return()=>{throw Error(`[query-builder] selectFromSub(...).${ht}() is not supported. Apply ${ht}() to the underlying subquery BEFORE passing it to selectFromSub, or use the regular selectFrom(...) builder. This previously silently returned without `+"affecting the SQL, producing wrong results \u2014 see stacksjs/stacks#1862 #11.")}}Xt(String(Ue),"selectFromSub(alias)");let ve=typeof Le.__rawState==="function"?Le.__rawState():null,yt=Le.toSQL(),He=ve?.sql??(typeof yt==="string"?yt:yt?.sql??String(yt)),zt=ve?.params??(Array.isArray(yt?.values)?yt.values:[]),It=`SELECT * FROM (${He}) AS ${String(Ue)}`,Wt=(ht,wt,St,vt)=>{let Ft=[...ht],Yt=(Jt,Qt,yn)=>{Xt(Jt,"selectFromSub where(column)");let _t=vn(Qt,"selectFromSub where(operator)");if(_t==="in"||_t==="not in"){let wn=Array.isArray(yn)?yn:[yn],Dn=s(wn.length,Ft.length+1);return Ft.push(...wn),`${Jt} ${_t.toUpperCase()} (${Dn})`}let Vt=t(Ft.length+1);return Ft.push(yn),`${Jt} ${_t} ${Vt}`},Et;if(typeof wt==="string"&&St!==void 0)Et=Yt(wt,St,vt);else if(Array.isArray(wt)&&wt.length===3)Et=Yt(wt[0],wt[1],wt[2]);else if(wt&&typeof wt==="object"){let Jt=Object.entries(wt).map(([Qt,yn])=>Yt(Qt,"=",yn));Et=Jt.length>1?`(${Jt.join(" AND ")})`:Jt[0]}else return{clause:null,params:ht};return{clause:Et,params:Ft}};function $t(ht,wt,St,vt=""){let Ft=x(wt),Yt=Ft?`${ht} WHERE ${Ft}${vt}`:`${ht}${vt}`,Et=()=>St.length>0?h.unsafe(Yt,St):h.unsafe(Yt),Jt=(_t,Vt,wn,Dn)=>{let Nn=Wt(St,Vt,wn,Dn);return Nn.clause===null?$t(ht,wt,St,vt):$t(ht,[...wt,{conn:_t,sql:Nn.clause}],Nn.params,vt)},Qt=(_t,Vt)=>{let wn=[],Dn=[...St],Nn=(ur)=>(On,Hn,ar)=>{let Zn=Wt(Dn,On,Hn,ar);if(Zn.clause!==null)wn.push({conn:ur,sql:Zn.clause}),Dn=Zn.params;return Vn},Vn={where:Nn("AND"),andWhere:Nn("AND"),orWhere:Nn("OR")};Vt(Vn);let jn=x(wn);if(!jn)throw TypeError("[query-builder] selectFromSub.whereGroup(callback): the callback added no conditions. Add at least one where()/orWhere() to the builder it receives.");return $t(ht,[...wt,{conn:_t,sql:`(${jn})`}],Dn,vt)},yn={distinct(){return $t(ht.replace(/^SELECT\s+/i,"SELECT DISTINCT "),wt,St,vt)},distinctOn(..._t){let Vt=_t.map(String).join(", ");return $t(ht.replace(/^SELECT\s+/i,`SELECT DISTINCT ON (${Vt}) `),wt,St,vt)},selectRaw(_t){let Vt=or(_t,"selectFromSub.selectRaw(fragment)"),wn=ht.indexOf(" FROM "),Dn=wn!==-1?`${ht.slice(0,wn)}, ${Vt}${ht.slice(wn)}`:`${ht}, ${Vt}`;return $t(Dn,wt,St,vt)},$call(_t){return _t(this)??this},where(_t,Vt,wn){return Jt("AND",_t,Vt,wn)},andWhere(_t,Vt,wn){return Jt("AND",_t,Vt,wn)},orWhere(_t,Vt,wn){return Jt("OR",_t,Vt,wn)},whereGroup(_t){return Qt("AND",_t)},orWhereGroup(_t){return Qt("OR",_t)},orderBy(_t,Vt="asc"){Xt(String(_t),"selectFromSub.orderBy(column)");let wn=Vt==="asc"?"ASC":"DESC",Dn=Bn.ORDER_BY.test(vt)?`${vt}, ${_t} ${wn}`:`${vt} ORDER BY ${_t} ${wn}`;return $t(ht,wt,St,Dn)},limit(_t){if(!Number.isInteger(_t)||_t<0)throw TypeError(`[query-builder] selectFromSub.limit(n): expected non-negative integer, got ${_t}`);let Vt=Bn.LIMIT.test(vt)?vt.replace(Bn.LIMIT,` LIMIT ${_t}`):`${vt} LIMIT ${_t}`;return $t(ht,wt,St,Vt)},offset(_t){if(!Number.isInteger(_t)||_t<0)throw TypeError(`[query-builder] selectFromSub.offset(n): expected non-negative integer, got ${_t}`);let Vt=Bn.OFFSET.test(vt)?vt.replace(Bn.OFFSET,` OFFSET ${_t}`):`${vt} OFFSET ${_t}`;return $t(ht,wt,St,Vt)},toSQL(){return jt(Et(),Yt)},async execute(){return pt(Et(),"select")},async executeTakeFirst(){let _t=await pt(Et(),"select");return Array.isArray(_t)?_t[0]:_t},async executeTakeFirstOrThrow(){let _t=await pt(Et(),"select"),Vt=Array.isArray(_t)?_t[0]:_t;if(!Vt)throw Error("Record not found");return Vt},async get(){return pt(Et(),"select")},async first(){let _t=await pt(Et(),"select");return Array.isArray(_t)?_t[0]:_t},async firstOrFail(){let _t=await pt(Et(),"select"),Vt=Array.isArray(_t)?_t[0]:_t;if(!Vt)throw Error("No rows found");return Vt},async count(){let _t=St.length>0?h.unsafe(`SELECT COUNT(*) as c FROM (${Yt}) as sub`,St):h.unsafe(`SELECT COUNT(*) as c FROM (${Yt}) as sub`),Vt=await pt(_t,"select");return Number(Vt?.[0]?.c??0)},async exists(){let _t=St.length>0?h.unsafe(`SELECT EXISTS(${Yt}) as e`,St):h.unsafe(`SELECT EXISTS(${Yt}) as e`),Vt=await pt(_t,"select");return Boolean(Vt?.[0]?.e)},async doesntExist(){return!await yn.exists()},values(){return Et().values()},raw(){return Et().raw()},cancel(){try{Et().cancel()}catch{}},whereRaw:ke("whereRaw"),whereColumn:ke("whereColumn"),orWhereColumn:ke("orWhereColumn"),whereIn:ke("whereIn"),orWhereIn:ke("orWhereIn"),whereNotIn:ke("whereNotIn"),orWhereNotIn:ke("orWhereNotIn"),whereLike:ke("whereLike"),whereILike:ke("whereILike"),orWhereLike:ke("orWhereLike"),orWhereILike:ke("orWhereILike"),whereNotLike:ke("whereNotLike"),whereNotILike:ke("whereNotILike"),orWhereNotLike:ke("orWhereNotLike"),orWhereNotILike:ke("orWhereNotILike"),whereAny:ke("whereAny"),whereAll:ke("whereAll"),whereNone:ke("whereNone"),whereNested:ke("whereNested"),orWhereNested:ke("orWhereNested"),whereDate:ke("whereDate"),whereBetween:ke("whereBetween"),whereNotBetween:ke("whereNotBetween"),whereJsonContains:ke("whereJsonContains"),whereJsonPath:ke("whereJsonPath"),whereNull:ke("whereNull"),orWhereNull:ke("orWhereNull"),whereNotNull:ke("whereNotNull"),orWhereNotNull:ke("orWhereNotNull"),whereExists:ke("whereExists"),orWhereExists:ke("orWhereExists"),orWhereBetween:ke("orWhereBetween"),orWhereRaw:ke("orWhereRaw"),whereJsonDoesntContain:ke("whereJsonDoesntContain"),whereJsonContainsKey:ke("whereJsonContainsKey"),whereJsonDoesntContainKey:ke("whereJsonDoesntContainKey"),whereJsonLength:ke("whereJsonLength"),join:ke("join"),joinSub:ke("joinSub"),innerJoin:ke("innerJoin"),leftJoin:ke("leftJoin"),leftJoinSub:ke("leftJoinSub"),rightJoin:ke("rightJoin"),crossJoin:ke("crossJoin"),crossJoinSub:ke("crossJoinSub"),groupBy:ke("groupBy"),groupByRaw:ke("groupByRaw"),having:ke("having"),havingRaw:ke("havingRaw"),addSelect:ke("addSelect"),select:ke("select"),selectAll:ke("selectAll"),orderByDesc:ke("orderByDesc"),inRandomOrder:ke("inRandomOrder"),reorder:ke("reorder"),orderByRaw:ke("orderByRaw"),union:ke("union"),unionAll:ke("unionAll"),forPage:ke("forPage"),selectAllRelations:ke("selectAllRelations"),with:ke("with"),value:ke("value"),pluck:ke("pluck"),cursorPaginate:ke("cursorPaginate"),paginate:ke("paginate"),simplePaginate:ke("simplePaginate"),chunk:ke("chunk"),chunkById:ke("chunkById"),eachById:ke("eachById"),avg:ke("avg"),sum:ke("sum"),max:ke("max"),min:ke("min"),find:ke("find"),findOrFail:ke("findOrFail"),findMany:ke("findMany"),latest:ke("latest"),oldest:ke("oldest"),lazy:ke("lazy"),lazyById:ke("lazyById"),pipe:(_t)=>_t(yn),when:ke("when"),tap:()=>yn,dump:()=>yn,dd:()=>{throw Error("Dump and Die")},explain:()=>Promise.resolve([]),simple:()=>Et().simple(),toText:()=>Yt,toParams:()=>[...St],withTimeout:()=>yn,abort:()=>yn,lockForUpdate:()=>yn,sharedLock:()=>yn,withCTE:()=>yn,withRecursive:()=>yn,cache:()=>yn,clone:()=>yn,withTrashed:()=>yn,onlyTrashed:()=>yn,scope:()=>yn,get rows(){return[]},get row(){return}};return yn}return $t(It,[],zt)},insertInto(Le){let Ue,ke="",ve=[],yt=[],He=!1,zt=()=>Wt?[]:{changes:0,lastInsertRowid:0},It=()=>{let St=async()=>{return},vt=async()=>{throw Error("Insert with RETURNING returned no rows")};return{where:()=>It(),andWhere:()=>It(),orWhere:()=>It(),orderBy:()=>It(),limit:()=>It(),offset:()=>It(),toSQL:()=>jt(null,""),execute:async()=>[],get:async()=>[],first:St,executeTakeFirst:St,firstOrFail:vt,executeTakeFirstOrThrow:vt}},Wt=e.dialect==="postgres",$t=(St)=>{let Ft=St.flat(2).map(String).filter(Boolean),Yt=Ft.length>0&&!Ft.includes("*")?Ft.map((Qt)=>ht(Qt)).join(", "):"*",Et=async()=>{let Qt=await pt(h.unsafe(ke,ve),"insert"),yn=Number(Qt?.lastInsertRowid??0),_t=Math.max(1,Number(Qt?.affectedRows??1)),Vt=yt.filter((Nn)=>Nn!==void 0&&Nn!==null),wn=yn>0?h.unsafe(`SELECT ${Yt} FROM ${ht(String(Le))} WHERE ${ht("id")} >= ? AND ${ht("id")} < ? ORDER BY ${ht("id")} ASC`,[yn,yn+_t]):Vt.length>0?h.unsafe(`SELECT ${Yt} FROM ${ht(String(Le))} WHERE ${ht("id")} IN (${Vt.map(()=>"?").join(", ")}) ORDER BY ${ht("id")} ASC`,Vt):null;if(!wn)return[];let Dn=await wn.execute();return Array.isArray(Dn)?Dn:[]},Jt=async()=>(await Et())[0];return{where:()=>this,andWhere:()=>this,orWhere:()=>this,orderBy:()=>this,limit:()=>this,offset:()=>this,toSQL:()=>jt(h.unsafe(ke,ve),ke),execute:Et,get:Et,first:Jt,executeTakeFirst:Jt,async firstOrFail(){let Qt=await Jt();if(!Qt)throw Error("Insert with RETURNING returned no rows");return Qt},async executeTakeFirstOrThrow(){let Qt=await Jt();if(!Qt)throw Error("Insert with RETURNING returned no rows");return Qt}}},ht=Wt?(St)=>`"${String(St).replace(/"/g,'""')}"`:r(e.dialect)?(St)=>`\`${String(St).replace(/`/g,"``")}\``:(St)=>`"${String(St).replace(/"/g,'""')}"`,wt=Wt?(St)=>`$${St+1}`:(St)=>"?";return{values(St){let vt=V(String(Le),Array.isArray(St)?St:[St]),Ft=vt.length;if(yt=vt.map((_t)=>_t?.id),Ft===0)return He=!0,Ue=null,ke="",ve.length=0,this;He=!1;let Yt=vt[0],Et=Object.keys(Yt),Jt=Et.length,Qt=Ft*Jt;ve.length=Qt;let yn=Wt?Et.map((_t)=>ht(_t)).join(","):Et.join(",");if(Ft===1)if(!Wt){let _t=ht(Et[0]),Vt="?";ve[0]=Yt[Et[0]];for(let wn=1;wn<Jt;wn++)_t+=`,${ht(Et[wn])}`,Vt+=",?",ve[wn]=Yt[Et[wn]];ke=`INSERT INTO ${ht(Le)}(${_t})VALUES(${Vt})`}else{ke=`INSERT INTO ${ht(Le)}(${yn})VALUES(`;for(let _t=0;_t<Jt;_t++){if(_t>0)ke+=",";ke+=wt(_t),ve[_t]=Yt[Et[_t]]}ke+=")"}else{let _t=Et.map((wn)=>ht(wn)).join(",");ke=`INSERT INTO ${ht(Le)}(${_t})VALUES`;let Vt=0;for(let wn=0;wn<Ft;wn++){let Dn=vt[wn];if(wn===0)ke+="(";else ke+="),(";for(let Nn=0;Nn<Jt;Nn++){if(Nn>0)ke+=",";ke+=wt(Vt),ve[Vt++]=Dn[Et[Nn]]}}ke+=")"}if(!h._prepareStatement)Ue=h.unsafe(ke,ve);return this},returning(...St){if(He)return It();if(r(e.dialect))return $t(St);let vt=`${ke} RETURNING ${St.join(", ")}`,Ft=h.unsafe(vt,ve),Yt=async()=>{let Et=await pt(Ft,"insert");return Array.isArray(Et)?Et[0]:Et};return{where:()=>this,andWhere:()=>this,orWhere:()=>this,orderBy:()=>this,limit:()=>this,offset:()=>this,toSQL:()=>jt(Ft,vt),execute:()=>pt(Ft,"insert"),get:()=>pt(Ft,"insert"),first:Yt,executeTakeFirst:Yt,async firstOrFail(){let Et=await Yt();if(!Et)throw Error("Insert with RETURNING returned no rows");return Et},async executeTakeFirstOrThrow(){let Et=await Yt();if(!Et)throw Error("Insert with RETURNING returned no rows");return Et}}},toSQL(){if(He)return jt(null,"");if(!Ue)Ue=h.unsafe(ke,ve);return jt(Ue,ke)},execute(){if(He)return Promise.resolve(zt());let St=xe();if(!(St&&(St.onQueryStart||St.onQueryEnd||St.onQueryError||St.startSpan||St.beforeCreate||St.afterCreate||br(St)))){let Ft=h._prepareStatement;if(Ft){let Yt=Ft(ke);return ve.length>0?Yt.run(...ve):Yt.run()}}if(!Ue)Ue=h.unsafe(ke,ve);return pt(Ue,"insert")},async executeTakeFirst(){if(He)return zt();if(!Ue)Ue=h.unsafe(ke,ve);return await pt(Ue,"insert")},async executeTakeFirstOrThrow(){if(He)throw Error("Insert failed");if(!Ue)Ue=h.unsafe(ke,ve);let St=await pt(Ue,"insert");if(!St)throw Error("Insert failed");return St},returningAll(){if(He)return It();let St=`${ke} RETURNING *`,vt=h.unsafe(St,ve),Ft=async()=>{let Yt=await pt(vt,"insert");return Array.isArray(Yt)?Yt[0]:Yt};return{toSQL:()=>jt(vt,St),execute:()=>pt(vt,"insert"),get:()=>pt(vt,"insert"),first:Ft,executeTakeFirst:Ft,async firstOrFail(){let Yt=await Ft();if(!Yt)throw Error("Insert with RETURNING returned no rows");return Yt},async executeTakeFirstOrThrow(){let Yt=await Ft();if(!Yt)throw Error("Insert with RETURNING returned no rows");return Yt}}}}},updateTable(Le){let Ue,ke=[],ve=(It)=>{let Wt=String(It);if(r(e.dialect))return`\`${Wt.replace(/`/g,"``")}\``;return`"${Wt.replace(/"/g,'""')}"`},yt=`UPDATE ${ve(String(Le))}`,He=!1,zt=(It)=>{yt=`${yt} ${He?"AND":"WHERE"} ${It}`,He=!0};return{set(It){let Wt=V(String(Le),[It])[0],$t=Object.keys(Wt),ht=$t.length,wt=Array.from({length:ht});for(let St=0;St<ht;St++){let vt=$t[St],Ft=Wt[vt];if(zn(Ft))wt[St]=`${ve(vt)} = ${Ft.raw}`;else if(hr(Ft)){let Yt=Tr(Ft,ke.length+1);wt[St]=`${ve(vt)} = ${Yt.text}`,ke.push(...Yt.parameters)}else wt[St]=`${ve(vt)} = ${t(ke.length+1)}`,ke.push(Ft)}return yt=`${yt} SET ${wt.join(", ")}`,Ue=h.unsafe(yt,ke),this},where(It,Wt,$t){if(Wt!==void 0&&(typeof It==="string"||zn(It)||hr(It))){let ht=vn(Wt,"updateTable.where"),wt;if(typeof It==="string")wt=ve(It);else if(zn(It))wt=It.raw;else{let vt=Tr(It,ke.length+1);wt=vt.text,ke.push(...vt.parameters)}if(ht.toLowerCase()==="in"||ht.toLowerCase()==="not in"){let vt=Array.isArray($t)?$t:[$t],Ft=s(vt.length,ke.length+1);return zt(`${wt} ${ht.toUpperCase()} (${Ft})`),ke.push(...vt),Ue=h.unsafe(yt,ke),this}let St=ke.length+1;return zt(`${wt} ${ht} ${t(St)}`),ke.push($t),Ue=h.unsafe(yt,ke),this}if(Array.isArray(It)){let[ht,wt,St]=It,vt=vn(wt,"updateTable.where");if(vt.toLowerCase()==="in"||vt.toLowerCase()==="not in"){let Yt=Array.isArray(St)?St:[St],Et=s(Yt.length,ke.length+1);return zt(`${ve(String(ht))} ${vt.toUpperCase()} (${Et})`),ke.push(...Yt),Ue=h.unsafe(yt,ke),this}let Ft=ke.length+1;return zt(`${ve(String(ht))} ${vt} ${t(Ft)}`),ke.push(St),Ue=h.unsafe(yt,ke),this}if(zn(It))return zt(It.raw),Ue=h.unsafe(yt,ke),this;if(hr(It)){let ht=Tr(It,ke.length+1);return zt(ht.text),ke.push(...ht.parameters),Ue=h.unsafe(yt,ke),this}if(It&&typeof It==="object"){let ht=Object.keys(It);if(ht.length===0)throw TypeError("[query-builder] updateTable.where({}): an empty object is not a filter. Pass a condition, or drop the where() call if updating every row is intended.");let wt=ht.map((St)=>Kr(ve(St),It[St],ke));return zt(wt.join(" AND ")),Ue=h.unsafe(yt,ke),this}throw TypeError(`[query-builder] updateTable.where(): expected a condition, got ${It===null?"null":typeof It}. Refusing to run an UPDATE with no WHERE \u2014 drop the where() call if updating every row is intended.`)},whereNull(It){return zt(`${ve(String(It))} IS NULL`),Ue=h.unsafe(yt,ke),this},whereNotNull(It){return zt(`${ve(String(It))} IS NOT NULL`),Ue=h.unsafe(yt,ke),this},returning(...It){let Wt=this,$t=()=>`${yt} RETURNING ${It.join(", ")}`,ht=()=>ke.length>0?h.unsafe($t(),ke):h.unsafe($t()),wt=async()=>{let Et=/\sWHERE\s/i.test(yt),Jt=Et?yt.slice(yt.search(/\sWHERE\s/i)+1):"",Qt=ke.slice(ke.length-(Jt.match(/\?|\$\d+/g)?.length??0)),yn=ve("id"),_t=await(Qt.length>0?h.unsafe(`SELECT ${yn} FROM ${ve(String(Le))}${Et?` ${Jt}`:""}`,Qt):h.unsafe(`SELECT ${yn} FROM ${ve(String(Le))}${Et?` ${Jt}`:""}`)).execute().catch(()=>[]),Vt=(Array.isArray(_t)?_t:[]).map((Nn)=>Nn?.id).filter((Nn)=>Nn!==void 0&&Nn!==null);if(await pt(ke.length>0?h.unsafe(yt,ke):h.unsafe(yt),"update"),Vt.length===0)return[];let wn=`SELECT ${It.join(", ")} FROM ${ve(String(Le))} WHERE ${yn} IN (${Vt.map(()=>"?").join(", ")})`,Dn=await h.unsafe(wn,Vt).execute();return Array.isArray(Dn)?Dn:[]},St=()=>r(e.dialect)?wt():pt(ht(),"update"),vt=async()=>{let Et=await St();return Array.isArray(Et)?Et[0]:Et},Ft=(Et)=>()=>{throw TypeError(`[query-builder] updateTable.returning(...).${Et}() is not supported \u2014 an UPDATE cannot be ordered or limited through this builder. Apply the filter with where() instead.`)},Yt={where:(...Et)=>(Wt.where(...Et),Yt),andWhere:(...Et)=>(Wt.where(...Et),Yt),whereNull:(...Et)=>(Wt.whereNull(...Et),Yt),whereNotNull:(...Et)=>(Wt.whereNotNull(...Et),Yt),orWhere:Ft("orWhere"),orderBy:Ft("orderBy"),limit:Ft("limit"),offset:Ft("offset"),toSQL:()=>jt(ht(),$t()),execute:St,get:St,first:vt,executeTakeFirst:vt,async firstOrFail(){let Et=await vt();if(!Et)throw Error("Update with RETURNING returned no rows");return Et},async executeTakeFirstOrThrow(){let Et=await vt();if(!Et)throw Error("Update with RETURNING returned no rows");return Et}};return Yt},toSQL(){if(!Ue)Ue=ke.length>0?h.unsafe(yt,ke):h.unsafe(yt);return jt(Ue,yt)},async execute(){let It=await pt(Ue,"update");return xt(It)},async executeTakeFirst(){return{numUpdatedRows:xt(await pt(Ue,"update"))}},async executeTakeFirstOrThrow(){let It=xt(await pt(Ue,"update"));if(It===0)throw Error("No rows updated");return{numUpdatedRows:It}},returningAll(){let It=()=>`${yt} RETURNING *`,Wt=()=>ke.length>0?h.unsafe(It(),ke):h.unsafe(It());return{toSQL:()=>jt(Wt(),It()),execute:()=>pt(Wt(),"update"),async executeTakeFirst(){let $t=await pt(Wt(),"update");return Array.isArray($t)?$t[0]:$t},async executeTakeFirstOrThrow(){let $t=await pt(Wt(),"update"),ht=Array.isArray($t)?$t[0]:$t;if(!ht)throw Error("Update with RETURNING failed");return ht}}}}},deleteFrom(Le){let Ue=(ht)=>{let wt=String(ht);if(r(e.dialect))return`\`${wt.replace(/`/g,"``")}\``;return`"${wt.replace(/"/g,'""')}"`},ve=`DELETE FROM ${Ue(String(Le))}`,yt=null,He=[],zt=null,It=!1,Wt=(ht)=>{ve+=` ${It?"AND":"WHERE"} ${ht}`,It=!0},$t=()=>{if(yt===null)yt=He.length>0?h.unsafe(ve,He):h.unsafe(ve);return yt};return{where(ht,wt,St){if(zt=ht,typeof ht==="string"&&wt!==void 0){let vt=vn(wt,"deleteFrom.where");if(vt.toLowerCase()==="in"||vt.toLowerCase()==="not in"){let Yt=Array.isArray(St)?St:[St],Et=s(Yt.length,He.length+1);return Wt(`${Ue(ht)} ${vt.toUpperCase()} (${Et})`),He.push(...Yt),yt=null,this}let Ft=He.length+1;return Wt(`${Ue(ht)} ${vt} ${t(Ft)}`),He.push(St),yt=null,this}if(Array.isArray(ht)){let[vt,Ft,Yt]=ht,Et=vn(Ft,"deleteFrom.where");if(Et.toLowerCase()==="in"||Et.toLowerCase()==="not in"){let Qt=Array.isArray(Yt)?Yt:[Yt],yn=s(Qt.length,He.length+1);return Wt(`${Ue(String(vt))} ${Et.toUpperCase()} (${yn})`),He.push(...Qt),yt=null,this}let Jt=He.length+1;return Wt(`${Ue(String(vt))} ${Et} ${t(Jt)}`),He.push(Yt),yt=null,this}if(zn(ht))return Wt(ht.raw),yt=null,this;if(hr(ht)){let vt=Tr(ht,He.length+1);return Wt(vt.text),He.push(...vt.parameters),yt=null,this}if(ht&&typeof ht==="object"){let vt=Object.keys(ht);if(vt.length===0)throw TypeError("[query-builder] deleteFrom.where({}): an empty object is not a filter. Pass a condition, or drop the where() call if deleting every row is intended.");let Ft=vt.map((Yt)=>Kr(Ue(Yt),ht[Yt],He));return Wt(Ft.join(" AND ")),yt=null,this}throw TypeError(`[query-builder] deleteFrom.where(): expected a condition, got ${ht===null?"null":typeof ht}. Refusing to run a DELETE with no WHERE \u2014 drop the where() call if deleting every row is intended.`)},whereNull(ht){return Wt(`${Ue(String(ht))} IS NULL`),yt=null,this},whereNotNull(ht){return Wt(`${Ue(String(ht))} IS NOT NULL`),yt=null,this},returning(...ht){let wt=this,St=()=>`${ve} RETURNING ${ht.join(", ")}`,vt=()=>He.length>0?h.unsafe(St(),He):h.unsafe(St()),Ft=async()=>{await xe()?.beforeDelete?.({table:String(Le),where:zt});let Qt=r(e.dialect)?await(async()=>{let yn=ve.slice(ve.search(/\sFROM\s/i)+1),_t=`SELECT ${ht.join(", ")} ${yn}`,Vt=await(He.length>0?h.unsafe(_t,He):h.unsafe(_t)).execute();return await pt(He.length>0?h.unsafe(ve,He):h.unsafe(ve),"delete"),Array.isArray(Vt)?Vt:[]})():await pt(vt(),"delete");try{await xe()?.afterDelete?.({table:String(Le),where:zt,result:Qt})}catch{}return Qt},Yt=async()=>{let Qt=await Ft();return Array.isArray(Qt)?Qt[0]:Qt},Et=(Qt)=>()=>{throw TypeError(`[query-builder] deleteFrom.returning(...).${Qt}() is not supported \u2014 a DELETE cannot be ordered or limited through this builder. Narrow it with where() instead.`)},Jt={where:(...Qt)=>(wt.where(...Qt),Jt),andWhere:(...Qt)=>(wt.where(...Qt),Jt),whereNull:(...Qt)=>(wt.whereNull(...Qt),Jt),whereNotNull:(...Qt)=>(wt.whereNotNull(...Qt),Jt),orWhere:Et("orWhere"),orderBy:Et("orderBy"),limit:Et("limit"),offset:Et("offset"),toSQL:()=>jt(vt(),St()),execute:()=>Ft(),get:()=>Ft(),first:Yt,executeTakeFirst:Yt,async firstOrFail(){let Qt=await Yt();if(!Qt)throw Error("Delete with RETURNING returned no rows");return Qt},async executeTakeFirstOrThrow(){let Qt=await Yt();if(!Qt)throw Error("Delete with RETURNING returned no rows");return Qt}};return Jt},toSQL(){return jt($t(),ve)},async execute(){try{await xe()?.beforeDelete?.({table:String(Le),where:zt})}catch(wt){throw wt}let ht=xt(await pt($t(),"delete"));try{await xe()?.afterDelete?.({table:String(Le),where:zt,result:ht})}catch{}return ht},async executeTakeFirst(){return{numDeletedRows:xt(await pt($t(),"delete"))}},async executeTakeFirstOrThrow(){let ht=xt(await pt($t(),"delete"));if(ht===0)throw Error("No rows deleted");return{numDeletedRows:ht}},returningAll(){let ht=()=>`${ve} RETURNING *`,wt=()=>He.length>0?h.unsafe(ht(),He):h.unsafe(ht());return{toSQL:()=>jt(wt(),ht()),execute:()=>pt(wt(),"delete"),async executeTakeFirst(){let St=await pt(wt(),"delete");return Array.isArray(St)?St[0]:St},async executeTakeFirstOrThrow(){let St=await pt(wt(),"delete"),vt=Array.isArray(St)?St[0]:St;if(!vt)throw Error("Delete with RETURNING failed");return vt}}}}},table(Le){let Ue=this;return{insert(ke){return Ue.insertInto(Le).values(ke)},update(ke){return Ue.updateTable(Le).set(ke)},delete(){return Ue.deleteFrom(Le)},select(...ke){if(ke.length===0)return Ue.selectFrom(Le);return Ue.select(Le,...ke)}}},sql:h,raw(Le,...Ue){return h(Le,...Ue)},simple(Le,...Ue){return h(Le,...Ue).simple()},async advisoryLock(Le){if(e.dialect==="postgres"){let Ue=Ne(Le),ke=h`SELECT pg_advisory_lock(${Ue})`;await pt(ke,"raw");return}if(r(e.dialect)){let Ue=`bqb:${String(Le)}`,ke=h`SELECT GET_LOCK(${Ue}, -1) AS ok`;await pt(ke,"raw");return}throw Error("[query-builder] advisoryLock() is not supported on SQLite \u2014 use a Postgres or MySQL deployment for distributed locking.")},async tryAdvisoryLock(Le){if(e.dialect==="postgres"){let Ue=Ne(Le),ke=h`SELECT pg_try_advisory_lock(${Ue}) as ok`,ve=await pt(ke,"raw");return Boolean(ve?.[0]?.ok)}if(r(e.dialect)){let Ue=`bqb:${String(Le)}`,ke=h`SELECT GET_LOCK(${Ue}, 0) AS ok`,ve=await pt(ke,"raw");return Number(ve?.[0]?.ok)===1}return!1},async advisoryUnlock(Le){if(e.dialect==="postgres"){let Ue=Ne(Le),ke=h`SELECT pg_advisory_unlock(${Ue}) as ok`,ve=await pt(ke,"raw");return Boolean(ve?.[0]?.ok)}if(r(e.dialect)){let Ue=`bqb:${String(Le)}`,ke=h`SELECT RELEASE_LOCK(${Ue}) AS ok`,ve=await pt(ke,"raw");return Number(ve?.[0]?.ok)===1}return!1},unsafe(Le,Ue){return h.unsafe(Le,Ue)},file(Le,Ue){return h.file(Le,Ue)},async reserve(){let Le=await n.reserve(),Ue=i({sql:Le,meta:D,schema:E,hooks:d?.hooks});return Ue.release=()=>Le.release(),Ue},async close(Le){await n.close(Le)},async listen(Le,Ue){},async unlisten(Le){},async notify(Le,Ue){},async copyTo(Le,Ue){throw Error("COPY TO is not yet supported by Bun.sql; placeholder")},async copyFrom(Le,Ue,ke){throw Error("COPY FROM is not yet supported by Bun.sql; placeholder")},async ping(){try{let Le=h`SELECT 1`;return await pt(Le,"select"),!0}catch{return!1}},async waitForReady(Le){let Ue=Math.max(1,Le?.attempts??10),ke=Math.max(10,Le?.delayMs??100);for(let ve=0;ve<Ue;ve++){if(await this.ping())return;await new Promise((yt)=>setTimeout(yt,ke))}throw Error("Database not ready after waiting")},async transaction(Le,Ue){let ve={...d?.txDefaults,...Ue},yt=d?.sql??n,He=d?.inTransaction===!0,zt=He&&typeof yt?.savepoint==="function"?"savepoint":"begin",It=async(ht)=>{ve.logger?.({type:"start",attempt:ht});let wt=Date.now();return await yt[zt](async(St)=>{let vt=i({sql:St,meta:D,schema:E,hooks:d?.hooks,inTransaction:!0});if(ve?.isolation&&!He){let Et=ve.isolation,Jt=Et==="read committed"?"READ COMMITTED":Et==="repeatable read"?"REPEATABLE READ":"SERIALIZABLE";if(e.dialect==="postgres")await St.unsafe(`SET TRANSACTION ISOLATION LEVEL ${Jt}`);else if(r(e.dialect))await St.unsafe(`SET TRANSACTION ISOLATION LEVEL ${Jt}`);else if(Et!=="serializable")throw Error(`[query-builder] transaction({ isolation: '${Et}' }) not supported on SQLite (only 'serializable'). Use a Postgres or MySQL deployment for finer-grained isolation.`)}if(ve?.readOnly)if(e.dialect==="postgres")await St.unsafe("SET TRANSACTION READ ONLY");else if(r(e.dialect))await St.unsafe("SET TRANSACTION READ ONLY");else throw Error("[query-builder] transaction({ readOnly: true }) not supported on SQLite. Use a Postgres or MySQL deployment.");let Ft=await Le(vt),Yt=Date.now()-wt;return ve.logger?.({type:"commit",attempt:ht,durationMs:Yt}),Ft})},Wt=Math.max(0,ve?.retries??0),$t=0;for(;;)try{let ht=await It($t+1);return ve?.afterCommit?.(),ht}catch(ht){let wt=ui(ht)||ci(ht,ve.sqlStates);if($t<Wt&&wt){$t++,ve?.onRetry?.($t,ht);let St=hi($t,ve.backoff);if(St>0)await di(St);continue}try{ve.onRollback?.(ht)}catch{}try{ve.afterRollback?.()}catch{}throw ht}},async savepoint(Le){if(d?.inTransaction!==!0)throw Error("savepoint() must be called inside a transaction");let Ue=h;if(!Ue||typeof Ue.savepoint!=="function")throw Error("savepoint() is not supported by the active connection");return await Ue.savepoint(async(ke)=>{let ve=i({sql:ke,meta:D,schema:E,hooks:d?.hooks,inTransaction:!0});return await Le(ve)})},async beginDistributed(Le,Ue){return await(d?.sql??n).beginDistributed(Le,async(yt)=>{let He=i({sql:yt,meta:D,schema:E,hooks:d?.hooks});return await Ue(He)})},async commitDistributed(Le){await n.commitDistributed(Le)},async rollbackDistributed(Le){await n.rollbackDistributed(Le)},setTransactionDefaults(Le){d={...d,txDefaults:{...d?.txDefaults,...Le}}},transactional(Le,Ue){return(...ke)=>this.transaction((ve)=>Le(ve,...ke),Ue)},async insertOrIgnore(Le,Ue){let ke=Array.isArray(Ue)?Ue:[Ue];if(!ke.length)return;let{colsSql:ve,valuesSql:yt,params:He}=Ar(ke),zt=Qn(String(Le)),It=r(e.dialect)?`INSERT IGNORE INTO ${zt} (${ve}) VALUES ${yt}`:`INSERT INTO ${zt} (${ve}) VALUES ${yt} ON CONFLICT DO NOTHING`;return h.unsafe(It,He).execute()},async insertGetId(Le,Ue,ke="id"){let{colsSql:ve,valuesSql:yt,params:He}=Ar([Ue]),zt=Qn(String(Le));if(r(e.dialect)){await h.unsafe(`INSERT INTO ${zt} (${ve}) VALUES ${yt}`,He).execute();let[Wt]=await h.unsafe("SELECT LAST_INSERT_ID() as id").execute();return Wt?.id}if(e.dialect==="sqlite"){let Wt=await h.unsafe(`INSERT INTO ${zt} (${ve}) VALUES ${yt}`,He).execute();if(Wt?.lastInsertRowid!=null)return Wt.lastInsertRowid;let[$t]=await h.unsafe("SELECT last_insert_rowid() as id").execute();return $t?.id}let[It]=await h.unsafe(`INSERT INTO ${zt} (${ve}) VALUES ${yt} RETURNING ${Qn(String(ke))} as id`,He).execute();return It?.id},async updateOrInsert(Le,Ue,ke){let ve=Qn(String(Le)),yt=Object.keys(Ue),He=1,zt=yt.map((St)=>`${Qn(St)} = ${t(He++)}`).join(" AND "),It=yt.map((St)=>Ue[St]);if((await h.unsafe(`SELECT 1 FROM ${ve} WHERE ${zt} LIMIT 1`,It).execute()).length){let St=Object.keys(ke),vt=1,Ft=St.map((Jt)=>`${Qn(Jt)} = ${t(vt++)}`).join(", "),Yt=yt.map((Jt)=>`${Qn(Jt)} = ${t(vt++)}`).join(" AND "),Et=[...St.map((Jt)=>ke[Jt]),...yt.map((Jt)=>Ue[Jt])];return await h.unsafe(`UPDATE ${ve} SET ${Ft} WHERE ${Yt}`,Et).execute(),!0}let{colsSql:$t,valuesSql:ht,params:wt}=Ar([{...Ue,...ke}]);return await h.unsafe(`INSERT INTO ${ve} (${$t}) VALUES ${ht}`,wt).execute(),!0},async upsert(Le,Ue,ke,ve){let yt=ke.map((Ft)=>String(Ft)),He=(ve??[]).map((Ft)=>String(Ft)),zt=Ue;if(!zt.length)return;let{colsSql:It,valuesSql:Wt,params:$t}=Ar(zt),ht=Qn(String(Le)),wt=`INSERT INTO ${ht} (${It}) VALUES ${Wt}`;if(r(e.dialect)){if(He.length===0)return h.unsafe(`INSERT IGNORE INTO ${ht} (${It}) VALUES ${Wt}`,$t).execute();let Ft=He.map((Yt)=>`${Qn(Yt)} = VALUES(${Qn(Yt)})`).join(", ");return h.unsafe(`${wt} ON DUPLICATE KEY UPDATE ${Ft}`,$t).execute()}let St=yt.map(Qn).join(", ");if(He.length===0)return h.unsafe(`${wt} ON CONFLICT (${St}) DO NOTHING`,$t).execute();let vt=He.map((Ft)=>`${Qn(Ft)} = EXCLUDED.${Qn(Ft)}`).join(", ");return h.unsafe(`${wt} ON CONFLICT (${St}) DO UPDATE SET ${vt}`,$t).execute()},async save(Le,Ue){let ke=D?.primaryKeys[String(Le)]??"id",ve=Ue[ke];if(ve!=null)if(await this.selectFrom(Le).find(ve)){await this.updateTable(Le).set(Ue).where({[ke]:ve}).execute();let He=await this.selectFrom(Le).find(ve);if(!He)throw Error("save() failed to retrieve updated row");return He}else return await this.create(Le,Ue);return await this.create(Le,Ue)},async remove(Le,Ue){return await this.deleteFrom(Le).where({id:Ue}).execute()},async find(Le,Ue){return await this.selectFrom(Le).find(Ue)},async findOrFail(Le,Ue){return await this.selectFrom(Le).findOrFail(Ue)},async findMany(Le,Ue){return await this.selectFrom(Le).findMany(Ue)},async latest(Le,Ue){return await this.selectFrom(Le).latest(Ue).first()},async oldest(Le,Ue){return await this.selectFrom(Le).oldest(Ue).first()},skip(Le,Ue){return this.selectFrom(Le).offset(Ue)},async rawQuery(Le){let Ue=Date.now();try{xe()?.onQueryStart?.({sql:Le,kind:"raw"});let ke=await h.unsafe(Le);return xe()?.onQueryEnd?.({sql:Le,durationMs:Date.now()-Ue,kind:"raw"}),ke}catch(ke){throw xe()?.onQueryError?.({sql:Le,error:ke,durationMs:Date.now()-Ue,kind:"raw"}),ke}},async create(Le,Ue){let ke=D?.primaryKeys[String(Le)]??"id";try{await xe()?.beforeCreate?.({table:String(Le),data:Ue})}catch(ve){throw ve}if(e.dialect==="postgres"){let ve=h`INSERT INTO ${h(String(Le))} ${h(Ue)} RETURNING ${h(String(ke))} as id`,[yt]=await ve.execute();if(!yt?.id)throw console.error(`create() failed to get insert ID for table ${String(Le)}`),console.error("Inserted values:",Ue),Error(`create() failed to get insert ID for table ${String(Le)}`);let He=await this.selectFrom(Le).find(yt.id);if(!He)throw console.error(`create() failed to retrieve inserted row for table ${String(Le)} with id ${yt.id}`),console.error("Inserted values:",Ue),Error(`create() failed to retrieve inserted row for table ${String(Le)} with id ${yt.id}`);try{await xe()?.afterCreate?.({table:String(Le),data:Ue,result:He})}catch{}return He}else{let ve=await this.insertGetId(Le,Ue,ke);if(ve==null)throw Error(`create() failed to get insert ID for table ${String(Le)}`);let yt=await this.selectFrom(Le).find(ve);if(!yt)throw console.error(`create() failed to retrieve inserted row for table ${String(Le)} with id ${ve}`),console.error("Inserted values:",Ue),Error(`create() failed to retrieve inserted row for table ${String(Le)} with id ${ve}`);try{await xe()?.afterCreate?.({table:String(Le),data:Ue,result:yt})}catch{}return yt}},async createMany(Le,Ue){if(!Ue?.length)return;let ke=Ue[0],ve=Object.keys(ke),yt=ve.length,He=Ue.length,zt=Array.from({length:He*yt}),It=r(e.dialect)?(ht)=>`\`${String(ht).replace(/`/g,"``")}\``:(ht)=>`"${String(ht).replace(/"/g,'""')}"`,Wt=`INSERT INTO ${It(String(Le))}(${ve.map(It).join(",")})VALUES`,$t=0;for(let ht=0;ht<He;ht++){if(ht>0)Wt+=",";Wt+="(";let wt=Ue[ht];for(let St=0;St<yt;St++){if(St>0)Wt+=",";Wt+=t($t+1),zt[$t++]=wt[ve[St]]}Wt+=")"}return h.unsafe(Wt,zt).execute()},async insertMany(Le,Ue){if(!Ue?.length)return;let ke=Ue[0],ve=Object.keys(ke),yt=ve.length,He=Ue.length,zt=He*yt,It=Array(zt),Wt=e.dialect==="postgres",$t;if(!Wt){let St=Array(yt);for(let vt=0;vt<yt;vt++)St[vt]="?";$t=`(${St.join(",")})`}else $t="";let ht=Array(He+2);ht[0]=`INSERT INTO ${Le}(${ve.join(",")})VALUES`;let wt=0;if(!Wt){for(let St=0;St<He;St++){let vt=Ue[St];ht[St+1]=$t;for(let Ft=0;Ft<yt;Ft++)It[wt++]=vt[ve[Ft]]}return h.unsafe(ht[0]+ht.slice(1,He+1).join(","),It).execute()}for(let St=0;St<He;St++){let vt=Ue[St],Ft=Array(yt);for(let Yt=0;Yt<yt;Yt++)Ft[Yt]=`$${wt+1}`,It[wt++]=vt[ve[Yt]];ht[St+1]=`(${Ft.join(",")})`}return h.unsafe(ht[0]+ht.slice(1,He+1).join(","),It).execute()},async updateMany(Le,Ue,ke){let ve=Object.keys(ke),yt=ve.length;if(yt===0)return 0;let He=[],zt=Array.from({length:yt});for(let Wt=0;Wt<yt;Wt++)zt[Wt]=`${ve[Wt]}=${t(Wt+1)}`,He.push(ke[ve[Wt]]);let It=`UPDATE ${Le} SET ${zt.join(",")}`;if(Array.isArray(Ue)){let Wt=vn(String(Ue[1]),"updateMany");It+=` WHERE ${Ue[0]} ${Wt} ${t(He.length+1)}`,He.push(Ue[2])}else if(zn(Ue))It+=` WHERE ${Ue.raw}`;else if(hr(Ue)){let Wt=Tr(Ue,He.length+1);It+=` WHERE ${Wt.text}`,He.push(...Wt.parameters)}else if(Ue&&typeof Ue==="object"&&Object.keys(Ue).length>0){let Wt=Object.keys(Ue).map(($t)=>Kr($t,Ue[$t],He));It+=` WHERE ${Wt.join(" AND ")}`}else if(Ue&&typeof Ue==="object")throw TypeError("[query-builder] updateMany(): an empty object is not a filter. Pass a condition, or use updateTable(table).set(data).execute() if updating every row is intended.");else throw TypeError(`[query-builder] updateMany(): expected a condition, got ${Ue===null?"null":typeof Ue}. Refusing to run an UPDATE with no WHERE \u2014 use updateTable(table).set(data).execute() if updating every row is intended.`);return h.unsafe(It,He).execute()},async deleteMany(Le,Ue){if(!Array.isArray(Ue)||Ue.length===0)return 0;let ke=D?.primaryKeys[String(Le)]??"id",ve=Ue.length;if(e.dialect==="postgres"){let He=Array(ve);for(let zt=0;zt<ve;zt++)He[zt]=`$${zt+1}`;return h.unsafe(`DELETE FROM ${Le} WHERE ${ke} IN (${He.join(",")})`,Ue).execute()}let yt=Array(ve);for(let He=0;He<ve;He++)yt[He]="?";return h.unsafe(`DELETE FROM ${Le} WHERE ${ke} IN (${yt.join(",")})`,Ue).execute()},async firstOrCreate(Le,Ue,ke){let ve=await this.selectFrom(Le).where(Ue).first();if(ve)return ve;return await this.create(Le,{...Ue,...ke})},async updateOrCreate(Le,Ue,ke){let ve=await this.selectFrom(Le).where(Ue).first();if(ve){await this.updateTable(Le).set(ke).where(Ue).execute();let yt=D?.primaryKeys[String(Le)]??"id",He=ve[yt],zt=He!=null?await this.selectFrom(Le).find(He):await this.selectFrom(Le).where(Ue).first();if(!zt)throw Error("updateOrCreate() failed to retrieve updated row");return zt}return await this.create(Le,{...Ue,...ke})},async count(Le,Ue){let ke=Ue?h(String(Ue)):h`*`,ve=h`SELECT COUNT(${ke}) as c FROM ${h(String(Le))}`,[yt]=await ve.execute();return Number(yt?.c??0)},async sum(Le,Ue){let ke=h`SELECT SUM(${h(String(Ue))}) as s FROM ${h(String(Le))}`,[ve]=await ke.execute();return Number(ve?.s??0)},async avg(Le,Ue){let ke=h`SELECT AVG(${h(String(Ue))}) as a FROM ${h(String(Le))}`,[ve]=await ke.execute();return Number(ve?.a??0)},async min(Le,Ue){let ke=h`SELECT MIN(${h(String(Ue))}) as m FROM ${h(String(Le))}`,[ve]=await ke.execute();return ve?.m},async max(Le,Ue){let ke=h`SELECT MAX(${h(String(Ue))}) as m FROM ${h(String(Le))}`,[ve]=await ke.execute();return ve?.m},getRelationships(Le){if(!D?.relations)return{};let Ue=D.relations[Le];if(!Ue)return{};let ke={};for(let[ve,yt]of Object.entries(Ue))if(yt&&typeof yt==="object"&&Object.keys(yt).length>0)ke[ve]=yt;return ke},hasRelationship(Le,Ue){if(!D?.relations)return!1;let ke=D.relations[Le];if(!ke)return!1;return Object.values(ke).some((ve)=>ve&&typeof ve==="object"&&(Ue in ve))},getRelationshipType(Le,Ue){if(!D?.relations)return null;let ke=D.relations[Le];if(!ke)return null;for(let[ve,yt]of Object.entries(ke))if(yt&&typeof yt==="object"&&Ue in yt)return ve;return null},getRelationshipTarget(Le,Ue){if(!D?.relations)return null;let ke=D.relations[Le];if(!ke)return null;for(let[ve,yt]of Object.entries(ke))if(yt&&typeof yt==="object"&&Ue in yt){let He=yt[Ue];if(typeof He==="string")return D.modelToTable[He]||He;else if(He&&typeof He==="object"){if("model"in He)return D.modelToTable[He.model]||He.model;if("target"in He)return D.modelToTable[He.target]||He.target}}return null}}}function Qe(){Mr.clear()}function Ge(d){Mr.setMaxSize(d)}async function z(){console.log("-- Clearing query cache..."),Qe(),console.log("-- \u2713 Query cache cleared")}async function Y(){console.log("-- Query Cache Information"),console.log(),console.log("The query cache is an LRU (Least Recently Used) cache with TTL support."),console.log(),console.log("Configuration:"),console.log(" - Default max size: 100 entries"),console.log(" - Default TTL: 60 seconds (60000ms)"),console.log(" - Eviction: LRU when cache is full"),console.log(),console.log("Usage:"),console.log(' qb.selectFrom("users").cache().get() // Cache for 60s'),console.log(' qb.selectFrom("users").cache(5000).get() // Cache for 5s'),console.log(),console.log("Configuration:"),console.log(" clearQueryCache() // Clear all cached queries"),console.log(" setQueryCacheMaxSize(500) // Set max cache size"),console.log(),console.log("Commands:"),console.log(" qb cache:clear // Clear the cache"),console.log(" qb cache:config --size 500 // Configure cache size")}async function X(d={}){if(console.log("-- Configuring query cache..."),console.log(),d.size!==void 0){let h=Number(d.size);if(Number.isNaN(h)||h<=0)throw console.error("-- Error: Cache size must be a positive number"),Error("Invalid cache size");Ge(h),console.log(`-- \u2713 Cache max size set to: ${h}`)}else console.log("-- No configuration changes specified"),console.log("-- Available options:"),console.log("-- --size <n> Set maximum cache size (default: 100)"),console.log(),console.log("-- Example: qb cache:config --size 500")}import Cr from"process";import{createInterface as Ti}from"readline";async function N(){console.log("-- Query Builder Interactive Console"),console.log("-- Type .help for available commands"),console.log("-- Type .exit or press Ctrl+C to quit"),console.log();let d=i(),h=Ti({input:Cr.stdin,output:Cr.stdout,prompt:"qb> "}),D="",E=!1,V=`
51
- Available Commands:
52
- .help Show this help message
53
- .exit Exit the console
54
- .tables List all tables
55
- .clear Clear the screen
56
-
57
- Query Examples:
58
- qb.selectFrom('users').where({ active: true }).limit(10).execute()
59
- qb.selectFrom('users').count()
60
- qb.insertInto('users').values({ name: 'John' }).execute()
61
- qb.selectFrom('users').where('id', '=', 1).first()
62
- qb.unsafe("SELECT * FROM users WHERE id = $1", [1]).execute()
63
-
64
- Tips:
65
- - Use 'qb' to access the query builder
66
- - Use 'await' for async operations
67
- - Multi-line input: end with \\ to continue on next line
68
- - Press Enter on an empty line to execute multi-line input
69
- `,Ne=async(Fe)=>{try{let gt=await new(Object.getPrototypeOf(async()=>{})).constructor("qb",`return (${Fe})`)(d);if(gt!==void 0)if(Array.isArray(gt))console.log(`-- ${gt.length} row(s) returned`),console.table(gt);else if(typeof gt==="object"&&gt!==null)console.log(gt);else console.log(gt)}catch(Ie){console.error("Error:",Ie.message)}},xe=async(Fe)=>{let Ie=Fe.trim();if(Ie.startsWith(".")){let Ve=Ie.toLowerCase();if(Ve===".exit"||Ve===".quit")console.log("Goodbye!"),h.close(),Cr.exit(0);else if(Ve===".help")console.log(V);else if(Ve===".clear")console.clear();else if(Ve===".tables")try{let gt=await d.unsafe(`
70
- SELECT name FROM sqlite_master
71
- WHERE type = 'table'
72
- AND name NOT LIKE 'sqlite_%'
73
- ORDER BY name
74
- `);if(gt.length>0){console.log("Tables:");for(let bt of gt)console.log(` - ${bt.name}`)}else console.log("No tables found")}catch(gt){console.error("Error listing tables:",gt.message)}else console.log(`Unknown command: ${Ie}`),console.log("Type .help for available commands");return}if(Ie.endsWith("\\")){E=!0,D+=`${Ie.slice(0,-1)}
75
- `;return}if(E){if(Ie==="")await Ne(D),D="",E=!1;else D+=`${Ie}
76
- `;return}if(Ie)await Ne(Ie)};h.on("line",async(Fe)=>{await xe(Fe),h.prompt()}),h.on("SIGINT",()=>{if(E)console.log(`
77
- -- Multi-line input cancelled`),D="",E=!1,h.prompt();else console.log(`
78
- -- Type .exit to quit`),h.prompt()}),h.on("close",()=>{console.log(`
79
- Goodbye!`),Cr.exit(0)}),h.prompt()}async function Z(){return N()}import{existsSync as bi,readFileSync as Si,writeFileSync as wr}from"fs";async function ee(d,h={}){let D=h.format||"json",E=h.output||`${d}.${D}`,V=h.limit;if(console.log(`-- Exporting data from table: ${d}`),console.log(`-- Format: ${D}`),console.log(`-- Output: ${E}`),V)console.log(`-- Limit: ${V} rows`);console.log();try{let xe=i().selectFrom(d);if(V)xe=xe.limit(V);let Fe=await xe.execute();if(console.log(`-- Retrieved ${Fe.length} rows`),D==="json")wr(E,JSON.stringify(Fe,null,2)),console.log(`-- \u2713 Exported to JSON: ${E}`);else if(D==="csv"){if(Fe.length===0){wr(E,""),console.log(`-- \u2713 Exported to CSV: ${E} (empty)`);return}let Ie=Object.keys(Fe[0]),Ve=[Ie.join(",")];for(let gt of Fe){let bt=Ie.map((pt)=>{let xt=gt[pt];if(xt===null||xt===void 0)return"";let jt=String(xt);if(jt.includes(",")||jt.includes('"')||jt.includes(`
80
- `))return`"${jt.replace(/"/g,'""')}"`;return jt});Ve.push(bt.join(","))}wr(E,Ve.join(`
81
- `)),console.log(`-- \u2713 Exported to CSV: ${E}`)}else if(D==="sql"){let Ie=[];for(let Ve of Fe){let gt=Object.keys(Ve),bt=gt.map((pt)=>{let xt=Ve[pt];if(xt===null||xt===void 0)return"NULL";if(typeof xt==="number")return String(xt);return`'${String(xt).replace(/'/g,"''")}'`});Ie.push(`INSERT INTO ${d} (${gt.join(", ")}) VALUES (${bt.join(", ")});`)}wr(E,Ie.join(`
82
- `)),console.log(`-- \u2713 Exported to SQL: ${E}`)}}catch(Ne){throw console.error(`-- Failed to export data from ${d}:`,Ne),Ne}}async function te(d,h,D={}){if(!bi(h))throw console.error(`-- File not found: ${h}`),Error(`File not found: ${h}`);let E=D.format||(h.endsWith(".json")?"json":"csv"),V=D.truncate??!1;console.log(`-- Importing data into table: ${d}`),console.log(`-- Format: ${E}`),console.log(`-- File: ${h}`),console.log(`-- Truncate: ${V}`),console.log();try{let Ne=i();if(V)await Ne.deleteFrom(d).execute(),console.log("-- Table truncated");let xe=Si(h,"utf8"),Fe=[];if(E==="json"){if(Fe=JSON.parse(xe),!Array.isArray(Fe))throw TypeError("JSON file must contain an array of objects")}else if(E==="csv"){let gt=xe.split(`
83
- `).filter((pt)=>pt.trim());if(gt.length<2){console.log("-- No data to import (CSV is empty or has only headers)");return}let bt=gt[0].split(",").map((pt)=>pt.trim());for(let pt=1;pt<gt.length;pt++){let xt=gt[pt].split(",").map((Ht)=>Ht.trim()),jt={};for(let Ht=0;Ht<bt.length;Ht++){let Le=xt[Ht];if(Le.startsWith('"')&&Le.endsWith('"'))Le=Le.slice(1,-1).replace(/""/g,'"');if(Le==="")Le=null;else if(!Number.isNaN(Number(Le)))Le=Number(Le);jt[bt[Ht]]=Le}Fe.push(jt)}}if(Fe.length===0){console.log("-- No data to import");return}let Ie=100,Ve=0;for(let gt=0;gt<Fe.length;gt+=Ie){let bt=Fe.slice(gt,gt+Ie);await Ne.insertInto(d).values(bt).execute(),Ve+=bt.length,console.log(`-- Imported ${Ve}/${Fe.length} rows...`)}console.log(`-- \u2713 Successfully imported ${Fe.length} rows`)}catch(Ne){throw console.error(`-- Failed to import data into ${d}:`,Ne),Ne}}async function ne(d={}){let h=e.dialect||"postgres",D=d.output||`dump-${Date.now()}.sql`,E=d.tables?.split(",").map((V)=>V.trim());if(console.log("-- Dumping database"),console.log(`-- Dialect: ${h}`),console.log(`-- Output: ${D}`),E)console.log(`-- Tables: ${E.join(", ")}`);console.log();try{let V=i(),Ne=[];if(h==="sqlite")Ne=(await V.unsafe(`
84
- SELECT name FROM sqlite_master
85
- WHERE type = 'table'
86
- AND name NOT LIKE 'sqlite_%'
87
- ORDER BY name
88
- `)).map((Ie)=>Ie.name);else if(h==="postgres")Ne=(await V.unsafe(`
89
- SELECT table_name
90
- FROM information_schema.tables
91
- WHERE table_schema = 'public'
92
- AND table_type = 'BASE TABLE'
93
- ORDER BY table_name
94
- `)).map((Ie)=>Ie.table_name);else if(r(h))Ne=(await V.unsafe(`
95
- SELECT table_name
96
- FROM information_schema.tables
97
- WHERE table_schema = DATABASE()
98
- AND table_type = 'BASE TABLE'
99
- ORDER BY table_name
100
- `)).map((Ie)=>Ie.table_name);if(E)Ne=Ne.filter((Fe)=>E.includes(Fe));if(Ne.length===0){console.log("-- No tables to dump");return}console.log(`-- Dumping ${Ne.length} table(s)`);let xe=[];xe.push("-- Database dump"),xe.push(`-- Generated at: ${new Date().toISOString()}`),xe.push(`-- Dialect: ${h}`),xe.push("");for(let Fe of Ne){console.log(`-- Dumping table: ${Fe}`);let Ie=await V.selectFrom(Fe).execute();xe.push(`-- Table: ${Fe}`),xe.push(`-- Rows: ${Ie.length}`),xe.push("");for(let Ve of Ie){let gt=Object.keys(Ve),bt=gt.map((pt)=>{let xt=Ve[pt];if(xt===null||xt===void 0)return"NULL";if(typeof xt==="number")return String(xt);return`'${String(xt).replace(/'/g,"''")}'`});xe.push(`INSERT INTO ${Fe} (${gt.join(", ")}) VALUES (${bt.join(", ")});`)}xe.push("")}wr(D,xe.join(`
101
- `)),console.log(),console.log(`-- \u2713 Database dump saved to: ${D}`)}catch(V){throw console.error("-- Failed to dump database:",V),V}}async function B(){let d=e.dialect||"postgres",h=e.database?.database||"unknown";console.log("-- Database Information"),console.log(`-- Dialect: ${d}`),console.log(`-- Database: ${h}`),console.log();try{let D=i(),E=[],V=[];if(d==="postgres")V=(await D.unsafe(`
102
- SELECT table_name
103
- FROM information_schema.tables
104
- WHERE table_schema = 'public'
105
- AND table_type = 'BASE TABLE'
106
- ORDER BY table_name
107
- `)).map((Fe)=>Fe.table_name);else if(r(d))V=(await D.unsafe(`
108
- SELECT table_name
109
- FROM information_schema.tables
110
- WHERE table_schema = DATABASE()
111
- AND table_type = 'BASE TABLE'
112
- ORDER BY table_name
113
- `)).map((Fe)=>Fe.table_name);else if(d==="sqlite")V=(await D.unsafe(`
114
- SELECT name
115
- FROM sqlite_master
116
- WHERE type = 'table'
117
- AND name NOT LIKE 'sqlite_%'
118
- ORDER BY name
119
- `)).map((Fe)=>Fe.name);for(let xe of V)try{let Fe=await D.unsafe(`SELECT COUNT(*) as count FROM ${xe}`),Ie=Number(Fe[0]?.count||0),Ve=0,gt=0;if(d==="postgres"){let bt=await D.unsafe(`
120
- SELECT COUNT(*) as count
121
- FROM information_schema.columns
122
- WHERE table_name = $1
123
- `,[xe]);Ve=Number(bt[0]?.count||0);let pt=await D.unsafe(`
124
- SELECT COUNT(*) as count
125
- FROM pg_indexes
126
- WHERE tablename = $1
127
- `,[xe]);gt=Number(pt[0]?.count||0)}else if(r(d)){let bt=await D.unsafe(`
128
- SELECT COUNT(*) as count
129
- FROM information_schema.columns
130
- WHERE table_name = ?
131
- AND table_schema = DATABASE()
132
- `,[xe]);Ve=Number(bt[0]?.count||0);let pt=await D.unsafe(`
133
- SELECT COUNT(*) as count
134
- FROM information_schema.statistics
135
- WHERE table_name = ?
136
- AND table_schema = DATABASE()
137
- `,[xe]);gt=Number(pt[0]?.count||0)}else if(d==="sqlite")Ve=(await D.unsafe(`PRAGMA table_info(${xe})`)).length,gt=(await D.unsafe(`PRAGMA index_list(${xe})`)).length;E.push({name:xe,rowCount:Ie,columns:Ve,indexes:gt})}catch(Fe){console.error(`-- Error getting info for table ${xe}:`,Fe)}let Ne=E.reduce((xe,Fe)=>xe+Fe.rowCount,0);if(console.log(`-- Total Tables: ${E.length}`),console.log(`-- Total Rows: ${Ne.toLocaleString()}`),console.log(),E.length>0){console.log("Tables:"),console.log();let xe=Math.max(...E.map((Ve)=>Ve.name.length)),Fe=xe+2,Ie="Table".padEnd(Fe)+"Rows".padStart(12)+"Columns".padStart(10)+"Indexes".padStart(10);console.log(Ie),console.log("-".repeat(Ie.length));for(let Ve of E){let gt=Ve.name.padEnd(xe+2),bt=Ve.rowCount.toLocaleString().padStart(12),pt=(Ve.columns||0).toString().padStart(10),xt=(Ve.indexes||0).toString().padStart(10);console.log(`${gt}${bt}${pt}${xt}`)}}else console.log("-- No tables found");return{dialect:d,database:h,tables:E,totalTables:E.length,totalRows:Ne}}catch(D){throw console.error("-- Failed to get database info:",D),D}}async function re(){return B()}async function P(d={}){let h=H(d.dialect),D=d.aggressive||!1;if(d.verbose)console.log(`Optimizing ${h} database${D?" (aggressive mode)":""}...`);try{if(h==="postgres"){if(d.tables&&d.tables.length>0)for(let E of d.tables){if(d.verbose)console.log(`Analyzing table: ${E}`);if(D)await n`VACUUM FULL ANALYZE ${n(E)}`;else await n`VACUUM ANALYZE ${n(E)}`}else{if(d.verbose)console.log("Running VACUUM and ANALYZE on all tables...");if(D)await n`VACUUM FULL`,await n`ANALYZE`;else await n`VACUUM ANALYZE`}console.log("\u2713 PostgreSQL optimization complete")}else if(r(h)){if(d.tables&&d.tables.length>0)for(let E of d.tables){if(d.verbose)console.log(`Optimizing table: ${E}`);await n`OPTIMIZE TABLE ${n(E)}`,await n`ANALYZE TABLE ${n(E)}`}else{let E=Ce(),V=await n`
138
- SELECT table_name
139
- FROM information_schema.tables
140
- WHERE table_schema = ${E}
141
- `;for(let Ne of V){let xe=Ne.table_name||Ne.TABLE_NAME;if(d.verbose)console.log(`Optimizing table: ${xe}`);await n`OPTIMIZE TABLE ${n(xe)}`,await n`ANALYZE TABLE ${n(xe)}`}}console.log("\u2713 MySQL optimization complete")}else if(h==="sqlite"){if(d.verbose)console.log("Running VACUUM on SQLite database...");if(await n`VACUUM`,d.tables&&d.tables.length>0)for(let E of d.tables){if(d.verbose)console.log(`Analyzing table: ${E}`);await n`ANALYZE ${n(E)}`}else await n`ANALYZE`;if(D){if(d.verbose)console.log("Running aggressive SQLite optimizations...");await n`PRAGMA optimize`,await n`PRAGMA wal_checkpoint(TRUNCATE)`}console.log("\u2713 SQLite optimization complete")}else console.error(`Unsupported dialect: ${h}`)}catch(E){throw console.error("Error optimizing database:",E.message),E}}async function O(d={}){let h=H(d.dialect);if(d.verbose)console.log(`Wiping all tables from ${h} database...`);try{let D=[];if(h==="postgres")D=(await n`
142
- SELECT tablename
143
- FROM pg_tables
144
- WHERE schemaname = 'public'
145
- `).map((V)=>V.tablename);else if(r(h)){let E=Ce();D=(await n`
146
- SELECT table_name
147
- FROM information_schema.tables
148
- WHERE table_schema = ${E}
149
- `).map((Ne)=>Ne.table_name||Ne.TABLE_NAME)}else if(h==="sqlite")D=(await n`
150
- SELECT name
151
- FROM sqlite_master
152
- WHERE type = 'table'
153
- AND name NOT LIKE 'sqlite_%'
154
- `).map((V)=>V.name);if(D.length===0){console.log("No tables found to drop.");return}if(d.verbose)console.log(`Found ${D.length} tables: ${D.join(", ")}`);if(h==="postgres")for(let E of D){if(d.verbose)console.log(`Dropping table: ${E}`);await n`DROP TABLE IF EXISTS ${n(E)} CASCADE`}else if(r(h)){await n`SET FOREIGN_KEY_CHECKS = 0`;for(let E of D){if(d.verbose)console.log(`Dropping table: ${E}`);await n`DROP TABLE IF EXISTS ${n(E)}`}await n`SET FOREIGN_KEY_CHECKS = 1`}else if(h==="sqlite"){await n`PRAGMA foreign_keys = OFF`;for(let E of D){if(d.verbose)console.log(`Dropping table: ${E}`);await n`DROP TABLE IF EXISTS ${n(E)}`}await n`PRAGMA foreign_keys = ON`}console.log(`\u2713 Dropped ${D.length} tables`)}catch(D){throw console.error("Error wiping database:",D.message),D}}async function ie(d){let E=await(i().raw([d]).simple()?.execute?.()??Promise.resolve([]));return console.log(JSON.stringify(E,null,2)),E}async function se(d,h={}){let D=i(),E=h.params?JSON.parse(h.params):void 0,V=await D.file(d,E);return console.log(JSON.stringify(V)),V}async function _(d,h={}){let D=e.dialect||"postgres",E=h.verbose??!0;if(E)console.log(`-- Inspecting table: ${d}`),console.log(`-- Dialect: ${D}`),console.log();try{let V=i(),Ne=[],xe=[],Fe=await V.unsafe(`SELECT COUNT(*) as count FROM ${d}`),Ie=Number(Fe[0]?.count||0);if(D==="postgres"){let Ve=await V.unsafe(`
155
- SELECT
156
- c.column_name,
157
- c.data_type,
158
- c.is_nullable,
159
- c.column_default,
160
- CASE
161
- WHEN pk.column_name IS NOT NULL THEN true
162
- ELSE false
163
- END as is_primary_key,
164
- CASE
165
- WHEN fk.column_name IS NOT NULL THEN true
166
- ELSE false
167
- END as is_foreign_key
168
- FROM information_schema.columns c
169
- LEFT JOIN (
170
- SELECT ku.column_name
171
- FROM information_schema.table_constraints tc
172
- JOIN information_schema.key_column_usage ku
173
- ON tc.constraint_name = ku.constraint_name
174
- WHERE tc.constraint_type = 'PRIMARY KEY'
175
- AND tc.table_name = $1
176
- ) pk ON c.column_name = pk.column_name
177
- LEFT JOIN (
178
- SELECT ku.column_name
179
- FROM information_schema.table_constraints tc
180
- JOIN information_schema.key_column_usage ku
181
- ON tc.constraint_name = ku.constraint_name
182
- WHERE tc.constraint_type = 'FOREIGN KEY'
183
- AND tc.table_name = $1
184
- ) fk ON c.column_name = fk.column_name
185
- WHERE c.table_name = $1
186
- ORDER BY c.ordinal_position
187
- `,[d]);for(let bt of Ve)Ne.push({name:bt.column_name,type:bt.data_type,nullable:bt.is_nullable==="YES",default:bt.column_default,isPrimaryKey:bt.is_primary_key,isForeignKey:bt.is_foreign_key});let gt=await V.unsafe(`
188
- SELECT
189
- i.indexname as name,
190
- i.indexdef,
191
- ix.indisunique as is_unique
192
- FROM pg_indexes i
193
- JOIN pg_class c ON c.relname = i.indexname
194
- JOIN pg_index ix ON ix.indexrelid = c.oid
195
- WHERE i.tablename = $1
196
- `,[d]);for(let bt of gt){let pt=bt.indexdef?.match(/\(([^)]+)\)/),jt=(pt?pt[1]:"").split(",").map((Ht)=>Ht.trim());xe.push({name:bt.name,columns:jt,unique:bt.is_unique})}}else if(r(D)){let Ve=await V.unsafe(`
197
- SELECT
198
- COLUMN_NAME as column_name,
199
- DATA_TYPE as data_type,
200
- IS_NULLABLE as is_nullable,
201
- COLUMN_DEFAULT as column_default,
202
- COLUMN_KEY as column_key
203
- FROM information_schema.COLUMNS
204
- WHERE TABLE_NAME = ?
205
- AND TABLE_SCHEMA = DATABASE()
206
- ORDER BY ORDINAL_POSITION
207
- `,[d]);for(let pt of Ve)Ne.push({name:pt.column_name,type:pt.data_type,nullable:pt.is_nullable==="YES",default:pt.column_default,isPrimaryKey:pt.column_key==="PRI",isForeignKey:pt.column_key==="MUL"});let gt=await V.unsafe(`
208
- SHOW INDEXES FROM ${d}
209
- `),bt=new Map;for(let pt of gt){let xt=pt.Key_name;if(!bt.has(xt))bt.set(xt,{columns:[],unique:pt.Non_unique===0});bt.get(xt).columns.push(pt.Column_name)}for(let[pt,xt]of bt)xe.push({name:pt,columns:xt.columns,unique:xt.unique})}else if(D==="sqlite"){let Ve=await V.unsafe(`PRAGMA table_info(${d})`);for(let bt of Ve)Ne.push({name:bt.name,type:bt.type,nullable:bt.notnull===0,default:bt.dflt_value,isPrimaryKey:bt.pk===1});let gt=await V.unsafe(`PRAGMA index_list(${d})`);for(let bt of gt){let pt=await V.unsafe(`PRAGMA index_info(${bt.name})`);xe.push({name:bt.name,columns:pt.map((xt)=>xt.name),unique:bt.unique===1})}}if(E){console.log(`Table: ${d}`),console.log(`Rows: ${Ie.toLocaleString()}`),console.log(),console.log("Columns:"),console.log();let Ve=Math.max(...Ne.map((jt)=>jt.name.length),10),gt=Math.max(...Ne.map((jt)=>jt.type.length),10),bt=Ve+2,pt=gt+2,xt=`${"Name".padEnd(bt)+"Type".padEnd(pt)+"Nullable".padEnd(10)+"Default".padEnd(20)}Flags`;console.log(xt),console.log("-".repeat(xt.length));for(let jt of Ne){let Ht=jt.name.padEnd(bt),Le=jt.type.padEnd(pt),Ue=(jt.nullable?"YES":"NO").padEnd(10),ke=String(jt.default||"").padEnd(20),ve=[jt.isPrimaryKey?"PK":"",jt.isForeignKey?"FK":""].filter(Boolean).join(", ");console.log(`${Ht}${Le}${Ue}${ke}${ve}`)}if(console.log(),xe.length>0){console.log("Indexes:"),console.log();for(let jt of xe){let Ht=jt.unique?" (UNIQUE)":"";console.log(` - ${jt.name}${Ht}: [${jt.columns.join(", ")}]`)}console.log()}}return{tableName:d,rowCount:Ie,columns:Ne,indexes:xe}}catch(V){throw console.error(`-- Failed to inspect table ${d}:`,V),V}}async function ae(d,h={}){return _(d,h)}async function oe(d,h={}){let D=await u({modelsDir:d}),E=$e(D);return console.log(JSON.stringify(E,null,2)),{models:D,schema:E}}function Je(d){let h=d.toLowerCase();if(/^bool|boolean|tinyint\(1\)/.test(h))return"boolean";if(/int|serial|numeric|decimal|double|real|float|money/.test(h))return"number";if(/timestamp|datetime|date|time/.test(h))return"datetime";if(/json/.test(h))return"json";return"string"}function wi(d){if(/ies$/i.test(d))return d.replace(/ies$/i,"y");if(/ses$/i.test(d))return d.replace(/es$/i,"");if(/s$/i.test(d)&&!/ss$/i.test(d))return d.replace(/s$/i,"");return d}function Di(d){return d.replace(/[-_\s]+/g," ").split(" ").filter(Boolean).map((h)=>h.charAt(0).toUpperCase()+h.slice(1)).join("")}function Be(d){return Di(wi(d))}async function as(d,h){if(h==="postgres")return(await d.unsafe("SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' AND table_type = 'BASE TABLE' ORDER BY table_name")).map((V)=>V.table_name);if(r(h))return(await d.unsafe("SELECT table_name FROM information_schema.tables WHERE table_schema = DATABASE() AND table_type = 'BASE TABLE' ORDER BY table_name")).map((V)=>V.table_name??V.TABLE_NAME);return(await d.unsafe("SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' ORDER BY name")).map((E)=>E.name)}async function Ei(d,h,D){if(h==="sqlite")return(await d.unsafe(`PRAGMA table_info(${D})`)).map((Ne)=>({name:Ne.name,sqlType:String(Ne.type||""),nullable:Number(Ne.notnull)===0,isPrimaryKey:Number(Ne.pk)>0}));if(h==="postgres")return(await d.unsafe(`SELECT c.column_name, c.data_type, c.is_nullable,
210
- (SELECT COUNT(*) FROM information_schema.table_constraints tc
211
- JOIN information_schema.key_column_usage k ON k.constraint_name = tc.constraint_name
212
- WHERE tc.constraint_type = 'PRIMARY KEY' AND tc.table_name = c.table_name AND k.column_name = c.column_name) AS is_pk
213
- FROM information_schema.columns c
214
- WHERE c.table_name = $1 AND c.table_schema = 'public'
215
- ORDER BY c.ordinal_position`,[D])).map((Ne)=>({name:Ne.column_name,sqlType:String(Ne.data_type||""),nullable:String(Ne.is_nullable).toUpperCase()==="YES",isPrimaryKey:Number(Ne.is_pk)>0}));return(await d.unsafe(`SELECT column_name, data_type, is_nullable, column_key
216
- FROM information_schema.columns
217
- WHERE table_name = ? AND table_schema = DATABASE()
218
- ORDER BY ordinal_position`,[D])).map((V)=>({name:V.column_name??V.COLUMN_NAME,sqlType:String(V.data_type??V.DATA_TYPE??""),nullable:String(V.is_nullable??V.IS_NULLABLE).toUpperCase()==="YES",isPrimaryKey:String(V.column_key??V.COLUMN_KEY).toUpperCase()==="PRI"}))}function ze(d,h){let D=Be(d),E=h.find((Ne)=>Ne.isPrimaryKey)?.name??"id",V=h.map((Ne)=>{let xe=[`type: '${Je(Ne.sqlType)}'`];if(!Ne.nullable&&!Ne.isPrimaryKey)xe.push("required: true");return` ${Ne.name}: { ${xe.join(", ")} },`}).join(`
219
- `);return`export const ${D} = defineModel({
220
- name: '${D}',
221
- table: '${d}',
222
- primaryKey: '${E}',
223
- attributes: {
224
- ${V}
225
- },
226
- })
227
- `}async function v(d={}){let h=e.dialect||"postgres",D=i(),E=d.tables?.length?d.tables:await as(D,h),V=[];for(let Ne of E){let xe=await Ei(D,h,Ne);if(!xe.length)continue;V.push({table:Ne,modelName:Be(Ne),primaryKey:xe.find((Fe)=>Fe.isPrimaryKey)?.name??"id",columns:xe,source:ze(Ne,xe)})}return V}function Fr(d,h,D){if(D?.enumValues&&D.enumValues.length>0)return"enum";let E=String(d||"").toLowerCase().trim(),V=E.replace(/\(.*$/,"").replace(/\s+/g," ").trim();if(r(h)&&/^tinyint\(1\)/.test(E))return"boolean";if(/^bool/.test(V))return"boolean";if(V==="int8"||V==="bigint"||V==="bigserial")return"bigint";if(/^(?:int|integer|smallint|mediumint|serial|int2|int4|tinyint)/.test(V))return"integer";if(/^(?:varchar|character varying|nvarchar|nchar|char|character|bpchar)/.test(V)){let Ne=E.match(/\((\d+)\)/),xe=Ne?Number(Ne[1]):void 0;if(r(h))return"string";return xe!==void 0&&xe>255?"text":"string"}if(/text|clob/.test(V))return"text";if(V==="float8"||/^double/.test(V))return"double";if(/^(?:real|float4|float)/.test(V))return"float";if(/^(?:numeric|decimal|money)/.test(V))return"decimal";if(V==="date")return"date";if(V==="timestamptz"||/\bwith time zone\b/.test(E))return"timestamptz";if(/^(?:timestamp|datetime)/.test(V))return"datetime";if(/^time/.test(V))return"string";if(/json/.test(V))return"json";if(/^enum/.test(V))return"enum";return"string"}function $i(d,h,D){return Fr(String(h||d||""),"mysql",{enumValues:D})}function Ri(d){let h=String(d||"").trim().match(/^varchar\((\d+)\)/i);if(!h)return;let D=Number(h[1]);return Number.isSafeInteger(D)&&D>0?D:void 0}function dr(d){let h=String(d??"").toLowerCase().trim();if(h==="cascade"||h==="restrict"||h==="set null")return h;return}async function xi(d,h){let D=await d.unsafe(`PRAGMA table_info(${JSON.stringify(h)})`),E=await d.unsafe(`PRAGMA index_list(${JSON.stringify(h)})`),V=await d.unsafe(`PRAGMA foreign_key_list(${JSON.stringify(h)})`),Ne=await d.unsafe("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = ?",[h]),xe=String(Ne?.[0]?.sql??""),Fe=new Map;for(let bt of V)Fe.set(String(bt.from),{table:String(bt.table),column:String(bt.to??"id"),onDelete:dr(bt.on_delete),onUpdate:dr(bt.on_update)});let Ie=[],Ve=new Set;for(let bt of E){let pt=String(bt.origin??""),xt=String(bt.name??"");if(pt==="pk"||xt.startsWith("sqlite_autoindex_"))continue;let Ht=(await d.unsafe(`PRAGMA index_info(${JSON.stringify(xt)})`)).map((Ue)=>String(Ue.name)).filter(Boolean);if(Ht.length===0)continue;let Le=Number(bt.unique)===1;if(Le&&Ht.length===1)Ve.add(Ht[0]);Ie.push({name:xt,columns:Ht,type:Le?"unique":"index"})}let gt=D.map((bt)=>{let pt=String(bt.name),xt=Ni(xe,pt),jt=Number(bt.pk)>0,Ht=bt.dflt_value,Le=Ht!==null&&Ht!==void 0;return{name:pt,type:Fr(String(bt.type??""),"sqlite",{enumValues:xt}),isPrimaryKey:jt,isUnique:Ve.has(pt),isNullable:jt?!1:Number(bt.notnull)===0,hasDefault:Le,defaultValue:Le?Ur(Ht):void 0,enumValues:xt,references:Fe.get(pt)}});return{table:h,columns:gt,indexes:Ie}}function Ni(d,h){if(!d)return;let D=new RegExp(`(?:"${h}"|\`${h}\`|\\b${h}\\b)\\s+IN\\s*\\(([^)]*)\\)`,"i"),E=d.match(D);if(!E)return;let V=E[1].split(",").map((Ne)=>Ne.trim().replace(/^'(.*)'$/s,"$1").replace(/''/g,"'")).filter((Ne)=>Ne.length>0);return V.length>0?V:void 0}function Ur(d){if(typeof d==="number"||typeof d==="boolean")return d;return String(d)}async function os(d){let h=await d.unsafe(`SELECT t.typname AS type_name, e.enumlabel AS label
228
- FROM pg_type t
229
- JOIN pg_enum e ON e.enumtypid = t.oid
230
- JOIN pg_namespace n ON n.oid = t.typnamespace
231
- WHERE n.nspname = 'public'
232
- ORDER BY t.typname, e.enumsortorder`),D=new Map;for(let E of h){let V=String(E.type_name),Ne=D.get(V);if(Ne)Ne.push(String(E.label));else D.set(V,[String(E.label)])}return D}function ki(d,h,D){let E=D.get(h),V=Fr(String(d||h||""),"postgres",{enumValues:E});return E?{type:V,enumValues:E,enumTypeName:h}:{type:V}}async function Bi(d,h,D){let E=D??await os(d),V=await d.unsafe(`SELECT c.column_name, c.data_type, c.udt_name, c.is_nullable, c.column_default, c.character_maximum_length,
233
- (SELECT COUNT(*) FROM information_schema.table_constraints tc
234
- JOIN information_schema.key_column_usage k ON k.constraint_name = tc.constraint_name
235
- WHERE tc.constraint_type = 'PRIMARY KEY' AND tc.table_name = c.table_name AND k.column_name = c.column_name) AS is_pk
236
- FROM information_schema.columns c
237
- WHERE c.table_name = $1 AND c.table_schema = 'public'
238
- ORDER BY c.ordinal_position`,[h]),Ne=await d.unsafe(`SELECT i.relname AS index_name, ix.indisunique AS is_unique, ix.indisprimary AS is_primary,
239
- a.attname AS column_name, array_position(ix.indkey, a.attnum) AS ord,
240
- pg_get_expr(ix.indpred, ix.indrelid) AS where_clause
241
- FROM pg_class t
242
- JOIN pg_index ix ON t.oid = ix.indrelid
243
- JOIN pg_class i ON i.oid = ix.indexrelid
244
- JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(ix.indkey)
245
- WHERE t.relname = $1 AND t.relkind = 'r'
246
- ORDER BY i.relname, ord`,[h]),xe=await d.unsafe(`SELECT kcu.column_name, ccu.table_name AS ref_table, ccu.column_name AS ref_column,
247
- tc.constraint_name, rc.delete_rule, rc.update_rule
248
- FROM information_schema.table_constraints tc
249
- JOIN information_schema.key_column_usage kcu ON kcu.constraint_name = tc.constraint_name
250
- JOIN information_schema.constraint_column_usage ccu ON ccu.constraint_name = tc.constraint_name
251
- JOIN information_schema.referential_constraints rc ON rc.constraint_name = tc.constraint_name
252
- WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_name = $1 AND tc.table_schema = 'public'`,[h]),Fe=new Map,Ie=new Map;for(let pt of xe){let xt=String(pt.constraint_name);Ie.set(xt,(Ie.get(xt)??0)+1)}for(let pt of xe){let xt=String(pt.column_name),jt=Fe.get(xt),Ht=String(pt.constraint_name),Le=Ie.get(Ht)===1?[...new Set([...jt?.constraintNames??[],Ht])]:jt?.constraintNames;Fe.set(xt,jt?{...jt,constraintNames:Le}:{table:String(pt.ref_table),column:String(pt.ref_column??"id"),onDelete:dr(pt.delete_rule),onUpdate:dr(pt.update_rule),constraintNames:Le})}let{indexes:Ve,uniqueColumns:gt}=ls(h,Ne.map((pt)=>({indexName:String(pt.index_name),isUnique:pt.is_unique===!0||pt.is_unique==="t",isPrimary:pt.is_primary===!0||pt.is_primary==="t",column:String(pt.column_name),where:pt.where_clause?String(pt.where_clause):void 0}))),bt=V.map((pt)=>{let xt=String(pt.column_name),jt=Number(pt.is_pk)>0,Ht=pt.column_default==null?null:String(pt.column_default),Le=Ht!=null&&/nextval\(/i.test(Ht),Ue=Ht!=null&&!Le;return{name:xt,...ki(String(pt.data_type??""),pt.udt_name==null?"":String(pt.udt_name),E),isPrimaryKey:jt,isUnique:gt.has(xt),isNullable:jt?!1:String(pt.is_nullable).toUpperCase()==="YES",hasDefault:Ue,defaultValue:Ue?Ur(Ht):void 0,references:Fe.get(xt)}});return{table:h,columns:bt,indexes:Ve}}async function Ai(d,h){let D=await d.unsafe(`SELECT column_name, data_type, column_type, is_nullable, column_default, column_key
253
- FROM information_schema.columns
254
- WHERE table_name = ? AND table_schema = DATABASE()
255
- ORDER BY ordinal_position`,[h]),E=await d.unsafe(`SELECT index_name, non_unique, seq_in_index, column_name
256
- FROM information_schema.statistics
257
- WHERE table_name = ? AND table_schema = DATABASE()
258
- ORDER BY index_name, seq_in_index`,[h]),V=await d.unsafe(`SELECT kcu.column_name, kcu.referenced_table_name AS ref_table, kcu.referenced_column_name AS ref_column,
259
- kcu.constraint_name, rc.delete_rule, rc.update_rule
260
- FROM information_schema.key_column_usage kcu
261
- JOIN information_schema.referential_constraints rc
262
- ON rc.constraint_name = kcu.constraint_name AND rc.constraint_schema = kcu.table_schema
263
- WHERE kcu.table_name = ? AND kcu.table_schema = DATABASE() AND kcu.referenced_table_name IS NOT NULL`,[h]),Ne=new Map,xe=new Map;for(let gt of V){let bt=String(gt.constraint_name??gt.CONSTRAINT_NAME);xe.set(bt,(xe.get(bt)??0)+1)}for(let gt of V){let bt=String(gt.column_name??gt.COLUMN_NAME),pt=Ne.get(bt),xt=String(gt.constraint_name??gt.CONSTRAINT_NAME),jt=xe.get(xt)===1?[...new Set([...pt?.constraintNames??[],xt])]:pt?.constraintNames;Ne.set(bt,pt?{...pt,constraintNames:jt}:{table:String(gt.ref_table??gt.REF_TABLE),column:String(gt.ref_column??gt.REF_COLUMN??"id"),onDelete:dr(gt.delete_rule??gt.DELETE_RULE),onUpdate:dr(gt.update_rule??gt.UPDATE_RULE),constraintNames:jt})}let{indexes:Fe,uniqueColumns:Ie}=ls(h,E.map((gt)=>({indexName:String(gt.index_name??gt.INDEX_NAME),isUnique:Number(gt.non_unique??gt.NON_UNIQUE)===0,isPrimary:String(gt.index_name??gt.INDEX_NAME).toUpperCase()==="PRIMARY",column:String(gt.column_name??gt.COLUMN_NAME)}))),Ve=D.map((gt)=>{let bt=String(gt.column_name??gt.COLUMN_NAME),pt=String(gt.column_type??gt.COLUMN_TYPE??""),xt=Oi(pt),Ht=String(gt.column_key??gt.COLUMN_KEY??"").toUpperCase()==="PRI",Le=gt.column_default??gt.COLUMN_DEFAULT,Ue=Le!=null;return{name:bt,type:$i(gt.data_type??gt.DATA_TYPE,pt,xt),isPrimaryKey:Ht,isUnique:Ie.has(bt),isNullable:Ht?!1:String(gt.is_nullable??gt.IS_NULLABLE).toUpperCase()==="YES",hasDefault:Ue,defaultValue:Ue?Ur(Le):void 0,enumValues:xt,maxLength:Ri(pt),references:Ne.get(bt)}});return{table:h,columns:Ve,indexes:Fe}}function Oi(d){let h=d.match(/^enum\((.*)\)$/i);if(!h)return;return h[1].split(",").map((D)=>D.trim().replace(/^'(.*)'$/s,"$1").replace(/''/g,"'")).filter((D)=>D.length>0)}function ls(d,h){let D=new Map;for(let Ne of h){if(Ne.isPrimary)continue;let xe=D.get(Ne.indexName)??{isUnique:Ne.isUnique,isPrimary:Ne.isPrimary,columns:[],where:Ne.where};xe.columns.push(Ne.column),D.set(Ne.indexName,xe)}let E=[],V=new Set;for(let[Ne,xe]of D){if(xe.columns.length===0)continue;if(xe.isUnique&&xe.columns.length===1)V.add(xe.columns[0]);E.push({name:Ne,columns:xe.columns,type:xe.isUnique?"unique":"index",where:xe.where})}return{indexes:E,uniqueColumns:V}}async function us(d,h={}){let D=d||e.dialect||"postgres",E=i(),Ne=((h.tables?.length)?h.tables:await as(E,D)).filter((Ie)=>Ie!=="migrations"),xe=D==="postgres"?await os(E):void 0,Fe=[];for(let Ie of Ne){let Ve;if(D==="sqlite")Ve=await xi(E,Ie);else if(D==="postgres")Ve=await Bi(E,Ie,xe);else Ve=await Ai(E,Ie);if(Ve.columns.length>0)Fe.push(Ve)}return{dialect:D,tables:Fe}}import{existsSync as Qr,mkdirSync as Mi,writeFileSync as Ci}from"fs";import{dirname as cs,join as jr}from"path";import ds from"process";function Ii(d){let h=d;while(h!==cs(h)){if(Qr(jr(h,"package.json")))return h;h=cs(h)}return ds.cwd()}async function le(d,h={}){let D=Ii(ds.cwd()),E=h.dir||jr(D,"app/Models");if(!Qr(E))Mi(E,{recursive:!0}),console.log(`-- Created models directory: ${E}`);let V=d.charAt(0).toUpperCase()+d.slice(1),Ne=h.table||`${d.toLowerCase()}s`,xe=`${V}.ts`,Fe=jr(E,xe);if(Qr(Fe))throw console.error(`-- Model already exists: ${Fe}`),Error(`Model already exists: ${Fe}`);let Ve=h.timestamps!==!1?` created_at: { validation: { rule: v.date() } },
264
- updated_at: { validation: { rule: v.date() } },`:"",gt=`import { v } from '@stacksjs/ts-validation'
265
- import { defineModel } from 'bun-query-builder'
266
-
267
- const model = defineModel({
268
- name: '${V}',
269
- table: '${Ne}',
270
- primaryKey: 'id',
271
- attributes: {
272
- id: { validation: { rule: v.integer() } },
273
- ${Ve}
274
- // Add your model attributes here
275
- // Example:
276
- // name: { validation: { rule: v.string() } },
277
- // email: { unique: true, validation: { rule: v.string().email() } },
278
- // age: { default: 0, validation: { rule: v.number().min(0) } },
279
- },
280
- })
281
-
282
- export default model
283
- `;Ci(Fe,gt),console.log(`-- \u2713 Created model: ${Fe}`),console.log(`-- Table: ${Ne}`)}async function me(d,h={}){return b(d,h)}import{existsSync as ys,readFileSync as _i,unlinkSync as Li}from"fs";import{join as qi}from"path";import{existsSync as Pi}from"fs";import{dirname as fs,isAbsolute as vi,join as gs}from"path";import ms from"process";function Wr(d=ms.cwd()){let h=d;while(h!==fs(h)){if(Pi(gs(h,"package.json")))return h;h=fs(h)}return ms.cwd()}function tr(d,h="database/migrations"){let D=h||"database/migrations";return vi(D)?D:gs(d??Wr(),D)}function Ki(d){let h=[],D="",E=null;for(let V=0;V<d.length;V++){let Ne=d[V];if(E){if(D+=Ne,Ne===E)if(d[V+1]===E)D+=d[V+1],V++;else E=null;continue}if(Ne==="'"||Ne==='"'||Ne==="`"){E=Ne,D+=Ne;continue}if(Ne==="-"&&d[V+1]==="-"){let xe=d.indexOf(`
284
- `,V);V=xe===-1?d.length:xe;continue}if(Ne==="/"&&d[V+1]==="*"){let xe=d.indexOf("*/",V+2);V=xe===-1?d.length:xe+1;continue}if(Ne===";"){if(D.trim())h.push(D.trim());D="";continue}D+=Ne}if(D.trim())h.push(D.trim());return h}function Fi(d,h=e.dialect){let D=(Ne)=>r(h)?`\`${Ne}\``:`"${Ne}"`,E=[],V=[];for(let Ne of Ki(d)){let xe;if(xe=/^CREATE\s+TABLE\s+(?:IF\s+NOT\s+EXISTS\s+)?["`']?(\w+)["`']?/i.exec(Ne))E.push(`DROP TABLE IF EXISTS ${D(xe[1])}`);else if(xe=/^ALTER\s+TABLE\s+["`']?(\w+)["`']?\s+ADD\s+CONSTRAINT\s+["`']?(\w+)["`']?([\s\S]*)$/i.exec(Ne))if(h==="sqlite")V.push(Ne);else if(r(h)&&/\bFOREIGN\s+KEY\b/i.test(xe[3]??""))E.push(`ALTER TABLE ${D(xe[1])} DROP FOREIGN KEY ${D(xe[2])}`);else E.push(`ALTER TABLE ${D(xe[1])} DROP CONSTRAINT ${D(xe[2])}`);else if(xe=/^ALTER\s+TABLE\s+["`']?(\w+)["`']?\s+ADD\s+(?:COLUMN\s+["`']?(\w+)["`']?|["`'](\w+)["`']|(\w+))/i.exec(Ne)){let Fe=xe[2]??xe[3]??xe[4];if(xe[4]&&/^(?:PRIMARY|UNIQUE|INDEX|KEY|FOREIGN|CHECK|FULLTEXT|SPATIAL)$/i.test(xe[4]))V.push(Ne);else E.push(`ALTER TABLE ${D(xe[1])} DROP COLUMN ${D(Fe)}`)}else if(xe=/^CREATE\s+(?:UNIQUE\s+)?INDEX\s+(?:IF\s+NOT\s+EXISTS\s+)?["`']?(\w+)["`']?(?:\s+ON\s+["`']?(\w+)["`']?)?/i.exec(Ne))E.push(r(h)&&xe[2]?`DROP INDEX ${D(xe[1])} ON ${D(xe[2])}`:`DROP INDEX IF EXISTS ${D(xe[1])}`);else V.push(Ne)}return{down:E.reverse(),skipped:V}}async function he(d={}){let h=d.steps||1,D=d.reverseSchema!==!1;console.log("-- Rolling back migrations"),console.log(`-- Steps: ${h}`),console.log();try{let E=i(),V=[];try{V=await E.unsafe(`
285
- SELECT migration, executed_at
286
- FROM migrations
287
- ORDER BY executed_at DESC, migration DESC
288
- `)}catch(Ie){console.log("-- Migrations table not found. Nothing to rollback.",Ie);return}if(V.length===0){console.log("-- No migrations to rollback");return}let Ne=V.slice(0,h);console.log(`-- Found ${V.length} executed migrations`),console.log(`-- Rolling back ${Ne.length} migration(s):`),console.log();for(let Ie of Ne)console.log(` - ${Ie.migration}`);console.log();let xe=tr(void 0,e.migrationDir),Fe=!1;for(let Ie of Ne)try{let Ve=qi(xe,Ie.migration);if(D&&ys(Ve)){let bt=_i(Ve,"utf8"),{down:pt,skipped:xt}=Fi(bt);for(let jt of pt)await E.unsafe(jt),console.log(`-- \u21A9 ${jt}`),Fe=!0;if(xt.length>0)console.log(`-- \u26A0\uFE0F ${xt.length} statement(s) in ${Ie.migration} could not be auto-reversed (data/complex DDL) \u2014 reverse manually.`)}let gt=`DELETE FROM migrations WHERE migration = ${t(1)}`;if(await E.unsafe(gt,[Ie.migration]),console.log(`-- \u2713 Removed migration record: ${Ie.migration}`),d.deleteFiles&&ys(Ve))Li(Ve),console.log(`-- \uD83D\uDDD1\uFE0F Deleted migration file: ${Ie.migration}`)}catch(Ve){throw console.error(`-- \u2717 Failed to rollback migration ${Ie.migration}:`,Ve),Ve}if(console.log(),D)console.log(Fe?"-- \u2713 Reverse DDL executed for the rolled-back migration(s).":"-- \u26A0\uFE0F No reversible DDL found; only migration records were removed.");else console.log("-- \u26A0\uFE0F reverseSchema disabled: only migration records were removed.")}catch(E){throw console.error("-- Rollback failed:",E),E}}import{existsSync as Ui,readdirSync as Qi}from"fs";async function I(){let d=e.dialect||"postgres",h=f(d),D=tr(void 0,e.migrationDir);if(console.log("-- Migration Status"),console.log(`-- Dialect: ${d}`),console.log(`-- SQL directory: ${D}`),console.log(),!Ui(D))return console.log("-- No SQL directory found. No migrations have been created yet."),[];let V=Qi(D).filter((Ne)=>Ne.endsWith(".sql")).sort();if(V.length===0)return console.log("-- No migration files found"),[];try{let Ne=i(),xe=[];try{xe=await Ne.unsafe(h.getExecutedMigrationsQuery())}catch(bt){console.log("-- Migrations table not found. All migrations are pending.",bt),console.log()}let Fe=new Map(xe.map((bt)=>[bt.migration,bt.executed_at])),Ie=V.map((bt)=>({file:bt,status:Fe.has(bt)?"executed":"pending",executedAt:Fe.get(bt)})),Ve=Ie.filter((bt)=>bt.status==="executed"),gt=Ie.filter((bt)=>bt.status==="pending");if(console.log(`-- Total migrations: ${V.length}`),console.log(`-- Executed: ${Ve.length}`),console.log(`-- Pending: ${gt.length}`),console.log(),Ve.length>0){console.log("\u2713 Executed Migrations:");for(let bt of Ve)console.log(` - ${bt.file} ${bt.executedAt?`(${new Date(bt.executedAt).toLocaleString()})`:""}`);console.log()}if(gt.length>0){console.log("\u25CB Pending Migrations:");for(let bt of gt)console.log(` - ${bt.file}`);console.log()}return Ie}catch(Ne){throw console.error("-- Failed to get migration status:",Ne),Ne}}async function ge(){return I()}import{readdirSync as ji}from"fs";import{extname as Vr,join as ps}from"path";import Wi from"process";async function L(d,h={}){let D=h.dir||ps(Wi.cwd(),"app/Models");try{let E=ji(D),V=E.find((gt)=>gt.replace(Vr(gt),"").toLowerCase()===d.toLowerCase());if(!V){console.error(`Model "${d}" not found in ${D}`),console.log(`Available models: ${E.filter((gt)=>[".ts",".js"].includes(Vr(gt))).map((gt)=>gt.replace(Vr(gt),"")).join(", ")}`);return}let xe=await import(ps(D,V)),Fe=xe.default||xe[Object.keys(xe)[0]];if(!Fe||!Fe.name){console.error(`Invalid model file: ${V}`);return}let Ie={name:Fe.name,table:Fe.table||`${Fe.name.toLowerCase()}s`,primaryKey:Fe.primaryKey||"id",attributes:Fe.attributes||{},relations:Fe.relations,scopes:Fe.scopes,indexes:Fe.indexes,timestamps:Fe.timestamps!==!1,softDeletes:Fe.softDeletes===!0},Ve=[];if(Fe.beforeCreate)Ve.push("beforeCreate");if(Fe.afterCreate)Ve.push("afterCreate");if(Fe.beforeUpdate)Ve.push("beforeUpdate");if(Fe.afterUpdate)Ve.push("afterUpdate");if(Fe.beforeDelete)Ve.push("beforeDelete");if(Fe.afterDelete)Ve.push("afterDelete");if(Ve.length>0)Ie.hooks=Ve;if(h.json)return console.log(JSON.stringify(Ie,null,2)),Ie;console.log(`
289
- \uD83D\uDCE6 Model: ${Ie.name}`),console.log("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501"),console.log(`Table: ${Ie.table}`),console.log(`Primary Key: ${Ie.primaryKey}`),console.log(`Timestamps: ${Ie.timestamps?"\u2713":"\u2717"}`),console.log(`Soft Deletes: ${Ie.softDeletes?"\u2713":"\u2717"}`),console.log(`
290
- \uD83D\uDCCB Attributes (${Object.keys(Ie.attributes).length}):`);for(let[gt,bt]of Object.entries(Ie.attributes)){let pt=bt.type||"string",xt=bt.required?"(required)":"",jt=bt.unique?"(unique)":"",Ht=bt.default!==void 0?`= ${JSON.stringify(bt.default)}`:"";console.log(` \u2022 ${gt}: ${pt} ${xt} ${jt} ${Ht}`.trim())}if(Ie.relations&&Object.keys(Ie.relations).length>0){console.log(`
291
- \uD83D\uDD17 Relations (${Object.keys(Ie.relations).length}):`);for(let[gt,bt]of Object.entries(Ie.relations)){let pt=bt.type||"unknown",xt=bt.model||bt.table||"unknown";console.log(` \u2022 ${gt}: ${pt} \u2192 ${xt}`)}}if(Ie.scopes&&Object.keys(Ie.scopes).length>0){console.log(`
292
- \uD83D\uDD0D Scopes (${Object.keys(Ie.scopes).length}):`);for(let gt of Object.keys(Ie.scopes))console.log(` \u2022 ${gt}()`)}if(Ie.hooks&&Ie.hooks.length>0){console.log(`
293
- \uD83E\uDE9D Hooks (${Ie.hooks.length}):`);for(let gt of Ie.hooks)console.log(` \u2022 ${gt}`)}if(Ie.indexes&&Ie.indexes.length>0){console.log(`
294
- \uD83D\uDCC7 Indexes (${Ie.indexes.length}):`);for(let gt of Ie.indexes){let bt=Array.isArray(gt.columns)?gt.columns.join(", "):gt.columns,pt=gt.unique?"(unique)":"";console.log(` \u2022 ${gt.name||"unnamed"}: [${bt}] ${pt}`.trim())}}return console.log(),Ie}catch(E){throw console.error(`Error loading model "${d}":`,E.message),E}}async function pe(){let h=await i().ping();return console.log(h?"OK":"NOT READY"),h}import{readdirSync as Vi,readFileSync as hs,statSync as Ji}from"fs";import{extname as Ts,join as Hi}from"path";async function K(d,h={}){let D=[];try{let E=Ji(d),V=[];if(E.isDirectory())V=Vi(d).filter((Ie)=>Ts(Ie)===".sql").map((Ie)=>Hi(d,Ie));else if(E.isFile()&&Ts(d)===".sql")V=[d];else return console.error("Path must be a .sql file or directory containing .sql files"),D;if(V.length===0)return console.log("No .sql files found"),D;if(h.verbose)console.log(`Analyzing ${V.length} SQL file(s)...
295
- `);for(let Fe of V)try{let Ie=hs(Fe,"utf8").trim();if(!Ie){if(h.verbose)console.log(`\u2298 ${Fe}: empty file`);continue}if(h.verbose)console.log(`\uD83D\uDCC4 ${Fe}`),console.log(` Query: ${Ie.substring(0,60)}${Ie.length>60?"...":""}`);let Ve=await n`EXPLAIN ${n.unsafe(Ie)}`;if(D.push({file:Fe,query:Ie,plan:Array.isArray(Ve)?Ve:[Ve]}),h.verbose&&!h.json){if(console.log(" Plan:"),Array.isArray(Ve))for(let gt of Ve)if(typeof gt==="string")console.log(` ${gt}`);else if(gt["QUERY PLAN"])console.log(` ${gt["QUERY PLAN"]}`);else if(gt.plan)console.log(` ${JSON.stringify(gt.plan)}`);else console.log(` ${JSON.stringify(gt)}`);console.log()}}catch(Ie){if(D.push({file:Fe,query:hs(Fe,"utf8").trim(),plan:[],error:Ie.message}),h.verbose)console.log(` \u2717 Error: ${Ie.message}
296
- `)}let Ne=D.filter((Fe)=>!Fe.error).length,xe=D.filter((Fe)=>Fe.error).length;if(h.verbose)console.log("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501"),console.log(`Summary: ${Ne} successful, ${xe} failed`);if(h.json)console.log(JSON.stringify(D,null,2));return D}catch(E){throw console.error("Error explaining queries:",E.message),E}}import{writeFileSync as Yi}from"fs";import{join as Gi}from"path";import zi from"process";async function F(d={}){let h=d.dir||Gi(zi.cwd(),"app/Models"),D=d.format||"mermaid";try{let E=await u({modelsDir:h});if(!E||Object.keys(E).length===0)return console.error("No models found"),"";let V="";if(D==="mermaid")V=Xi(E);else if(D==="dot")V=Zi(E);else return console.error(`Unsupported format: ${D}`),"";if(d.output)Yi(d.output,V,"utf8"),console.log(`\u2713 Diagram written to: ${d.output}`);else console.log(V);return V}catch(E){throw console.error("Error generating diagram:",E.message),E}}function Xi(d){let h=["erDiagram"];for(let[D,E]of Object.entries(d)){let V=E.table||`${D.toLowerCase()}s`,Ne=E.attributes||{};h.push(` ${V} {`);for(let[xe,Fe]of Object.entries(Ne)){let Ie=Fe.type||"string",Ve=E.primaryKey===xe?"PK":"",gt=Fe.unique?"UK":"",bt=[Ve,gt].filter(Boolean).join(","),pt=bt?` "${bt}"`:"";h.push(` ${Ie} ${xe}${pt}`)}h.push(" }")}for(let[D,E]of Object.entries(d)){let V=E.table||`${D.toLowerCase()}s`,Ne=E.relations||{};for(let[xe,Fe]of Object.entries(Ne)){let{type:Ie,model:Ve}=Fe,gt=d[Ve]?.table||`${Ve?.toLowerCase()}s`||"unknown",bt="";if(Ie==="hasOne")bt="||--||";else if(Ie==="hasMany")bt="||--o{";else if(Ie==="belongsTo")bt="}o--||";else if(Ie==="belongsToMany"||Ie==="manyToMany")bt="}o--o{";else bt="||--||";h.push(` ${V} ${bt} ${gt} : "${xe}"`)}}return h.join(`
297
- `)}function Zi(d){let h=["digraph schema {"," rankdir=LR;"," node [shape=record];",""];for(let[D,E]of Object.entries(d)){let V=E.table||`${D.toLowerCase()}s`,Ne=E.attributes||{},xe=[];for(let[Ie,Ve]of Object.entries(Ne)){let gt=Ve.type||"string",bt=E.primaryKey===Ie?" (PK)":"",pt=Ve.unique?" (UK)":"";xe.push(`${Ie}: ${gt}${bt}${pt}`)}let Fe=`${xe.join("\\l")}\\l`;h.push(` ${V} [label="{${V}|${Fe}}"];`)}h.push("");for(let[D,E]of Object.entries(d)){let V=E.table||`${D.toLowerCase()}s`,Ne=E.relations||{};for(let[xe,Fe]of Object.entries(Ne)){let{type:Ie,model:Ve}=Fe,gt=d[Ve]?.table||`${Ve?.toLowerCase()}s`||"unknown",bt="";if(Ie==="hasOne")bt="arrowhead=none, arrowtail=normal";else if(Ie==="hasMany")bt="arrowhead=crow, arrowtail=none";else if(Ie==="belongsTo")bt="arrowhead=normal, arrowtail=none";else if(Ie==="belongsToMany"||Ie==="manyToMany")bt="arrowhead=crow, arrowtail=crow";h.push(` ${V} -> ${gt} [label="${xe}", ${bt}];`)}}return h.push("}"),h.join(`
298
- `)}import{existsSync as Ir,mkdirSync as ea,readdirSync as ta,writeFileSync as na}from"fs";import{dirname as bs,join as rr}from"path";import Dr from"process";function Pr(d){let h=d;while(h!==bs(h)){if(Ir(rr(h,"package.json")))return h;h=bs(h)}return Dr.cwd()}async function Ss(d){if(!Ir(d))return console.log(`-- Seeders directory not found: ${d}`),[];let D=ta(d).sort((V,Ne)=>V.localeCompare(Ne)).filter((V)=>(V.endsWith(".ts")||V.endsWith(".js"))&&V!=="index.ts"&&V!=="index.js"),E=[];for(let V of D){let Ne=rr(d,V);try{let xe=await import(Ne),Fe=xe.default||xe[Object.keys(xe)[0]];if(Fe&&typeof Fe==="function"){let Ie=new Fe;if(Ie&&typeof Ie.run==="function")E.push({name:V.replace(/\.(ts|js)$/,""),className:String(Fe.name||""),instance:Ie})}}catch(xe){console.error(`-- Failed to load seeder ${V}:`,xe)}}return E.sort((V,Ne)=>V.instance.order-Ne.instance.order),E}async function R(d={}){let h=Pr(Dr.cwd()),D=d.seedersDir||rr(h,"database/seeders"),E=d.verbose??!0;if(E)console.log("-- Running seeders..."),console.log(`-- Seeders directory: ${D}`);let V=await Ss(D);if(V.length===0){console.log("-- No seeders found");return}if(E)console.log(`-- Found ${V.length} seeder(s)`);let Ne=i();for(let{name:xe,instance:Fe}of V)try{if(E)console.log(`-- Seeding: ${xe}`);if(await Fe.run(Ne),E)console.log(`-- \u2713 Seeded: ${xe}`)}catch(Ie){throw console.error(`-- \u2717 Failed to seed ${xe}:`,Ie),Ie}if(E)console.log("-- All seeders completed successfully")}async function j(d,h={}){let D=Pr(Dr.cwd()),E=rr(D,"database/seeders"),V=h.verbose??!0;if(V)console.log(`-- Running seeder: ${d}`);let Ne=await Ss(E),xe=Ne.find((Ie)=>Ie.className===d)??Ne.find((Ie)=>Ie.name===d);if(!xe){let Ie=Ne.map((Ve)=>Ve.className||Ve.name).join(", ")||"none";throw console.error(`-- Seeder not found: ${d}. Available: ${Ie}`),Error(`Seeder not found: ${d}. Available: ${Ie}`)}let Fe=i();try{if(await xe.instance.run(Fe),V)console.log(`-- \u2713 Seeder completed: ${d}`)}catch(Ie){throw console.error(`-- \u2717 Seeder failed: ${d}`,Ie),Ie}}async function ye(d){let h=Pr(Dr.cwd()),D=rr(h,"database/seeders");if(!Ir(D))ea(D,{recursive:!0}),console.log(`-- Created seeders directory: ${D}`);let V=`${d.replace(/Seeder$/i,"")}Seeder`,Ne=`${V}.ts`,xe=rr(D,Ne);if(Ir(xe))throw console.error(`-- Seeder already exists: ${xe}`),Error(`Seeder already exists: ${xe}`);let Fe=`import type { QueryBuilder } from 'bun-query-builder'
299
- import { Seeder } from 'bun-query-builder'
300
- import { faker } from '@stacksjs/ts-faker'
301
-
302
- export default class ${V} extends Seeder {
303
- /**
304
- * Run the database seeds.
305
- */
306
- async run(qb: QueryBuilder): Promise<void> {
307
- console.log('Seeding: ${V}')
308
-
309
- // Example: Create 10 records with faker
310
- const records = Array.from({ length: 10 }, () => ({
311
- name: faker.person.fullName(),
312
- email: faker.internet.email().toLowerCase(),
313
- age: faker.number.int({ min: 18, max: 80 }),
314
- created_at: faker.date.past(),
315
- updated_at: new Date(),
316
- }))
317
-
318
- // Option 1: Kysely-style API
319
- await qb.insertInto('table_name').values(records).execute()
320
-
321
- // Option 2: Laravel-style API (equivalent)
322
- // await qb.table('table_name').insert(records).execute()
323
-
324
- console.log(\`\u2713 Seeded \${records.length} records\`)
325
-
326
- // For large datasets, use batch inserts:
327
- // const batchSize = 100
328
- // for (let i = 0; i < records.length; i += batchSize) {
329
- // const batch = records.slice(i, i + batchSize)
330
- // await qb.insertInto('table_name').values(batch).execute()
331
- // // Or: await qb.table('table_name').insert(batch).execute()
332
- // }
333
- }
334
-
335
- /**
336
- * Specify the order in which this seeder should run.
337
- * Lower numbers run first. Default is 100.
338
- */
339
- get order(): number {
340
- return 100
341
- }
342
- }
343
- `;na(xe,Fe),console.log(`-- \u2713 Created seeder: ${xe}`)}async function be(d={}){let h=Pr(Dr.cwd()),D=d.modelsDir||rr(h,"app/Models"),E=d.seedersDir||rr(h,"database/seeders"),V=d.verbose??!0;try{let{resetDatabase:Ne,generateMigration:xe,executeMigration:Fe}=await import("./chunk-hgkvabrq.js");if(V)console.log("-- Refreshing database...");if(await Ne(D),V)console.log("-- Running migrations...");if(await xe(D,{full:!0}),await Fe(),V)console.log("-- Running seeders...");if(await R({seedersDir:E,verbose:V}),V)console.log("-- \u2713 Database refreshed successfully")}catch(Ne){throw console.error("-- \u2717 Database refresh failed:",Ne),Ne}}function Te(d,h,D={}){let E=u({modelsDir:d}),V=$e(E);if(e.debug)e.debug.captureText=!0;let Ne=i({schema:V}),xe=Ne.selectFrom(h).limit(Number(D.limit||10)).toText?.()??"";return console.log(xe||"[query]"),{sql:xe,qb:Ne,schema:V}}async function we(d,h={}){let D=i(),E=h.params?JSON.parse(h.params):void 0,V=await D.unsafe(d,E);return console.log(JSON.stringify(V)),V}import{existsSync as ra}from"fs";import{dirname as ws,join as Ds}from"path";import Es from"process";function sa(d){let h=d;while(h!==ws(h)){if(ra(Ds(h,"package.json")))return h;h=ws(h)}return Es.cwd()}async function q(d){if(!d)d=Ds(sa(Es.cwd()),"app/Models");let h=e.dialect||"postgres";console.log("-- Validating Schema"),console.log(`-- Models directory: ${d}`),console.log(`-- Dialect: ${h}`),console.log();let D=[];try{let E=await u({modelsDir:d}),V=W(E,{dialect:h}),Ne=i(),xe=[];if(h==="sqlite")xe=(await Ne.unsafe(`
344
- SELECT name FROM sqlite_master
345
- WHERE type = 'table'
346
- AND name NOT LIKE 'sqlite_%'
347
- AND name != 'migrations'
348
- `)).map((gt)=>gt.name);else if(h==="postgres")xe=(await Ne.unsafe(`
349
- SELECT table_name
350
- FROM information_schema.tables
351
- WHERE table_schema = 'public'
352
- AND table_type = 'BASE TABLE'
353
- AND table_name != 'migrations'
354
- `)).map((gt)=>gt.table_name);else if(r(h))xe=(await Ne.unsafe(`
355
- SELECT table_name
356
- FROM information_schema.tables
357
- WHERE table_schema = DATABASE()
358
- AND table_type = 'BASE TABLE'
359
- AND table_name != 'migrations'
360
- `)).map((gt)=>gt.table_name);let Fe=V.tables.map((Ve)=>Ve.table);for(let Ve of Fe)if(!xe.includes(Ve))D.push({type:"missing_table",severity:"error",table:Ve,message:`Table '${Ve}' defined in models but not found in database`});for(let Ve of xe)if(!Fe.includes(Ve))D.push({type:"extra_table",severity:"warning",table:Ve,message:`Table '${Ve}' exists in database but not defined in models`});for(let Ve of V.tables){if(!xe.includes(Ve.table))continue;let gt=[];if(h==="sqlite")gt=(await Ne.unsafe(`PRAGMA table_info(${Ve.table})`)).map((jt)=>({name:jt.name,type:jt.type.toLowerCase()}));else if(h==="postgres")gt=(await Ne.unsafe(`
361
- SELECT column_name, data_type
362
- FROM information_schema.columns
363
- WHERE table_name = $1
364
- `,[Ve.table])).map((jt)=>({name:jt.column_name,type:jt.data_type.toLowerCase()}));else if(r(h))gt=(await Ne.unsafe(`
365
- SELECT column_name, data_type
366
- FROM information_schema.columns
367
- WHERE table_name = ?
368
- AND table_schema = DATABASE()
369
- `,[Ve.table])).map((jt)=>({name:jt.column_name,type:jt.data_type.toLowerCase()}));let bt=gt.map((xt)=>xt.name),pt=Ve.columns.map((xt)=>xt.name);for(let xt of Ve.columns)if(!bt.includes(xt.name))D.push({type:"missing_column",severity:"error",table:Ve.table,column:xt.name,expected:xt.type,message:`Column '${Ve.table}.${xt.name}' defined in model but not found in database`});for(let xt of gt)if(!pt.includes(xt.name))D.push({type:"extra_column",severity:"warning",table:Ve.table,column:xt.name,actual:xt.type,message:`Column '${Ve.table}.${xt.name}' exists in database but not defined in model`});for(let xt of Ve.columns){let jt=gt.find((Ht)=>Ht.name===xt.name);if(jt){let Ht=(ke)=>ke.toLowerCase().replace(/\(.*\)/,"").replace("integer","int").replace("varchar","text").replace("character varying","text").trim(),Le=Ht(xt.type),Ue=Ht(jt.type);if(Le!==Ue)D.push({type:"type_mismatch",severity:"warning",table:Ve.table,column:xt.name,expected:xt.type,actual:jt.type,message:`Column '${Ve.table}.${xt.name}' type mismatch: expected '${xt.type}', found '${jt.type}'`})}}}let Ie=D.filter((Ve)=>Ve.severity==="error").length===0;if(Ie&&D.length===0)console.log("\u2713 Schema is valid - no issues found"),console.log();else{console.log(`-- Found ${D.length} issue(s)`),console.log();let Ve=D.filter((bt)=>bt.severity==="error"),gt=D.filter((bt)=>bt.severity==="warning");if(Ve.length>0){console.log(`\u2717 Errors (${Ve.length}):`);for(let bt of Ve)console.log(` - ${bt.message}`);console.log()}if(gt.length>0){console.log(`\u26A0 Warnings (${gt.length}):`);for(let bt of gt)console.log(` - ${bt.message}`);console.log()}if(!Ie)console.log("-- Recommendation: Run migrations to sync the database schema"),console.log("-- qb migrate ./app/Models --apply")}return{valid:Ie,issues:D}}catch(E){throw console.error("-- Schema validation failed:",E),E}}async function Se(d){return q(d)}async function De(d={}){let h=Number(d.attempts||10),D=Number(d.delay||100),E=i();try{return await E.waitForReady({attempts:h,delayMs:D}),console.log("READY"),!0}catch{throw console.error("NOT READY"),Error("Database not ready")}}class T{driver;client;tableName;indexName;entityType;keyConditions=[];filterConditions=[];projectionAttrs=[];limitValue;scanForward=!0;consistentReadValue=!1;startKey;constructor(d){this.driver=c(d.config),this.client=d.client,this.tableName=d.config.tableName??""}table(d){return this.tableName=d,this}index(d){return this.indexName=d,this}entity(d){return this.entityType=d,this}whereKey(d,h,D){return this.keyConditions.push({attribute:d,operator:h,value:D}),this}wherePartitionKey(d,h){return this.whereKey(d,"=",h)}whereSortKey(d,h){return this.whereKey(d,"=",h)}whereSortKeyBeginsWith(d,h){return this.keyConditions.push({attribute:d,operator:"begins_with",value:h}),this}whereSortKeyBetween(d,h,D){return this.keyConditions.push({attribute:d,operator:"BETWEEN",values:[h,D]}),this}where(d,h,D){return this.filterConditions.push({attribute:d,operator:h,value:D}),this}whereEquals(d,h){return this.where(d,"=",h)}whereLessThan(d,h){return this.where(d,"<",h)}whereLessThanOrEqual(d,h){return this.where(d,"<=",h)}whereGreaterThan(d,h){return this.where(d,">",h)}whereGreaterThanOrEqual(d,h){return this.where(d,">=",h)}whereBetween(d,h,D){return this.filterConditions.push({attribute:d,operator:"BETWEEN",values:[h,D]}),this}whereBeginsWith(d,h){return this.filterConditions.push({attribute:d,operator:"begins_with",value:h}),this}whereContains(d,h){return this.where(d,"contains",h)}whereExists(d){return this.where(d,"attribute_exists")}whereNotExists(d){return this.where(d,"attribute_not_exists")}whereIn(d,h){return this.filterConditions.push({attribute:d,operator:"IN",values:h}),this}select(...d){return this.projectionAttrs.push(...d),this}limit(d){return this.limitValue=d,this}ascending(){return this.scanForward=!0,this}descending(){return this.scanForward=!1,this}consistentRead(d=!0){return this.consistentReadValue=d,this}startFrom(d){return this.startKey=d,this}buildQueryParams(){return this.driver.buildQueryParams({tableName:this.tableName,indexName:this.indexName,keyConditions:this.keyConditions,filterConditions:this.filterConditions.length>0?this.filterConditions:void 0,projectionAttributes:this.projectionAttrs.length>0?this.projectionAttrs:void 0,limit:this.limitValue,scanIndexForward:this.scanForward,exclusiveStartKey:this.startKey,consistentRead:this.consistentReadValue})}buildScanParams(){return this.driver.buildScanParams({tableName:this.tableName,indexName:this.indexName,filterConditions:this.filterConditions.length>0?this.filterConditions:void 0,projectionAttributes:this.projectionAttrs.length>0?this.projectionAttrs:void 0,limit:this.limitValue,exclusiveStartKey:this.startKey,consistentRead:this.consistentReadValue})}toQueryRequest(){let d=this.buildQueryParams(),h={TableName:d.tableName,ExpressionAttributeNames:{},ExpressionAttributeValues:{}};if(d.indexName)h.IndexName=d.indexName;let D=0;if(d.keyConditions.length>0){let E=[];for(let V of d.keyConditions){let Ne=`#key${D}`;if(h.ExpressionAttributeNames[Ne]=V.attribute,V.operator==="begins_with"){let xe=`:keyval${D}`;h.ExpressionAttributeValues[xe]=this.driver.marshall({v:V.value}).v,E.push(`begins_with(${Ne}, ${xe})`)}else if(V.operator==="BETWEEN"){let xe=`:keyval${D}a`,Fe=`:keyval${D}b`;h.ExpressionAttributeValues[xe]=this.driver.marshall({v:V.values?.[0]}).v,h.ExpressionAttributeValues[Fe]=this.driver.marshall({v:V.values?.[1]}).v,E.push(`${Ne} BETWEEN ${xe} AND ${Fe}`)}else{let xe=`:keyval${D}`;h.ExpressionAttributeValues[xe]=this.driver.marshall({v:V.value}).v,E.push(`${Ne} ${V.operator} ${xe}`)}D++}h.KeyConditionExpression=E.join(" AND ")}if(d.filterConditions&&d.filterConditions.length>0){let E=[];for(let V of d.filterConditions){let Ne=`#flt${D}`;if(h.ExpressionAttributeNames[Ne]=V.attribute,V.operator==="attribute_exists")E.push(`attribute_exists(${Ne})`);else if(V.operator==="attribute_not_exists")E.push(`attribute_not_exists(${Ne})`);else if(V.operator==="begins_with"||V.operator==="contains"){let xe=`:fltval${D}`;h.ExpressionAttributeValues[xe]=this.driver.marshall({v:V.value}).v,E.push(`${V.operator}(${Ne}, ${xe})`)}else if(V.operator==="BETWEEN"){let xe=`:fltval${D}a`,Fe=`:fltval${D}b`;h.ExpressionAttributeValues[xe]=this.driver.marshall({v:V.values?.[0]}).v,h.ExpressionAttributeValues[Fe]=this.driver.marshall({v:V.values?.[1]}).v,E.push(`${Ne} BETWEEN ${xe} AND ${Fe}`)}else if(V.operator==="IN"){let xe=(V.values??[]).map((Fe,Ie)=>`:fltval${D}_${Ie}`);V.values?.forEach((Fe,Ie)=>{h.ExpressionAttributeValues[`:fltval${D}_${Ie}`]=this.driver.marshall({v:Fe}).v}),E.push(`${Ne} IN (${xe.join(", ")})`)}else{let xe=`:fltval${D}`;h.ExpressionAttributeValues[xe]=this.driver.marshall({v:V.value}).v,E.push(`${Ne} ${V.operator} ${xe}`)}D++}h.FilterExpression=E.join(" AND ")}if(d.projectionAttributes&&d.projectionAttributes.length>0){let E=[];for(let V of d.projectionAttributes){let Ne=`#proj${D}`;h.ExpressionAttributeNames[Ne]=V,E.push(Ne),D++}h.ProjectionExpression=E.join(", ")}if(d.limit!==void 0)h.Limit=d.limit;if(d.scanIndexForward!==void 0)h.ScanIndexForward=d.scanIndexForward;if(d.exclusiveStartKey)h.ExclusiveStartKey=this.driver.marshall(d.exclusiveStartKey);if(d.consistentRead)h.ConsistentRead=d.consistentRead;if(Object.keys(h.ExpressionAttributeNames).length===0)delete h.ExpressionAttributeNames;if(Object.keys(h.ExpressionAttributeValues).length===0)delete h.ExpressionAttributeValues;return h}toScanRequest(){let d=this.buildScanParams(),h={TableName:d.tableName};if(d.indexName)h.IndexName=d.indexName;if(d.filterConditions&&d.filterConditions.length>0){let{expression:D,expressionAttributeNames:E,expressionAttributeValues:V}=this.driver.buildFilterExpression(d.filterConditions);h.FilterExpression=D,h.ExpressionAttributeNames=E,h.ExpressionAttributeValues=V}if(d.projectionAttributes&&d.projectionAttributes.length>0){let{expression:D,expressionAttributeNames:E}=this.driver.buildProjectionExpression(d.projectionAttributes);h.ProjectionExpression=D,h.ExpressionAttributeNames={...h.ExpressionAttributeNames,...E}}if(d.limit!==void 0)h.Limit=d.limit;if(d.exclusiveStartKey)h.ExclusiveStartKey=this.driver.marshall(d.exclusiveStartKey);if(d.consistentRead)h.ConsistentRead=d.consistentRead;return h}async query(){if(!this.client)throw Error("DynamoDB client not provided. Pass a client in options or use toQueryRequest() to get the request params.");let d=this.toQueryRequest(),h=await this.client.query(d);return{items:h.Items?.map((D)=>this.driver.unmarshall(D)),count:h.Count,scannedCount:h.ScannedCount,lastEvaluatedKey:h.LastEvaluatedKey?this.driver.unmarshall(h.LastEvaluatedKey):void 0,consumedCapacity:h.ConsumedCapacity}}async scan(){if(!this.client)throw Error("DynamoDB client not provided. Pass a client in options or use toScanRequest() to get the request params.");let d=this.toScanRequest(),h=await this.client.scan(d);return{items:h.Items?.map((D)=>this.driver.unmarshall(D)),count:h.Count,scannedCount:h.ScannedCount,lastEvaluatedKey:h.LastEvaluatedKey?this.driver.unmarshall(h.LastEvaluatedKey):void 0,consumedCapacity:h.ConsumedCapacity}}async getAll(){let d=[],h;do{if(h)this.startFrom(h);let D=this.keyConditions.length>0?await this.query():await this.scan();if(D.items)d.push(...D.items);h=D.lastEvaluatedKey}while(h);return d}async first(){return this.limit(1),(this.keyConditions.length>0?await this.query():await this.scan()).items?.[0]}async count(){if(!this.client)throw Error("DynamoDB client not provided");let d=this.keyConditions.length>0?this.toQueryRequest():this.toScanRequest();return d.Select="COUNT",(this.keyConditions.length>0?await this.client.query(d):await this.client.scan(d)).Count??0}reset(){return this.indexName=void 0,this.entityType=void 0,this.keyConditions=[],this.filterConditions=[],this.projectionAttrs=[],this.limitValue=void 0,this.scanForward=!0,this.consistentReadValue=!1,this.startKey=void 0,this}}class m{driver;client;tableName;itemData={};keyData={};updateExpressions={};conditionExpr;returnValuesOption="NONE";constructor(d){this.driver=c(d.config),this.client=d.client,this.tableName=d.config.tableName??""}table(d){return this.tableName=d,this}key(d){return this.keyData=d,this}item(d){return this.itemData=d,this}set(d,h){if(!this.updateExpressions.set)this.updateExpressions.set={};return this.updateExpressions.set[d]=h,this}setMany(d){if(!this.updateExpressions.set)this.updateExpressions.set={};return Object.assign(this.updateExpressions.set,d),this}remove(d){if(!this.updateExpressions.remove)this.updateExpressions.remove=[];return this.updateExpressions.remove.push(d),this}add(d,h){if(!this.updateExpressions.add)this.updateExpressions.add={};return this.updateExpressions.add[d]=h,this}deleteFromSet(d,h){if(!this.updateExpressions.delete)this.updateExpressions.delete={};return this.updateExpressions.delete[d]=h,this}condition(d){return this.conditionExpr=d,this}ifNotExists(d="pk"){return this.conditionExpr=`attribute_not_exists(${d})`,this}ifExists(d="pk"){return this.conditionExpr=`attribute_exists(${d})`,this}returnOld(){return this.returnValuesOption="ALL_OLD",this}returnNew(){return this.returnValuesOption="ALL_NEW",this}toPutRequest(){let d={TableName:this.tableName,Item:this.driver.marshall(this.itemData)};if(this.conditionExpr)d.ConditionExpression=this.conditionExpr;if(this.returnValuesOption!=="NONE")d.ReturnValues=this.returnValuesOption;return d}toUpdateRequest(){let d={TableName:this.tableName,Key:this.driver.marshall(this.keyData)},{expression:h,expressionAttributeNames:D,expressionAttributeValues:E}=this.driver.buildUpdateExpression(this.updateExpressions);if(h)d.UpdateExpression=h,d.ExpressionAttributeNames=D,d.ExpressionAttributeValues=E;if(this.conditionExpr)d.ConditionExpression=this.conditionExpr;if(this.returnValuesOption!=="NONE")d.ReturnValues=this.returnValuesOption;return d}toDeleteRequest(){let d={TableName:this.tableName,Key:this.driver.marshall(this.keyData)};if(this.conditionExpr)d.ConditionExpression=this.conditionExpr;if(this.returnValuesOption!=="NONE")d.ReturnValues=this.returnValuesOption;return d}toGetRequest(){return{TableName:this.tableName,Key:this.driver.marshall(this.keyData)}}async put(){if(!this.client)throw Error("DynamoDB client not provided");let d=this.toPutRequest(),h=await this.client.putItem(d);if(h.Attributes)return this.driver.unmarshall(h.Attributes);return}async update(){if(!this.client)throw Error("DynamoDB client not provided");let d=this.toUpdateRequest(),h=await this.client.updateItem(d);if(h.Attributes)return this.driver.unmarshall(h.Attributes);return}async delete(){if(!this.client)throw Error("DynamoDB client not provided");let d=this.toDeleteRequest(),h=await this.client.deleteItem(d);if(h.Attributes)return this.driver.unmarshall(h.Attributes);return}async get(){if(!this.client)throw Error("DynamoDB client not provided");let d=this.toGetRequest(),h=await this.client.getItem(d);if(h.Item)return this.driver.unmarshall(h.Item);return}}function tn(d){return new T(d)}function nn(d){return new m(d)}function rn(d){let h=c(d.config);return{query:()=>new T(d),item:()=>new m(d),driver:h,registerEntity:(D)=>h.registerEntity(D),buildKey:(D,E)=>h.buildPrimaryKey(D,E)}}class Xe{config;entities=new Map;pkAttribute;skAttribute;typeAttribute;constructor(d){this.config=d,this.pkAttribute=d.pkAttribute??"pk",this.skAttribute=d.skAttribute??"sk",this.typeAttribute=d.typeAttribute??"_type";for(let h of d.entities)this.entities.set(h.name,h)}getEntity(d){return this.entities.get(d)}registerEntity(d){this.entities.set(d.name,d)}buildKey(d,h){let D=this.entities.get(d);if(!D)throw Error(`Entity not found: ${d}`);let E=this.interpolatePattern(D.pkPattern,h),V=this.interpolatePattern(D.skPattern,h);return{pk:E,sk:V}}buildGSIKey(d,h,D){let E=this.entities.get(d);if(!E)throw Error(`Entity not found: ${d}`);let V=E.indexes?.find((Fe)=>Fe.name===h);if(!V)throw Error(`GSI not found: ${h} for entity ${d}`);let Ne=this.interpolatePattern(V.pkPattern,D),xe=V.skPattern?this.interpolatePattern(V.skPattern,D):void 0;return{pk:Ne,sk:xe}}createItem(d,h){let{pk:D,sk:E}=this.buildKey(d,h),V=this.entities.get(d),Ne={[this.pkAttribute]:D,[this.skAttribute]:E,[this.typeAttribute]:d,...h};if(V.indexes)for(let xe of V.indexes){let Fe=this.buildGSIKey(d,xe.name,h),Ie=this.config.indexes?.find((Ve)=>Ve.name===xe.name);if(Ie){if(Ne[Ie.pkAttribute]=Fe.pk,Ie.skAttribute&&Fe.sk)Ne[Ie.skAttribute]=Fe.sk}}return Ne}parseEntityType(d){if(d[this.typeAttribute])return d[this.typeAttribute];let h=d[this.pkAttribute];if(!h)return;for(let[D,E]of this.entities){let V=E.pkPattern.split("${")[0];if(h.startsWith(V))return D}return}parseItem(d){let h=this.parseEntityType(d);if(!h)return;let{[this.pkAttribute]:D,[this.skAttribute]:E,[this.typeAttribute]:V,...Ne}=d;return{type:h,data:Ne}}getEntityPrefix(d){let h=this.entities.get(d);if(!h)throw Error(`Entity not found: ${d}`);return h.pkPattern.split("${")[0]}generateTableDefinition(){let d=[{name:this.pkAttribute,type:"S"},{name:this.skAttribute,type:"S"}],h=[];if(this.config.indexes)for(let D of this.config.indexes){if(!d.find((E)=>E.name===D.pkAttribute))d.push({name:D.pkAttribute,type:"S"});if(D.skAttribute&&!d.find((E)=>E.name===D.skAttribute))d.push({name:D.skAttribute,type:"S"});h.push({indexName:D.name,keySchema:{partitionKey:D.pkAttribute,sortKey:D.skAttribute},projection:{type:"ALL"}})}return{tableName:this.config.tableName,keySchema:{partitionKey:this.pkAttribute,sortKey:this.skAttribute},attributeDefinitions:d,globalSecondaryIndexes:h.length>0?h:void 0,billingMode:"PAY_PER_REQUEST"}}interpolatePattern(d,h){return d.replace(/\$\{(\w+)\}/g,(D,E)=>{if(!(E in h))throw Error(`Missing value for pattern key: ${E}`);return String(h[E])})}}class Ze{manager;entityName;options;constructor(d,h,D){this.manager=d,this.entityName=h,this.options=D}async create(d){let h=this.manager.createItem(this.entityName,d),D=new m(this.options).table(this.options.config.tableName).item(h).ifNotExists("pk");if(this.options.client)await D.put();return d}async get(d){let{pk:h,sk:D}=this.manager.buildKey(this.entityName,d),E=new m(this.options).table(this.options.config.tableName).key({pk:h,sk:D});if(!this.options.client)throw Error("DynamoDB client not provided");let V=await E.get();if(!V)return;return this.manager.parseItem(V)?.data}async update(d,h){let{pk:D,sk:E}=this.manager.buildKey(this.entityName,d),V=new m(this.options).table(this.options.config.tableName).key({pk:D,sk:E}).setMany(h).ifExists("pk").returnNew();if(!this.options.client)throw Error("DynamoDB client not provided");let Ne=await V.update();if(!Ne)return;return this.manager.parseItem(Ne)?.data}async delete(d){let{pk:h,sk:D}=this.manager.buildKey(this.entityName,d),E=new m(this.options).table(this.options.config.tableName).key({pk:h,sk:D});if(!this.options.client)throw Error("DynamoDB client not provided");return await E.delete(),!0}query(){return new et(this.manager,this.entityName,this.options)}async findAll(){let d=this.manager.typeAttribute??"_type",h=new T(this.options).table(this.options.config.tableName).whereEquals(d,this.entityName);if(!this.options.client)throw Error("DynamoDB client not provided");return(await h.getAll()).map((E)=>this.manager.parseItem(E)).filter((E)=>E!==void 0).map((E)=>E.data)}}class et{manager;entityName;options;builder;pkValue;skConditions=[];constructor(d,h,D){this.manager=d,this.entityName=h,this.options=D,this.builder=new T(D).table(D.config.tableName)}wherePartitionKey(d){let{pk:h}=this.manager.buildKey(this.entityName,d);this.pkValue=h;let D=this.manager.pkAttribute??"pk";return this.builder.wherePartitionKey(D,h),this}whereSortKey(d){let{sk:h}=this.manager.buildKey(this.entityName,d),D=this.manager.skAttribute??"sk";return this.builder.whereSortKey(D,h),this}whereSortKeyBeginsWith(d){let h=this.manager.skAttribute??"sk";return this.builder.whereSortKeyBeginsWith(h,d),this}useIndex(d,h){let D=this.manager.buildGSIKey(this.entityName,d,h),E=this.manager.config.indexes?.find((V)=>V.name===d);if(!E)throw Error(`GSI configuration not found: ${d}`);return this.builder.index(d),this.builder.wherePartitionKey(E.pkAttribute,D.pk),this}where(d,h,D){return this.builder.where(d,h,D),this}select(...d){return this.builder.select(...d),this}limit(d){return this.builder.limit(d),this}descending(){return this.builder.descending(),this}async execute(){if(!this.options.client)throw Error("DynamoDB client not provided");return((await this.builder.query()).items??[]).map((h)=>this.manager.parseItem(h)).filter((h)=>h!==void 0).map((h)=>h.data)}async first(){return this.limit(1),(await this.execute())[0]}}function tt(d){return new Xe(d)}function nt(d,h,D){return new Ze(d,h,D)}var sn={simpleEntity:(d,h="id")=>({name:d,pkPattern:`${d.toUpperCase()}#\${${h}}`,skPattern:"METADATA",keyFields:[h]}),oneToMany:(d,h,D="id",E="id")=>({parent:{name:d,pkPattern:`${d.toUpperCase()}#\${${D}}`,skPattern:"METADATA",keyFields:[D]},child:{name:h,pkPattern:`${d.toUpperCase()}#\${${D}}`,skPattern:`${h.toUpperCase()}#\${${E}}`,keyFields:[D,E]}}),manyToMany:(d,h,D="id",E="relatedId")=>({entity:{name:d,pkPattern:`${d.toUpperCase()}#\${${D}}`,skPattern:"METADATA",keyFields:[D]},relation:{name:h,pkPattern:`${d.toUpperCase()}#\${${D}}`,skPattern:`${h.toUpperCase()}#\${${E}}`,keyFields:[D,E],indexes:[{name:"GSI1",pkPattern:`${d.toUpperCase()}#\${${E}}`,skPattern:`${h.toUpperCase()}#\${${D}}`}]}}),hierarchical:(d,h="rootId",D="path")=>({name:d,pkPattern:`ROOT#\${${h}}`,skPattern:`PATH#\${${D}}`,keyFields:[h,D]})};function rt(d,h){let D={};for(let[E,V]of Object.entries(d))if(V)D[E]=V.replace(/\{([^}]+)\}/g,(Ne,xe)=>h[xe]!==void 0?String(h[xe]):`{${xe}}`);return D}async function Rt(d){return{models:new Map}}function an(d){return d}function on(d){return d}function ln(d){return d}function cn(d){return d}class it{config;driver;singleTableManager;models=new Map;queryBuilderOptions;constructor(d){this.config={pkAttribute:"pk",skAttribute:"sk",entityTypeAttribute:"_et",keyDelimiter:"#",...d};let h={region:d.region,endpoint:d.endpoint,credentials:d.credentials,tableName:d.tableName};this.driver=c(h);let D={tableName:d.tableName,pkAttribute:this.config.pkAttribute,skAttribute:this.config.skAttribute,typeAttribute:this.config.entityTypeAttribute,indexes:this.buildGSIConfig(),entities:[]};this.singleTableManager=tt(D),this.queryBuilderOptions={config:h}}setClient(d){return this.queryBuilderOptions.client=d,this}async discoverModels(){if(!this.config.modelsPath)throw Error("modelsPath must be configured to use discoverModels()");let d=await Rt({queryBuilder:{modelsPath:this.config.modelsPath},singleTable:{pkAttribute:this.config.pkAttribute,skAttribute:this.config.skAttribute,typeAttribute:this.config.entityTypeAttribute,delimiter:this.config.keyDelimiter}}),h=[];for(let[,D]of d.models)this.registerParsedModel(D),h.push(D);return h}registerModel(d){let h=this.parseWithTooling(d);return this.registerParsedModel(h)}registerParsedModel(d){this.models.set(d.name,d);let h=this.toSingleTableEntity(d);this.singleTableManager.registerEntity(h);let D=this.toEntityMapping(d);return this.driver.registerEntity(D),d}registerModels(d){return d.map((h)=>this.registerModel(h))}getModel(d){return this.models.get(d)}getAllModels(){return Array.from(this.models.values())}repository(d){if(!this.models.get(d))throw Error(`Model not found: ${d}`);return nt(this.singleTableManager,d,this.queryBuilderOptions)}query(d){if(!this.models.get(d))throw Error(`Model not found: ${d}`);return new T(this.queryBuilderOptions).table(this.config.tableName).entity(d)}item(d){if(!this.models.get(d))throw Error(`Model not found: ${d}`);return new m(this.queryBuilderOptions).table(this.config.tableName)}buildKey(d,h){let D=this.models.get(d);if(!D)throw Error(`Model not found: ${d}`);let E=rt(D.keyPatterns,h);return{pk:E.pk,sk:E.sk}}createItem(d,h){let D=this.models.get(d);if(!D)throw Error(`Model not found: ${d}`);let E=rt(D.keyPatterns,h),{pk:V,sk:Ne}=E,xe={[this.config.pkAttribute]:V,[this.config.skAttribute]:Ne,[this.config.entityTypeAttribute]:D.name,...h};if(D.hasTimestamps){let Fe=new Date().toISOString();if(!xe.createdAt)xe.createdAt=Fe;xe.updatedAt=Fe}if(D.hasVersioning){if(!xe._v)xe._v=1}return xe}parseItem(d){let h=d[this.config.entityTypeAttribute];if(!h)return;let{[this.config.pkAttribute]:D,[this.config.skAttribute]:E,[this.config.entityTypeAttribute]:V,...Ne}=d;return{type:h,data:Ne}}getDriver(){return this.driver}getSingleTableManager(){return this.singleTableManager}generateTableDefinition(){return this.singleTableManager.generateTableDefinition()}generateAccessPatterns(d){let h=this.models.get(d);if(!h)throw Error(`Model not found: ${d}`);return h.accessPatterns}parseWithTooling(d){let h=d.name.toUpperCase(),D=d.primaryKey??"id",E=this.config.keyDelimiter,V=this.parseAttributes(d),Ne=this.parseRelationships(d,D),xe={pk:`${h}${E}{${D}}`,sk:`${h}${E}{${D}}`,...this.deriveGSIKeyPatterns(h,D,E,Ne)},Fe=this.deriveAccessPatterns(d.name,h,D,Ne);return{name:d.name,entityType:h,primaryKey:D,attributes:V,relationships:Ne,keyPatterns:xe,accessPatterns:Fe,traits:d.traits??{},hasTimestamps:d.traits?.useTimestamps??!1,hasSoftDeletes:d.traits?.useSoftDeletes??!1,hasUuid:d.traits?.useUuid??!1,hasTtl:d.traits?.useTtl??!1,hasVersioning:d.traits?.useVersioning??!1,original:d}}parseAttributes(d){let h=[];if(h.push({name:d.primaryKey??"id",fillable:!1,required:!0,nullable:!1,unique:!0,hidden:!1,dynamoDbType:"S"}),d.attributes)for(let[D,E]of Object.entries(d.attributes))h.push({name:D,fillable:E.fillable??!0,required:E.required??!1,nullable:E.nullable??!0,unique:E.unique??!1,hidden:E.hidden??!1,defaultValue:E.default,cast:E.cast,dynamoDbType:this.inferDynamoDBType(E)});if(d.traits?.useTimestamps)h.push({name:"createdAt",fillable:!1,required:!0,nullable:!1,unique:!1,hidden:!1,dynamoDbType:"S"},{name:"updatedAt",fillable:!1,required:!0,nullable:!1,unique:!1,hidden:!1,dynamoDbType:"S"});if(d.traits?.useSoftDeletes)h.push({name:"deletedAt",fillable:!1,required:!1,nullable:!0,unique:!1,hidden:!1,dynamoDbType:"S"});return h}inferDynamoDBType(d){if(d.cast){let h=d.cast.toLowerCase();if(["integer","int","float","double","decimal","number"].includes(h))return"N";if(["boolean","bool"].includes(h))return"BOOL";if(["array","list"].includes(h))return"L";if(["object","json","map"].includes(h))return"M"}if(d.validation?.rule){let h=String(d.validation.rule);if(h.includes("integer")||h.includes("numeric")||h.includes("number"))return"N";if(h.includes("boolean"))return"BOOL";if(h.includes("array"))return"L";if(h.includes("object"))return"M"}return"S"}parseRelationships(d,h){let D=[];if(d.hasOne)for(let E of d.hasOne)D.push({type:"hasOne",relatedModel:E,foreignKey:`${d.name.toLowerCase()}Id`,localKey:h,requiresGsi:!0});if(d.hasMany)for(let E of d.hasMany)D.push({type:"hasMany",relatedModel:E,foreignKey:`${d.name.toLowerCase()}Id`,localKey:h,requiresGsi:!1});if(d.belongsTo)for(let E of d.belongsTo)D.push({type:"belongsTo",relatedModel:E,foreignKey:`${E.toLowerCase()}Id`,localKey:h,requiresGsi:!0});if(d.belongsToMany){let E=Array.isArray(d.belongsToMany)?d.belongsToMany:Object.values(d.belongsToMany);for(let V of E){let Ne=typeof V==="string"?V:V?.model;if(!Ne)continue;let xe=[d.name,Ne].sort();D.push({type:"belongsToMany",relatedModel:Ne,foreignKey:`${d.name.toLowerCase()}Id`,localKey:h,pivotEntity:xe.join(""),requiresGsi:!0})}}return D}deriveGSIKeyPatterns(d,h,D,E){let V={},Ne=1;for(let xe of E)if(xe.requiresGsi&&Ne<=5)V[`gsi${Ne}pk`]=`${xe.relatedModel.toUpperCase()}${D}{${xe.foreignKey}}`,V[`gsi${Ne}sk`]=`${d}${D}{${h}}`,xe.gsiIndex=Ne,Ne++;return V}deriveAccessPatterns(d,h,D,E){let V=[];V.push({name:`Get ${d} by ID`,description:`Retrieve a single ${d} by its primary key`,entityType:h,operation:"get",index:"main",keyCondition:"pk = :pk AND sk = :sk",examplePk:`${h}#123`,exampleSk:`${h}#123`,efficient:!0}),V.push({name:`List all ${d}s`,description:`Scan all ${d} entities`,entityType:h,operation:"scan",index:"scan",keyCondition:"_et = :entityType",examplePk:h,efficient:!1});for(let Ne of E){if(Ne.type==="hasMany")V.push({name:`Get ${Ne.relatedModel}s for ${d}`,description:`Query ${Ne.relatedModel}s related to a ${d}`,entityType:h,operation:"query",index:"main",keyCondition:"pk = :pk AND begins_with(sk, :skPrefix)",examplePk:`${h}#123`,exampleSk:`${Ne.relatedModel.toUpperCase()}#`,efficient:!0});if(Ne.gsiIndex){let xe=`GSI${Ne.gsiIndex}`;V.push({name:`Get ${d}s by ${Ne.relatedModel}`,description:`Query ${d}s by their related ${Ne.relatedModel}`,entityType:h,operation:"query",index:xe,keyCondition:`gsi${Ne.gsiIndex}pk = :pk`,examplePk:`${Ne.relatedModel.toUpperCase()}#123`,efficient:!0})}}return V}toSingleTableEntity(d){let h=this.extractKeyFields(d.keyPatterns.pk);return{name:d.name,pkPattern:d.keyPatterns.pk,skPattern:d.keyPatterns.sk,keyFields:h,indexes:this.extractGSIPatterns(d.keyPatterns)}}extractKeyFields(d){let h=d.match(/\{([^}]+)\}/g);if(!h)return[];return h.map((D)=>D.slice(1,-1))}extractGSIPatterns(d){let h=[];for(let D=1;D<=5;D++){let E=`gsi${D}pk`,V=`gsi${D}sk`;if(d[E])h.push({name:`GSI${D}`,pkPattern:d[E],skPattern:d[V]})}return h.length>0?h:void 0}toEntityMapping(d){return{entityType:d.name,pkPattern:d.keyPatterns.pk,skPattern:d.keyPatterns.sk}}buildGSIConfig(){let d=this.config.gsiConfig??{},h=[];if(d.gsi1pk)h.push({name:"GSI1",pkAttribute:d.gsi1pk,skAttribute:d.gsi1sk});if(d.gsi2pk)h.push({name:"GSI2",pkAttribute:d.gsi2pk,skAttribute:d.gsi2sk});if(d.gsi3pk)h.push({name:"GSI3",pkAttribute:d.gsi3pk,skAttribute:d.gsi3sk});return h}}function un(d){return new it(d)}function dn(d){return d.accessPatterns}function fn(d,h="#"){let D=d.name.toUpperCase(),E=d.primaryKey??"id";return{name:d.name,pkPattern:`${D}${h}\${${E}}`,skPattern:`${D}${h}\${${E}}`}}function $e(d){let h={};for(let D of Object.keys(d)){let E=d[D],V=E.definition??E.getDefinition?.()??E,Ne=p(V),xe=V.attributes??{},Fe={};for(let Ie of Object.keys(xe))Fe[Ie]=void 0;h[Ne]={columns:Fe,primaryKey:V.primaryKey??"id"}}return h}import{readdirSync as ia}from"fs";import{basename as $s,extname as Rs,isAbsolute as aa,join as xs}from"path";import oa from"process";var la=new Set([".ts",".mts",".cts",".js",".mjs",".cjs"]);function ua(d){let h=Rs(d);if(!la.has(h))return!1;let D=$s(d,h);if(D.startsWith("_")||D==="index")return!1;return!D.endsWith(".d")}function ca(d){if(!d||typeof d!=="object")return!1;let h=d;return typeof h.name==="string"||typeof h.table==="string"}function Ns(d){let h=[],D=ia(d,{withFileTypes:!0}).sort((E,V)=>E.name.localeCompare(V.name));for(let E of D){let V=xs(d,E.name);if(E.isDirectory()){h.push(...Ns(V));continue}if(ua(E.name))h.push(V)}return h}async function u(d){let h=d.cwd??oa.cwd(),D=aa(d.modelsDir)?d.modelsDir:xs(h,d.modelsDir),E={};for(let V of Ns(D)){let Ne=`?t=${Date.now()}-${Math.random().toString(36).slice(2)}`,xe=await import(`${V}${Ne}`),Fe=xe.default??xe,Ie=Fe.definition??Fe.getDefinition?.()??Fe;if(!ca(Ie))continue;let Ve=Ie.name??$s(V,Rs(V));E[Ve]={...Ie,name:Ve}}return E}function st(d){let h={},D={},E={},V={},Ne={},xe={};for(let Fe of Object.keys(d)){let Ie=d[Fe],Ve=Ie.definition??Ie.getDefinition?.()??Ie,gt=p(Ve);h[Fe]=gt,D[gt]=Fe,E[gt]=Ve.primaryKey??"id";let bt=[];for(let[Le,Ue]of Object.entries(Ve.attributes??{}))if(/^(?:datetime|timestamp|timestamptz|date)$/i.test(String(Ue?.type??"")))bt.push(Le);let pt=Ve.traits??{};if(pt.useTimestamps??pt.timestampable)bt.push("created_at","updated_at");if(bt.length>0)xe[gt]=[...new Set(bt)];let xt=(Le)=>{if(!Le)return{};let Ue={};if(Array.isArray(Le)){for(let ke of Le){let ve=Me(ke);if(ve)Ue[ve.model]=ve.model}return Ue}if(typeof Le==="object"){for(let[ke,ve]of Object.entries(Le)){let yt=Me(ve);if(yt)Ue[ke]=yt.model}return Ue}return{}},jt=(Le)=>{if(!Le)return{};if(Array.isArray(Le)){let Ue={};for(let ke of Le)if(typeof ke==="string")Ue[ke]=ke;else if(ke&&typeof ke==="object"&&typeof ke.model==="string")Ue[ke.model]=ke;return Ue}return Le},Ht=(Le)=>{if(!Le)return{};return Le};if(V[gt]={hasOne:xt(Ve.hasOne),hasMany:xt(Ve.hasMany),belongsTo:xt(Ve.belongsTo),belongsToMany:jt(Ve.belongsToMany),hasOneThrough:Ht(Ve.hasOneThrough),hasManyThrough:Ht(Ve.hasManyThrough),morphOne:xt(Ve.morphOne),morphMany:xt(Ve.morphMany),morphTo:Ve.morphTo,morphToMany:xt(Ve.morphToMany),morphedByMany:xt(Ve.morphedByMany)},Ve.scopes&&typeof Ve.scopes==="object"){Ne[gt]={};for(let Le of Object.keys(Ve.scopes)){let Ue=Ve.scopes[Le];if(typeof Ue==="function")Ne[gt][Le]=Ue}}}return{modelToTable:h,tableToModel:D,primaryKeys:E,relations:V,scopes:Ne,models:d,temporalColumns:xe}}import{existsSync as zr,mkdirSync as da,readdirSync as fa,readFileSync as ma,writeFileSync as ga}from"fs";import{dirname as ks,join as vr}from"path";import Cs from"process";function _n(d){if(e.verbose)console.log(d)}function sr(d){return d.replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").toLowerCase()}function Jr(d){return y(e.relations?.singularizeStrategy)(d)}var $r=0,nr=0,ir=0,_r=!0,Lr=[],fr=null;function at(){return[...Lr]}function ya(d){let h=d;while(h!==ks(h)){if(zr(vr(h,"package.json")))return h;h=ks(h)}return Cs.cwd()}function pa(){let d=ya(Cs.cwd()),h=tr(d,e.migrationDir);if(!zr(h))da(h,{recursive:!0}),_n(`-- Created SQL directory: ${h}`);return h}var ot="-- qb:generated";function lt(d){return d.trimStart().startsWith(ot)}function ct(d){return d.split(`
370
- `).filter((h)=>!h.trimStart().startsWith("--")).join(`
371
- `).replace(/\s+/g," ").trim().replace(/;+$/,"")}function ha(d){let h=new Set,D;try{D=fa(d).filter((E)=>E.endsWith(".sql"))}catch{return h}for(let E of D)try{h.add(ct(ma(vr(d,E),"utf8")))}catch{}return h}function Is(d,h){if(!d)return!1;let D=pa();if(fr===null)fr=ha(D);let E=ct(d);if(E.length>0&&fr.has(E))return _n(`-- Migration already in the corpus, not writing it again: ${h}`),!1;$r++;let V=_r?String($r).padStart(10,"0"):String(Math.floor(Date.now()/1000)+$r),Ne=`${V}-${h}.sql`;if(!_r){let Fe=Number(V);while(zr(vr(D,Ne)))Fe+=1,V=String(Fe),Ne=`${V}-${h}.sql`}let xe=vr(D,Ne);return ga(xe,`${ot}
372
- ${d}`),_n(`-- Migration file created: ${Ne}`),nr++,Lr.push(Ne),fr?.add(E),!0}function At(d,h){return d==="integer"&&h==="bigint"||d==="string"&&h==="text"}function Bs(d){if(d.endsWith("_id"))return"bigint";if(d.endsWith("_at"))return"datetime";if(d.startsWith("is_")||d.startsWith("has_"))return"boolean";return}function As(d){if(typeof d==="string"||typeof d==="number"||typeof d==="boolean"||typeof d==="bigint"||d instanceof Date)return d;return}function Ta(d){if(d&&typeof d==="object"&&"name"in d){let h=d;if(h.name==="enum"||h.getRules&&Array.isArray(h.getRules())){if(h.enumValues&&Array.isArray(h.enumValues))return h.enumValues.map((D)=>String(D));if(h._values&&Array.isArray(h._values))return h._values.map((D)=>String(D));if(h.values&&Array.isArray(h.values))return h.values.map((D)=>String(D))}}if(d&&typeof d==="object"){let h=d,D=h.allowedValues||h.enumValues||h._values||h.values;if(Array.isArray(D)&&D.length>0)return D.map((E)=>String(E))}return}function Yr(d){if(!d?.rules||!Array.isArray(d.rules))return;for(let h of d.rules)if(h?.name==="max"||h?.name==="maxLength"){if(h.params&&typeof h.params.max==="number")return h.params.max;if(Array.isArray(h.args)&&typeof h.args[0]==="number")return h.args[0];if(typeof h.value==="number")return h.value;if(typeof h.expectedValue==="number")return h.expectedValue}return}var Gr=767;function ba(d){if(!d||typeof d!=="object")return;let h=d;if(h.name)switch(String(h.name).toLowerCase()){case"string":{let E=Yr(h);return E&&E>Gr?"text":"string"}case"text":return"text";case"integer":case"int":return"integer";case"bigint":return"bigint";case"float":return"float";case"number":return"integer";case"double":return"double";case"decimal":return"decimal";case"boolean":case"bool":return"boolean";case"date":return"date";case"datetime":case"timestamp":return"datetime";case"timestamptz":case"timestamp_tz":return"timestamptz";case"json":return"json";case"enum":return"enum"}if(h.type){let D=String(h.type).toLowerCase();if(D==="string"||D==="text")return"string";if(D==="integer"||D==="int")return"integer";if(D==="bigint")return"bigint";if(D==="float")return"float";if(D==="number")return"integer";if(D==="boolean")return"boolean";if(D==="date")return"date";if(D==="datetime")return"datetime";if(D==="timestamptz"||D==="timestamp_tz")return"timestamptz";if(D==="json")return"json"}return}function Sa(d){if(typeof d!=="string")return;switch(d.trim().toLowerCase().replace(/[\s-]+/g,"_")){case"varchar":case"string":return"string";case"text":return"text";case"bool":case"boolean":return"boolean";case"int":case"integer":return"integer";case"bigint":return"bigint";case"float":return"float";case"double":return"double";case"number":case"numeric":case"decimal":return"decimal";case"date":return"date";case"datetime":case"timestamp":return"datetime";case"timestamp_tz":case"timestamptz":case"timestamp_with_time_zone":return"timestamptz";case"json":case"jsonb":return"json";case"enum":return"enum";default:return}}function W(d,h){let D=st(d),E=[];for(let Fe of Object.keys(d)){let Ie=d[Fe],Ve=p(Ie),gt=Ie.primaryKey??"id",bt=Ie.autoIncrement!==!1,pt=Ie.attributes??{},xt=[],jt=[];if(!pt[gt])xt.push({name:sr(gt),type:"bigint",isPrimaryKey:!0,isUnique:!1,isNullable:!1,hasDefault:!1});let Ht=new Map,Le=M(Ie.belongsTo).length>0,Ue=new Set(Object.keys(pt).map((wt)=>sr(wt))),ke=new Set;for(let wt of Ue){if(!wt.endsWith("_type"))continue;let St=`${wt.slice(0,-5)}_id`;if(Ue.has(St))ke.add(St)}for(let wt of M(Ie.belongsTo)){let St=wt.foreignKey??`${sr(wt.model)}_id`,vt=D.modelToTable[wt.model];if(vt)Ht.set(St,{table:vt,onDelete:wt.onDelete})}for(let wt of Object.keys(pt)){let St=pt[wt],vt=sr(wt),Ft=Boolean(St.validation?.rule?.isRequired),Yt=wt===gt?!1:St.nullable??!(St.required??Ft),Et,Jt,Qt=wt===gt;if(Et=Sa(St.type)??ba(St.validation?.rule),Et==="string"){let Vt=Yr(St.validation?.rule);if(Vt&&Vt>Gr)Et="text"}if(!Et||Et==="enum"){let Vt=Ta(St.validation?.rule);if(Vt&&Vt.length>0)Et="enum",Jt=Vt}if(!Et)Et=Bs(vt);if(!Et){let Vt=As(St.default);if(typeof Vt==="string")Et=Vt.length>255?"text":"string";else if(typeof Vt==="number")Et=Number.isInteger(Vt)?"integer":"float";else if(typeof Vt==="boolean")Et="boolean";else if(typeof Vt==="bigint")Et="bigint";else if(Vt instanceof Date)Et="datetime"}if(!Et)Et=Qt?"bigint":"string";let yn=Et==="string"?Yr(St.validation?.rule):void 0,_t={name:vt,type:Et,isPrimaryKey:Qt,isUnique:Boolean(St.unique),isNullable:Yt,hasDefault:typeof St.default<"u",defaultValue:As(St.default),enumValues:Jt,maxLength:typeof yn==="number"&&yn>0&&yn<=Gr?yn:void 0};if(vt.endsWith("_id")&&St.foreignKey!==!1&&!ke.has(vt))if(typeof St.foreignKey==="object"&&St.foreignKey!==null){let Vt=St.foreignKey;if(_t.references={table:Vt.table,column:Vt.column??"id",onDelete:Vt.onDelete,onUpdate:Vt.onUpdate},Vt.nullable!==void 0)_t.isNullable=Vt.nullable}else{let Vt=Ht.get(vt),Dn=vt.replace(/_id$/,"").replace(/(^|_)([a-z])/g,(Vn,jn,ur)=>ur.toUpperCase()),Nn=Vt?.table??(Le?void 0:D.modelToTable[Dn]);if(Nn){let Vn=D.primaryKeys[Nn]??"id";_t.references={table:Nn,column:Vn,onDelete:Vt?.onDelete}}}xt.push(_t)}let ve=M(Ie.belongsTo);for(let wt of ve){let St=wt.foreignKey??`${sr(wt.model)}_id`;if(xt.some((Yt)=>Yt.name===St))continue;let vt=D.modelToTable[wt.model],Ft=vt?D.primaryKeys[vt]??"id":void 0;xt.push({name:St,type:"bigint",isPrimaryKey:!1,isUnique:!1,isNullable:!0,hasDefault:!1,references:vt&&Ft&&!ke.has(St)?{table:vt,column:Ft,onDelete:wt.onDelete}:void 0})}let yt=Ie.traits;if(yt?.useTimestamps??yt?.timestampable??!1){if(!xt.some((wt)=>wt.name==="created_at"))xt.push({name:"created_at",type:"datetime",isPrimaryKey:!1,isUnique:!1,isNullable:!1,hasDefault:!0,defaultValue:g});if(!xt.some((wt)=>wt.name==="updated_at"))xt.push({name:"updated_at",type:"datetime",isPrimaryKey:!1,isUnique:!1,isNullable:!0,hasDefault:!1})}if(yt?.useSoftDeletes??yt?.softDeletable??!1){if(!xt.some((wt)=>wt.name==="deleted_at"))xt.push({name:"deleted_at",type:"datetime",isPrimaryKey:!1,isUnique:!1,isNullable:!0,hasDefault:!1})}if(yt?.useUuid??!1){if(!xt.some((wt)=>wt.name==="uuid"))xt.push({name:"uuid",type:"string",isPrimaryKey:!1,isUnique:!0,isNullable:!0,hasDefault:!1})}for(let wt of Ie.indexes??[])jt.push({name:wt.name,columns:wt.columns.map((St)=>sr(St)),type:wt.unique?"unique":"index",where:wt.where});for(let wt of xt)if(wt.isUnique&&!wt.isPrimaryKey)jt.push({name:`${Ve}_${wt.name}_unique`,columns:[wt.name],type:"unique"});let Wt=Array.isArray(Ie.shardKey)?Ie.shardKey.map(sr):void 0,$t=Array.isArray(Ie.sortKey)?Ie.sortKey.map(sr):void 0,ht=Ie.tableKind;E.push({table:Ve,columns:xt,indexes:jt,shardKey:Wt,sortKey:$t,tableKind:ht})}let V=new Set(E.map((Fe)=>Fe.table));function Ne(Fe){if(!V.has(Fe.table))V.add(Fe.table),E.push(Fe)}for(let Fe of Object.keys(d)){let Ie=d[Fe],Ve=Ie?.traits??{},gt=p(Ie),bt=Jr(gt);if(Ve.likeable){let pt=typeof Ve.likeable==="object"?Ve.likeable:{},xt=pt.table||`${gt}_likes`,jt=pt.foreignKey||`${bt}_id`;Ne({table:xt,columns:[{name:"id",type:"bigint",isPrimaryKey:!0,isUnique:!1,isNullable:!1,hasDefault:!1},{name:"user_id",type:"bigint",isPrimaryKey:!1,isUnique:!1,isNullable:!1,hasDefault:!1,references:{table:"users",column:"id"}},{name:jt,type:"bigint",isPrimaryKey:!1,isUnique:!1,isNullable:!1,hasDefault:!1,references:{table:gt,column:"id"}},{name:"created_at",type:"datetime",isPrimaryKey:!1,isUnique:!1,isNullable:!1,hasDefault:!0,defaultValue:g},{name:"updated_at",type:"datetime",isPrimaryKey:!1,isUnique:!1,isNullable:!0,hasDefault:!1}],indexes:[{name:`${xt}_user_target_unique`,columns:["user_id",jt],type:"unique"}]})}if(Ve.taggable)Ne({table:"taggables",columns:[{name:"id",type:"bigint",isPrimaryKey:!0,isUnique:!1,isNullable:!1,hasDefault:!1},{name:"name",type:"string",isPrimaryKey:!1,isUnique:!1,isNullable:!1,hasDefault:!1},{name:"slug",type:"string",isPrimaryKey:!1,isUnique:!1,isNullable:!1,hasDefault:!1},{name:"description",type:"text",isPrimaryKey:!1,isUnique:!1,isNullable:!0,hasDefault:!1},{name:"order",type:"integer",isPrimaryKey:!1,isUnique:!1,isNullable:!1,hasDefault:!0,defaultValue:0},{name:"is_active",type:"boolean",isPrimaryKey:!1,isUnique:!1,isNullable:!1,hasDefault:!0,defaultValue:!0},{name:"taggable_id",type:"bigint",isPrimaryKey:!1,isUnique:!1,isNullable:!0,hasDefault:!1},{name:"taggable_type",type:"string",isPrimaryKey:!1,isUnique:!1,isNullable:!1,hasDefault:!1},{name:"created_at",type:"datetime",isPrimaryKey:!1,isUnique:!1,isNullable:!1,hasDefault:!0,defaultValue:g},{name:"updated_at",type:"datetime",isPrimaryKey:!1,isUnique:!1,isNullable:!0,hasDefault:!1}],indexes:[{name:"taggables_target_index",columns:["taggable_id","taggable_type"],type:"index"},{name:"taggables_type_slug_unique",columns:["taggable_type","slug"],type:"unique"}]}),Ne({table:"taggable_models",columns:[{name:"id",type:"bigint",isPrimaryKey:!0,isUnique:!1,isNullable:!1,hasDefault:!1},{name:"tag_id",type:"bigint",isPrimaryKey:!1,isUnique:!1,isNullable:!1,hasDefault:!1,references:{table:"taggables",column:"id"}},{name:"taggable_id",type:"bigint",isPrimaryKey:!1,isUnique:!1,isNullable:!1,hasDefault:!1},{name:"taggable_type",type:"string",isPrimaryKey:!1,isUnique:!1,isNullable:!1,hasDefault:!1},{name:"created_at",type:"datetime",isPrimaryKey:!1,isUnique:!1,isNullable:!1,hasDefault:!0,defaultValue:g},{name:"updated_at",type:"datetime",isPrimaryKey:!1,isUnique:!1,isNullable:!0,hasDefault:!1}],indexes:[{name:"taggable_models_owner_unique",columns:["tag_id","taggable_id","taggable_type"],type:"unique"},{name:"taggable_models_target_index",columns:["taggable_id","taggable_type"],type:"index"}]});if(Ve.categorizable)Ne({table:"categorizables",columns:[{name:"id",type:"bigint",isPrimaryKey:!0,isUnique:!1,isNullable:!1,hasDefault:!1},{name:"name",type:"string",isPrimaryKey:!1,isUnique:!1,isNullable:!1,hasDefault:!1},{name:"slug",type:"string",isPrimaryKey:!1,isUnique:!1,isNullable:!1,hasDefault:!1},{name:"description",type:"text",isPrimaryKey:!1,isUnique:!1,isNullable:!0,hasDefault:!1},{name:"is_active",type:"boolean",isPrimaryKey:!1,isUnique:!1,isNullable:!1,hasDefault:!0,defaultValue:!0},{name:"categorizable_type",type:"string",isPrimaryKey:!1,isUnique:!1,isNullable:!1,hasDefault:!1},{name:"created_at",type:"datetime",isPrimaryKey:!1,isUnique:!1,isNullable:!1,hasDefault:!0,defaultValue:g},{name:"updated_at",type:"datetime",isPrimaryKey:!1,isUnique:!1,isNullable:!0,hasDefault:!1}],indexes:[{name:"categorizables_type_slug_unique",columns:["categorizable_type","slug"],type:"unique"}]}),Ne({table:"categorizable_models",columns:[{name:"id",type:"bigint",isPrimaryKey:!0,isUnique:!1,isNullable:!1,hasDefault:!1},{name:"category_id",type:"bigint",isPrimaryKey:!1,isUnique:!1,isNullable:!1,hasDefault:!1,references:{table:"categorizables",column:"id"}},{name:"categorizable_id",type:"bigint",isPrimaryKey:!1,isUnique:!1,isNullable:!1,hasDefault:!1},{name:"categorizable_type",type:"string",isPrimaryKey:!1,isUnique:!1,isNullable:!1,hasDefault:!1},{name:"created_at",type:"datetime",isPrimaryKey:!1,isUnique:!1,isNullable:!1,hasDefault:!0,defaultValue:g},{name:"updated_at",type:"datetime",isPrimaryKey:!1,isUnique:!1,isNullable:!0,hasDefault:!1}],indexes:[{name:"categorizable_models_owner_unique",columns:["category_id","categorizable_id","categorizable_type"],type:"unique"},{name:"categorizable_models_target_index",columns:["categorizable_id","categorizable_type"],type:"index"}]})}for(let Fe of Object.keys(d)){let Ie=d[Fe],Ve=Ie?.belongsToMany;if(!Ve||typeof Ve!=="object"||Array.isArray(Ve))continue;let gt=p(Ie),bt=Jr(gt);for(let[pt,xt]of Object.entries(Ve)){let jt=xt;if(!jt||typeof jt!=="object")continue;if(jt.through)continue;let Ht=jt.pivot;if(!Ht||!Ht.columns&&!Ht.timestamps&&!Ht.uniques)continue;let Le=jt.model,ke=d[Le]?.table||`${String(Le).toLowerCase()}s`,ve=Jr(ke),yt=jt.table||[bt,ve].sort().join("_"),He=jt.foreignKey||`${bt}_id`,zt=jt.relatedKey||`${ve}_id`,It=new Set([He,zt,...Object.keys(Ht.columns??{})]),Wt=new Set;for(let vt of It){if(!vt.endsWith("_type"))continue;let Ft=`${vt.slice(0,-5)}_id`;if(It.has(Ft))Wt.add(Ft)}let $t=(vt,Ft)=>Wt.has(vt)?void 0:{table:Ft,column:"id"},ht=[{name:"id",type:"bigint",isPrimaryKey:!0,isUnique:!1,isNullable:!1,hasDefault:!1},{name:He,type:"bigint",isPrimaryKey:!1,isUnique:!1,isNullable:!1,hasDefault:!1,references:$t(He,gt)},{name:zt,type:"bigint",isPrimaryKey:!1,isUnique:!1,isNullable:!1,hasDefault:!1,references:$t(zt,ke)}];if(Ht.columns)for(let[vt,Ft]of Object.entries(Ht.columns)){let Yt=Ft,Et=Bs(vt)??"string";ht.push({name:vt,type:Et,isPrimaryKey:!1,isUnique:!1,isNullable:Yt?.nullable??!1,hasDefault:Yt?.default!==void 0,defaultValue:Yt?.default})}if(Ht.timestamps)ht.push({name:"created_at",type:"datetime",isPrimaryKey:!1,isUnique:!1,isNullable:!1,hasDefault:!0,defaultValue:g}),ht.push({name:"updated_at",type:"datetime",isPrimaryKey:!1,isUnique:!1,isNullable:!0,hasDefault:!1});let wt=[],St=Ht.uniques&&Ht.uniques.length>0?Ht.uniques:[[He,zt]];for(let vt=0;vt<St.length;vt++){let Ft=St[vt];wt.push({name:`${yt}_${Ft.join("_")}_unique${vt>0?`_${vt}`:""}`,columns:[...Ft],type:"unique"})}Ne({table:yt,columns:ht,indexes:wt})}}let xe=new Map(E.map((Fe)=>[Fe.table,Fe]));for(let Fe of E)for(let Ie of Fe.columns){if(!Ie.references)continue;let Ve=xe.get(Ie.references.table)?.columns.find((gt)=>gt.name===Ie.references.column);if(!Ve||Ie.type===Ve.type)continue;Ie.type=Ve.type,Ie.maxLength=Ve.maxLength,Ie.enumValues=Ve.enumValues,Ie.enumTypeName=Ve.enumTypeName}return{dialect:h.dialect,vitessSharded:h.vitessSharded,tables:E}}function Ee(d,h={}){$r=0,nr=0,ir=0,Lr=[],fr=null,_r=!0;let D=h.dryRun?()=>!1:Is,E=[],V=f(d.dialect,{vitessSharded:d.vitessSharded}),{tables:Ne,deferredForeignKeys:xe}=Ps(d.tables,d.dialect);for(let[Ie,Ve]of Ne.entries()){let gt={...Ve,columns:Ve.columns.map((Ht)=>xe.has(mr(Ve.table,Ht.name))?{...Ht,references:void 0}:Ht)},bt=[],pt=new Set;for(let Ht of gt.columns)if(Ht.type==="enum"&&Ht.enumValues&&Ht.enumValues.length>0){let Le=`${gt.table}_${Ht.name}_type`;if(Ht.enumTypeName=Le,!pt.has(Le)){let Ue=V.createEnumType(Le,Ht.enumValues);if(Ue)bt.push(Ue);pt.add(Le)}}let xt=V.createTable(gt);bt.push(xt);for(let Ht of gt.indexes)bt.push(V.createIndex(gt.table,Ht,gt.columns));if(Ie===Ne.length-1)for(let Ht of Ne)for(let Le of Ht.columns){if(!Le.references||!xe.has(mr(Ht.table,Le.name)))continue;let Ue=V.addForeignKey(Ht.table,Le.name,Le.references.table,Le.references.column,Le.references.onDelete,Le.references.onUpdate);if(Ue)bt.push(Ue)}E.push(...bt);let jt=bt.join(`
373
-
374
- `);D(jt,`create-${gt.table}-table`)}if(nr+ir===0)_n("-- Nothing to migrate");else{let Ie=[];if(nr>0)Ie.push(`${nr} created`);if(ir>0)Ie.push(`${ir} updated`);_n(`-- Migration files: ${Ie.join(", ")}`)}return E}function mr(d,h){return`${d}\x00${h}`}function Ps(d,h){if(h==="sqlite"||d.length<2)return{tables:d,deferredForeignKeys:new Set};let D=new Map(d.map((Ie)=>[Ie.table,Ie])),E=new Map;for(let Ie of d)E.set(Ie.table,new Set(Ie.columns.map((Ve)=>Ve.references?.table).filter((Ve)=>Boolean(Ve&&Ve!==Ie.table&&D.has(Ve)))));let V=[],Ne=new Set;while(V.length<d.length){let Ie=d.find((Ve)=>!Ne.has(Ve.table)&&[...E.get(Ve.table)??[]].every((gt)=>Ne.has(gt)));if(!Ie)break;V.push(Ie),Ne.add(Ie.table)}let xe=new Set(d.filter((Ie)=>!Ne.has(Ie.table)).map((Ie)=>Ie.table)),Fe=new Set;for(let Ie of d){if(!xe.has(Ie.table))continue;for(let Ve of Ie.columns)if(Ve.references&&xe.has(Ve.references.table)&&Ve.references.table!==Ie.table)Fe.add(mr(Ie.table,Ve.name))}return V.push(...d.filter((Ie)=>xe.has(Ie.table))),{tables:V,deferredForeignKeys:Fe}}function mn(d){return Ee(d).join(`
375
- `)}function hn(d,h){return Mt(d,h).join(`
376
- `)}function ut(d){let h=ni("crypto");function D(V){if(V==null||typeof V!=="object"||V instanceof Date)return V;if(Array.isArray(V))return V.map((xe)=>D(xe));let Ne={};for(let xe of Object.keys(V).sort())Ne[xe]=D(V[xe]);return Ne}let E=JSON.stringify(D(d));return h.createHash("sha256").update(E).digest("hex")}function Os(d){let h={};for(let D of d)h[D.table]=D;return h}function Er(d){let h={};for(let D of d)h[D.name]=D;return h}function Pe(d,h){if(h==="sqlite"){if(d.name.endsWith("_id")&&A(d.type))return"INTEGER";switch(d.type){case"string":case"text":case"date":case"datetime":case"timestamptz":case"json":case"enum":return"TEXT";case"boolean":case"integer":case"bigint":return"INTEGER";case"float":case"double":case"decimal":return"REAL";default:return"TEXT"}}if(h==="mysql"||h==="vitess"||h==="singlestore")switch(d.type){case"string":return`VARCHAR(${d.maxLength??255})`;case"text":return"TEXT";case"boolean":return"TINYINT(1)";case"integer":return"INTEGER";case"bigint":return"BIGINT";case"float":return"REAL";case"double":return"DOUBLE";case"decimal":return"DECIMAL";case"date":return"DATE";case"datetime":case"timestamptz":return"DATETIME";case"json":return"JSON";case"enum":return"ENUM";default:return d.type}return d.type}var g="UTC_TIMESTAMP";function Oe(d,h){if(!d.hasDefault||d.defaultValue===void 0)return;let D=d.defaultValue;if(D instanceof Date)return D.toISOString();if(typeof D==="boolean")return D?"1":"0";if(typeof D==="bigint"||typeof D==="number")return String(D);let E=String(D).trim();if(E=E.replace(/::[\w ]+$/i,"").trim(),E.startsWith("'")&&E.endsWith("'")||E.startsWith('"')&&E.endsWith('"'))E=E.slice(1,-1);let V=E.toUpperCase();if(["UTC_TIMESTAMP","UTC_TIMESTAMP()","(UTC_TIMESTAMP)","(UTC_TIMESTAMP())","TIMEZONE('UTC', NOW())","TIMEZONE('UTC'::TEXT, NOW())","(NOW() AT TIME ZONE 'UTC')","NOW() AT TIME ZONE 'UTC'"].includes(V.replace(/\s+/g," ")))return g;if(h==="sqlite"&&V==="CURRENT_TIMESTAMP")return g;if(["CURRENT_TIMESTAMP","NOW()","CURRENT_DATE","CURRENT_TIME","NULL","TRUE","FALSE"].includes(V))return V==="NOW()"?"CURRENT_TIMESTAMP":V;if(d.type==="boolean"){if(/^(?:1|t|true|yes)$/i.test(E))return"1";if(/^(?:0|f|false|no)$/i.test(E))return"0"}if(/^-?\d+(?:\.\d+)?$/.test(E))return String(Number(E));return E}function wa(d,h,D){if(Pe(d,D)!==Pe(h,D))return!0;if(d.isNullable!==h.isNullable)return!0;if(d.hasDefault!==h.hasDefault)return!0;if(Oe(d,D)!==Oe(h,D))return!0;if(d.isUnique!==h.isUnique)return!0;if(d.type==="enum"&&h.type==="enum"){let E=(d.enumValues||[]).slice().sort().join(","),V=(h.enumValues||[]).slice().sort().join(",");if(E!==V)return!0}return!1}function Ms(d,h){return JSON.stringify([Pe(d,h),d.isPrimaryKey,d.isUnique,d.isNullable,d.hasDefault,Oe(d,h)??null,(d.enumValues??[]).slice().sort(),d.references?[d.references.table,d.references.column,d.references.onDelete??null,d.references.onUpdate??null]:null])}function Da(d,h,D){let E=Object.keys(d).filter((gt)=>!h[gt]),V=Object.keys(h).filter((gt)=>!d[gt]),Ne=new Map,xe=new Map;for(let gt of E){let bt=Ms(d[gt],D),pt=Ne.get(bt)??[];pt.push(gt),Ne.set(bt,pt)}for(let gt of V){let bt=Ms(h[gt],D),pt=xe.get(bt)??[];pt.push(gt),xe.set(bt,pt)}let Fe=[],Ie=new Set,Ve=new Set;for(let[gt,bt]of Ne){let pt=xe.get(gt);if(bt.length===1&&pt&&pt.length===1)Fe.push({from:bt[0],to:pt[0]}),Ie.add(bt[0]),Ve.add(pt[0])}return{renames:Fe,removed:E.filter((gt)=>!Ie.has(gt)),added:V.filter((gt)=>!Ve.has(gt))}}function Ea(d,h){let D=d.columns.find((E)=>E.name===h);if(D&&(D.isPrimaryKey||D.isUnique||D.references))return!0;return d.indexes.some((E)=>E.columns.includes(h))}function $a(d,h){if(Boolean(d)!==Boolean(h))return!0;if(!d||!h)return!1;if((d.constraintNames?.length??0)>1)return!0;let D=(E)=>(E??"no action").toLowerCase();return d.table!==h.table||d.column!==h.column||D(d.onDelete)!==D(h.onDelete)||D(d.onUpdate)!==D(h.onUpdate)}function vs(d,h){return`${d.type}:${Jn(h,d.name)}:${d.columns.join(",")}`}function Hr(d,h){let D={};for(let E of d)D[vs(E,h)]=E;return D}function _e(d,h,D={}){if(!d||d.dialect!==h.dialect){let ke=Ee(h,{dryRun:D.dryRun}),ve=h.tables.map((yt)=>({kind:"create_table",table:yt.table,destructive:!1,sql:""}));return{statements:ke,operations:ve}}let E=D.applyRenames!==!1,V=D.preserveUnknownColumns===!0,Ne=D.dryRun?()=>!1:Is;$r=0,nr=0,ir=0,Lr=[],fr=null,_r=!1;let xe=[],Fe=[],Ie=f(h.dialect,{vitessSharded:h.vitessSharded}),Ve=h.dialect,gt=Os(d.tables),bt=Os(h.tables);for(let ke of Object.keys(gt))if(!bt[ke]){let ve=Ie.dropTable(ke);xe.push(ve),Fe.push({kind:"drop_table",table:ke,destructive:!0,sql:ve}),Ne(ve,`drop-${ke}-table`),_n(`-- Detected dropped table: ${ke}`)}let pt=Object.keys(bt).filter((ke)=>!gt[ke]).map((ke)=>bt[ke]),{tables:xt,deferredForeignKeys:jt}=Ps(pt,Ve);for(let[ke,ve]of xt.entries()){let yt={...ve,columns:ve.columns.map(($t)=>jt.has(mr(ve.table,$t.name))?{...$t,references:void 0}:$t)},He=[],zt=new Set;for(let $t of yt.columns)if($t.type==="enum"&&$t.enumValues&&$t.enumValues.length>0){let ht=`${yt.table}_${$t.name}_type`;if($t.enumTypeName=ht,!zt.has(ht)){let wt=Ie.createEnumType(ht,$t.enumValues);if(wt)He.push(wt);zt.add(ht)}}let It=Ie.createTable(yt);He.push(It);for(let $t of yt.indexes){let ht=Ie.createIndex(yt.table,$t,yt.columns);He.push(ht),Fe.push({kind:"create_index",table:yt.table,column:$t.name,destructive:!1,sql:ht})}for(let $t of ve.columns)if($t.references&&!jt.has(mr(ve.table,$t.name)))Fe.push({kind:"add_foreign_key",table:ve.table,column:$t.name,destructive:!1,sql:It});if(ke===xt.length-1)for(let $t of xt)for(let ht of $t.columns){if(!ht.references||!jt.has(mr($t.table,ht.name)))continue;let wt=Ie.addForeignKey($t.table,ht.name,ht.references.table,ht.references.column,ht.references.onDelete,ht.references.onUpdate);if(!wt)continue;He.push(wt),Fe.push({kind:"add_foreign_key",table:$t.table,column:ht.name,destructive:!1,sql:wt})}xe.push(...He),Fe.push({kind:"create_table",table:yt.table,destructive:!1,sql:It});let Wt=He.join(`
377
-
378
- `);Ne(Wt,`create-${yt.table}-table`)}let Ht=new Set;for(let ke of Object.keys(bt)){let ve=gt[ke],yt=bt[ke];if(!ve)continue;let He=Er(ve.columns),zt=Er(yt.columns);for(let It of Object.keys(zt)){let Wt=zt[It];if(Wt.type!=="enum"||!Wt.enumValues||Wt.enumValues.length===0)continue;let $t=`${yt.table}_${Wt.name}_type`;if(Wt.enumTypeName=$t,He[It])continue;if(!Ht.has($t)){let ht=Ie.createEnumType($t,Wt.enumValues);if(ht)xe.push(ht),Fe.push({kind:"create_enum",table:yt.table,column:Wt.name,destructive:!1,sql:ht}),Ne(ht,`create-${$t}-enum`);Ht.add($t)}}}for(let ke of Object.keys(bt)){let ve=gt[ke],yt=bt[ke];if(!ve)continue;let He=Er(ve.columns),zt=Hr(ve.indexes,ve.table),It=Er(yt.columns),Wt=Hr(yt.indexes,yt.table),$t=[],ht=Object.keys(He).filter((Et)=>!It[Et]),wt=Object.keys(It).filter((Et)=>!He[Et]);if(E&&!V){let Et=Da(He,It,Ve);$t=Et.renames,ht=Et.removed,wt=Et.added}if(V){let Et=ht.map((Qt)=>He[Qt]),Jt=ve.indexes.filter((Qt)=>!Wt[vs(Qt,ve.table)]);if(Et.length>0||Jt.length>0){if(Et.length>0)_n(`-- Keeping ${Et.length} column(s) on "${yt.table}" no model declares: ${ht.join(", ")} \u2014 reconciled from the database, where an undeclared column is out of scope rather than removed`);if(Jt.length>0)_n(`-- Keeping ${Jt.length} index(es) on "${yt.table}" no model declares: ${Jt.map((Qt)=>Qt.name).join(", ")} \u2014 reconciled from the database, where an undeclared index is out of scope rather than removed`);yt={...yt,columns:[...yt.columns,...Et],indexes:[...yt.indexes,...Jt]},It=Er(yt.columns),Wt=Hr(yt.indexes,yt.table)}ht=[]}let St=Object.keys(It).filter((Et)=>He[Et]&&wa(He[Et],It[Et],Ve)),vt=Object.keys(It).filter((Et)=>He[Et]&&$a(He[Et].references,It[Et].references));if(Ve==="sqlite"){if(St.length>0||vt.length>0||ht.some((Jt)=>Ea(ve,Jt))){let Jt={},Qt=new Map($t.map((Dn)=>[Dn.to,Dn.from]));for(let Dn of yt.columns)if(He[Dn.name])Jt[Dn.name]=Dn.name;else if(Qt.has(Dn.name))Jt[Dn.name]=Qt.get(Dn.name);let yn=`_qb_tmp_${yt.table}`,_t=0;while((gt[yn]||bt[yn])&&_t<100)_t+=1,yn=`_qb_tmp_${yt.table}_${_t}`;let Vt=Ie.rebuildTable({target:yt,tempName:yn,columnSource:Jt});xe.push(Vt);let wn=St.some((Dn)=>He[Dn].type!==It[Dn].type);Fe.push({kind:"rebuild_table",table:yt.table,destructive:ht.length>0||wn,sql:Vt});for(let Dn of $t)Fe.push({kind:"rename_column",table:yt.table,from:Dn.from,to:Dn.to,destructive:!1,confidence:"high",sql:Vt});for(let Dn of ht)Fe.push({kind:"drop_column",table:yt.table,column:Dn,destructive:!0,sql:Vt});_n(`-- Detected SQLite table rebuild required: ${yt.table}`),Ne(Vt,`alter-${yt.table}-table`);continue}}let Ft=[],Yt=!1;for(let Et of Object.keys(zt))if(!Wt[Et]){let Jt=zt[Et],Qt=Ie.dropIndex(yt.table,Jt.name);Ft.push(Qt),xe.push(Qt),Fe.push({kind:"drop_index",table:yt.table,column:Jt.name,destructive:!1,sql:Qt}),_n(`-- Detected dropped index: ${Jt.name} from ${yt.table}`),Yt=!0}for(let Et of $t){let Jt=Ie.renameColumn(yt.table,Et.from,Et.to);Ft.push(Jt),xe.push(Jt),Fe.push({kind:"rename_column",table:yt.table,from:Et.from,to:Et.to,destructive:!1,confidence:"high",sql:Jt}),_n(`-- Detected renamed column: ${yt.table}.${Et.from} -> ${Et.to}`),Yt=!0}for(let Et of ht){let Jt=Ie.dropColumn(yt.table,Et);Ft.push(Jt),xe.push(Jt),Fe.push({kind:"drop_column",table:yt.table,column:Et,destructive:!0,sql:Jt}),_n(`-- Detected dropped column: ${yt.table}.${Et}`),Yt=!0}for(let Et of St){let Jt=He[Et],Qt=It[Et],yn=Ie.modifyColumn(yt.table,Qt);Ft.push(yn),xe.push(yn),Fe.push({kind:"modify_column",table:yt.table,column:Et,destructive:Jt.type!==Qt.type&&!At(Jt.type,Qt.type),sql:yn}),_n(`-- Detected column change: ${yt.table}.${Et} (${Jt.type} -> ${Qt.type})`),Yt=!0}for(let Et of vt){let Jt=It[Et];if(!Jt.references)continue;let Qt=Ie.addForeignKey(yt.table,Jt.name,Jt.references.table,Jt.references.column,Jt.references.onDelete,Jt.references.onUpdate,He[Et].references?.constraintNames);if(!Qt)continue;Ft.push(Qt),xe.push(Qt),Fe.push({kind:"add_foreign_key",table:yt.table,column:Et,destructive:!1,sql:Qt}),_n(`-- Detected foreign-key change: ${yt.table}.${Et} -> ${Jt.references.table}(${Jt.references.column})`),Yt=!0}for(let Et of wt){let Jt=It[Et],Qt=Ie.addColumn(yt.table,Jt);if(Ft.push(Qt),xe.push(Qt),Fe.push({kind:"add_column",table:yt.table,column:Jt.name,destructive:!1,sql:Qt}),_n(`-- Detected new column: ${yt.table}.${Jt.name}`),Yt=!0,Jt.references){let yn=Ie.addForeignKey(yt.table,Jt.name,Jt.references.table,Jt.references.column,Jt.references.onDelete,Jt.references.onUpdate);if(yn)Ft.push(yn),xe.push(yn),Fe.push({kind:"add_foreign_key",table:yt.table,column:Jt.name,destructive:!1,sql:yn})}}for(let Et of Object.keys(Wt))if(!zt[Et]){let Jt=Wt[Et],Qt=Ie.createIndex(yt.table,Jt,yt.columns);Ft.push(Qt),xe.push(Qt),Fe.push({kind:"create_index",table:yt.table,column:Jt.name,destructive:!1,sql:Qt}),_n(`-- Detected new index: ${Jt.name} in ${yt.table}`),Yt=!0}if(Yt){let Et=Ft.join(`
379
-
380
- `);Ne(Et,`alter-${yt.table}-table`)}}if(nr+ir===0)_n("-- Nothing to migrate");else{let ke=[];if(nr>0)ke.push(`${nr} created`);if(ir>0)ke.push(`${ir} updated`);_n(`-- Migration files: ${ke.join(", ")}`)}return{statements:xe.length===0?["-- No changes detected"]:xe,operations:Fe}}function Mt(d,h,D={}){return _e(d,h,D).statements}function gn(d){return d}class Nt{get order(){return 100}get description(){return}}function pn(d){return d}function dt(d){switch(d){case"text":return"text";case"string":case"enum":return"varchar";case"integer":case"bigint":return"integer";case"float":case"double":case"decimal":return"fractional";case"boolean":return"boolean";case"date":case"datetime":case"timestamptz":return"date";case"json":return"json";default:return"other"}}function ft(d){let h=String(d??"").toLowerCase().trim();if(/^(?:bool|boolean|bit)\b/.test(h)||h==="tinyint(1)")return"boolean";if(/^(?:json|jsonb)\b/.test(h))return"json";if(/^(?:bytea|blob|binary|varbinary)\b/.test(h))return"binary";if(/^(?:date|time|timestamp|datetime)\b/.test(h))return"date";if(/(?:^|\b)(?:varchar|character varying|nvarchar|char)\b/.test(h))return"varchar";if(/^(?:text|longtext|mediumtext|tinytext|clob|citext)\b/.test(h))return"text";if(/^(?:decimal|numeric|real|double|money)\b/.test(h)||/^float\d*\b/.test(h))return"fractional";if(/^(?:integer|bigint|smallint|tinyint|serial|bigserial|smallserial|mediumint)\b/.test(h)||/^int\d*\b/.test(h))return"integer";return"other"}function mt(d,h,D){if(d===h)return!0;if(D==="sqlite"){if(d==="boolean"&&h==="integer")return!0;if((d==="date"||d==="json")&&h==="text")return!0}if(r(D)&&d==="boolean"&&h==="integer")return!0;if(d==="varchar"&&h==="text")return!0;if(d==="integer"&&h==="fractional")return!0;if(d==="other"||h==="other")return!0;return!1}async function Bt(d,h={}){let D=h.dialect??e.dialect,E=d.tables.map((Ve)=>Ve.table),V=await v({tables:E}),Ne=new Map(V.map((Ve)=>[Ve.table.toLowerCase(),Ve])),xe=[],Fe=[],Ie=[];for(let Ve of d.tables){let gt=Ne.get(Ve.table.toLowerCase());if(!gt){xe.push(Ve.table);continue}let bt=new Map(gt.columns.map((pt)=>[pt.name.toLowerCase(),pt]));for(let pt of Ve.columns){let xt=bt.get(pt.name.toLowerCase()),jt=dt(pt.type);if(!xt){Fe.push({table:Ve.table,column:pt.name,expected:jt});continue}let Ht=ft(xt.sqlType);if(!mt(jt,Ht,D))Ie.push({table:Ve.table,column:pt.name,expected:jt,actual:Ht,actualSqlType:xt.sqlType})}}return{missingTables:xe,missingColumns:Fe,typeMismatches:Ie,clean:xe.length===0&&Fe.length===0&&Ie.length===0}}function Pt(d){if(d.clean)return"";let h=[];if(d.missingTables.length>0)h.push(` Missing tables: ${d.missingTables.join(", ")}`);for(let V of d.missingColumns.slice(0,10))h.push(` \u2022 ${V.table}.${V.column} is missing (models declare ${V.expected})`);for(let V of d.typeMismatches.slice(0,10))h.push(` \u2022 ${V.table}.${V.column} is ${V.actualSqlType}, models declare ${V.expected}`);let D=Math.min(d.missingColumns.length,10)+Math.min(d.typeMismatches.length,10),E=d.missingColumns.length+d.typeMismatches.length;if(E>D)h.push(` + ${E-D} more`);return["The live schema does not match the models.",...h,"","Migrations will NOT fix this on their own: the runner only applies files that have","not run yet, and a corrected `CREATE TABLE IF NOT EXISTS` is a no-op against a table","that already exists. Regenerate and apply the difference, or rebuild the schema."].join(`
381
- `)}async function ka(d,h,D){if(D.length===0)return;let E=Vs(lr());try{await Js(d,h);for(let V of D)await qr(d,V,h),Sn(`-- \u2713 Recorded applied migration: ${V}`)}catch(V){Sn(`-- Could not record applied migrations (the schema change itself succeeded): ${V instanceof Error?V.message:String(V)}`)}}function Qs(d){try{return lt(Rr(d,"utf8"))}catch{return!1}}function Ba(d){let h=d instanceof Error?d.message:String(d);return/duplicate column name/i.test(h)||/duplicate key name/i.test(h)||/duplicate foreign key constraint name/i.test(h)||/\balready exists\b/i.test(h)}function Sn(d){if(e.verbose)console.log(d)}function js(d){return Kn(d,e.snapshotDir||".qb")}function es(d,h){return Kn(js(d),`model-snapshot.${h}.json`)}function Aa(d,h){let D=es(d,h);if(!Xn(D))return;try{let E=Rr(D,"utf8"),V=JSON.parse(E);if(V?.plan&&Array.isArray(V.plan.tables)&&V.plan.dialect)return V.plan;if(Array.isArray(V?.tables)&&V?.dialect)return V;Sn("-- Invalid snapshot format, treating as no previous state");return}catch(E){Sn(`-- Could not load snapshot, treating as no previous state: ${E instanceof Error?E.message:String(E)}`);return}}function Ws(d,h,D){let E=es(d,h),V=js(d),Ne=ut(D);if(Xn(E))try{let Fe=JSON.parse(Rr(E,"utf8"));if(Fe?.hash===Ne&&Fe?.dialect===h&&Fe?.plan){Sn("-- Model snapshot unchanged");return}}catch{}if(!Xn(V))qs(V,{recursive:!0}),Sn(`-- Created snapshot directory: ${V}`);let xe={plan:D,hash:Ne,dialect:h,updatedAt:new Date().toISOString()};Us(E,JSON.stringify(xe,null,2)),Sn(`-- Model snapshot saved to ${E}`)}function Ye(d,h={}){let D=h.dialect??d.dialect;Ws(h.workspaceRoot??lr(),D,d)}function lr(){return Wr()}function Vs(d){let h=tr(d,e.migrationDir);if(!Xn(h))qs(h,{recursive:!0}),Sn(`-- Created SQL directory: ${h}`);return h}async function b(d,h={}){if(await Q(),!d)d=Kn(Zr.cwd(),"app/Models");let D=h.dialect||e.dialect||"postgres",E=lr(),V=await u({modelsDir:d}),Ne=W(V,{dialect:D,vitessSharded:h.vitessSharded}),xe,Fe=!1;if(!h.full)if(xe=Aa(E,D),xe)Sn("-- Comparing with stored model snapshot");else{let xt=Kn(d,`.qb-migrations.${D}.json`),jt=String(h.state||xt);if(Xn(jt))try{let Ht=Rr(jt,"utf8"),Le=JSON.parse(Ht);if(xe=Le?.plan&&Le.plan.tables?Le.plan:Le?.tables?Le:void 0,xe)Sn("-- Comparing with legacy state file (will migrate to new snapshot format)")}catch{}if(!xe||h.fromDb)try{let Ht=await us(D),Le=new Set(Ne.tables.map((ke)=>ke.table)),Ue=Ht.tables.filter((ke)=>Le.has(ke.table));if(Ue.length>0)xe={dialect:Ht.dialect,tables:Ue},Fe=!0,Sn(`-- No snapshot; reconciling against live database (${Ue.length} matching table${Ue.length===1?"":"s"})`)}catch(Ht){Sn(`-- Could not introspect live database, treating as no previous state: ${Ht instanceof Error?Ht.message:String(Ht)}`)}if(!xe)Sn("-- No previous snapshot found, generating full migration")}else Sn("-- Full migration requested, ignoring any previous state");let Ie=h.full?{statements:Ee(Ne,{dryRun:h.dryRun}),operations:Ne.tables.map((xt)=>({kind:"create_table",table:xt.table,destructive:!1,sql:""}))}:_e(xe,Ne,{applyRenames:h.applyRenames,dryRun:h.dryRun,preserveUnknownColumns:Fe}),{statements:Ve,operations:gt}=Ie,bt=Ve.join(`
382
- `),pt=Ve.some((xt)=>/\b(?:CREATE|ALTER|DROP)\b/i.test(xt));if(h.apply){let xt=Ra(Kn(xa(),"qb-migrate-")),jt=Kn(xt,"migration.sql");try{if(pt){Us(jt,bt);let Ht=i();await Ht.file(jt),Sn("-- Migration applied"),await ka(Ht,D,at())}else Sn("-- No changes; nothing to apply")}catch(Ht){throw console.error("-- Migration failed:",Ht),Ht}finally{Fs(xt,{recursive:!0,force:!0})}}if(!h.dryRun)Ws(E,D,Ne);return{sql:bt,sqlStatements:Ve,hasChanges:pt,plan:Ne,operations:gt}}function Oa(d,h){if(d===void 0)return[Vs(h)];let D=Array.isArray(d)?d:[d];if(D.length===0)throw Error("executeMigration was given an empty list of directories. Pass at least one directory, or omit the argument to use the configured migrationDir.");return D.map((E)=>Na(E)?E:Kn(h,E))}function Ma(d){let h=new Map;for(let D of d){if(!Xn(D))throw Error(`Migration directory not found: ${D}`);for(let E of Ks(D).filter((V)=>V.endsWith(".sql"))){let V=h.get(E);if(V!==void 0)throw Error(`Duplicate migration file name across directories: "${E}" appears in both ${V} and ${Kn(D,E)}. Migrations are recorded by file name, so names must be unique across every directory in a run.`);h.set(E,Kn(D,E))}}return[...h].map(([D,E])=>({name:D,path:E})).sort((D,E)=>D.name<E.name?-1:D.name>E.name?1:0)}var _s="bun-query-builder:migrate",Ca=/\bCONCURRENTLY\b|^\s*VACUUM\b|^\s*BEGIN\s*(?:;|TRANSACTION\b)|^\s*PRAGMA\s+foreign_keys\b/im;function Ls(d){return d==="postgres"||d==="sqlite"}async function Ia(d,h){if(d==="sqlite")return await h();let D=i(),E;try{E=await D.reserve()}catch{return await h()}let V=!1;try{return await E.advisoryLock(_s),V=!0,await h()}finally{try{if(V)await E.advisoryUnlock(_s)}finally{E.release?.()}}}async function k(d){await Q();let h=lr(),D=e.dialect||"postgres",E=Ma(Oa(d,h));if(E.length===0)return Sn("-- No migration files found to execute"),!0;Sn(`-- Found ${E.length} script files to execute`);try{let V=i();return await Ia(D,async()=>{await Js(V,D);let Ne=await La(V,D),xe=E.filter((Fe)=>!Ne.includes(Fe.name));if(xe.length===0)return Sn("-- No pending migrations to execute"),!0;Sn(`-- Executing ${xe.length} migration${xe.length===1?"":"s"}`);for(let{name:Fe,path:Ie}of xe){Sn(`-- Executing: ${Fe}`);try{if(Ls(D)&&!Ca.test(Rr(Ie,"utf-8")))await V.transaction(async(gt)=>{await gt.file(Ie),await qr(gt,Fe,D)});else if(await V.file(Ie),await qr(V,Fe,D),!Ls(D))Sn(`-- (${D} commits DDL implicitly, so ${Fe} was not applied atomically)`);else Sn(`-- (${Fe} contains a statement that cannot run in a transaction, so it was not applied atomically)`);Sn(`-- \u2713 Migration ${Fe} executed and recorded`)}catch(Ve){if(Qs(Ie)&&Ba(Ve)){await qr(V,Fe,D),Sn(`-- \u2713 Migration ${Fe} was already applied; recorded it (${Ve instanceof Error?Ve.message:String(Ve)})`);continue}throw console.error(`-- \u2717 Migration ${Fe} failed:`,Ve),Ve}}return Sn("-- All migrations executed successfully"),!0})}catch(V){throw console.error("-- Migration execution failed:",V),V}return!0}async function C(d,h={}){if(await Q(),!d)d=Kn(Zr.cwd(),"app/Models");let D=h.dialect||e.dialect||"postgres",E=f(D),V=lr(),Ne=async(xe)=>{let Fe=E.dropTable(xe);await We(async(Ie)=>{if(D==="sqlite")await Ie.unsafe("PRAGMA foreign_keys = OFF").execute();if(D==="mysql"||D==="vitess")await Ie.unsafe("SET FOREIGN_KEY_CHECKS = 0").execute();try{await Ie.unsafe(Fe).execute()}finally{if(D==="sqlite")await Ie.unsafe("PRAGMA foreign_keys = ON").execute();if(D==="mysql"||D==="vitess")await Ie.unsafe("SET FOREIGN_KEY_CHECKS = 1").execute()}})};try{try{await Ne("migrations"),Sn("-- Dropped migrations table")}catch(Ie){console.error(Ie)}let xe=[],Fe=[];try{let Ie=await u({modelsDir:d}),Ve=W(Ie,{dialect:D});xe=Ve.tables.map((bt)=>bt.table);let gt=new Set;for(let bt of Ve.tables)for(let pt of bt.columns)if(pt.type==="enum"&&pt.enumValues&&pt.enumValues.length>0){let xt=`${bt.table}_${pt.name}_type`;gt.add(xt)}Fe=Array.from(gt)}catch(Ie){console.error(Ie),xe=[],Fe=[]}if(xe.length===0)Sn("-- No tables found to drop");else{Sn(`-- Dropping ${xe.length} tables: ${xe.join(", ")}`);for(let Ie of xe.reverse())try{await Ne(Ie),Sn(`-- Dropped table: ${Ie}`)}catch(Ve){console.error(Ve),Sn(`-- Table ${Ie} may not exist, skipping drop`)}}if(Fe.length>0){Sn(`-- Dropping ${Fe.length} enum types: ${Fe.join(", ")}`);for(let Ie of Fe)try{let Ve=E.dropEnumType(Ie);if(Ve)await We(async(gt)=>{await gt.unsafe(Ve).execute(),Sn(`-- Dropped enum type: ${Ie}`)})}catch(Ve){console.error(Ve),Sn(`-- Enum type ${Ie} may not exist, skipping drop`)}}else Sn("-- No enum types found to drop");if(xe.length>0&&!h.preserveMigrationState)try{await Pa(d,V,h)}catch(Ie){console.error(Ie),Sn("-- Could not clean up migration files")}else if(xe.length===0)Sn("-- No models directory found; keeping committed migration files in place");else Sn("-- Preserving migration files and model snapshot for fresh replay");if(!h.preserveMigrationState)try{await _a(V)}catch(Ie){console.error(Ie),Sn("-- Could not clear generated directory")}return Sn("-- Database reset completed successfully"),!0}catch(xe){return console.error("-- Database reset failed:",xe),!1}}async function Pa(d,h,D={}){if(!d)d=Kn(Zr.cwd(),"app/Models");if(!h)h=lr();let E=String(D.dialect||e.dialect||"postgres"),V=es(h,E);if(Xn(V))Xr(V),Sn(`-- Removed model snapshot file: ${V}`);let Ne=Kn(d,`.qb-migrations.${E}.json`),xe=String(D.state||Ne);if(Xn(xe))Xr(xe),Sn(`-- Removed legacy migration state file: ${xe}`);va(tr(h,e.migrationDir))}function va(d){if(!Xn(d))return;let h=0,D=[];for(let E of Ks(d).filter((V)=>V.endsWith(".sql"))){if(!Qs(Kn(d,E))){D.push(E);continue}Xr(Kn(d,E)),Sn(`-- Removed generated migration file: ${E}`),h+=1}if(Sn(`-- Cleaned up ${h} generated migration file${h===1?"":"s"} from migrations directory`),D.length>0)Sn(`-- Kept ${D.length} hand-written migration${D.length===1?"":"s"}: ${D.slice(0,5).join(", ")}${D.length>5?`, +${D.length-5} more`:""}`)}async function _a(d){if(!d)d=lr();let h=Kn(d,"generated");if(Xn(h))try{Fs(h,{recursive:!0,force:!0}),Sn("-- Cleared generated directory")}catch(D){console.error("-- Failed to clear generated directory:",D)}}async function Js(d,h){let E=f(h).createMigrationsTable();try{await d.unsafe(E).execute(),Sn("-- Migrations table ready")}catch(V){throw console.error("-- Failed to create migrations table:",V),V}}async function La(d,h){let D=f(h);try{return(await d.unsafe(D.getExecutedMigrationsQuery()).execute()).map((V)=>V.migration)}catch(E){return console.error("-- Failed to get executed migrations:",E),[]}}async function qr(d,h,D){let E=f(D);try{Sn(`-- Recording migration: ${h}`),await d.unsafe(E.recordMigrationQuery(),[h]).execute(),Sn(`-- Successfully recorded migration: ${h}`)}catch(V){throw console.error(`-- Failed to record migration ${h}:`,V),V}}
383
- export{J,S,Zt,en,l,kt,Ct,i,Qe,Ge,z,Y,X,N,Z,ee,te,ne,B,re,P,O,ie,se,_,ae,oe,Je,Be,ze,v,le,a,ce,ue,de,fe,f,Ye,b,k,C,me,he,I,ge,L,pe,K,F,R,j,ye,be,Te,we,q,Se,De,T,m,tn,nn,rn,Xe,Ze,et,tt,nt,sn,rt,Rt,an,on,ln,cn,it,un,dn,fn,$e,u,st,at,ot,lt,ct,At,W,Ee,mn,hn,ut,Pe,g,Oe,_e,Mt,gn,Nt,pn,dt,ft,mt,Bt,Pt};