bun-query-builder 0.3.5 → 0.3.6

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,43 +1,5 @@
1
1
  // @bun
2
- import{n,e,B,t,P,Le,tt,r,T,m}from"./chunk-455vt4nn.js";import{i,Ce,Re}from"./chunk-r6myba29.js";import{N,Oe,Be,O}from"./chunk-s66vynk9.js";import{u}from"./chunk-vxh8ktv7.js";var Ar=import.meta.require;import{existsSync as Nt,mkdirSync as yr,mkdtempSync as Li,readdirSync as br,readFileSync as zt,rmSync as hr,unlinkSync as Nn,writeFileSync as Tr}from"fs";import{tmpdir as Ki}from"os";import{isAbsolute as Bi,join as At}from"path";import _n from"process";function wr(s){let a=2166136261;for(let l=0;l<s.length;l++)a^=s.charCodeAt(l),a=Math.imul(a,16777619)>>>0;return a.toString(36).padStart(7,"0").slice(-7)}function Cr(s,a=63){if(s.length<=a)return s;let l=`_${wr(s)}`;return s.slice(0,a-l.length)+l}function Ct(s,a){let l=`${s}_`,c=a.startsWith(l)?a:`${l}${a}`;return Cr(c)}class o{quoteIdentifier(s){return`\`${s.replace(/`/g,"``")}\``}getColumnType(s){switch(s.type){case"string":return`varchar(${s.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(s.enumValues&&s.enumValues.length>0)return`ENUM(${s.enumValues.map((l)=>`'${l.replace(/'/g,"''")}'`).join(", ")})`;return"text";default:return"text"}}getPrimaryKeyType(s){return this.getColumnType(s)}getAutoIncrementClause(s){if(s.isPrimaryKey&&(s.type==="integer"||s.type==="bigint"))return"auto_increment";return""}getDefaultValue(s){if(!s.hasDefault||s.defaultValue===void 0)return"";let a=s.defaultValue;if(typeof a==="string"){let l=a.toUpperCase();if(l==="UTC_TIMESTAMP")return"default (UTC_TIMESTAMP)";if(["CURRENT_TIMESTAMP","NOW()","NULL","CURRENT_DATE","CURRENT_TIME"].includes(l))return`default ${l}`;let f=`'${a.replace(/'/g,"''")}'`;if(s.type==="text"||s.type==="json"||s.type==="enum"&&!s.enumValues?.length)return`default (${f})`;return`default ${f}`}else if(typeof a==="number"||typeof a==="bigint")return`default ${a}`;else if(typeof a==="boolean")return`default ${a?1:0}`;else if(a instanceof Date)return`default '${a.toISOString()}'`;return""}createEnumType(s,a){return""}foreignKeyClauses(s){return s.columns.filter((a)=>a.references).map((a)=>{let l=a.references,c=`${s.table}_${a.name}_fk`,f=`CONSTRAINT ${this.quoteIdentifier(c)} FOREIGN KEY (${this.quoteIdentifier(a.name)}) REFERENCES ${this.quoteIdentifier(l.table)}(${this.quoteIdentifier(l.column)})`;if(l.onDelete)f+=` ON DELETE ${l.onDelete.toUpperCase()}`;if(l.onUpdate)f+=` ON UPDATE ${l.onUpdate.toUpperCase()}`;return f})}createTable(s){let a=[...s.columns.map((l)=>this.renderColumn(l)),...this.foreignKeyClauses(s)];return`CREATE TABLE IF NOT EXISTS ${this.quoteIdentifier(s.table)} (
3
- ${a.join(`,
4
- `)}
5
- ) DEFAULT CHARSET=utf8mb4;`}static KEY_PREFIX_CHARACTERS=255;static MAX_KEY_BYTES=3072;static BYTES_PER_CHARACTER=4;keyPartWidth(s){let a=this.getColumnType(s).toLowerCase();if(a.includes("text")||a.includes("blob")||a==="json")return{bytes:Number.POSITIVE_INFINITY,indexableWhole:!1};let l=a.match(/^(?:var)?char\((\d+)\)$/)?.[1];if(l!==void 0)return{bytes:Number(l)*o.BYTES_PER_CHARACTER,indexableWhole:!0};return{bytes:8,indexableWhole:!0}}keyParts(s,a,l){let c=a.columns.map((b)=>{let p=l?.find((D)=>D.name===b),E=p?this.keyPartWidth(p):{bytes:0,indexableWhole:!0},x=!E.indexableWhole;return{name:b,prefixed:x,bytes:x?o.KEY_PREFIX_CHARACTERS*o.BYTES_PER_CHARACTER:E.bytes,narrowable:!E.indexableWhole||E.bytes>o.KEY_PREFIX_CHARACTERS*o.BYTES_PER_CHARACTER}}),f=()=>c.reduce((b,p)=>b+p.bytes,0);while(f()>o.MAX_KEY_BYTES){let b=c.filter((p)=>p.narrowable&&!p.prefixed).sort((p,E)=>E.bytes-p.bytes)[0];if(!b)throw Error(`[migrations] Index '${a.name}' on table '${s}' needs ${f()} bytes of key, over MySQL's ${o.MAX_KEY_BYTES}. Every column in it is already at its ${o.KEY_PREFIX_CHARACTERS}-character prefix, so shorten a column or drop one from the index.`);b.prefixed=!0,b.bytes=o.KEY_PREFIX_CHARACTERS*o.BYTES_PER_CHARACTER}return c.map((b)=>b.prefixed?`${this.quoteIdentifier(b.name)}(${o.KEY_PREFIX_CHARACTERS})`:this.quoteIdentifier(b.name))}createIndex(s,a,l){if(a.where)throw Error(`[migrations] Partial indexes (CompositeIndex.where) are not supported on MySQL. Index '${a.name}' on table '${s}' uses WHERE clause: ${a.where}`);let c=a.type==="unique"?"UNIQUE ":"",f=Ct(s,a.name),b=this.keyParts(s,a,l).join(", ");return`CREATE ${c}INDEX ${this.quoteIdentifier(f)} ON ${this.quoteIdentifier(s)} (${b});`}addForeignKey(s,a,l,c,f,b,p=[]){let E=`${s}_${a}_fk`,x=`ALTER TABLE ${this.quoteIdentifier(s)} ADD CONSTRAINT ${this.quoteIdentifier(E)} FOREIGN KEY (${this.quoteIdentifier(a)}) REFERENCES ${this.quoteIdentifier(l)}(${this.quoteIdentifier(c)})`;if(f)x+=` ON DELETE ${f.toUpperCase()}`;if(b)x+=` ON UPDATE ${b.toUpperCase()}`;let D=[...new Set(p)].map((_)=>`ALTER TABLE ${this.quoteIdentifier(s)} DROP FOREIGN KEY ${this.quoteIdentifier(_)};`).join(`
6
- `);return D?`${D}
7
- ${x};`:`${x};`}addColumn(s,a){let l=this.getColumnType(a),c=[this.quoteIdentifier(a.name),l];if(!a.isNullable&&!a.isPrimaryKey)c.push("not null");let f=this.getDefaultValue(a);if(f)c.push(f);return`ALTER TABLE ${this.quoteIdentifier(s)} ADD COLUMN ${c.join(" ")};`}modifyColumn(s,a){let l=this.getColumnType(a),c=[this.quoteIdentifier(a.name),l];if(!a.isNullable&&!a.isPrimaryKey)c.push("not null");let f=this.getDefaultValue(a);if(f)c.push(f);let b=this.getAutoIncrementClause(a);if(b)c.push(b);return`ALTER TABLE ${this.quoteIdentifier(s)} MODIFY COLUMN ${c.join(" ")};`}renameColumn(s,a,l){return`ALTER TABLE ${this.quoteIdentifier(s)} RENAME COLUMN ${this.quoteIdentifier(a)} TO ${this.quoteIdentifier(l)};`}renameTable(s,a){return`RENAME TABLE ${this.quoteIdentifier(s)} TO ${this.quoteIdentifier(a)};`}rebuildTable(){throw Error("[migrations] rebuildTable is only implemented for SQLite; MySQL uses in-place ALTER.")}dropTable(s){return`DROP TABLE IF EXISTS ${this.quoteIdentifier(s)}`}dropColumn(s,a){return`ALTER TABLE ${this.quoteIdentifier(s)} DROP COLUMN ${this.quoteIdentifier(a)};`}dropIndex(s,a){let l=Ct(s,a);return`DROP INDEX ${this.quoteIdentifier(l)} ON ${this.quoteIdentifier(s)};`}dropEnumType(s){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(s,a){return`JSON_UNQUOTE(JSON_EXTRACT(${s}, CONCAT('$.', ${a})))`}dateBucket(s,a,l=0){let c=l===0?s:`DATE_ADD(${s}, INTERVAL ${l} HOUR)`;switch(a){case"hour":return`DATE_FORMAT(${c}, '%Y-%m-%dT%H:00:00.000Z')`;case"week":return`DATE_FORMAT(DATE_SUB(${c}, INTERVAL WEEKDAY(${c}) DAY), '%Y-%m-%dT00:00:00.000Z')`;case"month":return`DATE_FORMAT(${c}, '%Y-%m-01T00:00:00.000Z')`;case"year":return`DATE_FORMAT(${c}, '%Y-01-01T00:00:00.000Z')`;case"day":default:return`DATE_FORMAT(${c}, '%Y-%m-%dT00:00:00.000Z')`}}booleanLiteral(s){return s?"TRUE":"FALSE"}renderColumn(s){let a=this.getColumnType(s),l=[this.quoteIdentifier(s.name),a];if(s.isPrimaryKey){l.push("PRIMARY KEY");let f=this.getAutoIncrementClause(s);if(f)l.push(f)}if(!s.isNullable&&!s.isPrimaryKey)l.push("not null");let c=this.getDefaultValue(s);if(c)l.push(c);return l.join(" ")}}class fe{quoteIdentifier(s){return`"${s.replace(/"/g,'""')}"`}getColumnType(s){switch(s.type){case"string":return`varchar(${s.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(s.enumValues&&s.enumValues.length>0)return s.enumTypeName?this.quoteIdentifier(s.enumTypeName):"text";return"text";default:return"text"}}getPrimaryKeyType(s){switch(s.type){case"integer":return"SERIAL";case"bigint":return"BIGSERIAL";default:return this.getColumnType(s)}}getAutoIncrementClause(s){return""}getDefaultValue(s){if(!s.hasDefault||s.defaultValue===void 0)return"";let a=s.defaultValue;if(typeof a==="string"){let l=a.toUpperCase();if(l==="UTC_TIMESTAMP")return"default (now() AT TIME ZONE 'utc')";if(["CURRENT_TIMESTAMP","NOW()","NULL","CURRENT_DATE","CURRENT_TIME"].includes(l))return`default ${l}`;return`default '${a.replace(/'/g,"''")}'`}else if(typeof a==="number"||typeof a==="bigint")return`default ${a}`;else if(typeof a==="boolean")return`default ${a?"true":"false"}`;else if(a instanceof Date)return`default '${a.toISOString()}'`;return""}createEnumType(s,a){let l=a.map((c)=>`'${c.replace(/'/g,"''")}'`).join(", ");return`CREATE TYPE ${this.quoteIdentifier(s)} AS ENUM (${l});`}createTable(s){let a=s.columns.map((l)=>this.renderColumn(l)).join(`,
12
- `);return`CREATE TABLE IF NOT EXISTS ${this.quoteIdentifier(s.table)} (
13
- ${a}
14
- );`}createIndex(s,a){let l=a.type==="unique"?"UNIQUE ":"",c=Ct(s,a.name),f=a.columns.map((p)=>this.quoteIdentifier(p)).join(", "),b=a.where?` WHERE ${a.where}`:"";return`CREATE ${l}INDEX IF NOT EXISTS ${this.quoteIdentifier(c)} ON ${this.quoteIdentifier(s)} (${f})${b};`}addForeignKey(s,a,l,c,f,b,p=[]){let E=`${s}_${a}_fk`,x=`ALTER TABLE ${this.quoteIdentifier(s)} ADD CONSTRAINT ${this.quoteIdentifier(E)} FOREIGN KEY (${this.quoteIdentifier(a)}) REFERENCES ${this.quoteIdentifier(l)}(${this.quoteIdentifier(c)})`;if(f)x+=` ON DELETE ${f.toUpperCase()}`;if(b)x+=` ON UPDATE ${b.toUpperCase()}`;let D=[...new Set(p)].map((_)=>`ALTER TABLE ${this.quoteIdentifier(s)} DROP CONSTRAINT ${this.quoteIdentifier(_)};`).join(`
15
- `);return D?`${D}
16
- ${x};`:`${x};`}addColumn(s,a){let l=this.getColumnType(a),c=[this.quoteIdentifier(a.name),l];if(!a.isNullable&&!a.isPrimaryKey)c.push("not null");let f=this.getDefaultValue(a);if(f)c.push(f);return`ALTER TABLE ${this.quoteIdentifier(s)} ADD COLUMN ${c.join(" ")};`}modifyColumn(s,a,l){let c=this.getColumnType(a),f=this.quoteIdentifier(s),b=this.quoteIdentifier(a.name);if(l&&this.getColumnType(l)===c&&!Nr(l,a)){let x=[];if(!a.isPrimaryKey&&l.isNullable!==a.isNullable)x.push(`ALTER TABLE ${f} ALTER COLUMN ${b} ${a.isNullable?"DROP NOT NULL":"SET NOT NULL"};`);let D=this.getDefaultValue(l),_=this.getDefaultValue(a);if(D!==_)x.push(_?`ALTER TABLE ${f} ALTER COLUMN ${b} SET ${_};`:`ALTER TABLE ${f} ALTER COLUMN ${b} DROP DEFAULT;`);if(x.length)return x.join(`
17
- `)}let p=[`ALTER TABLE ${f} ALTER COLUMN ${b} DROP DEFAULT;`,`ALTER TABLE ${f} ALTER COLUMN ${b} TYPE ${c} USING ${b}::${c};`];if(!a.isPrimaryKey)p.push(`ALTER TABLE ${f} ALTER COLUMN ${b} ${a.isNullable?"DROP NOT NULL":"SET NOT NULL"};`);let E=this.getDefaultValue(a);if(E)p.push(`ALTER TABLE ${f} ALTER COLUMN ${b} SET ${E};`);return p.join(`
18
- `)}renameColumn(s,a,l){return`ALTER TABLE ${this.quoteIdentifier(s)} RENAME COLUMN ${this.quoteIdentifier(a)} TO ${this.quoteIdentifier(l)};`}renameTable(s,a){return`ALTER TABLE ${this.quoteIdentifier(s)} RENAME TO ${this.quoteIdentifier(a)};`}rebuildTable(){throw Error("[migrations] rebuildTable is only implemented for SQLite; Postgres uses in-place ALTER.")}dropTable(s){return`DROP TABLE IF EXISTS ${this.quoteIdentifier(s)} CASCADE`}dropColumn(s,a){return`ALTER TABLE ${this.quoteIdentifier(s)} DROP COLUMN ${this.quoteIdentifier(a)};`}dropIndex(s,a){let l=Ct(s,a);return`DROP INDEX IF EXISTS ${this.quoteIdentifier(l)};`}dropEnumType(s){return`DROP TYPE IF EXISTS ${this.quoteIdentifier(s)} CASCADE`}createMigrationsTable(){return`CREATE TABLE IF NOT EXISTS migrations (
19
- id SERIAL PRIMARY KEY,
20
- migration VARCHAR(255) NOT NULL UNIQUE,
21
- executed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
22
- )`}getExecutedMigrationsQuery(){return"SELECT migration, executed_at FROM migrations ORDER BY executed_at"}recordMigrationQuery(){return"INSERT INTO migrations (migration) VALUES ($1)"}jsonExtract(s,a){return`(${s}::jsonb ->> ${a})`}dateBucket(s,a,l=0){let c=l===0?`${s}::timestamp`:`(${s}::timestamp ${l>=0?"+":"-"} interval '${Math.abs(l)} hours')`,f=a==="week"?`date_trunc('week', ${c})`:c;switch(a){case"hour":return`to_char(${f}, 'YYYY-MM-DD"T"HH24:00:00.000"Z"')`;case"month":return`to_char(${f}, 'YYYY-MM-01"T"00:00:00.000"Z"')`;case"year":return`to_char(${f}, 'YYYY-01-01"T"00:00:00.000"Z"')`;case"week":case"day":default:return`to_char(${f}, 'YYYY-MM-DD"T"00:00:00.000"Z"')`}}booleanLiteral(s){return s?"TRUE":"FALSE"}renderColumn(s){let a=s.isPrimaryKey?this.getPrimaryKeyType(s):this.getColumnType(s),l=[this.quoteIdentifier(s.name),a];if(s.isPrimaryKey)l.push("PRIMARY KEY");if(!s.isNullable&&!s.isPrimaryKey)l.push("not null");let c=this.getDefaultValue(s);if(c)l.push(c);if(s.references){let f=`REFERENCES ${this.quoteIdentifier(s.references.table)}(${this.quoteIdentifier(s.references.column)})`;if(s.references.onDelete)f+=` ON DELETE ${s.references.onDelete.toUpperCase()}`;if(s.references.onUpdate)f+=` ON UPDATE ${s.references.onUpdate.toUpperCase()}`;l.push(f)}return l.join(" ")}}function Nr(s,a){return JSON.stringify(s.enumValues??[])!==JSON.stringify(a.enumValues??[])}class me extends o{createTable(s){let a=s.columns.map((b)=>this.renderColumn(b)).join(`,
23
- `),l=[];if(s.tableKind!=="reference"){let b=s.shardKey?.length?s.shardKey:s.columns.filter((p)=>p.isPrimaryKey).map((p)=>p.name);if(b&&b.length>0)l.push(`SHARD KEY (${b.map((p)=>this.quoteIdentifier(p)).join(", ")})`)}if(s.tableKind!=="rowstore"&&s.tableKind!=="reference"){let b=s.sortKey?.length?s.sortKey:void 0;l.push(`SORT KEY (${(b??[]).map((p)=>this.quoteIdentifier(p)).join(", ")})`)}let c=[a,...l].join(`,
24
- `);return`CREATE${this.tableKindSuffix(s.tableKind)} TABLE IF NOT EXISTS ${this.quoteIdentifier(s.table)} (
25
- ${c}
26
- );`}tableKindSuffix(s){switch(s){case"rowstore":return" ROWSTORE";case"reference":return" REFERENCE";default:return""}}addForeignKey(){return""}createIndex(s,a,l){if(a.where)throw Error(`[migrations] Partial indexes (CompositeIndex.where) are not supported on SingleStore. Index '${a.name}' on table '${s}' uses WHERE clause: ${a.where}`);return super.createIndex(s,a,l)}}class he extends o{sharded;constructor(s=!0){super();this.sharded=s}getAutoIncrementClause(s){return this.sharded?"":super.getAutoIncrementClause(s)}renderColumn(s){if(!this.sharded||!s.references)return super.renderColumn(s);let{references:a,...l}=s;return super.renderColumn(l)}foreignKeyClauses(s){return this.sharded?[]:super.foreignKeyClauses(s)}createTable(s){return super.createTable(s)}addForeignKey(...s){return this.sharded?"":super.addForeignKey(...s)}createMigrationsTable(){if(!this.sharded)return super.createMigrationsTable();return`CREATE TABLE IF NOT EXISTS migrations (
27
- migration VARCHAR(255) NOT NULL PRIMARY KEY,
28
- executed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
29
- )`}}class ge{quoteIdentifier(s){return`"${s.replace(/"/g,'""')}"`}getColumnType(s){if(s.name.endsWith("_id")&&N(s.type))return"INTEGER";if(s.type==="enum"){if(s.enumValues&&s.enumValues.length>0){let a=s.enumValues.map((l)=>`'${l.replace(/'/g,"''")}'`).join(", ");return`TEXT CHECK (${this.quoteIdentifier(s.name)} IN (${a}))`}return"TEXT"}return Oe(s.type)}getPrimaryKeyType(s){return this.getColumnType(s)}getAutoIncrementClause(s){if(s.isPrimaryKey&&(s.type==="integer"||s.type==="bigint"))return"AUTOINCREMENT";return""}getDefaultValue(s){if(!s.hasDefault||s.defaultValue===void 0)return"";let a=s.defaultValue;if(typeof a==="string"){if(a.toUpperCase()==="UTC_TIMESTAMP")return"default CURRENT_TIMESTAMP";if(["CURRENT_TIMESTAMP","CURRENT_DATE","CURRENT_TIME","NOW()","NULL","TRUE","FALSE"].includes(a.toUpperCase()))return`default ${a.toUpperCase()}`;return`default '${a.replace(/'/g,"''")}'`}else if(typeof a==="number"||typeof a==="bigint")return`default ${a}`;else if(typeof a==="boolean")return`default ${a?1:0}`;else if(a instanceof Date)return`default '${a.toISOString()}'`;return""}createEnumType(s,a){return""}createTable(s){let a=s.columns.map((l)=>this.renderColumn(l)).join(`,
30
- `);return`CREATE TABLE IF NOT EXISTS ${this.quoteIdentifier(s.table)} (
31
- ${a}
32
- );`}createIndex(s,a){let l=a.type==="unique"?"UNIQUE ":"",c=Ct(s,a.name),f=a.columns.map((p)=>this.quoteIdentifier(p)).join(", "),b=a.where?` WHERE ${a.where}`:"";return`CREATE ${l}INDEX IF NOT EXISTS ${this.quoteIdentifier(c)} ON ${this.quoteIdentifier(s)} (${f})${b};`}addForeignKey(s,a,l,c,f,b){return""}addColumn(s,a){let l=this.getColumnType(a),c=[this.quoteIdentifier(a.name),l];if(!a.isNullable&&!a.isPrimaryKey)c.push("not null");let f=this.getDefaultValue(a);if(f)c.push(f);return c.push(...this.referencesClause(a)),`ALTER TABLE ${this.quoteIdentifier(s)} ADD COLUMN ${c.join(" ")};`}modifyColumn(s,a){return`-- SQLite does not support ALTER COLUMN; a table rebuild is required to change ${this.quoteIdentifier(s)}.${this.quoteIdentifier(a.name)}`}renameColumn(s,a,l){return`ALTER TABLE ${this.quoteIdentifier(s)} RENAME COLUMN ${this.quoteIdentifier(a)} TO ${this.quoteIdentifier(l)};`}renameTable(s,a){return`ALTER TABLE ${this.quoteIdentifier(s)} RENAME TO ${this.quoteIdentifier(a)};`}rebuildTable(s){let{target:a,tempName:l,columnSource:c}=s,f=(D)=>this.quoteIdentifier(D),b=a.columns.map((D)=>this.renderColumn(D)).join(`,
33
- `),p=`CREATE TABLE ${f(l)} (
34
- ${b}
35
- );`,E=a.columns.map((D)=>D.name).filter((D)=>c[D]!==void 0),x=["PRAGMA foreign_keys=OFF;","BEGIN;",p];if(E.length>0){let D=E.map(f).join(", "),_=E.map((v)=>f(c[v])).join(", ");x.push(`INSERT INTO ${f(l)} (${D}) SELECT ${_} FROM ${f(a.table)};`)}x.push(`DROP TABLE ${f(a.table)};`),x.push(`ALTER TABLE ${f(l)} RENAME TO ${f(a.table)};`);for(let D of a.indexes)x.push(this.createIndex(a.table,D));return x.push("PRAGMA foreign_key_check;"),x.push("COMMIT;"),x.push("PRAGMA foreign_keys=ON;"),x.join(`
36
- `)}dropTable(s){return`DROP TABLE IF EXISTS ${this.quoteIdentifier(s)}`}dropColumn(s,a){return`ALTER TABLE ${this.quoteIdentifier(s)} DROP COLUMN ${this.quoteIdentifier(a)};`}dropIndex(s,a){let l=Ct(s,a);return`DROP INDEX IF EXISTS ${this.quoteIdentifier(l)};`}dropEnumType(s){return""}createMigrationsTable(){return`CREATE TABLE IF NOT EXISTS migrations (
37
- id INTEGER PRIMARY KEY AUTOINCREMENT,
38
- migration TEXT NOT NULL UNIQUE,
39
- executed_at DATETIME DEFAULT CURRENT_TIMESTAMP
40
- )`}getExecutedMigrationsQuery(){return"SELECT migration, executed_at FROM migrations ORDER BY executed_at"}recordMigrationQuery(){return"INSERT INTO migrations (migration) VALUES (?)"}jsonExtract(s,a){return`json_extract(${s}, '$.' || ${a})`}dateBucket(s,a,l=0){let c=l===0?s:`datetime(${s}, '${l>=0?"+":"-"}${Math.abs(l)} hours')`;switch(a){case"hour":return`strftime('%Y-%m-%dT%H:00:00.000Z', ${c})`;case"week":return`strftime('%Y-%m-%dT00:00:00.000Z', ${c}, '-6 days', 'weekday 1')`;case"month":return`strftime('%Y-%m-01T00:00:00.000Z', ${c})`;case"year":return`strftime('%Y-01-01T00:00:00.000Z', ${c})`;case"day":default:return`strftime('%Y-%m-%dT00:00:00.000Z', ${c})`}}booleanLiteral(s){return s?"TRUE":"FALSE"}renderColumn(s){let a=this.getColumnType(s),l=[this.quoteIdentifier(s.name),a];if(s.isPrimaryKey){l.push("PRIMARY KEY");let f=this.getAutoIncrementClause(s);if(f)l.push(f)}if(!s.isNullable&&!s.isPrimaryKey)l.push("not null");let c=this.getDefaultValue(s);if(c)l.push(c);return l.push(...this.referencesClause(s)),l.join(" ")}referencesClause(s){if(!s.references)return[];let a=[`REFERENCES ${this.quoteIdentifier(s.references.table)}(${this.quoteIdentifier(s.references.column)})`];if(s.references.onDelete)a.push(`ON DELETE ${s.references.onDelete.toUpperCase()}`);if(s.references.onUpdate)a.push(`ON UPDATE ${s.references.onUpdate.toUpperCase()}`);return a}}function h(s,a={}){switch(s){case"postgres":return new fe;case"mysql":return new o;case"singlestore":return new me;case"vitess":return new he(a.vitessSharded??e.vitess?.sharded??!0);case"sqlite":return new ge;default:throw Error(`Unsupported dialect: ${s}`)}}async function X(s={}){let a=s.iterations||1000,l=s.operations?.split(",")||["select","insert","update","delete","count"];console.log("-- Running Query Builder Benchmarks"),console.log(`-- Iterations: ${a}`),console.log(`-- Operations: ${l.join(", ")}`),console.log();let c=i();console.log("-- Setting up test table...");try{await r.unsafe("DROP TABLE IF EXISTS bench_users").execute(),await r.unsafe(`
2
+ import{n,e,B,t,P,Le,tt,r,T,m}from"./chunk-5b51gpqw.js";import{i,Ce,Re}from"./chunk-cfswsgdh.js";import{N,Oe,Be,O}from"./chunk-wfk6y67h.js";import{u}from"./chunk-vxh8ktv7.js";var Ar=import.meta.require;async function X(s={}){let a=s.iterations||1000,l=s.operations?.split(",")||["select","insert","update","delete","count"];console.log("-- Running Query Builder Benchmarks"),console.log(`-- Iterations: ${a}`),console.log(`-- Operations: ${l.join(", ")}`),console.log();let c=i();console.log("-- Setting up test table...");try{await r.unsafe("DROP TABLE IF EXISTS bench_users").execute(),await r.unsafe(`
41
3
  CREATE TABLE bench_users (
42
4
  id INTEGER PRIMARY KEY AUTOINCREMENT,
43
5
  name TEXT NOT NULL,
@@ -48,7 +10,7 @@ ${x};`:`${x};`}addColumn(s,a){let l=this.getColumnType(a),c=[this.quoteIdentifie
48
10
  `).execute();for(let p=0;p<100;p++)await r.unsafe(`
49
11
  INSERT INTO bench_users (name, email, created_at)
50
12
  VALUES (?, ?, ?)
51
- `,[`User ${p}`,`user${p}@example.com`,new Date().toISOString()]).execute();console.log("-- \u2713 Test table ready with 100 rows"),console.log()}catch(p){throw console.error("-- Failed to setup test table:",p),p}let f=[];if(l.includes("select")){let p=[];for(let E=0;E<a;E++){let x=performance.now();await c.selectFrom("bench_users").where({active:1}).limit(10).execute(),p.push(performance.now()-x)}f.push({operation:"SELECT with WHERE + LIMIT",avgTime:p.reduce((E,x)=>E+x,0)/p.length,minTime:Math.min(...p),maxTime:Math.max(...p),iterations:a})}if(l.includes("select")){let p=[];for(let E=0;E<a;E++){let x=performance.now();await c.selectFrom("bench_users").where({id:1}).first(),p.push(performance.now()-x)}f.push({operation:"SELECT by ID (first)",avgTime:p.reduce((E,x)=>E+x,0)/p.length,minTime:Math.min(...p),maxTime:Math.max(...p),iterations:a})}if(l.includes("count")){let p=[];for(let E=0;E<a;E++){let x=performance.now();await c.selectFrom("bench_users").count(),p.push(performance.now()-x)}f.push({operation:"COUNT",avgTime:p.reduce((E,x)=>E+x,0)/p.length,minTime:Math.min(...p),maxTime:Math.max(...p),iterations:a})}if(l.includes("insert")){let p=[];for(let E=0;E<a;E++){let x=performance.now();await c.insertInto("bench_users").values({name:`Bench User ${E}`,email:`bench${E}@example.com`,created_at:new Date().toISOString()}).execute(),p.push(performance.now()-x)}f.push({operation:"INSERT",avgTime:p.reduce((E,x)=>E+x,0)/p.length,minTime:Math.min(...p),maxTime:Math.max(...p),iterations:a})}if(l.includes("update")){let p=[];for(let E=0;E<a;E++){let x=performance.now();await c.updateTable("bench_users").set({active:0}).where({id:1}).execute(),p.push(performance.now()-x)}f.push({operation:"UPDATE by ID",avgTime:p.reduce((E,x)=>E+x,0)/p.length,minTime:Math.min(...p),maxTime:Math.max(...p),iterations:a})}if(l.includes("delete")){let p=[],E=[];for(let x=0;x<a;x++){let D=await c.insertInto("bench_users").values({name:"To Delete",email:`delete${x}@example.com`,created_at:new Date().toISOString()}).execute();E.push(D)}for(let x=0;x<a;x++){let D=performance.now();await c.deleteFrom("bench_users").where({id:E[x]}).execute(),p.push(performance.now()-D)}f.push({operation:"DELETE by ID",avgTime:p.reduce((x,D)=>x+D,0)/p.length,minTime:Math.min(...p),maxTime:Math.max(...p),iterations:a})}console.log("-- Benchmark Results"),console.log();let b=Math.max(...f.map((p)=>p.operation.length));console.log("Operation".padEnd(b+2)+"Avg (ms)".padStart(12)+"Min (ms)".padStart(12)+"Max (ms)".padStart(12)+"Ops/sec".padStart(12)),console.log("-".repeat(b+2+12+12+12+12));for(let p of f){let E=p.operation.padEnd(b+2),x=p.avgTime.toFixed(3).padStart(12),D=p.minTime.toFixed(3).padStart(12),_=p.maxTime.toFixed(3).padStart(12),v=(1000/p.avgTime).toFixed(0).padStart(12);console.log(`${E}${x}${D}${_}${v}`)}console.log();try{await r.unsafe("DROP TABLE IF EXISTS bench_users").execute(),console.log("-- \u2713 Cleanup complete")}catch(p){console.error("-- Warning: Failed to cleanup test table:",p)}}async function Z(){console.log("-- Clearing query cache..."),Ce(),console.log("-- \u2713 Query cache cleared")}async function ee(){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 te(s={}){if(console.log("-- Configuring query cache..."),console.log(),s.size!==void 0){let a=Number(s.size);if(Number.isNaN(a)||a<=0)throw console.error("-- Error: Cache size must be a positive number"),Error("Invalid cache size");Re(a),console.log(`-- \u2713 Cache max size set to: ${a}`)}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 Xt from"process";import{createInterface as _r}from"readline";async function I(){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 s=i(),a=_r({input:Xt.stdin,output:Xt.stdout,prompt:"qb> "}),l="",c=!1,f=`
13
+ `,[`User ${p}`,`user${p}@example.com`,new Date().toISOString()]).execute();console.log("-- \u2713 Test table ready with 100 rows"),console.log()}catch(p){throw console.error("-- Failed to setup test table:",p),p}let f=[];if(l.includes("select")){let p=[];for(let E=0;E<a;E++){let x=performance.now();await c.selectFrom("bench_users").where({active:1}).limit(10).execute(),p.push(performance.now()-x)}f.push({operation:"SELECT with WHERE + LIMIT",avgTime:p.reduce((E,x)=>E+x,0)/p.length,minTime:Math.min(...p),maxTime:Math.max(...p),iterations:a})}if(l.includes("select")){let p=[];for(let E=0;E<a;E++){let x=performance.now();await c.selectFrom("bench_users").where({id:1}).first(),p.push(performance.now()-x)}f.push({operation:"SELECT by ID (first)",avgTime:p.reduce((E,x)=>E+x,0)/p.length,minTime:Math.min(...p),maxTime:Math.max(...p),iterations:a})}if(l.includes("count")){let p=[];for(let E=0;E<a;E++){let x=performance.now();await c.selectFrom("bench_users").count(),p.push(performance.now()-x)}f.push({operation:"COUNT",avgTime:p.reduce((E,x)=>E+x,0)/p.length,minTime:Math.min(...p),maxTime:Math.max(...p),iterations:a})}if(l.includes("insert")){let p=[];for(let E=0;E<a;E++){let x=performance.now();await c.insertInto("bench_users").values({name:`Bench User ${E}`,email:`bench${E}@example.com`,created_at:new Date().toISOString()}).execute(),p.push(performance.now()-x)}f.push({operation:"INSERT",avgTime:p.reduce((E,x)=>E+x,0)/p.length,minTime:Math.min(...p),maxTime:Math.max(...p),iterations:a})}if(l.includes("update")){let p=[];for(let E=0;E<a;E++){let x=performance.now();await c.updateTable("bench_users").set({active:0}).where({id:1}).execute(),p.push(performance.now()-x)}f.push({operation:"UPDATE by ID",avgTime:p.reduce((E,x)=>E+x,0)/p.length,minTime:Math.min(...p),maxTime:Math.max(...p),iterations:a})}if(l.includes("delete")){let p=[],E=[];for(let x=0;x<a;x++){let D=await c.insertInto("bench_users").values({name:"To Delete",email:`delete${x}@example.com`,created_at:new Date().toISOString()}).execute();E.push(D)}for(let x=0;x<a;x++){let D=performance.now();await c.deleteFrom("bench_users").where({id:E[x]}).execute(),p.push(performance.now()-D)}f.push({operation:"DELETE by ID",avgTime:p.reduce((x,D)=>x+D,0)/p.length,minTime:Math.min(...p),maxTime:Math.max(...p),iterations:a})}console.log("-- Benchmark Results"),console.log();let b=Math.max(...f.map((p)=>p.operation.length));console.log("Operation".padEnd(b+2)+"Avg (ms)".padStart(12)+"Min (ms)".padStart(12)+"Max (ms)".padStart(12)+"Ops/sec".padStart(12)),console.log("-".repeat(b+2+12+12+12+12));for(let p of f){let E=p.operation.padEnd(b+2),x=p.avgTime.toFixed(3).padStart(12),D=p.minTime.toFixed(3).padStart(12),_=p.maxTime.toFixed(3).padStart(12),v=(1000/p.avgTime).toFixed(0).padStart(12);console.log(`${E}${x}${D}${_}${v}`)}console.log();try{await r.unsafe("DROP TABLE IF EXISTS bench_users").execute(),console.log("-- \u2713 Cleanup complete")}catch(p){console.error("-- Warning: Failed to cleanup test table:",p)}}async function Z(){console.log("-- Clearing query cache..."),Ce(),console.log("-- \u2713 Query cache cleared")}async function ee(){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 te(s={}){if(console.log("-- Configuring query cache..."),console.log(),s.size!==void 0){let a=Number(s.size);if(Number.isNaN(a)||a<=0)throw console.error("-- Error: Cache size must be a positive number"),Error("Invalid cache size");Re(a),console.log(`-- \u2713 Cache max size set to: ${a}`)}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 Xt from"process";import{createInterface as wr}from"readline";async function I(){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 s=i(),a=wr({input:Xt.stdin,output:Xt.stdout,prompt:"qb> "}),l="",c=!1,f=`
52
14
  Available Commands:
53
15
  .help Show this help message
54
16
  .exit Exit the console
@@ -77,10 +39,10 @@ Tips:
77
39
  `;return}if(x)await b(x)};a.on("line",async(E)=>{await p(E),a.prompt()}),a.on("SIGINT",()=>{if(c)console.log(`
78
40
  -- Multi-line input cancelled`),l="",c=!1,a.prompt();else console.log(`
79
41
  -- Type .exit to quit`),a.prompt()}),a.on("close",()=>{console.log(`
80
- Goodbye!`),Xt.exit(0)}),a.prompt()}async function ne(){return I()}import{existsSync as $r,readFileSync as vr,writeFileSync as Bt}from"fs";async function re(s,a={}){let l=a.format||"json",c=a.output||`${s}.${l}`,f=a.limit;if(console.log(`-- Exporting data from table: ${s}`),console.log(`-- Format: ${l}`),console.log(`-- Output: ${c}`),f)console.log(`-- Limit: ${f} rows`);console.log();try{let p=i().selectFrom(s);if(f)p=p.limit(f);let E=await p.execute();if(console.log(`-- Retrieved ${E.length} rows`),l==="json")Bt(c,JSON.stringify(E,null,2)),console.log(`-- \u2713 Exported to JSON: ${c}`);else if(l==="csv"){if(E.length===0){Bt(c,""),console.log(`-- \u2713 Exported to CSV: ${c} (empty)`);return}let x=Object.keys(E[0]),D=[x.join(",")];for(let _ of E){let v=x.map((k)=>{let Y=_[k];if(Y===null||Y===void 0)return"";let J=String(Y);if(J.includes(",")||J.includes('"')||J.includes(`
42
+ Goodbye!`),Xt.exit(0)}),a.prompt()}async function ne(){return I()}import{existsSync as Cr,readFileSync as Nr,writeFileSync as Bt}from"fs";async function re(s,a={}){let l=a.format||"json",c=a.output||`${s}.${l}`,f=a.limit;if(console.log(`-- Exporting data from table: ${s}`),console.log(`-- Format: ${l}`),console.log(`-- Output: ${c}`),f)console.log(`-- Limit: ${f} rows`);console.log();try{let p=i().selectFrom(s);if(f)p=p.limit(f);let E=await p.execute();if(console.log(`-- Retrieved ${E.length} rows`),l==="json")Bt(c,JSON.stringify(E,null,2)),console.log(`-- \u2713 Exported to JSON: ${c}`);else if(l==="csv"){if(E.length===0){Bt(c,""),console.log(`-- \u2713 Exported to CSV: ${c} (empty)`);return}let x=Object.keys(E[0]),D=[x.join(",")];for(let _ of E){let v=x.map((k)=>{let Y=_[k];if(Y===null||Y===void 0)return"";let J=String(Y);if(J.includes(",")||J.includes('"')||J.includes(`
81
43
  `))return`"${J.replace(/"/g,'""')}"`;return J});D.push(v.join(","))}Bt(c,D.join(`
82
44
  `)),console.log(`-- \u2713 Exported to CSV: ${c}`)}else if(l==="sql"){let x=[];for(let D of E){let _=Object.keys(D),v=_.map((k)=>{let Y=D[k];if(Y===null||Y===void 0)return"NULL";if(typeof Y==="number")return String(Y);return`'${String(Y).replace(/'/g,"''")}'`});x.push(`INSERT INTO ${s} (${_.join(", ")}) VALUES (${v.join(", ")});`)}Bt(c,x.join(`
83
- `)),console.log(`-- \u2713 Exported to SQL: ${c}`)}}catch(b){throw console.error(`-- Failed to export data from ${s}:`,b),b}}async function ie(s,a,l={}){if(!$r(a))throw console.error(`-- File not found: ${a}`),Error(`File not found: ${a}`);let c=l.format||(a.endsWith(".json")?"json":"csv"),f=l.truncate??!1;console.log(`-- Importing data into table: ${s}`),console.log(`-- Format: ${c}`),console.log(`-- File: ${a}`),console.log(`-- Truncate: ${f}`),console.log();try{let b=i();if(f)await b.deleteFrom(s).execute(),console.log("-- Table truncated");let p=vr(a,"utf8"),E=[];if(c==="json"){if(E=JSON.parse(p),!Array.isArray(E))throw TypeError("JSON file must contain an array of objects")}else if(c==="csv"){let _=p.split(`
45
+ `)),console.log(`-- \u2713 Exported to SQL: ${c}`)}}catch(b){throw console.error(`-- Failed to export data from ${s}:`,b),b}}async function ie(s,a,l={}){if(!Cr(a))throw console.error(`-- File not found: ${a}`),Error(`File not found: ${a}`);let c=l.format||(a.endsWith(".json")?"json":"csv"),f=l.truncate??!1;console.log(`-- Importing data into table: ${s}`),console.log(`-- Format: ${c}`),console.log(`-- File: ${a}`),console.log(`-- Truncate: ${f}`),console.log();try{let b=i();if(f)await b.deleteFrom(s).execute(),console.log("-- Table truncated");let p=Nr(a,"utf8"),E=[];if(c==="json"){if(E=JSON.parse(p),!Array.isArray(E))throw TypeError("JSON file must contain an array of objects")}else if(c==="csv"){let _=p.split(`
84
46
  `).filter((k)=>k.trim());if(_.length<2){console.log("-- No data to import (CSV is empty or has only headers)");return}let v=_[0].split(",").map((k)=>k.trim());for(let k=1;k<_.length;k++){let Y=_[k].split(",").map((z)=>z.trim()),J={};for(let z=0;z<v.length;z++){let Me=Y[z];if(Me.startsWith('"')&&Me.endsWith('"'))Me=Me.slice(1,-1).replace(/""/g,'"');if(Me==="")Me=null;else if(!Number.isNaN(Number(Me)))Me=Number(Me);J[v[z]]=Me}E.push(J)}}if(E.length===0){console.log("-- No data to import");return}let x=100,D=0;for(let _=0;_<E.length;_+=x){let v=E.slice(_,_+x);await b.insertInto(s).values(v).execute(),D+=v.length,console.log(`-- Imported ${D}/${E.length} rows...`)}console.log(`-- \u2713 Successfully imported ${E.length} rows`)}catch(b){throw console.error(`-- Failed to import data into ${s}:`,b),b}}async function se(s={}){let a=e.dialect||"postgres",l=s.output||`dump-${Date.now()}.sql`,c=s.tables?.split(",").map((f)=>f.trim());if(console.log("-- Dumping database"),console.log(`-- Dialect: ${a}`),console.log(`-- Output: ${l}`),c)console.log(`-- Tables: ${c.join(", ")}`);console.log();try{let f=i(),b=[];if(a==="sqlite")b=(await f.unsafe(`
85
47
  SELECT name FROM sqlite_master
86
48
  WHERE type = 'table'
@@ -207,7 +169,7 @@ Goodbye!`),Xt.exit(0)}),a.prompt()}async function ne(){return I()}import{existsS
207
169
  ORDER BY ORDINAL_POSITION
208
170
  `,[s]);for(let k of D)b.push({name:k.column_name,type:k.data_type,nullable:k.is_nullable==="YES",default:k.column_default,isPrimaryKey:k.column_key==="PRI",isForeignKey:k.column_key==="MUL"});let _=await f.unsafe(`
209
171
  SHOW INDEXES FROM ${s}
210
- `),v=new Map;for(let k of _){let Y=k.Key_name;if(!v.has(Y))v.set(Y,{columns:[],unique:k.Non_unique===0});v.get(Y).columns.push(k.Column_name)}for(let[k,Y]of v)p.push({name:k,columns:Y.columns,unique:Y.unique})}else if(l==="sqlite"){let D=await f.unsafe(`PRAGMA table_info(${s})`);for(let v of D)b.push({name:v.name,type:v.type,nullable:v.notnull===0,default:v.dflt_value,isPrimaryKey:v.pk===1});let _=await f.unsafe(`PRAGMA index_list(${s})`);for(let v of _){let k=await f.unsafe(`PRAGMA index_info(${v.name})`);p.push({name:v.name,columns:k.map((Y)=>Y.name),unique:v.unique===1})}}if(c){console.log(`Table: ${s}`),console.log(`Rows: ${x.toLocaleString()}`),console.log(),console.log("Columns:"),console.log();let D=Math.max(...b.map((J)=>J.name.length),10),_=Math.max(...b.map((J)=>J.type.length),10),v=D+2,k=_+2,Y=`${"Name".padEnd(v)+"Type".padEnd(k)+"Nullable".padEnd(10)+"Default".padEnd(20)}Flags`;console.log(Y),console.log("-".repeat(Y.length));for(let J of b){let z=J.name.padEnd(v),Me=J.type.padEnd(k),Ke=(J.nullable?"YES":"NO").padEnd(10),Pe=String(J.default||"").padEnd(20),Ye=[J.isPrimaryKey?"PK":"",J.isForeignKey?"FK":""].filter(Boolean).join(", ");console.log(`${z}${Me}${Ke}${Pe}${Ye}`)}if(console.log(),p.length>0){console.log("Indexes:"),console.log();for(let J of p){let z=J.unique?" (UNIQUE)":"";console.log(` - ${J.name}${z}: [${J.columns.join(", ")}]`)}console.log()}}return{tableName:s,rowCount:x,columns:b,indexes:p}}catch(f){throw console.error(`-- Failed to inspect table ${s}:`,f),f}}async function ce(s,a={}){return j(s,a)}async function ue(s,a={}){let l=await d({modelsDir:s}),c=ve(l);return console.log(JSON.stringify(c,null,2)),{models:l,schema:c}}function st(s){let a=s.toLowerCase();if(/^bool|boolean|tinyint\(1\)/.test(a))return"boolean";if(/int|serial|numeric|decimal|double|real|float|money/.test(a))return"number";if(/timestamp|datetime|date|time/.test(a))return"datetime";if(/json/.test(a))return"json";return"string"}function Pr(s){if(/ies$/i.test(s))return s.replace(/ies$/i,"y");if(/ses$/i.test(s))return s.replace(/es$/i,"");if(/s$/i.test(s)&&!/ss$/i.test(s))return s.replace(/s$/i,"");return s}function kr(s){return s.replace(/[-_\s]+/g," ").split(" ").filter(Boolean).map((a)=>a.charAt(0).toUpperCase()+a.slice(1)).join("")}function We(s){return kr(Pr(s))}async function qn(s,a){if(a==="postgres")return(await s.unsafe("SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' AND table_type = 'BASE TABLE' ORDER BY table_name")).map((f)=>f.table_name);if(n(a))return(await s.unsafe("SELECT table_name FROM information_schema.tables WHERE table_schema = DATABASE() AND table_type = 'BASE TABLE' ORDER BY table_name")).map((f)=>f.table_name??f.TABLE_NAME);return(await s.unsafe("SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' ORDER BY name")).map((c)=>c.name)}async function Ir(s,a,l){if(a==="sqlite")return(await s.unsafe(`PRAGMA table_info(${l})`)).map((b)=>({name:b.name,sqlType:String(b.type||""),nullable:Number(b.notnull)===0,isPrimaryKey:Number(b.pk)>0}));if(a==="postgres")return(await s.unsafe(`SELECT c.column_name, c.data_type, c.is_nullable,
172
+ `),v=new Map;for(let k of _){let Y=k.Key_name;if(!v.has(Y))v.set(Y,{columns:[],unique:k.Non_unique===0});v.get(Y).columns.push(k.Column_name)}for(let[k,Y]of v)p.push({name:k,columns:Y.columns,unique:Y.unique})}else if(l==="sqlite"){let D=await f.unsafe(`PRAGMA table_info(${s})`);for(let v of D)b.push({name:v.name,type:v.type,nullable:v.notnull===0,default:v.dflt_value,isPrimaryKey:v.pk===1});let _=await f.unsafe(`PRAGMA index_list(${s})`);for(let v of _){let k=await f.unsafe(`PRAGMA index_info(${v.name})`);p.push({name:v.name,columns:k.map((Y)=>Y.name),unique:v.unique===1})}}if(c){console.log(`Table: ${s}`),console.log(`Rows: ${x.toLocaleString()}`),console.log(),console.log("Columns:"),console.log();let D=Math.max(...b.map((J)=>J.name.length),10),_=Math.max(...b.map((J)=>J.type.length),10),v=D+2,k=_+2,Y=`${"Name".padEnd(v)+"Type".padEnd(k)+"Nullable".padEnd(10)+"Default".padEnd(20)}Flags`;console.log(Y),console.log("-".repeat(Y.length));for(let J of b){let z=J.name.padEnd(v),Me=J.type.padEnd(k),Ke=(J.nullable?"YES":"NO").padEnd(10),Pe=String(J.default||"").padEnd(20),Ye=[J.isPrimaryKey?"PK":"",J.isForeignKey?"FK":""].filter(Boolean).join(", ");console.log(`${z}${Me}${Ke}${Pe}${Ye}`)}if(console.log(),p.length>0){console.log("Indexes:"),console.log();for(let J of p){let z=J.unique?" (UNIQUE)":"";console.log(` - ${J.name}${z}: [${J.columns.join(", ")}]`)}console.log()}}return{tableName:s,rowCount:x,columns:b,indexes:p}}catch(f){throw console.error(`-- Failed to inspect table ${s}:`,f),f}}async function ce(s,a={}){return j(s,a)}async function ue(s,a={}){let l=await d({modelsDir:s}),c=ve(l);return console.log(JSON.stringify(c,null,2)),{models:l,schema:c}}function st(s){let a=s.toLowerCase();if(/^bool|boolean|tinyint\(1\)/.test(a))return"boolean";if(/int|serial|numeric|decimal|double|real|float|money/.test(a))return"number";if(/timestamp|datetime|date|time/.test(a))return"datetime";if(/json/.test(a))return"json";return"string"}function _r(s){if(/ies$/i.test(s))return s.replace(/ies$/i,"y");if(/ses$/i.test(s))return s.replace(/es$/i,"");if(/s$/i.test(s)&&!/ss$/i.test(s))return s.replace(/s$/i,"");return s}function $r(s){return s.replace(/[-_\s]+/g," ").split(" ").filter(Boolean).map((a)=>a.charAt(0).toUpperCase()+a.slice(1)).join("")}function We(s){return $r(_r(s))}async function qn(s,a){if(a==="postgres")return(await s.unsafe("SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' AND table_type = 'BASE TABLE' ORDER BY table_name")).map((f)=>f.table_name);if(n(a))return(await s.unsafe("SELECT table_name FROM information_schema.tables WHERE table_schema = DATABASE() AND table_type = 'BASE TABLE' ORDER BY table_name")).map((f)=>f.table_name??f.TABLE_NAME);return(await s.unsafe("SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' ORDER BY name")).map((c)=>c.name)}async function vr(s,a,l){if(a==="sqlite")return(await s.unsafe(`PRAGMA table_info(${l})`)).map((b)=>({name:b.name,sqlType:String(b.type||""),nullable:Number(b.notnull)===0,isPrimaryKey:Number(b.pk)>0}));if(a==="postgres")return(await s.unsafe(`SELECT c.column_name, c.data_type, c.is_nullable,
211
173
  (SELECT COUNT(*) FROM information_schema.table_constraints tc
212
174
  JOIN information_schema.key_column_usage k ON k.constraint_name = tc.constraint_name
213
175
  WHERE tc.constraint_type = 'PRIMARY KEY' AND tc.table_name = c.table_name AND k.column_name = c.column_name) AS is_pk
@@ -225,12 +187,12 @@ Goodbye!`),Xt.exit(0)}),a.prompt()}async function ne(){return I()}import{existsS
225
187
  ${f}
226
188
  },
227
189
  })
228
- `}async function C(s={}){let a=e.dialect||"postgres",l=i(),c=s.tables?.length?s.tables:await qn(l,a),f=[];for(let b of c){let p=await Ir(l,a,b);if(!p.length)continue;f.push({table:b,modelName:We(b),primaryKey:p.find((E)=>E.isPrimaryKey)?.name??"id",columns:p,source:at(b,p)})}return f}function an(s,a,l){if(l?.enumValues&&l.enumValues.length>0)return"enum";let c=String(s||"").toLowerCase().trim(),f=c.replace(/\(.*$/,"").replace(/\s+/g," ").trim();if(n(a)&&/^tinyint\(1\)/.test(c))return"boolean";if(/^bool/.test(f))return"boolean";if(f==="int8"||f==="bigint"||f==="bigserial")return"bigint";if(/^(?:int|integer|smallint|mediumint|serial|int2|int4|tinyint)/.test(f))return"integer";if(/^(?:varchar|character varying|nvarchar|nchar|char|character|bpchar)/.test(f)){let b=c.match(/\((\d+)\)/),p=b?Number(b[1]):void 0;if(n(a))return"string";return p!==void 0&&p>255?"text":"string"}if(/text|clob/.test(f))return"text";if(f==="float8"||/^double/.test(f))return"double";if(/^(?:real|float4|float)/.test(f))return"float";if(/^(?:numeric|decimal|money)/.test(f))return"decimal";if(f==="date")return"date";if(f==="timestamptz"||/\bwith time zone\b/.test(c))return"timestamptz";if(/^(?:timestamp|datetime)/.test(f))return"datetime";if(/^time/.test(f))return"string";if(/json/.test(f))return"json";if(/^enum/.test(f))return"enum";return"string"}function Or(s,a,l){return an(String(a||s||""),"mysql",{enumValues:l})}function qr(s){let a=String(s||"").trim().match(/^varchar\((\d+)\)/i);if(!a)return;let l=Number(a[1]);return Number.isSafeInteger(l)&&l>0?l:void 0}function qt(s){let a=String(s??"").toLowerCase().trim();if(a==="cascade"||a==="restrict"||a==="set null")return a;return}async function Lr(s,a){let l=await s.unsafe(`PRAGMA table_info(${JSON.stringify(a)})`),c=await s.unsafe(`PRAGMA index_list(${JSON.stringify(a)})`),f=await s.unsafe(`PRAGMA foreign_key_list(${JSON.stringify(a)})`),b=await s.unsafe("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = ?",[a]),p=String(b?.[0]?.sql??""),E=new Map;for(let v of f)E.set(String(v.from),{table:String(v.table),column:String(v.to??"id"),onDelete:qt(v.on_delete),onUpdate:qt(v.on_update)});let x=[],D=new Set;for(let v of c){let k=String(v.origin??""),Y=String(v.name??"");if(k==="pk"||Y.startsWith("sqlite_autoindex_"))continue;let z=(await s.unsafe(`PRAGMA index_info(${JSON.stringify(Y)})`)).map((Ke)=>String(Ke.name)).filter(Boolean);if(z.length===0)continue;let Me=Number(v.unique)===1;if(Me&&z.length===1)D.add(z[0]);x.push({name:Y,columns:z,type:Me?"unique":"index"})}let _=l.map((v)=>{let k=String(v.name),Y=Kr(p,k),J=Number(v.pk)>0,z=v.dflt_value,Me=z!==null&&z!==void 0;return{name:k,type:an(String(v.type??""),"sqlite",{enumValues:Y}),isPrimaryKey:J,isUnique:D.has(k),isNullable:J?!1:Number(v.notnull)===0,hasDefault:Me,defaultValue:Me?on(z):void 0,enumValues:Y,references:E.get(k)}});return{table:a,columns:_,indexes:x}}function Kr(s,a){if(!s)return;let l=new RegExp(`(?:"${a}"|\`${a}\`|\\b${a}\\b)\\s+IN\\s*\\(([^)]*)\\)`,"i"),c=s.match(l);if(!c)return;let f=c[1].split(",").map((b)=>b.trim().replace(/^'(.*)'$/s,"$1").replace(/''/g,"'")).filter((b)=>b.length>0);return f.length>0?f:void 0}function on(s){if(typeof s==="number"||typeof s==="boolean")return s;return String(s)}async function Ln(s){let a=await s.unsafe(`SELECT t.typname AS type_name, e.enumlabel AS label
190
+ `}async function C(s={}){let a=e.dialect||"postgres",l=i(),c=s.tables?.length?s.tables:await qn(l,a),f=[];for(let b of c){let p=await vr(l,a,b);if(!p.length)continue;f.push({table:b,modelName:We(b),primaryKey:p.find((E)=>E.isPrimaryKey)?.name??"id",columns:p,source:at(b,p)})}return f}function an(s,a,l){if(l?.enumValues&&l.enumValues.length>0)return"enum";let c=String(s||"").toLowerCase().trim(),f=c.replace(/\(.*$/,"").replace(/\s+/g," ").trim();if(n(a)&&/^tinyint\(1\)/.test(c))return"boolean";if(/^bool/.test(f))return"boolean";if(f==="int8"||f==="bigint"||f==="bigserial")return"bigint";if(/^(?:int|integer|smallint|mediumint|serial|int2|int4|tinyint)/.test(f))return"integer";if(/^(?:varchar|character varying|nvarchar|nchar|char|character|bpchar)/.test(f)){let b=c.match(/\((\d+)\)/),p=b?Number(b[1]):void 0;if(n(a))return"string";return p!==void 0&&p>255?"text":"string"}if(/text|clob/.test(f))return"text";if(f==="float8"||/^double/.test(f))return"double";if(/^(?:real|float4|float)/.test(f))return"float";if(/^(?:numeric|decimal|money)/.test(f))return"decimal";if(f==="date")return"date";if(f==="timestamptz"||/\bwith time zone\b/.test(c))return"timestamptz";if(/^(?:timestamp|datetime)/.test(f))return"datetime";if(/^time/.test(f))return"string";if(/json/.test(f))return"json";if(/^enum/.test(f))return"enum";return"string"}function Pr(s,a,l){return an(String(a||s||""),"mysql",{enumValues:l})}function kr(s){let a=String(s||"").trim().match(/^varchar\((\d+)\)/i);if(!a)return;let l=Number(a[1]);return Number.isSafeInteger(l)&&l>0?l:void 0}function qt(s){let a=String(s??"").toLowerCase().trim();if(a==="cascade"||a==="restrict"||a==="set null")return a;return}async function Ir(s,a){let l=await s.unsafe(`PRAGMA table_info(${JSON.stringify(a)})`),c=await s.unsafe(`PRAGMA index_list(${JSON.stringify(a)})`),f=await s.unsafe(`PRAGMA foreign_key_list(${JSON.stringify(a)})`),b=await s.unsafe("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = ?",[a]),p=String(b?.[0]?.sql??""),E=new Map;for(let v of f)E.set(String(v.from),{table:String(v.table),column:String(v.to??"id"),onDelete:qt(v.on_delete),onUpdate:qt(v.on_update)});let x=[],D=new Set;for(let v of c){let k=String(v.origin??""),Y=String(v.name??"");if(k==="pk"||Y.startsWith("sqlite_autoindex_"))continue;let z=(await s.unsafe(`PRAGMA index_info(${JSON.stringify(Y)})`)).map((Ke)=>String(Ke.name)).filter(Boolean);if(z.length===0)continue;let Me=Number(v.unique)===1;if(Me&&z.length===1)D.add(z[0]);x.push({name:Y,columns:z,type:Me?"unique":"index"})}let _=l.map((v)=>{let k=String(v.name),Y=Or(p,k),J=Number(v.pk)>0,z=v.dflt_value,Me=z!==null&&z!==void 0;return{name:k,type:an(String(v.type??""),"sqlite",{enumValues:Y}),isPrimaryKey:J,isUnique:D.has(k),isNullable:J?!1:Number(v.notnull)===0,hasDefault:Me,defaultValue:Me?on(z):void 0,enumValues:Y,references:E.get(k)}});return{table:a,columns:_,indexes:x}}function Or(s,a){if(!s)return;let l=new RegExp(`(?:"${a}"|\`${a}\`|\\b${a}\\b)\\s+IN\\s*\\(([^)]*)\\)`,"i"),c=s.match(l);if(!c)return;let f=c[1].split(",").map((b)=>b.trim().replace(/^'(.*)'$/s,"$1").replace(/''/g,"'")).filter((b)=>b.length>0);return f.length>0?f:void 0}function on(s){if(typeof s==="number"||typeof s==="boolean")return s;return String(s)}async function Ln(s){let a=await s.unsafe(`SELECT t.typname AS type_name, e.enumlabel AS label
229
191
  FROM pg_type t
230
192
  JOIN pg_enum e ON e.enumtypid = t.oid
231
193
  JOIN pg_namespace n ON n.oid = t.typnamespace
232
194
  WHERE n.nspname = 'public'
233
- ORDER BY t.typname, e.enumsortorder`),l=new Map;for(let c of a){let f=String(c.type_name),b=l.get(f);if(b)b.push(String(c.label));else l.set(f,[String(c.label)])}return l}function Br(s,a,l){let c=l.get(a),f=an(String(s||a||""),"postgres",{enumValues:c});return c?{type:f,enumValues:c,enumTypeName:a}:{type:f}}async function Ur(s,a,l){let c=l??await Ln(s),f=await s.unsafe(`SELECT c.column_name, c.data_type, c.udt_name, c.is_nullable, c.column_default, c.character_maximum_length,
195
+ ORDER BY t.typname, e.enumsortorder`),l=new Map;for(let c of a){let f=String(c.type_name),b=l.get(f);if(b)b.push(String(c.label));else l.set(f,[String(c.label)])}return l}function qr(s,a,l){let c=l.get(a),f=an(String(s||a||""),"postgres",{enumValues:c});return c?{type:f,enumValues:c,enumTypeName:a}:{type:f}}async function Lr(s,a,l){let c=l??await Ln(s),f=await s.unsafe(`SELECT c.column_name, c.data_type, c.udt_name, c.is_nullable, c.column_default, c.character_maximum_length,
234
196
  (SELECT COUNT(*) FROM information_schema.table_constraints tc
235
197
  JOIN information_schema.key_column_usage k ON k.constraint_name = tc.constraint_name
236
198
  WHERE tc.constraint_type = 'PRIMARY KEY' AND tc.table_name = c.table_name AND k.column_name = c.column_name) AS is_pk
@@ -250,7 +212,7 @@ ${f}
250
212
  JOIN information_schema.key_column_usage kcu ON kcu.constraint_name = tc.constraint_name
251
213
  JOIN information_schema.constraint_column_usage ccu ON ccu.constraint_name = tc.constraint_name
252
214
  JOIN information_schema.referential_constraints rc ON rc.constraint_name = tc.constraint_name
253
- WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_name = $1 AND tc.table_schema = 'public'`,[a]),E=new Map,x=new Map;for(let k of p){let Y=String(k.constraint_name);x.set(Y,(x.get(Y)??0)+1)}for(let k of p){let Y=String(k.column_name),J=E.get(Y),z=String(k.constraint_name),Me=x.get(z)===1?[...new Set([...J?.constraintNames??[],z])]:J?.constraintNames;E.set(Y,J?{...J,constraintNames:Me}:{table:String(k.ref_table),column:String(k.ref_column??"id"),onDelete:qt(k.delete_rule),onUpdate:qt(k.update_rule),constraintNames:Me})}let{indexes:D,uniqueColumns:_}=Kn(a,b.map((k)=>({indexName:String(k.index_name),isUnique:k.is_unique===!0||k.is_unique==="t",isPrimary:k.is_primary===!0||k.is_primary==="t",column:String(k.column_name),where:k.where_clause?String(k.where_clause):void 0}))),v=f.map((k)=>{let Y=String(k.column_name),J=Number(k.is_pk)>0,z=k.column_default==null?null:String(k.column_default),Me=z!=null&&/nextval\(/i.test(z),Ke=z!=null&&!Me;return{name:Y,...Br(String(k.data_type??""),k.udt_name==null?"":String(k.udt_name),c),isPrimaryKey:J,isUnique:_.has(Y),isNullable:J?!1:String(k.is_nullable).toUpperCase()==="YES",hasDefault:Ke,defaultValue:Ke?on(z):void 0,references:E.get(Y)}});return{table:a,columns:v,indexes:D}}async function Fr(s,a){let l=await s.unsafe(`SELECT column_name, data_type, column_type, is_nullable, column_default, column_key
215
+ WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_name = $1 AND tc.table_schema = 'public'`,[a]),E=new Map,x=new Map;for(let k of p){let Y=String(k.constraint_name);x.set(Y,(x.get(Y)??0)+1)}for(let k of p){let Y=String(k.column_name),J=E.get(Y),z=String(k.constraint_name),Me=x.get(z)===1?[...new Set([...J?.constraintNames??[],z])]:J?.constraintNames;E.set(Y,J?{...J,constraintNames:Me}:{table:String(k.ref_table),column:String(k.ref_column??"id"),onDelete:qt(k.delete_rule),onUpdate:qt(k.update_rule),constraintNames:Me})}let{indexes:D,uniqueColumns:_}=Kn(a,b.map((k)=>({indexName:String(k.index_name),isUnique:k.is_unique===!0||k.is_unique==="t",isPrimary:k.is_primary===!0||k.is_primary==="t",column:String(k.column_name),where:k.where_clause?String(k.where_clause):void 0}))),v=f.map((k)=>{let Y=String(k.column_name),J=Number(k.is_pk)>0,z=k.column_default==null?null:String(k.column_default),Me=z!=null&&/nextval\(/i.test(z),Ke=z!=null&&!Me;return{name:Y,...qr(String(k.data_type??""),k.udt_name==null?"":String(k.udt_name),c),isPrimaryKey:J,isUnique:_.has(Y),isNullable:J?!1:String(k.is_nullable).toUpperCase()==="YES",hasDefault:Ke,defaultValue:Ke?on(z):void 0,references:E.get(Y)}});return{table:a,columns:v,indexes:D}}async function Kr(s,a){let l=await s.unsafe(`SELECT column_name, data_type, column_type, is_nullable, column_default, column_key
254
216
  FROM information_schema.columns
255
217
  WHERE table_name = ? AND table_schema = DATABASE()
256
218
  ORDER BY ordinal_position`,[a]),c=await s.unsafe(`SELECT index_name, non_unique, seq_in_index, column_name
@@ -261,7 +223,7 @@ ${f}
261
223
  FROM information_schema.key_column_usage kcu
262
224
  JOIN information_schema.referential_constraints rc
263
225
  ON rc.constraint_name = kcu.constraint_name AND rc.constraint_schema = kcu.table_schema
264
- WHERE kcu.table_name = ? AND kcu.table_schema = DATABASE() AND kcu.referenced_table_name IS NOT NULL`,[a]),b=new Map,p=new Map;for(let _ of f){let v=String(_.constraint_name??_.CONSTRAINT_NAME);p.set(v,(p.get(v)??0)+1)}for(let _ of f){let v=String(_.column_name??_.COLUMN_NAME),k=b.get(v),Y=String(_.constraint_name??_.CONSTRAINT_NAME),J=p.get(Y)===1?[...new Set([...k?.constraintNames??[],Y])]:k?.constraintNames;b.set(v,k?{...k,constraintNames:J}:{table:String(_.ref_table??_.REF_TABLE),column:String(_.ref_column??_.REF_COLUMN??"id"),onDelete:qt(_.delete_rule??_.DELETE_RULE),onUpdate:qt(_.update_rule??_.UPDATE_RULE),constraintNames:J})}let{indexes:E,uniqueColumns:x}=Kn(a,c.map((_)=>({indexName:String(_.index_name??_.INDEX_NAME),isUnique:Number(_.non_unique??_.NON_UNIQUE)===0,isPrimary:String(_.index_name??_.INDEX_NAME).toUpperCase()==="PRIMARY",column:String(_.column_name??_.COLUMN_NAME)}))),D=l.map((_)=>{let v=String(_.column_name??_.COLUMN_NAME),k=String(_.column_type??_.COLUMN_TYPE??""),Y=Vr(k),z=String(_.column_key??_.COLUMN_KEY??"").toUpperCase()==="PRI",Me=_.column_default??_.COLUMN_DEFAULT,Ke=Me!=null;return{name:v,type:Or(_.data_type??_.DATA_TYPE,k,Y),isPrimaryKey:z,isUnique:x.has(v),isNullable:z?!1:String(_.is_nullable??_.IS_NULLABLE).toUpperCase()==="YES",hasDefault:Ke,defaultValue:Ke?on(Me):void 0,enumValues:Y,maxLength:qr(k),references:b.get(v)}});return{table:a,columns:D,indexes:E}}function Vr(s){let a=s.match(/^enum\((.*)\)$/i);if(!a)return;return a[1].split(",").map((l)=>l.trim().replace(/^'(.*)'$/s,"$1").replace(/''/g,"'")).filter((l)=>l.length>0)}function Kn(s,a){let l=new Map;for(let b of a){if(b.isPrimary)continue;let p=l.get(b.indexName)??{isUnique:b.isUnique,isPrimary:b.isPrimary,columns:[],where:b.where};p.columns.push(b.column),l.set(b.indexName,p)}let c=[],f=new Set;for(let[b,p]of l){if(p.columns.length===0)continue;if(p.isUnique&&p.columns.length===1)f.add(p.columns[0]);c.push({name:b,columns:p.columns,type:p.isUnique?"unique":"index",where:p.where})}return{indexes:c,uniqueColumns:f}}async function Bn(s,a={}){let l=s||e.dialect||"postgres",c=i(),b=((a.tables?.length)?a.tables:await qn(c,l)).filter((x)=>x!=="migrations"),p=l==="postgres"?await Ln(c):void 0,E=[];for(let x of b){let D;if(l==="sqlite")D=await Lr(c,x);else if(l==="postgres")D=await Ur(c,x,p);else D=await Fr(c,x);if(D.columns.length>0)E.push(D)}return{dialect:l,tables:E}}import{existsSync as ln,mkdirSync as jr,writeFileSync as Yr}from"fs";import{dirname as Un,join as un}from"path";import Fn from"process";function Qr(s){let a=s;while(a!==Un(a)){if(ln(un(a,"package.json")))return a;a=Un(a)}return Fn.cwd()}async function de(s,a={}){let l=Qr(Fn.cwd()),c=a.dir||un(l,"app/Models");if(!ln(c))jr(c,{recursive:!0}),console.log(`-- Created models directory: ${c}`);let f=s.charAt(0).toUpperCase()+s.slice(1),b=a.table||`${s.toLowerCase()}s`,p=`${f}.ts`,E=un(c,p);if(ln(E))throw console.error(`-- Model already exists: ${E}`),Error(`Model already exists: ${E}`);let D=a.timestamps!==!1?` created_at: { validation: { rule: v.date() } },
226
+ WHERE kcu.table_name = ? AND kcu.table_schema = DATABASE() AND kcu.referenced_table_name IS NOT NULL`,[a]),b=new Map,p=new Map;for(let _ of f){let v=String(_.constraint_name??_.CONSTRAINT_NAME);p.set(v,(p.get(v)??0)+1)}for(let _ of f){let v=String(_.column_name??_.COLUMN_NAME),k=b.get(v),Y=String(_.constraint_name??_.CONSTRAINT_NAME),J=p.get(Y)===1?[...new Set([...k?.constraintNames??[],Y])]:k?.constraintNames;b.set(v,k?{...k,constraintNames:J}:{table:String(_.ref_table??_.REF_TABLE),column:String(_.ref_column??_.REF_COLUMN??"id"),onDelete:qt(_.delete_rule??_.DELETE_RULE),onUpdate:qt(_.update_rule??_.UPDATE_RULE),constraintNames:J})}let{indexes:E,uniqueColumns:x}=Kn(a,c.map((_)=>({indexName:String(_.index_name??_.INDEX_NAME),isUnique:Number(_.non_unique??_.NON_UNIQUE)===0,isPrimary:String(_.index_name??_.INDEX_NAME).toUpperCase()==="PRIMARY",column:String(_.column_name??_.COLUMN_NAME)}))),D=l.map((_)=>{let v=String(_.column_name??_.COLUMN_NAME),k=String(_.column_type??_.COLUMN_TYPE??""),Y=Br(k),z=String(_.column_key??_.COLUMN_KEY??"").toUpperCase()==="PRI",Me=_.column_default??_.COLUMN_DEFAULT,Ke=Me!=null;return{name:v,type:Pr(_.data_type??_.DATA_TYPE,k,Y),isPrimaryKey:z,isUnique:x.has(v),isNullable:z?!1:String(_.is_nullable??_.IS_NULLABLE).toUpperCase()==="YES",hasDefault:Ke,defaultValue:Ke?on(Me):void 0,enumValues:Y,maxLength:kr(k),references:b.get(v)}});return{table:a,columns:D,indexes:E}}function Br(s){let a=s.match(/^enum\((.*)\)$/i);if(!a)return;return a[1].split(",").map((l)=>l.trim().replace(/^'(.*)'$/s,"$1").replace(/''/g,"'")).filter((l)=>l.length>0)}function Kn(s,a){let l=new Map;for(let b of a){if(b.isPrimary)continue;let p=l.get(b.indexName)??{isUnique:b.isUnique,isPrimary:b.isPrimary,columns:[],where:b.where};p.columns.push(b.column),l.set(b.indexName,p)}let c=[],f=new Set;for(let[b,p]of l){if(p.columns.length===0)continue;if(p.isUnique&&p.columns.length===1)f.add(p.columns[0]);c.push({name:b,columns:p.columns,type:p.isUnique?"unique":"index",where:p.where})}return{indexes:c,uniqueColumns:f}}async function Bn(s,a={}){let l=s||e.dialect||"postgres",c=i(),b=((a.tables?.length)?a.tables:await qn(c,l)).filter((x)=>x!=="migrations"),p=l==="postgres"?await Ln(c):void 0,E=[];for(let x of b){let D;if(l==="sqlite")D=await Ir(c,x);else if(l==="postgres")D=await Lr(c,x,p);else D=await Kr(c,x);if(D.columns.length>0)E.push(D)}return{dialect:l,tables:E}}import{existsSync as ln,mkdirSync as Ur,writeFileSync as Fr}from"fs";import{dirname as Un,join as un}from"path";import Fn from"process";function Vr(s){let a=s;while(a!==Un(a)){if(ln(un(a,"package.json")))return a;a=Un(a)}return Fn.cwd()}async function de(s,a={}){let l=Vr(Fn.cwd()),c=a.dir||un(l,"app/Models");if(!ln(c))Ur(c,{recursive:!0}),console.log(`-- Created models directory: ${c}`);let f=s.charAt(0).toUpperCase()+s.slice(1),b=a.table||`${s.toLowerCase()}s`,p=`${f}.ts`,E=un(c,p);if(ln(E))throw console.error(`-- Model already exists: ${E}`),Error(`Model already exists: ${E}`);let D=a.timestamps!==!1?` created_at: { validation: { rule: v.date() } },
265
227
  updated_at: { validation: { rule: v.date() } },`:"",_=`import { v } from '@stacksjs/ts-validation'
266
228
  import { defineModel } from 'bun-query-builder'
267
229
 
@@ -281,22 +243,61 @@ ${D}
281
243
  })
282
244
 
283
245
  export default model
284
- `;Yr(E,_),console.log(`-- \u2713 Created model: ${E}`),console.log(`-- Table: ${b}`)}async function pe(s,a={}){return w(s,a)}import{existsSync as Qn,readFileSync as zr,unlinkSync as Hr}from"fs";import{join as Xr}from"path";import{existsSync as Wr}from"fs";import{dirname as Vn,isAbsolute as Gr,join as Yn}from"path";import jn from"process";function cn(s=jn.cwd()){let a=s;while(a!==Vn(a)){if(Wr(Yn(a,"package.json")))return a;a=Vn(a)}return jn.cwd()}function _t(s,a="database/migrations"){let l=a||"database/migrations";return Gr(l)?l:Yn(s??cn(),l)}function Jr(s){let a=[],l="",c=null;for(let f=0;f<s.length;f++){let b=s[f];if(c){if(l+=b,b===c)if(s[f+1]===c)l+=s[f+1],f++;else c=null;continue}if(b==="'"||b==='"'||b==="`"){c=b,l+=b;continue}if(b==="-"&&s[f+1]==="-"){let p=s.indexOf(`
285
- `,f);f=p===-1?s.length:p;continue}if(b==="/"&&s[f+1]==="*"){let p=s.indexOf("*/",f+2);f=p===-1?s.length:p+1;continue}if(b===";"){if(l.trim())a.push(l.trim());l="";continue}l+=b}if(l.trim())a.push(l.trim());return a}function Zr(s,a=e.dialect){let l=(b)=>n(a)?`\`${b}\``:`"${b}"`,c=[],f=[];for(let b of Jr(s)){let p;if(p=/^CREATE\s+TABLE\s+(?:IF\s+NOT\s+EXISTS\s+)?["`']?(\w+)["`']?/i.exec(b))c.push(`DROP TABLE IF EXISTS ${l(p[1])}`);else if(p=/^ALTER\s+TABLE\s+["`']?(\w+)["`']?\s+ADD\s+CONSTRAINT\s+["`']?(\w+)["`']?([\s\S]*)$/i.exec(b))if(a==="sqlite")f.push(b);else if(n(a)&&/\bFOREIGN\s+KEY\b/i.test(p[3]??""))c.push(`ALTER TABLE ${l(p[1])} DROP FOREIGN KEY ${l(p[2])}`);else c.push(`ALTER TABLE ${l(p[1])} DROP CONSTRAINT ${l(p[2])}`);else if(p=/^ALTER\s+TABLE\s+["`']?(\w+)["`']?\s+ADD\s+(?:COLUMN\s+["`']?(\w+)["`']?|["`'](\w+)["`']|(\w+))/i.exec(b)){let E=p[2]??p[3]??p[4];if(p[4]&&/^(?:PRIMARY|UNIQUE|INDEX|KEY|FOREIGN|CHECK|FULLTEXT|SPATIAL)$/i.test(p[4]))f.push(b);else c.push(`ALTER TABLE ${l(p[1])} DROP COLUMN ${l(E)}`)}else if(p=/^CREATE\s+(?:UNIQUE\s+)?INDEX\s+(?:IF\s+NOT\s+EXISTS\s+)?["`']?(\w+)["`']?(?:\s+ON\s+["`']?(\w+)["`']?)?/i.exec(b))c.push(n(a)&&p[2]?`DROP INDEX ${l(p[1])} ON ${l(p[2])}`:`DROP INDEX IF EXISTS ${l(p[1])}`);else f.push(b)}return{down:c.reverse(),skipped:f}}async function ye(s={}){let a=s.steps||1,l=s.reverseSchema!==!1;console.log("-- Rolling back migrations"),console.log(`-- Steps: ${a}`),console.log();try{let c=i(),f=[];try{f=await c.unsafe(`
246
+ `;Fr(E,_),console.log(`-- \u2713 Created model: ${E}`),console.log(`-- Table: ${b}`)}import{existsSync as Nt,mkdirSync as Gn,mkdtempSync as zr,readdirSync as zn,readFileSync as Ft,rmSync as Hn,unlinkSync as dn,writeFileSync as Xn}from"fs";import{tmpdir as Hr}from"os";import{isAbsolute as Xr,join as At}from"path";import mn from"process";function jr(s){let a=2166136261;for(let l=0;l<s.length;l++)a^=s.charCodeAt(l),a=Math.imul(a,16777619)>>>0;return a.toString(36).padStart(7,"0").slice(-7)}function Yr(s,a=63){if(s.length<=a)return s;let l=`_${jr(s)}`;return s.slice(0,a-l.length)+l}function Ct(s,a){let l=`${s}_`,c=a.startsWith(l)?a:`${l}${a}`;return Yr(c)}class o{quoteIdentifier(s){return`\`${s.replace(/`/g,"``")}\``}getColumnType(s){switch(s.type){case"string":return`varchar(${s.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(s.enumValues&&s.enumValues.length>0)return`ENUM(${s.enumValues.map((l)=>`'${l.replace(/'/g,"''")}'`).join(", ")})`;return"text";default:return"text"}}getPrimaryKeyType(s){return this.getColumnType(s)}getAutoIncrementClause(s){if(s.isPrimaryKey&&(s.type==="integer"||s.type==="bigint"))return"auto_increment";return""}getDefaultValue(s){if(!s.hasDefault||s.defaultValue===void 0)return"";let a=s.defaultValue;if(typeof a==="string"){let l=a.toUpperCase();if(l==="UTC_TIMESTAMP")return"default (UTC_TIMESTAMP)";if(["CURRENT_TIMESTAMP","NOW()","NULL","CURRENT_DATE","CURRENT_TIME"].includes(l))return`default ${l}`;let f=`'${a.replace(/'/g,"''")}'`;if(s.type==="text"||s.type==="json"||s.type==="enum"&&!s.enumValues?.length)return`default (${f})`;return`default ${f}`}else if(typeof a==="number"||typeof a==="bigint")return`default ${a}`;else if(typeof a==="boolean")return`default ${a?1:0}`;else if(a instanceof Date)return`default '${a.toISOString()}'`;return""}createEnumType(s,a){return""}foreignKeyClauses(s){return s.columns.filter((a)=>a.references).map((a)=>{let l=a.references,c=`${s.table}_${a.name}_fk`,f=`CONSTRAINT ${this.quoteIdentifier(c)} FOREIGN KEY (${this.quoteIdentifier(a.name)}) REFERENCES ${this.quoteIdentifier(l.table)}(${this.quoteIdentifier(l.column)})`;if(l.onDelete)f+=` ON DELETE ${l.onDelete.toUpperCase()}`;if(l.onUpdate)f+=` ON UPDATE ${l.onUpdate.toUpperCase()}`;return f})}createTable(s){let a=[...s.columns.map((l)=>this.renderColumn(l)),...this.foreignKeyClauses(s)];return`CREATE TABLE IF NOT EXISTS ${this.quoteIdentifier(s.table)} (
247
+ ${a.join(`,
248
+ `)}
249
+ ) DEFAULT CHARSET=utf8mb4;`}static KEY_PREFIX_CHARACTERS=255;static MAX_KEY_BYTES=3072;static BYTES_PER_CHARACTER=4;keyPartWidth(s){let a=this.getColumnType(s).toLowerCase();if(a.includes("text")||a.includes("blob")||a==="json")return{bytes:Number.POSITIVE_INFINITY,indexableWhole:!1};let l=a.match(/^(?:var)?char\((\d+)\)$/)?.[1];if(l!==void 0)return{bytes:Number(l)*o.BYTES_PER_CHARACTER,indexableWhole:!0};return{bytes:8,indexableWhole:!0}}keyParts(s,a,l){let c=a.columns.map((b)=>{let p=l?.find((D)=>D.name===b),E=p?this.keyPartWidth(p):{bytes:0,indexableWhole:!0},x=!E.indexableWhole;return{name:b,prefixed:x,bytes:x?o.KEY_PREFIX_CHARACTERS*o.BYTES_PER_CHARACTER:E.bytes,narrowable:!E.indexableWhole||E.bytes>o.KEY_PREFIX_CHARACTERS*o.BYTES_PER_CHARACTER}}),f=()=>c.reduce((b,p)=>b+p.bytes,0);while(f()>o.MAX_KEY_BYTES){let b=c.filter((p)=>p.narrowable&&!p.prefixed).sort((p,E)=>E.bytes-p.bytes)[0];if(!b)throw Error(`[migrations] Index '${a.name}' on table '${s}' needs ${f()} bytes of key, over MySQL's ${o.MAX_KEY_BYTES}. Every column in it is already at its ${o.KEY_PREFIX_CHARACTERS}-character prefix, so shorten a column or drop one from the index.`);b.prefixed=!0,b.bytes=o.KEY_PREFIX_CHARACTERS*o.BYTES_PER_CHARACTER}return c.map((b)=>b.prefixed?`${this.quoteIdentifier(b.name)}(${o.KEY_PREFIX_CHARACTERS})`:this.quoteIdentifier(b.name))}createIndex(s,a,l){if(a.where)throw Error(`[migrations] Partial indexes (CompositeIndex.where) are not supported on MySQL. Index '${a.name}' on table '${s}' uses WHERE clause: ${a.where}`);let c=a.type==="unique"?"UNIQUE ":"",f=Ct(s,a.name),b=this.keyParts(s,a,l).join(", ");return`CREATE ${c}INDEX ${this.quoteIdentifier(f)} ON ${this.quoteIdentifier(s)} (${b});`}addForeignKey(s,a,l,c,f,b,p=[]){let E=`${s}_${a}_fk`,x=`ALTER TABLE ${this.quoteIdentifier(s)} ADD CONSTRAINT ${this.quoteIdentifier(E)} FOREIGN KEY (${this.quoteIdentifier(a)}) REFERENCES ${this.quoteIdentifier(l)}(${this.quoteIdentifier(c)})`;if(f)x+=` ON DELETE ${f.toUpperCase()}`;if(b)x+=` ON UPDATE ${b.toUpperCase()}`;let D=[...new Set(p)].map((_)=>`ALTER TABLE ${this.quoteIdentifier(s)} DROP FOREIGN KEY ${this.quoteIdentifier(_)};`).join(`
250
+ `);return D?`${D}
251
+ ${x};`:`${x};`}addColumn(s,a){let l=this.getColumnType(a),c=[this.quoteIdentifier(a.name),l];if(!a.isNullable&&!a.isPrimaryKey)c.push("not null");let f=this.getDefaultValue(a);if(f)c.push(f);return`ALTER TABLE ${this.quoteIdentifier(s)} ADD COLUMN ${c.join(" ")};`}modifyColumn(s,a){let l=this.getColumnType(a),c=[this.quoteIdentifier(a.name),l];if(!a.isNullable&&!a.isPrimaryKey)c.push("not null");let f=this.getDefaultValue(a);if(f)c.push(f);let b=this.getAutoIncrementClause(a);if(b)c.push(b);return`ALTER TABLE ${this.quoteIdentifier(s)} MODIFY COLUMN ${c.join(" ")};`}renameColumn(s,a,l){return`ALTER TABLE ${this.quoteIdentifier(s)} RENAME COLUMN ${this.quoteIdentifier(a)} TO ${this.quoteIdentifier(l)};`}renameTable(s,a){return`RENAME TABLE ${this.quoteIdentifier(s)} TO ${this.quoteIdentifier(a)};`}rebuildTable(){throw Error("[migrations] rebuildTable is only implemented for SQLite; MySQL uses in-place ALTER.")}dropTable(s){return`DROP TABLE IF EXISTS ${this.quoteIdentifier(s)}`}dropColumn(s,a){return`ALTER TABLE ${this.quoteIdentifier(s)} DROP COLUMN ${this.quoteIdentifier(a)};`}dropIndex(s,a){let l=Ct(s,a);return`DROP INDEX ${this.quoteIdentifier(l)} ON ${this.quoteIdentifier(s)};`}dropEnumType(s){return""}createMigrationsTable(){return`CREATE TABLE IF NOT EXISTS migrations (
252
+ id INT AUTO_INCREMENT PRIMARY KEY,
253
+ migration VARCHAR(255) NOT NULL UNIQUE,
254
+ executed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
255
+ )`}getExecutedMigrationsQuery(){return"SELECT migration, executed_at FROM migrations ORDER BY executed_at"}recordMigrationQuery(){return"INSERT INTO migrations (migration) VALUES (?)"}jsonExtract(s,a){return`JSON_UNQUOTE(JSON_EXTRACT(${s}, CONCAT('$.', ${a})))`}dateBucket(s,a,l=0){let c=l===0?s:`DATE_ADD(${s}, INTERVAL ${l} HOUR)`;switch(a){case"hour":return`DATE_FORMAT(${c}, '%Y-%m-%dT%H:00:00.000Z')`;case"week":return`DATE_FORMAT(DATE_SUB(${c}, INTERVAL WEEKDAY(${c}) DAY), '%Y-%m-%dT00:00:00.000Z')`;case"month":return`DATE_FORMAT(${c}, '%Y-%m-01T00:00:00.000Z')`;case"year":return`DATE_FORMAT(${c}, '%Y-01-01T00:00:00.000Z')`;case"day":default:return`DATE_FORMAT(${c}, '%Y-%m-%dT00:00:00.000Z')`}}booleanLiteral(s){return s?"TRUE":"FALSE"}renderColumn(s){let a=this.getColumnType(s),l=[this.quoteIdentifier(s.name),a];if(s.isPrimaryKey){l.push("PRIMARY KEY");let f=this.getAutoIncrementClause(s);if(f)l.push(f)}if(!s.isNullable&&!s.isPrimaryKey)l.push("not null");let c=this.getDefaultValue(s);if(c)l.push(c);return l.join(" ")}}class fe{quoteIdentifier(s){return`"${s.replace(/"/g,'""')}"`}getColumnType(s){switch(s.type){case"string":return`varchar(${s.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(s.enumValues&&s.enumValues.length>0)return s.enumTypeName?this.quoteIdentifier(s.enumTypeName):"text";return"text";default:return"text"}}getPrimaryKeyType(s){switch(s.type){case"integer":return"SERIAL";case"bigint":return"BIGSERIAL";default:return this.getColumnType(s)}}getAutoIncrementClause(s){return""}getDefaultValue(s){if(!s.hasDefault||s.defaultValue===void 0)return"";let a=s.defaultValue;if(typeof a==="string"){let l=a.toUpperCase();if(l==="UTC_TIMESTAMP")return"default (now() AT TIME ZONE 'utc')";if(["CURRENT_TIMESTAMP","NOW()","NULL","CURRENT_DATE","CURRENT_TIME"].includes(l))return`default ${l}`;return`default '${a.replace(/'/g,"''")}'`}else if(typeof a==="number"||typeof a==="bigint")return`default ${a}`;else if(typeof a==="boolean")return`default ${a?"true":"false"}`;else if(a instanceof Date)return`default '${a.toISOString()}'`;return""}createEnumType(s,a){let l=a.map((c)=>`'${c.replace(/'/g,"''")}'`).join(", ");return`CREATE TYPE ${this.quoteIdentifier(s)} AS ENUM (${l});`}createTable(s){let a=s.columns.map((l)=>this.renderColumn(l)).join(`,
256
+ `);return`CREATE TABLE IF NOT EXISTS ${this.quoteIdentifier(s.table)} (
257
+ ${a}
258
+ );`}createIndex(s,a){let l=a.type==="unique"?"UNIQUE ":"",c=Ct(s,a.name),f=a.columns.map((p)=>this.quoteIdentifier(p)).join(", "),b=a.where?` WHERE ${a.where}`:"";return`CREATE ${l}INDEX IF NOT EXISTS ${this.quoteIdentifier(c)} ON ${this.quoteIdentifier(s)} (${f})${b};`}addForeignKey(s,a,l,c,f,b,p=[]){let E=`${s}_${a}_fk`,x=`ALTER TABLE ${this.quoteIdentifier(s)} ADD CONSTRAINT ${this.quoteIdentifier(E)} FOREIGN KEY (${this.quoteIdentifier(a)}) REFERENCES ${this.quoteIdentifier(l)}(${this.quoteIdentifier(c)})`;if(f)x+=` ON DELETE ${f.toUpperCase()}`;if(b)x+=` ON UPDATE ${b.toUpperCase()}`;let D=[...new Set(p)].map((_)=>`ALTER TABLE ${this.quoteIdentifier(s)} DROP CONSTRAINT ${this.quoteIdentifier(_)};`).join(`
259
+ `);return D?`${D}
260
+ ${x};`:`${x};`}addColumn(s,a){let l=this.getColumnType(a),c=[this.quoteIdentifier(a.name),l];if(!a.isNullable&&!a.isPrimaryKey)c.push("not null");let f=this.getDefaultValue(a);if(f)c.push(f);return`ALTER TABLE ${this.quoteIdentifier(s)} ADD COLUMN ${c.join(" ")};`}modifyColumn(s,a,l){let c=this.getColumnType(a),f=this.quoteIdentifier(s),b=this.quoteIdentifier(a.name);if(l&&this.getColumnType(l)===c&&!Qr(l,a)){let x=[];if(!a.isPrimaryKey&&l.isNullable!==a.isNullable)x.push(`ALTER TABLE ${f} ALTER COLUMN ${b} ${a.isNullable?"DROP NOT NULL":"SET NOT NULL"};`);let D=this.getDefaultValue(l),_=this.getDefaultValue(a);if(D!==_)x.push(_?`ALTER TABLE ${f} ALTER COLUMN ${b} SET ${_};`:`ALTER TABLE ${f} ALTER COLUMN ${b} DROP DEFAULT;`);if(x.length)return x.join(`
261
+ `)}let p=[`ALTER TABLE ${f} ALTER COLUMN ${b} DROP DEFAULT;`,`ALTER TABLE ${f} ALTER COLUMN ${b} TYPE ${c} USING ${b}::${c};`];if(!a.isPrimaryKey)p.push(`ALTER TABLE ${f} ALTER COLUMN ${b} ${a.isNullable?"DROP NOT NULL":"SET NOT NULL"};`);let E=this.getDefaultValue(a);if(E)p.push(`ALTER TABLE ${f} ALTER COLUMN ${b} SET ${E};`);return p.join(`
262
+ `)}renameColumn(s,a,l){return`ALTER TABLE ${this.quoteIdentifier(s)} RENAME COLUMN ${this.quoteIdentifier(a)} TO ${this.quoteIdentifier(l)};`}renameTable(s,a){return`ALTER TABLE ${this.quoteIdentifier(s)} RENAME TO ${this.quoteIdentifier(a)};`}rebuildTable(){throw Error("[migrations] rebuildTable is only implemented for SQLite; Postgres uses in-place ALTER.")}dropTable(s){return`DROP TABLE IF EXISTS ${this.quoteIdentifier(s)} CASCADE`}dropColumn(s,a){return`ALTER TABLE ${this.quoteIdentifier(s)} DROP COLUMN ${this.quoteIdentifier(a)};`}dropIndex(s,a){let l=Ct(s,a);return`DROP INDEX IF EXISTS ${this.quoteIdentifier(l)};`}dropEnumType(s){return`DROP TYPE IF EXISTS ${this.quoteIdentifier(s)} CASCADE`}createMigrationsTable(){return`CREATE TABLE IF NOT EXISTS migrations (
263
+ id SERIAL PRIMARY KEY,
264
+ migration VARCHAR(255) NOT NULL UNIQUE,
265
+ executed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
266
+ )`}getExecutedMigrationsQuery(){return"SELECT migration, executed_at FROM migrations ORDER BY executed_at"}recordMigrationQuery(){return"INSERT INTO migrations (migration) VALUES ($1)"}jsonExtract(s,a){return`(${s}::jsonb ->> ${a})`}dateBucket(s,a,l=0){let c=l===0?`${s}::timestamp`:`(${s}::timestamp ${l>=0?"+":"-"} interval '${Math.abs(l)} hours')`,f=a==="week"?`date_trunc('week', ${c})`:c;switch(a){case"hour":return`to_char(${f}, 'YYYY-MM-DD"T"HH24:00:00.000"Z"')`;case"month":return`to_char(${f}, 'YYYY-MM-01"T"00:00:00.000"Z"')`;case"year":return`to_char(${f}, 'YYYY-01-01"T"00:00:00.000"Z"')`;case"week":case"day":default:return`to_char(${f}, 'YYYY-MM-DD"T"00:00:00.000"Z"')`}}booleanLiteral(s){return s?"TRUE":"FALSE"}renderColumn(s){let a=s.isPrimaryKey?this.getPrimaryKeyType(s):this.getColumnType(s),l=[this.quoteIdentifier(s.name),a];if(s.isPrimaryKey)l.push("PRIMARY KEY");if(!s.isNullable&&!s.isPrimaryKey)l.push("not null");let c=this.getDefaultValue(s);if(c)l.push(c);if(s.references){let f=`REFERENCES ${this.quoteIdentifier(s.references.table)}(${this.quoteIdentifier(s.references.column)})`;if(s.references.onDelete)f+=` ON DELETE ${s.references.onDelete.toUpperCase()}`;if(s.references.onUpdate)f+=` ON UPDATE ${s.references.onUpdate.toUpperCase()}`;l.push(f)}return l.join(" ")}}function Qr(s,a){return JSON.stringify(s.enumValues??[])!==JSON.stringify(a.enumValues??[])}class me extends o{createTable(s){let a=s.columns.map((b)=>this.renderColumn(b)).join(`,
267
+ `),l=[];if(s.tableKind!=="reference"){let b=s.shardKey?.length?s.shardKey:s.columns.filter((p)=>p.isPrimaryKey).map((p)=>p.name);if(b&&b.length>0)l.push(`SHARD KEY (${b.map((p)=>this.quoteIdentifier(p)).join(", ")})`)}if(s.tableKind!=="rowstore"&&s.tableKind!=="reference"){let b=s.sortKey?.length?s.sortKey:void 0;l.push(`SORT KEY (${(b??[]).map((p)=>this.quoteIdentifier(p)).join(", ")})`)}let c=[a,...l].join(`,
268
+ `);return`CREATE${this.tableKindSuffix(s.tableKind)} TABLE IF NOT EXISTS ${this.quoteIdentifier(s.table)} (
269
+ ${c}
270
+ );`}tableKindSuffix(s){switch(s){case"rowstore":return" ROWSTORE";case"reference":return" REFERENCE";default:return""}}addForeignKey(){return""}createIndex(s,a,l){if(a.where)throw Error(`[migrations] Partial indexes (CompositeIndex.where) are not supported on SingleStore. Index '${a.name}' on table '${s}' uses WHERE clause: ${a.where}`);return super.createIndex(s,a,l)}}class he extends o{sharded;constructor(s=!0){super();this.sharded=s}getAutoIncrementClause(s){return this.sharded?"":super.getAutoIncrementClause(s)}renderColumn(s){if(!this.sharded||!s.references)return super.renderColumn(s);let{references:a,...l}=s;return super.renderColumn(l)}foreignKeyClauses(s){return this.sharded?[]:super.foreignKeyClauses(s)}createTable(s){return super.createTable(s)}addForeignKey(...s){return this.sharded?"":super.addForeignKey(...s)}createMigrationsTable(){if(!this.sharded)return super.createMigrationsTable();return`CREATE TABLE IF NOT EXISTS migrations (
271
+ migration VARCHAR(255) NOT NULL PRIMARY KEY,
272
+ executed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
273
+ )`}}class ge{quoteIdentifier(s){return`"${s.replace(/"/g,'""')}"`}getColumnType(s){if(s.name.endsWith("_id")&&N(s.type))return"INTEGER";if(s.type==="enum"){if(s.enumValues&&s.enumValues.length>0){let a=s.enumValues.map((l)=>`'${l.replace(/'/g,"''")}'`).join(", ");return`TEXT CHECK (${this.quoteIdentifier(s.name)} IN (${a}))`}return"TEXT"}return Oe(s.type)}getPrimaryKeyType(s){return this.getColumnType(s)}getAutoIncrementClause(s){if(s.isPrimaryKey&&(s.type==="integer"||s.type==="bigint"))return"AUTOINCREMENT";return""}getDefaultValue(s){if(!s.hasDefault||s.defaultValue===void 0)return"";let a=s.defaultValue;if(typeof a==="string"){if(a.toUpperCase()==="UTC_TIMESTAMP")return"default CURRENT_TIMESTAMP";if(["CURRENT_TIMESTAMP","CURRENT_DATE","CURRENT_TIME","NOW()","NULL","TRUE","FALSE"].includes(a.toUpperCase()))return`default ${a.toUpperCase()}`;return`default '${a.replace(/'/g,"''")}'`}else if(typeof a==="number"||typeof a==="bigint")return`default ${a}`;else if(typeof a==="boolean")return`default ${a?1:0}`;else if(a instanceof Date)return`default '${a.toISOString()}'`;return""}createEnumType(s,a){return""}createTable(s){let a=s.columns.map((l)=>this.renderColumn(l)).join(`,
274
+ `);return`CREATE TABLE IF NOT EXISTS ${this.quoteIdentifier(s.table)} (
275
+ ${a}
276
+ );`}createIndex(s,a){let l=a.type==="unique"?"UNIQUE ":"",c=Ct(s,a.name),f=a.columns.map((p)=>this.quoteIdentifier(p)).join(", "),b=a.where?` WHERE ${a.where}`:"";return`CREATE ${l}INDEX IF NOT EXISTS ${this.quoteIdentifier(c)} ON ${this.quoteIdentifier(s)} (${f})${b};`}addForeignKey(s,a,l,c,f,b){return""}addColumn(s,a){let l=this.getColumnType(a),c=[this.quoteIdentifier(a.name),l];if(!a.isNullable&&!a.isPrimaryKey)c.push("not null");let f=this.getDefaultValue(a);if(f)c.push(f);return c.push(...this.referencesClause(a)),`ALTER TABLE ${this.quoteIdentifier(s)} ADD COLUMN ${c.join(" ")};`}modifyColumn(s,a){return`-- SQLite does not support ALTER COLUMN; a table rebuild is required to change ${this.quoteIdentifier(s)}.${this.quoteIdentifier(a.name)}`}renameColumn(s,a,l){return`ALTER TABLE ${this.quoteIdentifier(s)} RENAME COLUMN ${this.quoteIdentifier(a)} TO ${this.quoteIdentifier(l)};`}renameTable(s,a){return`ALTER TABLE ${this.quoteIdentifier(s)} RENAME TO ${this.quoteIdentifier(a)};`}rebuildTable(s){let{target:a,tempName:l,columnSource:c}=s,f=(D)=>this.quoteIdentifier(D),b=a.columns.map((D)=>this.renderColumn(D)).join(`,
277
+ `),p=`CREATE TABLE ${f(l)} (
278
+ ${b}
279
+ );`,E=a.columns.map((D)=>D.name).filter((D)=>c[D]!==void 0),x=["PRAGMA foreign_keys=OFF;","BEGIN;",p];if(E.length>0){let D=E.map(f).join(", "),_=E.map((v)=>f(c[v])).join(", ");x.push(`INSERT INTO ${f(l)} (${D}) SELECT ${_} FROM ${f(a.table)};`)}x.push(`DROP TABLE ${f(a.table)};`),x.push(`ALTER TABLE ${f(l)} RENAME TO ${f(a.table)};`);for(let D of a.indexes)x.push(this.createIndex(a.table,D));return x.push("PRAGMA foreign_key_check;"),x.push("COMMIT;"),x.push("PRAGMA foreign_keys=ON;"),x.join(`
280
+ `)}dropTable(s){return`DROP TABLE IF EXISTS ${this.quoteIdentifier(s)}`}dropColumn(s,a){return`ALTER TABLE ${this.quoteIdentifier(s)} DROP COLUMN ${this.quoteIdentifier(a)};`}dropIndex(s,a){let l=Ct(s,a);return`DROP INDEX IF EXISTS ${this.quoteIdentifier(l)};`}dropEnumType(s){return""}createMigrationsTable(){return`CREATE TABLE IF NOT EXISTS migrations (
281
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
282
+ migration TEXT NOT NULL UNIQUE,
283
+ executed_at DATETIME DEFAULT CURRENT_TIMESTAMP
284
+ )`}getExecutedMigrationsQuery(){return"SELECT migration, executed_at FROM migrations ORDER BY executed_at"}recordMigrationQuery(){return"INSERT INTO migrations (migration) VALUES (?)"}jsonExtract(s,a){return`json_extract(${s}, '$.' || ${a})`}dateBucket(s,a,l=0){let c=l===0?s:`datetime(${s}, '${l>=0?"+":"-"}${Math.abs(l)} hours')`;switch(a){case"hour":return`strftime('%Y-%m-%dT%H:00:00.000Z', ${c})`;case"week":return`strftime('%Y-%m-%dT00:00:00.000Z', ${c}, '-6 days', 'weekday 1')`;case"month":return`strftime('%Y-%m-01T00:00:00.000Z', ${c})`;case"year":return`strftime('%Y-01-01T00:00:00.000Z', ${c})`;case"day":default:return`strftime('%Y-%m-%dT00:00:00.000Z', ${c})`}}booleanLiteral(s){return s?"TRUE":"FALSE"}renderColumn(s){let a=this.getColumnType(s),l=[this.quoteIdentifier(s.name),a];if(s.isPrimaryKey){l.push("PRIMARY KEY");let f=this.getAutoIncrementClause(s);if(f)l.push(f)}if(!s.isNullable&&!s.isPrimaryKey)l.push("not null");let c=this.getDefaultValue(s);if(c)l.push(c);return l.push(...this.referencesClause(s)),l.join(" ")}referencesClause(s){if(!s.references)return[];let a=[`REFERENCES ${this.quoteIdentifier(s.references.table)}(${this.quoteIdentifier(s.references.column)})`];if(s.references.onDelete)a.push(`ON DELETE ${s.references.onDelete.toUpperCase()}`);if(s.references.onUpdate)a.push(`ON UPDATE ${s.references.onUpdate.toUpperCase()}`);return a}}function h(s,a={}){switch(s){case"postgres":return new fe;case"mysql":return new o;case"singlestore":return new me;case"vitess":return new he(a.vitessSharded??e.vitess?.sharded??!0);case"sqlite":return new ge;default:throw Error(`Unsupported dialect: ${s}`)}}import{existsSync as Wr}from"fs";import{dirname as Vn,isAbsolute as Gr,join as Yn}from"path";import jn from"process";function cn(s=jn.cwd()){let a=s;while(a!==Vn(a)){if(Wr(Yn(a,"package.json")))return a;a=Vn(a)}return jn.cwd()}function _t(s,a="database/migrations"){let l=a||"database/migrations";return Gr(l)?l:Yn(s??cn(),l)}async function Jr(s,a,l){if(l.length===0)return;let c=tr(Ot());try{await nr(s,a);for(let f of l)await Jt(s,f,a),qe(`-- \u2713 Recorded applied migration: ${f}`)}catch(f){qe(`-- Could not record applied migrations (the schema change itself succeeded): ${f instanceof Error?f.message:String(f)}`)}}function Jn(s){try{return bt(Ft(s,"utf8"))}catch{return!1}}function Zr(s){let a=s instanceof Error?s.message:String(s);return/duplicate column name/i.test(a)||/duplicate key name/i.test(a)||/duplicate foreign key constraint name/i.test(a)||/\balready exists\b/i.test(a)}function qe(s){if(e.verbose)console.log(s)}function Zn(s){return At(s,e.snapshotDir||".qb")}function fn(s,a){return At(Zn(s),`model-snapshot.${a}.json`)}function ei(s,a){let l=fn(s,a);if(!Nt(l))return;try{let c=Ft(l,"utf8"),f=JSON.parse(c);if(f?.plan&&Array.isArray(f.plan.tables)&&f.plan.dialect)return f.plan;if(Array.isArray(f?.tables)&&f?.dialect)return f;qe("-- Invalid snapshot format, treating as no previous state");return}catch(c){qe(`-- Could not load snapshot, treating as no previous state: ${c instanceof Error?c.message:String(c)}`);return}}function er(s,a,l){let c=fn(s,a),f=Zn(s),b=wt(l);if(Nt(c))try{let E=JSON.parse(Ft(c,"utf8"));if(E?.hash===b&&E?.dialect===a&&E?.plan){qe("-- Model snapshot unchanged");return}}catch{}if(!Nt(f))Gn(f,{recursive:!0}),qe(`-- Created snapshot directory: ${f}`);let p={plan:l,hash:b,dialect:a,updatedAt:new Date().toISOString()};Xn(c,JSON.stringify(p,null,2)),qe(`-- Model snapshot saved to ${c}`)}function ot(s,a={}){let l=a.dialect??s.dialect;er(a.workspaceRoot??Ot(),l,s)}function Ot(){return cn()}function tr(s){let a=_t(s,e.migrationDir);if(!Nt(a))Gn(a,{recursive:!0}),qe(`-- Created SQL directory: ${a}`);return a}async function w(s,a={}){if(await P(),!s)s=At(mn.cwd(),"app/Models");let l=a.dialect||e.dialect||"postgres",c=Ot(),f=await d({modelsDir:s}),b=G(f,{dialect:l,vitessSharded:a.vitessSharded}),p,E=!1;if(!a.full)if(p=ei(c,l),p)qe("-- Comparing with stored model snapshot");else{let Y=At(s,`.qb-migrations.${l}.json`),J=String(a.state||Y);if(Nt(J))try{let z=Ft(J,"utf8"),Me=JSON.parse(z);if(p=Me?.plan&&Me.plan.tables?Me.plan:Me?.tables?Me:void 0,p)qe("-- Comparing with legacy state file (will migrate to new snapshot format)")}catch{}if(!p||a.fromDb)try{let z=await Bn(l),Me=new Set(b.tables.map((Pe)=>Pe.table)),Ke=z.tables.filter((Pe)=>Me.has(Pe.table));if(Ke.length>0)p={dialect:z.dialect,tables:Ke},E=!0,qe(`-- No snapshot; reconciling against live database (${Ke.length} matching table${Ke.length===1?"":"s"})`)}catch(z){qe(`-- Could not introspect live database, treating as no previous state: ${z instanceof Error?z.message:String(z)}`)}if(!p)qe("-- No previous snapshot found, generating full migration")}else qe("-- Full migration requested, ignoring any previous state");let x=a.full?{statements:ke(b,{dryRun:a.dryRun}),operations:b.tables.map((Y)=>({kind:"create_table",table:Y.table,destructive:!1,sql:""}))}:He(p,b,{applyRenames:a.applyRenames,dryRun:a.dryRun,preserveUnknownColumns:E}),{statements:D,operations:_}=x,v=D.join(`
285
+ `),k=D.some((Y)=>/\b(?:CREATE|ALTER|DROP)\b/i.test(Y));if(a.apply){let Y=zr(At(Hr(),"qb-migrate-")),J=At(Y,"migration.sql");try{if(k){Xn(J,v);let z=i();await z.file(J),qe("-- Migration applied"),await Jr(z,l,pt())}else qe("-- No changes; nothing to apply")}catch(z){throw console.error("-- Migration failed:",z),z}finally{Hn(Y,{recursive:!0,force:!0})}}if(!a.dryRun)er(c,l,b);return{sql:v,sqlStatements:D,hasChanges:k,plan:b,operations:_}}function ti(s,a){if(s===void 0)return[tr(a)];let l=Array.isArray(s)?s:[s];if(l.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 l.map((c)=>Xr(c)?c:At(a,c))}function ni(s){let a=new Map;for(let l of s){if(!Nt(l))throw Error(`Migration directory not found: ${l}`);for(let c of zn(l).filter((f)=>f.endsWith(".sql"))){let f=a.get(c);if(f!==void 0)throw Error(`Duplicate migration file name across directories: "${c}" appears in both ${f} and ${At(l,c)}. Migrations are recorded by file name, so names must be unique across every directory in a run.`);a.set(c,At(l,c))}}return[...a].map(([l,c])=>({name:l,path:c})).sort((l,c)=>l.name<c.name?-1:l.name>c.name?1:0)}var Qn="bun-query-builder:migrate",ri=/\bCONCURRENTLY\b|^\s*VACUUM\b|^\s*BEGIN\s*(?:;|TRANSACTION\b)|^\s*PRAGMA\s+foreign_keys\b/im;function Wn(s){return s==="postgres"||s==="sqlite"}async function ii(s,a){if(s==="sqlite")return await a();let l=i(),c;try{c=await l.reserve()}catch{return await a()}let f=!1;try{return await c.advisoryLock(Qn),f=!0,await a()}finally{try{if(f)await c.advisoryUnlock(Qn)}finally{c.release?.()}}}async function R(s){await P();let a=Ot(),l=e.dialect||"postgres",c=ni(ti(s,a));if(c.length===0)return qe("-- No migration files found to execute"),!0;qe(`-- Found ${c.length} script files to execute`);try{let f=i();return await ii(l,async()=>{await nr(f,l);let b=await li(f,l),p=c.filter((E)=>!b.includes(E.name));if(p.length===0)return qe("-- No pending migrations to execute"),!0;qe(`-- Executing ${p.length} migration${p.length===1?"":"s"}`);for(let{name:E,path:x}of p){qe(`-- Executing: ${E}`);try{if(Wn(l)&&!ri.test(Ft(x,"utf-8")))await f.transaction(async(_)=>{await _.file(x),await Jt(_,E,l)});else if(await f.file(x),await Jt(f,E,l),!Wn(l))qe(`-- (${l} commits DDL implicitly, so ${E} was not applied atomically)`);else qe(`-- (${E} contains a statement that cannot run in a transaction, so it was not applied atomically)`);qe(`-- \u2713 Migration ${E} executed and recorded`)}catch(D){if(Jn(x)&&Zr(D)){await Jt(f,E,l),qe(`-- \u2713 Migration ${E} was already applied; recorded it (${D instanceof Error?D.message:String(D)})`);continue}throw console.error(`-- \u2717 Migration ${E} failed:`,D),D}}return qe("-- All migrations executed successfully"),!0})}catch(f){throw console.error("-- Migration execution failed:",f),f}return!0}async function A(s,a={}){if(await P(),!s)s=At(mn.cwd(),"app/Models");let l=a.dialect||e.dialect||"postgres",c=h(l),f=Ot(),b=async(p)=>{let E=c.dropTable(p);await tt(async(x)=>{if(l==="sqlite")await x.unsafe("PRAGMA foreign_keys = OFF").execute();if(l==="mysql"||l==="vitess")await x.unsafe("SET FOREIGN_KEY_CHECKS = 0").execute();try{await x.unsafe(E).execute()}finally{if(l==="sqlite")await x.unsafe("PRAGMA foreign_keys = ON").execute();if(l==="mysql"||l==="vitess")await x.unsafe("SET FOREIGN_KEY_CHECKS = 1").execute()}})};try{try{await b("migrations"),qe("-- Dropped migrations table")}catch(x){console.error(x)}let p=[],E=[];try{let x=await d({modelsDir:s}),D=G(x,{dialect:l});p=D.tables.map((v)=>v.table);let _=new Set;for(let v of D.tables)for(let k of v.columns)if(k.type==="enum"&&k.enumValues&&k.enumValues.length>0){let Y=`${v.table}_${k.name}_type`;_.add(Y)}E=Array.from(_)}catch(x){console.error(x),p=[],E=[]}if(p.length===0)qe("-- No tables found to drop");else{qe(`-- Dropping ${p.length} tables: ${p.join(", ")}`);for(let x of p.reverse())try{await b(x),qe(`-- Dropped table: ${x}`)}catch(D){console.error(D),qe(`-- Table ${x} may not exist, skipping drop`)}}if(E.length>0){qe(`-- Dropping ${E.length} enum types: ${E.join(", ")}`);for(let x of E)try{let D=c.dropEnumType(x);if(D)await tt(async(_)=>{await _.unsafe(D).execute(),qe(`-- Dropped enum type: ${x}`)})}catch(D){console.error(D),qe(`-- Enum type ${x} may not exist, skipping drop`)}}else qe("-- No enum types found to drop");if(p.length>0&&!a.preserveMigrationState)try{await si(s,f,a)}catch(x){console.error(x),qe("-- Could not clean up migration files")}else if(p.length===0)qe("-- No models directory found; keeping committed migration files in place");else qe("-- Preserving migration files and model snapshot for fresh replay");if(!a.preserveMigrationState)try{await oi(f)}catch(x){console.error(x),qe("-- Could not clear generated directory")}return qe("-- Database reset completed successfully"),!0}catch(p){return console.error("-- Database reset failed:",p),!1}}async function si(s,a,l={}){if(!s)s=At(mn.cwd(),"app/Models");if(!a)a=Ot();let c=String(l.dialect||e.dialect||"postgres"),f=fn(a,c);if(Nt(f))dn(f),qe(`-- Removed model snapshot file: ${f}`);let b=At(s,`.qb-migrations.${c}.json`),p=String(l.state||b);if(Nt(p))dn(p),qe(`-- Removed legacy migration state file: ${p}`);ai(_t(a,e.migrationDir))}function ai(s){if(!Nt(s))return;let a=0,l=[];for(let c of zn(s).filter((f)=>f.endsWith(".sql"))){if(!Jn(At(s,c))){l.push(c);continue}dn(At(s,c)),qe(`-- Removed generated migration file: ${c}`),a+=1}if(qe(`-- Cleaned up ${a} generated migration file${a===1?"":"s"} from migrations directory`),l.length>0)qe(`-- Kept ${l.length} hand-written migration${l.length===1?"":"s"}: ${l.slice(0,5).join(", ")}${l.length>5?`, +${l.length-5} more`:""}`)}async function oi(s){if(!s)s=Ot();let a=At(s,"generated");if(Nt(a))try{Hn(a,{recursive:!0,force:!0}),qe("-- Cleared generated directory")}catch(l){console.error("-- Failed to clear generated directory:",l)}}async function nr(s,a){let c=h(a).createMigrationsTable();try{await s.unsafe(c).execute(),qe("-- Migrations table ready")}catch(f){throw console.error("-- Failed to create migrations table:",f),f}}async function li(s,a){let l=h(a);try{return(await s.unsafe(l.getExecutedMigrationsQuery()).execute()).map((f)=>f.migration)}catch(c){return console.error("-- Failed to get executed migrations:",c),[]}}async function Jt(s,a,l){let c=h(l);try{qe(`-- Recording migration: ${a}`),await s.unsafe(c.recordMigrationQuery(),[a]).execute(),qe(`-- Successfully recorded migration: ${a}`)}catch(f){throw console.error(`-- Failed to record migration ${a}:`,f),f}}async function pe(s,a={}){return w(s,a)}import{existsSync as rr,readFileSync as ui,unlinkSync as ci}from"fs";import{join as di}from"path";function mi(s){let a=[],l="",c=null;for(let f=0;f<s.length;f++){let b=s[f];if(c){if(l+=b,b===c)if(s[f+1]===c)l+=s[f+1],f++;else c=null;continue}if(b==="'"||b==='"'||b==="`"){c=b,l+=b;continue}if(b==="-"&&s[f+1]==="-"){let p=s.indexOf(`
286
+ `,f);f=p===-1?s.length:p;continue}if(b==="/"&&s[f+1]==="*"){let p=s.indexOf("*/",f+2);f=p===-1?s.length:p+1;continue}if(b===";"){if(l.trim())a.push(l.trim());l="";continue}l+=b}if(l.trim())a.push(l.trim());return a}function fi(s,a=e.dialect){let l=(b)=>n(a)?`\`${b}\``:`"${b}"`,c=[],f=[];for(let b of mi(s)){let p;if(p=/^CREATE\s+TABLE\s+(?:IF\s+NOT\s+EXISTS\s+)?["`']?(\w+)["`']?/i.exec(b))c.push(`DROP TABLE IF EXISTS ${l(p[1])}`);else if(p=/^ALTER\s+TABLE\s+["`']?(\w+)["`']?\s+ADD\s+CONSTRAINT\s+["`']?(\w+)["`']?([\s\S]*)$/i.exec(b))if(a==="sqlite")f.push(b);else if(n(a)&&/\bFOREIGN\s+KEY\b/i.test(p[3]??""))c.push(`ALTER TABLE ${l(p[1])} DROP FOREIGN KEY ${l(p[2])}`);else c.push(`ALTER TABLE ${l(p[1])} DROP CONSTRAINT ${l(p[2])}`);else if(p=/^ALTER\s+TABLE\s+["`']?(\w+)["`']?\s+ADD\s+(?:COLUMN\s+["`']?(\w+)["`']?|["`'](\w+)["`']|(\w+))/i.exec(b)){let E=p[2]??p[3]??p[4];if(p[4]&&/^(?:PRIMARY|UNIQUE|INDEX|KEY|FOREIGN|CHECK|FULLTEXT|SPATIAL)$/i.test(p[4]))f.push(b);else c.push(`ALTER TABLE ${l(p[1])} DROP COLUMN ${l(E)}`)}else if(p=/^CREATE\s+(?:UNIQUE\s+)?INDEX\s+(?:IF\s+NOT\s+EXISTS\s+)?["`']?(\w+)["`']?(?:\s+ON\s+["`']?(\w+)["`']?)?/i.exec(b))c.push(n(a)&&p[2]?`DROP INDEX ${l(p[1])} ON ${l(p[2])}`:`DROP INDEX IF EXISTS ${l(p[1])}`);else f.push(b)}return{down:c.reverse(),skipped:f}}async function ye(s={}){let a=s.steps||1,l=s.reverseSchema!==!1;console.log("-- Rolling back migrations"),console.log(`-- Steps: ${a}`),console.log();try{let c=i(),f=[];try{f=await c.unsafe(`
286
287
  SELECT migration, executed_at
287
288
  FROM migrations
288
289
  ORDER BY executed_at DESC, migration DESC
289
- `)}catch(x){console.log("-- Migrations table not found. Nothing to rollback.",x);return}if(f.length===0){console.log("-- No migrations to rollback");return}let b=f.slice(0,a);console.log(`-- Found ${f.length} executed migrations`),console.log(`-- Rolling back ${b.length} migration(s):`),console.log();for(let x of b)console.log(` - ${x.migration}`);console.log();let p=_t(void 0,e.migrationDir),E=!1;for(let x of b)try{let D=Xr(p,x.migration);if(l&&Qn(D)){let v=zr(D,"utf8"),{down:k,skipped:Y}=Zr(v);for(let J of k)await c.unsafe(J),console.log(`-- \u21A9 ${J}`),E=!0;if(Y.length>0)console.log(`-- \u26A0\uFE0F ${Y.length} statement(s) in ${x.migration} could not be auto-reversed (data/complex DDL) \u2014 reverse manually.`)}let _=`DELETE FROM migrations WHERE migration = ${t(1)}`;if(await c.unsafe(_,[x.migration]),console.log(`-- \u2713 Removed migration record: ${x.migration}`),s.deleteFiles&&Qn(D))Hr(D),console.log(`-- \uD83D\uDDD1\uFE0F Deleted migration file: ${x.migration}`)}catch(D){throw console.error(`-- \u2717 Failed to rollback migration ${x.migration}:`,D),D}if(console.log(),l)console.log(E?"-- \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(c){throw console.error("-- Rollback failed:",c),c}}import{existsSync as ei,readdirSync as ti}from"fs";async function q(){let s=e.dialect||"postgres",a=h(s),l=_t(void 0,e.migrationDir);if(console.log("-- Migration Status"),console.log(`-- Dialect: ${s}`),console.log(`-- SQL directory: ${l}`),console.log(),!ei(l))return console.log("-- No SQL directory found. No migrations have been created yet."),[];let f=ti(l).filter((b)=>b.endsWith(".sql")).sort();if(f.length===0)return console.log("-- No migration files found"),[];try{let b=i(),p=[];try{p=await b.unsafe(a.getExecutedMigrationsQuery())}catch(v){console.log("-- Migrations table not found. All migrations are pending.",v),console.log()}let E=new Map(p.map((v)=>[v.migration,v.executed_at])),x=f.map((v)=>({file:v,status:E.has(v)?"executed":"pending",executedAt:E.get(v)})),D=x.filter((v)=>v.status==="executed"),_=x.filter((v)=>v.status==="pending");if(console.log(`-- Total migrations: ${f.length}`),console.log(`-- Executed: ${D.length}`),console.log(`-- Pending: ${_.length}`),console.log(),D.length>0){console.log("\u2713 Executed Migrations:");for(let v of D)console.log(` - ${v.file} ${v.executedAt?`(${new Date(v.executedAt).toLocaleString()})`:""}`);console.log()}if(_.length>0){console.log("\u25CB Pending Migrations:");for(let v of _)console.log(` - ${v.file}`);console.log()}return x}catch(b){throw console.error("-- Failed to get migration status:",b),b}}async function be(){return q()}import{readdirSync as ni}from"fs";import{extname as dn,join as Wn}from"path";import ri from"process";async function W(s,a={}){let l=a.dir||Wn(ri.cwd(),"app/Models");try{let c=ni(l),f=c.find((_)=>_.replace(dn(_),"").toLowerCase()===s.toLowerCase());if(!f){console.error(`Model "${s}" not found in ${l}`),console.log(`Available models: ${c.filter((_)=>[".ts",".js"].includes(dn(_))).map((_)=>_.replace(dn(_),"")).join(", ")}`);return}let p=await import(Wn(l,f)),E=p.default||p[Object.keys(p)[0]];if(!E||!E.name){console.error(`Invalid model file: ${f}`);return}let x={name:E.name,table:E.table||`${E.name.toLowerCase()}s`,primaryKey:E.primaryKey||"id",attributes:E.attributes||{},relations:E.relations,scopes:E.scopes,indexes:E.indexes,timestamps:E.timestamps!==!1,softDeletes:E.softDeletes===!0},D=[];if(E.beforeCreate)D.push("beforeCreate");if(E.afterCreate)D.push("afterCreate");if(E.beforeUpdate)D.push("beforeUpdate");if(E.afterUpdate)D.push("afterUpdate");if(E.beforeDelete)D.push("beforeDelete");if(E.afterDelete)D.push("afterDelete");if(D.length>0)x.hooks=D;if(a.json)return console.log(JSON.stringify(x,null,2)),x;console.log(`
290
+ `)}catch(x){console.log("-- Migrations table not found. Nothing to rollback.",x);return}if(f.length===0){console.log("-- No migrations to rollback");return}let b=f.slice(0,a);console.log(`-- Found ${f.length} executed migrations`),console.log(`-- Rolling back ${b.length} migration(s):`),console.log();for(let x of b)console.log(` - ${x.migration}`);console.log();let p=_t(void 0,e.migrationDir),E=!1;for(let x of b)try{let D=di(p,x.migration);if(l&&rr(D)){let v=ui(D,"utf8"),{down:k,skipped:Y}=fi(v);for(let J of k)await c.unsafe(J),console.log(`-- \u21A9 ${J}`),E=!0;if(Y.length>0)console.log(`-- \u26A0\uFE0F ${Y.length} statement(s) in ${x.migration} could not be auto-reversed (data/complex DDL) \u2014 reverse manually.`)}let _=`DELETE FROM migrations WHERE migration = ${t(1)}`;if(await c.unsafe(_,[x.migration]),console.log(`-- \u2713 Removed migration record: ${x.migration}`),s.deleteFiles&&rr(D))ci(D),console.log(`-- \uD83D\uDDD1\uFE0F Deleted migration file: ${x.migration}`)}catch(D){throw console.error(`-- \u2717 Failed to rollback migration ${x.migration}:`,D),D}if(console.log(),l)console.log(E?"-- \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(c){throw console.error("-- Rollback failed:",c),c}}import{existsSync as pi,readdirSync as gi}from"fs";async function q(){let s=e.dialect||"postgres",a=h(s),l=_t(void 0,e.migrationDir);if(console.log("-- Migration Status"),console.log(`-- Dialect: ${s}`),console.log(`-- SQL directory: ${l}`),console.log(),!pi(l))return console.log("-- No SQL directory found. No migrations have been created yet."),[];let f=gi(l).filter((b)=>b.endsWith(".sql")).sort();if(f.length===0)return console.log("-- No migration files found"),[];try{let b=i(),p=[];try{p=await b.unsafe(a.getExecutedMigrationsQuery())}catch(v){console.log("-- Migrations table not found. All migrations are pending.",v),console.log()}let E=new Map(p.map((v)=>[v.migration,v.executed_at])),x=f.map((v)=>({file:v,status:E.has(v)?"executed":"pending",executedAt:E.get(v)})),D=x.filter((v)=>v.status==="executed"),_=x.filter((v)=>v.status==="pending");if(console.log(`-- Total migrations: ${f.length}`),console.log(`-- Executed: ${D.length}`),console.log(`-- Pending: ${_.length}`),console.log(),D.length>0){console.log("\u2713 Executed Migrations:");for(let v of D)console.log(` - ${v.file} ${v.executedAt?`(${new Date(v.executedAt).toLocaleString()})`:""}`);console.log()}if(_.length>0){console.log("\u25CB Pending Migrations:");for(let v of _)console.log(` - ${v.file}`);console.log()}return x}catch(b){throw console.error("-- Failed to get migration status:",b),b}}async function be(){return q()}import{readdirSync as yi}from"fs";import{extname as pn,join as ir}from"path";import bi from"process";async function W(s,a={}){let l=a.dir||ir(bi.cwd(),"app/Models");try{let c=yi(l),f=c.find((_)=>_.replace(pn(_),"").toLowerCase()===s.toLowerCase());if(!f){console.error(`Model "${s}" not found in ${l}`),console.log(`Available models: ${c.filter((_)=>[".ts",".js"].includes(pn(_))).map((_)=>_.replace(pn(_),"")).join(", ")}`);return}let p=await import(ir(l,f)),E=p.default||p[Object.keys(p)[0]];if(!E||!E.name){console.error(`Invalid model file: ${f}`);return}let x={name:E.name,table:E.table||`${E.name.toLowerCase()}s`,primaryKey:E.primaryKey||"id",attributes:E.attributes||{},relations:E.relations,scopes:E.scopes,indexes:E.indexes,timestamps:E.timestamps!==!1,softDeletes:E.softDeletes===!0},D=[];if(E.beforeCreate)D.push("beforeCreate");if(E.afterCreate)D.push("afterCreate");if(E.beforeUpdate)D.push("beforeUpdate");if(E.afterUpdate)D.push("afterUpdate");if(E.beforeDelete)D.push("beforeDelete");if(E.afterDelete)D.push("afterDelete");if(D.length>0)x.hooks=D;if(a.json)return console.log(JSON.stringify(x,null,2)),x;console.log(`
290
291
  \uD83D\uDCE6 Model: ${x.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: ${x.table}`),console.log(`Primary Key: ${x.primaryKey}`),console.log(`Timestamps: ${x.timestamps?"\u2713":"\u2717"}`),console.log(`Soft Deletes: ${x.softDeletes?"\u2713":"\u2717"}`),console.log(`
291
292
  \uD83D\uDCCB Attributes (${Object.keys(x.attributes).length}):`);for(let[_,v]of Object.entries(x.attributes)){let k=v.type||"string",Y=v.required?"(required)":"",J=v.unique?"(unique)":"",z=v.default!==void 0?`= ${JSON.stringify(v.default)}`:"";console.log(` \u2022 ${_}: ${k} ${Y} ${J} ${z}`.trim())}if(x.relations&&Object.keys(x.relations).length>0){console.log(`
292
293
  \uD83D\uDD17 Relations (${Object.keys(x.relations).length}):`);for(let[_,v]of Object.entries(x.relations)){let k=v.type||"unknown",Y=v.model||v.table||"unknown";console.log(` \u2022 ${_}: ${k} \u2192 ${Y}`)}}if(x.scopes&&Object.keys(x.scopes).length>0){console.log(`
293
294
  \uD83D\uDD0D Scopes (${Object.keys(x.scopes).length}):`);for(let _ of Object.keys(x.scopes))console.log(` \u2022 ${_}()`)}if(x.hooks&&x.hooks.length>0){console.log(`
294
295
  \uD83E\uDE9D Hooks (${x.hooks.length}):`);for(let _ of x.hooks)console.log(` \u2022 ${_}`)}if(x.indexes&&x.indexes.length>0){console.log(`
295
- \uD83D\uDCC7 Indexes (${x.indexes.length}):`);for(let _ of x.indexes){let v=Array.isArray(_.columns)?_.columns.join(", "):_.columns,k=_.unique?"(unique)":"";console.log(` \u2022 ${_.name||"unnamed"}: [${v}] ${k}`.trim())}}return console.log(),x}catch(c){throw console.error(`Error loading model "${s}":`,c.message),c}}async function Te(){let a=await i().ping();return console.log(a?"OK":"NOT READY"),a}import{readdirSync as ii,readFileSync as Gn,statSync as si}from"fs";import{extname as zn,join as ai}from"path";async function U(s,a={}){let l=[];try{let c=si(s),f=[];if(c.isDirectory())f=ii(s).filter((x)=>zn(x)===".sql").map((x)=>ai(s,x));else if(c.isFile()&&zn(s)===".sql")f=[s];else return console.error("Path must be a .sql file or directory containing .sql files"),l;if(f.length===0)return console.log("No .sql files found"),l;if(a.verbose)console.log(`Analyzing ${f.length} SQL file(s)...
296
- `);for(let E of f)try{let x=Gn(E,"utf8").trim();if(!x){if(a.verbose)console.log(`\u2298 ${E}: empty file`);continue}if(a.verbose)console.log(`\uD83D\uDCC4 ${E}`),console.log(` Query: ${x.substring(0,60)}${x.length>60?"...":""}`);let D=await r`EXPLAIN ${r.unsafe(x)}`;if(l.push({file:E,query:x,plan:Array.isArray(D)?D:[D]}),a.verbose&&!a.json){if(console.log(" Plan:"),Array.isArray(D))for(let _ of D)if(typeof _==="string")console.log(` ${_}`);else if(_["QUERY PLAN"])console.log(` ${_["QUERY PLAN"]}`);else if(_.plan)console.log(` ${JSON.stringify(_.plan)}`);else console.log(` ${JSON.stringify(_)}`);console.log()}}catch(x){if(l.push({file:E,query:Gn(E,"utf8").trim(),plan:[],error:x.message}),a.verbose)console.log(` \u2717 Error: ${x.message}
297
- `)}let b=l.filter((E)=>!E.error).length,p=l.filter((E)=>E.error).length;if(a.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: ${b} successful, ${p} failed`);if(a.json)console.log(JSON.stringify(l,null,2));return l}catch(c){throw console.error("Error explaining queries:",c.message),c}}import{writeFileSync as oi}from"fs";import{join as li}from"path";import ui from"process";async function V(s={}){let a=s.dir||li(ui.cwd(),"app/Models"),l=s.format||"mermaid";try{let c=await d({modelsDir:a});if(!c||Object.keys(c).length===0)return console.error("No models found"),"";let f="";if(l==="mermaid")f=ci(c);else if(l==="dot")f=di(c);else return console.error(`Unsupported format: ${l}`),"";if(s.output)oi(s.output,f,"utf8"),console.log(`\u2713 Diagram written to: ${s.output}`);else console.log(f);return f}catch(c){throw console.error("Error generating diagram:",c.message),c}}function ci(s){let a=["erDiagram"];for(let[l,c]of Object.entries(s)){let f=c.table||`${l.toLowerCase()}s`,b=c.attributes||{};a.push(` ${f} {`);for(let[p,E]of Object.entries(b)){let x=E.type||"string",D=c.primaryKey===p?"PK":"",_=E.unique?"UK":"",v=[D,_].filter(Boolean).join(","),k=v?` "${v}"`:"";a.push(` ${x} ${p}${k}`)}a.push(" }")}for(let[l,c]of Object.entries(s)){let f=c.table||`${l.toLowerCase()}s`,b=c.relations||{};for(let[p,E]of Object.entries(b)){let{type:x,model:D}=E,_=s[D]?.table||`${D?.toLowerCase()}s`||"unknown",v="";if(x==="hasOne")v="||--||";else if(x==="hasMany")v="||--o{";else if(x==="belongsTo")v="}o--||";else if(x==="belongsToMany"||x==="manyToMany")v="}o--o{";else v="||--||";a.push(` ${f} ${v} ${_} : "${p}"`)}}return a.join(`
298
- `)}function di(s){let a=["digraph schema {"," rankdir=LR;"," node [shape=record];",""];for(let[l,c]of Object.entries(s)){let f=c.table||`${l.toLowerCase()}s`,b=c.attributes||{},p=[];for(let[x,D]of Object.entries(b)){let _=D.type||"string",v=c.primaryKey===x?" (PK)":"",k=D.unique?" (UK)":"";p.push(`${x}: ${_}${v}${k}`)}let E=`${p.join("\\l")}\\l`;a.push(` ${f} [label="{${f}|${E}}"];`)}a.push("");for(let[l,c]of Object.entries(s)){let f=c.table||`${l.toLowerCase()}s`,b=c.relations||{};for(let[p,E]of Object.entries(b)){let{type:x,model:D}=E,_=s[D]?.table||`${D?.toLowerCase()}s`||"unknown",v="";if(x==="hasOne")v="arrowhead=none, arrowtail=normal";else if(x==="hasMany")v="arrowhead=crow, arrowtail=none";else if(x==="belongsTo")v="arrowhead=normal, arrowtail=none";else if(x==="belongsToMany"||x==="manyToMany")v="arrowhead=crow, arrowtail=crow";a.push(` ${f} -> ${_} [label="${p}", ${v}];`)}}return a.push("}"),a.join(`
299
- `)}import{existsSync as Jt,mkdirSync as mi,readdirSync as fi,writeFileSync as pi}from"fs";import{dirname as Hn,join as Pt}from"path";import Ft from"process";function Zt(s){let a=s;while(a!==Hn(a)){if(Jt(Pt(a,"package.json")))return a;a=Hn(a)}return Ft.cwd()}async function Xn(s){if(!Jt(s))return console.log(`-- Seeders directory not found: ${s}`),[];let l=fi(s).sort((f,b)=>f.localeCompare(b)).filter((f)=>(f.endsWith(".ts")||f.endsWith(".js"))&&f!=="index.ts"&&f!=="index.js"),c=[];for(let f of l){let b=Pt(s,f);try{let p=await import(b),E=p.default||p[Object.keys(p)[0]];if(E&&typeof E==="function"){let x=new E;if(x&&typeof x.run==="function")c.push({name:f.replace(/\.(ts|js)$/,""),className:String(E.name||""),instance:x})}}catch(p){console.error(`-- Failed to load seeder ${f}:`,p)}}return c.sort((f,b)=>f.instance.order-b.instance.order),c}async function M(s={}){let a=Zt(Ft.cwd()),l=s.seedersDir||Pt(a,"database/seeders"),c=s.verbose??!0;if(c)console.log("-- Running seeders..."),console.log(`-- Seeders directory: ${l}`);let f=await Xn(l);if(f.length===0){console.log("-- No seeders found");return}if(c)console.log(`-- Found ${f.length} seeder(s)`);let b=i();for(let{name:p,instance:E}of f)try{if(c)console.log(`-- Seeding: ${p}`);if(await E.run(b),c)console.log(`-- \u2713 Seeded: ${p}`)}catch(x){throw console.error(`-- \u2717 Failed to seed ${p}:`,x),x}if(c)console.log("-- All seeders completed successfully")}async function H(s,a={}){let l=Zt(Ft.cwd()),c=Pt(l,"database/seeders"),f=a.verbose??!0;if(f)console.log(`-- Running seeder: ${s}`);let b=await Xn(c),p=b.find((x)=>x.className===s)??b.find((x)=>x.name===s);if(!p){let x=b.map((D)=>D.className||D.name).join(", ")||"none";throw console.error(`-- Seeder not found: ${s}. Available: ${x}`),Error(`Seeder not found: ${s}. Available: ${x}`)}let E=i();try{if(await p.instance.run(E),f)console.log(`-- \u2713 Seeder completed: ${s}`)}catch(x){throw console.error(`-- \u2717 Seeder failed: ${s}`,x),x}}async function we(s){let a=Zt(Ft.cwd()),l=Pt(a,"database/seeders");if(!Jt(l))mi(l,{recursive:!0}),console.log(`-- Created seeders directory: ${l}`);let f=`${s.replace(/Seeder$/i,"")}Seeder`,b=`${f}.ts`,p=Pt(l,b);if(Jt(p))throw console.error(`-- Seeder already exists: ${p}`),Error(`Seeder already exists: ${p}`);let E=`import type { QueryBuilder } from 'bun-query-builder'
296
+ \uD83D\uDCC7 Indexes (${x.indexes.length}):`);for(let _ of x.indexes){let v=Array.isArray(_.columns)?_.columns.join(", "):_.columns,k=_.unique?"(unique)":"";console.log(` \u2022 ${_.name||"unnamed"}: [${v}] ${k}`.trim())}}return console.log(),x}catch(c){throw console.error(`Error loading model "${s}":`,c.message),c}}async function Te(){let a=await i().ping();return console.log(a?"OK":"NOT READY"),a}import{readdirSync as hi,readFileSync as sr,statSync as Ti}from"fs";import{extname as ar,join as xi}from"path";async function U(s,a={}){let l=[];try{let c=Ti(s),f=[];if(c.isDirectory())f=hi(s).filter((x)=>ar(x)===".sql").map((x)=>xi(s,x));else if(c.isFile()&&ar(s)===".sql")f=[s];else return console.error("Path must be a .sql file or directory containing .sql files"),l;if(f.length===0)return console.log("No .sql files found"),l;if(a.verbose)console.log(`Analyzing ${f.length} SQL file(s)...
297
+ `);for(let E of f)try{let x=sr(E,"utf8").trim();if(!x){if(a.verbose)console.log(`\u2298 ${E}: empty file`);continue}if(a.verbose)console.log(`\uD83D\uDCC4 ${E}`),console.log(` Query: ${x.substring(0,60)}${x.length>60?"...":""}`);let D=await r`EXPLAIN ${r.unsafe(x)}`;if(l.push({file:E,query:x,plan:Array.isArray(D)?D:[D]}),a.verbose&&!a.json){if(console.log(" Plan:"),Array.isArray(D))for(let _ of D)if(typeof _==="string")console.log(` ${_}`);else if(_["QUERY PLAN"])console.log(` ${_["QUERY PLAN"]}`);else if(_.plan)console.log(` ${JSON.stringify(_.plan)}`);else console.log(` ${JSON.stringify(_)}`);console.log()}}catch(x){if(l.push({file:E,query:sr(E,"utf8").trim(),plan:[],error:x.message}),a.verbose)console.log(` \u2717 Error: ${x.message}
298
+ `)}let b=l.filter((E)=>!E.error).length,p=l.filter((E)=>E.error).length;if(a.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: ${b} successful, ${p} failed`);if(a.json)console.log(JSON.stringify(l,null,2));return l}catch(c){throw console.error("Error explaining queries:",c.message),c}}import{writeFileSync as Ei}from"fs";import{join as Di}from"path";import Ri from"process";async function V(s={}){let a=s.dir||Di(Ri.cwd(),"app/Models"),l=s.format||"mermaid";try{let c=await d({modelsDir:a});if(!c||Object.keys(c).length===0)return console.error("No models found"),"";let f="";if(l==="mermaid")f=Si(c);else if(l==="dot")f=Mi(c);else return console.error(`Unsupported format: ${l}`),"";if(s.output)Ei(s.output,f,"utf8"),console.log(`\u2713 Diagram written to: ${s.output}`);else console.log(f);return f}catch(c){throw console.error("Error generating diagram:",c.message),c}}function Si(s){let a=["erDiagram"];for(let[l,c]of Object.entries(s)){let f=c.table||`${l.toLowerCase()}s`,b=c.attributes||{};a.push(` ${f} {`);for(let[p,E]of Object.entries(b)){let x=E.type||"string",D=c.primaryKey===p?"PK":"",_=E.unique?"UK":"",v=[D,_].filter(Boolean).join(","),k=v?` "${v}"`:"";a.push(` ${x} ${p}${k}`)}a.push(" }")}for(let[l,c]of Object.entries(s)){let f=c.table||`${l.toLowerCase()}s`,b=c.relations||{};for(let[p,E]of Object.entries(b)){let{type:x,model:D}=E,_=s[D]?.table||`${D?.toLowerCase()}s`||"unknown",v="";if(x==="hasOne")v="||--||";else if(x==="hasMany")v="||--o{";else if(x==="belongsTo")v="}o--||";else if(x==="belongsToMany"||x==="manyToMany")v="}o--o{";else v="||--||";a.push(` ${f} ${v} ${_} : "${p}"`)}}return a.join(`
299
+ `)}function Mi(s){let a=["digraph schema {"," rankdir=LR;"," node [shape=record];",""];for(let[l,c]of Object.entries(s)){let f=c.table||`${l.toLowerCase()}s`,b=c.attributes||{},p=[];for(let[x,D]of Object.entries(b)){let _=D.type||"string",v=c.primaryKey===x?" (PK)":"",k=D.unique?" (UK)":"";p.push(`${x}: ${_}${v}${k}`)}let E=`${p.join("\\l")}\\l`;a.push(` ${f} [label="{${f}|${E}}"];`)}a.push("");for(let[l,c]of Object.entries(s)){let f=c.table||`${l.toLowerCase()}s`,b=c.relations||{};for(let[p,E]of Object.entries(b)){let{type:x,model:D}=E,_=s[D]?.table||`${D?.toLowerCase()}s`||"unknown",v="";if(x==="hasOne")v="arrowhead=none, arrowtail=normal";else if(x==="hasMany")v="arrowhead=crow, arrowtail=none";else if(x==="belongsTo")v="arrowhead=normal, arrowtail=none";else if(x==="belongsToMany"||x==="manyToMany")v="arrowhead=crow, arrowtail=crow";a.push(` ${f} -> ${_} [label="${p}", ${v}];`)}}return a.push("}"),a.join(`
300
+ `)}import{existsSync as Zt,mkdirSync as Ai,readdirSync as wi,writeFileSync as Ci}from"fs";import{dirname as or,join as Pt}from"path";import jt from"process";function en(s){let a=s;while(a!==or(a)){if(Zt(Pt(a,"package.json")))return a;a=or(a)}return jt.cwd()}async function lr(s){if(!Zt(s))return console.log(`-- Seeders directory not found: ${s}`),[];let l=wi(s).sort((f,b)=>f.localeCompare(b)).filter((f)=>(f.endsWith(".ts")||f.endsWith(".js"))&&f!=="index.ts"&&f!=="index.js"),c=[];for(let f of l){let b=Pt(s,f);try{let p=await import(b),E=p.default||p[Object.keys(p)[0]];if(E&&typeof E==="function"){let x=new E;if(x&&typeof x.run==="function")c.push({name:f.replace(/\.(ts|js)$/,""),className:String(E.name||""),instance:x})}}catch(p){console.error(`-- Failed to load seeder ${f}:`,p)}}return c.sort((f,b)=>f.instance.order-b.instance.order),c}async function M(s={}){let a=en(jt.cwd()),l=s.seedersDir||Pt(a,"database/seeders"),c=s.verbose??!0;if(c)console.log("-- Running seeders..."),console.log(`-- Seeders directory: ${l}`);let f=await lr(l);if(f.length===0){console.log("-- No seeders found");return}if(c)console.log(`-- Found ${f.length} seeder(s)`);let b=i();for(let{name:p,instance:E}of f)try{if(c)console.log(`-- Seeding: ${p}`);if(await E.run(b),c)console.log(`-- \u2713 Seeded: ${p}`)}catch(x){throw console.error(`-- \u2717 Failed to seed ${p}:`,x),x}if(c)console.log("-- All seeders completed successfully")}async function H(s,a={}){let l=en(jt.cwd()),c=Pt(l,"database/seeders"),f=a.verbose??!0;if(f)console.log(`-- Running seeder: ${s}`);let b=await lr(c),p=b.find((x)=>x.className===s)??b.find((x)=>x.name===s);if(!p){let x=b.map((D)=>D.className||D.name).join(", ")||"none";throw console.error(`-- Seeder not found: ${s}. Available: ${x}`),Error(`Seeder not found: ${s}. Available: ${x}`)}let E=i();try{if(await p.instance.run(E),f)console.log(`-- \u2713 Seeder completed: ${s}`)}catch(x){throw console.error(`-- \u2717 Seeder failed: ${s}`,x),x}}async function we(s){let a=en(jt.cwd()),l=Pt(a,"database/seeders");if(!Zt(l))Ai(l,{recursive:!0}),console.log(`-- Created seeders directory: ${l}`);let f=`${s.replace(/Seeder$/i,"")}Seeder`,b=`${f}.ts`,p=Pt(l,b);if(Zt(p))throw console.error(`-- Seeder already exists: ${p}`),Error(`Seeder already exists: ${p}`);let E=`import type { QueryBuilder } from 'bun-query-builder'
300
301
  import { Seeder } from 'bun-query-builder'
301
302
  import { faker } from '@stacksjs/ts-faker'
302
303
 
@@ -341,7 +342,7 @@ export default class ${f} extends Seeder {
341
342
  return 100
342
343
  }
343
344
  }
344
- `;pi(p,E),console.log(`-- \u2713 Created seeder: ${p}`)}async function Se(s={}){let a=Zt(Ft.cwd()),l=s.modelsDir||Pt(a,"app/Models"),c=s.seedersDir||Pt(a,"database/seeders"),f=s.verbose??!0;try{let{resetDatabase:b,generateMigration:p,executeMigration:E}=await import("./chunk-3rp9etrz.js");if(f)console.log("-- Refreshing database...");if(await b(l),f)console.log("-- Running migrations...");if(await p(l,{full:!0}),await E(),f)console.log("-- Running seeders...");if(await M({seedersDir:c,verbose:f}),f)console.log("-- \u2713 Database refreshed successfully")}catch(b){throw console.error("-- \u2717 Database refresh failed:",b),b}}function De(s,a,l={}){let c=d({modelsDir:s}),f=ve(c);if(e.debug)e.debug.captureText=!0;let b=i({schema:f}),p=b.selectFrom(a).limit(Number(l.limit||10)).toText?.()??"";return console.log(p||"[query]"),{sql:p,qb:b,schema:f}}async function Ee(s,a={}){let l=i(),c=a.params?JSON.parse(a.params):void 0,f=await l.unsafe(s,c);return console.log(JSON.stringify(f)),f}import{existsSync as gi}from"fs";import{dirname as Jn,join as Zn}from"path";import er from"process";function yi(s){let a=s;while(a!==Jn(a)){if(gi(Zn(a,"package.json")))return a;a=Jn(a)}return er.cwd()}async function Q(s){if(!s)s=Zn(yi(er.cwd()),"app/Models");let a=e.dialect||"postgres";console.log("-- Validating Schema"),console.log(`-- Models directory: ${s}`),console.log(`-- Dialect: ${a}`),console.log();let l=[];try{let c=await d({modelsDir:s}),f=G(c,{dialect:a}),b=i(),p=[];if(a==="sqlite")p=(await b.unsafe(`
345
+ `;Ci(p,E),console.log(`-- \u2713 Created seeder: ${p}`)}async function Se(s={}){let a=en(jt.cwd()),l=s.modelsDir||Pt(a,"app/Models"),c=s.seedersDir||Pt(a,"database/seeders"),f=s.verbose??!0;try{let{resetDatabase:b,generateMigration:p,executeMigration:E}=await import("./chunk-yzqfbfat.js");if(f)console.log("-- Refreshing database...");if(await b(l),f)console.log("-- Running migrations...");if(await p(l,{full:!0}),await E(),f)console.log("-- Running seeders...");if(await M({seedersDir:c,verbose:f}),f)console.log("-- \u2713 Database refreshed successfully")}catch(b){throw console.error("-- \u2717 Database refresh failed:",b),b}}function De(s,a,l={}){let c=d({modelsDir:s}),f=ve(c);if(e.debug)e.debug.captureText=!0;let b=i({schema:f}),p=b.selectFrom(a).limit(Number(l.limit||10)).toText?.()??"";return console.log(p||"[query]"),{sql:p,qb:b,schema:f}}async function Ee(s,a={}){let l=i(),c=a.params?JSON.parse(a.params):void 0,f=await l.unsafe(s,c);return console.log(JSON.stringify(f)),f}import{existsSync as Ni}from"fs";import{dirname as ur,join as cr}from"path";import dr from"process";function _i(s){let a=s;while(a!==ur(a)){if(Ni(cr(a,"package.json")))return a;a=ur(a)}return dr.cwd()}async function Q(s){if(!s)s=cr(_i(dr.cwd()),"app/Models");let a=e.dialect||"postgres";console.log("-- Validating Schema"),console.log(`-- Models directory: ${s}`),console.log(`-- Dialect: ${a}`),console.log();let l=[];try{let c=await d({modelsDir:s}),f=G(c,{dialect:a}),b=i(),p=[];if(a==="sqlite")p=(await b.unsafe(`
345
346
  SELECT name FROM sqlite_master
346
347
  WHERE type = 'table'
347
348
  AND name NOT LIKE 'sqlite_%'
@@ -367,18 +368,16 @@ export default class ${f} extends Seeder {
367
368
  FROM information_schema.columns
368
369
  WHERE table_name = ?
369
370
  AND table_schema = DATABASE()
370
- `,[D.table])).map((J)=>({name:J.column_name,type:J.data_type.toLowerCase()}));let v=_.map((Y)=>Y.name),k=D.columns.map((Y)=>Y.name);for(let Y of D.columns)if(!v.includes(Y.name))l.push({type:"missing_column",severity:"error",table:D.table,column:Y.name,expected:Y.type,message:`Column '${D.table}.${Y.name}' defined in model but not found in database`});for(let Y of _)if(!k.includes(Y.name))l.push({type:"extra_column",severity:"warning",table:D.table,column:Y.name,actual:Y.type,message:`Column '${D.table}.${Y.name}' exists in database but not defined in model`});for(let Y of D.columns){let J=_.find((z)=>z.name===Y.name);if(J){let z=(Pe)=>Pe.toLowerCase().replace(/\(.*\)/,"").replace("integer","int").replace("varchar","text").replace("character varying","text").trim(),Me=z(Y.type),Ke=z(J.type);if(Me!==Ke)l.push({type:"type_mismatch",severity:"warning",table:D.table,column:Y.name,expected:Y.type,actual:J.type,message:`Column '${D.table}.${Y.name}' type mismatch: expected '${Y.type}', found '${J.type}'`})}}}let x=l.filter((D)=>D.severity==="error").length===0;if(x&&l.length===0)console.log("\u2713 Schema is valid - no issues found"),console.log();else{console.log(`-- Found ${l.length} issue(s)`),console.log();let D=l.filter((v)=>v.severity==="error"),_=l.filter((v)=>v.severity==="warning");if(D.length>0){console.log(`\u2717 Errors (${D.length}):`);for(let v of D)console.log(` - ${v.message}`);console.log()}if(_.length>0){console.log(`\u26A0 Warnings (${_.length}):`);for(let v of _)console.log(` - ${v.message}`);console.log()}if(!x)console.log("-- Recommendation: Run migrations to sync the database schema"),console.log("-- qb migrate ./app/Models --apply")}return{valid:x,issues:l}}catch(c){throw console.error("-- Schema validation failed:",c),c}}async function $e(s){return Q(s)}async function xe(s={}){let a=Number(s.attempts||10),l=Number(s.delay||100),c=i();try{return await c.waitForReady({attempts:a,delayMs:l}),console.log("READY"),!0}catch{throw console.error("NOT READY"),Error("Database not ready")}}class S{driver;client;tableName;indexName;entityType;keyConditions=[];filterConditions=[];projectionAttrs=[];limitValue;scanForward=!0;consistentReadValue=!1;startKey;constructor(s){this.driver=u(s.config),this.client=s.client,this.tableName=s.config.tableName??""}table(s){return this.tableName=s,this}index(s){return this.indexName=s,this}entity(s){return this.entityType=s,this}whereKey(s,a,l){return this.keyConditions.push({attribute:s,operator:a,value:l}),this}wherePartitionKey(s,a){return this.whereKey(s,"=",a)}whereSortKey(s,a){return this.whereKey(s,"=",a)}whereSortKeyBeginsWith(s,a){return this.keyConditions.push({attribute:s,operator:"begins_with",value:a}),this}whereSortKeyBetween(s,a,l){return this.keyConditions.push({attribute:s,operator:"BETWEEN",values:[a,l]}),this}where(s,a,l){return this.filterConditions.push({attribute:s,operator:a,value:l}),this}whereEquals(s,a){return this.where(s,"=",a)}whereLessThan(s,a){return this.where(s,"<",a)}whereLessThanOrEqual(s,a){return this.where(s,"<=",a)}whereGreaterThan(s,a){return this.where(s,">",a)}whereGreaterThanOrEqual(s,a){return this.where(s,">=",a)}whereBetween(s,a,l){return this.filterConditions.push({attribute:s,operator:"BETWEEN",values:[a,l]}),this}whereBeginsWith(s,a){return this.filterConditions.push({attribute:s,operator:"begins_with",value:a}),this}whereContains(s,a){return this.where(s,"contains",a)}whereExists(s){return this.where(s,"attribute_exists")}whereNotExists(s){return this.where(s,"attribute_not_exists")}whereIn(s,a){return this.filterConditions.push({attribute:s,operator:"IN",values:a}),this}select(...s){return this.projectionAttrs.push(...s),this}limit(s){return this.limitValue=s,this}ascending(){return this.scanForward=!0,this}descending(){return this.scanForward=!1,this}consistentRead(s=!0){return this.consistentReadValue=s,this}startFrom(s){return this.startKey=s,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 s=this.buildQueryParams(),a={TableName:s.tableName,ExpressionAttributeNames:{},ExpressionAttributeValues:{}};if(s.indexName)a.IndexName=s.indexName;let l=0;if(s.keyConditions.length>0){let c=[];for(let f of s.keyConditions){let b=`#key${l}`;if(a.ExpressionAttributeNames[b]=f.attribute,f.operator==="begins_with"){let p=`:keyval${l}`;a.ExpressionAttributeValues[p]=this.driver.marshall({v:f.value}).v,c.push(`begins_with(${b}, ${p})`)}else if(f.operator==="BETWEEN"){let p=`:keyval${l}a`,E=`:keyval${l}b`;a.ExpressionAttributeValues[p]=this.driver.marshall({v:f.values?.[0]}).v,a.ExpressionAttributeValues[E]=this.driver.marshall({v:f.values?.[1]}).v,c.push(`${b} BETWEEN ${p} AND ${E}`)}else{let p=`:keyval${l}`;a.ExpressionAttributeValues[p]=this.driver.marshall({v:f.value}).v,c.push(`${b} ${f.operator} ${p}`)}l++}a.KeyConditionExpression=c.join(" AND ")}if(s.filterConditions&&s.filterConditions.length>0){let c=[];for(let f of s.filterConditions){let b=`#flt${l}`;if(a.ExpressionAttributeNames[b]=f.attribute,f.operator==="attribute_exists")c.push(`attribute_exists(${b})`);else if(f.operator==="attribute_not_exists")c.push(`attribute_not_exists(${b})`);else if(f.operator==="begins_with"||f.operator==="contains"){let p=`:fltval${l}`;a.ExpressionAttributeValues[p]=this.driver.marshall({v:f.value}).v,c.push(`${f.operator}(${b}, ${p})`)}else if(f.operator==="BETWEEN"){let p=`:fltval${l}a`,E=`:fltval${l}b`;a.ExpressionAttributeValues[p]=this.driver.marshall({v:f.values?.[0]}).v,a.ExpressionAttributeValues[E]=this.driver.marshall({v:f.values?.[1]}).v,c.push(`${b} BETWEEN ${p} AND ${E}`)}else if(f.operator==="IN"){let p=(f.values??[]).map((E,x)=>`:fltval${l}_${x}`);f.values?.forEach((E,x)=>{a.ExpressionAttributeValues[`:fltval${l}_${x}`]=this.driver.marshall({v:E}).v}),c.push(`${b} IN (${p.join(", ")})`)}else{let p=`:fltval${l}`;a.ExpressionAttributeValues[p]=this.driver.marshall({v:f.value}).v,c.push(`${b} ${f.operator} ${p}`)}l++}a.FilterExpression=c.join(" AND ")}if(s.projectionAttributes&&s.projectionAttributes.length>0){let c=[];for(let f of s.projectionAttributes){let b=`#proj${l}`;a.ExpressionAttributeNames[b]=f,c.push(b),l++}a.ProjectionExpression=c.join(", ")}if(s.limit!==void 0)a.Limit=s.limit;if(s.scanIndexForward!==void 0)a.ScanIndexForward=s.scanIndexForward;if(s.exclusiveStartKey)a.ExclusiveStartKey=this.driver.marshall(s.exclusiveStartKey);if(s.consistentRead)a.ConsistentRead=s.consistentRead;if(Object.keys(a.ExpressionAttributeNames).length===0)delete a.ExpressionAttributeNames;if(Object.keys(a.ExpressionAttributeValues).length===0)delete a.ExpressionAttributeValues;return a}toScanRequest(){let s=this.buildScanParams(),a={TableName:s.tableName};if(s.indexName)a.IndexName=s.indexName;if(s.filterConditions&&s.filterConditions.length>0){let{expression:l,expressionAttributeNames:c,expressionAttributeValues:f}=this.driver.buildFilterExpression(s.filterConditions);a.FilterExpression=l,a.ExpressionAttributeNames=c,a.ExpressionAttributeValues=f}if(s.projectionAttributes&&s.projectionAttributes.length>0){let{expression:l,expressionAttributeNames:c}=this.driver.buildProjectionExpression(s.projectionAttributes);a.ProjectionExpression=l,a.ExpressionAttributeNames={...a.ExpressionAttributeNames,...c}}if(s.limit!==void 0)a.Limit=s.limit;if(s.exclusiveStartKey)a.ExclusiveStartKey=this.driver.marshall(s.exclusiveStartKey);if(s.consistentRead)a.ConsistentRead=s.consistentRead;return a}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 s=this.toQueryRequest(),a=await this.client.query(s);return{items:a.Items?.map((l)=>this.driver.unmarshall(l)),count:a.Count,scannedCount:a.ScannedCount,lastEvaluatedKey:a.LastEvaluatedKey?this.driver.unmarshall(a.LastEvaluatedKey):void 0,consumedCapacity:a.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 s=this.toScanRequest(),a=await this.client.scan(s);return{items:a.Items?.map((l)=>this.driver.unmarshall(l)),count:a.Count,scannedCount:a.ScannedCount,lastEvaluatedKey:a.LastEvaluatedKey?this.driver.unmarshall(a.LastEvaluatedKey):void 0,consumedCapacity:a.ConsumedCapacity}}async getAll(){let s=[],a;do{if(a)this.startFrom(a);let l=this.keyConditions.length>0?await this.query():await this.scan();if(l.items)s.push(...l.items);a=l.lastEvaluatedKey}while(a);return s}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 s=this.keyConditions.length>0?this.toQueryRequest():this.toScanRequest();return s.Select="COUNT",(this.keyConditions.length>0?await this.client.query(s):await this.client.scan(s)).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 g{driver;client;tableName;itemData={};keyData={};updateExpressions={};conditionExpr;returnValuesOption="NONE";constructor(s){this.driver=u(s.config),this.client=s.client,this.tableName=s.config.tableName??""}table(s){return this.tableName=s,this}key(s){return this.keyData=s,this}item(s){return this.itemData=s,this}set(s,a){if(!this.updateExpressions.set)this.updateExpressions.set={};return this.updateExpressions.set[s]=a,this}setMany(s){if(!this.updateExpressions.set)this.updateExpressions.set={};return Object.assign(this.updateExpressions.set,s),this}remove(s){if(!this.updateExpressions.remove)this.updateExpressions.remove=[];return this.updateExpressions.remove.push(s),this}add(s,a){if(!this.updateExpressions.add)this.updateExpressions.add={};return this.updateExpressions.add[s]=a,this}deleteFromSet(s,a){if(!this.updateExpressions.delete)this.updateExpressions.delete={};return this.updateExpressions.delete[s]=a,this}condition(s){return this.conditionExpr=s,this}ifNotExists(s="pk"){return this.conditionExpr=`attribute_not_exists(${s})`,this}ifExists(s="pk"){return this.conditionExpr=`attribute_exists(${s})`,this}returnOld(){return this.returnValuesOption="ALL_OLD",this}returnNew(){return this.returnValuesOption="ALL_NEW",this}toPutRequest(){let s={TableName:this.tableName,Item:this.driver.marshall(this.itemData)};if(this.conditionExpr)s.ConditionExpression=this.conditionExpr;if(this.returnValuesOption!=="NONE")s.ReturnValues=this.returnValuesOption;return s}toUpdateRequest(){let s={TableName:this.tableName,Key:this.driver.marshall(this.keyData)},{expression:a,expressionAttributeNames:l,expressionAttributeValues:c}=this.driver.buildUpdateExpression(this.updateExpressions);if(a)s.UpdateExpression=a,s.ExpressionAttributeNames=l,s.ExpressionAttributeValues=c;if(this.conditionExpr)s.ConditionExpression=this.conditionExpr;if(this.returnValuesOption!=="NONE")s.ReturnValues=this.returnValuesOption;return s}toDeleteRequest(){let s={TableName:this.tableName,Key:this.driver.marshall(this.keyData)};if(this.conditionExpr)s.ConditionExpression=this.conditionExpr;if(this.returnValuesOption!=="NONE")s.ReturnValues=this.returnValuesOption;return s}toGetRequest(){return{TableName:this.tableName,Key:this.driver.marshall(this.keyData)}}async put(){if(!this.client)throw Error("DynamoDB client not provided");let s=this.toPutRequest(),a=await this.client.putItem(s);if(a.Attributes)return this.driver.unmarshall(a.Attributes);return}async update(){if(!this.client)throw Error("DynamoDB client not provided");let s=this.toUpdateRequest(),a=await this.client.updateItem(s);if(a.Attributes)return this.driver.unmarshall(a.Attributes);return}async delete(){if(!this.client)throw Error("DynamoDB client not provided");let s=this.toDeleteRequest(),a=await this.client.deleteItem(s);if(a.Attributes)return this.driver.unmarshall(a.Attributes);return}async get(){if(!this.client)throw Error("DynamoDB client not provided");let s=this.toGetRequest(),a=await this.client.getItem(s);if(a.Item)return this.driver.unmarshall(a.Item);return}}function yn(s){return new S(s)}function bn(s){return new g(s)}function Tn(s){let a=u(s.config);return{query:()=>new S(s),item:()=>new g(s),driver:a,registerEntity:(l)=>a.registerEntity(l),buildKey:(l,c)=>a.buildPrimaryKey(l,c)}}class lt{config;entities=new Map;pkAttribute;skAttribute;typeAttribute;constructor(s){this.config=s,this.pkAttribute=s.pkAttribute??"pk",this.skAttribute=s.skAttribute??"sk",this.typeAttribute=s.typeAttribute??"_type";for(let a of s.entities)this.entities.set(a.name,a)}getEntity(s){return this.entities.get(s)}registerEntity(s){this.entities.set(s.name,s)}buildKey(s,a){let l=this.entities.get(s);if(!l)throw Error(`Entity not found: ${s}`);let c=this.interpolatePattern(l.pkPattern,a),f=this.interpolatePattern(l.skPattern,a);return{pk:c,sk:f}}buildGSIKey(s,a,l){let c=this.entities.get(s);if(!c)throw Error(`Entity not found: ${s}`);let f=c.indexes?.find((E)=>E.name===a);if(!f)throw Error(`GSI not found: ${a} for entity ${s}`);let b=this.interpolatePattern(f.pkPattern,l),p=f.skPattern?this.interpolatePattern(f.skPattern,l):void 0;return{pk:b,sk:p}}createItem(s,a){let{pk:l,sk:c}=this.buildKey(s,a),f=this.entities.get(s),b={[this.pkAttribute]:l,[this.skAttribute]:c,[this.typeAttribute]:s,...a};if(f.indexes)for(let p of f.indexes){let E=this.buildGSIKey(s,p.name,a),x=this.config.indexes?.find((D)=>D.name===p.name);if(x){if(b[x.pkAttribute]=E.pk,x.skAttribute&&E.sk)b[x.skAttribute]=E.sk}}return b}parseEntityType(s){if(s[this.typeAttribute])return s[this.typeAttribute];let a=s[this.pkAttribute];if(!a)return;for(let[l,c]of this.entities){let f=c.pkPattern.split("${")[0];if(a.startsWith(f))return l}return}parseItem(s){let a=this.parseEntityType(s);if(!a)return;let{[this.pkAttribute]:l,[this.skAttribute]:c,[this.typeAttribute]:f,...b}=s;return{type:a,data:b}}getEntityPrefix(s){let a=this.entities.get(s);if(!a)throw Error(`Entity not found: ${s}`);return a.pkPattern.split("${")[0]}generateTableDefinition(){let s=[{name:this.pkAttribute,type:"S"},{name:this.skAttribute,type:"S"}],a=[];if(this.config.indexes)for(let l of this.config.indexes){if(!s.find((c)=>c.name===l.pkAttribute))s.push({name:l.pkAttribute,type:"S"});if(l.skAttribute&&!s.find((c)=>c.name===l.skAttribute))s.push({name:l.skAttribute,type:"S"});a.push({indexName:l.name,keySchema:{partitionKey:l.pkAttribute,sortKey:l.skAttribute},projection:{type:"ALL"}})}return{tableName:this.config.tableName,keySchema:{partitionKey:this.pkAttribute,sortKey:this.skAttribute},attributeDefinitions:s,globalSecondaryIndexes:a.length>0?a:void 0,billingMode:"PAY_PER_REQUEST"}}interpolatePattern(s,a){return s.replace(/\$\{(\w+)\}/g,(l,c)=>{if(!(c in a))throw Error(`Missing value for pattern key: ${c}`);return String(a[c])})}}class ct{manager;entityName;options;constructor(s,a,l){this.manager=s,this.entityName=a,this.options=l}async create(s){let a=this.manager.createItem(this.entityName,s),l=new g(this.options).table(this.options.config.tableName).item(a).ifNotExists("pk");if(this.options.client)await l.put();return s}async get(s){let{pk:a,sk:l}=this.manager.buildKey(this.entityName,s),c=new g(this.options).table(this.options.config.tableName).key({pk:a,sk:l});if(!this.options.client)throw Error("DynamoDB client not provided");let f=await c.get();if(!f)return;return this.manager.parseItem(f)?.data}async update(s,a){let{pk:l,sk:c}=this.manager.buildKey(this.entityName,s),f=new g(this.options).table(this.options.config.tableName).key({pk:l,sk:c}).setMany(a).ifExists("pk").returnNew();if(!this.options.client)throw Error("DynamoDB client not provided");let b=await f.update();if(!b)return;return this.manager.parseItem(b)?.data}async delete(s){let{pk:a,sk:l}=this.manager.buildKey(this.entityName,s),c=new g(this.options).table(this.options.config.tableName).key({pk:a,sk:l});if(!this.options.client)throw Error("DynamoDB client not provided");return await c.delete(),!0}query(){return new ut(this.manager,this.entityName,this.options)}async findAll(){let s=this.manager.typeAttribute??"_type",a=new S(this.options).table(this.options.config.tableName).whereEquals(s,this.entityName);if(!this.options.client)throw Error("DynamoDB client not provided");return(await a.getAll()).map((c)=>this.manager.parseItem(c)).filter((c)=>c!==void 0).map((c)=>c.data)}}class ut{manager;entityName;options;builder;pkValue;skConditions=[];constructor(s,a,l){this.manager=s,this.entityName=a,this.options=l,this.builder=new S(l).table(l.config.tableName)}wherePartitionKey(s){let{pk:a}=this.manager.buildKey(this.entityName,s);this.pkValue=a;let l=this.manager.pkAttribute??"pk";return this.builder.wherePartitionKey(l,a),this}whereSortKey(s){let{sk:a}=this.manager.buildKey(this.entityName,s),l=this.manager.skAttribute??"sk";return this.builder.whereSortKey(l,a),this}whereSortKeyBeginsWith(s){let a=this.manager.skAttribute??"sk";return this.builder.whereSortKeyBeginsWith(a,s),this}useIndex(s,a){let l=this.manager.buildGSIKey(this.entityName,s,a),c=this.manager.config.indexes?.find((f)=>f.name===s);if(!c)throw Error(`GSI configuration not found: ${s}`);return this.builder.index(s),this.builder.wherePartitionKey(c.pkAttribute,l.pk),this}where(s,a,l){return this.builder.where(s,a,l),this}select(...s){return this.builder.select(...s),this}limit(s){return this.builder.limit(s),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((a)=>this.manager.parseItem(a)).filter((a)=>a!==void 0).map((a)=>a.data)}async first(){return this.limit(1),(await this.execute())[0]}}function dt(s){return new lt(s)}function ft(s,a,l){return new ct(s,a,l)}var wn={simpleEntity:(s,a="id")=>({name:s,pkPattern:`${s.toUpperCase()}#\${${a}}`,skPattern:"METADATA",keyFields:[a]}),oneToMany:(s,a,l="id",c="id")=>({parent:{name:s,pkPattern:`${s.toUpperCase()}#\${${l}}`,skPattern:"METADATA",keyFields:[l]},child:{name:a,pkPattern:`${s.toUpperCase()}#\${${l}}`,skPattern:`${a.toUpperCase()}#\${${c}}`,keyFields:[l,c]}}),manyToMany:(s,a,l="id",c="relatedId")=>({entity:{name:s,pkPattern:`${s.toUpperCase()}#\${${l}}`,skPattern:"METADATA",keyFields:[l]},relation:{name:a,pkPattern:`${s.toUpperCase()}#\${${l}}`,skPattern:`${a.toUpperCase()}#\${${c}}`,keyFields:[l,c],indexes:[{name:"GSI1",pkPattern:`${s.toUpperCase()}#\${${c}}`,skPattern:`${a.toUpperCase()}#\${${l}}`}]}}),hierarchical:(s,a="rootId",l="path")=>({name:s,pkPattern:`ROOT#\${${a}}`,skPattern:`PATH#\${${l}}`,keyFields:[a,l]})};function mt(s,a){let l={};for(let[c,f]of Object.entries(s))if(f)l[c]=f.replace(/\{([^}]+)\}/g,(b,p)=>a[p]!==void 0?String(a[p]):`{${p}}`);return l}async function Wt(s){return{models:new Map}}function Sn(s){return s}function Dn(s){return s}function En(s){return s}function $n(s){return s}class ht{config;driver;singleTableManager;models=new Map;queryBuilderOptions;constructor(s){this.config={pkAttribute:"pk",skAttribute:"sk",entityTypeAttribute:"_et",keyDelimiter:"#",...s};let a={region:s.region,endpoint:s.endpoint,credentials:s.credentials,tableName:s.tableName};this.driver=u(a);let l={tableName:s.tableName,pkAttribute:this.config.pkAttribute,skAttribute:this.config.skAttribute,typeAttribute:this.config.entityTypeAttribute,indexes:this.buildGSIConfig(),entities:[]};this.singleTableManager=dt(l),this.queryBuilderOptions={config:a}}setClient(s){return this.queryBuilderOptions.client=s,this}async discoverModels(){if(!this.config.modelsPath)throw Error("modelsPath must be configured to use discoverModels()");let s=await Wt({queryBuilder:{modelsPath:this.config.modelsPath},singleTable:{pkAttribute:this.config.pkAttribute,skAttribute:this.config.skAttribute,typeAttribute:this.config.entityTypeAttribute,delimiter:this.config.keyDelimiter}}),a=[];for(let[,l]of s.models)this.registerParsedModel(l),a.push(l);return a}registerModel(s){let a=this.parseWithTooling(s);return this.registerParsedModel(a)}registerParsedModel(s){this.models.set(s.name,s);let a=this.toSingleTableEntity(s);this.singleTableManager.registerEntity(a);let l=this.toEntityMapping(s);return this.driver.registerEntity(l),s}registerModels(s){return s.map((a)=>this.registerModel(a))}getModel(s){return this.models.get(s)}getAllModels(){return Array.from(this.models.values())}repository(s){if(!this.models.get(s))throw Error(`Model not found: ${s}`);return ft(this.singleTableManager,s,this.queryBuilderOptions)}query(s){if(!this.models.get(s))throw Error(`Model not found: ${s}`);return new S(this.queryBuilderOptions).table(this.config.tableName).entity(s)}item(s){if(!this.models.get(s))throw Error(`Model not found: ${s}`);return new g(this.queryBuilderOptions).table(this.config.tableName)}buildKey(s,a){let l=this.models.get(s);if(!l)throw Error(`Model not found: ${s}`);let c=mt(l.keyPatterns,a);return{pk:c.pk,sk:c.sk}}createItem(s,a){let l=this.models.get(s);if(!l)throw Error(`Model not found: ${s}`);let c=mt(l.keyPatterns,a),{pk:f,sk:b}=c,p={[this.config.pkAttribute]:f,[this.config.skAttribute]:b,[this.config.entityTypeAttribute]:l.name,...a};if(l.hasTimestamps){let E=new Date().toISOString();if(!p.createdAt)p.createdAt=E;p.updatedAt=E}if(l.hasVersioning){if(!p._v)p._v=1}return p}parseItem(s){let a=s[this.config.entityTypeAttribute];if(!a)return;let{[this.config.pkAttribute]:l,[this.config.skAttribute]:c,[this.config.entityTypeAttribute]:f,...b}=s;return{type:a,data:b}}getDriver(){return this.driver}getSingleTableManager(){return this.singleTableManager}generateTableDefinition(){return this.singleTableManager.generateTableDefinition()}generateAccessPatterns(s){let a=this.models.get(s);if(!a)throw Error(`Model not found: ${s}`);return a.accessPatterns}parseWithTooling(s){let a=s.name.toUpperCase(),l=s.primaryKey??"id",c=this.config.keyDelimiter,f=this.parseAttributes(s),b=this.parseRelationships(s,l),p={pk:`${a}${c}{${l}}`,sk:`${a}${c}{${l}}`,...this.deriveGSIKeyPatterns(a,l,c,b)},E=this.deriveAccessPatterns(s.name,a,l,b);return{name:s.name,entityType:a,primaryKey:l,attributes:f,relationships:b,keyPatterns:p,accessPatterns:E,traits:s.traits??{},hasTimestamps:s.traits?.useTimestamps??!1,hasSoftDeletes:s.traits?.useSoftDeletes??!1,hasUuid:s.traits?.useUuid??!1,hasTtl:s.traits?.useTtl??!1,hasVersioning:s.traits?.useVersioning??!1,original:s}}parseAttributes(s){let a=[];if(a.push({name:s.primaryKey??"id",fillable:!1,required:!0,nullable:!1,unique:!0,hidden:!1,dynamoDbType:"S"}),s.attributes)for(let[l,c]of Object.entries(s.attributes))a.push({name:l,fillable:c.fillable??!0,required:c.required??!1,nullable:c.nullable??!0,unique:c.unique??!1,hidden:c.hidden??!1,defaultValue:c.default,cast:c.cast,dynamoDbType:this.inferDynamoDBType(c)});if(s.traits?.useTimestamps)a.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(s.traits?.useSoftDeletes)a.push({name:"deletedAt",fillable:!1,required:!1,nullable:!0,unique:!1,hidden:!1,dynamoDbType:"S"});return a}inferDynamoDBType(s){if(s.cast){let a=s.cast.toLowerCase();if(["integer","int","float","double","decimal","number"].includes(a))return"N";if(["boolean","bool"].includes(a))return"BOOL";if(["array","list"].includes(a))return"L";if(["object","json","map"].includes(a))return"M"}if(s.validation?.rule){let a=String(s.validation.rule);if(a.includes("integer")||a.includes("numeric")||a.includes("number"))return"N";if(a.includes("boolean"))return"BOOL";if(a.includes("array"))return"L";if(a.includes("object"))return"M"}return"S"}parseRelationships(s,a){let l=[];if(s.hasOne)for(let c of s.hasOne)l.push({type:"hasOne",relatedModel:c,foreignKey:`${s.name.toLowerCase()}Id`,localKey:a,requiresGsi:!0});if(s.hasMany)for(let c of s.hasMany)l.push({type:"hasMany",relatedModel:c,foreignKey:`${s.name.toLowerCase()}Id`,localKey:a,requiresGsi:!1});if(s.belongsTo)for(let c of s.belongsTo)l.push({type:"belongsTo",relatedModel:c,foreignKey:`${c.toLowerCase()}Id`,localKey:a,requiresGsi:!0});if(s.belongsToMany){let c=Array.isArray(s.belongsToMany)?s.belongsToMany:Object.values(s.belongsToMany);for(let f of c){let b=typeof f==="string"?f:f?.model;if(!b)continue;let p=[s.name,b].sort();l.push({type:"belongsToMany",relatedModel:b,foreignKey:`${s.name.toLowerCase()}Id`,localKey:a,pivotEntity:p.join(""),requiresGsi:!0})}}return l}deriveGSIKeyPatterns(s,a,l,c){let f={},b=1;for(let p of c)if(p.requiresGsi&&b<=5)f[`gsi${b}pk`]=`${p.relatedModel.toUpperCase()}${l}{${p.foreignKey}}`,f[`gsi${b}sk`]=`${s}${l}{${a}}`,p.gsiIndex=b,b++;return f}deriveAccessPatterns(s,a,l,c){let f=[];f.push({name:`Get ${s} by ID`,description:`Retrieve a single ${s} by its primary key`,entityType:a,operation:"get",index:"main",keyCondition:"pk = :pk AND sk = :sk",examplePk:`${a}#123`,exampleSk:`${a}#123`,efficient:!0}),f.push({name:`List all ${s}s`,description:`Scan all ${s} entities`,entityType:a,operation:"scan",index:"scan",keyCondition:"_et = :entityType",examplePk:a,efficient:!1});for(let b of c){if(b.type==="hasMany")f.push({name:`Get ${b.relatedModel}s for ${s}`,description:`Query ${b.relatedModel}s related to a ${s}`,entityType:a,operation:"query",index:"main",keyCondition:"pk = :pk AND begins_with(sk, :skPrefix)",examplePk:`${a}#123`,exampleSk:`${b.relatedModel.toUpperCase()}#`,efficient:!0});if(b.gsiIndex){let p=`GSI${b.gsiIndex}`;f.push({name:`Get ${s}s by ${b.relatedModel}`,description:`Query ${s}s by their related ${b.relatedModel}`,entityType:a,operation:"query",index:p,keyCondition:`gsi${b.gsiIndex}pk = :pk`,examplePk:`${b.relatedModel.toUpperCase()}#123`,efficient:!0})}}return f}toSingleTableEntity(s){let a=this.extractKeyFields(s.keyPatterns.pk);return{name:s.name,pkPattern:s.keyPatterns.pk,skPattern:s.keyPatterns.sk,keyFields:a,indexes:this.extractGSIPatterns(s.keyPatterns)}}extractKeyFields(s){let a=s.match(/\{([^}]+)\}/g);if(!a)return[];return a.map((l)=>l.slice(1,-1))}extractGSIPatterns(s){let a=[];for(let l=1;l<=5;l++){let c=`gsi${l}pk`,f=`gsi${l}sk`;if(s[c])a.push({name:`GSI${l}`,pkPattern:s[c],skPattern:s[f]})}return a.length>0?a:void 0}toEntityMapping(s){return{entityType:s.name,pkPattern:s.keyPatterns.pk,skPattern:s.keyPatterns.sk}}buildGSIConfig(){let s=this.config.gsiConfig??{},a=[];if(s.gsi1pk)a.push({name:"GSI1",pkAttribute:s.gsi1pk,skAttribute:s.gsi1sk});if(s.gsi2pk)a.push({name:"GSI2",pkAttribute:s.gsi2pk,skAttribute:s.gsi2sk});if(s.gsi3pk)a.push({name:"GSI3",pkAttribute:s.gsi3pk,skAttribute:s.gsi3sk});return a}}function xn(s){return new ht(s)}function vn(s){return s.accessPatterns}function kn(s,a="#"){let l=s.name.toUpperCase(),c=s.primaryKey??"id";return{name:s.name,pkPattern:`${l}${a}\${${c}}`,skPattern:`${l}${a}\${${c}}`}}function ve(s){let a={};for(let l of Object.keys(s)){let c=s[l],f=c.definition??c.getDefinition?.()??c,b=T(f),p=f.attributes??{},E={};for(let x of Object.keys(p))E[x]=void 0;a[b]={columns:E,primaryKey:f.primaryKey??"id"}}return a}import{readdirSync as bi}from"fs";import{basename as tr,extname as nr,isAbsolute as hi,join as rr}from"path";import Ti from"process";var xi=new Set([".ts",".mts",".cts",".js",".mjs",".cjs"]);function Ei(s){let a=nr(s);if(!xi.has(a))return!1;let l=tr(s,a);if(l.startsWith("_")||l==="index")return!1;return!l.endsWith(".d")}function Di(s){if(!s||typeof s!=="object")return!1;let a=s;return typeof a.name==="string"||typeof a.table==="string"}function ir(s){let a=[],l=bi(s,{withFileTypes:!0}).sort((c,f)=>c.name.localeCompare(f.name));for(let c of l){let f=rr(s,c.name);if(c.isDirectory()){a.push(...ir(f));continue}if(Ei(c.name))a.push(f)}return a}async function d(s){let a=s.cwd??Ti.cwd(),l=hi(s.modelsDir)?s.modelsDir:rr(a,s.modelsDir),c={};for(let f of ir(l)){let b=`?t=${Date.now()}-${Math.random().toString(36).slice(2)}`,p=await import(`${f}${b}`),E=p.default??p,x=E.definition??E.getDefinition?.()??E;if(!Di(x))continue;let D=x.name??tr(f,nr(f));c[D]={...x,name:D}}return c}function gt(s){let a={},l={},c={},f={},b={},p={};for(let E of Object.keys(s)){let x=s[E],D=x.definition??x.getDefinition?.()??x,_=T(D);a[E]=_,l[_]=E,c[_]=D.primaryKey??"id";let v=[];for(let[Me,Ke]of Object.entries(D.attributes??{}))if(/^(?:datetime|timestamp|timestamptz|date)$/i.test(String(Ke?.type??"")))v.push(Me);let k=D.traits??{};if(k.useTimestamps??k.timestampable)v.push("created_at","updated_at");if(v.length>0)p[_]=[...new Set(v)];let Y=(Me)=>{if(!Me)return{};let Ke={};if(Array.isArray(Me)){for(let Pe of Me){let Ye=Be(Pe);if(Ye)Ke[Ye.model]=Ye.model}return Ke}if(typeof Me==="object"){for(let[Pe,Ye]of Object.entries(Me)){let Ae=Be(Ye);if(Ae)Ke[Pe]=Ae.model}return Ke}return{}},J=(Me)=>{if(!Me)return{};if(Array.isArray(Me)){let Ke={};for(let Pe of Me)if(typeof Pe==="string")Ke[Pe]=Pe;else if(Pe&&typeof Pe==="object"&&typeof Pe.model==="string")Ke[Pe.model]=Pe;return Ke}return Me},z=(Me)=>{if(!Me)return{};return Me};if(f[_]={hasOne:Y(D.hasOne),hasMany:Y(D.hasMany),belongsTo:Y(D.belongsTo),belongsToMany:J(D.belongsToMany),hasOneThrough:z(D.hasOneThrough),hasManyThrough:z(D.hasManyThrough),morphOne:Y(D.morphOne),morphMany:Y(D.morphMany),morphTo:D.morphTo,morphToMany:Y(D.morphToMany),morphedByMany:Y(D.morphedByMany)},D.scopes&&typeof D.scopes==="object"){b[_]={};for(let Me of Object.keys(D.scopes)){let Ke=D.scopes[Me];if(typeof Ke==="function")b[_][Me]=Ke}}}return{modelToTable:a,tableToModel:l,primaryKeys:c,relations:f,scopes:b,models:s,temporalColumns:p}}import{existsSync as hn,mkdirSync as Ri,readdirSync as Si,readFileSync as Mi,writeFileSync as Ai}from"fs";import{dirname as sr,join as en}from"path";import cr from"process";function xt(s){if(e.verbose)console.log(s)}function kt(s){return s.replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").toLowerCase()}function mn(s){return m(e.relations?.singularizeStrategy)(s)}var Yt=0,$t=0,It=0,tn=!0,nn=[],Lt=null;function pt(){return[...nn]}function wi(s){let a=s;while(a!==sr(a)){if(hn(en(a,"package.json")))return a;a=sr(a)}return cr.cwd()}function Ci(){let s=wi(cr.cwd()),a=_t(s,e.migrationDir);if(!hn(a))Ri(a,{recursive:!0}),xt(`-- Created SQL directory: ${a}`);return a}var yt="-- qb:generated";function bt(s){return s.trimStart().startsWith(yt)}function Tt(s){return s.split(`
371
+ `,[D.table])).map((J)=>({name:J.column_name,type:J.data_type.toLowerCase()}));let v=_.map((Y)=>Y.name),k=D.columns.map((Y)=>Y.name);for(let Y of D.columns)if(!v.includes(Y.name))l.push({type:"missing_column",severity:"error",table:D.table,column:Y.name,expected:Y.type,message:`Column '${D.table}.${Y.name}' defined in model but not found in database`});for(let Y of _)if(!k.includes(Y.name))l.push({type:"extra_column",severity:"warning",table:D.table,column:Y.name,actual:Y.type,message:`Column '${D.table}.${Y.name}' exists in database but not defined in model`});for(let Y of D.columns){let J=_.find((z)=>z.name===Y.name);if(J){let z=(Pe)=>Pe.toLowerCase().replace(/\(.*\)/,"").replace("integer","int").replace("varchar","text").replace("character varying","text").trim(),Me=z(Y.type),Ke=z(J.type);if(Me!==Ke)l.push({type:"type_mismatch",severity:"warning",table:D.table,column:Y.name,expected:Y.type,actual:J.type,message:`Column '${D.table}.${Y.name}' type mismatch: expected '${Y.type}', found '${J.type}'`})}}}let x=l.filter((D)=>D.severity==="error").length===0;if(x&&l.length===0)console.log("\u2713 Schema is valid - no issues found"),console.log();else{console.log(`-- Found ${l.length} issue(s)`),console.log();let D=l.filter((v)=>v.severity==="error"),_=l.filter((v)=>v.severity==="warning");if(D.length>0){console.log(`\u2717 Errors (${D.length}):`);for(let v of D)console.log(` - ${v.message}`);console.log()}if(_.length>0){console.log(`\u26A0 Warnings (${_.length}):`);for(let v of _)console.log(` - ${v.message}`);console.log()}if(!x)console.log("-- Recommendation: Run migrations to sync the database schema"),console.log("-- qb migrate ./app/Models --apply")}return{valid:x,issues:l}}catch(c){throw console.error("-- Schema validation failed:",c),c}}async function $e(s){return Q(s)}async function xe(s={}){let a=Number(s.attempts||10),l=Number(s.delay||100),c=i();try{return await c.waitForReady({attempts:a,delayMs:l}),console.log("READY"),!0}catch{throw console.error("NOT READY"),Error("Database not ready")}}class S{driver;client;tableName;indexName;entityType;keyConditions=[];filterConditions=[];projectionAttrs=[];limitValue;scanForward=!0;consistentReadValue=!1;startKey;constructor(s){this.driver=u(s.config),this.client=s.client,this.tableName=s.config.tableName??""}table(s){return this.tableName=s,this}index(s){return this.indexName=s,this}entity(s){return this.entityType=s,this}whereKey(s,a,l){return this.keyConditions.push({attribute:s,operator:a,value:l}),this}wherePartitionKey(s,a){return this.whereKey(s,"=",a)}whereSortKey(s,a){return this.whereKey(s,"=",a)}whereSortKeyBeginsWith(s,a){return this.keyConditions.push({attribute:s,operator:"begins_with",value:a}),this}whereSortKeyBetween(s,a,l){return this.keyConditions.push({attribute:s,operator:"BETWEEN",values:[a,l]}),this}where(s,a,l){return this.filterConditions.push({attribute:s,operator:a,value:l}),this}whereEquals(s,a){return this.where(s,"=",a)}whereLessThan(s,a){return this.where(s,"<",a)}whereLessThanOrEqual(s,a){return this.where(s,"<=",a)}whereGreaterThan(s,a){return this.where(s,">",a)}whereGreaterThanOrEqual(s,a){return this.where(s,">=",a)}whereBetween(s,a,l){return this.filterConditions.push({attribute:s,operator:"BETWEEN",values:[a,l]}),this}whereBeginsWith(s,a){return this.filterConditions.push({attribute:s,operator:"begins_with",value:a}),this}whereContains(s,a){return this.where(s,"contains",a)}whereExists(s){return this.where(s,"attribute_exists")}whereNotExists(s){return this.where(s,"attribute_not_exists")}whereIn(s,a){return this.filterConditions.push({attribute:s,operator:"IN",values:a}),this}select(...s){return this.projectionAttrs.push(...s),this}limit(s){return this.limitValue=s,this}ascending(){return this.scanForward=!0,this}descending(){return this.scanForward=!1,this}consistentRead(s=!0){return this.consistentReadValue=s,this}startFrom(s){return this.startKey=s,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 s=this.buildQueryParams(),a={TableName:s.tableName,ExpressionAttributeNames:{},ExpressionAttributeValues:{}};if(s.indexName)a.IndexName=s.indexName;let l=0;if(s.keyConditions.length>0){let c=[];for(let f of s.keyConditions){let b=`#key${l}`;if(a.ExpressionAttributeNames[b]=f.attribute,f.operator==="begins_with"){let p=`:keyval${l}`;a.ExpressionAttributeValues[p]=this.driver.marshall({v:f.value}).v,c.push(`begins_with(${b}, ${p})`)}else if(f.operator==="BETWEEN"){let p=`:keyval${l}a`,E=`:keyval${l}b`;a.ExpressionAttributeValues[p]=this.driver.marshall({v:f.values?.[0]}).v,a.ExpressionAttributeValues[E]=this.driver.marshall({v:f.values?.[1]}).v,c.push(`${b} BETWEEN ${p} AND ${E}`)}else{let p=`:keyval${l}`;a.ExpressionAttributeValues[p]=this.driver.marshall({v:f.value}).v,c.push(`${b} ${f.operator} ${p}`)}l++}a.KeyConditionExpression=c.join(" AND ")}if(s.filterConditions&&s.filterConditions.length>0){let c=[];for(let f of s.filterConditions){let b=`#flt${l}`;if(a.ExpressionAttributeNames[b]=f.attribute,f.operator==="attribute_exists")c.push(`attribute_exists(${b})`);else if(f.operator==="attribute_not_exists")c.push(`attribute_not_exists(${b})`);else if(f.operator==="begins_with"||f.operator==="contains"){let p=`:fltval${l}`;a.ExpressionAttributeValues[p]=this.driver.marshall({v:f.value}).v,c.push(`${f.operator}(${b}, ${p})`)}else if(f.operator==="BETWEEN"){let p=`:fltval${l}a`,E=`:fltval${l}b`;a.ExpressionAttributeValues[p]=this.driver.marshall({v:f.values?.[0]}).v,a.ExpressionAttributeValues[E]=this.driver.marshall({v:f.values?.[1]}).v,c.push(`${b} BETWEEN ${p} AND ${E}`)}else if(f.operator==="IN"){let p=(f.values??[]).map((E,x)=>`:fltval${l}_${x}`);f.values?.forEach((E,x)=>{a.ExpressionAttributeValues[`:fltval${l}_${x}`]=this.driver.marshall({v:E}).v}),c.push(`${b} IN (${p.join(", ")})`)}else{let p=`:fltval${l}`;a.ExpressionAttributeValues[p]=this.driver.marshall({v:f.value}).v,c.push(`${b} ${f.operator} ${p}`)}l++}a.FilterExpression=c.join(" AND ")}if(s.projectionAttributes&&s.projectionAttributes.length>0){let c=[];for(let f of s.projectionAttributes){let b=`#proj${l}`;a.ExpressionAttributeNames[b]=f,c.push(b),l++}a.ProjectionExpression=c.join(", ")}if(s.limit!==void 0)a.Limit=s.limit;if(s.scanIndexForward!==void 0)a.ScanIndexForward=s.scanIndexForward;if(s.exclusiveStartKey)a.ExclusiveStartKey=this.driver.marshall(s.exclusiveStartKey);if(s.consistentRead)a.ConsistentRead=s.consistentRead;if(Object.keys(a.ExpressionAttributeNames).length===0)delete a.ExpressionAttributeNames;if(Object.keys(a.ExpressionAttributeValues).length===0)delete a.ExpressionAttributeValues;return a}toScanRequest(){let s=this.buildScanParams(),a={TableName:s.tableName};if(s.indexName)a.IndexName=s.indexName;if(s.filterConditions&&s.filterConditions.length>0){let{expression:l,expressionAttributeNames:c,expressionAttributeValues:f}=this.driver.buildFilterExpression(s.filterConditions);a.FilterExpression=l,a.ExpressionAttributeNames=c,a.ExpressionAttributeValues=f}if(s.projectionAttributes&&s.projectionAttributes.length>0){let{expression:l,expressionAttributeNames:c}=this.driver.buildProjectionExpression(s.projectionAttributes);a.ProjectionExpression=l,a.ExpressionAttributeNames={...a.ExpressionAttributeNames,...c}}if(s.limit!==void 0)a.Limit=s.limit;if(s.exclusiveStartKey)a.ExclusiveStartKey=this.driver.marshall(s.exclusiveStartKey);if(s.consistentRead)a.ConsistentRead=s.consistentRead;return a}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 s=this.toQueryRequest(),a=await this.client.query(s);return{items:a.Items?.map((l)=>this.driver.unmarshall(l)),count:a.Count,scannedCount:a.ScannedCount,lastEvaluatedKey:a.LastEvaluatedKey?this.driver.unmarshall(a.LastEvaluatedKey):void 0,consumedCapacity:a.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 s=this.toScanRequest(),a=await this.client.scan(s);return{items:a.Items?.map((l)=>this.driver.unmarshall(l)),count:a.Count,scannedCount:a.ScannedCount,lastEvaluatedKey:a.LastEvaluatedKey?this.driver.unmarshall(a.LastEvaluatedKey):void 0,consumedCapacity:a.ConsumedCapacity}}async getAll(){let s=[],a;do{if(a)this.startFrom(a);let l=this.keyConditions.length>0?await this.query():await this.scan();if(l.items)s.push(...l.items);a=l.lastEvaluatedKey}while(a);return s}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 s=this.keyConditions.length>0?this.toQueryRequest():this.toScanRequest();return s.Select="COUNT",(this.keyConditions.length>0?await this.client.query(s):await this.client.scan(s)).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 g{driver;client;tableName;itemData={};keyData={};updateExpressions={};conditionExpr;returnValuesOption="NONE";constructor(s){this.driver=u(s.config),this.client=s.client,this.tableName=s.config.tableName??""}table(s){return this.tableName=s,this}key(s){return this.keyData=s,this}item(s){return this.itemData=s,this}set(s,a){if(!this.updateExpressions.set)this.updateExpressions.set={};return this.updateExpressions.set[s]=a,this}setMany(s){if(!this.updateExpressions.set)this.updateExpressions.set={};return Object.assign(this.updateExpressions.set,s),this}remove(s){if(!this.updateExpressions.remove)this.updateExpressions.remove=[];return this.updateExpressions.remove.push(s),this}add(s,a){if(!this.updateExpressions.add)this.updateExpressions.add={};return this.updateExpressions.add[s]=a,this}deleteFromSet(s,a){if(!this.updateExpressions.delete)this.updateExpressions.delete={};return this.updateExpressions.delete[s]=a,this}condition(s){return this.conditionExpr=s,this}ifNotExists(s="pk"){return this.conditionExpr=`attribute_not_exists(${s})`,this}ifExists(s="pk"){return this.conditionExpr=`attribute_exists(${s})`,this}returnOld(){return this.returnValuesOption="ALL_OLD",this}returnNew(){return this.returnValuesOption="ALL_NEW",this}toPutRequest(){let s={TableName:this.tableName,Item:this.driver.marshall(this.itemData)};if(this.conditionExpr)s.ConditionExpression=this.conditionExpr;if(this.returnValuesOption!=="NONE")s.ReturnValues=this.returnValuesOption;return s}toUpdateRequest(){let s={TableName:this.tableName,Key:this.driver.marshall(this.keyData)},{expression:a,expressionAttributeNames:l,expressionAttributeValues:c}=this.driver.buildUpdateExpression(this.updateExpressions);if(a)s.UpdateExpression=a,s.ExpressionAttributeNames=l,s.ExpressionAttributeValues=c;if(this.conditionExpr)s.ConditionExpression=this.conditionExpr;if(this.returnValuesOption!=="NONE")s.ReturnValues=this.returnValuesOption;return s}toDeleteRequest(){let s={TableName:this.tableName,Key:this.driver.marshall(this.keyData)};if(this.conditionExpr)s.ConditionExpression=this.conditionExpr;if(this.returnValuesOption!=="NONE")s.ReturnValues=this.returnValuesOption;return s}toGetRequest(){return{TableName:this.tableName,Key:this.driver.marshall(this.keyData)}}async put(){if(!this.client)throw Error("DynamoDB client not provided");let s=this.toPutRequest(),a=await this.client.putItem(s);if(a.Attributes)return this.driver.unmarshall(a.Attributes);return}async update(){if(!this.client)throw Error("DynamoDB client not provided");let s=this.toUpdateRequest(),a=await this.client.updateItem(s);if(a.Attributes)return this.driver.unmarshall(a.Attributes);return}async delete(){if(!this.client)throw Error("DynamoDB client not provided");let s=this.toDeleteRequest(),a=await this.client.deleteItem(s);if(a.Attributes)return this.driver.unmarshall(a.Attributes);return}async get(){if(!this.client)throw Error("DynamoDB client not provided");let s=this.toGetRequest(),a=await this.client.getItem(s);if(a.Item)return this.driver.unmarshall(a.Item);return}}function yn(s){return new S(s)}function bn(s){return new g(s)}function Tn(s){let a=u(s.config);return{query:()=>new S(s),item:()=>new g(s),driver:a,registerEntity:(l)=>a.registerEntity(l),buildKey:(l,c)=>a.buildPrimaryKey(l,c)}}class lt{config;entities=new Map;pkAttribute;skAttribute;typeAttribute;constructor(s){this.config=s,this.pkAttribute=s.pkAttribute??"pk",this.skAttribute=s.skAttribute??"sk",this.typeAttribute=s.typeAttribute??"_type";for(let a of s.entities)this.entities.set(a.name,a)}getEntity(s){return this.entities.get(s)}registerEntity(s){this.entities.set(s.name,s)}buildKey(s,a){let l=this.entities.get(s);if(!l)throw Error(`Entity not found: ${s}`);let c=this.interpolatePattern(l.pkPattern,a),f=this.interpolatePattern(l.skPattern,a);return{pk:c,sk:f}}buildGSIKey(s,a,l){let c=this.entities.get(s);if(!c)throw Error(`Entity not found: ${s}`);let f=c.indexes?.find((E)=>E.name===a);if(!f)throw Error(`GSI not found: ${a} for entity ${s}`);let b=this.interpolatePattern(f.pkPattern,l),p=f.skPattern?this.interpolatePattern(f.skPattern,l):void 0;return{pk:b,sk:p}}createItem(s,a){let{pk:l,sk:c}=this.buildKey(s,a),f=this.entities.get(s),b={[this.pkAttribute]:l,[this.skAttribute]:c,[this.typeAttribute]:s,...a};if(f.indexes)for(let p of f.indexes){let E=this.buildGSIKey(s,p.name,a),x=this.config.indexes?.find((D)=>D.name===p.name);if(x){if(b[x.pkAttribute]=E.pk,x.skAttribute&&E.sk)b[x.skAttribute]=E.sk}}return b}parseEntityType(s){if(s[this.typeAttribute])return s[this.typeAttribute];let a=s[this.pkAttribute];if(!a)return;for(let[l,c]of this.entities){let f=c.pkPattern.split("${")[0];if(a.startsWith(f))return l}return}parseItem(s){let a=this.parseEntityType(s);if(!a)return;let{[this.pkAttribute]:l,[this.skAttribute]:c,[this.typeAttribute]:f,...b}=s;return{type:a,data:b}}getEntityPrefix(s){let a=this.entities.get(s);if(!a)throw Error(`Entity not found: ${s}`);return a.pkPattern.split("${")[0]}generateTableDefinition(){let s=[{name:this.pkAttribute,type:"S"},{name:this.skAttribute,type:"S"}],a=[];if(this.config.indexes)for(let l of this.config.indexes){if(!s.find((c)=>c.name===l.pkAttribute))s.push({name:l.pkAttribute,type:"S"});if(l.skAttribute&&!s.find((c)=>c.name===l.skAttribute))s.push({name:l.skAttribute,type:"S"});a.push({indexName:l.name,keySchema:{partitionKey:l.pkAttribute,sortKey:l.skAttribute},projection:{type:"ALL"}})}return{tableName:this.config.tableName,keySchema:{partitionKey:this.pkAttribute,sortKey:this.skAttribute},attributeDefinitions:s,globalSecondaryIndexes:a.length>0?a:void 0,billingMode:"PAY_PER_REQUEST"}}interpolatePattern(s,a){return s.replace(/\$\{(\w+)\}/g,(l,c)=>{if(!(c in a))throw Error(`Missing value for pattern key: ${c}`);return String(a[c])})}}class ct{manager;entityName;options;constructor(s,a,l){this.manager=s,this.entityName=a,this.options=l}async create(s){let a=this.manager.createItem(this.entityName,s),l=new g(this.options).table(this.options.config.tableName).item(a).ifNotExists("pk");if(this.options.client)await l.put();return s}async get(s){let{pk:a,sk:l}=this.manager.buildKey(this.entityName,s),c=new g(this.options).table(this.options.config.tableName).key({pk:a,sk:l});if(!this.options.client)throw Error("DynamoDB client not provided");let f=await c.get();if(!f)return;return this.manager.parseItem(f)?.data}async update(s,a){let{pk:l,sk:c}=this.manager.buildKey(this.entityName,s),f=new g(this.options).table(this.options.config.tableName).key({pk:l,sk:c}).setMany(a).ifExists("pk").returnNew();if(!this.options.client)throw Error("DynamoDB client not provided");let b=await f.update();if(!b)return;return this.manager.parseItem(b)?.data}async delete(s){let{pk:a,sk:l}=this.manager.buildKey(this.entityName,s),c=new g(this.options).table(this.options.config.tableName).key({pk:a,sk:l});if(!this.options.client)throw Error("DynamoDB client not provided");return await c.delete(),!0}query(){return new ut(this.manager,this.entityName,this.options)}async findAll(){let s=this.manager.typeAttribute??"_type",a=new S(this.options).table(this.options.config.tableName).whereEquals(s,this.entityName);if(!this.options.client)throw Error("DynamoDB client not provided");return(await a.getAll()).map((c)=>this.manager.parseItem(c)).filter((c)=>c!==void 0).map((c)=>c.data)}}class ut{manager;entityName;options;builder;pkValue;skConditions=[];constructor(s,a,l){this.manager=s,this.entityName=a,this.options=l,this.builder=new S(l).table(l.config.tableName)}wherePartitionKey(s){let{pk:a}=this.manager.buildKey(this.entityName,s);this.pkValue=a;let l=this.manager.pkAttribute??"pk";return this.builder.wherePartitionKey(l,a),this}whereSortKey(s){let{sk:a}=this.manager.buildKey(this.entityName,s),l=this.manager.skAttribute??"sk";return this.builder.whereSortKey(l,a),this}whereSortKeyBeginsWith(s){let a=this.manager.skAttribute??"sk";return this.builder.whereSortKeyBeginsWith(a,s),this}useIndex(s,a){let l=this.manager.buildGSIKey(this.entityName,s,a),c=this.manager.config.indexes?.find((f)=>f.name===s);if(!c)throw Error(`GSI configuration not found: ${s}`);return this.builder.index(s),this.builder.wherePartitionKey(c.pkAttribute,l.pk),this}where(s,a,l){return this.builder.where(s,a,l),this}select(...s){return this.builder.select(...s),this}limit(s){return this.builder.limit(s),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((a)=>this.manager.parseItem(a)).filter((a)=>a!==void 0).map((a)=>a.data)}async first(){return this.limit(1),(await this.execute())[0]}}function dt(s){return new lt(s)}function ft(s,a,l){return new ct(s,a,l)}var wn={simpleEntity:(s,a="id")=>({name:s,pkPattern:`${s.toUpperCase()}#\${${a}}`,skPattern:"METADATA",keyFields:[a]}),oneToMany:(s,a,l="id",c="id")=>({parent:{name:s,pkPattern:`${s.toUpperCase()}#\${${l}}`,skPattern:"METADATA",keyFields:[l]},child:{name:a,pkPattern:`${s.toUpperCase()}#\${${l}}`,skPattern:`${a.toUpperCase()}#\${${c}}`,keyFields:[l,c]}}),manyToMany:(s,a,l="id",c="relatedId")=>({entity:{name:s,pkPattern:`${s.toUpperCase()}#\${${l}}`,skPattern:"METADATA",keyFields:[l]},relation:{name:a,pkPattern:`${s.toUpperCase()}#\${${l}}`,skPattern:`${a.toUpperCase()}#\${${c}}`,keyFields:[l,c],indexes:[{name:"GSI1",pkPattern:`${s.toUpperCase()}#\${${c}}`,skPattern:`${a.toUpperCase()}#\${${l}}`}]}}),hierarchical:(s,a="rootId",l="path")=>({name:s,pkPattern:`ROOT#\${${a}}`,skPattern:`PATH#\${${l}}`,keyFields:[a,l]})};function mt(s,a){let l={};for(let[c,f]of Object.entries(s))if(f)l[c]=f.replace(/\{([^}]+)\}/g,(b,p)=>a[p]!==void 0?String(a[p]):`{${p}}`);return l}async function Wt(s){return{models:new Map}}function Sn(s){return s}function Dn(s){return s}function En(s){return s}function $n(s){return s}class ht{config;driver;singleTableManager;models=new Map;queryBuilderOptions;constructor(s){this.config={pkAttribute:"pk",skAttribute:"sk",entityTypeAttribute:"_et",keyDelimiter:"#",...s};let a={region:s.region,endpoint:s.endpoint,credentials:s.credentials,tableName:s.tableName};this.driver=u(a);let l={tableName:s.tableName,pkAttribute:this.config.pkAttribute,skAttribute:this.config.skAttribute,typeAttribute:this.config.entityTypeAttribute,indexes:this.buildGSIConfig(),entities:[]};this.singleTableManager=dt(l),this.queryBuilderOptions={config:a}}setClient(s){return this.queryBuilderOptions.client=s,this}async discoverModels(){if(!this.config.modelsPath)throw Error("modelsPath must be configured to use discoverModels()");let s=await Wt({queryBuilder:{modelsPath:this.config.modelsPath},singleTable:{pkAttribute:this.config.pkAttribute,skAttribute:this.config.skAttribute,typeAttribute:this.config.entityTypeAttribute,delimiter:this.config.keyDelimiter}}),a=[];for(let[,l]of s.models)this.registerParsedModel(l),a.push(l);return a}registerModel(s){let a=this.parseWithTooling(s);return this.registerParsedModel(a)}registerParsedModel(s){this.models.set(s.name,s);let a=this.toSingleTableEntity(s);this.singleTableManager.registerEntity(a);let l=this.toEntityMapping(s);return this.driver.registerEntity(l),s}registerModels(s){return s.map((a)=>this.registerModel(a))}getModel(s){return this.models.get(s)}getAllModels(){return Array.from(this.models.values())}repository(s){if(!this.models.get(s))throw Error(`Model not found: ${s}`);return ft(this.singleTableManager,s,this.queryBuilderOptions)}query(s){if(!this.models.get(s))throw Error(`Model not found: ${s}`);return new S(this.queryBuilderOptions).table(this.config.tableName).entity(s)}item(s){if(!this.models.get(s))throw Error(`Model not found: ${s}`);return new g(this.queryBuilderOptions).table(this.config.tableName)}buildKey(s,a){let l=this.models.get(s);if(!l)throw Error(`Model not found: ${s}`);let c=mt(l.keyPatterns,a);return{pk:c.pk,sk:c.sk}}createItem(s,a){let l=this.models.get(s);if(!l)throw Error(`Model not found: ${s}`);let c=mt(l.keyPatterns,a),{pk:f,sk:b}=c,p={[this.config.pkAttribute]:f,[this.config.skAttribute]:b,[this.config.entityTypeAttribute]:l.name,...a};if(l.hasTimestamps){let E=new Date().toISOString();if(!p.createdAt)p.createdAt=E;p.updatedAt=E}if(l.hasVersioning){if(!p._v)p._v=1}return p}parseItem(s){let a=s[this.config.entityTypeAttribute];if(!a)return;let{[this.config.pkAttribute]:l,[this.config.skAttribute]:c,[this.config.entityTypeAttribute]:f,...b}=s;return{type:a,data:b}}getDriver(){return this.driver}getSingleTableManager(){return this.singleTableManager}generateTableDefinition(){return this.singleTableManager.generateTableDefinition()}generateAccessPatterns(s){let a=this.models.get(s);if(!a)throw Error(`Model not found: ${s}`);return a.accessPatterns}parseWithTooling(s){let a=s.name.toUpperCase(),l=s.primaryKey??"id",c=this.config.keyDelimiter,f=this.parseAttributes(s),b=this.parseRelationships(s,l),p={pk:`${a}${c}{${l}}`,sk:`${a}${c}{${l}}`,...this.deriveGSIKeyPatterns(a,l,c,b)},E=this.deriveAccessPatterns(s.name,a,l,b);return{name:s.name,entityType:a,primaryKey:l,attributes:f,relationships:b,keyPatterns:p,accessPatterns:E,traits:s.traits??{},hasTimestamps:s.traits?.useTimestamps??!1,hasSoftDeletes:s.traits?.useSoftDeletes??!1,hasUuid:s.traits?.useUuid??!1,hasTtl:s.traits?.useTtl??!1,hasVersioning:s.traits?.useVersioning??!1,original:s}}parseAttributes(s){let a=[];if(a.push({name:s.primaryKey??"id",fillable:!1,required:!0,nullable:!1,unique:!0,hidden:!1,dynamoDbType:"S"}),s.attributes)for(let[l,c]of Object.entries(s.attributes))a.push({name:l,fillable:c.fillable??!0,required:c.required??!1,nullable:c.nullable??!0,unique:c.unique??!1,hidden:c.hidden??!1,defaultValue:c.default,cast:c.cast,dynamoDbType:this.inferDynamoDBType(c)});if(s.traits?.useTimestamps)a.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(s.traits?.useSoftDeletes)a.push({name:"deletedAt",fillable:!1,required:!1,nullable:!0,unique:!1,hidden:!1,dynamoDbType:"S"});return a}inferDynamoDBType(s){if(s.cast){let a=s.cast.toLowerCase();if(["integer","int","float","double","decimal","number"].includes(a))return"N";if(["boolean","bool"].includes(a))return"BOOL";if(["array","list"].includes(a))return"L";if(["object","json","map"].includes(a))return"M"}if(s.validation?.rule){let a=String(s.validation.rule);if(a.includes("integer")||a.includes("numeric")||a.includes("number"))return"N";if(a.includes("boolean"))return"BOOL";if(a.includes("array"))return"L";if(a.includes("object"))return"M"}return"S"}parseRelationships(s,a){let l=[];if(s.hasOne)for(let c of s.hasOne)l.push({type:"hasOne",relatedModel:c,foreignKey:`${s.name.toLowerCase()}Id`,localKey:a,requiresGsi:!0});if(s.hasMany)for(let c of s.hasMany)l.push({type:"hasMany",relatedModel:c,foreignKey:`${s.name.toLowerCase()}Id`,localKey:a,requiresGsi:!1});if(s.belongsTo)for(let c of s.belongsTo)l.push({type:"belongsTo",relatedModel:c,foreignKey:`${c.toLowerCase()}Id`,localKey:a,requiresGsi:!0});if(s.belongsToMany){let c=Array.isArray(s.belongsToMany)?s.belongsToMany:Object.values(s.belongsToMany);for(let f of c){let b=typeof f==="string"?f:f?.model;if(!b)continue;let p=[s.name,b].sort();l.push({type:"belongsToMany",relatedModel:b,foreignKey:`${s.name.toLowerCase()}Id`,localKey:a,pivotEntity:p.join(""),requiresGsi:!0})}}return l}deriveGSIKeyPatterns(s,a,l,c){let f={},b=1;for(let p of c)if(p.requiresGsi&&b<=5)f[`gsi${b}pk`]=`${p.relatedModel.toUpperCase()}${l}{${p.foreignKey}}`,f[`gsi${b}sk`]=`${s}${l}{${a}}`,p.gsiIndex=b,b++;return f}deriveAccessPatterns(s,a,l,c){let f=[];f.push({name:`Get ${s} by ID`,description:`Retrieve a single ${s} by its primary key`,entityType:a,operation:"get",index:"main",keyCondition:"pk = :pk AND sk = :sk",examplePk:`${a}#123`,exampleSk:`${a}#123`,efficient:!0}),f.push({name:`List all ${s}s`,description:`Scan all ${s} entities`,entityType:a,operation:"scan",index:"scan",keyCondition:"_et = :entityType",examplePk:a,efficient:!1});for(let b of c){if(b.type==="hasMany")f.push({name:`Get ${b.relatedModel}s for ${s}`,description:`Query ${b.relatedModel}s related to a ${s}`,entityType:a,operation:"query",index:"main",keyCondition:"pk = :pk AND begins_with(sk, :skPrefix)",examplePk:`${a}#123`,exampleSk:`${b.relatedModel.toUpperCase()}#`,efficient:!0});if(b.gsiIndex){let p=`GSI${b.gsiIndex}`;f.push({name:`Get ${s}s by ${b.relatedModel}`,description:`Query ${s}s by their related ${b.relatedModel}`,entityType:a,operation:"query",index:p,keyCondition:`gsi${b.gsiIndex}pk = :pk`,examplePk:`${b.relatedModel.toUpperCase()}#123`,efficient:!0})}}return f}toSingleTableEntity(s){let a=this.extractKeyFields(s.keyPatterns.pk);return{name:s.name,pkPattern:s.keyPatterns.pk,skPattern:s.keyPatterns.sk,keyFields:a,indexes:this.extractGSIPatterns(s.keyPatterns)}}extractKeyFields(s){let a=s.match(/\{([^}]+)\}/g);if(!a)return[];return a.map((l)=>l.slice(1,-1))}extractGSIPatterns(s){let a=[];for(let l=1;l<=5;l++){let c=`gsi${l}pk`,f=`gsi${l}sk`;if(s[c])a.push({name:`GSI${l}`,pkPattern:s[c],skPattern:s[f]})}return a.length>0?a:void 0}toEntityMapping(s){return{entityType:s.name,pkPattern:s.keyPatterns.pk,skPattern:s.keyPatterns.sk}}buildGSIConfig(){let s=this.config.gsiConfig??{},a=[];if(s.gsi1pk)a.push({name:"GSI1",pkAttribute:s.gsi1pk,skAttribute:s.gsi1sk});if(s.gsi2pk)a.push({name:"GSI2",pkAttribute:s.gsi2pk,skAttribute:s.gsi2sk});if(s.gsi3pk)a.push({name:"GSI3",pkAttribute:s.gsi3pk,skAttribute:s.gsi3sk});return a}}function xn(s){return new ht(s)}function vn(s){return s.accessPatterns}function kn(s,a="#"){let l=s.name.toUpperCase(),c=s.primaryKey??"id";return{name:s.name,pkPattern:`${l}${a}\${${c}}`,skPattern:`${l}${a}\${${c}}`}}function ve(s){let a={};for(let l of Object.keys(s)){let c=s[l],f=c.definition??c.getDefinition?.()??c,b=T(f),p=f.attributes??{},E={};for(let x of Object.keys(p))E[x]=void 0;a[b]={columns:E,primaryKey:f.primaryKey??"id"}}return a}import{readdirSync as $i}from"fs";import{basename as mr,extname as fr,isAbsolute as vi,join as pr}from"path";import Pi from"process";var ki=new Set([".ts",".mts",".cts",".js",".mjs",".cjs"]);function Ii(s){let a=fr(s);if(!ki.has(a))return!1;let l=mr(s,a);if(l.startsWith("_")||l==="index")return!1;return!l.endsWith(".d")}function Oi(s){if(!s||typeof s!=="object")return!1;let a=s;return typeof a.name==="string"||typeof a.table==="string"}function gr(s){let a=[],l=$i(s,{withFileTypes:!0}).sort((c,f)=>c.name.localeCompare(f.name));for(let c of l){let f=pr(s,c.name);if(c.isDirectory()){a.push(...gr(f));continue}if(Ii(c.name))a.push(f)}return a}async function d(s){let a=s.cwd??Pi.cwd(),l=vi(s.modelsDir)?s.modelsDir:pr(a,s.modelsDir),c={};for(let f of gr(l)){let b=`?t=${Date.now()}-${Math.random().toString(36).slice(2)}`,p=await import(`${f}${b}`),E=p.default??p,x=E.definition??E.getDefinition?.()??E;if(!Oi(x))continue;let D=x.name??mr(f,fr(f));c[D]={...x,name:D}}return c}function gt(s){let a={},l={},c={},f={},b={},p={};for(let E of Object.keys(s)){let x=s[E],D=x.definition??x.getDefinition?.()??x,_=T(D);a[E]=_,l[_]=E,c[_]=D.primaryKey??"id";let v=[];for(let[Me,Ke]of Object.entries(D.attributes??{}))if(/^(?:datetime|timestamp|timestamptz|date)$/i.test(String(Ke?.type??"")))v.push(Me);let k=D.traits??{};if(k.useTimestamps??k.timestampable)v.push("created_at","updated_at");if(v.length>0)p[_]=[...new Set(v)];let Y=(Me)=>{if(!Me)return{};let Ke={};if(Array.isArray(Me)){for(let Pe of Me){let Ye=Be(Pe);if(Ye)Ke[Ye.model]=Ye.model}return Ke}if(typeof Me==="object"){for(let[Pe,Ye]of Object.entries(Me)){let Ae=Be(Ye);if(Ae)Ke[Pe]=Ae.model}return Ke}return{}},J=(Me)=>{if(!Me)return{};if(Array.isArray(Me)){let Ke={};for(let Pe of Me)if(typeof Pe==="string")Ke[Pe]=Pe;else if(Pe&&typeof Pe==="object"&&typeof Pe.model==="string")Ke[Pe.model]=Pe;return Ke}return Me},z=(Me)=>{if(!Me)return{};return Me};if(f[_]={hasOne:Y(D.hasOne),hasMany:Y(D.hasMany),belongsTo:Y(D.belongsTo),belongsToMany:J(D.belongsToMany),hasOneThrough:z(D.hasOneThrough),hasManyThrough:z(D.hasManyThrough),morphOne:Y(D.morphOne),morphMany:Y(D.morphMany),morphTo:D.morphTo,morphToMany:Y(D.morphToMany),morphedByMany:Y(D.morphedByMany)},D.scopes&&typeof D.scopes==="object"){b[_]={};for(let Me of Object.keys(D.scopes)){let Ke=D.scopes[Me];if(typeof Ke==="function")b[_][Me]=Ke}}}return{modelToTable:a,tableToModel:l,primaryKeys:c,relations:f,scopes:b,models:s,temporalColumns:p}}import{existsSync as Pn,mkdirSync as qi,readdirSync as Li,readFileSync as Ki,writeFileSync as Bi}from"fs";import{dirname as yr,join as tn}from"path";import Er from"process";function xt(s){if(e.verbose)console.log(s)}function kt(s){return s.replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").toLowerCase()}function gn(s){return m(e.relations?.singularizeStrategy)(s)}var zt=0,$t=0,It=0,nn=!0,rn=[],Lt=null;function pt(){return[...rn]}function Ui(s){let a=s;while(a!==yr(a)){if(Pn(tn(a,"package.json")))return a;a=yr(a)}return Er.cwd()}function Fi(){let s=Ui(Er.cwd()),a=_t(s,e.migrationDir);if(!Pn(a))qi(a,{recursive:!0}),xt(`-- Created SQL directory: ${a}`);return a}var yt="-- qb:generated";function bt(s){return s.trimStart().startsWith(yt)}function Tt(s){return s.split(`
371
372
  `).filter((a)=>!a.trimStart().startsWith("--")).join(`
372
- `).replace(/\s+/g," ").trim().replace(/;+$/,"")}function Ni(s){let a=new Set,l;try{l=Si(s).filter((c)=>c.endsWith(".sql"))}catch{return a}for(let c of l)try{a.add(Tt(Mi(en(s,c),"utf8")))}catch{}return a}function dr(s,a){if(!s)return!1;let l=Ci();if(Lt===null)Lt=Ni(l);let c=Tt(s);if(c.length>0&&Lt.has(c))return xt(`-- Migration already in the corpus, not writing it again: ${a}`),!1;Yt++;let f=tn?String(Yt).padStart(10,"0"):String(Math.floor(Date.now()/1000)+Yt),b=`${f}-${a}.sql`;if(!tn){let E=Number(f);while(hn(en(l,b)))E+=1,f=String(E),b=`${f}-${a}.sql`}let p=en(l,b);return Ai(p,`${yt}
373
- ${s}`),xt(`-- Migration file created: ${b}`),$t++,nn.push(b),Lt?.add(c),!0}function Ut(s,a){return s==="integer"&&a==="bigint"||s==="string"&&a==="text"}function ar(s){if(s.endsWith("_id"))return"bigint";if(s.endsWith("_at"))return"datetime";if(s.startsWith("is_")||s.startsWith("has_"))return"boolean";return}function or(s){if(typeof s==="string"||typeof s==="number"||typeof s==="boolean"||typeof s==="bigint"||s instanceof Date)return s;return}function _i(s){if(s&&typeof s==="object"&&"name"in s){let a=s;if(a.name==="enum"||a.getRules&&Array.isArray(a.getRules())){if(a.enumValues&&Array.isArray(a.enumValues))return a.enumValues.map((l)=>String(l));if(a._values&&Array.isArray(a._values))return a._values.map((l)=>String(l));if(a.values&&Array.isArray(a.values))return a.values.map((l)=>String(l))}}if(s&&typeof s==="object"){let a=s,l=a.allowedValues||a.enumValues||a._values||a.values;if(Array.isArray(l)&&l.length>0)return l.map((c)=>String(c))}return}function pn(s){if(!s?.rules||!Array.isArray(s.rules))return;for(let a of s.rules)if(a?.name==="max"||a?.name==="maxLength"){if(a.params&&typeof a.params.max==="number")return a.params.max;if(Array.isArray(a.args)&&typeof a.args[0]==="number")return a.args[0];if(typeof a.value==="number")return a.value;if(typeof a.expectedValue==="number")return a.expectedValue}return}var gn=767;function $i(s){if(!s||typeof s!=="object")return;let a=s;if(a.name)switch(String(a.name).toLowerCase()){case"string":{let c=pn(a);return c&&c>gn?"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(a.type){let l=String(a.type).toLowerCase();if(l==="string"||l==="text")return"string";if(l==="integer"||l==="int")return"integer";if(l==="bigint")return"bigint";if(l==="float")return"float";if(l==="number")return"integer";if(l==="boolean")return"boolean";if(l==="date")return"date";if(l==="datetime")return"datetime";if(l==="timestamptz"||l==="timestamp_tz")return"timestamptz";if(l==="json")return"json"}return}function vi(s){if(typeof s!=="string")return;switch(s.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 G(s,a){let l=gt(s),c=[];for(let E of Object.keys(s)){let x=s[E],D=T(x),_=x.primaryKey??"id",v=x.autoIncrement!==!1,k=x.attributes??{},Y=[],J=[];if(!k[_])Y.push({name:kt(_),type:"bigint",isPrimaryKey:!0,isUnique:!1,isNullable:!1,hasDefault:!1});let z=new Map,Me=O(x.belongsTo).length>0,Ke=new Set(Object.keys(k).map((Ie)=>kt(Ie))),Pe=new Set;for(let Ie of Ke){if(!Ie.endsWith("_type"))continue;let Qe=`${Ie.slice(0,-5)}_id`;if(Ke.has(Qe))Pe.add(Qe)}for(let Ie of O(x.belongsTo)){let Qe=Ie.foreignKey??`${kt(Ie.model)}_id`,ze=l.modelToTable[Ie.model];if(ze)z.set(Qe,{table:ze,onDelete:Ie.onDelete})}for(let Ie of Object.keys(k)){let Qe=k[Ie],ze=kt(Ie),et=Boolean(Qe.validation?.rule?.isRequired),Rt=Ie===_?!1:Qe.nullable??!(Qe.required??et),Ne,_e,Ge=Ie===_;if(Ne=vi(Qe.type)??$i(Qe.validation?.rule),Ne==="string"){let Xe=pn(Qe.validation?.rule);if(Xe&&Xe>gn)Ne="text"}if(!Ne||Ne==="enum"){let Xe=_i(Qe.validation?.rule);if(Xe&&Xe.length>0)Ne="enum",_e=Xe}if(!Ne)Ne=ar(ze);if(!Ne){let Xe=or(Qe.default);if(typeof Xe==="string")Ne=Xe.length>255?"text":"string";else if(typeof Xe==="number")Ne=Number.isInteger(Xe)?"integer":"float";else if(typeof Xe==="boolean")Ne="boolean";else if(typeof Xe==="bigint")Ne="bigint";else if(Xe instanceof Date)Ne="datetime"}if(!Ne)Ne=Ge?"bigint":"string";let it=Ne==="string"?pn(Qe.validation?.rule):void 0,vt={name:ze,type:Ne,isPrimaryKey:Ge,isUnique:Boolean(Qe.unique),isNullable:Rt,hasDefault:typeof Qe.default<"u",defaultValue:or(Qe.default),enumValues:_e,maxLength:typeof it==="number"&&it>0&&it<=gn?it:void 0};if(ze.endsWith("_id")&&Qe.foreignKey!==!1&&!Pe.has(ze))if(typeof Qe.foreignKey==="object"&&Qe.foreignKey!==null){let Xe=Qe.foreignKey;if(vt.references={table:Xe.table,column:Xe.column??"id",onDelete:Xe.onDelete,onUpdate:Xe.onUpdate},Xe.nullable!==void 0)vt.isNullable=Xe.nullable}else{let Xe=z.get(ze),rt=ze.replace(/_id$/,"").replace(/(^|_)([a-z])/g,(On,Ji,Mr)=>Mr.toUpperCase()),sn=Xe?.table??(Me?void 0:l.modelToTable[rt]);if(sn){let On=l.primaryKeys[sn]??"id";vt.references={table:sn,column:On,onDelete:Xe?.onDelete}}}Y.push(vt)}let Ye=O(x.belongsTo);for(let Ie of Ye){let Qe=Ie.foreignKey??`${kt(Ie.model)}_id`;if(Y.some((Rt)=>Rt.name===Qe))continue;let ze=l.modelToTable[Ie.model],et=ze?l.primaryKeys[ze]??"id":void 0;Y.push({name:Qe,type:"bigint",isPrimaryKey:!1,isUnique:!1,isNullable:!0,hasDefault:!1,references:ze&&et&&!Pe.has(Qe)?{table:ze,column:et,onDelete:Ie.onDelete}:void 0})}let Ae=x.traits;if(Ae?.useTimestamps??Ae?.timestampable??!1){if(!Y.some((Ie)=>Ie.name==="created_at"))Y.push({name:"created_at",type:"datetime",isPrimaryKey:!1,isUnique:!1,isNullable:!1,hasDefault:!0,defaultValue:y});if(!Y.some((Ie)=>Ie.name==="updated_at"))Y.push({name:"updated_at",type:"datetime",isPrimaryKey:!1,isUnique:!1,isNullable:!0,hasDefault:!1})}if(Ae?.useSoftDeletes??Ae?.softDeletable??!1){if(!Y.some((Ie)=>Ie.name==="deleted_at"))Y.push({name:"deleted_at",type:"datetime",isPrimaryKey:!1,isUnique:!1,isNullable:!0,hasDefault:!1})}if(Ae?.useUuid??!1){if(!Y.some((Ie)=>Ie.name==="uuid"))Y.push({name:"uuid",type:"string",isPrimaryKey:!1,isUnique:!0,isNullable:!0,hasDefault:!1})}for(let Ie of x.indexes??[])J.push({name:Ie.name,columns:Ie.columns.map((Qe)=>kt(Qe)),type:Ie.unique?"unique":"index",where:Ie.where});for(let Ie of Y)if(Ie.isUnique&&!Ie.isPrimaryKey)J.push({name:`${D}_${Ie.name}_unique`,columns:[Ie.name],type:"unique"});let nt=Array.isArray(x.shardKey)?x.shardKey.map(kt):void 0,Fe=Array.isArray(x.sortKey)?x.sortKey.map(kt):void 0,je=x.tableKind;c.push({table:D,columns:Y,indexes:J,shardKey:nt,sortKey:Fe,tableKind:je})}let f=new Set(c.map((E)=>E.table));function b(E){if(!f.has(E.table))f.add(E.table),c.push(E)}for(let E of Object.keys(s)){let x=s[E],D=x?.traits??{},_=T(x),v=mn(_);if(D.likeable){let k=typeof D.likeable==="object"?D.likeable:{},Y=k.table||`${_}_likes`,J=k.foreignKey||`${v}_id`;b({table:Y,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:J,type:"bigint",isPrimaryKey:!1,isUnique:!1,isNullable:!1,hasDefault:!1,references:{table:_,column:"id"}},{name:"created_at",type:"datetime",isPrimaryKey:!1,isUnique:!1,isNullable:!1,hasDefault:!0,defaultValue:y},{name:"updated_at",type:"datetime",isPrimaryKey:!1,isUnique:!1,isNullable:!0,hasDefault:!1}],indexes:[{name:`${Y}_user_target_unique`,columns:["user_id",J],type:"unique"}]})}if(D.taggable)b({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:y},{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"}]}),b({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:y},{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(D.categorizable)b({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:y},{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"}]}),b({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:y},{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 E of Object.keys(s)){let x=s[E],D=x?.belongsToMany;if(!D||typeof D!=="object"||Array.isArray(D))continue;let _=T(x),v=mn(_);for(let[k,Y]of Object.entries(D)){let J=Y;if(!J||typeof J!=="object")continue;if(J.through)continue;let z=J.pivot;if(!z||!z.columns&&!z.timestamps&&!z.uniques)continue;let Me=J.model,Pe=s[Me]?.table||`${String(Me).toLowerCase()}s`,Ye=mn(Pe),Ae=J.table||[v,Ye].sort().join("_"),Je=J.foreignKey||`${v}_id`,Mt=J.relatedKey||`${Ye}_id`,Ze=new Set([Je,Mt,...Object.keys(z.columns??{})]),nt=new Set;for(let ze of Ze){if(!ze.endsWith("_type"))continue;let et=`${ze.slice(0,-5)}_id`;if(Ze.has(et))nt.add(et)}let Fe=(ze,et)=>nt.has(ze)?void 0:{table:et,column:"id"},je=[{name:"id",type:"bigint",isPrimaryKey:!0,isUnique:!1,isNullable:!1,hasDefault:!1},{name:Je,type:"bigint",isPrimaryKey:!1,isUnique:!1,isNullable:!1,hasDefault:!1,references:Fe(Je,_)},{name:Mt,type:"bigint",isPrimaryKey:!1,isUnique:!1,isNullable:!1,hasDefault:!1,references:Fe(Mt,Pe)}];if(z.columns)for(let[ze,et]of Object.entries(z.columns)){let Rt=et,Ne=ar(ze)??"string";je.push({name:ze,type:Ne,isPrimaryKey:!1,isUnique:!1,isNullable:Rt?.nullable??!1,hasDefault:Rt?.default!==void 0,defaultValue:Rt?.default})}if(z.timestamps)je.push({name:"created_at",type:"datetime",isPrimaryKey:!1,isUnique:!1,isNullable:!1,hasDefault:!0,defaultValue:y}),je.push({name:"updated_at",type:"datetime",isPrimaryKey:!1,isUnique:!1,isNullable:!0,hasDefault:!1});let Ie=[],Qe=z.uniques&&z.uniques.length>0?z.uniques:[[Je,Mt]];for(let ze=0;ze<Qe.length;ze++){let et=Qe[ze];Ie.push({name:`${Ae}_${et.join("_")}_unique${ze>0?`_${ze}`:""}`,columns:[...et],type:"unique"})}b({table:Ae,columns:je,indexes:Ie})}}let p=new Map(c.map((E)=>[E.table,E]));for(let E of c)for(let x of E.columns){if(!x.references)continue;let D=p.get(x.references.table)?.columns.find((_)=>_.name===x.references.column);if(!D||x.type===D.type)continue;x.type=D.type,x.maxLength=D.maxLength,x.enumValues=D.enumValues,x.enumTypeName=D.enumTypeName}return{dialect:a.dialect,vitessSharded:a.vitessSharded,tables:c}}function ke(s,a={}){Yt=0,$t=0,It=0,nn=[],Lt=null,tn=!0;let l=a.dryRun?()=>!1:dr,c=[],f=h(s.dialect,{vitessSharded:s.vitessSharded}),{tables:b,deferredForeignKeys:p}=mr(s.tables,s.dialect);for(let[x,D]of b.entries()){let _={...D,columns:D.columns.map((z)=>p.has(Kt(D.table,z.name))?{...z,references:void 0}:z)},v=[],k=new Set;for(let z of _.columns)if(z.type==="enum"&&z.enumValues&&z.enumValues.length>0){let Me=`${_.table}_${z.name}_type`;if(z.enumTypeName=Me,!k.has(Me)){let Ke=f.createEnumType(Me,z.enumValues);if(Ke)v.push(Ke);k.add(Me)}}let Y=f.createTable(_);v.push(Y);for(let z of _.indexes)v.push(f.createIndex(_.table,z,_.columns));if(x===b.length-1)for(let z of b)for(let Me of z.columns){if(!Me.references||!p.has(Kt(z.table,Me.name)))continue;let Ke=f.addForeignKey(z.table,Me.name,Me.references.table,Me.references.column,Me.references.onDelete,Me.references.onUpdate);if(Ke)v.push(Ke)}c.push(...v);let J=v.join(`
373
+ `).replace(/\s+/g," ").trim().replace(/;+$/,"")}function Vi(s){let a=new Set,l;try{l=Li(s).filter((c)=>c.endsWith(".sql"))}catch{return a}for(let c of l)try{a.add(Tt(Ki(tn(s,c),"utf8")))}catch{}return a}function Dr(s,a){if(!s)return!1;let l=Fi();if(Lt===null)Lt=Vi(l);let c=Tt(s);if(c.length>0&&Lt.has(c))return xt(`-- Migration already in the corpus, not writing it again: ${a}`),!1;zt++;let f=nn?String(zt).padStart(10,"0"):String(Math.floor(Date.now()/1000)+zt),b=`${f}-${a}.sql`;if(!nn){let E=Number(f);while(Pn(tn(l,b)))E+=1,f=String(E),b=`${f}-${a}.sql`}let p=tn(l,b);return Bi(p,`${yt}
374
+ ${s}`),xt(`-- Migration file created: ${b}`),$t++,rn.push(b),Lt?.add(c),!0}function Ut(s,a){return s==="integer"&&a==="bigint"||s==="string"&&a==="text"}function br(s){if(s.endsWith("_id"))return"bigint";if(s.endsWith("_at"))return"datetime";if(s.startsWith("is_")||s.startsWith("has_"))return"boolean";return}function hr(s){if(typeof s==="string"||typeof s==="number"||typeof s==="boolean"||typeof s==="bigint"||s instanceof Date)return s;return}function ji(s){if(s&&typeof s==="object"&&"name"in s){let a=s;if(a.name==="enum"||a.getRules&&Array.isArray(a.getRules())){if(a.enumValues&&Array.isArray(a.enumValues))return a.enumValues.map((l)=>String(l));if(a._values&&Array.isArray(a._values))return a._values.map((l)=>String(l));if(a.values&&Array.isArray(a.values))return a.values.map((l)=>String(l))}}if(s&&typeof s==="object"){let a=s,l=a.allowedValues||a.enumValues||a._values||a.values;if(Array.isArray(l)&&l.length>0)return l.map((c)=>String(c))}return}function Nn(s){if(!s?.rules||!Array.isArray(s.rules))return;for(let a of s.rules)if(a?.name==="max"||a?.name==="maxLength"){if(a.params&&typeof a.params.max==="number")return a.params.max;if(Array.isArray(a.args)&&typeof a.args[0]==="number")return a.args[0];if(typeof a.value==="number")return a.value;if(typeof a.expectedValue==="number")return a.expectedValue}return}var _n=767;function Yi(s){if(!s||typeof s!=="object")return;let a=s;if(a.name)switch(String(a.name).toLowerCase()){case"string":{let c=Nn(a);return c&&c>_n?"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(a.type){let l=String(a.type).toLowerCase();if(l==="string"||l==="text")return"string";if(l==="integer"||l==="int")return"integer";if(l==="bigint")return"bigint";if(l==="float")return"float";if(l==="number")return"integer";if(l==="boolean")return"boolean";if(l==="date")return"date";if(l==="datetime")return"datetime";if(l==="timestamptz"||l==="timestamp_tz")return"timestamptz";if(l==="json")return"json"}return}function Qi(s){if(typeof s!=="string")return;switch(s.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 G(s,a){let l=gt(s),c=[];for(let E of Object.keys(s)){let x=s[E],D=T(x),_=x.primaryKey??"id",v=x.autoIncrement!==!1,k=x.attributes??{},Y=[],J=[];if(!k[_])Y.push({name:kt(_),type:"bigint",isPrimaryKey:!0,isUnique:!1,isNullable:!1,hasDefault:!1});let z=new Map,Me=O(x.belongsTo).length>0,Ke=new Set(Object.keys(k).map((Ie)=>kt(Ie))),Pe=new Set;for(let Ie of Ke){if(!Ie.endsWith("_type"))continue;let Qe=`${Ie.slice(0,-5)}_id`;if(Ke.has(Qe))Pe.add(Qe)}for(let Ie of O(x.belongsTo)){let Qe=Ie.foreignKey??`${kt(Ie.model)}_id`,ze=l.modelToTable[Ie.model];if(ze)z.set(Qe,{table:ze,onDelete:Ie.onDelete})}for(let Ie of Object.keys(k)){let Qe=k[Ie],ze=kt(Ie),et=Boolean(Qe.validation?.rule?.isRequired),Rt=Ie===_?!1:Qe.nullable??!(Qe.required??et),Ne,_e,Ge=Ie===_;if(Ne=Qi(Qe.type)??Yi(Qe.validation?.rule),Ne==="string"){let Xe=Nn(Qe.validation?.rule);if(Xe&&Xe>_n)Ne="text"}if(!Ne||Ne==="enum"){let Xe=ji(Qe.validation?.rule);if(Xe&&Xe.length>0)Ne="enum",_e=Xe}if(!Ne)Ne=br(ze);if(!Ne){let Xe=hr(Qe.default);if(typeof Xe==="string")Ne=Xe.length>255?"text":"string";else if(typeof Xe==="number")Ne=Number.isInteger(Xe)?"integer":"float";else if(typeof Xe==="boolean")Ne="boolean";else if(typeof Xe==="bigint")Ne="bigint";else if(Xe instanceof Date)Ne="datetime"}if(!Ne)Ne=Ge?"bigint":"string";let it=Ne==="string"?Nn(Qe.validation?.rule):void 0,vt={name:ze,type:Ne,isPrimaryKey:Ge,isUnique:Boolean(Qe.unique),isNullable:Rt,hasDefault:typeof Qe.default<"u",defaultValue:hr(Qe.default),enumValues:_e,maxLength:typeof it==="number"&&it>0&&it<=_n?it:void 0};if(ze.endsWith("_id")&&Qe.foreignKey!==!1&&!Pe.has(ze))if(typeof Qe.foreignKey==="object"&&Qe.foreignKey!==null){let Xe=Qe.foreignKey;if(vt.references={table:Xe.table,column:Xe.column??"id",onDelete:Xe.onDelete,onUpdate:Xe.onUpdate},Xe.nullable!==void 0)vt.isNullable=Xe.nullable}else{let Xe=z.get(ze),rt=ze.replace(/_id$/,"").replace(/(^|_)([a-z])/g,(On,Ji,Mr)=>Mr.toUpperCase()),sn=Xe?.table??(Me?void 0:l.modelToTable[rt]);if(sn){let On=l.primaryKeys[sn]??"id";vt.references={table:sn,column:On,onDelete:Xe?.onDelete}}}Y.push(vt)}let Ye=O(x.belongsTo);for(let Ie of Ye){let Qe=Ie.foreignKey??`${kt(Ie.model)}_id`;if(Y.some((Rt)=>Rt.name===Qe))continue;let ze=l.modelToTable[Ie.model],et=ze?l.primaryKeys[ze]??"id":void 0;Y.push({name:Qe,type:"bigint",isPrimaryKey:!1,isUnique:!1,isNullable:!0,hasDefault:!1,references:ze&&et&&!Pe.has(Qe)?{table:ze,column:et,onDelete:Ie.onDelete}:void 0})}let Ae=x.traits;if(Ae?.useTimestamps??Ae?.timestampable??!1){if(!Y.some((Ie)=>Ie.name==="created_at"))Y.push({name:"created_at",type:"datetime",isPrimaryKey:!1,isUnique:!1,isNullable:!1,hasDefault:!0,defaultValue:y});if(!Y.some((Ie)=>Ie.name==="updated_at"))Y.push({name:"updated_at",type:"datetime",isPrimaryKey:!1,isUnique:!1,isNullable:!0,hasDefault:!1})}if(Ae?.useSoftDeletes??Ae?.softDeletable??!1){if(!Y.some((Ie)=>Ie.name==="deleted_at"))Y.push({name:"deleted_at",type:"datetime",isPrimaryKey:!1,isUnique:!1,isNullable:!0,hasDefault:!1})}if(Ae?.useUuid??!1){if(!Y.some((Ie)=>Ie.name==="uuid"))Y.push({name:"uuid",type:"string",isPrimaryKey:!1,isUnique:!0,isNullable:!0,hasDefault:!1})}for(let Ie of x.indexes??[])J.push({name:Ie.name,columns:Ie.columns.map((Qe)=>kt(Qe)),type:Ie.unique?"unique":"index",where:Ie.where});for(let Ie of Y)if(Ie.isUnique&&!Ie.isPrimaryKey)J.push({name:`${D}_${Ie.name}_unique`,columns:[Ie.name],type:"unique"});let nt=Array.isArray(x.shardKey)?x.shardKey.map(kt):void 0,Fe=Array.isArray(x.sortKey)?x.sortKey.map(kt):void 0,je=x.tableKind;c.push({table:D,columns:Y,indexes:J,shardKey:nt,sortKey:Fe,tableKind:je})}let f=new Set(c.map((E)=>E.table));function b(E){if(!f.has(E.table))f.add(E.table),c.push(E)}for(let E of Object.keys(s)){let x=s[E],D=x?.traits??{},_=T(x),v=gn(_);if(D.likeable){let k=typeof D.likeable==="object"?D.likeable:{},Y=k.table||`${_}_likes`,J=k.foreignKey||`${v}_id`;b({table:Y,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:J,type:"bigint",isPrimaryKey:!1,isUnique:!1,isNullable:!1,hasDefault:!1,references:{table:_,column:"id"}},{name:"created_at",type:"datetime",isPrimaryKey:!1,isUnique:!1,isNullable:!1,hasDefault:!0,defaultValue:y},{name:"updated_at",type:"datetime",isPrimaryKey:!1,isUnique:!1,isNullable:!0,hasDefault:!1}],indexes:[{name:`${Y}_user_target_unique`,columns:["user_id",J],type:"unique"}]})}if(D.taggable)b({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:y},{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"}]}),b({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:y},{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(D.categorizable)b({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:y},{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"}]}),b({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:y},{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 E of Object.keys(s)){let x=s[E],D=x?.belongsToMany;if(!D||typeof D!=="object"||Array.isArray(D))continue;let _=T(x),v=gn(_);for(let[k,Y]of Object.entries(D)){let J=Y;if(!J||typeof J!=="object")continue;if(J.through)continue;let z=J.pivot;if(!z||!z.columns&&!z.timestamps&&!z.uniques)continue;let Me=J.model,Pe=s[Me]?.table||`${String(Me).toLowerCase()}s`,Ye=gn(Pe),Ae=J.table||[v,Ye].sort().join("_"),Je=J.foreignKey||`${v}_id`,Mt=J.relatedKey||`${Ye}_id`,Ze=new Set([Je,Mt,...Object.keys(z.columns??{})]),nt=new Set;for(let ze of Ze){if(!ze.endsWith("_type"))continue;let et=`${ze.slice(0,-5)}_id`;if(Ze.has(et))nt.add(et)}let Fe=(ze,et)=>nt.has(ze)?void 0:{table:et,column:"id"},je=[{name:"id",type:"bigint",isPrimaryKey:!0,isUnique:!1,isNullable:!1,hasDefault:!1},{name:Je,type:"bigint",isPrimaryKey:!1,isUnique:!1,isNullable:!1,hasDefault:!1,references:Fe(Je,_)},{name:Mt,type:"bigint",isPrimaryKey:!1,isUnique:!1,isNullable:!1,hasDefault:!1,references:Fe(Mt,Pe)}];if(z.columns)for(let[ze,et]of Object.entries(z.columns)){let Rt=et,Ne=br(ze)??"string";je.push({name:ze,type:Ne,isPrimaryKey:!1,isUnique:!1,isNullable:Rt?.nullable??!1,hasDefault:Rt?.default!==void 0,defaultValue:Rt?.default})}if(z.timestamps)je.push({name:"created_at",type:"datetime",isPrimaryKey:!1,isUnique:!1,isNullable:!1,hasDefault:!0,defaultValue:y}),je.push({name:"updated_at",type:"datetime",isPrimaryKey:!1,isUnique:!1,isNullable:!0,hasDefault:!1});let Ie=[],Qe=z.uniques&&z.uniques.length>0?z.uniques:[[Je,Mt]];for(let ze=0;ze<Qe.length;ze++){let et=Qe[ze];Ie.push({name:`${Ae}_${et.join("_")}_unique${ze>0?`_${ze}`:""}`,columns:[...et],type:"unique"})}b({table:Ae,columns:je,indexes:Ie})}}let p=new Map(c.map((E)=>[E.table,E]));for(let E of c)for(let x of E.columns){if(!x.references)continue;let D=p.get(x.references.table)?.columns.find((_)=>_.name===x.references.column);if(!D||x.type===D.type)continue;x.type=D.type,x.maxLength=D.maxLength,x.enumValues=D.enumValues,x.enumTypeName=D.enumTypeName}return{dialect:a.dialect,vitessSharded:a.vitessSharded,tables:c}}function ke(s,a={}){zt=0,$t=0,It=0,rn=[],Lt=null,nn=!0;let l=a.dryRun?()=>!1:Dr,c=[],f=h(s.dialect,{vitessSharded:s.vitessSharded}),{tables:b,deferredForeignKeys:p}=Rr(s.tables,s.dialect);for(let[x,D]of b.entries()){let _={...D,columns:D.columns.map((z)=>p.has(Kt(D.table,z.name))?{...z,references:void 0}:z)},v=[],k=new Set;for(let z of _.columns)if(z.type==="enum"&&z.enumValues&&z.enumValues.length>0){let Me=`${_.table}_${z.name}_type`;if(z.enumTypeName=Me,!k.has(Me)){let Ke=f.createEnumType(Me,z.enumValues);if(Ke)v.push(Ke);k.add(Me)}}let Y=f.createTable(_);v.push(Y);for(let z of _.indexes)v.push(f.createIndex(_.table,z,_.columns));if(x===b.length-1)for(let z of b)for(let Me of z.columns){if(!Me.references||!p.has(Kt(z.table,Me.name)))continue;let Ke=f.addForeignKey(z.table,Me.name,Me.references.table,Me.references.column,Me.references.onDelete,Me.references.onUpdate);if(Ke)v.push(Ke)}c.push(...v);let J=v.join(`
374
375
 
375
- `);l(J,`create-${_.table}-table`)}if($t+It===0)xt("-- Nothing to migrate");else{let x=[];if($t>0)x.push(`${$t} created`);if(It>0)x.push(`${It} updated`);xt(`-- Migration files: ${x.join(", ")}`)}return c}function Kt(s,a){return`${s}\x00${a}`}function mr(s,a){if(a==="sqlite"||s.length<2)return{tables:s,deferredForeignKeys:new Set};let l=new Map(s.map((x)=>[x.table,x])),c=new Map;for(let x of s)c.set(x.table,new Set(x.columns.map((D)=>D.references?.table).filter((D)=>Boolean(D&&D!==x.table&&l.has(D)))));let f=[],b=new Set;while(f.length<s.length){let x=s.find((D)=>!b.has(D.table)&&[...c.get(D.table)??[]].every((_)=>b.has(_)));if(!x)break;f.push(x),b.add(x.table)}let p=new Set(s.filter((x)=>!b.has(x.table)).map((x)=>x.table)),E=new Set;for(let x of s){if(!p.has(x.table))continue;for(let D of x.columns)if(D.references&&p.has(D.references.table)&&D.references.table!==x.table)E.add(Kt(x.table,D.name))}return f.push(...s.filter((x)=>p.has(x.table))),{tables:f,deferredForeignKeys:E}}function Cn(s){return ke(s).join(`
376
+ `);l(J,`create-${_.table}-table`)}if($t+It===0)xt("-- Nothing to migrate");else{let x=[];if($t>0)x.push(`${$t} created`);if(It>0)x.push(`${It} updated`);xt(`-- Migration files: ${x.join(", ")}`)}return c}function Kt(s,a){return`${s}\x00${a}`}function Rr(s,a){if(a==="sqlite"||s.length<2)return{tables:s,deferredForeignKeys:new Set};let l=new Map(s.map((x)=>[x.table,x])),c=new Map;for(let x of s)c.set(x.table,new Set(x.columns.map((D)=>D.references?.table).filter((D)=>Boolean(D&&D!==x.table&&l.has(D)))));let f=[],b=new Set;while(f.length<s.length){let x=s.find((D)=>!b.has(D.table)&&[...c.get(D.table)??[]].every((_)=>b.has(_)));if(!x)break;f.push(x),b.add(x.table)}let p=new Set(s.filter((x)=>!b.has(x.table)).map((x)=>x.table)),E=new Set;for(let x of s){if(!p.has(x.table))continue;for(let D of x.columns)if(D.references&&p.has(D.references.table)&&D.references.table!==x.table)E.add(Kt(x.table,D.name))}return f.push(...s.filter((x)=>p.has(x.table))),{tables:f,deferredForeignKeys:E}}function Cn(s){return ke(s).join(`
376
377
  `)}function Rn(s,a){return Vt(s,a).join(`
377
- `)}function wt(s){let a=Ar("crypto");function l(f){if(f==null||typeof f!=="object"||f instanceof Date)return f;if(Array.isArray(f))return f.map((p)=>l(p));let b={};for(let p of Object.keys(f).sort())b[p]=l(f[p]);return b}let c=JSON.stringify(l(s));return a.createHash("sha256").update(c).digest("hex")}function lr(s){let a={};for(let l of s)a[l.table]=l;return a}function jt(s){let a={};for(let l of s)a[l.name]=l;return a}function Ue(s,a){if(a==="sqlite"){if(s.name.endsWith("_id")&&N(s.type))return"INTEGER";switch(s.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(a==="mysql"||a==="vitess"||a==="singlestore")switch(s.type){case"string":return`VARCHAR(${s.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 s.type}return s.type}var y="UTC_TIMESTAMP";function Ve(s,a){if(!s.hasDefault||s.defaultValue===void 0)return;let l=s.defaultValue;if(l instanceof Date)return l.toISOString();if(typeof l==="boolean")return l?"1":"0";if(typeof l==="bigint"||typeof l==="number")return String(l);let c=String(l).trim();if(c=c.replace(/::[\w ]+$/i,"").trim(),c.startsWith("'")&&c.endsWith("'")||c.startsWith('"')&&c.endsWith('"'))c=c.slice(1,-1);let f=c.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(f.replace(/\s+/g," ")))return y;if(a==="sqlite"&&f==="CURRENT_TIMESTAMP")return y;if(["CURRENT_TIMESTAMP","NOW()","CURRENT_DATE","CURRENT_TIME","NULL","TRUE","FALSE"].includes(f))return f==="NOW()"?"CURRENT_TIMESTAMP":f;if(s.type==="boolean"){if(/^(?:1|t|true|yes)$/i.test(c))return"1";if(/^(?:0|f|false|no)$/i.test(c))return"0"}if(/^-?\d+(?:\.\d+)?$/.test(c))return String(Number(c));return c}function Pi(s,a,l){if(Ue(s,l)!==Ue(a,l))return!0;if(s.isNullable!==a.isNullable)return!0;if(s.hasDefault!==a.hasDefault)return!0;if(Ve(s,l)!==Ve(a,l))return!0;if(s.isUnique!==a.isUnique)return!0;if(s.type==="enum"&&a.type==="enum"){let c=(s.enumValues||[]).slice().sort().join(","),f=(a.enumValues||[]).slice().sort().join(",");if(c!==f)return!0}return!1}function ur(s,a){return JSON.stringify([Ue(s,a),s.isPrimaryKey,s.isUnique,s.isNullable,s.hasDefault,Ve(s,a)??null,(s.enumValues??[]).slice().sort(),s.references?[s.references.table,s.references.column,s.references.onDelete??null,s.references.onUpdate??null]:null])}function ki(s,a,l){let c=Object.keys(s).filter((_)=>!a[_]),f=Object.keys(a).filter((_)=>!s[_]),b=new Map,p=new Map;for(let _ of c){let v=ur(s[_],l),k=b.get(v)??[];k.push(_),b.set(v,k)}for(let _ of f){let v=ur(a[_],l),k=p.get(v)??[];k.push(_),p.set(v,k)}let E=[],x=new Set,D=new Set;for(let[_,v]of b){let k=p.get(_);if(v.length===1&&k&&k.length===1)E.push({from:v[0],to:k[0]}),x.add(v[0]),D.add(k[0])}return{renames:E,removed:c.filter((_)=>!x.has(_)),added:f.filter((_)=>!D.has(_))}}function Ii(s){if(!s?.references||!s.hasDefault)return!1;let a=s.defaultValue;return a!==void 0&&a!==null&&String(a).toUpperCase()!=="NULL"}function Oi(s,a){let l=s.columns.find((c)=>c.name===a);if(l&&(l.isPrimaryKey||l.isUnique||l.references))return!0;return s.indexes.some((c)=>c.columns.includes(a))}function qi(s,a){if(Boolean(s)!==Boolean(a))return!0;if(!s||!a)return!1;if((s.constraintNames?.length??0)>1)return!0;let l=(c)=>(c??"no action").toLowerCase();return s.table!==a.table||s.column!==a.column||l(s.onDelete)!==l(a.onDelete)||l(s.onUpdate)!==l(a.onUpdate)}function fr(s,a){return`${s.type}:${Ct(a,s.name)}:${s.columns.join(",")}`}function fn(s,a){let l={};for(let c of s)l[fr(c,a)]=c;return l}function He(s,a,l={}){if(!s||s.dialect!==a.dialect){let Pe=ke(a,{dryRun:l.dryRun}),Ye=a.tables.map((Ae)=>({kind:"create_table",table:Ae.table,destructive:!1,sql:""}));return{statements:Pe,operations:Ye}}let c=l.applyRenames!==!1,f=l.preserveUnknownColumns===!0,b=l.dryRun?()=>!1:dr;Yt=0,$t=0,It=0,nn=[],Lt=null,tn=!1;let p=[],E=[],x=h(a.dialect,{vitessSharded:a.vitessSharded}),D=a.dialect,_=lr(s.tables),v=lr(a.tables);for(let Pe of Object.keys(_))if(!v[Pe]){let Ye=x.dropTable(Pe);p.push(Ye),E.push({kind:"drop_table",table:Pe,destructive:!0,sql:Ye}),b(Ye,`drop-${Pe}-table`),xt(`-- Detected dropped table: ${Pe}`)}let k=Object.keys(v).filter((Pe)=>!_[Pe]).map((Pe)=>v[Pe]),{tables:Y,deferredForeignKeys:J}=mr(k,D);for(let[Pe,Ye]of Y.entries()){let Ae={...Ye,columns:Ye.columns.map((Fe)=>J.has(Kt(Ye.table,Fe.name))?{...Fe,references:void 0}:Fe)},Je=[],Mt=new Set;for(let Fe of Ae.columns)if(Fe.type==="enum"&&Fe.enumValues&&Fe.enumValues.length>0){let je=`${Ae.table}_${Fe.name}_type`;if(Fe.enumTypeName=je,!Mt.has(je)){let Ie=x.createEnumType(je,Fe.enumValues);if(Ie)Je.push(Ie);Mt.add(je)}}let Ze=x.createTable(Ae);Je.push(Ze);for(let Fe of Ae.indexes){let je=x.createIndex(Ae.table,Fe,Ae.columns);Je.push(je),E.push({kind:"create_index",table:Ae.table,column:Fe.name,destructive:!1,sql:je})}for(let Fe of Ye.columns)if(Fe.references&&!J.has(Kt(Ye.table,Fe.name)))E.push({kind:"add_foreign_key",table:Ye.table,column:Fe.name,destructive:!1,sql:Ze});if(Pe===Y.length-1)for(let Fe of Y)for(let je of Fe.columns){if(!je.references||!J.has(Kt(Fe.table,je.name)))continue;let Ie=x.addForeignKey(Fe.table,je.name,je.references.table,je.references.column,je.references.onDelete,je.references.onUpdate);if(!Ie)continue;Je.push(Ie),E.push({kind:"add_foreign_key",table:Fe.table,column:je.name,destructive:!1,sql:Ie})}p.push(...Je),E.push({kind:"create_table",table:Ae.table,destructive:!1,sql:Ze});let nt=Je.join(`
378
+ `)}function wt(s){let a=Ar("crypto");function l(f){if(f==null||typeof f!=="object"||f instanceof Date)return f;if(Array.isArray(f))return f.map((p)=>l(p));let b={};for(let p of Object.keys(f).sort())b[p]=l(f[p]);return b}let c=JSON.stringify(l(s));return a.createHash("sha256").update(c).digest("hex")}function Tr(s){let a={};for(let l of s)a[l.table]=l;return a}function Yt(s){let a={};for(let l of s)a[l.name]=l;return a}function Ue(s,a){if(a==="sqlite"){if(s.name.endsWith("_id")&&N(s.type))return"INTEGER";switch(s.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(a==="mysql"||a==="vitess"||a==="singlestore")switch(s.type){case"string":return`VARCHAR(${s.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 s.type}return s.type}var y="UTC_TIMESTAMP";function Ve(s,a){if(!s.hasDefault||s.defaultValue===void 0)return;let l=s.defaultValue;if(l instanceof Date)return l.toISOString();if(typeof l==="boolean")return l?"1":"0";if(typeof l==="bigint"||typeof l==="number")return String(l);let c=String(l).trim();if(c=c.replace(/::[\w ]+$/i,"").trim(),c.startsWith("'")&&c.endsWith("'")||c.startsWith('"')&&c.endsWith('"'))c=c.slice(1,-1);let f=c.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(f.replace(/\s+/g," ")))return y;if(a==="sqlite"&&f==="CURRENT_TIMESTAMP")return y;if(["CURRENT_TIMESTAMP","NOW()","CURRENT_DATE","CURRENT_TIME","NULL","TRUE","FALSE"].includes(f))return f==="NOW()"?"CURRENT_TIMESTAMP":f;if(s.type==="boolean"){if(/^(?:1|t|true|yes)$/i.test(c))return"1";if(/^(?:0|f|false|no)$/i.test(c))return"0"}if(/^-?\d+(?:\.\d+)?$/.test(c))return String(Number(c));return c}function Wi(s,a,l){if(Ue(s,l)!==Ue(a,l))return!0;if(s.isNullable!==a.isNullable)return!0;if(s.hasDefault!==a.hasDefault)return!0;if(Ve(s,l)!==Ve(a,l))return!0;if(s.isUnique!==a.isUnique)return!0;if(s.type==="enum"&&a.type==="enum"){let c=(s.enumValues||[]).slice().sort().join(","),f=(a.enumValues||[]).slice().sort().join(",");if(c!==f)return!0}return!1}function xr(s,a){return JSON.stringify([Ue(s,a),s.isPrimaryKey,s.isUnique,s.isNullable,s.hasDefault,Ve(s,a)??null,(s.enumValues??[]).slice().sort(),s.references?[s.references.table,s.references.column,s.references.onDelete??null,s.references.onUpdate??null]:null])}function Gi(s,a,l){let c=Object.keys(s).filter((_)=>!a[_]),f=Object.keys(a).filter((_)=>!s[_]),b=new Map,p=new Map;for(let _ of c){let v=xr(s[_],l),k=b.get(v)??[];k.push(_),b.set(v,k)}for(let _ of f){let v=xr(a[_],l),k=p.get(v)??[];k.push(_),p.set(v,k)}let E=[],x=new Set,D=new Set;for(let[_,v]of b){let k=p.get(_);if(v.length===1&&k&&k.length===1)E.push({from:v[0],to:k[0]}),x.add(v[0]),D.add(k[0])}return{renames:E,removed:c.filter((_)=>!x.has(_)),added:f.filter((_)=>!D.has(_))}}function zi(s){if(!s?.references||!s.hasDefault)return!1;let a=s.defaultValue;return a!==void 0&&a!==null&&String(a).toUpperCase()!=="NULL"}function Hi(s,a){let l=s.columns.find((c)=>c.name===a);if(l&&(l.isPrimaryKey||l.isUnique||l.references))return!0;return s.indexes.some((c)=>c.columns.includes(a))}function Xi(s,a){if(Boolean(s)!==Boolean(a))return!0;if(!s||!a)return!1;if((s.constraintNames?.length??0)>1)return!0;let l=(c)=>(c??"no action").toLowerCase();return s.table!==a.table||s.column!==a.column||l(s.onDelete)!==l(a.onDelete)||l(s.onUpdate)!==l(a.onUpdate)}function Sr(s,a){return`${s.type}:${Ct(a,s.name)}:${s.columns.join(",")}`}function hn(s,a){let l={};for(let c of s)l[Sr(c,a)]=c;return l}function He(s,a,l={}){if(!s||s.dialect!==a.dialect){let Pe=ke(a,{dryRun:l.dryRun}),Ye=a.tables.map((Ae)=>({kind:"create_table",table:Ae.table,destructive:!1,sql:""}));return{statements:Pe,operations:Ye}}let c=l.applyRenames!==!1,f=l.preserveUnknownColumns===!0,b=l.dryRun?()=>!1:Dr;zt=0,$t=0,It=0,rn=[],Lt=null,nn=!1;let p=[],E=[],x=h(a.dialect,{vitessSharded:a.vitessSharded}),D=a.dialect,_=Tr(s.tables),v=Tr(a.tables);for(let Pe of Object.keys(_))if(!v[Pe]){let Ye=x.dropTable(Pe);p.push(Ye),E.push({kind:"drop_table",table:Pe,destructive:!0,sql:Ye}),b(Ye,`drop-${Pe}-table`),xt(`-- Detected dropped table: ${Pe}`)}let k=Object.keys(v).filter((Pe)=>!_[Pe]).map((Pe)=>v[Pe]),{tables:Y,deferredForeignKeys:J}=Rr(k,D);for(let[Pe,Ye]of Y.entries()){let Ae={...Ye,columns:Ye.columns.map((Fe)=>J.has(Kt(Ye.table,Fe.name))?{...Fe,references:void 0}:Fe)},Je=[],Mt=new Set;for(let Fe of Ae.columns)if(Fe.type==="enum"&&Fe.enumValues&&Fe.enumValues.length>0){let je=`${Ae.table}_${Fe.name}_type`;if(Fe.enumTypeName=je,!Mt.has(je)){let Ie=x.createEnumType(je,Fe.enumValues);if(Ie)Je.push(Ie);Mt.add(je)}}let Ze=x.createTable(Ae);Je.push(Ze);for(let Fe of Ae.indexes){let je=x.createIndex(Ae.table,Fe,Ae.columns);Je.push(je),E.push({kind:"create_index",table:Ae.table,column:Fe.name,destructive:!1,sql:je})}for(let Fe of Ye.columns)if(Fe.references&&!J.has(Kt(Ye.table,Fe.name)))E.push({kind:"add_foreign_key",table:Ye.table,column:Fe.name,destructive:!1,sql:Ze});if(Pe===Y.length-1)for(let Fe of Y)for(let je of Fe.columns){if(!je.references||!J.has(Kt(Fe.table,je.name)))continue;let Ie=x.addForeignKey(Fe.table,je.name,je.references.table,je.references.column,je.references.onDelete,je.references.onUpdate);if(!Ie)continue;Je.push(Ie),E.push({kind:"add_foreign_key",table:Fe.table,column:je.name,destructive:!1,sql:Ie})}p.push(...Je),E.push({kind:"create_table",table:Ae.table,destructive:!1,sql:Ze});let nt=Je.join(`
378
379
 
379
- `);b(nt,`create-${Ae.table}-table`)}let z=new Set;for(let Pe of Object.keys(v)){let Ye=_[Pe],Ae=v[Pe];if(!Ye)continue;let Je=jt(Ye.columns),Mt=jt(Ae.columns);for(let Ze of Object.keys(Mt)){let nt=Mt[Ze];if(nt.type!=="enum"||!nt.enumValues||nt.enumValues.length===0)continue;let Fe=`${Ae.table}_${nt.name}_type`;if(nt.enumTypeName=Fe,Je[Ze])continue;if(!z.has(Fe)){let je=x.createEnumType(Fe,nt.enumValues);if(je)p.push(je),E.push({kind:"create_enum",table:Ae.table,column:nt.name,destructive:!1,sql:je}),b(je,`create-${Fe}-enum`);z.add(Fe)}}}for(let Pe of Object.keys(v)){let Ye=_[Pe],Ae=v[Pe];if(!Ye)continue;let Je=jt(Ye.columns),Mt=fn(Ye.indexes,Ye.table),Ze=jt(Ae.columns),nt=fn(Ae.indexes,Ae.table),Fe=[],je=Object.keys(Je).filter((Ne)=>!Ze[Ne]),Ie=Object.keys(Ze).filter((Ne)=>!Je[Ne]);if(c&&!f){let Ne=ki(Je,Ze,D);Fe=Ne.renames,je=Ne.removed,Ie=Ne.added}if(f){let Ne=je.map((Ge)=>Je[Ge]),_e=Ye.indexes.filter((Ge)=>!nt[fr(Ge,Ye.table)]);if(Ne.length>0||_e.length>0){if(Ne.length>0)xt(`-- Keeping ${Ne.length} column(s) on "${Ae.table}" no model declares: ${je.join(", ")} \u2014 reconciled from the database, where an undeclared column is out of scope rather than removed`);if(_e.length>0)xt(`-- Keeping ${_e.length} index(es) on "${Ae.table}" no model declares: ${_e.map((Ge)=>Ge.name).join(", ")} \u2014 reconciled from the database, where an undeclared index is out of scope rather than removed`);Ae={...Ae,columns:[...Ae.columns,...Ne],indexes:[...Ae.indexes,..._e]},Ze=jt(Ae.columns),nt=fn(Ae.indexes,Ae.table)}je=[]}let Qe=Object.keys(Ze).filter((Ne)=>Je[Ne]&&Pi(Je[Ne],Ze[Ne],D)),ze=Object.keys(Ze).filter((Ne)=>Je[Ne]&&qi(Je[Ne].references,Ze[Ne].references));if(D==="sqlite"){if(Qe.length>0||ze.length>0||je.some((_e)=>Oi(Ye,_e))||Ie.some((_e)=>Ii(Ze[_e]))){let _e={},Ge=new Map(Fe.map((rt)=>[rt.to,rt.from]));for(let rt of Ae.columns)if(Je[rt.name])_e[rt.name]=rt.name;else if(Ge.has(rt.name))_e[rt.name]=Ge.get(rt.name);let it=`_qb_tmp_${Ae.table}`,vt=0;while((_[it]||v[it])&&vt<100)vt+=1,it=`_qb_tmp_${Ae.table}_${vt}`;let Xe=x.rebuildTable({target:Ae,tempName:it,columnSource:_e});p.push(Xe);let In=Qe.some((rt)=>Je[rt].type!==Ze[rt].type);E.push({kind:"rebuild_table",table:Ae.table,destructive:je.length>0||In,sql:Xe});for(let rt of Fe)E.push({kind:"rename_column",table:Ae.table,from:rt.from,to:rt.to,destructive:!1,confidence:"high",sql:Xe});for(let rt of je)E.push({kind:"drop_column",table:Ae.table,column:rt,destructive:!0,sql:Xe});xt(`-- Detected SQLite table rebuild required: ${Ae.table}`),b(Xe,`alter-${Ae.table}-table`);continue}}let et=[],Rt=!1;for(let Ne of Object.keys(Mt))if(!nt[Ne]){let _e=Mt[Ne],Ge=x.dropIndex(Ae.table,_e.name);et.push(Ge),p.push(Ge),E.push({kind:"drop_index",table:Ae.table,column:_e.name,destructive:!1,sql:Ge}),xt(`-- Detected dropped index: ${_e.name} from ${Ae.table}`),Rt=!0}for(let Ne of Fe){let _e=x.renameColumn(Ae.table,Ne.from,Ne.to);et.push(_e),p.push(_e),E.push({kind:"rename_column",table:Ae.table,from:Ne.from,to:Ne.to,destructive:!1,confidence:"high",sql:_e}),xt(`-- Detected renamed column: ${Ae.table}.${Ne.from} -> ${Ne.to}`),Rt=!0}for(let Ne of je){let _e=x.dropColumn(Ae.table,Ne);et.push(_e),p.push(_e),E.push({kind:"drop_column",table:Ae.table,column:Ne,destructive:!0,sql:_e}),xt(`-- Detected dropped column: ${Ae.table}.${Ne}`),Rt=!0}for(let Ne of Qe){let _e=Je[Ne],Ge=Ze[Ne],it=x.modifyColumn(Ae.table,Ge,_e);et.push(it),p.push(it),E.push({kind:"modify_column",table:Ae.table,column:Ne,destructive:_e.type!==Ge.type&&!Ut(_e.type,Ge.type),sql:it}),xt(`-- Detected column change: ${Ae.table}.${Ne} (${_e.type} -> ${Ge.type})`),Rt=!0}for(let Ne of ze){let _e=Ze[Ne];if(!_e.references)continue;let Ge=x.addForeignKey(Ae.table,_e.name,_e.references.table,_e.references.column,_e.references.onDelete,_e.references.onUpdate,Je[Ne].references?.constraintNames);if(!Ge)continue;et.push(Ge),p.push(Ge),E.push({kind:"add_foreign_key",table:Ae.table,column:Ne,destructive:!1,sql:Ge}),xt(`-- Detected foreign-key change: ${Ae.table}.${Ne} -> ${_e.references.table}(${_e.references.column})`),Rt=!0}for(let Ne of Ie){let _e=Ze[Ne],Ge=x.addColumn(Ae.table,_e);if(et.push(Ge),p.push(Ge),E.push({kind:"add_column",table:Ae.table,column:_e.name,destructive:!1,sql:Ge}),xt(`-- Detected new column: ${Ae.table}.${_e.name}`),Rt=!0,_e.references){let it=x.addForeignKey(Ae.table,_e.name,_e.references.table,_e.references.column,_e.references.onDelete,_e.references.onUpdate);if(it)et.push(it),p.push(it),E.push({kind:"add_foreign_key",table:Ae.table,column:_e.name,destructive:!1,sql:it})}}for(let Ne of Object.keys(nt))if(!Mt[Ne]){let _e=nt[Ne],Ge=x.createIndex(Ae.table,_e,Ae.columns);et.push(Ge),p.push(Ge),E.push({kind:"create_index",table:Ae.table,column:_e.name,destructive:!1,sql:Ge}),xt(`-- Detected new index: ${_e.name} in ${Ae.table}`),Rt=!0}if(Rt){let Ne=et.join(`
380
+ `);b(nt,`create-${Ae.table}-table`)}let z=new Set;for(let Pe of Object.keys(v)){let Ye=_[Pe],Ae=v[Pe];if(!Ye)continue;let Je=Yt(Ye.columns),Mt=Yt(Ae.columns);for(let Ze of Object.keys(Mt)){let nt=Mt[Ze];if(nt.type!=="enum"||!nt.enumValues||nt.enumValues.length===0)continue;let Fe=`${Ae.table}_${nt.name}_type`;if(nt.enumTypeName=Fe,Je[Ze])continue;if(!z.has(Fe)){let je=x.createEnumType(Fe,nt.enumValues);if(je)p.push(je),E.push({kind:"create_enum",table:Ae.table,column:nt.name,destructive:!1,sql:je}),b(je,`create-${Fe}-enum`);z.add(Fe)}}}for(let Pe of Object.keys(v)){let Ye=_[Pe],Ae=v[Pe];if(!Ye)continue;let Je=Yt(Ye.columns),Mt=hn(Ye.indexes,Ye.table),Ze=Yt(Ae.columns),nt=hn(Ae.indexes,Ae.table),Fe=[],je=Object.keys(Je).filter((Ne)=>!Ze[Ne]),Ie=Object.keys(Ze).filter((Ne)=>!Je[Ne]);if(c&&!f){let Ne=Gi(Je,Ze,D);Fe=Ne.renames,je=Ne.removed,Ie=Ne.added}if(f){let Ne=je.map((Ge)=>Je[Ge]),_e=Ye.indexes.filter((Ge)=>!nt[Sr(Ge,Ye.table)]);if(Ne.length>0||_e.length>0){if(Ne.length>0)xt(`-- Keeping ${Ne.length} column(s) on "${Ae.table}" no model declares: ${je.join(", ")} \u2014 reconciled from the database, where an undeclared column is out of scope rather than removed`);if(_e.length>0)xt(`-- Keeping ${_e.length} index(es) on "${Ae.table}" no model declares: ${_e.map((Ge)=>Ge.name).join(", ")} \u2014 reconciled from the database, where an undeclared index is out of scope rather than removed`);Ae={...Ae,columns:[...Ae.columns,...Ne],indexes:[...Ae.indexes,..._e]},Ze=Yt(Ae.columns),nt=hn(Ae.indexes,Ae.table)}je=[]}let Qe=Object.keys(Ze).filter((Ne)=>Je[Ne]&&Wi(Je[Ne],Ze[Ne],D)),ze=Object.keys(Ze).filter((Ne)=>Je[Ne]&&Xi(Je[Ne].references,Ze[Ne].references));if(D==="sqlite"){if(Qe.length>0||ze.length>0||je.some((_e)=>Hi(Ye,_e))||Ie.some((_e)=>zi(Ze[_e]))){let _e={},Ge=new Map(Fe.map((rt)=>[rt.to,rt.from]));for(let rt of Ae.columns)if(Je[rt.name])_e[rt.name]=rt.name;else if(Ge.has(rt.name))_e[rt.name]=Ge.get(rt.name);let it=`_qb_tmp_${Ae.table}`,vt=0;while((_[it]||v[it])&&vt<100)vt+=1,it=`_qb_tmp_${Ae.table}_${vt}`;let Xe=x.rebuildTable({target:Ae,tempName:it,columnSource:_e});p.push(Xe);let In=Qe.some((rt)=>Je[rt].type!==Ze[rt].type);E.push({kind:"rebuild_table",table:Ae.table,destructive:je.length>0||In,sql:Xe});for(let rt of Fe)E.push({kind:"rename_column",table:Ae.table,from:rt.from,to:rt.to,destructive:!1,confidence:"high",sql:Xe});for(let rt of je)E.push({kind:"drop_column",table:Ae.table,column:rt,destructive:!0,sql:Xe});xt(`-- Detected SQLite table rebuild required: ${Ae.table}`),b(Xe,`alter-${Ae.table}-table`);continue}}let et=[],Rt=!1;for(let Ne of Object.keys(Mt))if(!nt[Ne]){let _e=Mt[Ne],Ge=x.dropIndex(Ae.table,_e.name);et.push(Ge),p.push(Ge),E.push({kind:"drop_index",table:Ae.table,column:_e.name,destructive:!1,sql:Ge}),xt(`-- Detected dropped index: ${_e.name} from ${Ae.table}`),Rt=!0}for(let Ne of Fe){let _e=x.renameColumn(Ae.table,Ne.from,Ne.to);et.push(_e),p.push(_e),E.push({kind:"rename_column",table:Ae.table,from:Ne.from,to:Ne.to,destructive:!1,confidence:"high",sql:_e}),xt(`-- Detected renamed column: ${Ae.table}.${Ne.from} -> ${Ne.to}`),Rt=!0}for(let Ne of je){let _e=x.dropColumn(Ae.table,Ne);et.push(_e),p.push(_e),E.push({kind:"drop_column",table:Ae.table,column:Ne,destructive:!0,sql:_e}),xt(`-- Detected dropped column: ${Ae.table}.${Ne}`),Rt=!0}for(let Ne of Qe){let _e=Je[Ne],Ge=Ze[Ne],it=x.modifyColumn(Ae.table,Ge,_e);et.push(it),p.push(it),E.push({kind:"modify_column",table:Ae.table,column:Ne,destructive:_e.type!==Ge.type&&!Ut(_e.type,Ge.type),sql:it}),xt(`-- Detected column change: ${Ae.table}.${Ne} (${_e.type} -> ${Ge.type})`),Rt=!0}for(let Ne of ze){let _e=Ze[Ne];if(!_e.references)continue;let Ge=x.addForeignKey(Ae.table,_e.name,_e.references.table,_e.references.column,_e.references.onDelete,_e.references.onUpdate,Je[Ne].references?.constraintNames);if(!Ge)continue;et.push(Ge),p.push(Ge),E.push({kind:"add_foreign_key",table:Ae.table,column:Ne,destructive:!1,sql:Ge}),xt(`-- Detected foreign-key change: ${Ae.table}.${Ne} -> ${_e.references.table}(${_e.references.column})`),Rt=!0}for(let Ne of Ie){let _e=Ze[Ne],Ge=x.addColumn(Ae.table,_e);if(et.push(Ge),p.push(Ge),E.push({kind:"add_column",table:Ae.table,column:_e.name,destructive:!1,sql:Ge}),xt(`-- Detected new column: ${Ae.table}.${_e.name}`),Rt=!0,_e.references){let it=x.addForeignKey(Ae.table,_e.name,_e.references.table,_e.references.column,_e.references.onDelete,_e.references.onUpdate);if(it)et.push(it),p.push(it),E.push({kind:"add_foreign_key",table:Ae.table,column:_e.name,destructive:!1,sql:it})}}for(let Ne of Object.keys(nt))if(!Mt[Ne]){let _e=nt[Ne],Ge=x.createIndex(Ae.table,_e,Ae.columns);et.push(Ge),p.push(Ge),E.push({kind:"create_index",table:Ae.table,column:_e.name,destructive:!1,sql:Ge}),xt(`-- Detected new index: ${_e.name} in ${Ae.table}`),Rt=!0}if(Rt){let Ne=et.join(`
380
381
 
381
382
  `);b(Ne,`alter-${Ae.table}-table`)}}if($t+It===0)xt("-- Nothing to migrate");else{let Pe=[];if($t>0)Pe.push(`${$t} created`);if(It>0)Pe.push(`${It} updated`);xt(`-- Migration files: ${Pe.join(", ")}`)}return{statements:p.length===0?["-- No changes detected"]:p,operations:E}}function Vt(s,a,l={}){return He(s,a,l).statements}function An(s){return s}class Ht{get order(){return 100}get description(){return}}function Mn(s){return s}function St(s){switch(s){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 Dt(s){let a=String(s??"").toLowerCase().trim();if(/^(?:bool|boolean|bit)\b/.test(a)||a==="tinyint(1)")return"boolean";if(/^(?:json|jsonb)\b/.test(a))return"json";if(/^(?:bytea|blob|binary|varbinary)\b/.test(a))return"binary";if(/^(?:date|time|timestamp|datetime)\b/.test(a))return"date";if(/(?:^|\b)(?:varchar|character varying|nvarchar|char)\b/.test(a))return"varchar";if(/^(?:text|longtext|mediumtext|tinytext|clob|citext)\b/.test(a))return"text";if(/^(?:decimal|numeric|real|double|money)\b/.test(a)||/^float\d*\b/.test(a))return"fractional";if(/^(?:integer|bigint|smallint|tinyint|serial|bigserial|smallserial|mediumint)\b/.test(a)||/^int\d*\b/.test(a))return"integer";return"other"}function Et(s,a,l){if(s===a)return!0;if(l==="sqlite"){if(s==="boolean"&&a==="integer")return!0;if((s==="date"||s==="json")&&a==="text")return!0}if(n(l)&&s==="boolean"&&a==="integer")return!0;if(s==="varchar"&&a==="text")return!0;if(s==="integer"&&a==="fractional")return!0;if(s==="other"||a==="other")return!0;return!1}async function Qt(s,a={}){let l=a.dialect??e.dialect,c=s.tables.map((D)=>D.table),f=await C({tables:c}),b=new Map(f.map((D)=>[D.table.toLowerCase(),D])),p=[],E=[],x=[];for(let D of s.tables){let _=b.get(D.table.toLowerCase());if(!_){p.push(D.table);continue}let v=new Map(_.columns.map((k)=>[k.name.toLowerCase(),k]));for(let k of D.columns){let Y=v.get(k.name.toLowerCase()),J=St(k.type);if(!Y){E.push({table:D.table,column:k.name,expected:J});continue}let z=Dt(Y.sqlType);if(!Et(J,z,l))x.push({table:D.table,column:k.name,expected:J,actual:z,actualSqlType:Y.sqlType})}}return{missingTables:p,missingColumns:E,typeMismatches:x,clean:p.length===0&&E.length===0&&x.length===0}}function Gt(s){if(s.clean)return"";let a=[];if(s.missingTables.length>0)a.push(` Missing tables: ${s.missingTables.join(", ")}`);for(let f of s.missingColumns.slice(0,10))a.push(` \u2022 ${f.table}.${f.column} is missing (models declare ${f.expected})`);for(let f of s.typeMismatches.slice(0,10))a.push(` \u2022 ${f.table}.${f.column} is ${f.actualSqlType}, models declare ${f.expected}`);let l=Math.min(s.missingColumns.length,10)+Math.min(s.typeMismatches.length,10),c=s.missingColumns.length+s.typeMismatches.length;if(c>l)a.push(` + ${c-l} more`);return["The live schema does not match the models.",...a,"","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(`
382
- `)}async function Ui(s,a,l){if(l.length===0)return;let c=Rr(Ot());try{await Sr(s,a);for(let f of l)await rn(s,f,a),qe(`-- \u2713 Recorded applied migration: ${f}`)}catch(f){qe(`-- Could not record applied migrations (the schema change itself succeeded): ${f instanceof Error?f.message:String(f)}`)}}function xr(s){try{return bt(zt(s,"utf8"))}catch{return!1}}function Fi(s){let a=s instanceof Error?s.message:String(s);return/duplicate column name/i.test(a)||/duplicate key name/i.test(a)||/duplicate foreign key constraint name/i.test(a)||/\balready exists\b/i.test(a)}function qe(s){if(e.verbose)console.log(s)}function Er(s){return At(s,e.snapshotDir||".qb")}function Pn(s,a){return At(Er(s),`model-snapshot.${a}.json`)}function Vi(s,a){let l=Pn(s,a);if(!Nt(l))return;try{let c=zt(l,"utf8"),f=JSON.parse(c);if(f?.plan&&Array.isArray(f.plan.tables)&&f.plan.dialect)return f.plan;if(Array.isArray(f?.tables)&&f?.dialect)return f;qe("-- Invalid snapshot format, treating as no previous state");return}catch(c){qe(`-- Could not load snapshot, treating as no previous state: ${c instanceof Error?c.message:String(c)}`);return}}function Dr(s,a,l){let c=Pn(s,a),f=Er(s),b=wt(l);if(Nt(c))try{let E=JSON.parse(zt(c,"utf8"));if(E?.hash===b&&E?.dialect===a&&E?.plan){qe("-- Model snapshot unchanged");return}}catch{}if(!Nt(f))yr(f,{recursive:!0}),qe(`-- Created snapshot directory: ${f}`);let p={plan:l,hash:b,dialect:a,updatedAt:new Date().toISOString()};Tr(c,JSON.stringify(p,null,2)),qe(`-- Model snapshot saved to ${c}`)}function ot(s,a={}){let l=a.dialect??s.dialect;Dr(a.workspaceRoot??Ot(),l,s)}function Ot(){return cn()}function Rr(s){let a=_t(s,e.migrationDir);if(!Nt(a))yr(a,{recursive:!0}),qe(`-- Created SQL directory: ${a}`);return a}async function w(s,a={}){if(await P(),!s)s=At(_n.cwd(),"app/Models");let l=a.dialect||e.dialect||"postgres",c=Ot(),f=await d({modelsDir:s}),b=G(f,{dialect:l,vitessSharded:a.vitessSharded}),p,E=!1;if(!a.full)if(p=Vi(c,l),p)qe("-- Comparing with stored model snapshot");else{let Y=At(s,`.qb-migrations.${l}.json`),J=String(a.state||Y);if(Nt(J))try{let z=zt(J,"utf8"),Me=JSON.parse(z);if(p=Me?.plan&&Me.plan.tables?Me.plan:Me?.tables?Me:void 0,p)qe("-- Comparing with legacy state file (will migrate to new snapshot format)")}catch{}if(!p||a.fromDb)try{let z=await Bn(l),Me=new Set(b.tables.map((Pe)=>Pe.table)),Ke=z.tables.filter((Pe)=>Me.has(Pe.table));if(Ke.length>0)p={dialect:z.dialect,tables:Ke},E=!0,qe(`-- No snapshot; reconciling against live database (${Ke.length} matching table${Ke.length===1?"":"s"})`)}catch(z){qe(`-- Could not introspect live database, treating as no previous state: ${z instanceof Error?z.message:String(z)}`)}if(!p)qe("-- No previous snapshot found, generating full migration")}else qe("-- Full migration requested, ignoring any previous state");let x=a.full?{statements:ke(b,{dryRun:a.dryRun}),operations:b.tables.map((Y)=>({kind:"create_table",table:Y.table,destructive:!1,sql:""}))}:He(p,b,{applyRenames:a.applyRenames,dryRun:a.dryRun,preserveUnknownColumns:E}),{statements:D,operations:_}=x,v=D.join(`
383
- `),k=D.some((Y)=>/\b(?:CREATE|ALTER|DROP)\b/i.test(Y));if(a.apply){let Y=Li(At(Ki(),"qb-migrate-")),J=At(Y,"migration.sql");try{if(k){Tr(J,v);let z=i();await z.file(J),qe("-- Migration applied"),await Ui(z,l,pt())}else qe("-- No changes; nothing to apply")}catch(z){throw console.error("-- Migration failed:",z),z}finally{hr(Y,{recursive:!0,force:!0})}}if(!a.dryRun)Dr(c,l,b);return{sql:v,sqlStatements:D,hasChanges:k,plan:b,operations:_}}function ji(s,a){if(s===void 0)return[Rr(a)];let l=Array.isArray(s)?s:[s];if(l.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 l.map((c)=>Bi(c)?c:At(a,c))}function Yi(s){let a=new Map;for(let l of s){if(!Nt(l))throw Error(`Migration directory not found: ${l}`);for(let c of br(l).filter((f)=>f.endsWith(".sql"))){let f=a.get(c);if(f!==void 0)throw Error(`Duplicate migration file name across directories: "${c}" appears in both ${f} and ${At(l,c)}. Migrations are recorded by file name, so names must be unique across every directory in a run.`);a.set(c,At(l,c))}}return[...a].map(([l,c])=>({name:l,path:c})).sort((l,c)=>l.name<c.name?-1:l.name>c.name?1:0)}var pr="bun-query-builder:migrate",Qi=/\bCONCURRENTLY\b|^\s*VACUUM\b|^\s*BEGIN\s*(?:;|TRANSACTION\b)|^\s*PRAGMA\s+foreign_keys\b/im;function gr(s){return s==="postgres"||s==="sqlite"}async function Wi(s,a){if(s==="sqlite")return await a();let l=i(),c;try{c=await l.reserve()}catch{return await a()}let f=!1;try{return await c.advisoryLock(pr),f=!0,await a()}finally{try{if(f)await c.advisoryUnlock(pr)}finally{c.release?.()}}}async function R(s){await P();let a=Ot(),l=e.dialect||"postgres",c=Yi(ji(s,a));if(c.length===0)return qe("-- No migration files found to execute"),!0;qe(`-- Found ${c.length} script files to execute`);try{let f=i();return await Wi(l,async()=>{await Sr(f,l);let b=await Xi(f,l),p=c.filter((E)=>!b.includes(E.name));if(p.length===0)return qe("-- No pending migrations to execute"),!0;qe(`-- Executing ${p.length} migration${p.length===1?"":"s"}`);for(let{name:E,path:x}of p){qe(`-- Executing: ${E}`);try{if(gr(l)&&!Qi.test(zt(x,"utf-8")))await f.transaction(async(_)=>{await _.file(x),await rn(_,E,l)});else if(await f.file(x),await rn(f,E,l),!gr(l))qe(`-- (${l} commits DDL implicitly, so ${E} was not applied atomically)`);else qe(`-- (${E} contains a statement that cannot run in a transaction, so it was not applied atomically)`);qe(`-- \u2713 Migration ${E} executed and recorded`)}catch(D){if(xr(x)&&Fi(D)){await rn(f,E,l),qe(`-- \u2713 Migration ${E} was already applied; recorded it (${D instanceof Error?D.message:String(D)})`);continue}throw console.error(`-- \u2717 Migration ${E} failed:`,D),D}}return qe("-- All migrations executed successfully"),!0})}catch(f){throw console.error("-- Migration execution failed:",f),f}return!0}async function A(s,a={}){if(await P(),!s)s=At(_n.cwd(),"app/Models");let l=a.dialect||e.dialect||"postgres",c=h(l),f=Ot(),b=async(p)=>{let E=c.dropTable(p);await tt(async(x)=>{if(l==="sqlite")await x.unsafe("PRAGMA foreign_keys = OFF").execute();if(l==="mysql"||l==="vitess")await x.unsafe("SET FOREIGN_KEY_CHECKS = 0").execute();try{await x.unsafe(E).execute()}finally{if(l==="sqlite")await x.unsafe("PRAGMA foreign_keys = ON").execute();if(l==="mysql"||l==="vitess")await x.unsafe("SET FOREIGN_KEY_CHECKS = 1").execute()}})};try{try{await b("migrations"),qe("-- Dropped migrations table")}catch(x){console.error(x)}let p=[],E=[];try{let x=await d({modelsDir:s}),D=G(x,{dialect:l});p=D.tables.map((v)=>v.table);let _=new Set;for(let v of D.tables)for(let k of v.columns)if(k.type==="enum"&&k.enumValues&&k.enumValues.length>0){let Y=`${v.table}_${k.name}_type`;_.add(Y)}E=Array.from(_)}catch(x){console.error(x),p=[],E=[]}if(p.length===0)qe("-- No tables found to drop");else{qe(`-- Dropping ${p.length} tables: ${p.join(", ")}`);for(let x of p.reverse())try{await b(x),qe(`-- Dropped table: ${x}`)}catch(D){console.error(D),qe(`-- Table ${x} may not exist, skipping drop`)}}if(E.length>0){qe(`-- Dropping ${E.length} enum types: ${E.join(", ")}`);for(let x of E)try{let D=c.dropEnumType(x);if(D)await tt(async(_)=>{await _.unsafe(D).execute(),qe(`-- Dropped enum type: ${x}`)})}catch(D){console.error(D),qe(`-- Enum type ${x} may not exist, skipping drop`)}}else qe("-- No enum types found to drop");if(p.length>0&&!a.preserveMigrationState)try{await Gi(s,f,a)}catch(x){console.error(x),qe("-- Could not clean up migration files")}else if(p.length===0)qe("-- No models directory found; keeping committed migration files in place");else qe("-- Preserving migration files and model snapshot for fresh replay");if(!a.preserveMigrationState)try{await Hi(f)}catch(x){console.error(x),qe("-- Could not clear generated directory")}return qe("-- Database reset completed successfully"),!0}catch(p){return console.error("-- Database reset failed:",p),!1}}async function Gi(s,a,l={}){if(!s)s=At(_n.cwd(),"app/Models");if(!a)a=Ot();let c=String(l.dialect||e.dialect||"postgres"),f=Pn(a,c);if(Nt(f))Nn(f),qe(`-- Removed model snapshot file: ${f}`);let b=At(s,`.qb-migrations.${c}.json`),p=String(l.state||b);if(Nt(p))Nn(p),qe(`-- Removed legacy migration state file: ${p}`);zi(_t(a,e.migrationDir))}function zi(s){if(!Nt(s))return;let a=0,l=[];for(let c of br(s).filter((f)=>f.endsWith(".sql"))){if(!xr(At(s,c))){l.push(c);continue}Nn(At(s,c)),qe(`-- Removed generated migration file: ${c}`),a+=1}if(qe(`-- Cleaned up ${a} generated migration file${a===1?"":"s"} from migrations directory`),l.length>0)qe(`-- Kept ${l.length} hand-written migration${l.length===1?"":"s"}: ${l.slice(0,5).join(", ")}${l.length>5?`, +${l.length-5} more`:""}`)}async function Hi(s){if(!s)s=Ot();let a=At(s,"generated");if(Nt(a))try{hr(a,{recursive:!0,force:!0}),qe("-- Cleared generated directory")}catch(l){console.error("-- Failed to clear generated directory:",l)}}async function Sr(s,a){let c=h(a).createMigrationsTable();try{await s.unsafe(c).execute(),qe("-- Migrations table ready")}catch(f){throw console.error("-- Failed to create migrations table:",f),f}}async function Xi(s,a){let l=h(a);try{return(await s.unsafe(l.getExecutedMigrationsQuery()).execute()).map((f)=>f.migration)}catch(c){return console.error("-- Failed to get executed migrations:",c),[]}}async function rn(s,a,l){let c=h(l);try{qe(`-- Recording migration: ${a}`),await s.unsafe(c.recordMigrationQuery(),[a]).execute(),qe(`-- Successfully recorded migration: ${a}`)}catch(f){throw console.error(`-- Failed to record migration ${a}:`,f),f}}
384
- export{X,Z,ee,te,I,ne,re,ie,se,L,ae,K,F,oe,le,j,ce,ue,st,We,at,C,de,o,fe,me,he,ge,h,ot,w,R,A,pe,ye,q,be,W,Te,U,V,M,H,we,Se,De,Ee,Q,$e,xe,S,g,yn,bn,Tn,lt,ct,ut,dt,ft,wn,mt,Wt,Sn,Dn,En,$n,ht,xn,vn,kn,ve,d,gt,pt,yt,bt,Tt,Ut,G,ke,Cn,Rn,wt,Ue,y,Ve,He,Vt,An,Ht,Mn,St,Dt,Et,Qt,Gt};
383
+ `)}export{X,Z,ee,te,I,ne,re,ie,se,L,ae,K,F,oe,le,j,ce,ue,st,We,at,C,de,o,fe,me,he,ge,h,ot,w,R,A,pe,ye,q,be,W,Te,U,V,M,H,we,Se,De,Ee,Q,$e,xe,S,g,yn,bn,Tn,lt,ct,ut,dt,ft,wn,mt,Wt,Sn,Dn,En,$n,ht,xn,vn,kn,ve,d,gt,pt,yt,bt,Tt,Ut,G,ke,Cn,Rn,wt,Ue,y,Ve,He,Vt,An,Ht,Mn,St,Dt,Et,Qt,Gt};