hysteria-orm 10.1.3 → 10.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cli.cjs +2 -2
- package/lib/cli.cjs.map +1 -1
- package/lib/cli.js +2 -2
- package/lib/cli.js.map +1 -1
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js.map +1 -1
- package/package.json +1 -1
package/lib/cli.cjs
CHANGED
|
@@ -108,7 +108,7 @@ export default class extends Migration {
|
|
|
108
108
|
timestamp TEXT NOT NULL DEFAULT '${new Date().toISOString()}'
|
|
109
109
|
);`}},W=new pr;async function yr(i,t=true,e){let r=i.getDbType(),o=i.database;if(r||(b.error("DB_TYPE is not set could not drop all tables"),process.exit(1)),o||(b.error("DB_DATABASE is not set could not drop all tables"),process.exit(1)),b.info("Dropping all tables for database type: "+r),r==="sqlite"){await i.closeConnection(),await ds__default.default.rm(o,{recursive:true,force:true}),b.info("Sqlite database dropped successfully"),await ds__default.default.writeFile(o,""),b.info("Sqlite database recreated successfully");let u=i.getConnectionDetails();i.sqlPool=await Ce(i.getDbType(),u),t&&(await i.closeConnection(),b.info("All tables dropped successfully"),t&&process.exit(0));return}let n=W.getAllTablesTemplate(r,o),s=await i.rawQuery(n),a=W.parseGetAllTables(r,o,s),l=W.dropAllTablesTemplate(r,a),d=null;e&&(d=await i.startTransaction(),i=d.sql);try{(r==="mysql"||r==="mariadb")&&await i.rawQuery("SET FOREIGN_KEY_CHECKS = 0;"),await i.rawQuery(l),(r==="mysql"||r==="mariadb")&&await i.rawQuery("SET FOREIGN_KEY_CHECKS = 1;"),e&&await d?.commit();}catch(u){e&&await d?.rollback(),b.error(u),process.exit(1);}finally{t&&await i.closeConnection();}b.info("All tables dropped successfully"),t&&process.exit(0);}var M={DB_TYPE:process.env.DB_TYPE,DB_HOST:process.env.DB_HOST,DB_PORT:process.env.DB_PORT,DB_USER:process.env.DB_USER,DB_PASSWORD:process.env.DB_PASSWORD,DB_DATABASE:process.env.DB_DATABASE,DB_LOGS:process.env.DB_LOGS==="true",MIGRATION_PATH:process.env.MIGRATION_PATH||"database/migrations",REDIS_HOST:process.env.REDIS_HOST,REDIS_PORT:process.env.REDIS_PORT,REDIS_USERNAME:process.env.REDIS_USERNAME,REDIS_PASSWORD:process.env.REDIS_PASSWORD,REDIS_DATABASE:process.env.REDIS_DATABASE,MONGO_URL:process.env.MONGO_URL,MONGO_LOGS:process.env.MONGO_LOGS==="true"},El=()=>{try{te__default.default.readFileSync(".env","utf8").split(`
|
|
110
110
|
`).forEach(e=>{let[r,o]=e.split("="),n=r.trim(),s=o.trim();switch(n){case "DB_TYPE":M.DB_TYPE||(M.DB_TYPE=s);break;case "DB_HOST":M.DB_HOST||(M.DB_HOST=s);break;case "DB_PORT":M.DB_PORT||(M.DB_PORT=s);break;case "DB_USER":M.DB_USER||(M.DB_USER=s);break;case "DB_PASSWORD":M.DB_PASSWORD||(M.DB_PASSWORD=s);break;case "DB_DATABASE":M.DB_DATABASE||(M.DB_DATABASE=s);break;case "MIGRATION_PATH":M.MIGRATION_PATH||(M.MIGRATION_PATH=s||"database/migrations");break;case "REDIS_HOST":M.REDIS_HOST||(M.REDIS_HOST=s);break;case "REDIS_PORT":M.REDIS_PORT||(M.REDIS_PORT=s);break;case "REDIS_USERNAME":M.REDIS_USERNAME||(M.REDIS_USERNAME=s);break;case "REDIS_PASSWORD":M.REDIS_PASSWORD||(M.REDIS_PASSWORD=s);break;case "REDIS_DATABASE":M.REDIS_DATABASE||(M.REDIS_DATABASE=s);break;case "MONGO_URL":M.MONGO_URL||(M.MONGO_URL=s);break}});}catch{}finally{return M}},A=El();var $l=()=>{let i=A.MIGRATION_PATH,t=Pe__default.default.resolve(process.cwd(),i);return te__default.default.existsSync(t)||te__default.default.mkdirSync(t,{recursive:true}),t},us=(i,t=false,e="basic",r="table")=>{let o=$l(),n=new Date().getTime(),s=t?`${n}_${i}.js`:`${n}_${i}.ts`,a=Pe__default.default.join(o,s),l;switch(e){case "alter":l=W.alterMigrationTemplate(t,r);break;case "create":l=W.createMigrationTemplate(t,r);break;default:l=W.basicMigrationTemplate(t);break}te__default.default.writeFileSync(a,l),b.info(`Migration created successfully at '${a}'.`),process.exit(0);};async function Te(i,t){let e=Pe__default.default.isAbsolute(i)?i:Pe__default.default.resolve(process.cwd(),i),{mod:r}=await bundleRequire.bundleRequire({filepath:e,format:"esm",preserveTemporaryFile:false,esbuildOptions:{keepNames:true,sourcemap:true},tsconfig:t??"./tsconfig.json",external:["ioredis","mongodb","pg","mysql2","sqlite3","bundle-require","esbuild","sql-formatter","sql-highlight","reflect-metadata","pluralize","dayjs","async-mutex","commander"]});return r}var Ll=async(i,t)=>{if(i.endsWith(".ts"))return await import('typescript').catch(()=>{throw new f("MigrationUtils::importMigrationFile In order to use TypeScript migrations, you must have `typeScript` installed in your project. Please install it with `npm install typescript --save-dev`, if you're in a production environment, it's recommended to transpile your migrations to JavaScript before running the application.","MIGRATION_MODULE_NOT_FOUND")}),await import('esbuild').catch(()=>{throw new f("MigrationUtils::importMigrationFile In order to use TypeScript migrations, you must have `esbuild` installed in your project. Please install it with `npm install esbuild --save-dev`, if you're in a production environment, it's recommended to transpile your migrations to JavaScript before running the application.","MIGRATION_MODULE_NOT_FOUND")}),await import('bundle-require').catch(()=>{throw new f("MigrationUtils::importMigrationFile In order to use TypeScript migrations, you must have `bundle-require` installed in your project. Please install it with `npm install bundle-require --save-dev`, if you're in a production environment, it's recommended to transpile your migrations to JavaScript before running the application.","MIGRATION_MODULE_NOT_FOUND")}),Te(i,t);try{return import(url.pathToFileURL(i).href)}catch{let o=module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli.cjs', document.baseURI).href)));try{let n=o(i);return {default:n.default||n,...n}}catch{throw new f(`MigrationUtils::importMigrationFile Failed to import migration file: ${i}. Both ESM and CommonJS imports failed.`,"MIGRATION_MODULE_NOT_FOUND")}}};async function yt(i,t){switch(i){case "mariadb":case "mysql":let e=t;return await e.query(W.migrationTableTemplateMysql()),(await e.query(W.selectAllFromMigrationsTemplate()))[0];case "postgres":case "cockroachdb":let o=t;return await o.query(W.migrationTableTemplatePg()),(await o.query(W.selectAllFromMigrationsTemplate())).rows;case "sqlite":return await ys(W.migrationTableTemplateSQLite(),[],t),await ys(W.selectAllFromMigrationsTemplate(),[],t)||[];default:throw new f("MigrationUtils::getMigrationTable Unsupported database type","DEVELOPMENT_ERROR")}}async function ft(i,t,e){let r=jl(t),o=[];for(let n of r){let s=await Wl(n,t,e),a=new s(i||A.DB_TYPE);a.migrationName=n,o.push(a);}return o}async function Fl(i,t){let e=await Ll(i,t);if(!e.default)throw new f("MigrationUtils::loadMigrationModule Migration module does not have a default export","MIGRATION_MODULE_NOT_FOUND");return e.default}async function Wl(i,t=A.MIGRATION_PATH||"database/migrations",e){t=Pe.join(t,i);let r=Pe__default.default.resolve(process.cwd(),t),o=await Fl(r,e);if(!o)throw new f("MigrationUtils::findMigrationModule migrations module not found for migration: "+i,"MIGRATION_MODULE_NOT_FOUND");return o}function jl(i){let t=process.cwd(),e=Pe__default.default.resolve(i||A.MIGRATION_PATH||"database/migrations"),r=Pe__default.default.resolve(t,e);try{let o=te__default.default.readdirSync(r).filter(n=>{let s=Pe__default.default.extname(n),a=Pe__default.default.join(r,n);return te__default.default.statSync(a).isFile()&&(s===".ts"||s===".js")});if(o.length)return o;throw new f("MigrationUtils::findMigrationNames No database migration files found on path: "+r,"MIGRATION_MODULE_NOT_FOUND")}catch{throw new f("MigrationUtils::findMigrationNames No database migration files found on path: "+r,"MIGRATION_MODULE_NOT_FOUND")}}async function ys(i,t,e){return new Promise((r,o)=>{e.all(i,t,(n,s)=>{n&&o(n),r(s);});})}async function je(i,t,e,r,o){let n=i.getDbType(),s=null;b.info("Running migrations for database type: "+n);try{let a=await yt(n,i.getPool()),d=(await ft(n,e,r)).filter(c=>!a.map(m=>m.name).includes(c.migrationName));if(!d.length){b.info("No pending migrations.");return}if(t){let c=d.findIndex(h=>h.migrationName===t);if(c===-1){console.error(`Migration ${t} not found.`);return}let m=d.slice(0,c+1);o&&(s=await i.startTransaction(),i=s.sql),await new be(i).upMigrations(m),o&&await s?.commit(),b.info("Migrations ran successfully");return}let u=new be(i);o&&(s=await i.startTransaction(),i=s.sql),await u.upMigrations(d),o&&await s?.commit();}catch(a){throw o&&await s?.rollback(),a}b.info("Migrations ran successfully");}var ht=class{constructor(t){switch(this.type=t?.type||A.DB_TYPE,this.type){case "mongo":this.handleMongoSource(t);break;case "cockroachdb":this.handleCockroachdbSource(t);break;case "postgres":this.handlePostgresSource(t);break;case "mariadb":case "mysql":this.handleMysqlSource(t);break;case "sqlite":this.handleSqliteSource(t);break;default:throw new f(`Invalid database type: ${this.type}, please provide a valid database type in your input or in the .env file with the key DB_TYPE
|
|
111
|
-
Valid database types are: [mongo, postgres, cockroachdb, mysql, mariadb, sqlite]`,`UNSUPPORTED_DATABASE_TYPE_${this.type}`)}}handleCockroachdbSource(t){this.host=t?.host||A.DB_HOST,this.port=+t?.port||+A.DB_PORT,this.username=t?.username||A.DB_USER,this.password=t?.password||A.DB_PASSWORD,this.database=t?.database||A.DB_DATABASE,this.logs=t?.logs||A.DB_LOGS||false,this.port||(this.port=26257);}handlePostgresSource(t){this.host=t?.host||A.DB_HOST,this.port=+t?.port||+A.DB_PORT,this.username=t?.username||A.DB_USER,this.password=t?.password||A.DB_PASSWORD,this.database=t?.database||A.DB_DATABASE,this.logs=t?.logs||A.DB_LOGS||false,this.port||(this.port=5432);}handleMysqlSource(t){this.host=t?.host||A.DB_HOST,this.port=+t?.port||+A.DB_PORT,this.username=t?.username||A.DB_USER,this.password=t?.password||A.DB_PASSWORD,this.database=t?.database||A.DB_DATABASE,this.logs=t?.logs||A.DB_LOGS||false,this.port||(this.port=3306);}handleSqliteSource(t){this.database=t?.database||A.DB_DATABASE,this.logs=t?.logs||A.DB_LOGS||false;}handleMongoSource(t){this.url=t?.url||A.MONGO_URL,this.logs=t?.logs||A.MONGO_LOGS||false;}};var Vl=i=>{let{required:t,...e}=i.openApi||{},r={...e,type:i.openApi?.type||"string",description:i.openApi?.description??`Property: ${i.columnName}`};return i.openApi?.type?{...r,type:i.openApi.type}:Array.isArray(i.type)?{...r,type:"string",enum:i.type}:i.type==="date"||i.type==="datetime"||i.type==="timestamp"||i.type==="time"?{...r,type:"string",format:"date-time"}:i.type==="boolean"?{...r,type:"boolean"}:i.type==="integer"||i.type==="tinyint"||i.type==="smallint"||i.type==="mediumint"||i.type==="increment"?{...r,type:"integer",format:"int32"}:i.type==="biginteger"||i.type==="bigIncrement"?{...r,type:"integer",format:"int64"}:i.type==="float"||i.type==="real"?{...r,type:"number",format:"float"}:i.type==="double"?{...r,type:"number",format:"double"}:i.type==="decimal"||i.type==="numeric"?{...r,type:"number"}:i.type==="json"||i.type==="jsonb"?{...r,type:"object"}:i.type==="uuid"?{...r,type:"string",format:"uuid"}:i.type==="ulid"?{...r,type:"string",format:"ulid"}:i.type==="string"||i.type==="char"||i.type==="varchar"||i.type==="text"||i.type==="longtext"||i.type==="mediumtext"||i.type==="tinytext"?{...r,type:"string"}:i.type==="blob"||i.type==="binary"||i.type==="varbinary"||i.type==="tinyblob"||i.type==="mediumblob"||i.type==="longblob"?{...r,type:"string",format:"binary"}:i.type==="year"?{...r,type:"integer",format:"int32"}:r},Hl=i=>i.openApi?.required??false,Yl=i=>{let t=i.getColumns(),e={};for(let r of t)r.hidden||(e[r.columnName]=Vl(r));return e},Jl=i=>{let t=i.getColumns(),e=[];for(let r of t)Hl(r)&&e.push(r.columnName);return e||[]},zl=i=>{let t=Yl(i),e=Jl(i);return {type:"object",properties:t,required:e.length?e:[]}};var fs=i=>i.map(t=>({...zl(t),modelName:t.name}));var gt=i=>{switch(i){case "mysql":return "mysql";case "mariadb":return "mariadb";case "postgres":case "cockroachdb":return "postgresql";case "sqlite":return "sqlite";default:return "sql"}},gs=i=>{if(i==null)return "NULL";if(i instanceof Date)return `'${i.toISOString()}'`;let t=typeof i;return t==="boolean"?i?"TRUE":"FALSE":t==="number"&&Number.isFinite(i)||t==="bigint"?String(i):t==="string"?`'${i.replace(/'/g,"''")}'`:Array.isArray(i)||t==="object"&&Object.keys(i).length>0?`'${JSON.stringify(i).replace(/'/g,"''")}'`:String(i)},Ts=(i,t)=>{let e=i;for(let r=0;r<t.length&&e.includes("?");r++)e=e.replace(/\?/,gs(t[r]));for(let r=0;r<t.length;r++){let o=new RegExp(`\\$${r+1}(?!\\d)`,"g");e=e.replace(o,gs(t[r]));}return e},Ve=(i,t)=>t?i==="mysql"||i==="mariadb"?t.code==="ER_NO_SUCH_TABLE"||t.errno===1146:i==="postgres"||i==="cockroachdb"?t.code==="42P01":i==="sqlite"?/no such table/i.test(String(t.message||"")):false:false,Tt=(i,t)=>{let e=i.getDbType(),r;try{r=sqlFormatter.format(t,{...i.inputDetails.queryFormatOptions,language:gt(e)});}catch{try{r=sqlFormatter.format(t,{...i.inputDetails.queryFormatOptions});}catch{r=t;}}return r};var hr=class{toSql(t){let e=t,r=new N(this.model,"mysql"),{sql:o}=r.parse([e.column]),n=e.inlineConstraints;if(n&&n.length>0){let s=[];for(let a of n){let{sql:l}=r.parse([a]);s.push(l);}s.length>0&&(o+=` ${s.join(" ")}`);}return {sql:`add column ${o}`,bindings:[]}}},bs=new hr;var gr=class{toSql(t){let e=t,r=new N(this.model,"mysql"),{sql:o}=r.parse([e.constraint]);return {sql:`add ${o}`,bindings:[]}}},Ns=new gr;var Tr=class{toSql(t){return {sql:`add primary key (${t.columns.map(o=>`\`${o}\``).join(", ")})`,bindings:[]}}},Ss=new Tr;var br=class{toSql(t){let e=t,r=new N(this.model,"mysql"),{sql:o}=r.parse([e.newType]),[,...n]=o.trim().split(/\s+/),s=n.join(" "),a=`modify column \`${e.column}\` ${s}`;if(e.options.nullable!==void 0){let l=e.options.nullable?"":" not null";a+=l;}if(e.options.dropDefault)a+=" drop default";else if(e.options.default!==void 0){let l=e.options.default;l===null?l="null":typeof l=="string"&&(l==="NULL"?l="null":l==="TRUE"||l==="FALSE"?l=l.toLowerCase():l=`'${l}'`),a+=` default ${l}`;}return e.options.unique!==void 0&&e.options.unique&&(a+=" unique"),{sql:a,bindings:[]}}},ws=new br;function Gl(i){return typeof i!="string"||!i?i:i.replace(/([a-z])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}function Zl(i){return typeof i!="string"||!i?i:i.replace(/([-_][a-z])/g,t=>t.toUpperCase().replace("-","").replace("_",""))}function O(i,t){return t==="preserve"?i:t==="snake"?Gl(i):t==="camel"?Zl(i):t instanceof RegExp?i.replace(t,e=>e[1].toUpperCase()):t(i)}Re__default.default.extend(td__default.default);Re__default.default.extend(ed__default.default);Re__default.default.extend(Xl__default.default);var bt=(i,t="ISO",e="UTC")=>{if(!(i instanceof Date)||isNaN(i.getTime()))throw new Error("Invalid date provided");let r=Re__default.default(i);if(e==="LOCAL"){let n=r.local();switch(t){case "ISO":return n.format("YYYY-MM-DD HH:mm:ss");case "DATE_ONLY":return n.format("YYYY-MM-DD");case "TIME_ONLY":return n.format("HH:mm:ss");default:return n.unix().toString()}}let o=r.utc();switch(t){case "ISO":return o.format("YYYY-MM-DD HH:mm:ss");case "DATE_ONLY":return o.format("YYYY-MM-DD");case "TIME_ONLY":return o.format("HH:mm:ss");default:return o.unix().toString()}},Ms=(i,t,e="UTC")=>{if(i===null)return null;if(i instanceof Date){if(isNaN(i.getTime()))throw new f("DateUtils::parseDate","INVALID_DATE_OBJECT");return i}try{let r=t?Re__default.default(i,t):Re__default.default(i);if(!r.isValid())throw new f("DateUtils::parseDate","INVALID_DATE_STRING");return e==="UTC"?r.utc().toDate():r.local().toDate()}catch{throw new f("DateUtils::parseDate","FAILED_TO_PARSE_DATE")}},ne=(i=new Date)=>Re__default.default(i).utc().format("YYYY-MM-DD HH:mm:ss");var qs=(i,t)=>{try{let e=pe__default.default.createHash("sha256").update(i).digest(),r=pe__default.default.randomBytes(16),o=pe__default.default.createCipheriv("aes-256-cbc",e,r),n=o.update(t,"utf8","hex");return n+=o.final("hex"),`${r.toString("hex")}:${n}`}catch(e){throw new f("Encryption::encryptSymmetric","FAILED_TO_ENCRYPT_SYMMETRICALLY",e instanceof Error?e:void 0)}},_s=(i,t)=>{try{let e=pe__default.default.createHash("sha256").update(i).digest(),[r,o]=t.split(":"),n=pe__default.default.createDecipheriv("aes-256-cbc",e,Buffer.from(r,"hex")),s=n.update(o,"hex","utf8");return s+=n.final("utf8"),s}catch(e){throw new f("Encryption::decryptSymmetric","FAILED_TO_DECRYPT_SYMMETRICALLY",e instanceof Error?e:void 0)}},Cs=(i,t)=>{try{let e=pe__default.default.randomBytes(32),r=pe__default.default.randomBytes(16),o=pe__default.default.createCipheriv("aes-256-cbc",e,r),n=o.update(t,"utf8","hex");n+=o.final("hex");let s=pe.publicEncrypt(i,e);return `${r.toString("hex")}:${s.toString("hex")}:${n}`}catch(e){throw new f("Encryption::encryptAsymmetric","FAILED_TO_ENCRYPT_ASYMMETRICALLY",e instanceof Error?e:void 0)}},Rs=(i,t)=>{try{let[e,r,o]=t.split(":"),n=pe.privateDecrypt(i,Buffer.from(r,"hex")),s=pe__default.default.createDecipheriv("aes-256-cbc",n,Buffer.from(e,"hex")),a=s.update(o,"hex","utf8");return a+=s.final("utf8"),a}catch(e){throw new f("Encryption::decryptAsymmetric","FAILED_TO_DECRYPT_ASYMMETRICALLY",e instanceof Error?e:void 0)}};var Sr="0123456789ABCDEFGHJKMNPQRSTVWXYZ",Nr=Sr.length,sd=10,id=16,ad=(i,t)=>{let e="";for(let r=0;r<t;r++){let o=i%Nr;e=Sr.charAt(o)+e,i=(i-o)/Nr;}return e},ld=i=>{let t=pe.randomBytes(i),e="";for(let r=0;r<i;r++){let o=t[r];e+=Sr.charAt(o%Nr);}return e},xs=()=>{let i=Math.floor(Date.now()/1e3),t=ad(i,sd),e=ld(id);return t+e};function wr(i){return i.replace(/^[`"]|[`"]$/g,"")}function Mr(i,t,e){if(!i.includes(".")){let n=wr(i);return `${t}.${n}`}let[r,o]=i.split(".");return r=wr(r),o=wr(o),r!==e?i:o==="*"?`${t}.*`:`${t}.${o}`}function S(i){return typeof i=="function"?i():i}var B=(i,t=new WeakMap)=>{if(i===null||typeof i!="object")return i;if(t.has(i))return t.get(i);if(Array.isArray(i)){let r=[];t.set(i,r);for(let o=0;o<i.length;o++)r[o]=B(i[o],t);return r}let e=Object.create(Object.getPrototypeOf(i)||{});t.set(i,e);for(let r of Object.getOwnPropertyNames(i)){let o=i[r];if(typeof o=="function"){e[r]=o;continue}e[r]=B(o,t);}return e};var Be=class{};Be.modelCaseConvention="camel",Be.databaseCaseConvention="snake";var dd=async(i,t,e,r,o=[],n=[],s=false)=>{let a=new t,l=new Set(e.filter(c=>c.hidden).map(c=>c.columnName)),d=new Map(e.map(c=>[c.databaseName,c])),u=o.length?new Set(o):null;if(await Promise.all(Object.keys(i).map(async c=>{let m=i[c],p=d.get(c)?.columnName??O(c,t.modelCaseConvention);if(p==="$annotations"&&!s){md(i,c,a,t,n);return}if(!r.has(p)||l.has(p)||u&&!u.has(p))return;if(m===null){a[p]=null;return}let h=r.get(p);if(h&&h.serialize){a[p]=await h.serialize(m);return}a[p]=m;})),u)for(let c of u)c in a||(a[c]=null);return a},md=(i,t,e,r,o=[])=>{let n=i[t];if(!n||!Object.keys(n).length)return;let s=o.length>0?new Set(o):null;if(!s)return;let a={};for(let l of Object.keys(n))s.has(l)&&(a[O(l,r.modelCaseConvention)]=n[l]);Object.keys(a).length>0&&(e[t]=a);},se=async(i,t,e=[],r=[],o=false)=>{if(!i.length)return null;let n=t.getColumns(),s=new Map(n.map(d=>[d.columnName,d])),a=[];for(let d of e){if(d.toLowerCase().includes("as"))continue;let u=d;if(u.includes(".")&&(u=u.split(".").pop()),u==="*")continue;let c=s.get(u)?.columnName??O(u,t.modelCaseConvention);a.push(c);}e=a;let l=await Promise.all(i.map(async d=>await dd(d,t,n,s,e,r,o)));return l.length===1?l[0]:l};var As=["postgres","cockroachdb"];function Ds(i){let t=i.name,e=O(t,"snake");return ud__default.default(e)}function Ps(){return {}}var He=class He extends Be{static get table(){let t=Object.getOwnPropertyDescriptor(this,"table");return t&&"value"in t?t.value:Ds(this)}static set table(t){Object.defineProperty(this,"table",{value:t,writable:true,enumerable:true,configurable:true});}static get primaryKey(){return $s(this)}constructor(){super();}static async all(t={}){return await this.dispatchModelManager(t).find({ignoreHooks:t.ignoreHooks?["afterFetch","beforeFetch"]:[]})}static query(t){return this.dispatchModelManager(t).query()}static dryQuery(t){return this.dispatchModelManager(t).dryQuery()}static async first(t){return this.dispatchModelManager(t).query().one({ignoreHooks:t?.ignoreHooks?["afterFetch","beforeFetch"]:[]})}static async find(t,e){return await this.dispatchModelManager(e).find(t)}static async findOneOrFail(t,e){return await this.dispatchModelManager(e).findOneOrFail(t)}static async findOne(t,e){return await this.dispatchModelManager(e).findOne(t)}static async findBy(t,e,r={}){return await this.dispatchModelManager(r).find({ignoreHooks:r.ignoreHooks?["afterFetch","beforeFetch"]:[],where:{[t]:e}})}static async findOneBy(t,e,r={}){return await this.dispatchModelManager(r).findOne({ignoreHooks:r.ignoreHooks?["afterFetch","beforeFetch"]:[],where:{[t]:e}})}static async findOneByPrimaryKey(t,e={}){return await this.dispatchModelManager(e).findOneByPrimaryKey(t)}static async refresh(t,e={}){let r=this,o=r.dispatchModelManager(e),n=r.primaryKey,s=t[n],a=await o.findOneByPrimaryKey(s);return a||null}static async insert(t,e={}){return this.dispatchModelManager(e).insert(t,{ignoreHooks:e.ignoreHooks,returning:e.returning})}static async insertMany(t,e={}){return t.length?this.dispatchModelManager(e).insertMany(t,{ignoreHooks:e.ignoreHooks,returning:e.returning}):[]}static async sync(t,e,r,o,n={}){if(Array.isArray(r)||(r=[r]),!r.length)return;let s=this,l=wt(s).find(h=>h.columnName===t);if(!l)throw new f(`${s.name}::sync`,"RELATION_NOT_FOUND");if(l.type!=="manyToMany")throw new f(`${s.name}::sync`,"RELATION_NOT_MANY_TO_MANY");let d=O(l.leftForeignKey,n.caseConvention||s.databaseCaseConvention),u=O(l.rightForeignKey,n.caseConvention||s.databaseCaseConvention),c=r.map((h,g)=>({[d]:e[s.primaryKey],[u]:h[l.model.primaryKey],...o?o(h,g):{}}));class m extends He{static get table(){return l.throughModel}}m.databaseCaseConvention="preserve",m.modelCaseConvention="preserve",await m.dispatchModelManager(n).insertMany(c);}static async updateRecord(t,e,r={}){try{let o=this,n=o.dispatchModelManager(r);return e&&o.combineProps(t,e),await n.updateRecord(t)}catch(o){throw o instanceof f&&o.message==="MODEL_HAS_NO_PRIMARY_KEY"?new f(`${this.name}::updateRecord`,"MODEL_HAS_NO_PRIMARY_KEY"):o}}static async firstOrInsert(t,e,r={}){r.fullResponse||(r.fullResponse=false);let n=this.dispatchModelManager(r),s=await n.findOne({where:t});if(s)return r.fullResponse?{isNew:false,model:s}:s;let a=await n.insert(e);return r.fullResponse?{isNew:true,model:a}:a}static async upsert(t,e,r={updateOnConflict:true}){let o=this,n=o.dispatchModelManager(r),a=Object.keys(t).length>0?await n.findOne({ignoreHooks:r.ignoreHooks?["afterFetch","beforeFetch"]:[],where:t}):null;return a?(e[o.primaryKey]=a[o.primaryKey],r.updateOnConflict?await n.updateRecord(e,{returning:r.returning}):a):await n.insert(e,{ignoreHooks:r.ignoreHooks,returning:r.returning??["*"]})}static async upsertMany(t,e,r={updateOnConflict:true}){if(!e.length)return [];let o=this,n=o.dispatchModelManager(r);if(!e.every(c=>{let m=new Set(Object.keys(c));return t.every(p=>m.has(p))}))throw new f("Model::upsertMany","CONFLICT_COLUMNS_NOT_PRESENT_IN_DATA");let s=Object.keys(e[0]),a=await n.upsertMany(t,s,e,{ignoreHooks:r.ignoreHooks,returning:r.returning,updateOnConflict:r.updateOnConflict??true}),l=o.sqlInstance.getDbType();if(As.includes(l))return await se(a,o,r.returning);let d=n.query();r.returning?.length&&d.select(...r.returning);let u=new Map;return t.forEach(c=>{e.forEach(m=>{u.set(c,[...u.get(c)||[],m[c]]);});}),d.where(c=>{t.forEach(m=>{c.orWhereIn(m,u.get(m)||[]);});}),d.many({ignoreHooks:r.ignoreHooks?["afterFetch","beforeFetch"]:[]})}static async deleteRecord(t,e){return this.dispatchModelManager(e).deleteRecord(t)}static async softDelete(t,e,r){let o=this,{column:n=o.softDeleteColumn,value:s=o.softDeleteValue}=e||{};return t[n]=s,await o.dispatchModelManager({trx:r?.trx,connection:r?.connection}).updateRecord(t),typeof s=="string"?(t[n]=new Date(s),t):(t[n]=s,t)}static async truncate(t={}){return this.dispatchModelManager(t).query().truncate()}static async getTableInfo(){let t=this;return t.establishConnection(),t.sqlInstance.getTableInfo(t.table)}static async getIndexInfo(){let t=this;return t.establishConnection(),t.sqlInstance.getIndexInfo(t.table)}static async getTableSchema(){let t=this;return t.establishConnection(),t.sqlInstance.getTableSchema(t.table)}static combineProps(t,e){for(let r in e)Object.assign(t,{[r]:e[r]});}static getColumns(){return St(this)}static getRelations(){return Es(this)}static getIndexes(){return Qs(this)}static getUniques(){return Ks(this)}static column(t,...e){$(...e)(this.prototype,t);}static hasOne(t,...e){Is(...e)(this.prototype,t);}static hasMany(t,...e){vs(...e)(this.prototype,t);}static belongsTo(t,...e){Os(...e)(this.prototype,t);}static manyToMany(t,...e){Bs(...e)(this.prototype,t);}static establishConnection(){let t=Ne.getInstance();if(!t)throw new f("sqlInstance not initialized, did you defined it in SqlDataSource.connect static method?","CONNECTION_NOT_ESTABLISHED");this.sqlInstance=t;}static dispatchModelManager(t){if(t?.connection)return t.connection.getModelManager(this);if(t?.trx)return t.trx.sql.getModelManager(this);let e=this;return e.establishConnection(),e.sqlInstance.getModelManager(e)}async save(t={}){let e=this,r=e.constructor,o=r.primaryKey;if(!o)throw new f(r.name+"::save","MODEL_HAS_NO_PRIMARY_KEY");let n=e[o],s=n?{[o]:n}:{},a=e,l=await r.upsert(s,a,{updateOnConflict:true,...t});return r.combineProps(this,l),this}async update(t,e={}){let r=this,o=r.constructor,n=o.primaryKey;if(!n)throw new f(o.name+"::save","MODEL_HAS_NO_PRIMARY_KEY");if(!r[n])throw new f(o.name+"::update","MODEL_HAS_NO_PRIMARY_KEY_VALUE");await o.updateRecord(r,t,e);}async softDelete(t,e){let r=this,o=r.constructor,n=o.primaryKey;if(!n)throw new f(o.name+"::softDelete","MODEL_HAS_NO_PRIMARY_KEY");if(!r[n])throw new f(o.name+"::softDelete","MODEL_HAS_NO_PRIMARY_KEY_VALUE");await o.softDelete(r,t,e);}async delete(t={}){let e=this,r=e.constructor,o=r.primaryKey;if(!o)throw new f(r.name+"::delete","MODEL_HAS_NO_PRIMARY_KEY");if(!e[o])throw new f(r.name+"::delete","MODEL_HAS_NO_PRIMARY_KEY_VALUE");await r.deleteRecord(this,t);}async refresh(t){let e=this,r=e.constructor,o=r.primaryKey;if(!o)throw new f(r.name+"::refresh","MODEL_HAS_NO_PRIMARY_KEY");if(!e[o])throw new f(r.name+"::refresh","MODEL_HAS_NO_PRIMARY_KEY_VALUE");let s=await r.refresh(this,t);return r.combineProps(this,s),this}};He.softDeleteColumn="deletedAt",He.softDeleteValue=ne();var Nt=He;var ie=class{constructor(t,e){this.model=Nt;this.columnName="";this.relatedModel="";this.model=t,this.columnName=e,this.relatedModel=this.model.table;}};var Mt=class extends ie{constructor(t,e,r){super(t,e),this.foreignKey=r,this.type="belongsTo";}};var qt=class extends ie{constructor(e,r,o){super(e,r);this.type="hasMany";this.foreignKey=o,this.type="hasMany";}};var _t=class extends ie{constructor(t,e,r){super(t,e),this.foreignKey=r,this.type="hasOne";}};var Ct=class extends ie{constructor(e,r,o){super(e,r);this.type="manyToMany";this.primaryModel=o.primaryModel,this.relatedModel=e.table,this.throughModel=o.throughModel,this.leftForeignKey=o.leftForeignKey,this.rightForeignKey=o.rightForeignKey;}};var Rt=Symbol("columns"),xt=Symbol("primaryKey"),G=Symbol("relations"),ks=Symbol("indexes"),Us=Symbol("uniques"),Se=i=>`${ud__default.default.singular(i)}_id`,qr=(i,t)=>`idx_${i}_${t}`,Z=(i,t)=>`uq_${i}_${t}`,k=(i,t,e)=>`fk_${i}_${t}${e?`_${e}`:""}`,we=(i,t)=>`pk_${i}_${t}`;var E=class{static defineMetadata(t,e,r,o){if((typeof r!="object"||r===null)&&typeof r!="function")throw new TypeError("target must be an object or function");let n=this.store.get(r);n||(n=new Map,this.store.set(r,n));let s=n.get(o);s||(s=new Map,n.set(o,s)),s.set(t,e);}static getMetadata(t,e,r){if((typeof e!="object"||e===null)&&typeof e!="function")throw new TypeError("target must be an object or function");let o=e;for(;o;){let n=this.store.get(o);if(n){let s=n.get(r);if(s&&s.has(t))return s.get(t)}o=Object.getPrototypeOf(o);}}};E.store=new WeakMap;function $(i={primaryKey:false}){let t=i?.primaryKey??false;return (e,r)=>{let o=e.constructor;if(t){if(E.getMetadata(xt,e))throw new f("ModelDecorator::column","MULTIPLE_PRIMARY_KEYS_NOT_ALLOWED");E.defineMetadata(xt,r,e);}let n=i.databaseName??O(r,o.databaseCaseConvention),s={columnName:r,serialize:i.serialize,prepare:i.prepare,hidden:i.hidden,isPrimary:t,primaryKeyConstraintName:i.primaryKeyConstraintName??we(o.table,r),autoUpdate:i.autoUpdate,databaseName:n,openApi:i.openApi,type:i.type,length:i?.length,precision:i?.precision,scale:i?.scale,withTimezone:i?.withTimezone,constraints:{nullable:i.nullable,default:i.default}},a=E.getMetadata(Rt,e)||[];a.push(s),E.defineMetadata(Rt,a,e);}}$.primary=yd;$.date=wd;$.boolean=Sd;$.json=Md;$.uuid=gd;$.ulid=Td;$.integer=hd;$.float=fd;$.encryption={symmetric:bd,asymmetric:Nd};function yd(i={}){return $({...i,primaryKey:true})}function fd(i={}){return $({type:"float",...i,serialize:t=>{if(t!==void 0)return t===null?null:typeof t=="number"?t:typeof t=="string"?+t:Number.parseFloat(t)}})}function hd(i={}){return $({type:"integer",...i,serialize:t=>{if(t!==void 0)return t===null?null:typeof t=="number"?t:typeof t=="string"?+t:Number.parseInt(t)}})}function gd(i={}){return $({type:"uuid",...i,prepare:t=>t||pe__default.default.randomUUID()})}function Td(i={}){return $({type:"ulid",...i,prepare:t=>t||xs()})}function bd(i){return $({...i,prepare:t=>t&&qs(i.key,t),serialize:t=>t&&_s(i.key,t)})}function Nd(i){return $({...i,prepare:t=>t&&Cs(i.publicKey,t),serialize:t=>t&&Rs(i.privateKey,t)})}function Sd(i={}){return $({type:"boolean",...i,serialize:t=>!!t,prepare:t=>!!t})}function wd(i={}){let{format:t="ISO",timezone:e="UTC",autoUpdate:r=false,autoCreate:o=false,...n}=i;return $({type:"datetime",...n,autoUpdate:r,prepare:s=>s?r?bt(new Date,t,e):typeof s=="string"?s:bt(s,t,e):o?bt(new Date,t,e):null,serialize:s=>{if(s!==void 0)return s===null?null:Ms(s,t,e)}})}function Md(i={}){return $({type:"jsonb",...i,serialize:t=>typeof t=="string"?JSON.parse(t):t,prepare:t=>typeof t!="string"?JSON.stringify(t):t})}function St(i){try{return E.getMetadata(Rt,i.prototype)||[]}catch{return []}}function Os(i,t,e){return (r,o)=>{let n=()=>Se(i().table),s=()=>{let d=r.constructor.table,u=t||n();return k(d,u,i().table)},a={type:"belongsTo",columnName:o,model:i,foreignKey:t?String(t):n,constraintName:e?.constraintName??s,onUpdate:e?.onUpdate,onDelete:e?.onDelete},l=E.getMetadata(G,r)||[];l.push(a),E.defineMetadata(G,l,r);}}function Is(i,t){return (e,r)=>{let o=()=>Se(e.constructor.table),n={type:"hasOne",columnName:r,model:i,constraintName:"None",foreignKey:t?String(t):o},s=E.getMetadata(G,e)||[];s.push(n),E.defineMetadata(G,s,e);}}function vs(i,t){return (e,r)=>{let o=()=>Se(e.constructor.table),n={type:"hasMany",columnName:r,model:i,constraintName:"None",foreignKey:t?String(t):o},s=E.getMetadata(G,e)||[];s.push(n),E.defineMetadata(G,s,e);}}function Bs(i,t,e,r){return (o,n)=>{let{leftForeignKey:s,rightForeignKey:a}=e??{},l=typeof t!="string",d=typeof t=="string"?t:()=>t().table,u=o.constructor.table,c=()=>Se(u),m=()=>Se(i().table),p=()=>k(S(d),s?String(s):c()),h={type:"manyToMany",columnName:n,model:i,constraintName:r?.constraintName??p,foreignKey:s?String(s):c,onDelete:r?.onDelete,onUpdate:r?.onUpdate,manyToManyOptions:{primaryModel:u,throughModel:d,leftForeignKey:s?String(s):c,rightForeignKey:a?String(a):m,wasModelProvided:l}},g=E.getMetadata(G,o)||[];g.push(h),E.defineMetadata(G,g,o);}}function Es(i){return E.getMetadata(G,i.prototype)||[]}function wt(i){return (E.getMetadata(G,i.prototype)||[]).map(e=>{let{type:r,model:o,columnName:n,foreignKey:s}=e,a=S(s),l=o();switch(r){case "belongsTo":return new Mt(l,n,a);case "hasOne":return new _t(l,n,a);case "hasMany":return new qt(l,n,a);case "manyToMany":if(!e.manyToManyOptions)throw new f("ModelDecorator::getRelations","MANY_TO_MANY_RELATION_MUST_HAVE_A_THROUGH_MODEL");let d=o();return new Ct(d,n,{primaryModel:e.manyToManyOptions.primaryModel,throughModel:S(e.manyToManyOptions.throughModel),leftForeignKey:S(e.manyToManyOptions.leftForeignKey),rightForeignKey:S(e.manyToManyOptions.rightForeignKey)});default:throw new f("ModelDecorator::getRelations",`UNKNOWN_RELATION_TYPE_${r}`)}})}function $s(i){return E.getMetadata(xt,i.prototype)}function Qs(i){return E.getMetadata(ks,i.prototype)||[]}function Ks(i){return E.getMetadata(Us,i.prototype)||[]}var y=class{constructor(t){this.model=t;let e=St(t);this.modelColumnsMap=new Map(e.map(r=>[r.columnName,r]));}formatStringColumn(t,e){if(e==="*")return "*";if(e.includes(".")){let[n,s]=e.split(".");if(s==="*")switch(t){case "mysql":case "mariadb":return `\`${n}\`.*`;case "postgres":case "cockroachdb":case "sqlite":return `"${n}".*`;default:throw new Error(`Unsupported database type: ${t}`)}let a=this.modelColumnsMap.get(s)?.databaseName??O(s,this.model.databaseCaseConvention);switch(t){case "mysql":case "mariadb":return `\`${n}\`.\`${a}\``;case "postgres":case "cockroachdb":case "sqlite":return `"${n}"."${a}"`;default:throw new Error(`Unsupported database type: ${t}`)}}let o=this.modelColumnsMap.get(e)?.databaseName??O(e,this.model.databaseCaseConvention);switch(t){case "mysql":case "mariadb":return `\`${o}\``;case "postgres":case "cockroachdb":case "sqlite":return `"${o}"`;default:throw new Error(`Unsupported database type: ${t}`)}}formatStringTable(t,e){e=e.replace(/\s+/g," ").trim();let r="";switch(e.toLowerCase().includes(" as ")&&([e,r]=e.split(" as ")),t){case "mysql":case "mariadb":return `\`${e}\`${r?` as \`${r}\``:""}`;case "postgres":case "cockroachdb":case "sqlite":return `"${e}"${r?` as "${r}"`:""}`;default:return `${e}${r?` as ${r}`:""}`}}async prepareColumns(t,e,r="insert"){if(!t.length)return {columns:t,values:e};let o=[],n=[];for(let s=0;s<t.length;s++){let a=t[s],l=e[s];a==="*"||a==="$annotations"||(o.push(a),n.push(l));}await Promise.all(o.map(async(s,a)=>{let l=o[a],d=n[a],u=this.modelColumnsMap.get(l),c=d;u&&(r==="insert"&&u.prepare?c=await u.prepare(d):r==="update"&&(c=await u.prepare?.(d)??d)),n[a]=c;}));for(let s of this.modelColumnsMap.keys())if(!o.includes(s)){let a=this.modelColumnsMap.get(s);if(!a||r==="insert"&&s===this.model.primaryKey&&!a.prepare)continue;(r==="insert"||a.autoUpdate)&&(o.push(s),n.push(a.prepare?.(void 0)??void 0));}return {columns:o,values:n}}getFromForWriteOperations(t,e){if(typeof e.table=="string")return this.formatStringTable(t,e.table);let r=new N(this.model,t);return Array.isArray(e.table)?`(${r.parse(e.table).sql})`:`(${r.parse([e.table]).sql})`}};var _r=class{toSql(t){let e=t,o=new y(this.model).formatStringTable("mysql",e.table);if(!e.children||!e.children.length)return {sql:"",bindings:[]};let n=new N(this.model,"mysql"),s=[],a=[];for(let m of e.children){let{sql:p,bindings:h}=n.parse([m]);if(m.file==="add_column")s.push(p);else if(m.file==="add_constraint"||m.folder==="constraint"){let g=s[s.length-1]??"",w=/^\s*add\s+column\b/i.test(g),C=/^\s*add\s+constraint\b/i.test(p);if(w&&!C){let P=p.replace(/^\s*add\s+/i,"").trimStart();s[s.length-1]=`${g} ${P}`;}else {let P=/^\s*add\b/i.test(p)?p:`add ${p}`;s.push(P);}}else m.file==="set_default"||m.file==="drop_default"||m.file==="set_not_null"||m.file,s.push(p);a.push(...h);}let l=s.join(", "),d=e.ifExists?"if exists ":"";return {sql:/^\s*drop\s+index\b/i.test(l)?l:`${d}${o} ${l}`,bindings:a}}},Ls=new _r;var Cr=class{toSql(t){return {sql:`drop column \`${t.column}\``,bindings:[]}}},Fs=new Cr;var Rr=class{toSql(t){return {sql:`drop constraint \`${t.constraintName}\``,bindings:[]}}},Ws=new Rr;var xr=class{toSql(t){return {sql:`alter column \`${t.column}\` drop default`,bindings:[]}}},js=new xr;var Ar=class{toSql(t){return {sql:"",bindings:[]}}},Vs=new Ar;var Dr=class{toSql(t){return {sql:"drop primary key",bindings:[]}}},Hs=new Dr;var Pr=class{toSql(t){let e=t;return {sql:`rename column \`${e.oldName}\` to \`${e.newName}\``,bindings:[]}}},Ys=new Pr;var Or=class{toSql(t){return {sql:`\`${t.newName}\``,bindings:[]}}},Js=new Or;var Ir=class{toSql(t){let e=t,r=e.defaultValue;return r==="NULL"?r="null":r==="TRUE"||r==="FALSE"?r=r.toLowerCase():typeof r=="string"&&r!=="null"&&r!=="true"&&r!=="false"&&(r=`'${r}'`),{sql:`alter column \`${e.column}\` set default ${r}`,bindings:[]}}},zs=new Ir;var vr=class{toSql(t){return {sql:"",bindings:[]}}},Gs=new vr;var Br=class{toSql(t){let e=t;if(e.isRawValue)return {sql:e.column,bindings:[]};let o=new y(this.model).formatStringColumn("mysql",S(e.column)),n=e.dataType.toLowerCase();if(n==="char"){let s=e.length??1;return {sql:`${o} char(${s})`,bindings:[]}}else if(n==="varchar"){let s=e.length??255;return {sql:`${o} varchar(${s})`,bindings:[]}}else {if(n==="uuid")return {sql:`${o} varchar(36)`,bindings:[]};if(n==="ulid")return {sql:`${o} varchar(26)`,bindings:[]};if(n==="longtext"||n==="mediumtext"||n==="tinytext"||n==="text")return {sql:`${o} ${n}`,bindings:[]};if(n==="integer"||n==="int"){let s="int";return e.autoIncrement&&(s+=" auto_increment"),{sql:`${o} ${s}`,bindings:[]}}else {if(n==="tinyint")return {sql:`${o} tinyint`,bindings:[]};if(n==="smallint")return {sql:`${o} smallint`,bindings:[]};if(n==="mediumint")return {sql:`${o} mediumint`,bindings:[]};if(n==="bigint"){let s="bigint";return e.autoIncrement&&(s+=" auto_increment"),{sql:`${o} ${s}`,bindings:[]}}else {if(n==="float")return {sql:`${o} float`,bindings:[]};if(n==="double")return {sql:`${o} double`,bindings:[]};if(n==="real")return {sql:`${o} double`,bindings:[]};if(n==="decimal"){let s=e.precision??10,a=e.scale??0;return {sql:`${o} decimal(${s}, ${a})`,bindings:[]}}else if(n==="numeric"){let s=e.precision??10,a=e.scale??0;return {sql:`${o} numeric(${s}, ${a})`,bindings:[]}}else {if(n==="date")return {sql:`${o} date`,bindings:[]};if(n==="time"){let s=typeof e.precision=="number"?`(${e.precision})`:"";return {sql:`${o} time${s}`.trimEnd(),bindings:[]}}else if(n==="datetime"){let s=typeof e.precision=="number"?`(${e.precision})`:"";return {sql:`${o} datetime${s}`.trimEnd(),bindings:[]}}else if(n==="timestamp"){let s=typeof e.precision=="number"?`(${e.precision})`:"";return {sql:`${o} timestamp${s}`.trimEnd(),bindings:[]}}else {if(n==="year")return {sql:`${o} year`,bindings:[]};if(n==="boolean")return {sql:`${o} boolean`,bindings:[]};if(n==="varbinary"){let s=e.length??255;return {sql:`${o} varbinary(${s})`,bindings:[]}}else if(n==="binary"){let s=e.length??255;return {sql:`${o} binary(${s})`,bindings:[]}}else {if(n==="bytea"||n==="blob")return {sql:`${o} blob`,bindings:[]};if(n==="json"||n==="jsonb")return {sql:`${o} json`,bindings:[]};if(n==="enum"){if(e.enumValues&&e.enumValues.length>0){let s=e.enumValues.map(a=>`'${a}'`).join(", ");return {sql:`${o} enum(${s})`,bindings:[]}}return {sql:`${o} text`,bindings:[]}}}}}}}}return {sql:`${o} ${n} ${e.length?`(${e.length})`:""}`,bindings:[]}}},Zs=new Br;var Er=class{toSql(t){return {sql:`after \`${t.column}\``,bindings:[]}}},Xs=new Er;var $r=class{toSql(t){let e=t,r=new y(this.model);if(e.constraintType==="primary_key"){let o=(e.columns??[]).map(s=>r.formatStringColumn("mysql",S(s))).join(", ");return {sql:`${e.constraintName?`constraint \`${e.constraintName}\` `:""}primary key (${o})`,bindings:[]}}if(e.constraintType==="unique"){if(e.columns&&e.columns.length>0){let o=e.columns.map(s=>r.formatStringColumn("mysql",S(s))).join(", "),n=e.constraintName?`constraint \`${e.constraintName}\` `:"";return e.constraintName?{sql:`${n}unique (${o})`,bindings:[]}:{sql:"unique",bindings:[]}}return {sql:"unique",bindings:[]}}if(e.constraintType==="not_null")return {sql:"not null",bindings:[]};if(e.constraintType==="null")return {sql:"null",bindings:[]};if(e.constraintType==="default"){let o=e.defaultValue;return o==="NULL"?{sql:"default null",bindings:[]}:o==="TRUE"||o==="FALSE"?{sql:`default ${o.toLowerCase()}`,bindings:[]}:o===null?{sql:"default null",bindings:[]}:(typeof o=="string"&&(o=`'${o}'`),{sql:`default ${o}`,bindings:[]})}if(e.constraintType==="foreign_key"){if(!e.references)return {sql:"",bindings:[]};let o=(e.columns??[]).map(d=>r.formatStringColumn("mysql",S(d))).join(", "),n=r.formatStringTable("mysql",e.references.table),s=e.references.columns.map(d=>r.formatStringColumn("mysql",S(d))).join(", "),l=`${e.constraintName?`constraint \`${e.constraintName}\` `:""}foreign key (${o}) references ${n}(${s})`;return e.onDelete&&(l+=` on delete ${e.onDelete}`),e.onUpdate&&(l+=` on update ${e.onUpdate}`),{sql:l,bindings:[]}}return {sql:"",bindings:[]}}},ei=new $r;var Qr=class{toSql(t){let e=t,o=new y(this.model).formatStringTable("mysql",e.table);if(!e.children||!e.children.length)return {sql:`${o} ()`,bindings:[]};let n=new N(this.model,"mysql"),s=[],a=[];for(let c of e.children){let{sql:m,bindings:p}=n.parse([c]);if(c.folder==="constraint"){let h=s.pop()??"",g=m;if(/not null/i.test(g)||/null/i.test(g)||/default/i.test(g)){let w=`${h} ${g}`.trim();w=w.replace(/(references\s+`[^`]+`\s*\([^)]*\))\s+not null/i,"not null $1"),s.push(w),a.push(...p);continue}s.push(h),s.push(g),a.push(...p);continue}s.push(m),a.push(...p);}for(let c of e.namedConstraints){let{sql:m,bindings:p}=n.parse([c]);s.push(m),a.push(...p);}let l=s.join(", ");return {sql:`${e.ifNotExists?"if not exists ":""}${o} (${l})`,bindings:a}}},ti=new Qr;var Kr=class{toSql(t){let e=t;return e.isRawValue&&typeof e.fromNode.table=="string"?{sql:e.fromNode.table,bindings:[]}:{sql:new y(this.model).getFromForWriteOperations("mysql",e.fromNode),bindings:[]}}},ri=new Kr;var kr=class{toSql(t){return {sql:"distinct",bindings:[]}}},oi=new kr;var Ur=class{toSql(t){return b.warn("MySQL does not support DISTINCT ON"),{sql:"",bindings:[]}}},ni=new Ur;var Lr=class{toSql(t){let e=t,o=new y(this.model).formatStringTable("mysql",e.table);return {sql:`${e.ifExists?"if exists ":""}${o}`,bindings:[]}}},si=new Lr;var Fr=class{toSql(t){let e=t;if(typeof e.table=="string"){let a=new y(this.model);return e.alias&&e.alias.length>0?{sql:`${a.formatStringTable("mysql",e.table)} as \`${e.alias}\``,bindings:[]}:{sql:a.formatStringTable("mysql",e.table),bindings:[]}}let r=Array.isArray(e.table)?e.table:[e.table],n=new N(this.model,"mysql").parse(r),s=e.alias&&e.alias.length?` as \`${e.alias}\``:"";return {sql:`(${n.sql})${s}`,bindings:n.bindings}}},ii=new Fr;var Wr=class{toSql(t){let e=t;return e.isRawValue?{sql:e.column,bindings:[]}:{sql:new y(this.model).formatStringColumn("mysql",e.column),bindings:[]}}},ai=new Wr;var T=class{constructor(t,e=false){this.currParamIndex=1;this.isRawValue=false;this.keyword=t,this.isRawValue=e;}};var jr=class{toSql(t){let e=t;if(e.isRawValue)return {sql:e.column,bindings:e.value};let r=e.currParamIndex,o="",n=[];if(!(e.value instanceof T)&&!Array.isArray(e.value)&&(o=`${new y(this.model).formatStringColumn("mysql",e.column)} ${e.operator} $${r}`,n=[e.value]),Array.isArray(e.value)){let s=e.value.map((a,l)=>`$${r+l}`).join(", ");o=`${new y(this.model).formatStringColumn("mysql",e.column)} ${e.operator} (${s})`,n=e.value;}return e.isNegated&&(o=`not (${o})`),{sql:o.trim(),bindings:n}}},li=new jr;var Vr=class{toSql(t){let e=t,o=new y(this.model).formatStringTable("mysql",e.table),n=e.columns.map(a=>`\`${a}\``).join(", ");return {sql:`${e.unique?"unique ":""}\`${e.indexName}\` on ${o} (${n})`,bindings:[]}}},di=new Vr;var Hr=class{toSql(t){let e=t;if(!e.table)throw new Error("MySQL DROP INDEX requires table name");return {sql:`\`${e.indexName}\` on \`${e.table}\``,bindings:[]}}},mi=new Hr;var Yr=class{toSql(t){let e=t;if(e.isRawValue)return {sql:e.fromNode.table,bindings:[]};let r=new y(this.model),o=r.getFromForWriteOperations("mysql",e.fromNode);if(!e.records.length)return {sql:o,bindings:[]};let n=e.records[0],s=Object.keys(n);if(!s.length)return {sql:o,bindings:[]};let a=s.map(c=>r.formatStringColumn("mysql",c)).join(", "),l=[],d=[];for(let c of e.records){let m=s.map(h=>c[h]);l.push(...m);let p=Array(s.length).fill("?").join(", ");d.push(`(${p})`);}return {sql:`${o} (${a}) VALUES ${d.join(", ")}`,bindings:l}}},ui=new Yr;var Jr=class{toSql(t){let e=t;if(e.isRawValue)return {sql:e.table,bindings:[]};let r=new y(this.model),o=e.left;o.includes(".")||(o=`${e.table}.${o}`);let n=e.right;n.includes(".")||(n=`${this.model.table}.${n}`);let s=r.formatStringColumn("mysql",o),a=r.formatStringColumn("mysql",n);return {sql:`${r.formatStringTable("mysql",e.table)} on ${s} ${e.on?.operator} ${a}`,bindings:[]}}},ci=new Jr;var zr=class{toSql(t){return {sql:"?",bindings:[t.limit]}}},pi=new zr;var qd={for_update:"for update",for_share:"lock in share mode"},Gr=class{toSql(t){let e=t,r=qd[e.lockType]||"for update";return e.skipLocked&&(r+=" skip locked"),{sql:r,bindings:[]}}},yi=new Gr;var Zr=class{toSql(t){return {sql:"?",bindings:[t.offset]}}},fi=new Zr;var Xr=class{toSql(t){let e=t;if(e.isRawValue)return {sql:e.table,bindings:[]};let r=new y(this.model);if(e.mode==="ignore"){let n=e.conflictColumns?.[0]||"id",s=r.formatStringColumn("mysql",`${e.table}.${n}`);return {sql:`AS new ON DUPLICATE KEY UPDATE ${s} = ${s}`,bindings:[]}}return {sql:`AS new ON DUPLICATE KEY UPDATE ${e.columnsToUpdate.map(n=>`${r.formatStringColumn("mysql",n)} = new.${r.formatStringColumn("mysql",n)}`).join(", ")}`,bindings:[]}}},hi=new Xr;var eo=class{toSql(t){let e=t;if(e.isRawValue)return {sql:e.column,bindings:[]};let r=new y(this.model).formatStringColumn("mysql",e.column),o=e.direction.toLowerCase();return {sql:`${r} ${o}`,bindings:[]}}},gi=new eo;var to=class{toSql(t){return {sql:t.rawValue,bindings:[]}}},Ti=new to;var ro=class{toSql(t){return {sql:`SELECT
|
|
111
|
+
Valid database types are: [mongo, postgres, cockroachdb, mysql, mariadb, sqlite]`,`UNSUPPORTED_DATABASE_TYPE_${this.type}`)}}handleCockroachdbSource(t){this.host=t?.host||A.DB_HOST,this.port=+t?.port||+A.DB_PORT,this.username=t?.username||A.DB_USER,this.password=t?.password||A.DB_PASSWORD,this.database=t?.database||A.DB_DATABASE,this.logs=t?.logs||A.DB_LOGS||false,this.port||(this.port=26257);}handlePostgresSource(t){this.host=t?.host||A.DB_HOST,this.port=+t?.port||+A.DB_PORT,this.username=t?.username||A.DB_USER,this.password=t?.password||A.DB_PASSWORD,this.database=t?.database||A.DB_DATABASE,this.logs=t?.logs||A.DB_LOGS||false,this.port||(this.port=5432);}handleMysqlSource(t){this.host=t?.host||A.DB_HOST,this.port=+t?.port||+A.DB_PORT,this.username=t?.username||A.DB_USER,this.password=t?.password||A.DB_PASSWORD,this.database=t?.database||A.DB_DATABASE,this.logs=t?.logs||A.DB_LOGS||false,this.port||(this.port=3306);}handleSqliteSource(t){this.database=t?.database||A.DB_DATABASE,this.logs=t?.logs||A.DB_LOGS||false;}handleMongoSource(t){this.url=t?.url||A.MONGO_URL,this.logs=t?.logs||A.MONGO_LOGS||false;}};var Vl=i=>{let{required:t,...e}=i.openApi||{},r={...e,type:i.openApi?.type||"string",description:i.openApi?.description??`Property: ${i.columnName}`};return i.openApi?.type?{...r,type:i.openApi.type}:Array.isArray(i.type)?{...r,type:"string",enum:i.type}:i.type==="date"||i.type==="datetime"||i.type==="timestamp"||i.type==="time"?{...r,type:"string",format:"date-time"}:i.type==="boolean"?{...r,type:"boolean"}:i.type==="integer"||i.type==="tinyint"||i.type==="smallint"||i.type==="mediumint"||i.type==="increment"?{...r,type:"integer",format:"int32"}:i.type==="biginteger"||i.type==="bigIncrement"?{...r,type:"integer",format:"int64"}:i.type==="float"||i.type==="real"?{...r,type:"number",format:"float"}:i.type==="double"?{...r,type:"number",format:"double"}:i.type==="decimal"||i.type==="numeric"?{...r,type:"number"}:i.type==="json"||i.type==="jsonb"?{...r,type:"object"}:i.type==="uuid"?{...r,type:"string",format:"uuid"}:i.type==="ulid"?{...r,type:"string",format:"ulid"}:i.type==="string"||i.type==="char"||i.type==="varchar"||i.type==="text"||i.type==="longtext"||i.type==="mediumtext"||i.type==="tinytext"?{...r,type:"string"}:i.type==="blob"||i.type==="binary"||i.type==="varbinary"||i.type==="tinyblob"||i.type==="mediumblob"||i.type==="longblob"?{...r,type:"string",format:"binary"}:i.type==="year"?{...r,type:"integer",format:"int32"}:r},Hl=i=>i.openApi?.required??false,Yl=i=>{let t=i.getColumns(),e={};for(let r of t)r.hidden||(e[r.columnName]=Vl(r));return e},Jl=i=>{let t=i.getColumns(),e=[];for(let r of t)Hl(r)&&e.push(r.columnName);return e||[]},zl=i=>{let t=Yl(i),e=Jl(i);return {type:"object",properties:t,required:e.length?e:[]}};var fs=i=>i.map(t=>({...zl(t),modelName:t.name}));var gt=i=>{switch(i){case "mysql":return "mysql";case "mariadb":return "mariadb";case "postgres":case "cockroachdb":return "postgresql";case "sqlite":return "sqlite";default:return "sql"}},gs=i=>{if(i==null)return "NULL";if(i instanceof Date)return `'${i.toISOString()}'`;let t=typeof i;return t==="boolean"?i?"TRUE":"FALSE":t==="number"&&Number.isFinite(i)||t==="bigint"?String(i):t==="string"?`'${i.replace(/'/g,"''")}'`:Array.isArray(i)||t==="object"&&Object.keys(i).length>0?`'${JSON.stringify(i).replace(/'/g,"''")}'`:String(i)},Ts=(i,t)=>{let e=i;for(let r=0;r<t.length&&e.includes("?");r++)e=e.replace(/\?/,gs(t[r]));for(let r=0;r<t.length;r++){let o=new RegExp(`\\$${r+1}(?!\\d)`,"g");e=e.replace(o,gs(t[r]));}return e},Ve=(i,t)=>t?i==="mysql"||i==="mariadb"?t.code==="ER_NO_SUCH_TABLE"||t.errno===1146:i==="postgres"||i==="cockroachdb"?t.code==="42P01":i==="sqlite"?/no such table/i.test(String(t.message||"")):false:false,Tt=(i,t)=>{let e=i.getDbType(),r;try{r=sqlFormatter.format(t,{...i.inputDetails.queryFormatOptions,language:gt(e)});}catch{try{r=sqlFormatter.format(t,{...i.inputDetails.queryFormatOptions});}catch{r=t;}}return r};var hr=class{toSql(t){let e=t,r=new N(this.model,"mysql"),{sql:o}=r.parse([e.column]),n=e.inlineConstraints;if(n&&n.length>0){let s=[];for(let a of n){let{sql:l}=r.parse([a]);s.push(l);}s.length>0&&(o+=` ${s.join(" ")}`);}return {sql:`add column ${o}`,bindings:[]}}},bs=new hr;var gr=class{toSql(t){let e=t,r=new N(this.model,"mysql"),{sql:o}=r.parse([e.constraint]);return {sql:`add ${o}`,bindings:[]}}},Ns=new gr;var Tr=class{toSql(t){return {sql:`add primary key (${t.columns.map(o=>`\`${o}\``).join(", ")})`,bindings:[]}}},Ss=new Tr;var br=class{toSql(t){let e=t,r=new N(this.model,"mysql"),{sql:o}=r.parse([e.newType]),[,...n]=o.trim().split(/\s+/),s=n.join(" "),a=`modify column \`${e.column}\` ${s}`;if(e.options.nullable!==void 0){let l=e.options.nullable?"":" not null";a+=l;}if(e.options.dropDefault)a+=" drop default";else if(e.options.default!==void 0){let l=e.options.default;l===null?l="null":typeof l=="string"&&(l==="NULL"?l="null":l==="TRUE"||l==="FALSE"?l=l.toLowerCase():l=`'${l}'`),a+=` default ${l}`;}return e.options.unique!==void 0&&e.options.unique&&(a+=" unique"),{sql:a,bindings:[]}}},ws=new br;function Gl(i){return typeof i!="string"||!i?i:i.replace(/([a-z])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}function Zl(i){return typeof i!="string"||!i?i:i.replace(/([-_][a-z])/g,t=>t.toUpperCase().replace("-","").replace("_",""))}function O(i,t){return t==="preserve"?i:t==="snake"?Gl(i):t==="camel"?Zl(i):t instanceof RegExp?i.replace(t,e=>e[1].toUpperCase()):t(i)}Re__default.default.extend(td__default.default);Re__default.default.extend(ed__default.default);Re__default.default.extend(Xl__default.default);var bt=(i,t="ISO",e="UTC")=>{if(!(i instanceof Date)||isNaN(i.getTime()))throw new Error("Invalid date provided");let r=Re__default.default(i);if(e==="LOCAL"){let n=r.local();switch(t){case "ISO":return n.format("YYYY-MM-DD HH:mm:ss");case "DATE_ONLY":return n.format("YYYY-MM-DD");case "TIME_ONLY":return n.format("HH:mm:ss");default:return n.unix().toString()}}let o=r.utc();switch(t){case "ISO":return o.format("YYYY-MM-DD HH:mm:ss");case "DATE_ONLY":return o.format("YYYY-MM-DD");case "TIME_ONLY":return o.format("HH:mm:ss");default:return o.unix().toString()}},Ms=(i,t,e="UTC")=>{if(i===null)return null;if(i instanceof Date){if(isNaN(i.getTime()))throw new f("DateUtils::parseDate","INVALID_DATE_OBJECT");return i}try{let r=t?Re__default.default(i,t):Re__default.default(i);if(!r.isValid())throw new f("DateUtils::parseDate","INVALID_DATE_STRING");return e==="UTC"?r.utc().toDate():r.local().toDate()}catch{throw new f("DateUtils::parseDate","FAILED_TO_PARSE_DATE")}},ne=(i=new Date)=>Re__default.default(i).utc().format("YYYY-MM-DD HH:mm:ss");var qs=(i,t)=>{try{let e=pe__default.default.createHash("sha256").update(i).digest(),r=pe__default.default.randomBytes(16),o=pe__default.default.createCipheriv("aes-256-cbc",e,r),n=o.update(t,"utf8","hex");return n+=o.final("hex"),`${r.toString("hex")}:${n}`}catch(e){throw new f("Encryption::encryptSymmetric","FAILED_TO_ENCRYPT_SYMMETRICALLY",e instanceof Error?e:void 0)}},_s=(i,t)=>{try{let e=pe__default.default.createHash("sha256").update(i).digest(),[r,o]=t.split(":"),n=pe__default.default.createDecipheriv("aes-256-cbc",e,Buffer.from(r,"hex")),s=n.update(o,"hex","utf8");return s+=n.final("utf8"),s}catch(e){throw new f("Encryption::decryptSymmetric","FAILED_TO_DECRYPT_SYMMETRICALLY",e instanceof Error?e:void 0)}},Cs=(i,t)=>{try{let e=pe__default.default.randomBytes(32),r=pe__default.default.randomBytes(16),o=pe__default.default.createCipheriv("aes-256-cbc",e,r),n=o.update(t,"utf8","hex");n+=o.final("hex");let s=pe.publicEncrypt(i,e);return `${r.toString("hex")}:${s.toString("hex")}:${n}`}catch(e){throw new f("Encryption::encryptAsymmetric","FAILED_TO_ENCRYPT_ASYMMETRICALLY",e instanceof Error?e:void 0)}},Rs=(i,t)=>{try{let[e,r,o]=t.split(":"),n=pe.privateDecrypt(i,Buffer.from(r,"hex")),s=pe__default.default.createDecipheriv("aes-256-cbc",n,Buffer.from(e,"hex")),a=s.update(o,"hex","utf8");return a+=s.final("utf8"),a}catch(e){throw new f("Encryption::decryptAsymmetric","FAILED_TO_DECRYPT_ASYMMETRICALLY",e instanceof Error?e:void 0)}};var B=class{static defineMetadata(t,e,r,o){if((typeof r!="object"||r===null)&&typeof r!="function")throw new TypeError("target must be an object or function");let n=this.store.get(r);n||(n=new Map,this.store.set(r,n));let s=n.get(o);s||(s=new Map,n.set(o,s)),s.set(t,e);}static getMetadata(t,e,r){if((typeof e!="object"||e===null)&&typeof e!="function")throw new TypeError("target must be an object or function");let o=e;for(;o;){let n=this.store.get(o);if(n){let s=n.get(r);if(s&&s.has(t))return s.get(t)}o=Object.getPrototypeOf(o);}}};B.store=new WeakMap;var Sr="0123456789ABCDEFGHJKMNPQRSTVWXYZ",Nr=Sr.length,sd=10,id=16,ad=(i,t)=>{let e="";for(let r=0;r<t;r++){let o=i%Nr;e=Sr.charAt(o)+e,i=(i-o)/Nr;}return e},ld=i=>{let t=pe.randomBytes(i),e="";for(let r=0;r<i;r++){let o=t[r];e+=Sr.charAt(o%Nr);}return e},xs=()=>{let i=Math.floor(Date.now()/1e3),t=ad(i,sd),e=ld(id);return t+e};function wr(i){return i.replace(/^[`"]|[`"]$/g,"")}function Mr(i,t,e){if(!i.includes(".")){let n=wr(i);return `${t}.${n}`}let[r,o]=i.split(".");return r=wr(r),o=wr(o),r!==e?i:o==="*"?`${t}.*`:`${t}.${o}`}function S(i){return typeof i=="function"?i():i}var E=(i,t=new WeakMap)=>{if(i===null||typeof i!="object")return i;if(t.has(i))return t.get(i);if(Array.isArray(i)){let r=[];t.set(i,r);for(let o=0;o<i.length;o++)r[o]=E(i[o],t);return r}let e=Object.create(Object.getPrototypeOf(i)||{});t.set(i,e);for(let r of Object.getOwnPropertyNames(i)){let o=i[r];if(typeof o=="function"){e[r]=o;continue}e[r]=E(o,t);}return e};var Be=class{};Be.modelCaseConvention="camel",Be.databaseCaseConvention="snake";var dd=async(i,t,e,r,o=[],n=[],s=false)=>{let a=new t,l=new Set(e.filter(c=>c.hidden).map(c=>c.columnName)),d=new Map(e.map(c=>[c.databaseName,c])),u=o.length?new Set(o):null;if(await Promise.all(Object.keys(i).map(async c=>{let m=i[c],p=d.get(c)?.columnName??O(c,t.modelCaseConvention);if(p==="$annotations"&&!s){md(i,c,a,t,n);return}if(!r.has(p)||l.has(p)||u&&!u.has(p))return;if(m===null){a[p]=null;return}let h=r.get(p);if(h&&h.serialize){a[p]=await h.serialize(m);return}a[p]=m;})),u)for(let c of u)c in a||(a[c]=null);return a},md=(i,t,e,r,o=[])=>{let n=i[t];if(!n||!Object.keys(n).length)return;let s=o.length>0?new Set(o):null;if(!s)return;let a={};for(let l of Object.keys(n))s.has(l)&&(a[O(l,r.modelCaseConvention)]=n[l]);Object.keys(a).length>0&&(e[t]=a);},se=async(i,t,e=[],r=[],o=false)=>{if(!i.length)return null;let n=t.getColumns(),s=new Map(n.map(d=>[d.columnName,d])),a=[];for(let d of e){if(d.toLowerCase().includes("as"))continue;let u=d;if(u.includes(".")&&(u=u.split(".").pop()),u==="*")continue;let c=s.get(u)?.columnName??O(u,t.modelCaseConvention);a.push(c);}e=a;let l=await Promise.all(i.map(async d=>await dd(d,t,n,s,e,r,o)));return l.length===1?l[0]:l};var As=["postgres","cockroachdb"];function Ds(i){let t=i.name,e=O(t,"snake");return ud__default.default(e)}function Ps(){return {}}var He=class He extends Be{static get table(){let t=Object.getOwnPropertyDescriptor(this,"table");return t&&"value"in t?t.value:Ds(this)}static set table(t){Object.defineProperty(this,"table",{value:t,writable:true,enumerable:true,configurable:true});}static get primaryKey(){return $s(this)}constructor(){super();}static async all(t={}){return await this.dispatchModelManager(t).find({ignoreHooks:t.ignoreHooks?["afterFetch","beforeFetch"]:[]})}static query(t){return this.dispatchModelManager(t).query()}static dryQuery(t){return this.dispatchModelManager(t).dryQuery()}static async first(t){return this.dispatchModelManager(t).query().one({ignoreHooks:t?.ignoreHooks?["afterFetch","beforeFetch"]:[]})}static async find(t,e){return await this.dispatchModelManager(e).find(t)}static async findOneOrFail(t,e){return await this.dispatchModelManager(e).findOneOrFail(t)}static async findOne(t,e){return await this.dispatchModelManager(e).findOne(t)}static async findBy(t,e,r={}){return await this.dispatchModelManager(r).find({ignoreHooks:r.ignoreHooks?["afterFetch","beforeFetch"]:[],where:{[t]:e}})}static async findOneBy(t,e,r={}){return await this.dispatchModelManager(r).findOne({ignoreHooks:r.ignoreHooks?["afterFetch","beforeFetch"]:[],where:{[t]:e}})}static async findOneByPrimaryKey(t,e={}){return await this.dispatchModelManager(e).findOneByPrimaryKey(t)}static async refresh(t,e={}){let r=this,o=r.dispatchModelManager(e),n=r.primaryKey,s=t[n],a=await o.findOneByPrimaryKey(s);return a||null}static async insert(t,e={}){return this.dispatchModelManager(e).insert(t,{ignoreHooks:e.ignoreHooks,returning:e.returning})}static async insertMany(t,e={}){return t.length?this.dispatchModelManager(e).insertMany(t,{ignoreHooks:e.ignoreHooks,returning:e.returning}):[]}static async sync(t,e,r,o,n={}){if(Array.isArray(r)||(r=[r]),!r.length)return;let s=this,l=wt(s).find(h=>h.columnName===t);if(!l)throw new f(`${s.name}::sync`,"RELATION_NOT_FOUND");if(l.type!=="manyToMany")throw new f(`${s.name}::sync`,"RELATION_NOT_MANY_TO_MANY");let d=O(l.leftForeignKey,n.caseConvention||s.databaseCaseConvention),u=O(l.rightForeignKey,n.caseConvention||s.databaseCaseConvention),c=r.map((h,g)=>({[d]:e[s.primaryKey],[u]:h[l.model.primaryKey],...o?o(h,g):{}}));class m extends He{static get table(){return l.throughModel}}m.databaseCaseConvention="preserve",m.modelCaseConvention="preserve",await m.dispatchModelManager(n).insertMany(c);}static async updateRecord(t,e,r={}){try{let o=this,n=o.dispatchModelManager(r);return e&&o.combineProps(t,e),await n.updateRecord(t)}catch(o){throw o instanceof f&&o.message==="MODEL_HAS_NO_PRIMARY_KEY"?new f(`${this.name}::updateRecord`,"MODEL_HAS_NO_PRIMARY_KEY"):o}}static async firstOrInsert(t,e,r={}){r.fullResponse||(r.fullResponse=false);let n=this.dispatchModelManager(r),s=await n.findOne({where:t});if(s)return r.fullResponse?{isNew:false,model:s}:s;let a=await n.insert(e);return r.fullResponse?{isNew:true,model:a}:a}static async upsert(t,e,r={updateOnConflict:true}){let o=this,n=o.dispatchModelManager(r),a=Object.keys(t).length>0?await n.findOne({ignoreHooks:r.ignoreHooks?["afterFetch","beforeFetch"]:[],where:t}):null;return a?(e[o.primaryKey]=a[o.primaryKey],r.updateOnConflict?await n.updateRecord(e,{returning:r.returning}):a):await n.insert(e,{ignoreHooks:r.ignoreHooks,returning:r.returning??["*"]})}static async upsertMany(t,e,r={updateOnConflict:true}){if(!e.length)return [];let o=this,n=o.dispatchModelManager(r);if(!e.every(c=>{let m=new Set(Object.keys(c));return t.every(p=>m.has(p))}))throw new f("Model::upsertMany","CONFLICT_COLUMNS_NOT_PRESENT_IN_DATA");let s=Object.keys(e[0]),a=await n.upsertMany(t,s,e,{ignoreHooks:r.ignoreHooks,returning:r.returning,updateOnConflict:r.updateOnConflict??true}),l=o.sqlInstance.getDbType();if(As.includes(l))return await se(a,o,r.returning);let d=n.query();r.returning?.length&&d.select(...r.returning);let u=new Map;return t.forEach(c=>{e.forEach(m=>{u.set(c,[...u.get(c)||[],m[c]]);});}),d.where(c=>{t.forEach(m=>{c.orWhereIn(m,u.get(m)||[]);});}),d.many({ignoreHooks:r.ignoreHooks?["afterFetch","beforeFetch"]:[]})}static async deleteRecord(t,e){return this.dispatchModelManager(e).deleteRecord(t)}static async softDelete(t,e,r){let o=this,{column:n=o.softDeleteColumn,value:s=o.softDeleteValue}=e||{};return t[n]=s,await o.dispatchModelManager({trx:r?.trx,connection:r?.connection}).updateRecord(t),typeof s=="string"?(t[n]=new Date(s),t):(t[n]=s,t)}static async truncate(t={}){return this.dispatchModelManager(t).query().truncate()}static async getTableInfo(){let t=this;return t.establishConnection(),t.sqlInstance.getTableInfo(t.table)}static async getIndexInfo(){let t=this;return t.establishConnection(),t.sqlInstance.getIndexInfo(t.table)}static async getTableSchema(){let t=this;return t.establishConnection(),t.sqlInstance.getTableSchema(t.table)}static combineProps(t,e){for(let r in e)Object.assign(t,{[r]:e[r]});}static getColumns(){return St(this)}static getRelations(){return Es(this)}static getIndexes(){return Qs(this)}static getUniques(){return Ks(this)}static column(t,...e){$(...e)(this.prototype,t);}static hasOne(t,...e){Is(...e)(this.prototype,t);}static hasMany(t,...e){vs(...e)(this.prototype,t);}static belongsTo(t,...e){Os(...e)(this.prototype,t);}static manyToMany(t,...e){Bs(...e)(this.prototype,t);}static establishConnection(){let t=Ne.getInstance();if(!t)throw new f("sqlInstance not initialized, did you defined it in SqlDataSource.connect static method?","CONNECTION_NOT_ESTABLISHED");this.sqlInstance=t;}static dispatchModelManager(t){if(t?.connection)return t.connection.getModelManager(this);if(t?.trx)return t.trx.sql.getModelManager(this);let e=this;return e.establishConnection(),e.sqlInstance.getModelManager(e)}async save(t={}){let e=this,r=e.constructor,o=r.primaryKey;if(!o)throw new f(r.name+"::save","MODEL_HAS_NO_PRIMARY_KEY");let n=e[o],s=n?{[o]:n}:{},a=e,l=await r.upsert(s,a,{updateOnConflict:true,...t});return r.combineProps(this,l),this}async update(t,e={}){let r=this,o=r.constructor,n=o.primaryKey;if(!n)throw new f(o.name+"::save","MODEL_HAS_NO_PRIMARY_KEY");if(!r[n])throw new f(o.name+"::update","MODEL_HAS_NO_PRIMARY_KEY_VALUE");await o.updateRecord(r,t,e);}async softDelete(t,e){let r=this,o=r.constructor,n=o.primaryKey;if(!n)throw new f(o.name+"::softDelete","MODEL_HAS_NO_PRIMARY_KEY");if(!r[n])throw new f(o.name+"::softDelete","MODEL_HAS_NO_PRIMARY_KEY_VALUE");await o.softDelete(r,t,e);}async delete(t={}){let e=this,r=e.constructor,o=r.primaryKey;if(!o)throw new f(r.name+"::delete","MODEL_HAS_NO_PRIMARY_KEY");if(!e[o])throw new f(r.name+"::delete","MODEL_HAS_NO_PRIMARY_KEY_VALUE");await r.deleteRecord(this,t);}async refresh(t){let e=this,r=e.constructor,o=r.primaryKey;if(!o)throw new f(r.name+"::refresh","MODEL_HAS_NO_PRIMARY_KEY");if(!e[o])throw new f(r.name+"::refresh","MODEL_HAS_NO_PRIMARY_KEY_VALUE");let s=await r.refresh(this,t);return r.combineProps(this,s),this}};He.softDeleteColumn="deletedAt",He.softDeleteValue=ne();var Nt=He;var ie=class{constructor(t,e){this.model=Nt;this.columnName="";this.relatedModel="";this.model=t,this.columnName=e,this.relatedModel=this.model.table;}};var Mt=class extends ie{constructor(t,e,r){super(t,e),this.foreignKey=r,this.type="belongsTo";}};var qt=class extends ie{constructor(e,r,o){super(e,r);this.type="hasMany";this.foreignKey=o,this.type="hasMany";}};var _t=class extends ie{constructor(t,e,r){super(t,e),this.foreignKey=r,this.type="hasOne";}};var Ct=class extends ie{constructor(e,r,o){super(e,r);this.type="manyToMany";this.primaryModel=o.primaryModel,this.relatedModel=e.table,this.throughModel=o.throughModel,this.leftForeignKey=o.leftForeignKey,this.rightForeignKey=o.rightForeignKey;}};var Rt=Symbol("columns"),xt=Symbol("primaryKey"),G=Symbol("relations"),ks=Symbol("indexes"),Us=Symbol("uniques"),Se=i=>`${ud__default.default.singular(i)}_id`,qr=(i,t)=>`idx_${i}_${t}`,Z=(i,t)=>`uq_${i}_${t}`,k=(i,t,e)=>`fk_${i}_${t}${e?`_${e}`:""}`,we=(i,t)=>`pk_${i}_${t}`;function $(i={primaryKey:false}){let t=i?.primaryKey??false;return (e,r)=>{let o=e.constructor;if(t){if(B.getMetadata(xt,e))throw new f("ModelDecorator::column","MULTIPLE_PRIMARY_KEYS_NOT_ALLOWED");B.defineMetadata(xt,r,e);}let n=i.databaseName??O(r,o.databaseCaseConvention),s={columnName:r,serialize:i.serialize,prepare:i.prepare,hidden:i.hidden,isPrimary:t,primaryKeyConstraintName:i.primaryKeyConstraintName??we(o.table,r),autoUpdate:i.autoUpdate,databaseName:n,openApi:i.openApi,type:i.type,length:i?.length,precision:i?.precision,scale:i?.scale,withTimezone:i?.withTimezone,constraints:{nullable:i.nullable,default:i.default}},a=B.getMetadata(Rt,e)||[];a.push(s),B.defineMetadata(Rt,a,e);}}$.primary=yd;$.date=wd;$.boolean=Sd;$.json=Md;$.uuid=gd;$.ulid=Td;$.integer=hd;$.float=fd;$.encryption={symmetric:bd,asymmetric:Nd};function yd(i={}){return $({...i,primaryKey:true})}function fd(i={}){return $({type:"float",...i,serialize:t=>{if(t!==void 0)return t===null?null:typeof t=="number"?t:typeof t=="string"?+t:Number.parseFloat(t)}})}function hd(i={}){return $({type:"integer",...i,serialize:t=>{if(t!==void 0)return t===null?null:typeof t=="number"?t:typeof t=="string"?+t:Number.parseInt(t)}})}function gd(i={}){return $({type:"uuid",...i,prepare:t=>t||pe__default.default.randomUUID()})}function Td(i={}){return $({type:"ulid",...i,prepare:t=>t||xs()})}function bd(i){return $({...i,prepare:t=>t&&qs(i.key,t),serialize:t=>t&&_s(i.key,t)})}function Nd(i){return $({...i,prepare:t=>t&&Cs(i.publicKey,t),serialize:t=>t&&Rs(i.privateKey,t)})}function Sd(i={}){return $({type:"boolean",...i,serialize:t=>!!t,prepare:t=>!!t})}function wd(i={}){let{format:t="ISO",timezone:e="UTC",autoUpdate:r=false,autoCreate:o=false,...n}=i;return $({type:"datetime",...n,autoUpdate:r,prepare:s=>s?r?bt(new Date,t,e):typeof s=="string"?s:bt(s,t,e):o?bt(new Date,t,e):null,serialize:s=>{if(s!==void 0)return s===null?null:Ms(s,t,e)}})}function Md(i={}){return $({type:"jsonb",...i,serialize:t=>typeof t=="string"?JSON.parse(t):t,prepare:t=>typeof t!="string"?JSON.stringify(t):t})}function St(i){try{return B.getMetadata(Rt,i.prototype)||[]}catch{return []}}function Os(i,t,e){return (r,o)=>{let n=()=>Se(i().table),s=()=>{let d=r.constructor.table,u=t||n();return k(d,u,i().table)},a={type:"belongsTo",columnName:o,model:i,foreignKey:t?String(t):n,constraintName:e?.constraintName??s,onUpdate:e?.onUpdate,onDelete:e?.onDelete},l=B.getMetadata(G,r)||[];l.push(a),B.defineMetadata(G,l,r);}}function Is(i,t){return (e,r)=>{let o=()=>Se(e.constructor.table),n={type:"hasOne",columnName:r,model:i,constraintName:"None",foreignKey:t?String(t):o},s=B.getMetadata(G,e)||[];s.push(n),B.defineMetadata(G,s,e);}}function vs(i,t){return (e,r)=>{let o=()=>Se(e.constructor.table),n={type:"hasMany",columnName:r,model:i,constraintName:"None",foreignKey:t?String(t):o},s=B.getMetadata(G,e)||[];s.push(n),B.defineMetadata(G,s,e);}}function Bs(i,t,e,r){return (o,n)=>{let{leftForeignKey:s,rightForeignKey:a}=e??{},l=typeof t!="string",d=typeof t=="string"?t:()=>t().table,u=o.constructor.table,c=()=>Se(u),m=()=>Se(i().table),p=()=>k(S(d),s?String(s):c()),h={type:"manyToMany",columnName:n,model:i,constraintName:r?.constraintName??p,foreignKey:s?String(s):c,onDelete:r?.onDelete,onUpdate:r?.onUpdate,manyToManyOptions:{primaryModel:u,throughModel:d,leftForeignKey:s?String(s):c,rightForeignKey:a?String(a):m,wasModelProvided:l}},g=B.getMetadata(G,o)||[];g.push(h),B.defineMetadata(G,g,o);}}function Es(i){return B.getMetadata(G,i.prototype)||[]}function wt(i){return (B.getMetadata(G,i.prototype)||[]).map(e=>{let{type:r,model:o,columnName:n,foreignKey:s}=e,a=S(s),l=o();switch(r){case "belongsTo":return new Mt(l,n,a);case "hasOne":return new _t(l,n,a);case "hasMany":return new qt(l,n,a);case "manyToMany":if(!e.manyToManyOptions)throw new f("ModelDecorator::getRelations","MANY_TO_MANY_RELATION_MUST_HAVE_A_THROUGH_MODEL");let d=o();return new Ct(d,n,{primaryModel:e.manyToManyOptions.primaryModel,throughModel:S(e.manyToManyOptions.throughModel),leftForeignKey:S(e.manyToManyOptions.leftForeignKey),rightForeignKey:S(e.manyToManyOptions.rightForeignKey)});default:throw new f("ModelDecorator::getRelations",`UNKNOWN_RELATION_TYPE_${r}`)}})}function $s(i){return B.getMetadata(xt,i.prototype)}function Qs(i){return B.getMetadata(ks,i.prototype)||[]}function Ks(i){return B.getMetadata(Us,i.prototype)||[]}var y=class{constructor(t){this.model=t;let e=St(t);this.modelColumnsMap=new Map(e.map(r=>[r.columnName,r]));}formatStringColumn(t,e){if(e==="*")return "*";if(e.includes(".")){let[n,s]=e.split(".");if(s==="*")switch(t){case "mysql":case "mariadb":return `\`${n}\`.*`;case "postgres":case "cockroachdb":case "sqlite":return `"${n}".*`;default:throw new Error(`Unsupported database type: ${t}`)}let a=this.modelColumnsMap.get(s)?.databaseName??O(s,this.model.databaseCaseConvention);switch(t){case "mysql":case "mariadb":return `\`${n}\`.\`${a}\``;case "postgres":case "cockroachdb":case "sqlite":return `"${n}"."${a}"`;default:throw new Error(`Unsupported database type: ${t}`)}}let o=this.modelColumnsMap.get(e)?.databaseName??O(e,this.model.databaseCaseConvention);switch(t){case "mysql":case "mariadb":return `\`${o}\``;case "postgres":case "cockroachdb":case "sqlite":return `"${o}"`;default:throw new Error(`Unsupported database type: ${t}`)}}formatStringTable(t,e){e=e.replace(/\s+/g," ").trim();let r="";switch(e.toLowerCase().includes(" as ")&&([e,r]=e.split(" as ")),t){case "mysql":case "mariadb":return `\`${e}\`${r?` as \`${r}\``:""}`;case "postgres":case "cockroachdb":case "sqlite":return `"${e}"${r?` as "${r}"`:""}`;default:return `${e}${r?` as ${r}`:""}`}}async prepareColumns(t,e,r="insert"){if(!t.length)return {columns:t,values:e};let o=[],n=[];for(let s=0;s<t.length;s++){let a=t[s],l=e[s];a==="*"||a==="$annotations"||(o.push(a),n.push(l));}await Promise.all(o.map(async(s,a)=>{let l=o[a],d=n[a],u=this.modelColumnsMap.get(l),c=d;u&&(r==="insert"&&u.prepare?c=await u.prepare(d):r==="update"&&(c=await u.prepare?.(d)??d)),n[a]=c;}));for(let s of this.modelColumnsMap.keys())if(!o.includes(s)){let a=this.modelColumnsMap.get(s);if(!a||r==="insert"&&s===this.model.primaryKey&&!a.prepare)continue;(r==="insert"||a.autoUpdate)&&(o.push(s),n.push(a.prepare?.(void 0)??void 0));}return {columns:o,values:n}}getFromForWriteOperations(t,e){if(typeof e.table=="string")return this.formatStringTable(t,e.table);let r=new N(this.model,t);return Array.isArray(e.table)?`(${r.parse(e.table).sql})`:`(${r.parse([e.table]).sql})`}};var _r=class{toSql(t){let e=t,o=new y(this.model).formatStringTable("mysql",e.table);if(!e.children||!e.children.length)return {sql:"",bindings:[]};let n=new N(this.model,"mysql"),s=[],a=[];for(let m of e.children){let{sql:p,bindings:h}=n.parse([m]);if(m.file==="add_column")s.push(p);else if(m.file==="add_constraint"||m.folder==="constraint"){let g=s[s.length-1]??"",w=/^\s*add\s+column\b/i.test(g),C=/^\s*add\s+constraint\b/i.test(p);if(w&&!C){let P=p.replace(/^\s*add\s+/i,"").trimStart();s[s.length-1]=`${g} ${P}`;}else {let P=/^\s*add\b/i.test(p)?p:`add ${p}`;s.push(P);}}else m.file==="set_default"||m.file==="drop_default"||m.file==="set_not_null"||m.file,s.push(p);a.push(...h);}let l=s.join(", "),d=e.ifExists?"if exists ":"";return {sql:/^\s*drop\s+index\b/i.test(l)?l:`${d}${o} ${l}`,bindings:a}}},Ls=new _r;var Cr=class{toSql(t){return {sql:`drop column \`${t.column}\``,bindings:[]}}},Fs=new Cr;var Rr=class{toSql(t){return {sql:`drop constraint \`${t.constraintName}\``,bindings:[]}}},Ws=new Rr;var xr=class{toSql(t){return {sql:`alter column \`${t.column}\` drop default`,bindings:[]}}},js=new xr;var Ar=class{toSql(t){return {sql:"",bindings:[]}}},Vs=new Ar;var Dr=class{toSql(t){return {sql:"drop primary key",bindings:[]}}},Hs=new Dr;var Pr=class{toSql(t){let e=t;return {sql:`rename column \`${e.oldName}\` to \`${e.newName}\``,bindings:[]}}},Ys=new Pr;var Or=class{toSql(t){return {sql:`\`${t.newName}\``,bindings:[]}}},Js=new Or;var Ir=class{toSql(t){let e=t,r=e.defaultValue;return r==="NULL"?r="null":r==="TRUE"||r==="FALSE"?r=r.toLowerCase():typeof r=="string"&&r!=="null"&&r!=="true"&&r!=="false"&&(r=`'${r}'`),{sql:`alter column \`${e.column}\` set default ${r}`,bindings:[]}}},zs=new Ir;var vr=class{toSql(t){return {sql:"",bindings:[]}}},Gs=new vr;var Br=class{toSql(t){let e=t;if(e.isRawValue)return {sql:e.column,bindings:[]};let o=new y(this.model).formatStringColumn("mysql",S(e.column)),n=e.dataType.toLowerCase();if(n==="char"){let s=e.length??1;return {sql:`${o} char(${s})`,bindings:[]}}else if(n==="varchar"){let s=e.length??255;return {sql:`${o} varchar(${s})`,bindings:[]}}else {if(n==="uuid")return {sql:`${o} varchar(36)`,bindings:[]};if(n==="ulid")return {sql:`${o} varchar(26)`,bindings:[]};if(n==="longtext"||n==="mediumtext"||n==="tinytext"||n==="text")return {sql:`${o} ${n}`,bindings:[]};if(n==="integer"||n==="int"){let s="int";return e.autoIncrement&&(s+=" auto_increment"),{sql:`${o} ${s}`,bindings:[]}}else {if(n==="tinyint")return {sql:`${o} tinyint`,bindings:[]};if(n==="smallint")return {sql:`${o} smallint`,bindings:[]};if(n==="mediumint")return {sql:`${o} mediumint`,bindings:[]};if(n==="bigint"){let s="bigint";return e.autoIncrement&&(s+=" auto_increment"),{sql:`${o} ${s}`,bindings:[]}}else {if(n==="float")return {sql:`${o} float`,bindings:[]};if(n==="double")return {sql:`${o} double`,bindings:[]};if(n==="real")return {sql:`${o} double`,bindings:[]};if(n==="decimal"){let s=e.precision??10,a=e.scale??0;return {sql:`${o} decimal(${s}, ${a})`,bindings:[]}}else if(n==="numeric"){let s=e.precision??10,a=e.scale??0;return {sql:`${o} numeric(${s}, ${a})`,bindings:[]}}else {if(n==="date")return {sql:`${o} date`,bindings:[]};if(n==="time"){let s=typeof e.precision=="number"?`(${e.precision})`:"";return {sql:`${o} time${s}`.trimEnd(),bindings:[]}}else if(n==="datetime"){let s=typeof e.precision=="number"?`(${e.precision})`:"";return {sql:`${o} datetime${s}`.trimEnd(),bindings:[]}}else if(n==="timestamp"){let s=typeof e.precision=="number"?`(${e.precision})`:"";return {sql:`${o} timestamp${s}`.trimEnd(),bindings:[]}}else {if(n==="year")return {sql:`${o} year`,bindings:[]};if(n==="boolean")return {sql:`${o} boolean`,bindings:[]};if(n==="varbinary"){let s=e.length??255;return {sql:`${o} varbinary(${s})`,bindings:[]}}else if(n==="binary"){let s=e.length??255;return {sql:`${o} binary(${s})`,bindings:[]}}else {if(n==="bytea"||n==="blob")return {sql:`${o} blob`,bindings:[]};if(n==="json"||n==="jsonb")return {sql:`${o} json`,bindings:[]};if(n==="enum"){if(e.enumValues&&e.enumValues.length>0){let s=e.enumValues.map(a=>`'${a}'`).join(", ");return {sql:`${o} enum(${s})`,bindings:[]}}return {sql:`${o} text`,bindings:[]}}}}}}}}return {sql:`${o} ${n} ${e.length?`(${e.length})`:""}`,bindings:[]}}},Zs=new Br;var Er=class{toSql(t){return {sql:`after \`${t.column}\``,bindings:[]}}},Xs=new Er;var $r=class{toSql(t){let e=t,r=new y(this.model);if(e.constraintType==="primary_key"){let o=(e.columns??[]).map(s=>r.formatStringColumn("mysql",S(s))).join(", ");return {sql:`${e.constraintName?`constraint \`${e.constraintName}\` `:""}primary key (${o})`,bindings:[]}}if(e.constraintType==="unique"){if(e.columns&&e.columns.length>0){let o=e.columns.map(s=>r.formatStringColumn("mysql",S(s))).join(", "),n=e.constraintName?`constraint \`${e.constraintName}\` `:"";return e.constraintName?{sql:`${n}unique (${o})`,bindings:[]}:{sql:"unique",bindings:[]}}return {sql:"unique",bindings:[]}}if(e.constraintType==="not_null")return {sql:"not null",bindings:[]};if(e.constraintType==="null")return {sql:"null",bindings:[]};if(e.constraintType==="default"){let o=e.defaultValue;return o==="NULL"?{sql:"default null",bindings:[]}:o==="TRUE"||o==="FALSE"?{sql:`default ${o.toLowerCase()}`,bindings:[]}:o===null?{sql:"default null",bindings:[]}:(typeof o=="string"&&(o=`'${o}'`),{sql:`default ${o}`,bindings:[]})}if(e.constraintType==="foreign_key"){if(!e.references)return {sql:"",bindings:[]};let o=(e.columns??[]).map(d=>r.formatStringColumn("mysql",S(d))).join(", "),n=r.formatStringTable("mysql",e.references.table),s=e.references.columns.map(d=>r.formatStringColumn("mysql",S(d))).join(", "),l=`${e.constraintName?`constraint \`${e.constraintName}\` `:""}foreign key (${o}) references ${n}(${s})`;return e.onDelete&&(l+=` on delete ${e.onDelete}`),e.onUpdate&&(l+=` on update ${e.onUpdate}`),{sql:l,bindings:[]}}return {sql:"",bindings:[]}}},ei=new $r;var Qr=class{toSql(t){let e=t,o=new y(this.model).formatStringTable("mysql",e.table);if(!e.children||!e.children.length)return {sql:`${o} ()`,bindings:[]};let n=new N(this.model,"mysql"),s=[],a=[];for(let c of e.children){let{sql:m,bindings:p}=n.parse([c]);if(c.folder==="constraint"){let h=s.pop()??"",g=m;if(/not null/i.test(g)||/null/i.test(g)||/default/i.test(g)){let w=`${h} ${g}`.trim();w=w.replace(/(references\s+`[^`]+`\s*\([^)]*\))\s+not null/i,"not null $1"),s.push(w),a.push(...p);continue}s.push(h),s.push(g),a.push(...p);continue}s.push(m),a.push(...p);}for(let c of e.namedConstraints){let{sql:m,bindings:p}=n.parse([c]);s.push(m),a.push(...p);}let l=s.join(", ");return {sql:`${e.ifNotExists?"if not exists ":""}${o} (${l})`,bindings:a}}},ti=new Qr;var Kr=class{toSql(t){let e=t;return e.isRawValue&&typeof e.fromNode.table=="string"?{sql:e.fromNode.table,bindings:[]}:{sql:new y(this.model).getFromForWriteOperations("mysql",e.fromNode),bindings:[]}}},ri=new Kr;var kr=class{toSql(t){return {sql:"distinct",bindings:[]}}},oi=new kr;var Ur=class{toSql(t){return b.warn("MySQL does not support DISTINCT ON"),{sql:"",bindings:[]}}},ni=new Ur;var Lr=class{toSql(t){let e=t,o=new y(this.model).formatStringTable("mysql",e.table);return {sql:`${e.ifExists?"if exists ":""}${o}`,bindings:[]}}},si=new Lr;var Fr=class{toSql(t){let e=t;if(typeof e.table=="string"){let a=new y(this.model);return e.alias&&e.alias.length>0?{sql:`${a.formatStringTable("mysql",e.table)} as \`${e.alias}\``,bindings:[]}:{sql:a.formatStringTable("mysql",e.table),bindings:[]}}let r=Array.isArray(e.table)?e.table:[e.table],n=new N(this.model,"mysql").parse(r),s=e.alias&&e.alias.length?` as \`${e.alias}\``:"";return {sql:`(${n.sql})${s}`,bindings:n.bindings}}},ii=new Fr;var Wr=class{toSql(t){let e=t;return e.isRawValue?{sql:e.column,bindings:[]}:{sql:new y(this.model).formatStringColumn("mysql",e.column),bindings:[]}}},ai=new Wr;var T=class{constructor(t,e=false){this.currParamIndex=1;this.isRawValue=false;this.keyword=t,this.isRawValue=e;}};var jr=class{toSql(t){let e=t;if(e.isRawValue)return {sql:e.column,bindings:e.value};let r=e.currParamIndex,o="",n=[];if(!(e.value instanceof T)&&!Array.isArray(e.value)&&(o=`${new y(this.model).formatStringColumn("mysql",e.column)} ${e.operator} $${r}`,n=[e.value]),Array.isArray(e.value)){let s=e.value.map((a,l)=>`$${r+l}`).join(", ");o=`${new y(this.model).formatStringColumn("mysql",e.column)} ${e.operator} (${s})`,n=e.value;}return e.isNegated&&(o=`not (${o})`),{sql:o.trim(),bindings:n}}},li=new jr;var Vr=class{toSql(t){let e=t,o=new y(this.model).formatStringTable("mysql",e.table),n=e.columns.map(a=>`\`${a}\``).join(", ");return {sql:`${e.unique?"unique ":""}\`${e.indexName}\` on ${o} (${n})`,bindings:[]}}},di=new Vr;var Hr=class{toSql(t){let e=t;if(!e.table)throw new Error("MySQL DROP INDEX requires table name");return {sql:`\`${e.indexName}\` on \`${e.table}\``,bindings:[]}}},mi=new Hr;var Yr=class{toSql(t){let e=t;if(e.isRawValue)return {sql:e.fromNode.table,bindings:[]};let r=new y(this.model),o=r.getFromForWriteOperations("mysql",e.fromNode);if(!e.records.length)return {sql:o,bindings:[]};let n=e.records[0],s=Object.keys(n);if(!s.length)return {sql:o,bindings:[]};let a=s.map(c=>r.formatStringColumn("mysql",c)).join(", "),l=[],d=[];for(let c of e.records){let m=s.map(h=>c[h]);l.push(...m);let p=Array(s.length).fill("?").join(", ");d.push(`(${p})`);}return {sql:`${o} (${a}) VALUES ${d.join(", ")}`,bindings:l}}},ui=new Yr;var Jr=class{toSql(t){let e=t;if(e.isRawValue)return {sql:e.table,bindings:[]};let r=new y(this.model),o=e.left;o.includes(".")||(o=`${e.table}.${o}`);let n=e.right;n.includes(".")||(n=`${this.model.table}.${n}`);let s=r.formatStringColumn("mysql",o),a=r.formatStringColumn("mysql",n);return {sql:`${r.formatStringTable("mysql",e.table)} on ${s} ${e.on?.operator} ${a}`,bindings:[]}}},ci=new Jr;var zr=class{toSql(t){return {sql:"?",bindings:[t.limit]}}},pi=new zr;var qd={for_update:"for update",for_share:"lock in share mode"},Gr=class{toSql(t){let e=t,r=qd[e.lockType]||"for update";return e.skipLocked&&(r+=" skip locked"),{sql:r,bindings:[]}}},yi=new Gr;var Zr=class{toSql(t){return {sql:"?",bindings:[t.offset]}}},fi=new Zr;var Xr=class{toSql(t){let e=t;if(e.isRawValue)return {sql:e.table,bindings:[]};let r=new y(this.model);if(e.mode==="ignore"){let n=e.conflictColumns?.[0]||"id",s=r.formatStringColumn("mysql",`${e.table}.${n}`);return {sql:`AS new ON DUPLICATE KEY UPDATE ${s} = ${s}`,bindings:[]}}return {sql:`AS new ON DUPLICATE KEY UPDATE ${e.columnsToUpdate.map(n=>`${r.formatStringColumn("mysql",n)} = new.${r.formatStringColumn("mysql",n)}`).join(", ")}`,bindings:[]}}},hi=new Xr;var eo=class{toSql(t){let e=t;if(e.isRawValue)return {sql:e.column,bindings:[]};let r=new y(this.model).formatStringColumn("mysql",e.column),o=e.direction.toLowerCase();return {sql:`${r} ${o}`,bindings:[]}}},gi=new eo;var to=class{toSql(t){return {sql:t.rawValue,bindings:[]}}},Ti=new to;var ro=class{toSql(t){return {sql:`SELECT
|
|
112
112
|
k.CONSTRAINT_NAME AS name,
|
|
113
113
|
k.COLUMN_NAME AS column_name,
|
|
114
114
|
k.REFERENCED_TABLE_NAME AS referenced_table,
|
|
@@ -180,7 +180,7 @@ ORDER BY ordinal_position`,bindings:[]}}},ha=new en;var tn=class{toSql(t){let e=
|
|
|
180
180
|
name as column_name
|
|
181
181
|
FROM pragma_table_info('${t.table}')
|
|
182
182
|
WHERE pk > 0
|
|
183
|
-
ORDER BY pk`,bindings:[]}}},ll=new Hn;var Yn=class{toSql(t){return {sql:`PRAGMA table_info(${t.table})`,bindings:[]}}},dl=new Yn;var Jn=class{toSql(t){let e=t;if(e.isRawValue)return {sql:e.column,bindings:[]};let r=this.formatColumn(e.column,e.sqlFunction),o=this.formatAlias(e.alias);return {sql:`${r.sql}${o}`,bindings:r.bindings}}formatColumn(t,e){if(typeof t=="string"){let o=new y(this.model).formatStringColumn("sqlite",t),n=o;return e&&(n=`${e.toLowerCase()}(${o})`),{sql:n,bindings:[]}}if(Array.isArray(t)&&t.length>0){let n=new N(this.model,"sqlite").parse(t),s=`(${n.sql})`;return e&&(s=`${e.toLowerCase()}${s}`),{sql:s,bindings:n.bindings}}if(!Array.isArray(t)){let n=new N(this.model,"sqlite").parse([t]),s=`(${n.sql})`;return e&&(s=`${e.toLowerCase()}${s}`),{sql:s,bindings:n.bindings}}return {sql:t.map(o=>{if(typeof o=="string"){let l=new y(this.model).formatStringColumn("sqlite",o);return e?`${e.toLowerCase()}(${l})`:l}let a=`(${new N(this.model,"sqlite").parse([o]).sql})`;return e&&(a=`${e.toLowerCase()}${a}`),a}).join(", "),bindings:[]}}formatAlias(t){return t&&t.length>0?` as "${t}"`:""}},ml=new Jn;var zn=class{toSql(t){let e=t;if(e.isRawValue&&typeof e.fromNode=="string")return e.keyword="",{sql:e.fromNode,bindings:[]};let r=new y(this.model).getFromForWriteOperations("sqlite",e.fromNode);return e.keyword="DELETE FROM",{sql:r,bindings:[]}}},ul=new zn;var Gn=class{toSql(t){let e=t,r=new N(this.model,"sqlite"),o=Array.isArray(e.query)?e.query:[e.query],n=typeof e.query=="string"?{sql:e.query,bindings:[]}:r.parse(o.filter(Boolean),e.currParamIndex);return {sql:n.sql,bindings:n.bindings}}},cl=new Gn;var Zn=class{toSql(t){let e=t;if(e.isRawValue&&typeof e.fromNode=="string")return {sql:e.fromNode,bindings:e.values};let r=new y(this.model),o=r.getFromForWriteOperations("sqlite",e.fromNode);if(!e.columns.length||!e.values.length)return {sql:o,bindings:[]};let n=[],s=e.columns.map((a,l)=>{let d=e.values[l];return d instanceof ae?`${r.formatStringColumn("sqlite",a)} = ${d.rawValue}`:(n.push(d),`${r.formatStringColumn("sqlite",a)} = ?`)}).join(", ");return {sql:`${o} set ${s}`,bindings:n}}},pl=new Zn;var Xn=class{toSql(t){let e=t;if(e.isRawValue)return {sql:e.column,bindings:e.value??[]};let r="",o=[];if(this.isRawNode(e.value)){let n=this.formatRawIdentifierIfPossible(e.value.rawValue);r=`${new y(this.model).formatStringColumn("sqlite",e.column)} ${e.operator} ${n}`,o=[];}else if(Array.isArray(e.value))if(e.operator.toLowerCase()==="between")r=`${new y(this.model).formatStringColumn("sqlite",e.column)} between ? AND ?`,o=e.value;else {let n=e.value.map(s=>"?").join(", ");r=`${new y(this.model).formatStringColumn("sqlite",e.column)} ${e.operator} (${n})`,o=e.value;}else if(e.operator.includes("null"))r=`${new y(this.model).formatStringColumn("sqlite",e.column)} ${e.operator}`,o=[];else {if(e.value===void 0)return {sql:"",bindings:[]};r=`${new y(this.model).formatStringColumn("sqlite",e.column)} ${e.operator} ?`,o=[e.value];}return e.isNegated&&(r=`not (${r})`),{sql:r.trim(),bindings:o}}isRawNode(t){return t&&typeof t=="object"&&"rawValue"in t&&t.isRawValue===true}formatRawIdentifierIfPossible(t){return /^[A-Za-z_][A-Za-z0-9_]*(\.(\*|[A-Za-z_][A-Za-z0-9_]*))?$/.test(t)?new y(this.model).formatStringColumn("sqlite",t):t}},yl=new Xn;var es=class{toSql(t){let e=t;if(!e.nodes||e.nodes.length===0)return {sql:"",bindings:[]};let r=new N(this.model,"sqlite"),{sql:o,bindings:n}=r.parse(e.nodes,e.currParamIndex,true);return {sql:`(${o})`,bindings:n}}},fl=new es;var ts=class{toSql(t){let e=t;if(e.isRawValue)return {sql:e.column,bindings:[]};let r="",o=[],n=new y(this.model).formatStringColumn("sqlite",e.column);switch(e.jsonOperator){case "=":r=`json(${n}) = json(?)`,o=[JSON.stringify(e.value)];break;case "contains":r=`json(${n}) = json(?)`,o=[JSON.stringify(e.value)];break;case "not contains":r=`json(${n}) = json(?)`,o=[JSON.stringify(e.value)];break;case "raw":r=e.column,o=Array.isArray(e.value)?e.value:[];break}return e.isNegated&&(r=`NOT (${r})`),{sql:r.trim(),bindings:o}}},hl=new ts;var rs=class{toSql(t){let e=t;return this.isStringSubquery(e.subquery)?this.handleStringSubquery(e):this.isArraySubquery(e.subquery)?this.handleArraySubquery(e):this.handleObjectSubquery(e)}isStringSubquery(t){return typeof t=="string"}isArraySubquery(t){return Array.isArray(t)}handleStringSubquery(t){return {sql:`${t.column} ${t.operator} (${t.subquery})`.trim(),bindings:[]}}handleArraySubquery(t){let e=new N(this.model,"sqlite"),{sql:r,bindings:o}=e.parse(t.subquery,t.currParamIndex);return {sql:`${t.column} ${t.operator} (${r})`.trim(),bindings:o}}handleObjectSubquery(t){let e=new N(this.model,"sqlite"),{sql:r,bindings:o}=e.parse([t.subquery],t.currParamIndex);return {sql:`${t.column} ${t.operator} (${r})`.trim(),bindings:o}}},gl=new rs;var os=class{toSql(t){let e=t,r=new N(this.model,"sqlite"),o=Array.isArray(e.body)?e.body:[e.body],n=r.parse(o.filter(Boolean),e.currParamIndex);return {sql:`${e.alias} as (${n.sql})`,bindings:n.bindings}}},Tl=new os;var bl={mysql:{alter_table:{add_column:bs,add_constraint:Ns,add_primary_key:Ss,alter_column_type:ws,alter_table:Ls,drop_column:Fs,drop_constraint:Ws,drop_default:js,drop_not_null:Vs,drop_primary_key:Hs,rename_column:Ys,rename_table:Js,set_default:zs,set_not_null:Gs},column:{column_type:Zs},constraint:{after:Xs,constraint:ei},create_table:{create_table:ti},delete:{delete:ri},distinct:{distinct:oi,distinct_on:ni},drop_table:{drop_table:si},from:{from:ii},group_by:{group_by:ai},having:{having:li},index_op:{create_index:di,drop_index:mi},insert:{insert:ui},join:{join:ci},limit:{limit:pi},lock:{lock:yi},offset:{offset:fi},on_duplicate:{on_duplicate:hi},order_by:{order_by:gi},raw:{raw:Ti},schema:{foreign_key_info:bi,index_info:Ni,primary_key_info:Si,table_info:wi},select:{select:Mi},truncate:{truncate:qi},union:{union:_i},update:{update:Ci},where:{where:Ri,where_group:xi,where_json:Ai,where_subquery:Di},with:{with:Pi}},postgres:{alter_table:{add_column:Oi,add_constraint:Ii,add_primary_key:vi,alter_column_type:Bi,alter_table:Ei,drop_column:$i,drop_constraint:Qi,drop_default:Ki,drop_not_null:ki,drop_primary_key:Ui,rename_column:Li,rename_table:Fi,set_default:Wi,set_not_null:ji},column:{column_type:Vi},constraint:{after:Hi,constraint:Yi},create_table:{create_table:Ji},delete:{delete:zi},distinct:{distinct:Gi,distinct_on:Zi},drop_table:{drop_table:Xi},from:{from:ea},group_by:{group_by:ta},having:{having:ra},index_op:{create_index:oa,drop_index:na},insert:{insert:sa},join:{join:ia},limit:{limit:aa},lock:{lock:la},offset:{offset:da},on_duplicate:{on_duplicate:ma},order_by:{order_by:ua},raw:{raw:ca},schema:{foreign_key_info:pa,index_info:ya,primary_key_info:fa,table_info:ha},select:{select:ga},truncate:{truncate:Ta},union:{union:ba},update:{update:Na},where:{where:Sa,where_group:wa,where_json:Ma,where_subquery:qa},with:{with:_a}},sqlite:{alter_table:{add_column:Ca,add_constraint:Ra,alter_column_type:xa,alter_table:Aa,drop_column:Da,drop_constraint:Pa,drop_default:Oa,drop_not_null:Ia,drop_primary_key:va,rename_column:Ba,rename_table:Ea,set_default:$a,set_not_null:Qa},column:{column_type:Ka},constraint:{after:ka,constraint:Ua},create_table:{create_table:La},delete:{delete:Fa},distinct:{distinct:Wa,distinct_on:ja},drop_table:{drop_table:Va},from:{from:Ha},group_by:{group_by:Ya},having:{having:Ja},index_op:{create_index:za,drop_index:Ga},insert:{insert:Za},join:{join:Xa},limit:{limit:el},lock:{lock:tl},offset:{offset:rl},on_duplicate:{on_duplicate:ol},order_by:{order_by:nl},raw:{raw:sl},schema:{foreign_key_info:il,index_info:al,primary_key_info:ll,table_info:dl},select:{select:ml},truncate:{truncate:ul},union:{union:cl},update:{update:pl},where:{where:yl,where_group:fl,where_json:hl,where_subquery:gl},with:{with:Tl}}};var N=class{constructor(t,e){this.dbType=e,this.model=t;}parse(t,e=1,r=false){if(!t.length)return {sql:"",bindings:[]};let o=t.find(c=>!!c&&c.folder==="distinctOn"),n=!o&&t.find(c=>!!c&&c.folder==="distinct"),s=t.filter(c=>c!==null&&c.folder!=="distinct"&&c.folder!=="distinctOn"),a=[],l=[],d=null;for(let c=0;c<s.length;c++){let m=s[c];m.currParamIndex=e+l.length;let p=bl[this.mapCommonDbType(this.dbType)][m.folder][m.file];if(!p)throw new Error(`Interpreter not found for ${this.dbType} ${m.keyword}`);p.model=this.model;let h=p.toSql(m);if(!h.sql||!h.sql.trim().length)continue;let g=s[c+1],C=!g||g.keyword!==m.keyword?"":g.chainsWith;if(m.folder==="lock"||m.folder==="on_duplicate"||m.folder==="schema"){a.push(`${h.sql}${C}`),l.push(...h.bindings),d=m.keyword;continue}if(d!==m.keyword||m.canKeywordBeSeenMultipleTimes){if(r)a.push(`${h.sql}${C}`);else {let P=m.keyword;if(m.folder==="with"){let j=c,z=false;for(;j<s.length&&s[j].keyword===m.keyword;){let L=s[j];if(L.folder==="with"&&L.clause==="recursive"){z=true;break}j++;}z&&(P=`${P} recursive`);}if(P==="select")if(o){let j=Array.isArray(o.columns)?o.columns.join(", "):"";a.push(`select distinct on (${j}) ${h.sql}${C}`);}else n?a.push(`select distinct ${h.sql}${C}`):a.push(`select ${h.sql}${C}`);else a.push(`${P} ${h.sql}${C}`);}d=m.keyword;}else a.push(`${h.sql}${C}`);l.push(...h.bindings);}return {sql:a.join(" "),bindings:l}}mapCommonDbType(t){switch(t){case "mariadb":return "mysql";case "cockroachdb":return "postgres";default:return t}}};var At=class extends T{constructor(e){super("schema");this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.folder="schema";this.file="foreign_key_info";this.table=e;}};var Dt=class extends T{constructor(e){super("schema");this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.folder="schema";this.file="index_info";this.table=e;}};var Pt=class extends T{constructor(e){super("schema");this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.folder="schema";this.file="primary_key_info";this.table=e;}};var Ot=class extends T{constructor(e){super("schema");this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.folder="schema";this.file="table_info";this.table=e;}};var It=class extends T{constructor(e){super("");this.chainsWith=",";this.canKeywordBeSeenMultipleTimes=true;this.folder="alter_table";this.file="add_column";this.column=e;}};var le=class extends T{constructor(e){super("");this.chainsWith=",";this.canKeywordBeSeenMultipleTimes=true;this.folder="alter_table";this.file="add_constraint";this.constraint=e;}};var Ee=class extends T{constructor(e){super("");this.chainsWith=",";this.canKeywordBeSeenMultipleTimes=false;this.folder="alter_table";this.file="add_primary_key";this.columns=e;}};var vt=class extends T{constructor(e,r,o={}){super("");this.chainsWith=",";this.canKeywordBeSeenMultipleTimes=true;this.folder="alter_table";this.file="alter_column_type";this.column=e,this.newType=r,this.options=o;}};var fe=class extends T{constructor(e,r=[],o=false){super("alter table");this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.folder="alter_table";this.file="alter_table";this.table=e,this.children=r,this.ifExists=o;}};var Bt=class extends T{constructor(e){super("");this.chainsWith=",";this.canKeywordBeSeenMultipleTimes=true;this.folder="alter_table";this.file="drop_column";this.column=e;}};var de=class extends T{constructor(e){super("");this.chainsWith=",";this.canKeywordBeSeenMultipleTimes=true;this.folder="alter_table";this.file="drop_constraint";this.constraintName=e;}};var Ye=class extends T{constructor(e){super("");this.chainsWith=",";this.canKeywordBeSeenMultipleTimes=true;this.folder="alter_table";this.file="drop_default";this.column=e;}};var Et=class extends T{constructor(e){super("");this.chainsWith=",";this.canKeywordBeSeenMultipleTimes=true;this.folder="alter_table";this.file="drop_not_null";this.column=e;}};var $e=class extends T{constructor(e){super("");this.chainsWith=",";this.canKeywordBeSeenMultipleTimes=false;this.folder="alter_table";this.file="drop_primary_key";this.table=e;}};var $t=class extends T{constructor(e,r){super("");this.chainsWith=",";this.canKeywordBeSeenMultipleTimes=true;this.folder="alter_table";this.file="rename_column";this.oldName=e,this.newName=r;}};var Qt=class extends T{constructor(e){super("rename to");this.chainsWith=",";this.canKeywordBeSeenMultipleTimes=false;this.folder="alter_table";this.file="rename_table";this.newName=e;}};var Je=class extends T{constructor(e,r){super("");this.chainsWith=",";this.canKeywordBeSeenMultipleTimes=true;this.folder="alter_table";this.file="set_default";this.column=e,this.defaultValue=r;}};var Kt=class extends T{constructor(e){super("");this.chainsWith=",";this.canKeywordBeSeenMultipleTimes=true;this.folder="alter_table";this.file="set_not_null";this.column=e;}};var K=class extends T{constructor(e,r={},o=false){super("");this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=true;this.folder="constraint";this.file="constraint";this.constraintType=e,this.columns=r.columns,this.references=r.references,this.constraintName=r.constraintName,this.onDelete=r.onDelete,this.onUpdate=r.onUpdate,this.defaultValue=r.defaultValue,this.checkExpression=r.checkExpression,this.isRawValue=o;}};var kt=class extends T{constructor(e,r=[],o=[],n=false){super("create table");this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.folder="create_table";this.file="create_table";this.table=e,this.children=r,this.namedConstraints=o,this.ifNotExists=n;}};var Ut=class extends T{constructor(e,r=false){super("drop table");this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.folder="drop_table";this.file="drop_table";this.table=e,this.ifExists=r;}};var Lt=class extends T{constructor(e,r,o,n=false){super("create index");this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.folder="index_op";this.file="create_index";this.table=e,this.columns=r,this.indexName=o,this.unique=n;}};var Ft=class extends T{constructor(e,r,o){super("drop index");this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.cascade=false;this.folder="index_op";this.file="drop_index";this.indexName=e,this.table=r,this.cascade=o??false;}};var me=class extends T{constructor(e,r=false){super("truncate",r);this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.folder="truncate";this.file="truncate";this.fromNode=e;}};var x=class extends T{constructor(e,r,o={}){super("");this.chainsWith=",";this.canKeywordBeSeenMultipleTimes=true;this.folder="column";this.file="column_type";this.isRawValue=false;this.column=e,this.dataType=r,this.length=o.length,this.precision=o.precision,this.scale=o.scale,this.enumValues=o.enumValues,this.withTimezone=o.withTimezone,this.autoIncrement=o.autoIncrement,this.isRawValue=o.isRawValue??false;}};var ze=class extends T{constructor(e,r=false,o=false){super("lock");this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.folder="lock";this.file="lock";this.lockType=e,this.skipLocked=r,this.noWait=o;}};var xe=class extends T{constructor(e,r=false){super(r?"union all":"union");this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=true;this.folder="union";this.file="union";this.query=e,this.isAll=r;}};var Qe=class extends T{constructor(e,r,o){e==="normal"&&(e="");super("with");this.chainsWith=",";this.canKeywordBeSeenMultipleTimes=false;this.folder="with";this.file="with";this.alias=r,this.body=o,this.clause=e;}};var Me=class{constructor(t){this.nodes=t;}getNodes(){return this.nodes}};var Wt=class extends T{constructor(e){super("");this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=true;this.folder="constraint";this.file="after";this.column=e;}};var jt=class extends Me{constructor(t,e,r,o,n=[],s="create_table"){super(e),this.columnNode=r,this.tableName=o,this.namedConstraints=n,this.context=s,this.sqlType=t;}primaryKey(t){let e=we(this.tableName,S(this.columnNode.column));return this.context==="alter_table"?(this.nodes.push(new K("primary_key",{columns:[S(this.columnNode.column)],constraintName:t?.constraintName??e})),this):this.sqlType==="sqlite"?this.handleSqliteAutoIncrement(t||{constraintName:e}):(this.namedConstraints.push(new K("primary_key",{columns:[S(this.columnNode.column)],constraintName:t?.constraintName??e})),this)}foreignKey(t,e){let[r,o]=t.split("."),n=o.split(","),s=e?.constraintName??k(this.tableName??"",S(this.columnNode.column),n[0]);return this.context==="alter_table"?(this.nodes.push(new K("foreign_key",{columns:[S(this.columnNode.column)],references:{table:r,columns:n},constraintName:s,onDelete:e?.onDelete,onUpdate:e?.onUpdate})),this):(this.namedConstraints.push(new K("foreign_key",{columns:[S(this.columnNode.column)],references:{table:r,columns:n},constraintName:s,onDelete:e?.onDelete,onUpdate:e?.onUpdate})),this)}increment(){return this.columnNode.autoIncrement=true,this}notNullable(){return this.nodes.push(new K("not_null",{columns:[S(this.columnNode.column)]})),this}nullable(){return this.nodes.push(new K("null",{columns:[S(this.columnNode.column)]})),this}default(t){let e;return t===null?e="NULL":typeof t=="boolean"?e=t?"TRUE":"FALSE":t!==void 0&&(e=t.toString()),this.nodes.push(new K("default",{defaultValue:e})),this}unique(t){return this.context==="alter_table"?(this.nodes.push(new K("unique",{columns:[S(this.columnNode.column)],constraintName:t?.constraintName??Z(this.tableName??"",S(this.columnNode.column))})),this):(this.namedConstraints.push(new K("unique",{columns:[S(this.columnNode.column)],constraintName:t?.constraintName||Z(this.tableName??"",S(this.columnNode.column))})),this)}after(t){return this.nodes.push(new Wt(t)),this}handleSqliteAutoIncrement(t){return this.nodes.push(new K("primary_key",{columns:[S(this.columnNode.column)],constraintName:t?.constraintName,autoIncrement:this.columnNode.autoIncrement,columnType:"integer"})),this}};var Ae=class extends Me{constructor(e,r,o,n){super(r);this.context="create_table";this.tableName=o,this.namedConstraints=[],this.context=n??"create_table",this.sqlType=e;}build(e){return this.nodes.push(e),new jt(this.sqlType,this.nodes,e,this.tableName,this.namedConstraints,this.context)}char(e,r=1){let o=new x(e,"char",{length:r});return this.build(o)}varchar(e,r=255){let o=new x(e,"varchar",{length:r});return this.build(o)}string(e,r=255){return this.varchar(e,r)}text(e,r="longtext"){let o=new x(e,r);return this.build(o)}longtext(e){return this.text(e,"longtext")}mediumtext(e){return this.text(e,"mediumtext")}tinytext(e){return this.text(e,"tinytext")}uuid(e){let r=new x(e,"uuid");return this.build(r)}ulid(e){let r=new x(e,"ulid");return this.build(r)}integer(e,r=255){let o=new x(e,"integer",{length:r});return this.build(o)}tinyint(e,r=255){let o=new x(e,"tinyint",{length:r});return this.build(o)}smallint(e,r=255){let o=new x(e,"smallint",{length:r});return this.build(o)}mediumint(e,r=255){let o=new x(e,"mediumint",{length:r});return this.build(o)}biginteger(e,r=255){let o=new x(e,"bigint",{length:r});return this.build(o)}bigint(e,r=255){return this.biginteger(e,r)}float(e,r=10){let o=new x(e,"float",{precision:r});return this.build(o)}double(e,r=10){let o=new x(e,"double",{precision:r});return this.build(o)}real(e,r=10){let o=new x(e,"real",{precision:r});return this.build(o)}decimal(e,r=10,o=2){let n=new x(e,"decimal",{precision:r,scale:o});return this.build(n)}numeric(e,r=10,o=2){let n=new x(e,"numeric",{precision:r,scale:o});return this.build(n)}increment(e,r=255){return this.integer(e,r).increment()}bigIncrement(e,r=255){return this.biginteger(e,r).increment()}date(e,r){let o=new x(e,"date",{precision:r});return this.build(o)}time(e,r){let o=new x(e,"time",{precision:r});return this.build(o)}year(e){let r=new x(e,"year");return this.build(r)}datetime(e,r){let o=new x(e,"datetime",{withTimezone:r?.withTimezone??false,precision:r?.precision});return this.build(o)}timestamp(e,r){let o=new x(e,"timestamp",{withTimezone:r?.withTimezone??false,precision:r?.precision});return this.build(o)}boolean(e){let r=new x(e,"boolean");return this.build(r)}binary(e){let r=new x(e,"binary");return this.build(r)}varbinary(e,r=255){let o=new x(e,"varbinary",{length:r});return this.build(o)}blob(e){let r=new x(e,"blob");return this.build(r)}tinyblob(e){let r=new x(e,"tinyblob");return this.build(r)}mediumblob(e){let r=new x(e,"mediumblob");return this.build(r)}longblob(e){let r=new x(e,"longblob");return this.build(r)}json(e){let r=new x(e,"json");return this.build(r)}jsonb(e){let r=new x(e,"jsonb");return this.build(r)}enum(e,r){let o=new x(e,"enum",{enumValues:r});return this.build(o)}custom(e,r,o){let n=new x(e,r,{length:o});return this.build(n)}rawColumn(e){let r=new x(e,"",{isRawValue:true});return this.build(r)}getNamedConstraints(){return this.namedConstraints}};var Vt=class extends Me{constructor(t,e,r){super(e),this.table=t,this.sqlType=r;}addColumn(t){let e=[],r=new Ae(this.sqlType,e,this.table),o=t(r);if(!e.length)return;let n=r.getNamedConstraints(),s=e.filter(c=>c.folder==="column");if(e=e.concat(n),s.length!==1)throw new Error("addColumn callback must define exactly one column");let a=s[0],l=o.getNodes().filter(c=>{let m=c;return m.constraintType==="not_null"||m.constraintType==="null"||m.constraintType==="default"}),d=new It(a);d.inlineConstraints=l,this.nodes.push(d),o.getNodes().filter(c=>{let m=c;return m.constraintType==="unique"||m.constraintType==="foreign_key"||m.constraintType==="primary_key"}).forEach(c=>{this.nodes.push(new le(c));});}alterColumn(t){if(this.sqlType==="sqlite")throw new f("AlterTableBuilder::alterColumn","SQLITE_NOT_SUPPORTED",new Error("sqlite does not support alter table statements"));let e=[],r=new Ae(this.sqlType,e,this.table,"alter_table"),o=t(r);if(!e.length)return;let n=e.filter(m=>m.folder==="column");if(n.length!==1)throw new Error("alterColumn callback must define exactly one column");let s=n[0],a=S(s.column),l=o.getNodes().find(m=>m.constraintType==="null"),u=o.getNodes().find(m=>m.constraintType==="not_null")||l,c=o.getNodes().find(m=>m.constraintType==="default");this.nodes.push(new vt(S(a),s,{})),u&&(u.constraintType==="not_null"?this.nodes.push(new Kt(S(a))):u.constraintType==="null"&&this.nodes.push(new Et(S(a)))),c&&(c.defaultValue===void 0||c.defaultValue===null?this.nodes.push(new Ye(S(a))):this.nodes.push(new Je(S(a),c.defaultValue))),o.getNodes().forEach(m=>{let p=m;switch(p.constraintType){case "primary_key":this.addPrimaryKey(S(a));break;case "unique":this.unique(S(a),{constraintName:p.constraintName});break;case "foreign_key":this.addForeignKey(S(a),p.references?.table??"",S(p.references?.columns?.[0]??""),{constraintName:p.constraintName,onDelete:p.onDelete,onUpdate:p.onUpdate});break}});}dropColumn(t){this.nodes.push(new Bt(t));}renameColumn(t,e){this.nodes.push(new $t(t,e));}dropDefault(t){if(this.sqlType==="sqlite")throw new f("AlterTableBuilder::alterColumn","SQLITE_NOT_SUPPORTED",new Error("sqlite does not support alter table statements"));this.nodes.push(new Ye(t));}addPrimaryKey(t){if(this.sqlType==="sqlite")throw new f("AlterTableBuilder::alterColumn","SQLITE_NOT_SUPPORTED",new Error("sqlite does not support alter table statements"));this.nodes.push(new Ee([t]));}addConstraint(...t){if(this.sqlType==="sqlite")throw new f("AlterTableBuilder::alterColumn","SQLITE_NOT_SUPPORTED",new Error("sqlite does not support alter table statements"));this.nodes.push(new le(new K(...t)));}addForeignKey(t,e,r,o){if(this.sqlType==="sqlite")throw new f("AlterTableBuilder::alterColumn","SQLITE_NOT_SUPPORTED",new Error("sqlite does not support alter table statements"));this.nodes.push(new le(new K("foreign_key",{columns:[t],references:{table:e,columns:[r]},constraintName:o?.constraintName??k(this.table,t,r),onDelete:o?.onDelete,onUpdate:o?.onUpdate})));}unique(t,e){if(this.sqlType==="sqlite")throw new f("AlterTableBuilder::alterColumn","SQLITE_NOT_SUPPORTED",new Error("sqlite does not support alter table statements"));this.nodes.push(new le(new K("unique",{columns:[t],constraintName:e?.constraintName??Z(this.table,t)})));}setDefault(t,e){if(this.sqlType==="sqlite")throw new f("AlterTableBuilder::alterColumn","SQLITE_NOT_SUPPORTED",new Error("sqlite does not support alter table statements"));this.nodes.push(new Je(t,e));}dropForeignKey(t,e){if(this.sqlType==="sqlite")throw new f("AlterTableBuilder::dropPrimaryKey","SQLITE_NOT_SUPPORTED",new Error("sqlite does not support alter table statements"));let r=k(this.table,t,e);this.nodes.push(new de(r));}dropUnique(t,e){if(this.sqlType==="sqlite")throw new f("AlterTableBuilder::dropUnique","SQLITE_NOT_SUPPORTED",new Error("sqlite does not support alter table statements"));if(this.sqlType==="cockroachdb")throw new f("AlterTableBuilder::dropUnique","COCKROACHDB_NOT_SUPPORTED",new Error("cockroachdb does not support alter table statements"));let r=e?.constraintName??Z(this.table,t);this.nodes.push(new de(r));}dropConstraint(t){if(this.sqlType==="sqlite")throw new f("AlterTableBuilder::dropConstraint","SQLITE_NOT_SUPPORTED",new Error("sqlite does not support alter table statements"));this.nodes.push(new de(t));}dropPrimaryKey(t){if(this.sqlType==="sqlite")throw new f("AlterTableBuilder::dropPrimaryKey","SQLITE_NOT_SUPPORTED",new Error("sqlite does not support alter table statements"));if(this.sqlType==="postgres"&&!t)throw new f("AlterTableBuilder::dropPrimaryKey","POSTGRES_TABLE_REQUIRED",new Error("postgres requires the table name"));this.nodes.push(new $e(t));}};var he=class{constructor(t){if(this.sqlType=t||A.DB_TYPE,!this.sqlType)throw new f("Schema::constructor","ENV_NOT_SET",new Error("env not set, please set DB_TYPE in .env file"));this.queryStatements=[];}rawQuery(t){this.queryStatements.push(t);}runFile(t){if(!te__default.default.existsSync(t))throw new f("Schema::runFile","FILE_NOT_FOUND_OR_NOT_ACCESSIBLE");let e=Pe__default.default.basename(t),r=Pe__default.default.extname(e);if(r!==".sql"&&r!==".txt")throw new f("Schema::runFile","FILE_NOT_A_SQL_OR_TXT_FILE");let n=te__default.default.readFileSync(t,"utf-8").split(";").map(s=>s.trim()).filter(s=>s.length>0&&!s.startsWith("--"));for(let s of n)this.rawQuery(s);}createTable(t,e,r){let o=new Ae(this.sqlType,[],t);e(o);let n=o.getNodes(),s=new N({table:t,databaseCaseConvention:"preserve",modelCaseConvention:"preserve"},this.sqlType),a=new kt(t,n,o.getNamedConstraints(),r?.ifNotExists),l=s.parse([a]).sql,d=l.startsWith("create table")?l:`create table ${l}`;this.rawQuery(d);}alterTable(t,e){let r=[],o=new Vt(t,r,this.sqlType);if(e(o),!r.length)return;let n=this.generateAstInstance({table:t,databaseCaseConvention:"preserve",modelCaseConvention:"preserve"}),s=[],a=()=>{if(!s.length)return;let l=new fe(t,s),d=n.parse([l]).sql;if(!d||!d.trim())return;let u=d.startsWith("alter table")?d:`alter table ${d}`;this.rawQuery(u),s=[];};for(let l of r)l.file==="add_constraint"&&s.length&&s[0].file==="add_column"||a(),s.push(l);a();}dropTable(t,e=false){let r=new Ut(t,e),o=this.generateAstInstance({table:t,databaseCaseConvention:"preserve",modelCaseConvention:"preserve"});this.rawQuery(o.parse([r]).sql);}renameTable(t,e){let r=new fe(t,[new Qt(e)]),o=this.generateAstInstance({table:t,databaseCaseConvention:"preserve",modelCaseConvention:"preserve"});this.rawQuery(o.parse([r]).sql);}truncateTable(t){let e=new me(t),r=this.generateAstInstance({table:t,databaseCaseConvention:"preserve",modelCaseConvention:"preserve"});this.rawQuery(r.parse([e]).sql);}createIndex(t,e,r){Array.isArray(e)||(e=[e]);let o=r.constraintName||qr(t,e.join("_")),n=new Lt(t,e,o),s=this.generateAstInstance({table:t,databaseCaseConvention:"preserve",modelCaseConvention:"preserve"});this.rawQuery(s.parse([n]).sql);}dropIndex(t,e){let r=new Ft(t,e),o=this.generateAstInstance({table:e,databaseCaseConvention:"preserve",modelCaseConvention:"preserve"});this.rawQuery(o.parse([r]).sql);}addPrimaryKey(t,e){let r=new Ee(e),o=this.generateAstInstance({table:t,databaseCaseConvention:"preserve",modelCaseConvention:"preserve"});this.rawQuery(o.parse([r]).sql);}addUnique(t,e,r){let o=Array.isArray(e)?e:[e],n=r?.constraintName??Z(t,o.join("_")),s=new K("unique",{columns:o,constraintName:n}),a=new fe(t,[new le(s)]),l=this.generateAstInstance({table:t,databaseCaseConvention:"preserve",modelCaseConvention:"preserve"});this.rawQuery(l.parse([a]).sql);}dropForeignKey(t,e,r){let o=k(t,e,r),n=new de(o),s=new fe(t,[n]),a=this.generateAstInstance({table:t,databaseCaseConvention:"preserve",modelCaseConvention:"preserve"});this.rawQuery(a.parse([s]).sql);}dropUnique(t,e,r){let o=Array.isArray(e)?Z(t,e.join("_")):Z(t,e),n=r?.constraintName??o,s=new de(n),a=new fe(t,[s]),l=this.generateAstInstance({table:t,databaseCaseConvention:"preserve",modelCaseConvention:"preserve"});this.rawQuery(l.parse([a]).sql);}dropPrimaryKey(t){let e=new $e,r=this.generateAstInstance({table:t,databaseCaseConvention:"preserve",modelCaseConvention:"preserve"});this.rawQuery(r.parse([e]).sql);}addConstraint(t,...e){let r=new K(...e),o=new fe(t,[new le(r)]),n=this.generateAstInstance({table:t,databaseCaseConvention:"preserve",modelCaseConvention:"preserve"});this.rawQuery(n.parse([o]).sql);}dropConstraint(t,e){let r=new de(e),o=this.generateAstInstance({table:t,databaseCaseConvention:"preserve",modelCaseConvention:"preserve"});this.rawQuery(o.parse([r]).sql);}generateAstInstance(t){return new N(t,this.sqlType)}};var Ht=class{constructor(t){this.sql=t,this.models=Object.values(this.sql.registeredModels);}buildDropDependencies(t){let e=new Map,r=new Map,o=new Map;for(let n of t.relationsToDrop||[]){let s=`${n.table}.${n.relation.name}`,a=[];if(n.relation.referencedTable&&a.push(`table.${n.relation.referencedTable}`),n.relation.referencedColumns)for(let l of n.relation.referencedColumns)a.push(`column.${n.relation.referencedTable}.${l}`);e.set(s,a);}for(let n of t.tablesToDrop||[]){let s=`table.${n.table}`,a=[];for(let l of this.models){let d=l.getRelations();for(let u of d)u.type==="belongsTo"&&u.model().table===n.table&&a.push(`fk.${l.table}.${u.constraintName}`);}r.set(s,a);}for(let n of t.columnsToDrop||[]){let s=`column.${n.table}.${n.column}`,a=[],l=this.models.find(d=>d.table===n.table);if(l){let d=l.getColumns().find(u=>u.databaseName===n.column);if(d){d.isPrimary&&a.push(`pk.${n.table}`);let u=l.getRelations();for(let c of u)c.columnName===d.columnName&&a.push(`fk.${n.table}.${c.constraintName}`);}}o.set(s,a);}return {foreignKeys:e,tables:r,constraints:o}}topologicalSortReverse(t,e){let r=new Set,o=new Set,n=[],s=a=>{if(o.has(a))throw new Error(`Circular dependency detected: ${a}`);if(r.has(a))return;o.add(a);let l=e(a);for(let d of l)s(d);o.delete(a),r.add(a),n.push(a);};for(let a of t.keys())r.has(a)||s(a);return n}generateDropOperations(t){let e=this.buildDropDependencies(t),r=[],o=this.topologicalSortReverse(e.foreignKeys,s=>e.foreignKeys.get(s)||[]);for(let s of o){let[a,l]=s.split("."),d=t.relationsToDrop?.find(u=>u.table===a&&u.relation.name===l);d&&r.push({type:"DROP_FOREIGN_KEY",phase:"DESTRUCTIVE_OPERATIONS",table:a,constraint:l,data:d,dependencies:e.foreignKeys.get(s)||[],sqlStatements:this.generateDropForeignKeySql(d)});}let n=this.topologicalSortReverse(e.tables,s=>e.tables.get(s)||[]);for(let s of t.columnsToDrop||[]){let a=`column.${s.table}.${s.column}`,l=e.constraints.get(a)||[];for(let d of l)d.startsWith("pk.")?r.push({type:"DROP_CONSTRAINT",phase:"DESTRUCTIVE_OPERATIONS",table:s.table,constraint:"PRIMARY KEY",data:{type:"primary_key",table:s.table},dependencies:[a],sqlStatements:this.generateDropPrimaryKeySql(s.table)}):d.startsWith("unique.")&&r.push({type:"DROP_CONSTRAINT",phase:"DESTRUCTIVE_OPERATIONS",table:s.table,constraint:`UNIQUE_${s.column}`,data:{type:"unique",table:s.table,column:s.column},dependencies:[a],sqlStatements:this.generateDropUniqueConstraintSql(s.table,s.column)});}for(let s of t.columnsToDrop||[])r.push({type:"DROP_COLUMN",phase:"DESTRUCTIVE_OPERATIONS",table:s.table,column:s.column,data:s,dependencies:[],sqlStatements:this.generateDropColumnSql(s)});for(let s of n){let a=s.replace("table.",""),l=t.tablesToDrop?.find(d=>d.table===a);l&&r.push({type:"DROP_TABLE",phase:"DESTRUCTIVE_OPERATIONS",table:a,data:l,dependencies:e.tables.get(s)||[],sqlStatements:this.generateDropTableSql(l)});}return r}analyzeConstraintImpact(t){let e=new Map;for(let r of t.columnsToDrop||[]){let o=[],n=this.models.find(s=>s.table===r.table);if(n){let s=n.getColumns().find(a=>a.databaseName===r.column);if(s){s.isPrimary&&o.push(`PRIMARY KEY on ${r.table}`);let a=n.getRelations();for(let l of a)l.columnName===s.columnName&&o.push(`FOREIGN KEY ${l.constraintName} on ${r.table}`);}}e.set(`${r.table}.${r.column}`,o);}return e}detectMixedOperations(t){let e=[];for(let r of t.columnsToModify||[]){let o=this.models.find(n=>n.table===r.table);o&&o.getColumns().find(s=>s.databaseName===r.dbColumns.name)&&this.hasConstraintChanges(r.dbColumns,r.modelColumn)&&e.push({type:"column_modification_with_constraints",table:r.table,column:r.dbColumns.name,description:`Column ${r.dbColumns.name} modification requires constraint recreation`});}for(let r of t.primaryKeysToModify||[])e.push({type:"primary_key_modification",table:r.table,description:`Primary key modification on ${r.table} requires FK recreation`});return e}hasConstraintChanges(t,e){return t.isNullable!==!e.constraints?.nullable||t.isUnique!==!!e.constraints?.unique||t.defaultValue!==e.constraints?.default}generateDropForeignKeySql(t){return this.sql.getDbType()==="sqlite"?[]:t.relation.name?this.sql.alterTable(t.table,e=>{e.dropConstraint(t.relation.name);}):[]}generateDropPrimaryKeySql(t){return this.sql.getDbType()==="sqlite"?[]:this.sql.alterTable(t,e=>{e.dropPrimaryKey();})}generateDropUniqueConstraintSql(t,e){return this.sql.getDbType()==="sqlite"?[]:this.sql.alterTable(t,r=>{r.dropConstraint(`UNIQUE_${e}`);})}generateDropColumnSql(t){return this.sql.alterTable(t.table,e=>{e.dropColumn(t.column);})}generateDropTableSql(t){return [`DROP TABLE ${t.table}`]}};var Yt=class{constructor(t){this.sql=t,this.models=Object.values(this.sql.registeredModels),this.dropResolver=new Ht(t);}generateOperations(t){let e=[];e.push(...this.generateStructureCreationOperations(t)),e.push(...this.generateConstraintCreationOperations(t)),e.push(...this.generateDestructiveOperations(t)),e.push(...this.generateColumnModificationOperations(t));let r=l=>l.table&&l.constraint?`${l.table}::${l.constraint}`:void 0,o=new Set(e.filter(l=>l.type==="ADD_FOREIGN_KEY").map(l=>r(l)).filter(Boolean)),n=new Set(e.filter(l=>l.type==="DROP_FOREIGN_KEY").map(l=>r(l)).filter(Boolean)),s=new Set([...o].filter(l=>n.has(l)));return e.filter(l=>{let d=r(l);return d?!(s.has(d)&&(l.type==="ADD_FOREIGN_KEY"||l.type==="DROP_FOREIGN_KEY")):true})}generateStructureCreationOperations(t){let e=[];for(let r of t.tablesToAdd){let o=this.sql.createTable(r.table,n=>{for(let s of r.columns){if(Array.isArray(s.type)){n.enum(s.databaseName,s.type);continue}s.type&&this.executeBuilderMethod(r.table,n,s,[s.databaseName,s.length,s.precision&&!s.withTimezone?s.precision:void 0,s.scale,s.withTimezone?{withTimezone:s.withTimezone,precision:s.precision}:void 0].filter(Boolean),true);}});e.push({type:"CREATE_TABLE",phase:"STRUCTURE_CREATION",table:r.table,data:r,dependencies:[],sqlStatements:[o]});}for(let r of t.columnsToAdd){let o=this.generateAddColumnViaAlter(r);e.push({type:"ADD_COLUMN",phase:"STRUCTURE_CREATION",table:r.table,column:r.column.databaseName,data:r,dependencies:[`table.${r.table}`],sqlStatements:o});}return e}generateConstraintCreationOperations(t){let e=[];for(let o of t.uniquesToDrop||[]){let n=this.sql.alterTable(o.table,s=>{s.dropConstraint(o.name);});e.push({type:"DROP_CONSTRAINT",phase:"CONSTRAINT_CREATION",table:o.table,constraint:o.name,data:o,dependencies:[`table.${o.table}`],sqlStatements:n});}let r=new Set((t.uniquesToDrop||[]).map(o=>o.name));for(let o of t.indexesToDrop){if(r.has(o.index))continue;let n=new he(this.sql.getDbType());n.dropIndex(o.index,o.table);let s=n.queryStatements[0];e.push({type:"DROP_INDEX",phase:"CONSTRAINT_CREATION",table:o.table,index:o.index,data:o,dependencies:[`table.${o.table}`],sqlStatements:[s]});}for(let o of t.primaryKeysToAdd){let a=this.models.find(d=>d.table===o.table)?.getColumns().find(d=>d.columnName===o.columns[0])?.primaryKeyConstraintName||we(o.table,o.columns[0]),l=this.sql.alterTable(o.table,d=>{let u=a||we(o.table,o.columns[0]);d.addConstraint("primary_key",{columns:[o.columns[0]],constraintName:u});});e.push({type:"ADD_PRIMARY_KEY",phase:"CONSTRAINT_CREATION",table:o.table,constraint:a,data:o,dependencies:[`table.${o.table}`],sqlStatements:l});}for(let o of t.relationsToAdd){if(o.relation.type==="manyToMany")continue;let n=this.generateAddRelationViaAlter(o),s=this.computeFkConstraintName(o);e.push({type:"ADD_FOREIGN_KEY",phase:"CONSTRAINT_CREATION",table:o.table,constraint:s,data:o,dependencies:this.getForeignKeyDependencies(o),sqlStatements:n});}for(let o of t.uniquesToAdd||[]){let n=this.models.find(l=>l.table===o.table),s=(o.columns||[]).map(l=>n?.getColumns().find(u=>u.columnName===l)?.databaseName||l),a=this.sql.alterTable(o.table,l=>{l.addConstraint("unique",{columns:s,constraintName:o.name||"mandatory"});});e.push({type:"ADD_UNIQUE_CONSTRAINT",phase:"CONSTRAINT_CREATION",table:o.table,constraint:o.name||"mandatory",data:o,dependencies:[`table.${o.table}`],sqlStatements:a});}for(let o of t.indexesToAdd){let n=this.generateCreateIndexSql(o);e.push({type:"CREATE_INDEX",phase:"CONSTRAINT_CREATION",table:o.table,index:o.index,data:o,dependencies:[`table.${o.table}`],sqlStatements:[n]});}return e}computeFkConstraintName(t){let e=S(t.relation.constraintName);if(e)return e;let r=t.table;t.relation.type==="belongsTo"?r=t.relation.model().table:t.relation.type==="manyToMany"&&t.relation.manyToManyOptions&&(r=S(t.relation.manyToManyOptions.throughModel));let n=this.models.find(a=>a.table===t.table)?.getColumns()||[],s=t.relation.columnName;return t.relation.type==="belongsTo"?s=n.find(l=>l.columnName===t.relation.foreignKey)?.databaseName||t.relation.foreignKey:s=n.find(l=>l.columnName===s)?.databaseName||s,k(t.table,s,r)}generateDestructiveOperations(t){return this.dropResolver.generateDropOperations(t)}generateColumnModificationOperations(t){let e=[];for(let r of t.columnsToModify||[]){let o=this.generateModifyColumnViaAlter(r);e.push({type:"MODIFY_COLUMN",phase:"DESTRUCTIVE_OPERATIONS",table:r.table,column:r.dbColumns.name,data:r,dependencies:[],sqlStatements:o});}return e}getForeignKeyDependencies(t){let e=[];if(t.relation.type==="belongsTo"){let o=t.relation.model();e.push(`table.${o.table}`);let n=o.primaryKey||"id",s=o.getColumns().find(a=>a.columnName===n);s&&e.push(`column.${o.table}.${s.databaseName}`);}else if(t.relation.type==="manyToMany"&&t.relation.manyToManyOptions){let o=S(t.relation.manyToManyOptions.throughModel);e.push(`table.${o}`);}e.push(`table.${t.table}`);let r=this.models.find(o=>o.table===t.table);if(r){let o=r.getColumns().find(n=>n.columnName===t.relation.columnName||n.databaseName===t.relation.columnName);o&&e.push(`column.${t.table}.${o.databaseName}`);}return e}executeBuilderMethod(t,e,r,o,n=true){let s=e[r.type](...o);return n&&(r.isPrimary&&s.primaryKey({constraintName:r.primaryKeyConstraintName||we(t,r.columnName)}),r.constraints?.default!==void 0&&s.default(r.constraints.default),r.constraints?.nullable===false?s.notNullable():r.constraints?.nullable===true&&s.nullable()),s}generateAddColumnViaAlter(t){let e=[t.column.databaseName,t.column.length,t.column.precision&&!t.column.withTimezone?t.column.precision:void 0,t.column.scale,t.column.withTimezone?{withTimezone:t.column.withTimezone,precision:t.column.precision}:void 0].filter(Boolean);return this.sql.alterTable(t.table,r=>{r.addColumn(o=>{let n=this.executeBuilderMethod(t.table,o,t.column,e,false);return t.column.constraints?.default!==void 0&&n.default(t.column.constraints.default),t.column.constraints?.nullable===false?n.notNullable():t.column.constraints?.nullable===true&&n.nullable(),n});})}generateModifyColumnViaAlter(t){if(this.sql.getDbType()==="sqlite")return [];let e=[t.modelColumn.databaseName,t.modelColumn.length,t.modelColumn.precision&&!t.modelColumn.withTimezone?t.modelColumn.precision:void 0,t.modelColumn.scale,t.modelColumn.withTimezone?{withTimezone:t.modelColumn.withTimezone,precision:t.modelColumn.precision}:void 0].filter(Boolean);return this.sql.alterTable(t.table,o=>{o.alterColumn(n=>{let s=this.executeBuilderMethod(t.table,n,t.modelColumn,e,false);return t.modelColumn.constraints?.default!==void 0&&s.default(t.modelColumn.constraints.default),t.modelColumn.constraints?.nullable===false?s.notNullable():t.modelColumn.constraints?.nullable===true&&s.nullable(),s});})}generateCreateIndexSql(t){let e=this.models.find(s=>s.table===t.table),o=(e?.getIndexes().find(s=>s.name===t.index)?.columns||[]).map(s=>e?.getColumns().find(l=>l.columnName===s)?.databaseName||s),n=new he(this.sql.getDbType());return n.createIndex(t.table,o,{constraintName:t.index}),n.queryStatements[0]||""}generateAddRelationViaAlter(t){let e=t.table,r=t.relation.foreignKey;t.relation.type==="belongsTo"?(e=t.relation.model().table,r=t.relation.model().primaryKey||"id"):t.relation.type==="manyToMany"&&t.relation.manyToManyOptions&&(e=S(t.relation.manyToManyOptions.throughModel),r=S(t.relation.manyToManyOptions.rightForeignKey),(!r||r==="undefined")&&(r=t.relation.model().primaryKey||"id"));let o=typeof t.relation.constraintName=="string"?t.relation.constraintName:void 0,n=S(r);if(t.relation.type==="belongsTo"){let m=t.relation.model(),p=m.primaryKey,g=m.getColumns().find(w=>w.columnName===p);if(g)n=g.databaseName;else {let w=m?.databaseCaseConvention||"preserve";n=O(p,w);}}else if(t.relation.type==="manyToMany"&&t.relation.manyToManyOptions){let m=t.relation.model();if(typeof n=="string"&&n){let p=m.getColumns(),h=p.find(g=>g.columnName===n);if(h)n=h.databaseName;else {let g=m.primaryKey||"id",w=p.find(C=>C.columnName===g);if(w)n=w.databaseName;else {let C=m?.databaseCaseConvention||"preserve";n=O(n||g,C);}}}else {let p=m.primaryKey||"id",g=m.getColumns().find(w=>w.columnName===p);if(g)n=g.databaseName;else {let w=m?.databaseCaseConvention||"preserve";n=O(p,w);}}}let s=this.models.find(m=>m.table===t.table),a=s?.getColumns()||[],l=t.relation.columnName,d=a.find(m=>m.columnName===l);if(d)l=d.databaseName;else {let m=s?.databaseCaseConvention||"preserve";l=O(l,m);}if(t.relation.type==="belongsTo"){let m=a.find(p=>p.columnName===t.relation.foreignKey);if(m)l=m.databaseName;else {let p=s?.databaseCaseConvention||"preserve";l=O(t.relation.foreignKey,p);}}else if(t.relation.type==="manyToMany"&&t.relation.manyToManyOptions){let m=t.relation.manyToManyOptions.leftForeignKey,p=S(m),h=a.find(g=>g.columnName===p);if(h)l=h.databaseName;else {let g=s?.databaseCaseConvention||"preserve";l=O(p,g);}}let u=t.relation.onDelete?.toLowerCase(),c=t.relation.onUpdate?.toLowerCase();return this.sql.alterTable(t.table,m=>{let p=o||k(t.table,l,e);m.addConstraint("foreign_key",{columns:[l],references:{table:e,columns:[n]},constraintName:p,onDelete:u,onUpdate:c});})}formatSqlStatements(t){return t.map(e=>({...e,sqlStatements:e.sqlStatements.map(r=>sqlFormatter.format(r,{...this.sql.inputDetails.queryFormatOptions}).replace(/\n/g," ").replace(/\s+/g," "))}))}};function xd(i){return i.replace(/\s+/g," ").trim()}function Ad(i){return i.replace(/\s*\([^)]*\)/g,"").trim()}function qe(i,t){let e=xd(t.toLowerCase()),r=Ad(e);switch(i){case "sqlite":{let o=[{test:n=>n.includes("int"),normalized:"integer"},{test:n=>n.includes("char"),normalized:"varchar"},{test:n=>n.includes("text"),normalized:"text"},{test:n=>n.includes("clob"),normalized:"text"},{test:n=>n.includes("date"),normalized:"text"},{test:n=>n.includes("time"),normalized:"text"},{test:n=>n.includes("timestamp"),normalized:"text"},{test:n=>n.includes("datetime"),normalized:"text"},{test:n=>n.includes("blob"),normalized:"blob"},{test:n=>n.includes("real")||n.includes("floa")||n.includes("doub"),normalized:"real"},{test:n=>n.includes("numeric"),normalized:"numeric"},{test:n=>n.includes("bool"),normalized:"integer"},{test:n=>n.includes("uuid"),normalized:"varchar"},{test:n=>n.includes("ulid"),normalized:"varchar"},{test:n=>n.includes("jsonb"),normalized:"text"},{test:n=>n.includes("json"),normalized:"text"}];for(let n of o)if(n.test(r))return n.normalized;return r}case "mysql":case "mariadb":{if(r.endsWith("text")||r==="text")return "text";switch(r){case "int":case "integer":return "integer";case "tinyint":return "tinyint";case "smallint":return "smallint";case "mediumint":return "mediumint";case "bigint":return "bigint";case "float":return "float";case "double":case "double precision":return "double";case "real":return "double";case "decimal":case "numeric":return "numeric";case "varchar":case "character varying":return "varchar";case "char":case "character":return "char";case "uuid":return "varchar";case "ulid":return "varchar";case "date":return "date";case "datetime":return "datetime";case "timestamp":return "timestamp";case "time":return "time";case "year":return "year";case "jsonb":return "json";case "json":return "json";case "enum":return "enum";case "binary":return "binary";case "varbinary":return "varbinary";case "tinyblob":return "tinyblob";case "mediumblob":return "mediumblob";case "longblob":return "longblob";case "blob":return "blob";case "boolean":case "bool":return "boolean";default:return r}}case "postgres":case "cockroachdb":{if(r.endsWith("text")||r==="text")return "text";if(r.startsWith("timestamp"))return "timestamp";if(r.startsWith("time"))return "time";if(r==="datetime")return "timestamp";switch(r){case "character varying":return "varchar";case "character":return "char";case "ulid":return "varchar";case "double precision":return "double";case "real":return "real";case "float":return "real";case "integer":case "int4":case "int":return "integer";case "mediumint":return "integer";case "bigint":case "int8":return "bigint";case "smallint":case "int2":return "smallint";case "tinyint":return "smallint";case "uuid":return "uuid";case "year":return "smallint";case "bytea":return "bytea";case "binary":case "varbinary":case "blob":case "tinyblob":case "mediumblob":case "longblob":return "bytea";case "boolean":case "bool":return "boolean";case "numeric":case "decimal":return "numeric";case "jsonb":return "jsonb";case "json":return "json";case "date":return "date";default:return r}}default:return r}}var Ke=class i{constructor(t){this.emptyStatements=[/alter table ".*"$/];this.sql=t,this.models=Object.values(this.sql.registeredModels),this.data={columnsToAdd:[],columnsToDrop:[],columnsToModify:[],indexesToAdd:[],indexesToDrop:[],uniquesToAdd:[],uniquesToDrop:[],tablesToAdd:[],relationsToAdd:[],relationsToDrop:[],relationsToModify:[],primaryKeysToAdd:[],primaryKeysToDrop:[],primaryKeysToModify:[]};}static async makeDiff(t){let e=new i(t);return await Promise.all(e.models.map(async r=>{let o=await e.sql.getTableSchema(r.table),n={columns:r.getColumns().filter(d=>d?.type!==void 0&&d?.type!==null),indexes:r.getIndexes(),relations:r.getRelations()};if(!o.columns.length){e.data.tablesToAdd.push({table:r.table,columns:n.columns});for(let u of n.indexes)o.indexes.map(c=>c.name).includes(u.name)||e.data.indexesToAdd.push({table:r.table,index:u.name});let d=r.getUniques?.()||[];for(let u of d)e.data.uniquesToAdd.push({table:r.table,name:u.name||"mandatory",columns:u.columns});for(let u of n.relations){if(u.type!=="belongsTo")continue;let c=S(u.constraintName);o.foreignKeys.find(p=>p.name===c)||e.data.relationsToAdd.push({table:r.table,relation:u,onDelete:u.onDelete,onUpdate:u.onUpdate});}return}for(let d of n.columns)o.columns.some(c=>c.name===d.databaseName||c.name===d.columnName)||e.data.columnsToAdd.push({table:r.table,column:d});for(let d of o.columns)n.columns.some(c=>c.databaseName===d.name||c.columnName===d.name)||e.data.columnsToDrop.push({table:r.table,column:d.name});for(let d of n.indexes)o.indexes.map(u=>u.name).includes(d.name)||e.data.indexesToAdd.push({table:r.table,index:d.name});let s=r.getUniques?.()||[];for(let d of s)o.indexes.some(c=>c.name===d.name&&c.isUnique)||e.data.uniquesToAdd.push({table:r.table,name:d.name||"mandatory",columns:d.columns});for(let d of o.indexes)d.isUnique||n.indexes.map(c=>c.name).includes(d.name)||e.data.indexesToDrop.push({table:r.table,index:d.name});for(let d of o.indexes){if(!d.isUnique)continue;(r.getUniques?.()||[]).map(c=>c.name).includes(d.name)||e.data.uniquesToDrop.push({table:r.table,name:d.name});}for(let d of n.columns){let u=o.columns.find(p=>p.name===d.databaseName||p.name===d.columnName);if(!u)continue;let c=!e.areColumnsEqual(u,d,o.indexes),m=e.getDefaultChange({table:r.table,dbColumns:u,modelColumn:d});(c||m)&&e.data.columnsToModify.push({table:r.table,dbColumns:u,modelColumn:d});}for(let d of n.relations){if(d.type!=="belongsTo"&&d.type!=="manyToMany")continue;if(d.type==="manyToMany"&&d.manyToManyOptions){let m=S(d.manyToManyOptions.throughModel);e.data.relationsToAdd.push({table:m,relation:{type:"belongsTo",model:()=>r,columnName:S(d.manyToManyOptions.leftForeignKey),foreignKey:d.manyToManyOptions.leftForeignKey,constraintName:d.constraintName?S(d.constraintName):k(m,S(d.manyToManyOptions.leftForeignKey||Se(r.table)),r.table),onDelete:d.onDelete,onUpdate:d.onUpdate},onDelete:d.onDelete,onUpdate:d.onUpdate});continue}let u=S(d.constraintName);if(u&&o.foreignKeys.some(m=>m.name===u))continue;o.foreignKeys.find(m=>e.relationMatchesDbRelation(r,d,m))||e.data.relationsToAdd.push({table:r.table,relation:d,onDelete:d.onDelete,onUpdate:d.onUpdate});}let a=new Set(n.relations.filter(d=>d.type==="belongsTo").map(d=>{let u=S(d.foreignKey)||d.columnName,m=r.getColumns().find(p=>p.columnName===u)?.databaseName||u;return S(d.constraintName)||k(r.table,m,d.model().table)}));for(let d of o.foreignKeys){if(d.name&&a.has(d.name))continue;n.relations.find(c=>c.type!=="belongsTo"&&c.type!=="manyToMany"?false:e.relationMatchesDbRelation(r,c,d))||e.data.relationsToDrop.push({table:r.table,relation:d});}for(let d of n.relations){if(d.type!=="belongsTo"&&d.type!=="manyToMany")continue;let u=o.foreignKeys.find(c=>e.relationMatchesDbRelation(r,d,c));u&&!e.areRelationsEqual(u,d)&&e.data.relationsToModify.push({table:r.table,dbRelation:u,modelRelation:d,onDelete:d.onDelete,onUpdate:d.onUpdate});}let l=r.primaryKey;if(l&&!o.primaryKey&&e.data.primaryKeysToAdd.push({table:r.table,columns:[l]}),o.primaryKey&&!l&&e.data.primaryKeysToDrop.push({table:r.table,columns:o.primaryKey.columns,name:o.primaryKey.name}),l&&o.primaryKey){let d=r.getColumns().find(u=>u.columnName===l);d&&!e.arePrimaryKeysEqual(o.primaryKey,d)&&e.data.primaryKeysToModify.push({table:r.table,dbPrimaryKey:o.primaryKey,modelPrimaryKey:l});}})),await e.processManyToMany(),await e.removeFkChurnByName(),e}getSqlStatements(){let t=this.getSqlStatementsByPhase();return Object.values(t).flat()}getSqlStatementsByPhase(){let t=new Yt(this.sql),e=t.generateOperations(this.data),r=t.formatSqlStatements(e),o={STRUCTURE_CREATION:[],CONSTRAINT_CREATION:[],DESTRUCTIVE_OPERATIONS:[]};for(let n of r)o[n.phase].push(...n.sqlStatements);return o}areColumnsEqual(t,e,r=[]){let o=t.name===e.databaseName,n=this.sql.getDbType(),s=qe(n,t.dataType),a=typeof e.type=="string"?qe(n,e.type):void 0;a&&o&&(o=s===a),e.length!=null&&t.length!=null&&o&&(o=t.length===e.length);let l=a==="real"||a==="double"||a==="float";if(e.precision!=null&&t.precision!=null&&((n==="postgres"||n==="cockroachdb")&&l||o&&(o=t.precision===e.precision)),e.scale!=null&&t.scale!=null&&((n==="postgres"||n==="cockroachdb")&&l||o&&(o=t.scale===e.scale)),typeof e.type=="string"&&(a==="timestamp"||a==="time")&&e.withTimezone!==void 0&&t.withTimezone!==void 0&&o&&(o=!!t.withTimezone==!!e.withTimezone),e.constraints?.nullable!==void 0){let d=e.constraints.nullable,u=t.isNullable;o=o&&d===u;}return o}areRelationsEqual(t,e){let r=S(e.constraintName),o=r?t.name===r:true;if(e.type==="belongsTo"){let d=e.model(),u=d.primaryKey||"id",c=d.getColumns().find(h=>h.columnName===u),m=d.table,p=c?.databaseName||u;o=o&&t.referencedTable===m&&!!t.referencedColumns&&t.referencedColumns.length===1&&t.referencedColumns[0]===p;}else if(e.type==="manyToMany"&&e.manyToManyOptions){let d=S(e.manyToManyOptions.throughModel);o=o&&t.referencedTable===d;}let n=t.onDelete?.toLowerCase(),s=t.onUpdate?.toLowerCase(),a=e.onDelete?.toLowerCase(),l=e.onUpdate?.toLowerCase();return a&&o&&(o=n===a),l&&o&&(o=s===l),o}relationMatchesDbRelation(t,e,r){let o,n=e;if(n&&n.model){if(typeof n.model=="function"&&n.model.table)o=n.model;else if(typeof n.model=="function")try{let g=n.model();g&&g.table&&(o=g);}catch{}}if(!o)return false;let s=e.type==="belongsTo"?o.table:e.type==="manyToMany"&&e.manyToManyOptions?S(e.manyToManyOptions.throughModel):void 0;if(s&&r.referencedTable!==s)return false;let a=S(e.constraintName);if(a&&r.name&&a!==r.name)return false;let l=t.getColumns(),u=(n.type||"belongsTo")==="belongsTo"?S(n.foreignKey):n.columnName,c=l.find(g=>g.columnName===u);c&&(u=c.databaseName);let m=o.primaryKey||"id",h=o.getColumns().find(g=>g.columnName===m)?.databaseName||m;return r.columns.length===1&&r.columns[0]===u&&r.referencedColumns.length===1&&r.referencedColumns[0]===h}arePrimaryKeysEqual(t,e){if(t.columns.length!==1)return false;let o=t.columns[0]===e.databaseName,n=!t.name||!e.primaryKeyConstraintName||t.name===e.primaryKeyConstraintName;return o&&n}getDefaultChange(t){let e=this.sql.getDbType(),r=qe(e,t.dbColumns.dataType),o=typeof t.modelColumn.type=="string"?qe(e,t.modelColumn.type):void 0;if(o&&r!==o||t.modelColumn.length!=null&&t.dbColumns.length!=null&&t.dbColumns.length!==t.modelColumn.length||t.modelColumn.precision!=null&&t.dbColumns.precision!=null&&t.dbColumns.precision!==t.modelColumn.precision||t.modelColumn.scale!=null&&t.dbColumns.scale!=null&&t.dbColumns.scale!==t.modelColumn.scale||typeof t.modelColumn.type=="string"&&(o==="timestamp"||o==="time")&&t.modelColumn.withTimezone!==void 0&&t.dbColumns.withTimezone!==void 0&&!!t.dbColumns.withTimezone!=!!t.modelColumn.withTimezone)return false;let n=t.modelColumn.constraints?.default!==void 0,s=t.dbColumns.defaultValue!==null&&t.dbColumns.defaultValue!==void 0;if(n&&!s)return "set";if(!n&&s)return "drop";if(n&&s){let a=String(t.dbColumns.defaultValue),l=String(t.modelColumn.constraints?.default),d=this.normalizeDefaultValue(e,r,a),u=this.normalizeDefaultValue(e,o||r,l);return d!==u?"set":false}return false}normalizeDefaultValue(t,e,r){let o=String(r).trim();if(!o)return o;if(t==="postgres"||t==="cockroachdb"){if(e==="json"||e==="jsonb")try{o=o.replace(/^\((.*)\)$/s,"$1"),o=o.replace(/::(jsonb?|[a-zA-Z_ ]+[\[\]]*)/g,"");let s=o.match(/^'(.*)'$/s);if(s&&(o=s[1]),o==="{}"||o==="")return "{}";let a=JSON.parse(o);return JSON.stringify(a)}catch{}o=o.replace(/^\((.*)\)$/s,"$1"),o=o.replace(/::[a-zA-Z_ ]+[\[\]]*/g,"");let n=o.match(/^'(.*)'$/s);return n&&(o=n[1]),/^true$/i.test(o)?"true":/^false$/i.test(o)?"false":/^null$/i.test(o)?"null":(o)}if(t==="mysql"||t==="mariadb"){o=o.replace(/^\((.*)\)$/s,"$1");let n=o.match(/^'(.*)'$/s);return n&&(o=n[1]),/^current_timestamp(?:\(\d+\))?$/i.test(o)?"current_timestamp":o}if(t==="sqlite"){o=o.replace(/^\((.*)\)$/s,"$1");let n=o.match(/^'(.*)'$/s);return n&&(o=n[1]),o.toLowerCase()}return o}async processManyToMany(){let t=new Set;for(let e of this.models){let r=e.getRelations();for(let o of r){if(o.type!=="manyToMany"||!o.manyToManyOptions||o.manyToManyOptions.wasModelProvided)continue;let n=S(o.manyToManyOptions.throughModel);if(t.has(n))continue;t.add(n);let s=this.models.find(D=>D.table===o?.manyToManyOptions?.primaryModel),a=o.model();if(!s||!a)continue;let l=s.primaryKey||"id",d=a.primaryKey||"id",u=s.getColumns().find(D=>D.columnName===l),c=a.getColumns().find(D=>D.columnName===d);if(!u||!c)continue;let m=S(o.manyToManyOptions.leftForeignKey)||l,p=S(o.manyToManyOptions.rightForeignKey)||d,h=await this.sql.getTableSchema(n);if(!h.columns.length){this.data.tablesToAdd.push({table:n,columns:[this.clonePkAsColumn(u,m),this.clonePkAsColumn(c,p)]}),this.pushM2mFkRelations({throughTable:n,leftModel:s,rightModel:a,leftFkName:m,rightFkName:p,onDelete:o.onDelete,onUpdate:o.onUpdate,constraintName:void 0});continue}let g=this.clonePkAsColumn(u,m),w=this.clonePkAsColumn(c,p),C=h.columns.find(D=>D.name===m),P=h.columns.find(D=>D.name===p),j=C?this.areColumnsEqual(C,g,h.indexes):false,z=P?this.areColumnsEqual(P,w,h.indexes):false;for(let D of h.foreignKeys){let ce=D.referencedTable===s.table,ur=D.referencedTable===a.table;if(!ce&&!ur)continue;let Dl=ce?m:p,Le=D.columns[0];Le&&Le!==Dl&&(this.data.relationsToDrop.push({table:n,relation:D}),Le!==m&&Le!==p&&this.data.columnsToDrop.push({table:n,column:Le}));}let L={};j||(L[g.databaseName]=g),z||(L[w.databaseName]=L[w.databaseName]||w);for(let D of Object.keys(L))this.data.columnsToAdd.push({table:n,column:L[D]});let re=this.buildBelongsToRelation(n,()=>s,m,l,void 0,o.onDelete,o.onUpdate),q=this.buildBelongsToRelation(n,o.model,p,d,void 0,o.onDelete,o.onUpdate),Oe=h.foreignKeys.find(D=>D.referencedTable===s.table&&D.columns.length===1&&D.columns[0]===m),lt=h.foreignKeys.find(D=>D.referencedTable===a.table&&D.columns.length===1&&D.columns[0]===p);if(!Oe){let D=h.foreignKeys.find(ce=>ce.referencedTable===s.table);D&&this.data.relationsToDrop.push({table:n,relation:D}),this.data.relationsToAdd.push(re);}if(!lt){let D=h.foreignKeys.find(ce=>ce.referencedTable===a.table);D&&this.data.relationsToDrop.push({table:n,relation:D}),this.data.relationsToAdd.push(q);}}}}async removeFkChurnByName(){let t=new Set;for(let o of this.data.relationsToAdd)t.add(o.table);for(let o of this.data.relationsToDrop)t.add(o.table);let e=new Map;for(let o of t){let n=await this.sql.getTableSchema(o),s=new Set((n.foreignKeys||[]).map(a=>a.name).filter(Boolean));e.set(o,s);}let r=new Map;for(let o of this.models){let n=o.getRelations(),s=new Set;for(let a of n){if(a.type!=="belongsTo")continue;let l=a.foreignKey||a.columnName,u=o.getColumns().find(m=>m.columnName===l)?.databaseName||l,c=S(a.constraintName)||k(o.table,u,a.model().table);s.add(c);}r.set(o.table,s);}this.data.relationsToAdd=await Promise.all(this.data.relationsToAdd.map(async o=>{let n=await this.sql.getTableSchema(o.table),s=this.models.find(g=>g.table===o.table),a=s?.getColumns()||[],l=o.relation.columnName;o.relation.type==="belongsTo"?l=a.find(w=>w.columnName===o.relation.foreignKey)?.databaseName||o.relation.foreignKey:l=a.find(w=>w.columnName===l)?.databaseName||l;let d=o.table,u=o.relation.foreignKey;if(o.relation.type==="belongsTo"){let g=o.relation.model();d=g.table;let w=g.primaryKey||"id";u=g.getColumns().find(P=>P.columnName===w)?.databaseName||w;}let c=new Set([l,o.relation.columnName].filter(Boolean)),m=n.foreignKeys.some(g=>{if(g.columns.length!==1||g.referencedColumns.length!==1)return false;let w=c.has(g.columns[0]),C=g.referencedTable===d,P=g.referencedColumns[0]===u;return w&&C&&P}),p=S(o.relation.constraintName)||k(o.table,l,d),h=e.get(o.table)||new Set;if(m||p&&h.has(p))return null;if(o.relation.type==="manyToMany"&&o.relation.manyToManyOptions){let g=S(o.relation.manyToManyOptions.throughModel),w=S(o.relation.manyToManyOptions.leftForeignKey),C=S(o.relation.manyToManyOptions.rightForeignKey),P=o.table===g&&o.relation.columnName===w&&o.relation.model().table===s?.table,j=o.table===g&&o.relation.columnName===C&&o.relation.model().table!==s?.table,z=await this.sql.getTableSchema(g),L=z.foreignKeys.some(q=>q.columns.length===1&&q.columns[0]===w&&q.referencedTable===(s?.table||"")),re=z.foreignKeys.some(q=>q.columns.length===1&&q.columns[0]===C&&q.referencedTable===o.relation.model().table);if(P&&L||j&&re)return null}return o})).then(o=>o.filter(Boolean)),this.data.relationsToDrop=await Promise.all(this.data.relationsToDrop.map(async o=>{let n=this.models.find(d=>d.table===o.table);if(!n)return o;let s=n.getRelations(),a=n.getColumns();return s.some(d=>{if(d.type!=="belongsTo")return false;let c=a.find(w=>w.columnName===d.foreignKey)?.databaseName||d.foreignKey,m=d.model(),p=m.primaryKey||"id",g=m.getColumns().find(w=>w.columnName===p)?.databaseName||p;return o.relation.columns.length===1&&o.relation.columns[0]===c&&o.relation.referencedTable===m.table&&o.relation.referencedColumns.length===1&&o.relation.referencedColumns[0]===g})?null:o})).then(o=>o.filter(Boolean));}clonePkAsColumn(t,e){return {columnName:e,databaseName:e,isPrimary:false,type:t.type,length:t.length,precision:t.precision,scale:t.scale,withTimezone:t.withTimezone,constraints:{nullable:false}}}pushM2mFkRelations(t){let e=this.buildBelongsToRelation(t.throughTable,()=>t.leftModel,t.leftFkName,t.leftModel.primaryKey||"id",t.constraintName,t.onDelete,t.onUpdate),r=this.buildBelongsToRelation(t.throughTable,()=>t.rightModel,t.rightFkName,t.rightModel.primaryKey||"id",t.constraintName,t.onDelete,t.onUpdate);this.data.relationsToAdd.push(e),this.data.relationsToAdd.push(r);}buildBelongsToRelation(t,e,r,o,n,s,a){let l=n?S(n):k(t,r,e().table);return {table:t,relation:{type:"belongsTo",model:e,columnName:r,foreignKey:r,constraintName:l,onDelete:s,onUpdate:a},onDelete:s,onUpdate:a}}};var ue=class extends T{constructor(e,r=false){super("delete from",r);this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.folder="delete";this.file="delete";this.fromNode=e;}};var v=class extends T{constructor(e,r){super("from");this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.folder="from";this.file="from";this.table=e,this.alias=r;}};var Q=class extends T{constructor(e,r=[],o,n=false,s=false){super("insert into",s);this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.folder="insert";this.file="insert";this.fromNode=e,this.records=r,this.returning=o,this.disableReturning=n;}};var X=class extends T{constructor(e,r,o,n="update",s,a=false){super("on duplicate",a);this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.folder="on_duplicate";this.file="on_duplicate";this.table=e,this.conflictColumns=r,this.columnsToUpdate=o,this.mode=n,this.returning=s;}};var H=class extends T{constructor(e,r=[],o=[],n=false){super("update",n);this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.folder="update";this.file="update";this.fromNode=e,this.columns=r,this.values=o;}};var R=class extends T{constructor(e,r,o=false,n,s,a=false){super("where",a);this.chainsWith="and";this.canKeywordBeSeenMultipleTimes=false;this.folder="where";this.file="where";this.column=e,this.chainsWith=` ${r}`,this.isNegated=o,this.operator=n,this.value=s;}};var Ge=class extends T{constructor(e,r="and"){super("where");this.canKeywordBeSeenMultipleTimes=false;this.folder="where";this.file="where_group";this.nodes=e,this.chainsWith=` ${r}`;}};var Y=class extends R{constructor(e,r,o=false,n,s,a=false){super(e,r,o,"=",s,a);this.file="where_json";this.jsonOperator=n,this.value=s;}};var ge=class extends T{constructor(e,r,o,n="and"){super("where");this.canKeywordBeSeenMultipleTimes=false;this.folder="where";this.file="where_subquery";this.column=e,this.operator=r,this.subquery=o,this.chainsWith=` ${n}`;}};var Jt=class extends stream.Readable{constructor(t,e,r=[],o){super({objectMode:true}),this.db=t,this.query=e,this.params=r,this.started=false,this.events=o;}_read(){this.started||(this.started=true,this.readRows());}readRows(){let t=0,e=false,r=false;this.db.each(this.query,this.params,(o,n)=>{if(o){r=true,this.emit("error",o);return}t++;let s=false,a,l={write:d=>{s=true,a=d;}};Promise.resolve(this.events.onData?.(l,n)).then(()=>{if(!r){if(s){this.push(a);return}this.push(n);}}).catch(d=>{r=true,this.emit("error",d);}).finally(()=>{t--,e&&t===0&&!r&&this.push(null);});},o=>{if(o){r=true,this.emit("error",o);return}e=true,t===0&&!r&&this.push(null);});}},Ml=(i,t,e,r)=>{let o=["begin","begin transaction","commit","rollback"].includes(i.trim().toLowerCase()),n=r.customConnection??e.getPool("sqlite");if(o)return new Promise((d,u)=>{n.run(i,t,function(c){c&&u(c),d(this.changes);});});if(r.mode==="fetch")return new Promise((d,u)=>{n.all(i,t,(c,m)=>{c&&u(c),(!m||!m.length)&&d([]),d(m);});});let s=r?.typeofModel;if(!s)return new Promise((d,u)=>{n.run(i,t,function(c){c?u(new Error(c.message)):d(this.changes);});});let a=s.primaryKey,l=s.table;if(r.mode==="insertOne"||r.mode==="insertMany"){if(r.mode==="insertOne")return new Promise((c,m)=>{n.run(i,t,function(p){if(p)return m(p);let h=r.models&&Array.isArray(r.models)&&r.models.length?r.models[0]:null;if(!a){c(h);return}let g=h?.[a]||this.lastID;if(!g)return m(new f("SqlRunnerUtils::promisifySqliteQuery","MODEL_HAS_NO_PRIMARY_KEY"));let w=`SELECT * FROM ${l} WHERE ${a} = ?`;n.get(w,[g],(C,P)=>{if(C)return m(C);c(P);});});});if(!Array.isArray(r.models))throw new f("SqlRunnerUtils::massiveInsert models should be an array, report to the maintainers.","DEVELOPMENT_ERROR");let d=r.models,u=[];return new Promise(async(c,m)=>{try{let p=d.map(async h=>{let g=new y(s),{columns:w,values:C}=await g.prepareColumns(Object.keys(h),Object.values(h),"insert"),P=Object.fromEntries(w.map((re,q)=>[re,C[q]])),j=new N(s,e.getDbType()),{sql:z,bindings:L}=j.parse([new Q(new v(s.table),[P])]);return new Promise((re,q)=>{n.run(z,L,function(Oe){if(Oe)return q(Oe);let lt=h[a]||this.lastID;if(!a){re(h);return}if(!lt)return q(new f("SqlRunnerUtils::promisifySqliteQuery","MODEL_HAS_NO_PRIMARY_KEY"));let D=`SELECT * FROM ${l} WHERE ${a} = ?`;n.get(D,[lt],(ce,ur)=>{if(ce)return q(ce);re(ur);});});})});u=await Promise.all(p),c(u);}catch(p){m(p);}})}return new Promise((d,u)=>{n.run(i,t,function(c){c?u(new Error(c.message)):d(this.changes);});})};var U=async(i,t,e,r="raw",o)=>{let n=e.type;switch(o?.shouldNotLog||Fe(i,e.logs,t),n){case "mysql":case "mariadb":let s=e.sqlConnection??e.getPool("mysql"),[a]=await ns(()=>s.query(i,t),e.inputDetails.connectionPolicies?.retry,e.logs);return r==="affectedRows"?a.affectedRows:a;case "postgres":case "cockroachdb":let l=e.sqlConnection??e.getPool("postgres"),d=await ns(()=>l.query(i,t),e.inputDetails.connectionPolicies?.retry,e.logs);return r==="raw"?d.rows:d.rowCount;case "sqlite":let u=await ns(()=>Ml(i,t,e,{typeofModel:o?.sqlLiteOptions?.typeofModel,mode:o?.sqlLiteOptions?.mode||"fetch",models:o?.sqlLiteOptions?.models}),e.inputDetails.connectionPolicies?.retry,e.logs);return r==="raw"?Array.isArray(u)?u:[u]:u;default:throw new f("ExecSql",`UNSUPPORTED_DATABASE_TYPE_${n}`)}},zt=async(i,t,e,r={},o)=>{let n=e.type;switch(n){case "mariadb":case "mysql":{let s=e.getPool("mysql"),a=e.sqlConnection??await s.getConnection(),l=new stream.PassThrough({objectMode:r.objectMode??true,highWaterMark:r.highWaterMark}),u=a.connection.query(i,t).stream({highWaterMark:r.highWaterMark,objectMode:r.objectMode??true}),c=0,m=false,p=false,h=()=>{try{a.release();}catch{}};return u.on("data",g=>{if(o.onData){c++,Promise.resolve(o.onData(l,g)).then(()=>{c--,m&&c===0&&!p&&(h(),l.end());}).catch(w=>{p=true,h(),l.destroy(w);});return}l.write(g);}),u.on("end",()=>{m=true,c===0&&!p&&(h(),l.end());}),u.on("error",g=>{p=true,h(),l.destroy(g);}),l.on("close",()=>{h();}),l}case "cockroachdb":case "postgres":{let s=e.sqlConnection??await e.getPool("postgres").connect(),a=await import('pg-query-stream').catch(()=>{throw new F("pg-query-stream")}),l=new stream.PassThrough({objectMode:r.objectMode||true,highWaterMark:r.highWaterMark}),d=new a.default(i,t,{highWaterMark:r.highWaterMark,rowMode:r.rowMode,batchSize:r.batchSize,types:r.types}),u=s.query(d),c=0,m=false,p=false,h=g=>{try{s.release(g);}catch{}};return u.on("data",g=>{if(o.onData){c++,Promise.resolve(o.onData(l,g)).then(()=>{c--,m&&c===0&&!p&&(h(),l.end());}).catch(w=>{p=true,h(w),l.destroy(w);});return}l.write(g);}),u.on("end",()=>{m=true,c===0&&!p&&(h(),l.end());}),u.on("error",g=>{p=true,h(g),l.destroy(g);}),l}case "sqlite":{let s=e.sqlConnection??e.getPool("sqlite");return new Jt(s,i,t,{onData:o.onData})}default:throw new f("ExecSqlStreaming",`UNSUPPORTED_DATABASE_TYPE_${n}`)}};async function ns(i,t={maxRetries:0,delay:0},e=false){let r=0,o=t.maxRetries||0,n=t.delay||0;async function s(){try{return i()}catch(a){if(!Object.prototype.hasOwnProperty.call(a,"code")||a.code!=="ECONNREFUSED")throw a;if(r<o)return r++,ls(`Retrying sql in ${n}ms (attempt ${r}/${o})`,"info",e),await new Promise(l=>setTimeout(l,n)),s();throw a}}return s()}var I=(i,t="millis",e=3)=>async(...r)=>{let o=performance.now(),n=await i(...r),s=performance.now()-o;return [(t==="millis"?s:s/1e3).toFixed(e),n]};var V=class extends T{constructor(e,r,o,n){super("select");this.chainsWith=", ";this.canKeywordBeSeenMultipleTimes=false;this.folder="select";this.file="select";this.column=e,this.alias=r,this.sqlFunction=o,this.isRawValue=n??false;}};var Ze=class{constructor(t,e,r){this.dbType=e,this.sqlDataSource=r,this.modelRelations=wt(t),this.modelRelationsMap=new Map(this.modelRelations.map(o=>[o.columnName,o]));}getRelationFromModel(t){let e=this.modelRelationsMap.get(t.toString());if(!e)throw new f("SqlModelManagerUtils::getRelationFromModel",`RELATION_NOT_FOUND_IN_MODEL_${t.toString()}`);return e}};function Gt(i,t,e){return {total:e,perPage:t,currentPage:i,firstPage:1,isEmpty:e===0,lastPage:Math.max(1,Math.ceil(e/t)),hasMorePages:i<Math.max(1,Math.ceil(e/t)),hasPages:e>t}}function _l(i,t){return {perPage:i,total:t,firstPage:1,isEmpty:t===0}}var ke=i=>typeof i=="number"?i:parseFloat(i);var De=class extends T{constructor(e,r,o=false,n,s,a=false){super("having",a);this.chainsWith="and";this.canKeywordBeSeenMultipleTimes=false;this.folder="having";this.file="having";this.column=e,this.chainsWith=`${r} `,this.isNegated=o,this.operator=n,this.value=s;}};var Zt=class extends T{constructor(){super("distinct");this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.folder="distinct";this.file="distinct";}};var Xt=class extends T{constructor(e){super("select");this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.folder="distinctOn";this.file="distinct_on";this.columns=e;}};var J=class extends T{constructor(e,r,o,n="inner",s,a=false){super(`${n} join`,a);this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=true;this.folder="join";this.file="join";this.type="inner";this.table=e,this.left=r,this.right=o,this.on=s;}};var Xe=class extends T{constructor(e,r=false){super("group by",r);this.chainsWith=", ";this.canKeywordBeSeenMultipleTimes=false;this.folder="group_by";this.file="group_by";this.column=e;}};var er=class extends T{constructor(e){super("limit");this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.folder="limit";this.file="limit";this.limit=e;}};var tr=class extends T{constructor(e){super("offset");this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.folder="offset";this.file="offset";this.offset=e;}};var et=class extends T{constructor(e,r="asc",o=false){super("order by",o);this.chainsWith=", ";this.canKeywordBeSeenMultipleTimes=false;this.folder="order_by";this.file="order_by";this.column=e,this.direction=r;}};var rr=class{constructor(t,e){this.model=t,this.sqlDataSource=e,this.groupByNodes=[],this.orderByNodes=[],this.limitNode=null,this.offsetNode=null,this.logs=this.sqlDataSource.logs;let r=this.model?.getColumns;this.modelColumns=typeof r=="function"?r.call(this.model):[],this.modelColumnsMap=new Map(this.modelColumns.map(o=>[o.columnName,o]));}clearGroupBy(){return this.groupByNodes=[],this}clearOrderBy(){return this.orderByNodes=[],this}clearLimit(){return this.limitNode=null,this}clearOffset(){return this.offsetNode=null,this}groupBy(...t){return t.forEach(e=>{this.groupByNodes.push(new Xe(e));}),this}groupByRaw(t){return this.groupByNodes.push(new Xe(t,true)),this}orderBy(t,e){return this.orderByNodes.push(new et(t,e)),this}orderByRaw(t){return this.orderByNodes.push(new et(t,"asc",true)),this}limit(t){return typeof t!="number"&&b.warn(`${this.model.name}::limit Non numeric value provided to \`limit\``),this.limitNode=new er(t),this}offset(t){return typeof t!="number"&&b.warn(`${this.model.name}::offset Non numeric value provided to \`offset\``),this.offsetNode=new tr(t),this}};var or=class extends rr{constructor(t,e){super(t,e),this.joinNodes=[];}clearJoin(){return this.joinNodes=[],this}joinRaw(t){return this.joinNodes.push(new J(t,"","","inner",{operator:"="},true)),this}leftJoinRaw(t){return this.joinNodes.push(new J(t,"","","left",{operator:"="},true)),this}rightJoinRaw(t){return this.joinNodes.push(new J(t,"","","right",{operator:"="},true)),this}fullJoinRaw(t){return this.joinNodes.push(new J(t,"","","full",{operator:"="},true)),this}crossJoinRaw(t){return this.joinNodes.push(new J(t,"","","cross",{operator:"="},true)),this}naturalJoinRaw(t){return this.joinNodes.push(new J(t,"","","natural",{operator:"="},true)),this}innerJoin(t,e,r,o){let n=r,s=o;if(!n){if(!this.model.primaryKey)throw new f("JoinQueryBuilder::join","MODEL_HAS_NO_PRIMARY_KEY");n=`${this.model.table}.${this.model.primaryKey}`;}return this.join(typeof t=="string"?t:t.table,e,n,s),this}join(t,e,r,o){let n=r,s=o;if(!n){if(!this.model.primaryKey)throw new f("JoinQueryBuilder::join","MODEL_HAS_NO_PRIMARY_KEY");n=`${this.model.table}.${this.model.primaryKey}`;}return this.joinNodes.push(new J(typeof t=="string"?t:t.table,e,n,"inner",{operator:s||"="})),this}leftJoin(t,e,r,o){let n=r,s=o;if(!n){if(!this.model.primaryKey)throw new f("JoinQueryBuilder::join","MODEL_HAS_NO_PRIMARY_KEY");n=`${this.model.table}.${this.model.primaryKey}`;}return this.joinNodes.push(new J(typeof t=="string"?t:t.table,e,n,"left",{operator:s||"="})),this}rightJoin(t,e,r,o){let n=r,s=o;if(!n){if(!this.model.primaryKey)throw new f("JoinQueryBuilder::join","MODEL_HAS_NO_PRIMARY_KEY");n=`${this.model.table}.${this.model.primaryKey}`;}return this.joinNodes.push(new J(typeof t=="string"?t:t.table,e,n,"right",{operator:s||"="})),this}fullJoin(t,e,r,o){let n=r,s=o;if(!n){if(!this.model.primaryKey)throw new f("JoinQueryBuilder::join","MODEL_HAS_NO_PRIMARY_KEY");n=`${this.model.table}.${this.model.primaryKey}`;}return this.joinNodes.push(new J(typeof t=="string"?t:t.table,e,n,"full",{operator:s||"="})),this}};var nr=class extends or{constructor(e,r){super(e,r);this.modelSelectedColumns=[];this.modelAnnotatedColumns=[];this.dbType=r.getDbType(),this.fromNode=new v(this.model.table||""),this.distinctNode=null,this.distinctOnNode=null,this.selectNodes=[];}select(...e){return this.modelSelectedColumns=[...this.modelSelectedColumns,...e],e.map(o=>O(o,this.model.databaseCaseConvention)).forEach(o=>{this.selectNodes.push(new V(o));}),this}selectRaw(e){return this.selectNodes.push(new V(e,void 0,void 0,true)),this}clearSelect(){return this.modelSelectedColumns=[],this.selectNodes=[],this}clearFrom(){return this.fromNode=new v(this.model.table||""),this}clearDistinct(){return this.distinctNode=null,this}clearDistinctOn(){return this.distinctOnNode=null,this}annotate(e,r,o){let n,s,a;return o?(n=e,s=r,a=o):(n=void 0,s=e,a=r),this.selectNodes.push(new V(s,a,n)),this.modelAnnotatedColumns.push(a),this}from(e){return this.fromNode=new v(e),this}table(e){return this.fromNode=new v(e),this}distinct(){return this.distinctNode=new Zt,this}distinctOn(...e){return this.distinctOnNode=new Xt(e),this}};var sr=class extends nr{constructor(e,r,o=false){super(e,r);this.isNestedCondition=false;this.whereNodes=[],this.havingNodes=[],this.isNestedCondition=o;}clearWhere(){return this.whereNodes=[],this}clearHaving(){return this.havingNodes=[],this}strictWhen(e,r){return e==null?this:(r(this),this)}when(e,r){return e?(r(this),this):this}where(e,r,o){return typeof e=="function"?this.andWhereGroup(e):typeof r=="function"&&o===void 0?this.andWhereSubQuery(e,"in",r):r instanceof _&&o===void 0?this.andWhereSubQuery(e,"in",r):typeof r=="string"&&r!=="="&&o!==void 0&&(o instanceof _||typeof o=="function")?this.andWhereSubQuery(e,r,o):this.andWhere(e,r,o)}andWhere(e,r,o){if(typeof e=="function")return this.andWhereGroup(e);if(typeof r=="function"&&o===void 0)return this.andWhereSubQuery(e,"in",r);if(r instanceof _&&o===void 0)return this.andWhereSubQuery(e,"in",r);if(typeof r=="string"&&r!=="="&&o!==void 0&&(o instanceof _||typeof o=="function"))return this.andWhereSubQuery(e,r,o);let n="=",s;return typeof r=="string"&&o!==void 0&&!(o instanceof _)&&typeof o!="function"?(n=r,s=o):(s=r,n="="),this.whereNodes.push(new R(e,"and",false,n,s)),this}orWhere(e,r,o){if(typeof e=="function")return this.orWhereGroup(e);if(typeof r=="function"&&o===void 0)return this.orWhereSubQuery(e,"in",r);if(r instanceof _&&o===void 0)return this.orWhereSubQuery(e,"in",r);if(typeof r=="string"&&r!=="="&&o!==void 0&&(o instanceof _||typeof o=="function"))return this.orWhereSubQuery(e,r,o);let n="=",s;return typeof r=="string"&&o!==void 0&&!(o instanceof _)&&typeof o!="function"?(n=r,s=o):(s=r,n="="),this.whereNodes.push(new R(e,"or",false,n,s)),this}whereNot(e,r,o){if(typeof r=="function"&&o===void 0)return this.andWhereSubQuery(e,"not in",r);if(r instanceof _&&o===void 0)return this.andWhereSubQuery(e,"not in",r);if(typeof r=="string"&&o!==void 0&&(o instanceof _||typeof o=="function"))return this.andWhereSubQuery(e,r,o);let n="=",s;return typeof r=="string"&&o!==void 0&&!(o instanceof _)&&typeof o!="function"?(n=r,s=o):(s=r,n="="),this.whereNodes.push(new R(e,"and",true,n,s)),this}andWhereNot(e,r,o){if(typeof r=="function"&&o===void 0)return this.andWhereSubQuery(e,"not in",r);if(r instanceof _&&o===void 0)return this.andWhereSubQuery(e,"not in",r);if(typeof r=="string"&&o!==void 0&&(o instanceof _||typeof o=="function"))return this.andWhereSubQuery(e,r,o);let n="=",s;return typeof r=="string"&&o!==void 0&&!(o instanceof _)&&typeof o!="function"?(n=r,s=o):(s=r,n="="),this.whereNodes.push(new R(e,"and",true,n,s)),this}orWhereNot(e,r,o){if(typeof r=="function"&&o===void 0)return this.orWhereSubQuery(e,"not in",r);if(r instanceof _&&o===void 0)return this.orWhereSubQuery(e,"not in",r);if(typeof r=="string"&&o!==void 0&&(o instanceof _||typeof o=="function"))return this.orWhereSubQuery(e,r,o);let n="=",s;return typeof r=="string"&&o!==void 0&&!(o instanceof _)&&typeof o!="function"?(n=r,s=o):(s=r,n="="),this.whereNodes.push(new R(e,"or",true,n,s)),this}whereBetween(e,r,o){return this.andWhereBetween(e,r,o)}andWhereBetween(e,r,o){return this.whereNodes.push(new R(e,"and",false,"between",[r,o])),this}orWhereBetween(e,r,o){return this.whereNodes.push(new R(e,"or",false,"between",[r,o])),this}whereNotBetween(e,r,o){return this.andWhereNotBetween(e,r,o)}andWhereNotBetween(e,r,o){return this.whereNodes.push(new R(e,"and",true,"between",[r,o])),this}orWhereNotBetween(e,r,o){return this.whereNodes.push(new R(e,"or",true,"between",[r,o])),this}whereLike(e,r){return this.andWhereLike(e,r)}andWhereLike(e,r){return this.where(e,"like",r),this}orWhereLike(e,r){return this.orWhere(e,"like",r),this}whereILike(e,r){return this.andWhereILike(e,r)}andWhereILike(e,r){return this.where(e,"ilike",r),this}orWhereILike(e,r){return this.orWhere(e,"ilike",r),this}whereNotLike(e,r){return this.andWhereNotLike(e,r)}andWhereNotLike(e,r){return this.where(e,"not like",r),this}orWhereNotLike(e,r){return this.orWhere(e,"not like",r),this}whereNotILike(e,r){return this.andWhereNotILike(e,r)}andWhereNotILike(e,r){return this.where(e,"not ilike",r),this}orWhereNotILike(e,r){return this.orWhere(e,"not ilike",r),this}whereIn(e,r){return this.andWhereIn(e,r)}andWhereIn(e,r){return Array.isArray(r)?r.length?(this.whereNodes.push(new R(e,"and",false,"in",r)),this):(this.whereNodes.push(new R("false","and",true,"=",[],true)),this):this.andWhereSubQuery(e,"in",r)}orWhereIn(e,r){return Array.isArray(r)?r.length?(this.whereNodes.push(new R(e,"or",false,"in",r)),this):(this.whereNodes.push(new R("false","or",true,"=",[],true)),this):this.orWhereSubQuery(e,"in",r)}whereNotIn(e,r){return this.andWhereNotIn(e,r)}andWhereNotIn(e,r){return Array.isArray(r)?r.length?(this.whereNodes.push(new R(e,"and",true,"in",r)),this):(this.whereNodes.push(new R("true","and",true,"=",[],true)),this):this.andWhereSubQuery(e,"not in",r)}orWhereNotIn(e,r){return Array.isArray(r)?r.length?(this.whereNodes.push(new R(e,"or",true,"in",r)),this):(this.whereNodes.push(new R("true","or",true,"=",[],true)),this):this.orWhereSubQuery(e,"not in",r)}whereNull(e){return this.andWhereNull(e)}andWhereNull(e){return this.whereNodes.push(new R(e,"and",false,"is null",void 0)),this}orWhereNull(e){return this.whereNodes.push(new R(e,"or",false,"is null",void 0)),this}whereNotNull(e){return this.andWhereNotNull(e)}andWhereNotNull(e){return this.whereNodes.push(new R(e,"and",false,"is not null",void 0)),this}orWhereNotNull(e){return this.whereNodes.push(new R(e,"or",false,"is not null",void 0)),this}whereRegexp(e,r){return this.andWhereRegexp(e,r)}andWhereRegexp(e,r){let o=this.sqlDataSource.getDbType()==="postgres"||this.sqlDataSource.getDbType()==="cockroachdb";return this.whereNodes.push(new R(e,"and",false,o?"~":"regexp",r.source)),this}orWhereRegexp(e,r){let o=this.sqlDataSource.getDbType()==="postgres"||this.sqlDataSource.getDbType()==="cockroachdb";return this.whereNodes.push(new R(e,"or",false,o?"~":"regexp",r.source)),this}whereNotRegexp(e,r){let o=this.sqlDataSource.getDbType()==="postgres";return this.whereNodes.push(new R(e,"and",true,o?"~":"regexp",r.source)),this}andWhereNotRegexp(e,r){let o=this.sqlDataSource.getDbType()==="postgres";return this.whereNodes.push(new R(e,"and",true,o?"~":"regexp",r.source)),this}orWhereNotRegexp(e,r){let o=this.sqlDataSource.getDbType()==="postgres";return this.whereNodes.push(new R(e,"or",true,o?"~":"regexp",r.source)),this}whereExists(e){return this.andWhereExists(e)}andWhereExists(e){let r=e instanceof _?e:new _(this.model,this.sqlDataSource);return r.isNestedCondition=true,typeof e=="function"&&e(r),this.whereNodes.push(new ge("","exists",r.extractQueryNodes(),"and")),this}orWhereExists(e){let r=e instanceof _?e:new _(this.model,this.sqlDataSource);return r.isNestedCondition=true,typeof e=="function"&&e(r),this.whereNodes.push(new ge("","exists",r.extractQueryNodes(),"or")),this}whereNotExists(e){return this.andWhereNotExists(e)}andWhereNotExists(e){let r=e instanceof _?e:new _(this.model,this.sqlDataSource);return r.isNestedCondition=true,typeof e=="function"&&e(r),this.whereNodes.push(new ge("","not exists",r.extractQueryNodes(),"and")),this}orWhereNotExists(e){let r=e instanceof _?e:new _(this.model,this.sqlDataSource);return r.isNestedCondition=true,typeof e=="function"&&e(r),this.whereNodes.push(new ge("","not exists",r.extractQueryNodes(),"or")),this}whereRaw(e,r=[]){return this.andWhereRaw(e,r)}andWhereRaw(e,r=[]){return this.whereNodes.push(new R(e,"and",false,"=",r,true)),this}orWhereRaw(e,r=[]){return this.whereNodes.push(new R(e,"or",false,"=",r,true)),this}having(e,r,o){return this.andHaving(e,r,o)}andHaving(e,r,o){let n="=",s;return typeof r=="string"&&o?(n=r,s=o):(s=r,n="="),this.havingNodes.push(new De(e,"and",false,n,s)),this}orHaving(e,r,o){let n="=",s;return typeof r=="string"&&o?(n=r,s=o):(s=r,n="="),this.havingNodes.push(new De(e,"or",false,n,s)),this}havingRaw(e){return this.andHavingRaw(e)}andHavingRaw(e){return this.havingNodes.push(new De(e,"and",false,"=",[],true)),this}orHavingRaw(e){return this.havingNodes.push(new De(e,"or",false,"=",[],true)),this}buildSubQuery(e){if(e instanceof _)return e;let r=new _(this.model,this.sqlDataSource);return e(r),r}andWhereSubQuery(e,r,o){let n=this.buildSubQuery(o);return this.whereNodes.push(new ge(e,r,n.extractQueryNodes(),"and")),this}orWhereSubQuery(e,r,o){let n=this.buildSubQuery(o);return this.whereNodes.push(new ge(e,r,n.extractQueryNodes(),"or")),this}andWhereGroup(e){let r=new _(this.model,this.sqlDataSource);r.isNestedCondition=true,e(r);let o=new Ge(r.whereNodes,"and");return this.whereNodes.push(o),this}orWhereGroup(e){let r=new _(this.model,this.sqlDataSource);r.isNestedCondition=true,e(r);let o=new Ge(r.whereNodes,"or");return this.whereNodes.push(o),this}};var ir=class extends sr{whereJson(t,e){return this.andWhereJson(t,e)}andWhereJson(t,e){return this.whereNodes.push(new Y(t,"and",false,"contains",e)),this}orWhereJson(t,e){return this.whereNodes.push(new Y(t,"or",false,"contains",e)),this}whereJsonNotContains(t,e){return this.andWhereJsonNotContains(t,e)}andWhereJsonNotContains(t,e){return this.whereNodes.push(new Y(t,"and",true,"not contains",e)),this}orWhereJsonNotContains(t,e){return this.whereNodes.push(new Y(t,"or",true,"not contains",e)),this}whereJsonContains(t,e){return this.andWhereJsonContains(t,e)}andWhereJsonContains(t,e){return this.whereNodes.push(new Y(t,"and",false,"contains",e)),this}orWhereJsonContains(t,e){return this.whereNodes.push(new Y(t,"or",false,"contains",e)),this}whereNotJson(t,e){return this.andWhereNotJson(t,e)}andWhereNotJson(t,e){return this.whereNodes.push(new Y(t,"and",true,"not contains",e)),this}orWhereNotJson(t,e){return this.whereNodes.push(new Y(t,"or",true,"not contains",e)),this}whereJsonRaw(t,e){return this.andWhereJsonRaw(t,e)}andWhereJsonRaw(t,e){return this.whereNodes.push(new Y(t,"and",false,"raw",e)),this}orWhereJsonRaw(t,e){return this.whereNodes.push(new Y(t,"or",false,"raw",e)),this}};var _=class i extends ir{constructor(e,r=Ne.getInstance()){super(e,r);this.isNestedCondition=false;this.mustRemoveAnnotations=false;this.insertNode=null;this.onDuplicateNode=null;this.updateNode=null;this.deleteNode=null;this.truncateNode=null;this.performance={many:this.manyWithPerformance.bind(this),one:this.oneWithPerformance.bind(this),oneOrFail:this.oneOrFailWithPerformance.bind(this),first:this.firstWithPerformance.bind(this),firstOrFail:this.firstOrFailWithPerformance.bind(this),paginate:this.paginateWithPerformance.bind(this),paginateWithCursor:this.paginateWithCursorWithPerformance.bind(this),exists:this.existsWithPerformance.bind(this),truncate:this.truncateWithPerformance.bind(this),delete:this.deleteWithPerformance.bind(this),insert:this.insertWithPerformance.bind(this),insertMany:this.insertManyWithPerformance.bind(this),update:this.updateWithPerformance.bind(this),softDelete:this.softDeleteWithPerformance.bind(this),pluck:this.pluckWithPerformance.bind(this)};this.dbType=r.getDbType(),this.isNestedCondition=false,this.model=e,this.unionNodes=[],this.lockQueryNodes=[],this.withNodes=[],this.astParser=new N(this.model,this.dbType),this.interpreterUtils=new y(this.model);}async exists(){return !!await this.one()}async many(){let{sql:e,bindings:r}=this.unWrap();return U(e,r,this.sqlDataSource,"raw",{sqlLiteOptions:{typeofModel:this.model,mode:"fetch"}})}async pluck(e){return (await this.many()).map(o=>o[e])}async one(){let e=await this.limit(1).many();return !e||!e.length?null:e[0]}async first(){return this.one()}async oneOrFail(){let e=await this.one();if(!e)throw new f("SqlDataSource::query::oneOrFail","ROW_NOT_FOUND");return e}async firstOrFail(){return this.oneOrFail()}async stream(e={}){let{sql:r,bindings:o}=this.unWrap();return await zt(r,o,this.sqlDataSource,e,{onData:(s,a)=>{s.write(a);}})}async*chunk(e){let r=0;for(;;){let o=await this.limit(e).offset(r).many();if(!o.length)break;r+=o.length,yield o;}}async paginateWithCursor(e,r,o){let n=this.clone();this.orderByNodes.length||this.orderBy(r.discriminator,r.orderBy||"asc"),o&&this.where(o.key,r.operator||">",o.value),this.limit(e);let s=await this.many(),a=await n.getCount(),l=s[s.length-1],d=l?l[r.discriminator]:null;return [{paginationMetadata:_l(e,a),data:s},{key:r.discriminator,value:d}]}selectSubQuery(e,r){if(typeof e=="function"){let o=new i(this.model,this.sqlDataSource);return e(o),this.selectNodes.push(new V(o.extractQueryNodes(),r)),this}return this.selectNodes.push(new V(e.extractQueryNodes(),r)),this}lockForUpdate(e={}){return this.lockQueryNodes.push(new ze("for_update",e.skipLocked,e.noWait)),this}forShare(e={}){return this.lockQueryNodes.push(new ze("for_share",e.skipLocked,e.noWait)),this}union(e){if(typeof e=="string")return this.unionNodes.push(new xe(e)),this;let o=(e instanceof i?e:e(new i(this.model,this.sqlDataSource))).extractQueryNodes();return this.unionNodes.push(new xe(o)),this}unionAll(e){if(typeof e=="string")return this.unionNodes.push(new xe(e,true)),this;let o=(e instanceof i?e:e(new i(this.model,this.sqlDataSource))).extractQueryNodes();return this.unionNodes.push(new xe(o,true)),this}async increment(e,r=1){return this.update({[e]:this.sqlDataSource.rawStatement(`${e} + ${r}`)})}async decrement(e,r=1){return this.update({[e]:this.sqlDataSource.rawStatement(`${e} - ${r}`)})}async getCount(e="*"){this.clearForFunctions(),this.annotate("count",e,"total");let r=await this.one();return r?ke(r.total):0}async getMax(e){this.clearForFunctions(),this.annotate("max",e,"total");let r=await this.one();return r?ke(r.total):0}async getMin(e){this.clearForFunctions(),this.annotate("min",e,"total");let r=await this.one();return r?ke(r.total):0}async getAvg(e){this.clearForFunctions(),this.annotate("avg",e,"total");let r=await this.one();return r?ke(r.total):0}async getSum(e){this.clearForFunctions(),this.annotate("sum",e,"total");let r=await this.one();return r?ke(r.total):0}async paginate(e,r){(typeof e!="number"||typeof r!="number")&&b.warn(`${this.model.name}::paginate Non numeric values provided to \`paginate\``);let o=this.clone(),[n,s]=await Promise.all([this.limit(r).offset((e-1)*r).many(),o.getCount("*")]);return {paginationMetadata:Gt(e,r,s),data:n}}from(e,r){if(typeof e=="function"){if(!r)throw new f("QueryBuilder::from","MISSING_ALIAS_FOR_SUBQUERY");let o=new i(this.model,this.sqlDataSource);e(o);let n=o.extractQueryNodes();return this.fromNode=new v(n,r),this}return this.fromNode=new v(e,r),this}with(e,r){let o=new i(this.model,this.sqlDataSource);r(o);let n=o.extractQueryNodes();return this.withNodes.push(new Qe("normal",e,n)),this}withRecursive(e,r){let o=new i(this.model,this.sqlDataSource);r(o);let n=o.extractQueryNodes();return this.withNodes.push(new Qe("recursive",e,n)),this}withMaterialized(e,r){if(this.dbType!=="postgres"&&this.dbType!=="cockroachdb")throw new f("QueryBuilder::withMaterialized","MATERIALIZED_CTE_NOT_SUPPORTED",new Error("MATERIALIZED CTE is only supported by postgres"));let o=new i(this.model,this.sqlDataSource);r(o);let n=o.extractQueryNodes();return this.withNodes.push(new Qe("materialized",e,n)),this}async insert(e,r){let{columns:o,values:n}=await this.interpreterUtils.prepareColumns(Object.keys(e),Object.values(e),"insert"),s=Object.fromEntries(o.map((u,c)=>[u,n[c]]));this.insertNode=new Q(this.fromNode,[s],r);let{sql:a,bindings:l}=this.astParser.parse([this.insertNode]),d=await U(a,l,this.sqlDataSource,"raw",{sqlLiteOptions:{typeofModel:this.model,mode:"insertOne",models:[e]}});return Array.isArray(d)&&d.length?d[0]:d}async insertMany(e,r){if(!e.length)return [];let o=await Promise.all(e.map(async a=>{let{columns:l,values:d}=await this.interpreterUtils.prepareColumns(Object.keys(a),Object.values(a),"insert");return Object.fromEntries(l.map((u,c)=>[u,d[c]]))}));this.insertNode=new Q(this.fromNode,o,r);let{sql:n,bindings:s}=this.astParser.parse([this.insertNode]);return U(n,s,this.sqlDataSource,"raw",{sqlLiteOptions:{typeofModel:this.model,mode:"insertMany",models:o}})}async upsert(e,r,o={updateOnConflict:true}){let n=Object.keys(e),s=Object.keys(r),{columns:a,values:l}=await this.interpreterUtils.prepareColumns(Object.keys(e),Object.values(e),"insert"),d=Object.fromEntries(a.map((p,h)=>[p,l[h]])),{sql:u,bindings:c}=this.astParser.parse([new Q(new v(this.model.table),[d],void 0,true),new X(this.model.table,s,n,o.updateOnConflict??true?"update":"ignore",o.returning)]),m=await U(u,c,this.sqlDataSource,"raw",{sqlLiteOptions:{typeofModel:this.model,mode:"raw",models:[e]}});return Array.isArray(m)?m:[m]}async upsertMany(e,r,o,n={updateOnConflict:true}){let s=[];await Promise.all(o.map(async u=>{let{columns:c,values:m}=await this.interpreterUtils.prepareColumns(Object.keys(u),Object.values(u),"insert"),p=Object.fromEntries(c.map((h,g)=>[h,m[g]]));s.push(p);}));let{sql:a,bindings:l}=this.astParser.parse([new Q(new v(this.model.table),s,void 0,true),new X(this.model.table,e,r,n.updateOnConflict??true?"update":"ignore",n.returning)]),d=await U(a,l,this.sqlDataSource,"raw",{sqlLiteOptions:{typeofModel:this.model,mode:"raw",models:o}});return Array.isArray(d)?d:[d]}async update(e){let r=Object.keys(e),o=Object.values(e),{columns:n,values:s}=await this.interpreterUtils.prepareColumns(r,o,"update");this.updateNode=new H(this.fromNode,n,s);let{sql:a,bindings:l}=this.astParser.parse([this.updateNode,...this.whereNodes,...this.joinNodes]);return U(a,l,this.sqlDataSource,"affectedRows",{sqlLiteOptions:{typeofModel:this.model,mode:"affectedRows"}})}async truncate(){this.truncateNode=new me(this.fromNode);let{sql:e,bindings:r}=this.astParser.parse([this.truncateNode]);await U(e,r,this.sqlDataSource,"raw");}async delete(){this.deleteNode=new ue(this.fromNode);let{sql:e,bindings:r}=this.astParser.parse([this.deleteNode,...this.whereNodes,...this.joinNodes]);return U(e,r,this.sqlDataSource,"affectedRows",{sqlLiteOptions:{typeofModel:this.model,mode:"affectedRows"}})}async softDelete(e={}){let{column:r="deletedAt",value:o=ne()}=e||{},{columns:n,values:s}=await this.interpreterUtils.prepareColumns([r],[o],"update");this.updateNode=new H(this.fromNode,n,s);let{sql:a,bindings:l}=this.astParser.parse([this.updateNode,...this.whereNodes,...this.joinNodes]);return U(a,l,this.sqlDataSource,"affectedRows",{sqlLiteOptions:{typeofModel:this.model,mode:"affectedRows"}})}toQuery(){let{sql:e,bindings:r}=this.unWrap();return Ts(e,r)}unWrap(){this.selectNodes.length||(this.selectNodes=[new V("*")]);let{sql:e,bindings:r}=this.astParser.parse(this.extractQueryNodes()),o=Tt(this.sqlDataSource,e);return {sql:this.withQuery?`${this.withQuery} ${o}`:o,bindings:[...r||[]]}}clone(){let e=new i(this.model,this.sqlDataSource);return e.dbType=this.dbType,e.modelSelectedColumns=B(this.modelSelectedColumns),e.modelAnnotatedColumns=B(this.modelAnnotatedColumns),e.distinctNode=B(this.distinctNode),e.distinctOnNode=B(this.distinctOnNode),e.selectNodes=B(this.selectNodes),e.withQuery=B(this.withQuery),e.joinNodes=B(this.joinNodes),e.whereNodes=B(this.whereNodes),e.groupByNodes=B(this.groupByNodes),e.havingNodes=B(this.havingNodes),e.orderByNodes=B(this.orderByNodes),e.lockQueryNodes=B(this.lockQueryNodes),e.unionNodes=B(this.unionNodes),e.withNodes=B(this.withNodes),e.fromNode=B(this.fromNode),e.limitNode=B(this.limitNode),e.offsetNode=B(this.offsetNode),e.isNestedCondition=this.isNestedCondition,e.mustRemoveAnnotations=this.mustRemoveAnnotations,e}clear(){let e=new i(this.model,this.sqlDataSource);return this.fromNode.alias&&e.from(e.model.table,this.fromNode.alias),e}clearLockQuery(){return this.lockQueryNodes=[],this}clearUnionQuery(){return this.unionNodes=[],this}clearWithQuery(){return this.withNodes=[],this}extractQueryNodes(){return this.selectNodes.length||(this.selectNodes=[new V("*")]),this.insertNode?[this.insertNode,this.onDuplicateNode].filter(Boolean):this.updateNode?[this.updateNode,...this.whereNodes,...this.joinNodes,...this.orderByNodes,this.limitNode].filter(Boolean):this.deleteNode?[this.deleteNode,...this.whereNodes,...this.joinNodes,...this.orderByNodes,this.limitNode].filter(Boolean):this.truncateNode?[this.truncateNode]:[...this.withNodes,this.distinctNode,this.distinctOnNode,...this.selectNodes,this.fromNode,...this.joinNodes,...this.whereNodes,...this.groupByNodes,...this.havingNodes,...this.orderByNodes,this.limitNode,this.offsetNode,...this.lockQueryNodes,...this.unionNodes].filter(Boolean)}clearForFunctions(){return this.clearSelect(),this.clearGroupBy(),this.clearOrderBy(),this.clearLimit(),this.clearOffset(),this}async manyWithPerformance(e="millis"){let[r,o]=await I(this.many.bind(this),e)();return {data:o,time:Number(r)}}async oneWithPerformance(e="millis"){let[r,o]=await I(this.one.bind(this),e)();return {data:o,time:Number(r)}}async firstWithPerformance(e="millis"){return this.oneWithPerformance(e)}async firstOrFailWithPerformance(e="millis"){return this.oneOrFailWithPerformance(e)}async paginateWithPerformance(e,r,o="millis"){let[n,s]=await I(this.paginate.bind(this,e,r),o)();return {data:s,time:Number(n)}}async paginateWithCursorWithPerformance(e,r,o,n="millis"){let[s,a]=await I(this.paginateWithCursor.bind(this,e,r,o),n)();return {data:a,time:Number(s)}}async oneOrFailWithPerformance(e="millis"){let[r,o]=await I(this.oneOrFail.bind(this),e)();return {data:o,time:Number(r)}}async existsWithPerformance(e="millis"){let[r,o]=await I(this.exists.bind(this),e)();return {data:o,time:Number(r)}}async pluckWithPerformance(e,r="millis"){let[o,n]=await I(this.pluck.bind(this,e),r)();return {data:n,time:Number(o)}}async updateWithPerformance(e,r="millis"){let[o,n]=await I(this.update.bind(this,e),r)();return {data:n,time:Number(o)}}async insertWithPerformance(e,r="millis"){let[o,n]=await I(this.insert.bind(this,e),r)();return {data:n,time:Number(o)}}async insertManyWithPerformance(e,r="millis"){let[o,n]=await I(this.insertMany.bind(this,e),r)();return {data:n,time:Number(o)}}async softDeleteWithPerformance(e={},r="millis"){let[o,n]=await I(this.softDelete.bind(this,e),r)();return {data:n,time:Number(o)}}async deleteWithPerformance(e="millis"){let[r,o]=await I(this.delete.bind(this),e)();return {data:o,time:Number(r)}}async truncateWithPerformance(e="millis"){let[r,o]=await I(this.truncate.bind(this),e)();return {data:o,time:Number(r)}}};var Ue=class i extends _{constructor(e,r){super(e,r);this.performance={many:this.manyWithPerformance.bind(this),one:this.oneWithPerformance.bind(this),oneOrFail:this.oneOrFailWithPerformance.bind(this),first:this.firstWithPerformance.bind(this),firstOrFail:this.firstOrFailWithPerformance.bind(this),paginate:this.paginateWithPerformance.bind(this),exists:this.existsWithPerformance.bind(this),paginateWithCursor:this.paginateWithCursorWithPerformance.bind(this),truncate:this.truncateWithPerformance.bind(this),delete:this.deleteWithPerformance.bind(this),update:this.updateWithPerformance.bind(this),softDelete:this.softDeleteWithPerformance.bind(this),pluck:this.pluckWithPerformance.bind(this)};this.sqlModelManagerUtils=new Ze(e,this.dbType,r),this.relationQueryBuilders=[],this.modelSelectedColumns=[],this.modelColumnsMap=new Map,this.modelColumnsDatabaseNames=new Map,this.model.getColumns().forEach(n=>{this.modelColumnsMap.set(n.databaseName,n),this.modelColumnsDatabaseNames.set(n.databaseName,n.columnName);});}get isRelationQueryBuilder(){return !!this.relation}static from(e,r={}){return r.connection?new i(e,r.connection):r.trx?new i(e,r.trx.sql):new i(e,e.sqlInstance)}async one(e={}){let r=await this.limit(1).many(e);return !r||!r.length?null:r[0]}async first(e){return this.one(e)}async oneOrFail(e){let r=await this.one(e);if(!r)throw new f(this.model.name+"::oneOrFail","ROW_NOT_FOUND");return r}async firstOrFail(e){return this.oneOrFail(e)}async many(e={}){!e.ignoreHooks?.includes("beforeFetch")&&await this.model.beforeFetch?.(this);let o=(await super.many()).map(a=>this.addAdditionalColumnsToModel(a,this.model));if(!o.length)return [];let n=await se(o,this.model,this.modelSelectedColumns,this.modelAnnotatedColumns,this.mustRemoveAnnotations);if(!n)return [];let s=Array.isArray(n)?n:[n];return e.ignoreHooks?.includes("afterFetch")||await this.model.afterFetch?.(s),this.relationQueryBuilders.length&&await this.processRelationsRecursively(s),s}async*chunk(e,r={}){let o=0;for(;;){let n=await this.limit(e).offset(o).many(r);if(!n.length)break;yield n,o+=n.length;}}async stream(e={}){!e.ignoreHooks?.includes("beforeFetch")&&await this.model.beforeFetch?.(this);let{sql:r,bindings:o}=this.unWrap();return await zt(r,o,this.sqlDataSource,e,{onData:async(s,a)=>{let l=this.addAdditionalColumnsToModel(a,this.model),d=await se([l],this.model,this.modelSelectedColumns,this.modelAnnotatedColumns,this.mustRemoveAnnotations);d&&(e.ignoreHooks?.includes("afterFetch")||await this.model.afterFetch?.([d]),this.relationQueryBuilders.length&&await this.processRelationsRecursively([d]),s.write(d));}})}async paginateWithCursor(e,r,o){if(!r){if(!this.model.primaryKey)throw new f(this.model.name+"::paginateWithCursor","PRIMARY_KEY_NOT_FOUND");r={discriminator:this.model.primaryKey};}return super.paginateWithCursor(e,r,o)}async insert(...e){return this.model.insert(...e)}async insertMany(...e){return this.model.insertMany(...e)}async update(e,r={}){return r.ignoreBeforeUpdateHook||await this.model.beforeUpdate?.(this),super.update(e)}async softDelete(e={}){let{ignoreBeforeUpdateHook:r=false}=e||{};return !r&&await this.model.beforeUpdate?.(this),super.softDelete(e)}async delete(e={}){return e.ignoreBeforeDeleteHook||await this.model.beforeDelete?.(this),super.delete()}async getCount(e="*",r={ignoreHooks:false}){this.clearForFunctions(),this.annotate("count",e,"total");let o=r.ignoreHooks?["beforeFetch"]:[],n=await this.one({ignoreHooks:o});return n?+n.$annotations.total:0}async getMax(e,r={ignoreHooks:false}){this.clearForFunctions(),this.annotate("max",e,"total");let o=r.ignoreHooks?["beforeFetch","afterFetch"]:[],n=await this.one({ignoreHooks:o});return n?+n.$annotations.total:0}async getMin(e,r={ignoreHooks:false}){this.clearForFunctions(),this.annotate("min",e,"total");let o=r.ignoreHooks?["beforeFetch","afterFetch"]:[],n=await this.one({ignoreHooks:o});return n?+n.$annotations.total:0}async getAvg(e,r={ignoreHooks:false}){this.clearForFunctions(),this.annotate("avg",e,"total");let o=r.ignoreHooks?["beforeFetch","afterFetch"]:[],n=await this.one({ignoreHooks:o});return n?+n.$annotations.total:0}async getSum(e,r={ignoreHooks:false}){this.clearForFunctions(),this.annotate("sum",e,"total");let o=r.ignoreHooks?["beforeFetch","afterFetch"]:[],n=await this.one({ignoreHooks:o});return n?+n.$annotations.total:0}async paginate(e,r,o={ignoreHooks:false}){let n=this.clone(),[s,a]=await Promise.all([this.limit(r).offset((e-1)*r).many({ignoreHooks:o.ignoreHooks?["beforeFetch","afterFetch"]:[]}),n.getCount("*",{ignoreHooks:o.ignoreHooks})]);return {paginationMetadata:Gt(e,r,a),data:s}}select(...e){return this.modelSelectedColumns=[...this.modelSelectedColumns,...e],this.selectNodes=this.selectNodes.concat(e.map(r=>new V(r))),this}annotate(e,r,o){let n,s,a;return o?(n=e,s=r,a=o):(n=void 0,s=e,a=r),this.selectNodes=this.selectNodes.concat(new V(s,a,n)),this.modelAnnotatedColumns.push(a),this}removeAnnotations(){return this.mustRemoveAnnotations=true,this.modelAnnotatedColumns=[],this}load(e,r){let o=this.sqlModelManagerUtils.getRelationFromModel(e),n=new i(o.model,this.sqlDataSource);return n.relation=o,r?.(n),this.relationQueryBuilders.push(n),this}clearRelations(){return this.relationQueryBuilders=[],this}havingRelated(e,r,o){return this.andHavingRelated(e,r,o)}andHavingRelated(e,r,o){let n,s,a;typeof r=="function"?a=r:typeof r=="string"&&o!==void 0?(s=r,n=o):r!==void 0&&(n=r,s="=");let l=this.sqlModelManagerUtils.getRelationFromModel(e),d=new i(l.model,this.sqlDataSource);d.relation=l;let u=this.getRelatedModelsQueryForRelation(d,l,[]);return u.clearWhere(),u.clearSelect(),u.selectRaw("1"),a?.(u),this.applyHavingRelatedFilter(u,l,s,n),this.whereExists(u),this}orHavingRelated(e,r,o){let n,s,a;typeof r=="function"?a=r:typeof r=="string"&&o!==void 0?(s=r,n=o):r!==void 0&&(n=r,s="=");let l=this.sqlModelManagerUtils.getRelationFromModel(e),d=new i(l.model,this.sqlDataSource);d.relation=l;let u=this.getRelatedModelsQueryForRelation(d,l,[]);return u.clearWhere(),u.clearSelect(),u.selectRaw("1"),a?.(u),this.applyHavingRelatedFilter(u,l,s,n),this.orWhereExists(u),this}notHavingRelated(e,r,o){return this.andNotHavingRelated(e,r,o)}andNotHavingRelated(e,r,o){let n,s,a;typeof r=="function"?a=r:typeof r=="string"&&o!==void 0?(s=r,n=o):r!==void 0&&(n=r,s="=");let l=this.sqlModelManagerUtils.getRelationFromModel(e),d=new i(l.model,this.sqlDataSource);d.relation=l;let u=this.getRelatedModelsQueryForRelation(d,l,[]);return u.clearWhere(),u.clearSelect(),u.selectRaw("1"),a?.(u),this.applyHavingRelatedFilter(u,l,s,n),this.whereNotExists(u),this}orNotHavingRelated(e,r,o){let n,s,a;typeof r=="function"?a=r:typeof r=="string"&&o!==void 0?(s=r,n=o):r!==void 0&&(n=r,s="=");let l=this.sqlModelManagerUtils.getRelationFromModel(e),d=new i(l.model,this.sqlDataSource);d.relation=l;let u=this.getRelatedModelsQueryForRelation(d,l,[]);return u.clearWhere(),u.clearSelect(),u.selectRaw("1"),a?.(u),this.applyHavingRelatedFilter(u,l,s,n),this.orWhereNotExists(u),this}clone(){let e=super.clone();return e.relationQueryBuilders=B(this.relationQueryBuilders),e}async processRelationsRecursively(e){await Promise.all(this.relationQueryBuilders.filter(r=>r.isRelationQueryBuilder).map(async r=>{let o=await this.getRelatedModelsForRelation(r,r.relation,e);this.mapRelatedModelsToModels(r.relation,e,o);}));}mapRelatedModelsToModels(e,r,o){switch(e.type){case "hasOne":if(!this.model.primaryKey)throw new f(this.model.name+"::mapRelatedModelsToModels::hasOne","MODEL_HAS_NO_PRIMARY_KEY");let n=new Map;o.forEach(m=>{let p=m[e.foreignKey];p&&n.set(String(p),m);}),r.forEach(m=>{let p=m[this.model.primaryKey];if(!p){m[e.columnName]=null;return}let h=n.get(String(p));m[e.columnName]=h||null;});break;case "belongsTo":let s=new Map;o.forEach(m=>{if(!e.model.primaryKey)throw new f(this.model.name+"::mapRelatedModelsToModels::belongsTo",`RELATED_MODEL_DOES_NOT_HAVE_A_PRIMARY_KEY_${e.model.name}`);let p=m[e.model.primaryKey];p&&s.set(String(p),m);}),r.forEach(m=>{let p=m[e.foreignKey];if(!p){m[e.columnName]=null;return}let h=s.get(String(p));m[e.columnName]=h||null;});break;case "hasMany":if(!this.model.primaryKey)throw new f(this.model.name+"::mapRelatedModelsToModels::hasMany","MODEL_HAS_NO_PRIMARY_KEY");let a=new Map;o.forEach(m=>{let p=m[e.foreignKey];if(!p)return;let h=String(p);a.has(h)||a.set(h,[]),a.get(h).push(m);}),r.forEach(m=>{let p=m[this.model.primaryKey];if(!p){m[e.columnName]=[];return}let h=a.get(String(p))||[];m[e.columnName]=h;});break;case "manyToMany":if(!this.model.primaryKey||!e.model.primaryKey)throw new f(this.model.name+"::mapRelatedModelsToModels::manyToMany","MODEL_HAS_NO_PRIMARY_KEY");let l=e,d=new Map,u=l.leftForeignKey,c=this.modelColumnsMap.get(u)||this.modelColumnsDatabaseNames.get(u)||O(u,this.model.modelCaseConvention);o.forEach(m=>{let p=m.$annotations||{},h=p[c];if(h==null)return;let g=String(h);d.has(g)||d.set(g,[]),this.modelAnnotatedColumns.includes(c)||(delete p[c],Object.keys(p).length||delete m.$annotations),d.get(g).push(m);}),r.forEach(m=>{let p=m[this.model.primaryKey];if(!p){m[e.columnName]=[];return}let h=d.get(String(p))||[];m[e.columnName]=h;});break;default:throw new f(this.model.name+"::mapRelatedModelsToModels","UNSUPPORTED_RELATION_TYPE")}}async getRelatedModelsForRelation(e,r,o){return this.getRelatedModelsQueryForRelation(e,r,o).many()}getRelatedModelsQueryForRelation(e,r,o){let n=this.getFilterValuesFromModelsForRelation(r,o);switch(r.type){case "belongsTo":case "hasOne":return e.whereIn(e.relation.type==="belongsTo"?r.model.primaryKey:r.foreignKey,n);case "hasMany":let s=e.limitNode?.limit,a=e.offsetNode?.offset;if(!s&&!a)return e.whereIn(e.relation.type==="belongsTo"?r.model.primaryKey:r.foreignKey,n);let l=pe__default.default.randomBytes(6).toString("hex"),d=`${r.model.table}_cte_${l}`,u=e.orderByNodes.map(q=>q.isRawValue?q.column:`${this.interpreterUtils.formatStringColumn(this.dbType,q.column)} ${q.direction}`).join(", ")||["1"];e.clearLimit(),e.clearOffset();let c=e.with(d,q=>q.select(...e.modelSelectedColumns).selectRaw(`ROW_NUMBER() OVER (PARTITION BY ${this.interpreterUtils.formatStringColumn(this.dbType,r.foreignKey)} ORDER BY ${u}) as rn_${l}`).whereIn(r.foreignKey,n));s&&c.whereRaw(`rn_${l} <= ${s+(a||0)}`),a&&c.whereRaw(`rn_${l} > ${a}`);let m=e.modelSelectedColumns.map(q=>Mr(q,d,e.model.table));return c.select(...m).from(d);case "manyToMany":if(!this.model.primaryKey||!r.model.primaryKey)throw new f(this.model.name+"::getRelatedModelsForRelation","MODEL_HAS_NO_PRIMARY_KEY");let p=r;if(!o.length)return e;let h=e.limitNode?.limit,g=e.offsetNode?.offset,w=e.modelSelectedColumns.length?e.modelSelectedColumns.map(q=>q.includes(".")?q:`${r.model.table}.${q}`):[`${r.model.table}.*`];if(!h&&!g)return e.select(...w).annotate(`${p.throughModel}.${p.leftForeignKey}`,p.leftForeignKey).leftJoin(p.throughModel,`${p.relatedModel}.${p.model.primaryKey}`,`${p.throughModel}.${p.rightForeignKey}`).whereIn(`${p.throughModel}.${p.leftForeignKey}`,n);let C=pe__default.default.randomBytes(6).toString("hex"),P=`${r.model.table}_cte_${C}`,j=e.orderByNodes.map(q=>{if(q.isRawValue)return q.column;let Oe=q.column.includes(".")?q.column:`${r.model.table}.${q.column}`;return `${this.interpreterUtils.formatStringColumn(this.dbType,Oe)} ${q.direction}`}).join(", ")||["1"];e.clearLimit(),e.clearOffset(),e.clearOrderBy();let z=`${pe__default.default.randomBytes(6).toString("hex")}_left_foreign_key`,L=e.with(P,q=>q.select(...w).annotate(`${p.throughModel}.${p.leftForeignKey}`,z).selectRaw(`ROW_NUMBER() OVER (PARTITION BY ${p.throughModel}.${this.interpreterUtils.formatStringColumn(this.dbType,p.leftForeignKey)} ORDER BY ${j}) as rn_${C}`).leftJoin(p.throughModel,`${p.relatedModel}.${p.model.primaryKey}`,`${p.throughModel}.${p.rightForeignKey}`).whereIn(`${p.throughModel}.${p.leftForeignKey}`,n));h&&L.whereRaw(`rn_${C} <= ${h+(g||0)}`),g&&L.whereRaw(`rn_${C} > ${g}`);let re=w.map(q=>Mr(q,P,e.model.table));return L.select(...re).annotate(`${P}.${z}`,p.leftForeignKey).from(P);default:throw new f(this.model.name+"::getRelatedModelsForRelation","UNSUPPORTED_RELATION_TYPE")}}getFilterValuesFromModelsForRelation(e,r){switch(e.type){case "hasMany":case "hasOne":if(!this.model.primaryKey)throw new f(this.model.name+"::getFilterValuesFromModelsForRelation","MODEL_HAS_NO_PRIMARY_KEY");return r.map(o=>o[this.model.primaryKey]);case "belongsTo":return r.map(o=>o[e.foreignKey]);case "manyToMany":if(!this.model.primaryKey)throw new f(this.model.name+"::getFilterValuesFromModelsForRelation","MODEL_HAS_NO_PRIMARY_KEY");return r.map(o=>o[this.model.primaryKey]);default:throw new f(this.model.name+"::getFilterValuesFromModelsForRelation","UNSUPPORTED_RELATION_TYPE")}}applyHavingRelatedFilter(e,r,o,n){let s=new y(r.model),a=new y(this.model),l=this.dbType;switch(r.type){case "hasOne":case "hasMany":{if(!this.model.primaryKey||!r.foreignKey)throw new f(this.model.name+"::applyHavingRelatedFilter","MODEL_HAS_NO_PRIMARY_KEY");let d=s.formatStringColumn(l,`${r.model.table}.${r.foreignKey}`),u=a.formatStringColumn(l,`${this.model.table}.${this.model.primaryKey}`);e.whereRaw(`${d} = ${u}`),o&&typeof n=="number"&&e.groupByRaw(d).andHavingRaw(`count(*) ${o} ${n}`);return}case "belongsTo":{if(!r.model.primaryKey||!r.foreignKey)throw new f(this.model.name+"::applyHavingRelatedFilter",`RELATED_MODEL_DOES_NOT_HAVE_A_PRIMARY_KEY_${r.model.name}`);let d=s.formatStringColumn(l,`${r.model.table}.${r.model.primaryKey}`),u=a.formatStringColumn(l,`${this.model.table}.${r.foreignKey}`);e.whereRaw(`${d} = ${u}`),o&&typeof n=="number"&&e.groupByRaw(d).andHavingRaw(`count(*) ${o} ${n}`);return}case "manyToMany":{let d=r;if(!this.model.primaryKey||!r.model.primaryKey)throw new f(this.model.name+"::applyHavingRelatedFilter","MODEL_HAS_NO_PRIMARY_KEY");e.joinNodes?.some(p=>!p.isRawValue&&p.table===d.throughModel&&p.type==="left")||e.leftJoin(d.throughModel,`${d.relatedModel}.${r.model.primaryKey}`,`${d.throughModel}.${d.rightForeignKey}`);let c=a.formatStringColumn(l,`${d.throughModel}.${d.leftForeignKey}`),m=a.formatStringColumn(l,`${this.model.table}.${this.model.primaryKey}`);e.whereRaw(`${c} = ${m}`),o&&typeof n=="number"&&e.groupByRaw(c).andHavingRaw(`count(*) ${o} ${n}`);return}default:throw new f(this.model.name+"::applyHavingRelatedFilter","UNSUPPORTED_RELATION_TYPE")}}addAdditionalColumnsToModel(e,r){let o={},n={};return Object.entries(e).forEach(([s,a])=>{if(s==="$annotations"||this.modelColumnsDatabaseNames.get(s)){o[s]=a;return}n[O(s,r.modelCaseConvention)]=a;}),o.$annotations=n,o}async manyWithPerformance(e={},r="millis"){let[o,n]=await I(this.many.bind(this,e),r)();return {data:n,time:Number(o)}}async oneWithPerformance(e={},r="millis"){let[o,n]=await I(this.one.bind(this,e),r)();return {data:n,time:Number(o)}}async oneOrFailWithPerformance(e={},r="millis"){let[o,n]=await I(this.oneOrFail.bind(this,e),r)();return {data:n,time:Number(o)}}async firstOrFailWithPerformance(e={},r="millis"){return this.oneOrFailWithPerformance(e,r)}async firstWithPerformance(e={},r="millis"){return this.oneWithPerformance(e,r)}async paginateWithPerformance(e,r,o,n="millis"){let{ignoreHooks:s=false}=o||{},[a,l]=await I(this.paginate.bind(this,e,r,{ignoreHooks:s}),n)();return {data:{paginationMetadata:l.paginationMetadata,data:l.data},time:Number(a)}}async paginateWithCursorWithPerformance(e,r,o,n="millis"){let[s,a]=await I(this.paginateWithCursor.bind(this,e,r,o),n)();return {data:a,time:Number(s)}}async existsWithPerformance(e="millis"){let[r,o]=await I(this.exists.bind(this),e)();return {data:o,time:Number(r)}}async pluckWithPerformance(e,r="millis"){let[o,n]=await I(this.pluck.bind(this,e),r)();return {data:n,time:Number(o)}}async softDeleteWithPerformance(e={},r="millis"){let[o,n]=await I(this.softDelete.bind(this,e),r)();return {data:n,time:Number(o)}}async updateWithPerformance(e,r={},o="millis"){let[n,s]=await I(this.update.bind(this,e,r),o)();return {data:s,time:Number(n)}}async deleteWithPerformance(e="millis"){let[r,o]=await I(this.delete.bind(this),e)();return {data:o,time:Number(r)}}async truncateWithPerformance(e="millis"){let[r,o]=await I(this.truncate.bind(this),e)();return {data:o,time:Number(r)}}};var ar=class extends Ue{constructor(t,e){super(t,e);}many(){return this}insert(...t){let[e,r]=t,o=Object.fromEntries(Object.keys(e).map(n=>[n,e[n]]));return this.insertNode=new Q(this.fromNode,[o],r?.returning),this}insertMany(...t){let[e,r]=t;if(!e.length)return this;let o=e.map(n=>Object.fromEntries(Object.keys(n).map(s=>[s,n[s]])));return this.insertNode=new Q(this.fromNode,o,r?.returning),this}update(...t){let[e]=t;return this.updateNode=new H(this.fromNode,Object.keys(e),Object.values(e)),this}delete(...t){let[e]=t;return e?.ignoreBeforeDeleteHook||this.model.beforeDelete?.(this),this.deleteNode=new ue(this.fromNode),this}truncate(){return this.truncateNode=new me(this.fromNode),this}softDelete(...t){let[e]=t,{column:r="deletedAt",value:o=ne()}=e||{};return this.updateNode=new H(this.fromNode,[r],[o]),this}};var tt=class{constructor(t,e){this.model=t,this.modelInstance=Ps(),this.sqlDataSource=e,this.logs=this.sqlDataSource.logs,this.sqlType=this.sqlDataSource.getDbType(),this.astParser=new N(this.model,this.sqlType),this.interpreterUtils=new y(this.model);}async find(t){if(!t)return this.query().many();let e=this.query();return t.select&&e.select(...t.select),t.relations&&t.relations.forEach(r=>{e.load(r);}),t.where&&Object.entries(t.where).forEach(([r,o])=>{if(Array.isArray(o)){e.whereIn(r,o);return}e.where(r,o);}),t.orderBy&&Object.entries(t.orderBy).forEach(([r,o])=>{e.orderBy(r,o);}),t.limit&&e.limit(t.limit),t.offset&&e.offset(t.offset),t.groupBy&&e.groupBy(...t.groupBy),e.many({ignoreHooks:t.ignoreHooks||[]})}async findOne(t){let e=await this.find({groupBy:t.groupBy,orderBy:t.orderBy,relations:t.relations,select:t.select,where:t.where,ignoreHooks:t.ignoreHooks,offset:t.offset,limit:1});return e.length?e[0]:null}async findOneOrFail(t){let e=await this.findOne({groupBy:t.groupBy,orderBy:t.orderBy,relations:t.relations,select:t.select,where:t.where,ignoreHooks:t.ignoreHooks,offset:t.offset});if(e===null)throw t.customError?t.customError:new f(this.model.name+"::findOneOrFail","ROW_NOT_FOUND");return e}async findOneByPrimaryKey(t,e){if(!this.model.primaryKey)throw new f(this.model.name+"::findOneByPrimaryKey","MODEL_HAS_NO_PRIMARY_KEY");return this.query().select(...e||[]).where(this.model.primaryKey,t).one({ignoreHooks:["afterFetch","beforeFetch"]})}async insert(t,e={}){!e.ignoreHooks&&await this.model.beforeInsert?.(t);let{columns:r,values:o}=await this.interpreterUtils.prepareColumns(Object.keys(t),Object.values(t),"insert"),n={};r.forEach((c,m)=>{let p=o[m];n[c]=p,t[c]??(t[c]=p);});let{sql:s,bindings:a}=this.astParser.parse([new Q(new v(this.model.table),[n],e.returning)]),l=await U(s,a,this.sqlDataSource,"raw",{sqlLiteOptions:{typeofModel:this.model,mode:"insertOne",models:[t]}});if(this.sqlType==="mysql"||this.sqlType==="mariadb")return this.handleMysqlInsert(l,[t],"one",e.returning);let d=l[0];return d?(await this.model.afterFetch?.([d]),await se([d],this.model)):t}async insertMany(t,e={}){let r=[];await this.model.beforeInsertMany?.(t);for(let d of t){let{columns:u,values:c}=await this.interpreterUtils.prepareColumns(Object.keys(d),Object.values(d),"insert"),m={};u.forEach((p,h)=>{let g=c[h];m[p]=g,d[p]??(d[p]=g);}),r.push(m);}let{sql:o,bindings:n}=this.astParser.parse([new Q(new v(this.model.table),r,e.returning)]),s=await U(o,n,this.sqlDataSource,"raw",{sqlLiteOptions:{typeofModel:this.model,mode:"insertMany",models:t}});if(this.sqlType==="mysql"||this.sqlType==="mariadb")return await this.handleMysqlInsert(s,t,"many",e.returning)||[];let a=s;return a.length?(await this.model.afterFetch?.(a),await se(a,this.model)||[]):[]}async upsertMany(t,e,r,o={updateOnConflict:true}){let n=[];await this.model.beforeInsertMany?.(r),await Promise.all(r.map(async d=>{let{columns:u,values:c}=await this.interpreterUtils.prepareColumns(Object.keys(d),Object.values(d),"insert"),m=Object.fromEntries(u.map((p,h)=>[p,c[h]]));n.push(m);}));let{sql:s,bindings:a}=this.astParser.parse([new Q(new v(this.model.table),n,void 0,true),new X(this.model.table,t,e,o.updateOnConflict??true?"update":"ignore",o.returning)]);return await U(s,a,this.sqlDataSource,"raw",{sqlLiteOptions:{typeofModel:this.model,mode:"raw",models:r}})}async updateRecord(t,e){let{columns:r,values:o}=await this.interpreterUtils.prepareColumns(Object.keys(t),Object.values(t),"update"),{primaryKey:n}=this.model;if(!n)throw new f(this.model.name+"::updateRecord","MODEL_HAS_NO_PRIMARY_KEY");r=r.filter(d=>d!==n),o=o.filter(d=>d!==t[n]);let{sql:s,bindings:a}=this.astParser.parse([new H(new v(this.model.table),r,o),new R(n,"and",false,"=",t[n])]);await U(s,a,this.sqlDataSource,"raw");let l=await this.findOneByPrimaryKey(t[this.model.primaryKey],e?.returning??void 0);if(!l)throw new f(this.model.name+"::updateRecord","ROW_NOT_FOUND");return l}async deleteRecord(t){if(!this.model.primaryKey)throw new f(this.model.name+"::deleteRecord","MODEL_HAS_NO_PRIMARY_KEY");let e=new R(this.model.primaryKey,"and",false,"=",t[this.model.primaryKey]),{sql:r,bindings:o}=this.astParser.parse([new ue(new v(this.model.table)),e]);await U(r,o,this.sqlDataSource,"raw");}query(){return new Ue(this.model,this.sqlDataSource)}dryQuery(){return new ar(this.model,this.sqlDataSource)}async handleMysqlInsert(t,e,r,o){if(!this.model.primaryKey){if(r==="one"){let a=e.length?e[0]:null;return a?await se([a],this.model):null}return await se(e,this.model)}if(this.model.primaryKey&&e[0][this.model.primaryKey]){let a=e.map(u=>u[this.model.primaryKey]),l=a.map(u=>`'${u}'`).join(","),d=await this.query().select(...o??"*").whereIn(this.model.primaryKey,a).orderByRaw(`FIELD(${this.model.primaryKey}, ${l})`).many();return r==="one"?d.length?d[0]:null:d}let n=Array.from({length:t.affectedRows},(a,l)=>l+t.insertId),s=await this.query().select(...o||"*").whereIn(this.model.primaryKey,n).many();return r==="one"?s.length?s[0]:null:s}};var rt=class extends _{constructor(t,e){super(t,e);}many(){return this}insert(...t){let[e,r]=t,o=Object.fromEntries(Object.keys(e).map(n=>[n,e[n]]));return this.insertNode=new Q(this.fromNode,[o],r),this}insertMany(...t){let[e,r]=t;if(!e.length)return this;let o=e.map(n=>Object.fromEntries(Object.keys(n).map(s=>[s,n[s]])));return this.insertNode=new Q(this.fromNode,o,r),this}upsert(...t){let[e,r,o]=t,n=Object.keys(e),s=Object.keys(r);return this.insertNode=new Q(new v(this.model.table),[e],void 0,true),this.onDuplicateNode=new X(this.model.table,s,n,o?.updateOnConflict??true?"update":"ignore",o?.returning),this}upsertMany(...t){let[e,r,o,n]=t,s=o.map(a=>Object.fromEntries(Object.keys(a).map(l=>[l,a[l]])));return this.insertNode=new Q(new v(this.model.table),s,void 0,true),this.onDuplicateNode=new X(this.model.table,e,r,n?.updateOnConflict??true?"update":"ignore",n?.returning),this}update(t){return this.updateNode=new H(this.fromNode,Object.keys(t),Object.values(t)),this}delete(){return this.deleteNode=new ue(this.fromNode),this}truncate(){return this.truncateNode=new me(this.fromNode),this}softDelete(t={}){let{column:e="deletedAt",value:r=ne()}=t||{};return this.updateNode=new H(this.fromNode,[e],[r]),this}};var ot=(i,t)=>({table:i,modelCaseConvention:"preserve",databaseCaseConvention:t?.databaseCaseConvention??"preserve",softDeleteColumn:t?.softDeleteColumn??"deleted_at",softDeleteValue:t?.softDeleteValue??ne()});var nt=class i{constructor(t,e,r=false,o=0){this.connectionReleased=false;this.sql=t,this.isActive=false,this.transactionId=pe__default.default.randomBytes(16).toString("hex"),this.isolationLevel=e,this.isNested=r,this.nestingDepth=o;}async nestedTransaction(t){let e=new i(this.sql,this.isolationLevel,true,this.nestingDepth+1);if(await e.startTransaction(),t)try{await t(e),await e.commit();}catch(r){throw await e.rollback(),r}return e}async startTransaction(){let t=this.getIsolationLevelQuery();if(this.isNested){let e=this.getSavePointName();switch(this.sql.type){case "mysql":case "mariadb":case "postgres":case "cockroachdb":await this.sql.rawQuery(`SAVEPOINT ${e}`),this.isActive=true;return;case "sqlite":await this.sql.rawQuery(`SAVEPOINT ${e}`),this.isActive=true;return}}switch(this.sql.type){case "mysql":case "mariadb":t&&await this.sql.rawQuery(t),await this.sql.sqlConnection.beginTransaction(),this.isActive=true;break;case "postgres":case "cockroachdb":await this.sql.rawQuery("BEGIN TRANSACTION"),t&&await this.sql.rawQuery(t),this.isActive=true;break;case "sqlite":t&&await this.sql.rawQuery(t),await this.sql.rawQuery("BEGIN TRANSACTION"),this.isActive=true;break}}async commit(t){if(!this.isActive){if(t?.throwErrorOnInactiveTransaction)throw new f("TRANSACTION::commit","TRANSACTION_NOT_ACTIVE");b.warn("Transaction::commit - TRANSACTION_NOT_ACTIVE");return}try{if(this.isNested){let e=this.getSavePointName();switch(this.sql.type){case "mysql":case "mariadb":case "postgres":case "cockroachdb":case "sqlite":await this.sql.rawQuery(`RELEASE SAVEPOINT ${e}`);break}this.isActive=!1;return}switch(this.sql.type){case "mysql":case "mariadb":await this.sql.sqlConnection.commit();break;case "postgres":case "cockroachdb":await this.sql.rawQuery("COMMIT");break;case "sqlite":await this.sql.rawQuery("COMMIT");break}}catch(e){throw b.error(e),e}await this.releaseConnection(),this.isActive=false;}async rollback(t){if(!this.isActive){if(t?.throwErrorOnInactiveTransaction)throw new f("TRANSACTION::rollback","TRANSACTION_NOT_ACTIVE");b.warn("Transaction::rollback - TRANSACTION_NOT_ACTIVE");return}try{if(this.isNested){let e=this.getSavePointName();switch(this.sql.type){case "mysql":case "mariadb":case "postgres":case "cockroachdb":await this.sql.rawQuery(`ROLLBACK TO SAVEPOINT ${e}`);break;case "sqlite":await this.sql.rawQuery(`ROLLBACK TO ${e}`);break;default:throw new f("TRANSACTION::rollback",`UNSUPPORTED_DATABASE_TYPE_${this.sql.type}`)}this.isActive=!1;return}switch(this.sql.type){case "mysql":case "mariadb":await this.sql.sqlConnection.rollback();break;case "postgres":case "cockroachdb":await this.sql.rawQuery("ROLLBACK");break;case "sqlite":await this.sql.rawQuery("ROLLBACK");break;default:throw new f("TRANSACTION::rollback",`UNSUPPORTED_DATABASE_TYPE_${this.sql.type}`)}}catch(e){throw b.error(e),e}await this.releaseConnection(),this.isActive=false;}async releaseConnection(){if(!this.connectionReleased){try{switch(this.sql.type){case "mysql":case "mariadb":this.sql.sqlConnection.release();break;case "postgres":case "cockroachdb":this.sql.sqlConnection.release();break;case "sqlite":break;default:throw new f("TRANSACTION::releaseConnection",`UNSUPPORTED_DATABASE_TYPE_${this.sql.type}`)}}catch(t){b.error(t);}await this.sql.closeConnection(),this.sql.sqlConnection=null,this.connectionReleased=true;}}getIsolationLevelQuery(){if(!this.isolationLevel)return "";if(this.sql.type==="sqlite"&&this.isolationLevel!=="SERIALIZABLE")throw new f("TRANSACTION::getIsolationLevelQuery","SQLITE_ONLY_SUPPORTS_SERIALIZABLE_ISOLATION_LEVEL");if(this.sql.type==="mysql"||this.sql.type==="mariadb")return `SET TRANSACTION ISOLATION LEVEL ${this.isolationLevel}`;if(this.sql.type==="postgres"||this.sql.type==="cockroachdb")return `SET TRANSACTION ISOLATION LEVEL ${this.isolationLevel}`;if(this.sql.type==="sqlite")return "";throw new f("TRANSACTION::getIsolationLevelQuery",`UNSUPPORTED_DATABASE_TYPE_${this.sql.type}`)}getSavePointName(){let t=this.transactionId.slice(0,8).toUpperCase();return `sp_${this.nestingDepth}_${t}`}};var ee=class ee extends ht{constructor(e){super(e);this.globalTransaction=null;this.models={};this.ownsPool=false;this.sqlConnection=null;this.sqlType=this.type,this.inputDetails=e||{connectionPolicies:{retry:{maxRetries:0,delay:0}},queryFormatOptions:{language:gt(this.sqlType),keywordCase:"lower",dataTypeCase:"lower",functionCase:"lower"}},this.inputDetails.connectionPolicies=e?.connectionPolicies||{retry:{maxRetries:0,delay:0}},this.inputDetails.queryFormatOptions=e?.queryFormatOptions||{language:gt(this.sqlType),keywordCase:"lower",dataTypeCase:"lower",functionCase:"lower"};}static async connect(e,r){typeof e=="function"&&(r=e,e=void 0);let o=new ee(e);if(e?.models){let n=o.sanitizeModelKeys(e?.models||{});Object.assign(o,n);}return o.models=e?.models||{},o.sqlPool=await Ce(o.sqlType,{type:o.sqlType,host:o.host,port:o.port,username:o.username,password:o.password,database:o.database,connectionPolicies:o.inputDetails.connectionPolicies,queryFormatOptions:o.inputDetails.queryFormatOptions,driverOptions:o.inputDetails.driverOptions,logs:o.logs,models:o.models}),o.ownsPool=true,await o.testConnectionQuery("SELECT 1"),ee.instance=o,await r?.(o),o}static async connectToSecondarySource(e,r){typeof e=="function"&&(r=e,e=void 0);let o=new ee(e);if(e?.models){let n=o.sanitizeModelKeys(e.models);Object.assign(o,n);}return o.models=e?.models||{},o.sqlPool=await Ce(o.sqlType,{type:o.sqlType,host:o.host,port:o.port,username:o.username,password:o.password,database:o.database,connectionPolicies:o.inputDetails.connectionPolicies,queryFormatOptions:o.inputDetails.queryFormatOptions,driverOptions:o.inputDetails.driverOptions,logs:o.logs,models:o.models}),o.ownsPool=true,await o.testConnectionQuery("SELECT 1"),ee.instance=o,await r?.(o),o}static async useConnection(e,r){let o=new ee(e);if(e.models){let n=o.sanitizeModelKeys(e.models);Object.assign(o,n);}o.models=e.models||{},o.sqlPool=await Ce(o.sqlType,{type:o.sqlType,host:o.host,port:o.port,username:o.username,password:o.password,database:o.database,connectionPolicies:o.inputDetails.connectionPolicies,queryFormatOptions:o.inputDetails.queryFormatOptions,driverOptions:o.inputDetails.driverOptions,logs:o.logs,models:e.models}),o.ownsPool=true,await o.testConnectionQuery("SELECT 1");try{await r(o).then(async()=>{o.isConnected&&await o.closeConnection();});}catch(n){throw o.isConnected&&await o.closeConnection(),n}}static getInstance(){if(!ee.instance)throw new f("SqlDataSource::getInstance","CONNECTION_NOT_ESTABLISHED");return ee.instance}static query(e,r){let o=this.getInstance(),n=o.isInGlobalTransaction&&o.globalTransaction?.isActive?o.globalTransaction.sql:o,s=new _(ot(e,r),n);return r?.alias&&s.from(e,r.alias),s}static dryQuery(e,r){let o=this.getInstance(),n=o.isInGlobalTransaction&&o.globalTransaction?.isActive?o.globalTransaction.sql:o,s=new rt(ot(e,r),n);return r?.alias&&s.from(e,r.alias),s}static createTable(...e){return this.getInstance().createTable(...e)}static alterTable(...e){return this.getInstance().alterTable(...e)}static async startGlobalTransaction(e){return this.getInstance().startGlobalTransaction(e)}static async commitGlobalTransaction(){await this.getInstance().commitGlobalTransaction();}static async rollbackGlobalTransaction(){await this.getInstance().rollbackGlobalTransaction();}static async startTransaction(e,r){return this.getInstance().startTransaction(e,r)}static async transaction(e,r){let o=typeof e=="function"?r:e;return this.getInstance().startTransaction(e,o)}static async getTableSchema(e){return this.getInstance().getTableSchema(e)}static async closeConnection(){if(!this.instance){b.warn("Connection already closed");return}await this.instance.closeConnection(),this.instance=null;}static async disconnect(){return this.closeConnection()}static async rawQuery(e,r=[]){let o=this.getInstance();return (o.isInGlobalTransaction&&o.globalTransaction?.isActive?o.globalTransaction.sql:o).rawQuery(e,r)}static rawStatement(e){return this.getInstance().rawStatement(e)}get isConnected(){return !!this.sqlPool||!!this.sqlConnection}async clone(e){let r=new ee(this.inputDetails);if(r.sqlType==="sqlite"||!!e?.shouldRecreatePool){if(r.sqlPool=await Ce(r.sqlType,{type:r.sqlType,host:r.host,port:r.port,username:r.username,password:r.password,database:r.database,connectionPolicies:r.inputDetails.connectionPolicies,queryFormatOptions:r.inputDetails.queryFormatOptions,driverOptions:r.inputDetails.driverOptions,logs:r.logs,models:r.models}),r.ownsPool=true,Object.keys(this.models).length){let n=r.sanitizeModelKeys(this.models);Object.assign(r,n);}return r}if(r.sqlPool=this.sqlPool,r.ownsPool=false,Object.keys(this.models).length){let n=r.sanitizeModelKeys(this.models);Object.assign(r,n);}return r}getDbType(){return this.type}query(e,r){let o=this.isInGlobalTransaction&&this.globalTransaction?.isActive?this.globalTransaction.sql:this,n=new _(ot(e,r),o);return r?.alias&&n.from(e,r.alias),n}dryQuery(e,r){return new rt(ot(e,r),this)}alterTable(...e){let r=new he(this.getDbType());return r.alterTable(...e),r.queryStatements}createTable(...e){let r=new he(this.getDbType());return r.createTable(...e),r.queryStatements[0]||""}async startGlobalTransaction(e){let r=await this.clone();return r.sqlConnection=await r.getConnection(),this.globalTransaction=new nt(r,e?.isolationLevel),await this.globalTransaction.startTransaction(),this.globalTransaction}async commitGlobalTransaction(e){if(!this.globalTransaction)throw new f("SqlDataSource::commitGlobalTransaction","GLOBAL_TRANSACTION_NOT_STARTED");await this.globalTransaction.commit({throwErrorOnInactiveTransaction:e?.throwErrorOnInactiveTransaction}),this.globalTransaction=null;}async rollbackGlobalTransaction(e){if(!this.globalTransaction){b.warn("SqlDataSource::rollbackGlobalTransaction - GLOBAL_TRANSACTION_NOT_STARTED");return}await this.globalTransaction.rollback({throwErrorOnInactiveTransaction:e?.throwErrorOnInactiveTransaction}),this.globalTransaction=null;}async startTransaction(e,r){let o=typeof e=="function"?r:e;if(this.globalTransaction?.isActive){if(typeof e=="function")try{await this.globalTransaction.nestedTransaction(e);return}catch(l){throw l}return await this.globalTransaction.nestedTransaction()}let n=await this.clone();n.sqlConnection=await n.getConnection();let s=new nt(n,o?.isolationLevel);if(await s.startTransaction(),typeof e=="function")try{await e(s),await s.commit({throwErrorOnInactiveTransaction:!1});return}catch(a){throw await s.rollback({throwErrorOnInactiveTransaction:false}),a}return s}async transaction(e,r){return this.startTransaction(e,r)}getModelManager(e){if(!this.isConnected)throw new f("SqlDataSource::getModelManager","CONNECTION_NOT_ESTABLISHED");return this.globalTransaction?.isActive?new tt(e,this.globalTransaction.sql):new tt(e,this)}getPool(e=this.sqlType){if(!this.sqlPool)throw new f("SqlDataSource::getPool","CONNECTION_NOT_ESTABLISHED");return this.sqlPool}async getConnection(e=this.sqlType){if(this.sqlConnection)return this.sqlConnection;if(!this.sqlPool)throw new f("SqlDataSource::getConnection","CONNECTION_NOT_ESTABLISHED");switch(this.sqlType){case "mysql":case "mariadb":return await this.sqlPool.getConnection();case "postgres":case "cockroachdb":return await this.sqlPool.connect();case "sqlite":return this.sqlPool;default:throw new f("SqlDataSource::getConnection",`UNSUPPORTED_DATABASE_TYPE_${this.sqlType}`)}}async closeConnection(){if(!this.isConnected){Fe("Connection already closed or not established",this.logs);return}if(!this.ownsPool){this.sqlConnection=null;return}try{this.globalTransaction?.isActive&&await this.rollbackGlobalTransaction({throwErrorOnInactiveTransaction:!1});}catch{b.warn("SqlDataSource::closeConnection - Error while rolling back global transaction");}switch(Fe("Closing connection",this.logs),this.type){case "mysql":case "mariadb":await this.sqlPool.end();break;case "postgres":case "cockroachdb":await this.sqlPool.end();break;case "sqlite":await new Promise((e,r)=>{this.sqlPool.close(o=>{o&&r(o),e();});});break;default:throw new f("SqlDataSource::closeConnection",`UNSUPPORTED_DATABASE_TYPE_${this.type}`)}this.sqlPool=null,this.sqlConnection=null;}getConnectionDetails(){return {type:this.getDbType(),host:this.host,port:this.port,username:this.username,password:this.password,database:this.database,connectionPolicies:this.inputDetails.connectionPolicies,queryFormatOptions:this.inputDetails.queryFormatOptions}}async disconnect(){return this.closeConnection()}async syncSchema(e){if(e=e||{transactional:false},this.sqlType==="sqlite"){b.warn("Syncing schema with SQLite is not supported, skipping...");return}let o=(await Ke.makeDiff(this)).getSqlStatements();if(!o.length){b.info("No new changes detected between database schema and models metadata");return}if(b.info(`Generated ${o.length} SQL statements to sync schema`),!e?.transactional){for(let n of o)await this.rawQuery(n);b.info(`Synced schema with ${o.length} SQL statements`);return}await this.transaction(async n=>{for(let s of o)await n.sql.rawQuery(s);}),b.info(`Synced schema with ${o.length} SQL statements`);}async rawQuery(e,r=[]){if(!this.isConnected)throw new f("SqlDataSource::rawQuery","CONNECTION_NOT_ESTABLISHED");let o=Tt(this,e);return U(o,r,this,"raw")}rawStatement(e){return new ae(e)}async getTableSchema(e){let[r,o,n,s]=await Promise.all([this.getTableInfo(e),this.getIndexInfo(e),this.getForeignKeyInfo(e),this.getPrimaryKeyInfo(e)]);return {columns:r,indexes:o,foreignKeys:n,primaryKey:s}}getModelOpenApiSchema(){return fs(Object.values(this.models))}async getTableInfo(e){let o=new N({table:e,databaseCaseConvention:"preserve",modelCaseConvention:"preserve"},this.getDbType()).parse([new Ot(e)]).sql,n=[];try{n=await this.rawQuery(o);}catch(a){if(Ve(this.getDbType(),a))return [];throw a}let s=this.getDbType();return s==="sqlite"?n.map(a=>{let l=String(a.type||"").toLowerCase(),d=qe(s,l);return {name:a.name,dataType:d,isNullable:a.notnull===0,defaultValue:a.dflt_value??null,withTimezone:null}}):n.map(a=>{let l=String(a.column_name||a.COLUMN_NAME||a.name||""),d=String(a.data_type||a.DATA_TYPE||a.type||"").toLowerCase(),u=qe(s,d),c=a.is_nullable!==void 0?a.is_nullable:a.IS_NULLABLE!==void 0?a.IS_NULLABLE:void 0,m=typeof c=="string"?c.toLowerCase()!=="no":typeof c=="boolean"?c:a.notnull!==void 0?a.notnull===0:true,p=a.column_default??a.COLUMN_DEFAULT??a.defaultValue??a.dflt_value??null,h=a.char_length!=null?Number(a.char_length):null,g=a.numeric_precision!=null?Number(a.numeric_precision):null,w=a.numeric_scale!=null?Number(a.numeric_scale):null,C=a.timezone!=null?!!a.timezone:typeof a.datetime_precision=="number"?/with time zone/.test(String(a.column_type||a.udt_name||"").toLowerCase()):/with time zone/.test(String(a.column_type||a.udt_name||"").toLowerCase());return {name:l,dataType:u,isNullable:m,defaultValue:p,length:h,precision:g,scale:w,withTimezone:C}})}async getIndexInfo(e){let o=new N({table:e,databaseCaseConvention:"preserve",modelCaseConvention:"preserve"},this.getDbType()).parse([new Dt(e)]).sql,n=this.getDbType(),s=[];try{s=await this.rawQuery(o);}catch(l){if(Ve(this.getDbType(),l))return [];throw l}if(n==="mysql"||n==="mariadb"){let l=new Map;for(let d of s){let u=d.Key_name,c=d.Non_unique===0,m=l.get(u)||{name:u,columns:[],isUnique:c};m.columns.push(d.Column_name),l.set(u,m);}return Array.from(l.values())}if(n==="postgres"||n==="cockroachdb"){let l=new Map;for(let d of s){let u=d.index_name,c=!!d.is_unique,m=l.get(u)||{name:u,columns:[],isUnique:c};m.columns.push(d.column_name),l.set(u,m);}return Array.from(l.values())}let a=[];for(let l of s){let d=l.name,u=!!l.unique,m=(await this.rawQuery(`PRAGMA index_info(${d})`)).map(p=>p.name);a.push({name:d,columns:m,isUnique:u});}return a}async getForeignKeyInfo(e){let o=new N({table:e,databaseCaseConvention:"preserve",modelCaseConvention:"preserve"},this.getDbType()).parse([new At(e)]).sql,n=[];try{n=await this.rawQuery(o);}catch(l){if(Ve(this.getDbType(),l))return [];throw l}if(this.getDbType()==="sqlite"){let l=new Map;for(let d of n){let u=Number(d.id),c=l.get(u)||{name:void 0,columns:[],referencedTable:String(d.table),referencedColumns:[],onDelete:d.on_delete??null,onUpdate:d.on_update??null};c.columns.push(String(d.from)),c.referencedColumns.push(String(d.to)),l.set(u,c);}return Array.from(l.values())}let a=new Map;for(let l of n){let d=String(l.name||""),u=d||`${l.referenced_table}_${l.column_name}`,c=a.get(u)||{name:d||void 0,columns:[],referencedTable:String(l.referenced_table),referencedColumns:[],onDelete:l.on_delete??null,onUpdate:l.on_update??null};c.columns.push(String(l.column_name)),c.referencedColumns.push(String(l.referenced_column)),a.set(u,c);}return Array.from(a.values())}async getPrimaryKeyInfo(e){let o=new N({table:e,databaseCaseConvention:"preserve",modelCaseConvention:"preserve"},this.getDbType()).parse([new Pt(e)]).sql,n=[];try{n=await this.rawQuery(o);}catch(l){if(Ve(this.getDbType(),l))return;throw l}if(!n.length)return;let s=n.map(l=>String(l.column_name));return {name:n[0].name||void 0,columns:s}}async testConnectionQuery(e){await U(e,[],this,"raw",{shouldNotLog:true});}sanitizeModelKeys(e){let r=Object.getOwnPropertyNames(this),o=Object.getOwnPropertyNames(this.constructor),n=[...r,...o];if(Object.keys(e).some(s=>n.includes(s)))throw new f("SqlDataSource::sanitizeModelKeys","DUPLICATE_MODEL_KEYS_WHILE_INSTANTIATING_MODELS",new Error(`Duplicate model keys while instantiating models inside the connection: ${Object.keys(e).filter(s=>n.includes(s)).map(s=>`"${s}"`).join(", ")}`));return e}static get isInGlobalTransaction(){return !!this.instance?.globalTransaction}get isInGlobalTransaction(){return !!this.globalTransaction}get registeredModels(){return this.models}};ee.instance=null;var Ne=ee;var be=class{constructor(t){this.migrationTable="migrations";this.sql=t||Ne.getInstance();}async upMigrations(t){for(let e of t){b.info(`Running migration ${e.migrationName}`),await e.up();let r=e.schema.queryStatements;for(let o of r)o&&await this.sql.rawQuery(o);await this.addMigrationToMigrationTable(e),e.afterMigration&&await e.afterMigration(this.sql);}}async downMigrations(t){t=t.reverse();for(let e of t){b.info(`Rolling back migration ${e.migrationName}`),await e.down();let r=e.schema.queryStatements;for(let o of r)o&&await this.sql.rawQuery(o);await this.deleteMigrationFromMigrationTable(e),e.afterMigration&&await e.afterMigration(this.sql);}}async addMigrationToMigrationTable(t){let r=new Date().toISOString().replace("T"," ").replace(/\.\d{3}Z$/,"");await this.sql.query(this.migrationTable).insert({name:t.migrationName,timestamp:r});}async deleteMigrationFromMigrationTable(t){await this.sql.query(this.migrationTable).where("name",t.migrationName).delete();}};async function st(i,t,e,r,o){let n=i.getDbType(),s=null;b.info("Rolling back migrations for database type: "+n);try{let a=await yt(n,i.getPool()),l=await ft(n,e,r),d=a.map(m=>m.name),u=l.filter(m=>d.includes(m.migrationName));if(u.length===0){b.info("No pending migrations.");return}if(t){let m=u.findIndex(g=>g.migrationName===t);if(m===-1){b.error(`Rollback until migration not found: ${t}`);return}let p=u.slice(m);o&&(s=await i.startTransaction(),i=s.sql),await new be(i).downMigrations(p),o&&await s?.commit(),b.info("Migrations rolled back successfully");return}let c=new be(i);o&&(s=await i.startTransaction(),i=s.sql),await c.downMigrations(u),o&&await s?.commit();}catch(a){throw o&&await s?.rollback(),a}b.info("Migrations rolled back successfully");}var lr=class{static async generate(t){return `import { Migration } from "hysteria-orm";
|
|
183
|
+
ORDER BY pk`,bindings:[]}}},ll=new Hn;var Yn=class{toSql(t){return {sql:`PRAGMA table_info(${t.table})`,bindings:[]}}},dl=new Yn;var Jn=class{toSql(t){let e=t;if(e.isRawValue)return {sql:e.column,bindings:[]};let r=this.formatColumn(e.column,e.sqlFunction),o=this.formatAlias(e.alias);return {sql:`${r.sql}${o}`,bindings:r.bindings}}formatColumn(t,e){if(typeof t=="string"){let o=new y(this.model).formatStringColumn("sqlite",t),n=o;return e&&(n=`${e.toLowerCase()}(${o})`),{sql:n,bindings:[]}}if(Array.isArray(t)&&t.length>0){let n=new N(this.model,"sqlite").parse(t),s=`(${n.sql})`;return e&&(s=`${e.toLowerCase()}${s}`),{sql:s,bindings:n.bindings}}if(!Array.isArray(t)){let n=new N(this.model,"sqlite").parse([t]),s=`(${n.sql})`;return e&&(s=`${e.toLowerCase()}${s}`),{sql:s,bindings:n.bindings}}return {sql:t.map(o=>{if(typeof o=="string"){let l=new y(this.model).formatStringColumn("sqlite",o);return e?`${e.toLowerCase()}(${l})`:l}let a=`(${new N(this.model,"sqlite").parse([o]).sql})`;return e&&(a=`${e.toLowerCase()}${a}`),a}).join(", "),bindings:[]}}formatAlias(t){return t&&t.length>0?` as "${t}"`:""}},ml=new Jn;var zn=class{toSql(t){let e=t;if(e.isRawValue&&typeof e.fromNode=="string")return e.keyword="",{sql:e.fromNode,bindings:[]};let r=new y(this.model).getFromForWriteOperations("sqlite",e.fromNode);return e.keyword="DELETE FROM",{sql:r,bindings:[]}}},ul=new zn;var Gn=class{toSql(t){let e=t,r=new N(this.model,"sqlite"),o=Array.isArray(e.query)?e.query:[e.query],n=typeof e.query=="string"?{sql:e.query,bindings:[]}:r.parse(o.filter(Boolean),e.currParamIndex);return {sql:n.sql,bindings:n.bindings}}},cl=new Gn;var Zn=class{toSql(t){let e=t;if(e.isRawValue&&typeof e.fromNode=="string")return {sql:e.fromNode,bindings:e.values};let r=new y(this.model),o=r.getFromForWriteOperations("sqlite",e.fromNode);if(!e.columns.length||!e.values.length)return {sql:o,bindings:[]};let n=[],s=e.columns.map((a,l)=>{let d=e.values[l];return d instanceof ae?`${r.formatStringColumn("sqlite",a)} = ${d.rawValue}`:(n.push(d),`${r.formatStringColumn("sqlite",a)} = ?`)}).join(", ");return {sql:`${o} set ${s}`,bindings:n}}},pl=new Zn;var Xn=class{toSql(t){let e=t;if(e.isRawValue)return {sql:e.column,bindings:e.value??[]};let r="",o=[];if(this.isRawNode(e.value)){let n=this.formatRawIdentifierIfPossible(e.value.rawValue);r=`${new y(this.model).formatStringColumn("sqlite",e.column)} ${e.operator} ${n}`,o=[];}else if(Array.isArray(e.value))if(e.operator.toLowerCase()==="between")r=`${new y(this.model).formatStringColumn("sqlite",e.column)} between ? AND ?`,o=e.value;else {let n=e.value.map(s=>"?").join(", ");r=`${new y(this.model).formatStringColumn("sqlite",e.column)} ${e.operator} (${n})`,o=e.value;}else if(e.operator.includes("null"))r=`${new y(this.model).formatStringColumn("sqlite",e.column)} ${e.operator}`,o=[];else {if(e.value===void 0)return {sql:"",bindings:[]};r=`${new y(this.model).formatStringColumn("sqlite",e.column)} ${e.operator} ?`,o=[e.value];}return e.isNegated&&(r=`not (${r})`),{sql:r.trim(),bindings:o}}isRawNode(t){return t&&typeof t=="object"&&"rawValue"in t&&t.isRawValue===true}formatRawIdentifierIfPossible(t){return /^[A-Za-z_][A-Za-z0-9_]*(\.(\*|[A-Za-z_][A-Za-z0-9_]*))?$/.test(t)?new y(this.model).formatStringColumn("sqlite",t):t}},yl=new Xn;var es=class{toSql(t){let e=t;if(!e.nodes||e.nodes.length===0)return {sql:"",bindings:[]};let r=new N(this.model,"sqlite"),{sql:o,bindings:n}=r.parse(e.nodes,e.currParamIndex,true);return {sql:`(${o})`,bindings:n}}},fl=new es;var ts=class{toSql(t){let e=t;if(e.isRawValue)return {sql:e.column,bindings:[]};let r="",o=[],n=new y(this.model).formatStringColumn("sqlite",e.column);switch(e.jsonOperator){case "=":r=`json(${n}) = json(?)`,o=[JSON.stringify(e.value)];break;case "contains":r=`json(${n}) = json(?)`,o=[JSON.stringify(e.value)];break;case "not contains":r=`json(${n}) = json(?)`,o=[JSON.stringify(e.value)];break;case "raw":r=e.column,o=Array.isArray(e.value)?e.value:[];break}return e.isNegated&&(r=`NOT (${r})`),{sql:r.trim(),bindings:o}}},hl=new ts;var rs=class{toSql(t){let e=t;return this.isStringSubquery(e.subquery)?this.handleStringSubquery(e):this.isArraySubquery(e.subquery)?this.handleArraySubquery(e):this.handleObjectSubquery(e)}isStringSubquery(t){return typeof t=="string"}isArraySubquery(t){return Array.isArray(t)}handleStringSubquery(t){return {sql:`${t.column} ${t.operator} (${t.subquery})`.trim(),bindings:[]}}handleArraySubquery(t){let e=new N(this.model,"sqlite"),{sql:r,bindings:o}=e.parse(t.subquery,t.currParamIndex);return {sql:`${t.column} ${t.operator} (${r})`.trim(),bindings:o}}handleObjectSubquery(t){let e=new N(this.model,"sqlite"),{sql:r,bindings:o}=e.parse([t.subquery],t.currParamIndex);return {sql:`${t.column} ${t.operator} (${r})`.trim(),bindings:o}}},gl=new rs;var os=class{toSql(t){let e=t,r=new N(this.model,"sqlite"),o=Array.isArray(e.body)?e.body:[e.body],n=r.parse(o.filter(Boolean),e.currParamIndex);return {sql:`${e.alias} as (${n.sql})`,bindings:n.bindings}}},Tl=new os;var bl={mysql:{alter_table:{add_column:bs,add_constraint:Ns,add_primary_key:Ss,alter_column_type:ws,alter_table:Ls,drop_column:Fs,drop_constraint:Ws,drop_default:js,drop_not_null:Vs,drop_primary_key:Hs,rename_column:Ys,rename_table:Js,set_default:zs,set_not_null:Gs},column:{column_type:Zs},constraint:{after:Xs,constraint:ei},create_table:{create_table:ti},delete:{delete:ri},distinct:{distinct:oi,distinct_on:ni},drop_table:{drop_table:si},from:{from:ii},group_by:{group_by:ai},having:{having:li},index_op:{create_index:di,drop_index:mi},insert:{insert:ui},join:{join:ci},limit:{limit:pi},lock:{lock:yi},offset:{offset:fi},on_duplicate:{on_duplicate:hi},order_by:{order_by:gi},raw:{raw:Ti},schema:{foreign_key_info:bi,index_info:Ni,primary_key_info:Si,table_info:wi},select:{select:Mi},truncate:{truncate:qi},union:{union:_i},update:{update:Ci},where:{where:Ri,where_group:xi,where_json:Ai,where_subquery:Di},with:{with:Pi}},postgres:{alter_table:{add_column:Oi,add_constraint:Ii,add_primary_key:vi,alter_column_type:Bi,alter_table:Ei,drop_column:$i,drop_constraint:Qi,drop_default:Ki,drop_not_null:ki,drop_primary_key:Ui,rename_column:Li,rename_table:Fi,set_default:Wi,set_not_null:ji},column:{column_type:Vi},constraint:{after:Hi,constraint:Yi},create_table:{create_table:Ji},delete:{delete:zi},distinct:{distinct:Gi,distinct_on:Zi},drop_table:{drop_table:Xi},from:{from:ea},group_by:{group_by:ta},having:{having:ra},index_op:{create_index:oa,drop_index:na},insert:{insert:sa},join:{join:ia},limit:{limit:aa},lock:{lock:la},offset:{offset:da},on_duplicate:{on_duplicate:ma},order_by:{order_by:ua},raw:{raw:ca},schema:{foreign_key_info:pa,index_info:ya,primary_key_info:fa,table_info:ha},select:{select:ga},truncate:{truncate:Ta},union:{union:ba},update:{update:Na},where:{where:Sa,where_group:wa,where_json:Ma,where_subquery:qa},with:{with:_a}},sqlite:{alter_table:{add_column:Ca,add_constraint:Ra,alter_column_type:xa,alter_table:Aa,drop_column:Da,drop_constraint:Pa,drop_default:Oa,drop_not_null:Ia,drop_primary_key:va,rename_column:Ba,rename_table:Ea,set_default:$a,set_not_null:Qa},column:{column_type:Ka},constraint:{after:ka,constraint:Ua},create_table:{create_table:La},delete:{delete:Fa},distinct:{distinct:Wa,distinct_on:ja},drop_table:{drop_table:Va},from:{from:Ha},group_by:{group_by:Ya},having:{having:Ja},index_op:{create_index:za,drop_index:Ga},insert:{insert:Za},join:{join:Xa},limit:{limit:el},lock:{lock:tl},offset:{offset:rl},on_duplicate:{on_duplicate:ol},order_by:{order_by:nl},raw:{raw:sl},schema:{foreign_key_info:il,index_info:al,primary_key_info:ll,table_info:dl},select:{select:ml},truncate:{truncate:ul},union:{union:cl},update:{update:pl},where:{where:yl,where_group:fl,where_json:hl,where_subquery:gl},with:{with:Tl}}};var N=class{constructor(t,e){this.dbType=e,this.model=t;}parse(t,e=1,r=false){if(!t.length)return {sql:"",bindings:[]};let o=t.find(c=>!!c&&c.folder==="distinctOn"),n=!o&&t.find(c=>!!c&&c.folder==="distinct"),s=t.filter(c=>c!==null&&c.folder!=="distinct"&&c.folder!=="distinctOn"),a=[],l=[],d=null;for(let c=0;c<s.length;c++){let m=s[c];m.currParamIndex=e+l.length;let p=bl[this.mapCommonDbType(this.dbType)][m.folder][m.file];if(!p)throw new Error(`Interpreter not found for ${this.dbType} ${m.keyword}`);p.model=this.model;let h=p.toSql(m);if(!h.sql||!h.sql.trim().length)continue;let g=s[c+1],C=!g||g.keyword!==m.keyword?"":g.chainsWith;if(m.folder==="lock"||m.folder==="on_duplicate"||m.folder==="schema"){a.push(`${h.sql}${C}`),l.push(...h.bindings),d=m.keyword;continue}if(d!==m.keyword||m.canKeywordBeSeenMultipleTimes){if(r)a.push(`${h.sql}${C}`);else {let P=m.keyword;if(m.folder==="with"){let j=c,z=false;for(;j<s.length&&s[j].keyword===m.keyword;){let L=s[j];if(L.folder==="with"&&L.clause==="recursive"){z=true;break}j++;}z&&(P=`${P} recursive`);}if(P==="select")if(o){let j=Array.isArray(o.columns)?o.columns.join(", "):"";a.push(`select distinct on (${j}) ${h.sql}${C}`);}else n?a.push(`select distinct ${h.sql}${C}`):a.push(`select ${h.sql}${C}`);else a.push(`${P} ${h.sql}${C}`);}d=m.keyword;}else a.push(`${h.sql}${C}`);l.push(...h.bindings);}return {sql:a.join(" "),bindings:l}}mapCommonDbType(t){switch(t){case "mariadb":return "mysql";case "cockroachdb":return "postgres";default:return t}}};var At=class extends T{constructor(e){super("schema");this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.folder="schema";this.file="foreign_key_info";this.table=e;}};var Dt=class extends T{constructor(e){super("schema");this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.folder="schema";this.file="index_info";this.table=e;}};var Pt=class extends T{constructor(e){super("schema");this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.folder="schema";this.file="primary_key_info";this.table=e;}};var Ot=class extends T{constructor(e){super("schema");this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.folder="schema";this.file="table_info";this.table=e;}};var It=class extends T{constructor(e){super("");this.chainsWith=",";this.canKeywordBeSeenMultipleTimes=true;this.folder="alter_table";this.file="add_column";this.column=e;}};var le=class extends T{constructor(e){super("");this.chainsWith=",";this.canKeywordBeSeenMultipleTimes=true;this.folder="alter_table";this.file="add_constraint";this.constraint=e;}};var Ee=class extends T{constructor(e){super("");this.chainsWith=",";this.canKeywordBeSeenMultipleTimes=false;this.folder="alter_table";this.file="add_primary_key";this.columns=e;}};var vt=class extends T{constructor(e,r,o={}){super("");this.chainsWith=",";this.canKeywordBeSeenMultipleTimes=true;this.folder="alter_table";this.file="alter_column_type";this.column=e,this.newType=r,this.options=o;}};var fe=class extends T{constructor(e,r=[],o=false){super("alter table");this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.folder="alter_table";this.file="alter_table";this.table=e,this.children=r,this.ifExists=o;}};var Bt=class extends T{constructor(e){super("");this.chainsWith=",";this.canKeywordBeSeenMultipleTimes=true;this.folder="alter_table";this.file="drop_column";this.column=e;}};var de=class extends T{constructor(e){super("");this.chainsWith=",";this.canKeywordBeSeenMultipleTimes=true;this.folder="alter_table";this.file="drop_constraint";this.constraintName=e;}};var Ye=class extends T{constructor(e){super("");this.chainsWith=",";this.canKeywordBeSeenMultipleTimes=true;this.folder="alter_table";this.file="drop_default";this.column=e;}};var Et=class extends T{constructor(e){super("");this.chainsWith=",";this.canKeywordBeSeenMultipleTimes=true;this.folder="alter_table";this.file="drop_not_null";this.column=e;}};var $e=class extends T{constructor(e){super("");this.chainsWith=",";this.canKeywordBeSeenMultipleTimes=false;this.folder="alter_table";this.file="drop_primary_key";this.table=e;}};var $t=class extends T{constructor(e,r){super("");this.chainsWith=",";this.canKeywordBeSeenMultipleTimes=true;this.folder="alter_table";this.file="rename_column";this.oldName=e,this.newName=r;}};var Qt=class extends T{constructor(e){super("rename to");this.chainsWith=",";this.canKeywordBeSeenMultipleTimes=false;this.folder="alter_table";this.file="rename_table";this.newName=e;}};var Je=class extends T{constructor(e,r){super("");this.chainsWith=",";this.canKeywordBeSeenMultipleTimes=true;this.folder="alter_table";this.file="set_default";this.column=e,this.defaultValue=r;}};var Kt=class extends T{constructor(e){super("");this.chainsWith=",";this.canKeywordBeSeenMultipleTimes=true;this.folder="alter_table";this.file="set_not_null";this.column=e;}};var K=class extends T{constructor(e,r={},o=false){super("");this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=true;this.folder="constraint";this.file="constraint";this.constraintType=e,this.columns=r.columns,this.references=r.references,this.constraintName=r.constraintName,this.onDelete=r.onDelete,this.onUpdate=r.onUpdate,this.defaultValue=r.defaultValue,this.checkExpression=r.checkExpression,this.isRawValue=o;}};var kt=class extends T{constructor(e,r=[],o=[],n=false){super("create table");this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.folder="create_table";this.file="create_table";this.table=e,this.children=r,this.namedConstraints=o,this.ifNotExists=n;}};var Ut=class extends T{constructor(e,r=false){super("drop table");this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.folder="drop_table";this.file="drop_table";this.table=e,this.ifExists=r;}};var Lt=class extends T{constructor(e,r,o,n=false){super("create index");this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.folder="index_op";this.file="create_index";this.table=e,this.columns=r,this.indexName=o,this.unique=n;}};var Ft=class extends T{constructor(e,r,o){super("drop index");this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.cascade=false;this.folder="index_op";this.file="drop_index";this.indexName=e,this.table=r,this.cascade=o??false;}};var me=class extends T{constructor(e,r=false){super("truncate",r);this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.folder="truncate";this.file="truncate";this.fromNode=e;}};var x=class extends T{constructor(e,r,o={}){super("");this.chainsWith=",";this.canKeywordBeSeenMultipleTimes=true;this.folder="column";this.file="column_type";this.isRawValue=false;this.column=e,this.dataType=r,this.length=o.length,this.precision=o.precision,this.scale=o.scale,this.enumValues=o.enumValues,this.withTimezone=o.withTimezone,this.autoIncrement=o.autoIncrement,this.isRawValue=o.isRawValue??false;}};var ze=class extends T{constructor(e,r=false,o=false){super("lock");this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.folder="lock";this.file="lock";this.lockType=e,this.skipLocked=r,this.noWait=o;}};var xe=class extends T{constructor(e,r=false){super(r?"union all":"union");this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=true;this.folder="union";this.file="union";this.query=e,this.isAll=r;}};var Qe=class extends T{constructor(e,r,o){e==="normal"&&(e="");super("with");this.chainsWith=",";this.canKeywordBeSeenMultipleTimes=false;this.folder="with";this.file="with";this.alias=r,this.body=o,this.clause=e;}};var Me=class{constructor(t){this.nodes=t;}getNodes(){return this.nodes}};var Wt=class extends T{constructor(e){super("");this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=true;this.folder="constraint";this.file="after";this.column=e;}};var jt=class extends Me{constructor(t,e,r,o,n=[],s="create_table"){super(e),this.columnNode=r,this.tableName=o,this.namedConstraints=n,this.context=s,this.sqlType=t;}primaryKey(t){let e=we(this.tableName,S(this.columnNode.column));return this.context==="alter_table"?(this.nodes.push(new K("primary_key",{columns:[S(this.columnNode.column)],constraintName:t?.constraintName??e})),this):this.sqlType==="sqlite"?this.handleSqliteAutoIncrement(t||{constraintName:e}):(this.namedConstraints.push(new K("primary_key",{columns:[S(this.columnNode.column)],constraintName:t?.constraintName??e})),this)}foreignKey(t,e){let[r,o]=t.split("."),n=o.split(","),s=e?.constraintName??k(this.tableName??"",S(this.columnNode.column),n[0]);return this.context==="alter_table"?(this.nodes.push(new K("foreign_key",{columns:[S(this.columnNode.column)],references:{table:r,columns:n},constraintName:s,onDelete:e?.onDelete,onUpdate:e?.onUpdate})),this):(this.namedConstraints.push(new K("foreign_key",{columns:[S(this.columnNode.column)],references:{table:r,columns:n},constraintName:s,onDelete:e?.onDelete,onUpdate:e?.onUpdate})),this)}increment(){return this.columnNode.autoIncrement=true,this}notNullable(){return this.nodes.push(new K("not_null",{columns:[S(this.columnNode.column)]})),this}nullable(){return this.nodes.push(new K("null",{columns:[S(this.columnNode.column)]})),this}default(t){let e;return t===null?e="NULL":typeof t=="boolean"?e=t?"TRUE":"FALSE":t!==void 0&&(e=t.toString()),this.nodes.push(new K("default",{defaultValue:e})),this}unique(t){return this.context==="alter_table"?(this.nodes.push(new K("unique",{columns:[S(this.columnNode.column)],constraintName:t?.constraintName??Z(this.tableName??"",S(this.columnNode.column))})),this):(this.namedConstraints.push(new K("unique",{columns:[S(this.columnNode.column)],constraintName:t?.constraintName||Z(this.tableName??"",S(this.columnNode.column))})),this)}after(t){return this.nodes.push(new Wt(t)),this}handleSqliteAutoIncrement(t){return this.nodes.push(new K("primary_key",{columns:[S(this.columnNode.column)],constraintName:t?.constraintName,autoIncrement:this.columnNode.autoIncrement,columnType:"integer"})),this}};var Ae=class extends Me{constructor(e,r,o,n){super(r);this.context="create_table";this.tableName=o,this.namedConstraints=[],this.context=n??"create_table",this.sqlType=e;}build(e){return this.nodes.push(e),new jt(this.sqlType,this.nodes,e,this.tableName,this.namedConstraints,this.context)}char(e,r=1){let o=new x(e,"char",{length:r});return this.build(o)}varchar(e,r=255){let o=new x(e,"varchar",{length:r});return this.build(o)}string(e,r=255){return this.varchar(e,r)}text(e,r="longtext"){let o=new x(e,r);return this.build(o)}longtext(e){return this.text(e,"longtext")}mediumtext(e){return this.text(e,"mediumtext")}tinytext(e){return this.text(e,"tinytext")}uuid(e){let r=new x(e,"uuid");return this.build(r)}ulid(e){let r=new x(e,"ulid");return this.build(r)}integer(e,r=255){let o=new x(e,"integer",{length:r});return this.build(o)}tinyint(e,r=255){let o=new x(e,"tinyint",{length:r});return this.build(o)}smallint(e,r=255){let o=new x(e,"smallint",{length:r});return this.build(o)}mediumint(e,r=255){let o=new x(e,"mediumint",{length:r});return this.build(o)}biginteger(e,r=255){let o=new x(e,"bigint",{length:r});return this.build(o)}bigint(e,r=255){return this.biginteger(e,r)}float(e,r=10){let o=new x(e,"float",{precision:r});return this.build(o)}double(e,r=10){let o=new x(e,"double",{precision:r});return this.build(o)}real(e,r=10){let o=new x(e,"real",{precision:r});return this.build(o)}decimal(e,r=10,o=2){let n=new x(e,"decimal",{precision:r,scale:o});return this.build(n)}numeric(e,r=10,o=2){let n=new x(e,"numeric",{precision:r,scale:o});return this.build(n)}increment(e,r=255){return this.integer(e,r).increment()}bigIncrement(e,r=255){return this.biginteger(e,r).increment()}date(e,r){let o=new x(e,"date",{precision:r});return this.build(o)}time(e,r){let o=new x(e,"time",{precision:r});return this.build(o)}year(e){let r=new x(e,"year");return this.build(r)}datetime(e,r){let o=new x(e,"datetime",{withTimezone:r?.withTimezone??false,precision:r?.precision});return this.build(o)}timestamp(e,r){let o=new x(e,"timestamp",{withTimezone:r?.withTimezone??false,precision:r?.precision});return this.build(o)}boolean(e){let r=new x(e,"boolean");return this.build(r)}binary(e){let r=new x(e,"binary");return this.build(r)}varbinary(e,r=255){let o=new x(e,"varbinary",{length:r});return this.build(o)}blob(e){let r=new x(e,"blob");return this.build(r)}tinyblob(e){let r=new x(e,"tinyblob");return this.build(r)}mediumblob(e){let r=new x(e,"mediumblob");return this.build(r)}longblob(e){let r=new x(e,"longblob");return this.build(r)}json(e){let r=new x(e,"json");return this.build(r)}jsonb(e){let r=new x(e,"jsonb");return this.build(r)}enum(e,r){let o=new x(e,"enum",{enumValues:r});return this.build(o)}custom(e,r,o){let n=new x(e,r,{length:o});return this.build(n)}rawColumn(e){let r=new x(e,"",{isRawValue:true});return this.build(r)}getNamedConstraints(){return this.namedConstraints}};var Vt=class extends Me{constructor(t,e,r){super(e),this.table=t,this.sqlType=r;}addColumn(t){let e=[],r=new Ae(this.sqlType,e,this.table),o=t(r);if(!e.length)return;let n=r.getNamedConstraints(),s=e.filter(c=>c.folder==="column");if(e=e.concat(n),s.length!==1)throw new Error("addColumn callback must define exactly one column");let a=s[0],l=o.getNodes().filter(c=>{let m=c;return m.constraintType==="not_null"||m.constraintType==="null"||m.constraintType==="default"}),d=new It(a);d.inlineConstraints=l,this.nodes.push(d),o.getNodes().filter(c=>{let m=c;return m.constraintType==="unique"||m.constraintType==="foreign_key"||m.constraintType==="primary_key"}).forEach(c=>{this.nodes.push(new le(c));});}alterColumn(t){if(this.sqlType==="sqlite")throw new f("AlterTableBuilder::alterColumn","SQLITE_NOT_SUPPORTED",new Error("sqlite does not support alter table statements"));let e=[],r=new Ae(this.sqlType,e,this.table,"alter_table"),o=t(r);if(!e.length)return;let n=e.filter(m=>m.folder==="column");if(n.length!==1)throw new Error("alterColumn callback must define exactly one column");let s=n[0],a=S(s.column),l=o.getNodes().find(m=>m.constraintType==="null"),u=o.getNodes().find(m=>m.constraintType==="not_null")||l,c=o.getNodes().find(m=>m.constraintType==="default");this.nodes.push(new vt(S(a),s,{})),u&&(u.constraintType==="not_null"?this.nodes.push(new Kt(S(a))):u.constraintType==="null"&&this.nodes.push(new Et(S(a)))),c&&(c.defaultValue===void 0||c.defaultValue===null?this.nodes.push(new Ye(S(a))):this.nodes.push(new Je(S(a),c.defaultValue))),o.getNodes().forEach(m=>{let p=m;switch(p.constraintType){case "primary_key":this.addPrimaryKey(S(a));break;case "unique":this.unique(S(a),{constraintName:p.constraintName});break;case "foreign_key":this.addForeignKey(S(a),p.references?.table??"",S(p.references?.columns?.[0]??""),{constraintName:p.constraintName,onDelete:p.onDelete,onUpdate:p.onUpdate});break}});}dropColumn(t){this.nodes.push(new Bt(t));}renameColumn(t,e){this.nodes.push(new $t(t,e));}dropDefault(t){if(this.sqlType==="sqlite")throw new f("AlterTableBuilder::alterColumn","SQLITE_NOT_SUPPORTED",new Error("sqlite does not support alter table statements"));this.nodes.push(new Ye(t));}addPrimaryKey(t){if(this.sqlType==="sqlite")throw new f("AlterTableBuilder::alterColumn","SQLITE_NOT_SUPPORTED",new Error("sqlite does not support alter table statements"));this.nodes.push(new Ee([t]));}addConstraint(...t){if(this.sqlType==="sqlite")throw new f("AlterTableBuilder::alterColumn","SQLITE_NOT_SUPPORTED",new Error("sqlite does not support alter table statements"));this.nodes.push(new le(new K(...t)));}addForeignKey(t,e,r,o){if(this.sqlType==="sqlite")throw new f("AlterTableBuilder::alterColumn","SQLITE_NOT_SUPPORTED",new Error("sqlite does not support alter table statements"));this.nodes.push(new le(new K("foreign_key",{columns:[t],references:{table:e,columns:[r]},constraintName:o?.constraintName??k(this.table,t,r),onDelete:o?.onDelete,onUpdate:o?.onUpdate})));}unique(t,e){if(this.sqlType==="sqlite")throw new f("AlterTableBuilder::alterColumn","SQLITE_NOT_SUPPORTED",new Error("sqlite does not support alter table statements"));this.nodes.push(new le(new K("unique",{columns:[t],constraintName:e?.constraintName??Z(this.table,t)})));}setDefault(t,e){if(this.sqlType==="sqlite")throw new f("AlterTableBuilder::alterColumn","SQLITE_NOT_SUPPORTED",new Error("sqlite does not support alter table statements"));this.nodes.push(new Je(t,e));}dropForeignKey(t,e){if(this.sqlType==="sqlite")throw new f("AlterTableBuilder::dropPrimaryKey","SQLITE_NOT_SUPPORTED",new Error("sqlite does not support alter table statements"));let r=k(this.table,t,e);this.nodes.push(new de(r));}dropUnique(t,e){if(this.sqlType==="sqlite")throw new f("AlterTableBuilder::dropUnique","SQLITE_NOT_SUPPORTED",new Error("sqlite does not support alter table statements"));if(this.sqlType==="cockroachdb")throw new f("AlterTableBuilder::dropUnique","COCKROACHDB_NOT_SUPPORTED",new Error("cockroachdb does not support alter table statements"));let r=e?.constraintName??Z(this.table,t);this.nodes.push(new de(r));}dropConstraint(t){if(this.sqlType==="sqlite")throw new f("AlterTableBuilder::dropConstraint","SQLITE_NOT_SUPPORTED",new Error("sqlite does not support alter table statements"));this.nodes.push(new de(t));}dropPrimaryKey(t){if(this.sqlType==="sqlite")throw new f("AlterTableBuilder::dropPrimaryKey","SQLITE_NOT_SUPPORTED",new Error("sqlite does not support alter table statements"));if(this.sqlType==="postgres"&&!t)throw new f("AlterTableBuilder::dropPrimaryKey","POSTGRES_TABLE_REQUIRED",new Error("postgres requires the table name"));this.nodes.push(new $e(t));}};var he=class{constructor(t){if(this.sqlType=t||A.DB_TYPE,!this.sqlType)throw new f("Schema::constructor","ENV_NOT_SET",new Error("env not set, please set DB_TYPE in .env file"));this.queryStatements=[];}rawQuery(t){this.queryStatements.push(t);}runFile(t){if(!te__default.default.existsSync(t))throw new f("Schema::runFile","FILE_NOT_FOUND_OR_NOT_ACCESSIBLE");let e=Pe__default.default.basename(t),r=Pe__default.default.extname(e);if(r!==".sql"&&r!==".txt")throw new f("Schema::runFile","FILE_NOT_A_SQL_OR_TXT_FILE");let n=te__default.default.readFileSync(t,"utf-8").split(";").map(s=>s.trim()).filter(s=>s.length>0&&!s.startsWith("--"));for(let s of n)this.rawQuery(s);}createTable(t,e,r){let o=new Ae(this.sqlType,[],t);e(o);let n=o.getNodes(),s=new N({table:t,databaseCaseConvention:"preserve",modelCaseConvention:"preserve"},this.sqlType),a=new kt(t,n,o.getNamedConstraints(),r?.ifNotExists),l=s.parse([a]).sql,d=l.startsWith("create table")?l:`create table ${l}`;this.rawQuery(d);}alterTable(t,e){let r=[],o=new Vt(t,r,this.sqlType);if(e(o),!r.length)return;let n=this.generateAstInstance({table:t,databaseCaseConvention:"preserve",modelCaseConvention:"preserve"}),s=[],a=()=>{if(!s.length)return;let l=new fe(t,s),d=n.parse([l]).sql;if(!d||!d.trim())return;let u=d.startsWith("alter table")?d:`alter table ${d}`;this.rawQuery(u),s=[];};for(let l of r)l.file==="add_constraint"&&s.length&&s[0].file==="add_column"||a(),s.push(l);a();}dropTable(t,e=false){let r=new Ut(t,e),o=this.generateAstInstance({table:t,databaseCaseConvention:"preserve",modelCaseConvention:"preserve"});this.rawQuery(o.parse([r]).sql);}renameTable(t,e){let r=new fe(t,[new Qt(e)]),o=this.generateAstInstance({table:t,databaseCaseConvention:"preserve",modelCaseConvention:"preserve"});this.rawQuery(o.parse([r]).sql);}truncateTable(t){let e=new me(t),r=this.generateAstInstance({table:t,databaseCaseConvention:"preserve",modelCaseConvention:"preserve"});this.rawQuery(r.parse([e]).sql);}createIndex(t,e,r){Array.isArray(e)||(e=[e]);let o=r.constraintName||qr(t,e.join("_")),n=new Lt(t,e,o),s=this.generateAstInstance({table:t,databaseCaseConvention:"preserve",modelCaseConvention:"preserve"});this.rawQuery(s.parse([n]).sql);}dropIndex(t,e){let r=new Ft(t,e),o=this.generateAstInstance({table:e,databaseCaseConvention:"preserve",modelCaseConvention:"preserve"});this.rawQuery(o.parse([r]).sql);}addPrimaryKey(t,e){let r=new Ee(e),o=this.generateAstInstance({table:t,databaseCaseConvention:"preserve",modelCaseConvention:"preserve"});this.rawQuery(o.parse([r]).sql);}addUnique(t,e,r){let o=Array.isArray(e)?e:[e],n=r?.constraintName??Z(t,o.join("_")),s=new K("unique",{columns:o,constraintName:n}),a=new fe(t,[new le(s)]),l=this.generateAstInstance({table:t,databaseCaseConvention:"preserve",modelCaseConvention:"preserve"});this.rawQuery(l.parse([a]).sql);}dropForeignKey(t,e,r){let o=k(t,e,r),n=new de(o),s=new fe(t,[n]),a=this.generateAstInstance({table:t,databaseCaseConvention:"preserve",modelCaseConvention:"preserve"});this.rawQuery(a.parse([s]).sql);}dropUnique(t,e,r){let o=Array.isArray(e)?Z(t,e.join("_")):Z(t,e),n=r?.constraintName??o,s=new de(n),a=new fe(t,[s]),l=this.generateAstInstance({table:t,databaseCaseConvention:"preserve",modelCaseConvention:"preserve"});this.rawQuery(l.parse([a]).sql);}dropPrimaryKey(t){let e=new $e,r=this.generateAstInstance({table:t,databaseCaseConvention:"preserve",modelCaseConvention:"preserve"});this.rawQuery(r.parse([e]).sql);}addConstraint(t,...e){let r=new K(...e),o=new fe(t,[new le(r)]),n=this.generateAstInstance({table:t,databaseCaseConvention:"preserve",modelCaseConvention:"preserve"});this.rawQuery(n.parse([o]).sql);}dropConstraint(t,e){let r=new de(e),o=this.generateAstInstance({table:t,databaseCaseConvention:"preserve",modelCaseConvention:"preserve"});this.rawQuery(o.parse([r]).sql);}generateAstInstance(t){return new N(t,this.sqlType)}};var Ht=class{constructor(t){this.sql=t,this.models=Object.values(this.sql.registeredModels);}buildDropDependencies(t){let e=new Map,r=new Map,o=new Map;for(let n of t.relationsToDrop||[]){let s=`${n.table}.${n.relation.name}`,a=[];if(n.relation.referencedTable&&a.push(`table.${n.relation.referencedTable}`),n.relation.referencedColumns)for(let l of n.relation.referencedColumns)a.push(`column.${n.relation.referencedTable}.${l}`);e.set(s,a);}for(let n of t.tablesToDrop||[]){let s=`table.${n.table}`,a=[];for(let l of this.models){let d=l.getRelations();for(let u of d)u.type==="belongsTo"&&u.model().table===n.table&&a.push(`fk.${l.table}.${u.constraintName}`);}r.set(s,a);}for(let n of t.columnsToDrop||[]){let s=`column.${n.table}.${n.column}`,a=[],l=this.models.find(d=>d.table===n.table);if(l){let d=l.getColumns().find(u=>u.databaseName===n.column);if(d){d.isPrimary&&a.push(`pk.${n.table}`);let u=l.getRelations();for(let c of u)c.columnName===d.columnName&&a.push(`fk.${n.table}.${c.constraintName}`);}}o.set(s,a);}return {foreignKeys:e,tables:r,constraints:o}}topologicalSortReverse(t,e){let r=new Set,o=new Set,n=[],s=a=>{if(o.has(a))throw new Error(`Circular dependency detected: ${a}`);if(r.has(a))return;o.add(a);let l=e(a);for(let d of l)s(d);o.delete(a),r.add(a),n.push(a);};for(let a of t.keys())r.has(a)||s(a);return n}generateDropOperations(t){let e=this.buildDropDependencies(t),r=[],o=this.topologicalSortReverse(e.foreignKeys,s=>e.foreignKeys.get(s)||[]);for(let s of o){let[a,l]=s.split("."),d=t.relationsToDrop?.find(u=>u.table===a&&u.relation.name===l);d&&r.push({type:"DROP_FOREIGN_KEY",phase:"DESTRUCTIVE_OPERATIONS",table:a,constraint:l,data:d,dependencies:e.foreignKeys.get(s)||[],sqlStatements:this.generateDropForeignKeySql(d)});}let n=this.topologicalSortReverse(e.tables,s=>e.tables.get(s)||[]);for(let s of t.columnsToDrop||[]){let a=`column.${s.table}.${s.column}`,l=e.constraints.get(a)||[];for(let d of l)d.startsWith("pk.")?r.push({type:"DROP_CONSTRAINT",phase:"DESTRUCTIVE_OPERATIONS",table:s.table,constraint:"PRIMARY KEY",data:{type:"primary_key",table:s.table},dependencies:[a],sqlStatements:this.generateDropPrimaryKeySql(s.table)}):d.startsWith("unique.")&&r.push({type:"DROP_CONSTRAINT",phase:"DESTRUCTIVE_OPERATIONS",table:s.table,constraint:`UNIQUE_${s.column}`,data:{type:"unique",table:s.table,column:s.column},dependencies:[a],sqlStatements:this.generateDropUniqueConstraintSql(s.table,s.column)});}for(let s of t.columnsToDrop||[])r.push({type:"DROP_COLUMN",phase:"DESTRUCTIVE_OPERATIONS",table:s.table,column:s.column,data:s,dependencies:[],sqlStatements:this.generateDropColumnSql(s)});for(let s of n){let a=s.replace("table.",""),l=t.tablesToDrop?.find(d=>d.table===a);l&&r.push({type:"DROP_TABLE",phase:"DESTRUCTIVE_OPERATIONS",table:a,data:l,dependencies:e.tables.get(s)||[],sqlStatements:this.generateDropTableSql(l)});}return r}analyzeConstraintImpact(t){let e=new Map;for(let r of t.columnsToDrop||[]){let o=[],n=this.models.find(s=>s.table===r.table);if(n){let s=n.getColumns().find(a=>a.databaseName===r.column);if(s){s.isPrimary&&o.push(`PRIMARY KEY on ${r.table}`);let a=n.getRelations();for(let l of a)l.columnName===s.columnName&&o.push(`FOREIGN KEY ${l.constraintName} on ${r.table}`);}}e.set(`${r.table}.${r.column}`,o);}return e}detectMixedOperations(t){let e=[];for(let r of t.columnsToModify||[]){let o=this.models.find(n=>n.table===r.table);o&&o.getColumns().find(s=>s.databaseName===r.dbColumns.name)&&this.hasConstraintChanges(r.dbColumns,r.modelColumn)&&e.push({type:"column_modification_with_constraints",table:r.table,column:r.dbColumns.name,description:`Column ${r.dbColumns.name} modification requires constraint recreation`});}for(let r of t.primaryKeysToModify||[])e.push({type:"primary_key_modification",table:r.table,description:`Primary key modification on ${r.table} requires FK recreation`});return e}hasConstraintChanges(t,e){return t.isNullable!==!e.constraints?.nullable||t.isUnique!==!!e.constraints?.unique||t.defaultValue!==e.constraints?.default}generateDropForeignKeySql(t){return this.sql.getDbType()==="sqlite"?[]:t.relation.name?this.sql.alterTable(t.table,e=>{e.dropConstraint(t.relation.name);}):[]}generateDropPrimaryKeySql(t){return this.sql.getDbType()==="sqlite"?[]:this.sql.alterTable(t,e=>{e.dropPrimaryKey();})}generateDropUniqueConstraintSql(t,e){return this.sql.getDbType()==="sqlite"?[]:this.sql.alterTable(t,r=>{r.dropConstraint(`UNIQUE_${e}`);})}generateDropColumnSql(t){return this.sql.alterTable(t.table,e=>{e.dropColumn(t.column);})}generateDropTableSql(t){return [`DROP TABLE ${t.table}`]}};var Yt=class{constructor(t){this.sql=t,this.models=Object.values(this.sql.registeredModels),this.dropResolver=new Ht(t);}generateOperations(t){let e=[];e.push(...this.generateStructureCreationOperations(t)),e.push(...this.generateConstraintCreationOperations(t)),e.push(...this.generateDestructiveOperations(t)),e.push(...this.generateColumnModificationOperations(t));let r=l=>l.table&&l.constraint?`${l.table}::${l.constraint}`:void 0,o=new Set(e.filter(l=>l.type==="ADD_FOREIGN_KEY").map(l=>r(l)).filter(Boolean)),n=new Set(e.filter(l=>l.type==="DROP_FOREIGN_KEY").map(l=>r(l)).filter(Boolean)),s=new Set([...o].filter(l=>n.has(l)));return e.filter(l=>{let d=r(l);return d?!(s.has(d)&&(l.type==="ADD_FOREIGN_KEY"||l.type==="DROP_FOREIGN_KEY")):true})}generateStructureCreationOperations(t){let e=[];for(let r of t.tablesToAdd){let o=this.sql.createTable(r.table,n=>{for(let s of r.columns){if(Array.isArray(s.type)){n.enum(s.databaseName,s.type);continue}s.type&&this.executeBuilderMethod(r.table,n,s,[s.databaseName,s.length,s.precision&&!s.withTimezone?s.precision:void 0,s.scale,s.withTimezone?{withTimezone:s.withTimezone,precision:s.precision}:void 0].filter(Boolean),true);}});e.push({type:"CREATE_TABLE",phase:"STRUCTURE_CREATION",table:r.table,data:r,dependencies:[],sqlStatements:[o]});}for(let r of t.columnsToAdd){let o=this.generateAddColumnViaAlter(r);e.push({type:"ADD_COLUMN",phase:"STRUCTURE_CREATION",table:r.table,column:r.column.databaseName,data:r,dependencies:[`table.${r.table}`],sqlStatements:o});}return e}generateConstraintCreationOperations(t){let e=[];for(let o of t.uniquesToDrop||[]){let n=this.sql.alterTable(o.table,s=>{s.dropConstraint(o.name);});e.push({type:"DROP_CONSTRAINT",phase:"CONSTRAINT_CREATION",table:o.table,constraint:o.name,data:o,dependencies:[`table.${o.table}`],sqlStatements:n});}let r=new Set((t.uniquesToDrop||[]).map(o=>o.name));for(let o of t.indexesToDrop){if(r.has(o.index))continue;let n=new he(this.sql.getDbType());n.dropIndex(o.index,o.table);let s=n.queryStatements[0];e.push({type:"DROP_INDEX",phase:"CONSTRAINT_CREATION",table:o.table,index:o.index,data:o,dependencies:[`table.${o.table}`],sqlStatements:[s]});}for(let o of t.primaryKeysToAdd){let a=this.models.find(d=>d.table===o.table)?.getColumns().find(d=>d.columnName===o.columns[0])?.primaryKeyConstraintName||we(o.table,o.columns[0]),l=this.sql.alterTable(o.table,d=>{let u=a||we(o.table,o.columns[0]);d.addConstraint("primary_key",{columns:[o.columns[0]],constraintName:u});});e.push({type:"ADD_PRIMARY_KEY",phase:"CONSTRAINT_CREATION",table:o.table,constraint:a,data:o,dependencies:[`table.${o.table}`],sqlStatements:l});}for(let o of t.relationsToAdd){if(o.relation.type==="manyToMany")continue;let n=this.generateAddRelationViaAlter(o),s=this.computeFkConstraintName(o);e.push({type:"ADD_FOREIGN_KEY",phase:"CONSTRAINT_CREATION",table:o.table,constraint:s,data:o,dependencies:this.getForeignKeyDependencies(o),sqlStatements:n});}for(let o of t.uniquesToAdd||[]){let n=this.models.find(l=>l.table===o.table),s=(o.columns||[]).map(l=>n?.getColumns().find(u=>u.columnName===l)?.databaseName||l),a=this.sql.alterTable(o.table,l=>{l.addConstraint("unique",{columns:s,constraintName:o.name||"mandatory"});});e.push({type:"ADD_UNIQUE_CONSTRAINT",phase:"CONSTRAINT_CREATION",table:o.table,constraint:o.name||"mandatory",data:o,dependencies:[`table.${o.table}`],sqlStatements:a});}for(let o of t.indexesToAdd){let n=this.generateCreateIndexSql(o);e.push({type:"CREATE_INDEX",phase:"CONSTRAINT_CREATION",table:o.table,index:o.index,data:o,dependencies:[`table.${o.table}`],sqlStatements:[n]});}return e}computeFkConstraintName(t){let e=S(t.relation.constraintName);if(e)return e;let r=t.table;t.relation.type==="belongsTo"?r=t.relation.model().table:t.relation.type==="manyToMany"&&t.relation.manyToManyOptions&&(r=S(t.relation.manyToManyOptions.throughModel));let n=this.models.find(a=>a.table===t.table)?.getColumns()||[],s=t.relation.columnName;return t.relation.type==="belongsTo"?s=n.find(l=>l.columnName===t.relation.foreignKey)?.databaseName||t.relation.foreignKey:s=n.find(l=>l.columnName===s)?.databaseName||s,k(t.table,s,r)}generateDestructiveOperations(t){return this.dropResolver.generateDropOperations(t)}generateColumnModificationOperations(t){let e=[];for(let r of t.columnsToModify||[]){let o=this.generateModifyColumnViaAlter(r);e.push({type:"MODIFY_COLUMN",phase:"DESTRUCTIVE_OPERATIONS",table:r.table,column:r.dbColumns.name,data:r,dependencies:[],sqlStatements:o});}return e}getForeignKeyDependencies(t){let e=[];if(t.relation.type==="belongsTo"){let o=t.relation.model();e.push(`table.${o.table}`);let n=o.primaryKey||"id",s=o.getColumns().find(a=>a.columnName===n);s&&e.push(`column.${o.table}.${s.databaseName}`);}else if(t.relation.type==="manyToMany"&&t.relation.manyToManyOptions){let o=S(t.relation.manyToManyOptions.throughModel);e.push(`table.${o}`);}e.push(`table.${t.table}`);let r=this.models.find(o=>o.table===t.table);if(r){let o=r.getColumns().find(n=>n.columnName===t.relation.columnName||n.databaseName===t.relation.columnName);o&&e.push(`column.${t.table}.${o.databaseName}`);}return e}executeBuilderMethod(t,e,r,o,n=true){let s=e[r.type](...o);return n&&(r.isPrimary&&s.primaryKey({constraintName:r.primaryKeyConstraintName||we(t,r.columnName)}),r.constraints?.default!==void 0&&s.default(r.constraints.default),r.constraints?.nullable===false?s.notNullable():r.constraints?.nullable===true&&s.nullable()),s}generateAddColumnViaAlter(t){let e=[t.column.databaseName,t.column.length,t.column.precision&&!t.column.withTimezone?t.column.precision:void 0,t.column.scale,t.column.withTimezone?{withTimezone:t.column.withTimezone,precision:t.column.precision}:void 0].filter(Boolean);return this.sql.alterTable(t.table,r=>{r.addColumn(o=>{let n=this.executeBuilderMethod(t.table,o,t.column,e,false);return t.column.constraints?.default!==void 0&&n.default(t.column.constraints.default),t.column.constraints?.nullable===false?n.notNullable():t.column.constraints?.nullable===true&&n.nullable(),n});})}generateModifyColumnViaAlter(t){if(this.sql.getDbType()==="sqlite")return [];let e=[t.modelColumn.databaseName,t.modelColumn.length,t.modelColumn.precision&&!t.modelColumn.withTimezone?t.modelColumn.precision:void 0,t.modelColumn.scale,t.modelColumn.withTimezone?{withTimezone:t.modelColumn.withTimezone,precision:t.modelColumn.precision}:void 0].filter(Boolean);return this.sql.alterTable(t.table,o=>{o.alterColumn(n=>{let s=this.executeBuilderMethod(t.table,n,t.modelColumn,e,false);return t.modelColumn.constraints?.default!==void 0&&s.default(t.modelColumn.constraints.default),t.modelColumn.constraints?.nullable===false?s.notNullable():t.modelColumn.constraints?.nullable===true&&s.nullable(),s});})}generateCreateIndexSql(t){let e=this.models.find(s=>s.table===t.table),o=(e?.getIndexes().find(s=>s.name===t.index)?.columns||[]).map(s=>e?.getColumns().find(l=>l.columnName===s)?.databaseName||s),n=new he(this.sql.getDbType());return n.createIndex(t.table,o,{constraintName:t.index}),n.queryStatements[0]||""}generateAddRelationViaAlter(t){let e=t.table,r=t.relation.foreignKey;t.relation.type==="belongsTo"?(e=t.relation.model().table,r=t.relation.model().primaryKey||"id"):t.relation.type==="manyToMany"&&t.relation.manyToManyOptions&&(e=S(t.relation.manyToManyOptions.throughModel),r=S(t.relation.manyToManyOptions.rightForeignKey),(!r||r==="undefined")&&(r=t.relation.model().primaryKey||"id"));let o=typeof t.relation.constraintName=="string"?t.relation.constraintName:void 0,n=S(r);if(t.relation.type==="belongsTo"){let m=t.relation.model(),p=m.primaryKey,g=m.getColumns().find(w=>w.columnName===p);if(g)n=g.databaseName;else {let w=m?.databaseCaseConvention||"preserve";n=O(p,w);}}else if(t.relation.type==="manyToMany"&&t.relation.manyToManyOptions){let m=t.relation.model();if(typeof n=="string"&&n){let p=m.getColumns(),h=p.find(g=>g.columnName===n);if(h)n=h.databaseName;else {let g=m.primaryKey||"id",w=p.find(C=>C.columnName===g);if(w)n=w.databaseName;else {let C=m?.databaseCaseConvention||"preserve";n=O(n||g,C);}}}else {let p=m.primaryKey||"id",g=m.getColumns().find(w=>w.columnName===p);if(g)n=g.databaseName;else {let w=m?.databaseCaseConvention||"preserve";n=O(p,w);}}}let s=this.models.find(m=>m.table===t.table),a=s?.getColumns()||[],l=t.relation.columnName,d=a.find(m=>m.columnName===l);if(d)l=d.databaseName;else {let m=s?.databaseCaseConvention||"preserve";l=O(l,m);}if(t.relation.type==="belongsTo"){let m=a.find(p=>p.columnName===t.relation.foreignKey);if(m)l=m.databaseName;else {let p=s?.databaseCaseConvention||"preserve";l=O(t.relation.foreignKey,p);}}else if(t.relation.type==="manyToMany"&&t.relation.manyToManyOptions){let m=t.relation.manyToManyOptions.leftForeignKey,p=S(m),h=a.find(g=>g.columnName===p);if(h)l=h.databaseName;else {let g=s?.databaseCaseConvention||"preserve";l=O(p,g);}}let u=t.relation.onDelete?.toLowerCase(),c=t.relation.onUpdate?.toLowerCase();return this.sql.alterTable(t.table,m=>{let p=o||k(t.table,l,e);m.addConstraint("foreign_key",{columns:[l],references:{table:e,columns:[n]},constraintName:p,onDelete:u,onUpdate:c});})}formatSqlStatements(t){return t.map(e=>({...e,sqlStatements:e.sqlStatements.map(r=>sqlFormatter.format(r,{...this.sql.inputDetails.queryFormatOptions}).replace(/\n/g," ").replace(/\s+/g," "))}))}};function xd(i){return i.replace(/\s+/g," ").trim()}function Ad(i){return i.replace(/\s*\([^)]*\)/g,"").trim()}function qe(i,t){let e=xd(t.toLowerCase()),r=Ad(e);switch(i){case "sqlite":{let o=[{test:n=>n.includes("int"),normalized:"integer"},{test:n=>n.includes("char"),normalized:"varchar"},{test:n=>n.includes("text"),normalized:"text"},{test:n=>n.includes("clob"),normalized:"text"},{test:n=>n.includes("date"),normalized:"text"},{test:n=>n.includes("time"),normalized:"text"},{test:n=>n.includes("timestamp"),normalized:"text"},{test:n=>n.includes("datetime"),normalized:"text"},{test:n=>n.includes("blob"),normalized:"blob"},{test:n=>n.includes("real")||n.includes("floa")||n.includes("doub"),normalized:"real"},{test:n=>n.includes("numeric"),normalized:"numeric"},{test:n=>n.includes("bool"),normalized:"integer"},{test:n=>n.includes("uuid"),normalized:"varchar"},{test:n=>n.includes("ulid"),normalized:"varchar"},{test:n=>n.includes("jsonb"),normalized:"text"},{test:n=>n.includes("json"),normalized:"text"}];for(let n of o)if(n.test(r))return n.normalized;return r}case "mysql":case "mariadb":{if(r.endsWith("text")||r==="text")return "text";switch(r){case "int":case "integer":return "integer";case "tinyint":return "tinyint";case "smallint":return "smallint";case "mediumint":return "mediumint";case "bigint":return "bigint";case "float":return "float";case "double":case "double precision":return "double";case "real":return "double";case "decimal":case "numeric":return "numeric";case "varchar":case "character varying":return "varchar";case "char":case "character":return "char";case "uuid":return "varchar";case "ulid":return "varchar";case "date":return "date";case "datetime":return "datetime";case "timestamp":return "timestamp";case "time":return "time";case "year":return "year";case "jsonb":return "json";case "json":return "json";case "enum":return "enum";case "binary":return "binary";case "varbinary":return "varbinary";case "tinyblob":return "tinyblob";case "mediumblob":return "mediumblob";case "longblob":return "longblob";case "blob":return "blob";case "boolean":case "bool":return "boolean";default:return r}}case "postgres":case "cockroachdb":{if(r.endsWith("text")||r==="text")return "text";if(r.startsWith("timestamp"))return "timestamp";if(r.startsWith("time"))return "time";if(r==="datetime")return "timestamp";switch(r){case "character varying":return "varchar";case "character":return "char";case "ulid":return "varchar";case "double precision":return "double";case "real":return "real";case "float":return "real";case "integer":case "int4":case "int":return "integer";case "mediumint":return "integer";case "bigint":case "int8":return "bigint";case "smallint":case "int2":return "smallint";case "tinyint":return "smallint";case "uuid":return "uuid";case "year":return "smallint";case "bytea":return "bytea";case "binary":case "varbinary":case "blob":case "tinyblob":case "mediumblob":case "longblob":return "bytea";case "boolean":case "bool":return "boolean";case "numeric":case "decimal":return "numeric";case "jsonb":return "jsonb";case "json":return "json";case "date":return "date";default:return r}}default:return r}}var Ke=class i{constructor(t){this.emptyStatements=[/alter table ".*"$/];this.sql=t,this.models=Object.values(this.sql.registeredModels),this.data={columnsToAdd:[],columnsToDrop:[],columnsToModify:[],indexesToAdd:[],indexesToDrop:[],uniquesToAdd:[],uniquesToDrop:[],tablesToAdd:[],relationsToAdd:[],relationsToDrop:[],relationsToModify:[],primaryKeysToAdd:[],primaryKeysToDrop:[],primaryKeysToModify:[]};}static async makeDiff(t){let e=new i(t);return await Promise.all(e.models.map(async r=>{let o=await e.sql.getTableSchema(r.table),n={columns:r.getColumns().filter(d=>d?.type!==void 0&&d?.type!==null),indexes:r.getIndexes(),relations:r.getRelations()};if(!o.columns.length){e.data.tablesToAdd.push({table:r.table,columns:n.columns});for(let u of n.indexes)o.indexes.map(c=>c.name).includes(u.name)||e.data.indexesToAdd.push({table:r.table,index:u.name});let d=r.getUniques?.()||[];for(let u of d)e.data.uniquesToAdd.push({table:r.table,name:u.name||"mandatory",columns:u.columns});for(let u of n.relations){if(u.type!=="belongsTo")continue;let c=S(u.constraintName);o.foreignKeys.find(p=>p.name===c)||e.data.relationsToAdd.push({table:r.table,relation:u,onDelete:u.onDelete,onUpdate:u.onUpdate});}return}for(let d of n.columns)o.columns.some(c=>c.name===d.databaseName||c.name===d.columnName)||e.data.columnsToAdd.push({table:r.table,column:d});for(let d of o.columns)n.columns.some(c=>c.databaseName===d.name||c.columnName===d.name)||e.data.columnsToDrop.push({table:r.table,column:d.name});for(let d of n.indexes)o.indexes.map(u=>u.name).includes(d.name)||e.data.indexesToAdd.push({table:r.table,index:d.name});let s=r.getUniques?.()||[];for(let d of s)o.indexes.some(c=>c.name===d.name&&c.isUnique)||e.data.uniquesToAdd.push({table:r.table,name:d.name||"mandatory",columns:d.columns});for(let d of o.indexes)d.isUnique||n.indexes.map(c=>c.name).includes(d.name)||e.data.indexesToDrop.push({table:r.table,index:d.name});for(let d of o.indexes){if(!d.isUnique)continue;(r.getUniques?.()||[]).map(c=>c.name).includes(d.name)||e.data.uniquesToDrop.push({table:r.table,name:d.name});}for(let d of n.columns){let u=o.columns.find(p=>p.name===d.databaseName||p.name===d.columnName);if(!u)continue;let c=!e.areColumnsEqual(u,d,o.indexes),m=e.getDefaultChange({table:r.table,dbColumns:u,modelColumn:d});(c||m)&&e.data.columnsToModify.push({table:r.table,dbColumns:u,modelColumn:d});}for(let d of n.relations){if(d.type!=="belongsTo"&&d.type!=="manyToMany")continue;if(d.type==="manyToMany"&&d.manyToManyOptions){let m=S(d.manyToManyOptions.throughModel);e.data.relationsToAdd.push({table:m,relation:{type:"belongsTo",model:()=>r,columnName:S(d.manyToManyOptions.leftForeignKey),foreignKey:d.manyToManyOptions.leftForeignKey,constraintName:d.constraintName?S(d.constraintName):k(m,S(d.manyToManyOptions.leftForeignKey||Se(r.table)),r.table),onDelete:d.onDelete,onUpdate:d.onUpdate},onDelete:d.onDelete,onUpdate:d.onUpdate});continue}let u=S(d.constraintName);if(u&&o.foreignKeys.some(m=>m.name===u))continue;o.foreignKeys.find(m=>e.relationMatchesDbRelation(r,d,m))||e.data.relationsToAdd.push({table:r.table,relation:d,onDelete:d.onDelete,onUpdate:d.onUpdate});}let a=new Set(n.relations.filter(d=>d.type==="belongsTo").map(d=>{let u=S(d.foreignKey)||d.columnName,m=r.getColumns().find(p=>p.columnName===u)?.databaseName||u;return S(d.constraintName)||k(r.table,m,d.model().table)}));for(let d of o.foreignKeys){if(d.name&&a.has(d.name))continue;n.relations.find(c=>c.type!=="belongsTo"&&c.type!=="manyToMany"?false:e.relationMatchesDbRelation(r,c,d))||e.data.relationsToDrop.push({table:r.table,relation:d});}for(let d of n.relations){if(d.type!=="belongsTo"&&d.type!=="manyToMany")continue;let u=o.foreignKeys.find(c=>e.relationMatchesDbRelation(r,d,c));u&&!e.areRelationsEqual(u,d)&&e.data.relationsToModify.push({table:r.table,dbRelation:u,modelRelation:d,onDelete:d.onDelete,onUpdate:d.onUpdate});}let l=r.primaryKey;if(l&&!o.primaryKey&&e.data.primaryKeysToAdd.push({table:r.table,columns:[l]}),o.primaryKey&&!l&&e.data.primaryKeysToDrop.push({table:r.table,columns:o.primaryKey.columns,name:o.primaryKey.name}),l&&o.primaryKey){let d=r.getColumns().find(u=>u.columnName===l);d&&!e.arePrimaryKeysEqual(o.primaryKey,d)&&e.data.primaryKeysToModify.push({table:r.table,dbPrimaryKey:o.primaryKey,modelPrimaryKey:l});}})),await e.processManyToMany(),await e.removeFkChurnByName(),e}getSqlStatements(){let t=this.getSqlStatementsByPhase();return Object.values(t).flat()}getSqlStatementsByPhase(){let t=new Yt(this.sql),e=t.generateOperations(this.data),r=t.formatSqlStatements(e),o={STRUCTURE_CREATION:[],CONSTRAINT_CREATION:[],DESTRUCTIVE_OPERATIONS:[]};for(let n of r)o[n.phase].push(...n.sqlStatements);return o}areColumnsEqual(t,e,r=[]){let o=t.name===e.databaseName,n=this.sql.getDbType(),s=qe(n,t.dataType),a=typeof e.type=="string"?qe(n,e.type):void 0;a&&o&&(o=s===a),e.length!=null&&t.length!=null&&o&&(o=t.length===e.length);let l=a==="real"||a==="double"||a==="float";if(e.precision!=null&&t.precision!=null&&((n==="postgres"||n==="cockroachdb")&&l||o&&(o=t.precision===e.precision)),e.scale!=null&&t.scale!=null&&((n==="postgres"||n==="cockroachdb")&&l||o&&(o=t.scale===e.scale)),typeof e.type=="string"&&(a==="timestamp"||a==="time")&&e.withTimezone!==void 0&&t.withTimezone!==void 0&&o&&(o=!!t.withTimezone==!!e.withTimezone),e.constraints?.nullable!==void 0){let d=e.constraints.nullable,u=t.isNullable;o=o&&d===u;}return o}areRelationsEqual(t,e){let r=S(e.constraintName),o=r?t.name===r:true;if(e.type==="belongsTo"){let d=e.model(),u=d.primaryKey||"id",c=d.getColumns().find(h=>h.columnName===u),m=d.table,p=c?.databaseName||u;o=o&&t.referencedTable===m&&!!t.referencedColumns&&t.referencedColumns.length===1&&t.referencedColumns[0]===p;}else if(e.type==="manyToMany"&&e.manyToManyOptions){let d=S(e.manyToManyOptions.throughModel);o=o&&t.referencedTable===d;}let n=t.onDelete?.toLowerCase(),s=t.onUpdate?.toLowerCase(),a=e.onDelete?.toLowerCase(),l=e.onUpdate?.toLowerCase();return a&&o&&(o=n===a),l&&o&&(o=s===l),o}relationMatchesDbRelation(t,e,r){let o,n=e;if(n&&n.model){if(typeof n.model=="function"&&n.model.table)o=n.model;else if(typeof n.model=="function")try{let g=n.model();g&&g.table&&(o=g);}catch{}}if(!o)return false;let s=e.type==="belongsTo"?o.table:e.type==="manyToMany"&&e.manyToManyOptions?S(e.manyToManyOptions.throughModel):void 0;if(s&&r.referencedTable!==s)return false;let a=S(e.constraintName);if(a&&r.name&&a!==r.name)return false;let l=t.getColumns(),u=(n.type||"belongsTo")==="belongsTo"?S(n.foreignKey):n.columnName,c=l.find(g=>g.columnName===u);c&&(u=c.databaseName);let m=o.primaryKey||"id",h=o.getColumns().find(g=>g.columnName===m)?.databaseName||m;return r.columns.length===1&&r.columns[0]===u&&r.referencedColumns.length===1&&r.referencedColumns[0]===h}arePrimaryKeysEqual(t,e){if(t.columns.length!==1)return false;let o=t.columns[0]===e.databaseName,n=!t.name||!e.primaryKeyConstraintName||t.name===e.primaryKeyConstraintName;return o&&n}getDefaultChange(t){let e=this.sql.getDbType(),r=qe(e,t.dbColumns.dataType),o=typeof t.modelColumn.type=="string"?qe(e,t.modelColumn.type):void 0;if(o&&r!==o||t.modelColumn.length!=null&&t.dbColumns.length!=null&&t.dbColumns.length!==t.modelColumn.length||t.modelColumn.precision!=null&&t.dbColumns.precision!=null&&t.dbColumns.precision!==t.modelColumn.precision||t.modelColumn.scale!=null&&t.dbColumns.scale!=null&&t.dbColumns.scale!==t.modelColumn.scale||typeof t.modelColumn.type=="string"&&(o==="timestamp"||o==="time")&&t.modelColumn.withTimezone!==void 0&&t.dbColumns.withTimezone!==void 0&&!!t.dbColumns.withTimezone!=!!t.modelColumn.withTimezone)return false;let n=t.modelColumn.constraints?.default!==void 0,s=t.dbColumns.defaultValue!==null&&t.dbColumns.defaultValue!==void 0;if(n&&!s)return "set";if(!n&&s)return "drop";if(n&&s){let a=String(t.dbColumns.defaultValue),l=String(t.modelColumn.constraints?.default),d=this.normalizeDefaultValue(e,r,a),u=this.normalizeDefaultValue(e,o||r,l);return d!==u?"set":false}return false}normalizeDefaultValue(t,e,r){let o=String(r).trim();if(!o)return o;if(t==="postgres"||t==="cockroachdb"){if(e==="json"||e==="jsonb")try{o=o.replace(/^\((.*)\)$/s,"$1"),o=o.replace(/::(jsonb?|[a-zA-Z_ ]+[\[\]]*)/g,"");let s=o.match(/^'(.*)'$/s);if(s&&(o=s[1]),o==="{}"||o==="")return "{}";let a=JSON.parse(o);return JSON.stringify(a)}catch{}o=o.replace(/^\((.*)\)$/s,"$1"),o=o.replace(/::[a-zA-Z_ ]+[\[\]]*/g,"");let n=o.match(/^'(.*)'$/s);return n&&(o=n[1]),/^true$/i.test(o)?"true":/^false$/i.test(o)?"false":/^null$/i.test(o)?"null":(o)}if(t==="mysql"||t==="mariadb"){o=o.replace(/^\((.*)\)$/s,"$1");let n=o.match(/^'(.*)'$/s);return n&&(o=n[1]),/^current_timestamp(?:\(\d+\))?$/i.test(o)?"current_timestamp":o}if(t==="sqlite"){o=o.replace(/^\((.*)\)$/s,"$1");let n=o.match(/^'(.*)'$/s);return n&&(o=n[1]),o.toLowerCase()}return o}async processManyToMany(){let t=new Set;for(let e of this.models){let r=e.getRelations();for(let o of r){if(o.type!=="manyToMany"||!o.manyToManyOptions||o.manyToManyOptions.wasModelProvided)continue;let n=S(o.manyToManyOptions.throughModel);if(t.has(n))continue;t.add(n);let s=this.models.find(D=>D.table===o?.manyToManyOptions?.primaryModel),a=o.model();if(!s||!a)continue;let l=s.primaryKey||"id",d=a.primaryKey||"id",u=s.getColumns().find(D=>D.columnName===l),c=a.getColumns().find(D=>D.columnName===d);if(!u||!c)continue;let m=S(o.manyToManyOptions.leftForeignKey)||l,p=S(o.manyToManyOptions.rightForeignKey)||d,h=await this.sql.getTableSchema(n);if(!h.columns.length){this.data.tablesToAdd.push({table:n,columns:[this.clonePkAsColumn(u,m),this.clonePkAsColumn(c,p)]}),this.pushM2mFkRelations({throughTable:n,leftModel:s,rightModel:a,leftFkName:m,rightFkName:p,onDelete:o.onDelete,onUpdate:o.onUpdate,constraintName:void 0});continue}let g=this.clonePkAsColumn(u,m),w=this.clonePkAsColumn(c,p),C=h.columns.find(D=>D.name===m),P=h.columns.find(D=>D.name===p),j=C?this.areColumnsEqual(C,g,h.indexes):false,z=P?this.areColumnsEqual(P,w,h.indexes):false;for(let D of h.foreignKeys){let ce=D.referencedTable===s.table,ur=D.referencedTable===a.table;if(!ce&&!ur)continue;let Dl=ce?m:p,Le=D.columns[0];Le&&Le!==Dl&&(this.data.relationsToDrop.push({table:n,relation:D}),Le!==m&&Le!==p&&this.data.columnsToDrop.push({table:n,column:Le}));}let L={};j||(L[g.databaseName]=g),z||(L[w.databaseName]=L[w.databaseName]||w);for(let D of Object.keys(L))this.data.columnsToAdd.push({table:n,column:L[D]});let re=this.buildBelongsToRelation(n,()=>s,m,l,void 0,o.onDelete,o.onUpdate),q=this.buildBelongsToRelation(n,o.model,p,d,void 0,o.onDelete,o.onUpdate),Oe=h.foreignKeys.find(D=>D.referencedTable===s.table&&D.columns.length===1&&D.columns[0]===m),lt=h.foreignKeys.find(D=>D.referencedTable===a.table&&D.columns.length===1&&D.columns[0]===p);if(!Oe){let D=h.foreignKeys.find(ce=>ce.referencedTable===s.table);D&&this.data.relationsToDrop.push({table:n,relation:D}),this.data.relationsToAdd.push(re);}if(!lt){let D=h.foreignKeys.find(ce=>ce.referencedTable===a.table);D&&this.data.relationsToDrop.push({table:n,relation:D}),this.data.relationsToAdd.push(q);}}}}async removeFkChurnByName(){let t=new Set;for(let o of this.data.relationsToAdd)t.add(o.table);for(let o of this.data.relationsToDrop)t.add(o.table);let e=new Map;for(let o of t){let n=await this.sql.getTableSchema(o),s=new Set((n.foreignKeys||[]).map(a=>a.name).filter(Boolean));e.set(o,s);}let r=new Map;for(let o of this.models){let n=o.getRelations(),s=new Set;for(let a of n){if(a.type!=="belongsTo")continue;let l=a.foreignKey||a.columnName,u=o.getColumns().find(m=>m.columnName===l)?.databaseName||l,c=S(a.constraintName)||k(o.table,u,a.model().table);s.add(c);}r.set(o.table,s);}this.data.relationsToAdd=await Promise.all(this.data.relationsToAdd.map(async o=>{let n=await this.sql.getTableSchema(o.table),s=this.models.find(g=>g.table===o.table),a=s?.getColumns()||[],l=o.relation.columnName;o.relation.type==="belongsTo"?l=a.find(w=>w.columnName===o.relation.foreignKey)?.databaseName||o.relation.foreignKey:l=a.find(w=>w.columnName===l)?.databaseName||l;let d=o.table,u=o.relation.foreignKey;if(o.relation.type==="belongsTo"){let g=o.relation.model();d=g.table;let w=g.primaryKey||"id";u=g.getColumns().find(P=>P.columnName===w)?.databaseName||w;}let c=new Set([l,o.relation.columnName].filter(Boolean)),m=n.foreignKeys.some(g=>{if(g.columns.length!==1||g.referencedColumns.length!==1)return false;let w=c.has(g.columns[0]),C=g.referencedTable===d,P=g.referencedColumns[0]===u;return w&&C&&P}),p=S(o.relation.constraintName)||k(o.table,l,d),h=e.get(o.table)||new Set;if(m||p&&h.has(p))return null;if(o.relation.type==="manyToMany"&&o.relation.manyToManyOptions){let g=S(o.relation.manyToManyOptions.throughModel),w=S(o.relation.manyToManyOptions.leftForeignKey),C=S(o.relation.manyToManyOptions.rightForeignKey),P=o.table===g&&o.relation.columnName===w&&o.relation.model().table===s?.table,j=o.table===g&&o.relation.columnName===C&&o.relation.model().table!==s?.table,z=await this.sql.getTableSchema(g),L=z.foreignKeys.some(q=>q.columns.length===1&&q.columns[0]===w&&q.referencedTable===(s?.table||"")),re=z.foreignKeys.some(q=>q.columns.length===1&&q.columns[0]===C&&q.referencedTable===o.relation.model().table);if(P&&L||j&&re)return null}return o})).then(o=>o.filter(Boolean)),this.data.relationsToDrop=await Promise.all(this.data.relationsToDrop.map(async o=>{let n=this.models.find(d=>d.table===o.table);if(!n)return o;let s=n.getRelations(),a=n.getColumns();return s.some(d=>{if(d.type!=="belongsTo")return false;let c=a.find(w=>w.columnName===d.foreignKey)?.databaseName||d.foreignKey,m=d.model(),p=m.primaryKey||"id",g=m.getColumns().find(w=>w.columnName===p)?.databaseName||p;return o.relation.columns.length===1&&o.relation.columns[0]===c&&o.relation.referencedTable===m.table&&o.relation.referencedColumns.length===1&&o.relation.referencedColumns[0]===g})?null:o})).then(o=>o.filter(Boolean));}clonePkAsColumn(t,e){return {columnName:e,databaseName:e,isPrimary:false,type:t.type,length:t.length,precision:t.precision,scale:t.scale,withTimezone:t.withTimezone,constraints:{nullable:false}}}pushM2mFkRelations(t){let e=this.buildBelongsToRelation(t.throughTable,()=>t.leftModel,t.leftFkName,t.leftModel.primaryKey||"id",t.constraintName,t.onDelete,t.onUpdate),r=this.buildBelongsToRelation(t.throughTable,()=>t.rightModel,t.rightFkName,t.rightModel.primaryKey||"id",t.constraintName,t.onDelete,t.onUpdate);this.data.relationsToAdd.push(e),this.data.relationsToAdd.push(r);}buildBelongsToRelation(t,e,r,o,n,s,a){let l=n?S(n):k(t,r,e().table);return {table:t,relation:{type:"belongsTo",model:e,columnName:r,foreignKey:r,constraintName:l,onDelete:s,onUpdate:a},onDelete:s,onUpdate:a}}};var ue=class extends T{constructor(e,r=false){super("delete from",r);this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.folder="delete";this.file="delete";this.fromNode=e;}};var v=class extends T{constructor(e,r){super("from");this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.folder="from";this.file="from";this.table=e,this.alias=r;}};var Q=class extends T{constructor(e,r=[],o,n=false,s=false){super("insert into",s);this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.folder="insert";this.file="insert";this.fromNode=e,this.records=r,this.returning=o,this.disableReturning=n;}};var X=class extends T{constructor(e,r,o,n="update",s,a=false){super("on duplicate",a);this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.folder="on_duplicate";this.file="on_duplicate";this.table=e,this.conflictColumns=r,this.columnsToUpdate=o,this.mode=n,this.returning=s;}};var H=class extends T{constructor(e,r=[],o=[],n=false){super("update",n);this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.folder="update";this.file="update";this.fromNode=e,this.columns=r,this.values=o;}};var R=class extends T{constructor(e,r,o=false,n,s,a=false){super("where",a);this.chainsWith="and";this.canKeywordBeSeenMultipleTimes=false;this.folder="where";this.file="where";this.column=e,this.chainsWith=` ${r}`,this.isNegated=o,this.operator=n,this.value=s;}};var Ge=class extends T{constructor(e,r="and"){super("where");this.canKeywordBeSeenMultipleTimes=false;this.folder="where";this.file="where_group";this.nodes=e,this.chainsWith=` ${r}`;}};var Y=class extends R{constructor(e,r,o=false,n,s,a=false){super(e,r,o,"=",s,a);this.file="where_json";this.jsonOperator=n,this.value=s;}};var ge=class extends T{constructor(e,r,o,n="and"){super("where");this.canKeywordBeSeenMultipleTimes=false;this.folder="where";this.file="where_subquery";this.column=e,this.operator=r,this.subquery=o,this.chainsWith=` ${n}`;}};var Jt=class extends stream.Readable{constructor(t,e,r=[],o){super({objectMode:true}),this.db=t,this.query=e,this.params=r,this.started=false,this.events=o;}_read(){this.started||(this.started=true,this.readRows());}readRows(){let t=0,e=false,r=false;this.db.each(this.query,this.params,(o,n)=>{if(o){r=true,this.emit("error",o);return}t++;let s=false,a,l={write:d=>{s=true,a=d;}};Promise.resolve(this.events.onData?.(l,n)).then(()=>{if(!r){if(s){this.push(a);return}this.push(n);}}).catch(d=>{r=true,this.emit("error",d);}).finally(()=>{t--,e&&t===0&&!r&&this.push(null);});},o=>{if(o){r=true,this.emit("error",o);return}e=true,t===0&&!r&&this.push(null);});}},Ml=(i,t,e,r)=>{let o=["begin","begin transaction","commit","rollback"].includes(i.trim().toLowerCase()),n=r.customConnection??e.getPool("sqlite");if(o)return new Promise((d,u)=>{n.run(i,t,function(c){c&&u(c),d(this.changes);});});if(r.mode==="fetch")return new Promise((d,u)=>{n.all(i,t,(c,m)=>{c&&u(c),(!m||!m.length)&&d([]),d(m);});});let s=r?.typeofModel;if(!s)return new Promise((d,u)=>{n.run(i,t,function(c){c?u(new Error(c.message)):d(this.changes);});});let a=s.primaryKey,l=s.table;if(r.mode==="insertOne"||r.mode==="insertMany"){if(r.mode==="insertOne")return new Promise((c,m)=>{n.run(i,t,function(p){if(p)return m(p);let h=r.models&&Array.isArray(r.models)&&r.models.length?r.models[0]:null;if(!a){c(h);return}let g=h?.[a]||this.lastID;if(!g)return m(new f("SqlRunnerUtils::promisifySqliteQuery","MODEL_HAS_NO_PRIMARY_KEY"));let w=`SELECT * FROM ${l} WHERE ${a} = ?`;n.get(w,[g],(C,P)=>{if(C)return m(C);c(P);});});});if(!Array.isArray(r.models))throw new f("SqlRunnerUtils::massiveInsert models should be an array, report to the maintainers.","DEVELOPMENT_ERROR");let d=r.models,u=[];return new Promise(async(c,m)=>{try{let p=d.map(async h=>{let g=new y(s),{columns:w,values:C}=await g.prepareColumns(Object.keys(h),Object.values(h),"insert"),P=Object.fromEntries(w.map((re,q)=>[re,C[q]])),j=new N(s,e.getDbType()),{sql:z,bindings:L}=j.parse([new Q(new v(s.table),[P])]);return new Promise((re,q)=>{n.run(z,L,function(Oe){if(Oe)return q(Oe);let lt=h[a]||this.lastID;if(!a){re(h);return}if(!lt)return q(new f("SqlRunnerUtils::promisifySqliteQuery","MODEL_HAS_NO_PRIMARY_KEY"));let D=`SELECT * FROM ${l} WHERE ${a} = ?`;n.get(D,[lt],(ce,ur)=>{if(ce)return q(ce);re(ur);});});})});u=await Promise.all(p),c(u);}catch(p){m(p);}})}return new Promise((d,u)=>{n.run(i,t,function(c){c?u(new Error(c.message)):d(this.changes);});})};var U=async(i,t,e,r="raw",o)=>{let n=e.type;switch(o?.shouldNotLog||Fe(i,e.logs,t),n){case "mysql":case "mariadb":let s=e.sqlConnection??e.getPool("mysql"),[a]=await ns(()=>s.query(i,t),e.inputDetails.connectionPolicies?.retry,e.logs);return r==="affectedRows"?a.affectedRows:a;case "postgres":case "cockroachdb":let l=e.sqlConnection??e.getPool("postgres"),d=await ns(()=>l.query(i,t),e.inputDetails.connectionPolicies?.retry,e.logs);return r==="raw"?d.rows:d.rowCount;case "sqlite":let u=await ns(()=>Ml(i,t,e,{typeofModel:o?.sqlLiteOptions?.typeofModel,mode:o?.sqlLiteOptions?.mode||"fetch",models:o?.sqlLiteOptions?.models}),e.inputDetails.connectionPolicies?.retry,e.logs);return r==="raw"?Array.isArray(u)?u:[u]:u;default:throw new f("ExecSql",`UNSUPPORTED_DATABASE_TYPE_${n}`)}},zt=async(i,t,e,r={},o)=>{let n=e.type;switch(n){case "mariadb":case "mysql":{let s=e.getPool("mysql"),a=e.sqlConnection??await s.getConnection(),l=new stream.PassThrough({objectMode:r.objectMode??true,highWaterMark:r.highWaterMark}),u=a.connection.query(i,t).stream({highWaterMark:r.highWaterMark,objectMode:r.objectMode??true}),c=0,m=false,p=false,h=()=>{try{a.release();}catch{}};return u.on("data",g=>{if(o.onData){c++,Promise.resolve(o.onData(l,g)).then(()=>{c--,m&&c===0&&!p&&(h(),l.end());}).catch(w=>{p=true,h(),l.destroy(w);});return}l.write(g);}),u.on("end",()=>{m=true,c===0&&!p&&(h(),l.end());}),u.on("error",g=>{p=true,h(),l.destroy(g);}),l.on("close",()=>{h();}),l}case "cockroachdb":case "postgres":{let s=e.sqlConnection??await e.getPool("postgres").connect(),a=await import('pg-query-stream').catch(()=>{throw new F("pg-query-stream")}),l=new stream.PassThrough({objectMode:r.objectMode||true,highWaterMark:r.highWaterMark}),d=new a.default(i,t,{highWaterMark:r.highWaterMark,rowMode:r.rowMode,batchSize:r.batchSize,types:r.types}),u=s.query(d),c=0,m=false,p=false,h=g=>{try{s.release(g);}catch{}};return u.on("data",g=>{if(o.onData){c++,Promise.resolve(o.onData(l,g)).then(()=>{c--,m&&c===0&&!p&&(h(),l.end());}).catch(w=>{p=true,h(w),l.destroy(w);});return}l.write(g);}),u.on("end",()=>{m=true,c===0&&!p&&(h(),l.end());}),u.on("error",g=>{p=true,h(g),l.destroy(g);}),l}case "sqlite":{let s=e.sqlConnection??e.getPool("sqlite");return new Jt(s,i,t,{onData:o.onData})}default:throw new f("ExecSqlStreaming",`UNSUPPORTED_DATABASE_TYPE_${n}`)}};async function ns(i,t={maxRetries:0,delay:0},e=false){let r=0,o=t.maxRetries||0,n=t.delay||0;async function s(){try{return i()}catch(a){if(!Object.prototype.hasOwnProperty.call(a,"code")||a.code!=="ECONNREFUSED")throw a;if(r<o)return r++,ls(`Retrying sql in ${n}ms (attempt ${r}/${o})`,"info",e),await new Promise(l=>setTimeout(l,n)),s();throw a}}return s()}var I=(i,t="millis",e=3)=>async(...r)=>{let o=performance.now(),n=await i(...r),s=performance.now()-o;return [(t==="millis"?s:s/1e3).toFixed(e),n]};var V=class extends T{constructor(e,r,o,n){super("select");this.chainsWith=", ";this.canKeywordBeSeenMultipleTimes=false;this.folder="select";this.file="select";this.column=e,this.alias=r,this.sqlFunction=o,this.isRawValue=n??false;}};var Ze=class{constructor(t,e,r){this.dbType=e,this.sqlDataSource=r,this.modelRelations=wt(t),this.modelRelationsMap=new Map(this.modelRelations.map(o=>[o.columnName,o]));}getRelationFromModel(t){let e=this.modelRelationsMap.get(t.toString());if(!e)throw new f("SqlModelManagerUtils::getRelationFromModel",`RELATION_NOT_FOUND_IN_MODEL_${t.toString()}`);return e}};function Gt(i,t,e){return {total:e,perPage:t,currentPage:i,firstPage:1,isEmpty:e===0,lastPage:Math.max(1,Math.ceil(e/t)),hasMorePages:i<Math.max(1,Math.ceil(e/t)),hasPages:e>t}}function _l(i,t){return {perPage:i,total:t,firstPage:1,isEmpty:t===0}}var ke=i=>typeof i=="number"?i:parseFloat(i);var De=class extends T{constructor(e,r,o=false,n,s,a=false){super("having",a);this.chainsWith="and";this.canKeywordBeSeenMultipleTimes=false;this.folder="having";this.file="having";this.column=e,this.chainsWith=`${r} `,this.isNegated=o,this.operator=n,this.value=s;}};var Zt=class extends T{constructor(){super("distinct");this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.folder="distinct";this.file="distinct";}};var Xt=class extends T{constructor(e){super("select");this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.folder="distinctOn";this.file="distinct_on";this.columns=e;}};var J=class extends T{constructor(e,r,o,n="inner",s,a=false){super(`${n} join`,a);this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=true;this.folder="join";this.file="join";this.type="inner";this.table=e,this.left=r,this.right=o,this.on=s;}};var Xe=class extends T{constructor(e,r=false){super("group by",r);this.chainsWith=", ";this.canKeywordBeSeenMultipleTimes=false;this.folder="group_by";this.file="group_by";this.column=e;}};var er=class extends T{constructor(e){super("limit");this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.folder="limit";this.file="limit";this.limit=e;}};var tr=class extends T{constructor(e){super("offset");this.chainsWith=" ";this.canKeywordBeSeenMultipleTimes=false;this.folder="offset";this.file="offset";this.offset=e;}};var et=class extends T{constructor(e,r="asc",o=false){super("order by",o);this.chainsWith=", ";this.canKeywordBeSeenMultipleTimes=false;this.folder="order_by";this.file="order_by";this.column=e,this.direction=r;}};var rr=class{constructor(t,e){this.model=t,this.sqlDataSource=e,this.groupByNodes=[],this.orderByNodes=[],this.limitNode=null,this.offsetNode=null,this.logs=this.sqlDataSource.logs;let r=this.model?.getColumns;this.modelColumns=typeof r=="function"?r.call(this.model):[],this.modelColumnsMap=new Map(this.modelColumns.map(o=>[o.columnName,o]));}clearGroupBy(){return this.groupByNodes=[],this}clearOrderBy(){return this.orderByNodes=[],this}clearLimit(){return this.limitNode=null,this}clearOffset(){return this.offsetNode=null,this}groupBy(...t){return t.forEach(e=>{this.groupByNodes.push(new Xe(e));}),this}groupByRaw(t){return this.groupByNodes.push(new Xe(t,true)),this}orderBy(t,e){return this.orderByNodes.push(new et(t,e)),this}orderByRaw(t){return this.orderByNodes.push(new et(t,"asc",true)),this}limit(t){return typeof t!="number"&&b.warn(`${this.model.name}::limit Non numeric value provided to \`limit\``),this.limitNode=new er(t),this}offset(t){return typeof t!="number"&&b.warn(`${this.model.name}::offset Non numeric value provided to \`offset\``),this.offsetNode=new tr(t),this}};var or=class extends rr{constructor(t,e){super(t,e),this.joinNodes=[];}clearJoin(){return this.joinNodes=[],this}joinRaw(t){return this.joinNodes.push(new J(t,"","","inner",{operator:"="},true)),this}leftJoinRaw(t){return this.joinNodes.push(new J(t,"","","left",{operator:"="},true)),this}rightJoinRaw(t){return this.joinNodes.push(new J(t,"","","right",{operator:"="},true)),this}fullJoinRaw(t){return this.joinNodes.push(new J(t,"","","full",{operator:"="},true)),this}crossJoinRaw(t){return this.joinNodes.push(new J(t,"","","cross",{operator:"="},true)),this}naturalJoinRaw(t){return this.joinNodes.push(new J(t,"","","natural",{operator:"="},true)),this}innerJoin(t,e,r,o){let n=r,s=o;if(!n){if(!this.model.primaryKey)throw new f("JoinQueryBuilder::join","MODEL_HAS_NO_PRIMARY_KEY");n=`${this.model.table}.${this.model.primaryKey}`;}return this.join(typeof t=="string"?t:t.table,e,n,s),this}join(t,e,r,o){let n=r,s=o;if(!n){if(!this.model.primaryKey)throw new f("JoinQueryBuilder::join","MODEL_HAS_NO_PRIMARY_KEY");n=`${this.model.table}.${this.model.primaryKey}`;}return this.joinNodes.push(new J(typeof t=="string"?t:t.table,e,n,"inner",{operator:s||"="})),this}leftJoin(t,e,r,o){let n=r,s=o;if(!n){if(!this.model.primaryKey)throw new f("JoinQueryBuilder::join","MODEL_HAS_NO_PRIMARY_KEY");n=`${this.model.table}.${this.model.primaryKey}`;}return this.joinNodes.push(new J(typeof t=="string"?t:t.table,e,n,"left",{operator:s||"="})),this}rightJoin(t,e,r,o){let n=r,s=o;if(!n){if(!this.model.primaryKey)throw new f("JoinQueryBuilder::join","MODEL_HAS_NO_PRIMARY_KEY");n=`${this.model.table}.${this.model.primaryKey}`;}return this.joinNodes.push(new J(typeof t=="string"?t:t.table,e,n,"right",{operator:s||"="})),this}fullJoin(t,e,r,o){let n=r,s=o;if(!n){if(!this.model.primaryKey)throw new f("JoinQueryBuilder::join","MODEL_HAS_NO_PRIMARY_KEY");n=`${this.model.table}.${this.model.primaryKey}`;}return this.joinNodes.push(new J(typeof t=="string"?t:t.table,e,n,"full",{operator:s||"="})),this}};var nr=class extends or{constructor(e,r){super(e,r);this.modelSelectedColumns=[];this.modelAnnotatedColumns=[];this.dbType=r.getDbType(),this.fromNode=new v(this.model.table||""),this.distinctNode=null,this.distinctOnNode=null,this.selectNodes=[];}select(...e){return this.modelSelectedColumns=[...this.modelSelectedColumns,...e],e.map(o=>O(o,this.model.databaseCaseConvention)).forEach(o=>{this.selectNodes.push(new V(o));}),this}selectRaw(e){return this.selectNodes.push(new V(e,void 0,void 0,true)),this}clearSelect(){return this.modelSelectedColumns=[],this.selectNodes=[],this}clearFrom(){return this.fromNode=new v(this.model.table||""),this}clearDistinct(){return this.distinctNode=null,this}clearDistinctOn(){return this.distinctOnNode=null,this}annotate(e,r,o){let n,s,a;return o?(n=e,s=r,a=o):(n=void 0,s=e,a=r),this.selectNodes.push(new V(s,a,n)),this.modelAnnotatedColumns.push(a),this}from(e){return this.fromNode=new v(e),this}table(e){return this.fromNode=new v(e),this}distinct(){return this.distinctNode=new Zt,this}distinctOn(...e){return this.distinctOnNode=new Xt(e),this}};var sr=class extends nr{constructor(e,r,o=false){super(e,r);this.isNestedCondition=false;this.whereNodes=[],this.havingNodes=[],this.isNestedCondition=o;}clearWhere(){return this.whereNodes=[],this}clearHaving(){return this.havingNodes=[],this}strictWhen(e,r){return e==null?this:(r(this),this)}when(e,r){return e?(r(this),this):this}where(e,r,o){return typeof e=="function"?this.andWhereGroup(e):typeof r=="function"&&o===void 0?this.andWhereSubQuery(e,"in",r):r instanceof _&&o===void 0?this.andWhereSubQuery(e,"in",r):typeof r=="string"&&r!=="="&&o!==void 0&&(o instanceof _||typeof o=="function")?this.andWhereSubQuery(e,r,o):this.andWhere(e,r,o)}andWhere(e,r,o){if(typeof e=="function")return this.andWhereGroup(e);if(typeof r=="function"&&o===void 0)return this.andWhereSubQuery(e,"in",r);if(r instanceof _&&o===void 0)return this.andWhereSubQuery(e,"in",r);if(typeof r=="string"&&r!=="="&&o!==void 0&&(o instanceof _||typeof o=="function"))return this.andWhereSubQuery(e,r,o);let n="=",s;return typeof r=="string"&&o!==void 0&&!(o instanceof _)&&typeof o!="function"?(n=r,s=o):(s=r,n="="),this.whereNodes.push(new R(e,"and",false,n,s)),this}orWhere(e,r,o){if(typeof e=="function")return this.orWhereGroup(e);if(typeof r=="function"&&o===void 0)return this.orWhereSubQuery(e,"in",r);if(r instanceof _&&o===void 0)return this.orWhereSubQuery(e,"in",r);if(typeof r=="string"&&r!=="="&&o!==void 0&&(o instanceof _||typeof o=="function"))return this.orWhereSubQuery(e,r,o);let n="=",s;return typeof r=="string"&&o!==void 0&&!(o instanceof _)&&typeof o!="function"?(n=r,s=o):(s=r,n="="),this.whereNodes.push(new R(e,"or",false,n,s)),this}whereNot(e,r,o){if(typeof r=="function"&&o===void 0)return this.andWhereSubQuery(e,"not in",r);if(r instanceof _&&o===void 0)return this.andWhereSubQuery(e,"not in",r);if(typeof r=="string"&&o!==void 0&&(o instanceof _||typeof o=="function"))return this.andWhereSubQuery(e,r,o);let n="=",s;return typeof r=="string"&&o!==void 0&&!(o instanceof _)&&typeof o!="function"?(n=r,s=o):(s=r,n="="),this.whereNodes.push(new R(e,"and",true,n,s)),this}andWhereNot(e,r,o){if(typeof r=="function"&&o===void 0)return this.andWhereSubQuery(e,"not in",r);if(r instanceof _&&o===void 0)return this.andWhereSubQuery(e,"not in",r);if(typeof r=="string"&&o!==void 0&&(o instanceof _||typeof o=="function"))return this.andWhereSubQuery(e,r,o);let n="=",s;return typeof r=="string"&&o!==void 0&&!(o instanceof _)&&typeof o!="function"?(n=r,s=o):(s=r,n="="),this.whereNodes.push(new R(e,"and",true,n,s)),this}orWhereNot(e,r,o){if(typeof r=="function"&&o===void 0)return this.orWhereSubQuery(e,"not in",r);if(r instanceof _&&o===void 0)return this.orWhereSubQuery(e,"not in",r);if(typeof r=="string"&&o!==void 0&&(o instanceof _||typeof o=="function"))return this.orWhereSubQuery(e,r,o);let n="=",s;return typeof r=="string"&&o!==void 0&&!(o instanceof _)&&typeof o!="function"?(n=r,s=o):(s=r,n="="),this.whereNodes.push(new R(e,"or",true,n,s)),this}whereBetween(e,r,o){return this.andWhereBetween(e,r,o)}andWhereBetween(e,r,o){return this.whereNodes.push(new R(e,"and",false,"between",[r,o])),this}orWhereBetween(e,r,o){return this.whereNodes.push(new R(e,"or",false,"between",[r,o])),this}whereNotBetween(e,r,o){return this.andWhereNotBetween(e,r,o)}andWhereNotBetween(e,r,o){return this.whereNodes.push(new R(e,"and",true,"between",[r,o])),this}orWhereNotBetween(e,r,o){return this.whereNodes.push(new R(e,"or",true,"between",[r,o])),this}whereLike(e,r){return this.andWhereLike(e,r)}andWhereLike(e,r){return this.where(e,"like",r),this}orWhereLike(e,r){return this.orWhere(e,"like",r),this}whereILike(e,r){return this.andWhereILike(e,r)}andWhereILike(e,r){return this.where(e,"ilike",r),this}orWhereILike(e,r){return this.orWhere(e,"ilike",r),this}whereNotLike(e,r){return this.andWhereNotLike(e,r)}andWhereNotLike(e,r){return this.where(e,"not like",r),this}orWhereNotLike(e,r){return this.orWhere(e,"not like",r),this}whereNotILike(e,r){return this.andWhereNotILike(e,r)}andWhereNotILike(e,r){return this.where(e,"not ilike",r),this}orWhereNotILike(e,r){return this.orWhere(e,"not ilike",r),this}whereIn(e,r){return this.andWhereIn(e,r)}andWhereIn(e,r){return Array.isArray(r)?r.length?(this.whereNodes.push(new R(e,"and",false,"in",r)),this):(this.whereNodes.push(new R("false","and",true,"=",[],true)),this):this.andWhereSubQuery(e,"in",r)}orWhereIn(e,r){return Array.isArray(r)?r.length?(this.whereNodes.push(new R(e,"or",false,"in",r)),this):(this.whereNodes.push(new R("false","or",true,"=",[],true)),this):this.orWhereSubQuery(e,"in",r)}whereNotIn(e,r){return this.andWhereNotIn(e,r)}andWhereNotIn(e,r){return Array.isArray(r)?r.length?(this.whereNodes.push(new R(e,"and",true,"in",r)),this):(this.whereNodes.push(new R("true","and",true,"=",[],true)),this):this.andWhereSubQuery(e,"not in",r)}orWhereNotIn(e,r){return Array.isArray(r)?r.length?(this.whereNodes.push(new R(e,"or",true,"in",r)),this):(this.whereNodes.push(new R("true","or",true,"=",[],true)),this):this.orWhereSubQuery(e,"not in",r)}whereNull(e){return this.andWhereNull(e)}andWhereNull(e){return this.whereNodes.push(new R(e,"and",false,"is null",void 0)),this}orWhereNull(e){return this.whereNodes.push(new R(e,"or",false,"is null",void 0)),this}whereNotNull(e){return this.andWhereNotNull(e)}andWhereNotNull(e){return this.whereNodes.push(new R(e,"and",false,"is not null",void 0)),this}orWhereNotNull(e){return this.whereNodes.push(new R(e,"or",false,"is not null",void 0)),this}whereRegexp(e,r){return this.andWhereRegexp(e,r)}andWhereRegexp(e,r){let o=this.sqlDataSource.getDbType()==="postgres"||this.sqlDataSource.getDbType()==="cockroachdb";return this.whereNodes.push(new R(e,"and",false,o?"~":"regexp",r.source)),this}orWhereRegexp(e,r){let o=this.sqlDataSource.getDbType()==="postgres"||this.sqlDataSource.getDbType()==="cockroachdb";return this.whereNodes.push(new R(e,"or",false,o?"~":"regexp",r.source)),this}whereNotRegexp(e,r){let o=this.sqlDataSource.getDbType()==="postgres";return this.whereNodes.push(new R(e,"and",true,o?"~":"regexp",r.source)),this}andWhereNotRegexp(e,r){let o=this.sqlDataSource.getDbType()==="postgres";return this.whereNodes.push(new R(e,"and",true,o?"~":"regexp",r.source)),this}orWhereNotRegexp(e,r){let o=this.sqlDataSource.getDbType()==="postgres";return this.whereNodes.push(new R(e,"or",true,o?"~":"regexp",r.source)),this}whereExists(e){return this.andWhereExists(e)}andWhereExists(e){let r=e instanceof _?e:new _(this.model,this.sqlDataSource);return r.isNestedCondition=true,typeof e=="function"&&e(r),this.whereNodes.push(new ge("","exists",r.extractQueryNodes(),"and")),this}orWhereExists(e){let r=e instanceof _?e:new _(this.model,this.sqlDataSource);return r.isNestedCondition=true,typeof e=="function"&&e(r),this.whereNodes.push(new ge("","exists",r.extractQueryNodes(),"or")),this}whereNotExists(e){return this.andWhereNotExists(e)}andWhereNotExists(e){let r=e instanceof _?e:new _(this.model,this.sqlDataSource);return r.isNestedCondition=true,typeof e=="function"&&e(r),this.whereNodes.push(new ge("","not exists",r.extractQueryNodes(),"and")),this}orWhereNotExists(e){let r=e instanceof _?e:new _(this.model,this.sqlDataSource);return r.isNestedCondition=true,typeof e=="function"&&e(r),this.whereNodes.push(new ge("","not exists",r.extractQueryNodes(),"or")),this}whereRaw(e,r=[]){return this.andWhereRaw(e,r)}andWhereRaw(e,r=[]){return this.whereNodes.push(new R(e,"and",false,"=",r,true)),this}orWhereRaw(e,r=[]){return this.whereNodes.push(new R(e,"or",false,"=",r,true)),this}having(e,r,o){return this.andHaving(e,r,o)}andHaving(e,r,o){let n="=",s;return typeof r=="string"&&o?(n=r,s=o):(s=r,n="="),this.havingNodes.push(new De(e,"and",false,n,s)),this}orHaving(e,r,o){let n="=",s;return typeof r=="string"&&o?(n=r,s=o):(s=r,n="="),this.havingNodes.push(new De(e,"or",false,n,s)),this}havingRaw(e){return this.andHavingRaw(e)}andHavingRaw(e){return this.havingNodes.push(new De(e,"and",false,"=",[],true)),this}orHavingRaw(e){return this.havingNodes.push(new De(e,"or",false,"=",[],true)),this}buildSubQuery(e){if(e instanceof _)return e;let r=new _(this.model,this.sqlDataSource);return e(r),r}andWhereSubQuery(e,r,o){let n=this.buildSubQuery(o);return this.whereNodes.push(new ge(e,r,n.extractQueryNodes(),"and")),this}orWhereSubQuery(e,r,o){let n=this.buildSubQuery(o);return this.whereNodes.push(new ge(e,r,n.extractQueryNodes(),"or")),this}andWhereGroup(e){let r=new _(this.model,this.sqlDataSource);r.isNestedCondition=true,e(r);let o=new Ge(r.whereNodes,"and");return this.whereNodes.push(o),this}orWhereGroup(e){let r=new _(this.model,this.sqlDataSource);r.isNestedCondition=true,e(r);let o=new Ge(r.whereNodes,"or");return this.whereNodes.push(o),this}};var ir=class extends sr{whereJson(t,e){return this.andWhereJson(t,e)}andWhereJson(t,e){return this.whereNodes.push(new Y(t,"and",false,"contains",e)),this}orWhereJson(t,e){return this.whereNodes.push(new Y(t,"or",false,"contains",e)),this}whereJsonNotContains(t,e){return this.andWhereJsonNotContains(t,e)}andWhereJsonNotContains(t,e){return this.whereNodes.push(new Y(t,"and",true,"not contains",e)),this}orWhereJsonNotContains(t,e){return this.whereNodes.push(new Y(t,"or",true,"not contains",e)),this}whereJsonContains(t,e){return this.andWhereJsonContains(t,e)}andWhereJsonContains(t,e){return this.whereNodes.push(new Y(t,"and",false,"contains",e)),this}orWhereJsonContains(t,e){return this.whereNodes.push(new Y(t,"or",false,"contains",e)),this}whereNotJson(t,e){return this.andWhereNotJson(t,e)}andWhereNotJson(t,e){return this.whereNodes.push(new Y(t,"and",true,"not contains",e)),this}orWhereNotJson(t,e){return this.whereNodes.push(new Y(t,"or",true,"not contains",e)),this}whereJsonRaw(t,e){return this.andWhereJsonRaw(t,e)}andWhereJsonRaw(t,e){return this.whereNodes.push(new Y(t,"and",false,"raw",e)),this}orWhereJsonRaw(t,e){return this.whereNodes.push(new Y(t,"or",false,"raw",e)),this}};var _=class i extends ir{constructor(e,r=Ne.getInstance()){super(e,r);this.isNestedCondition=false;this.mustRemoveAnnotations=false;this.insertNode=null;this.onDuplicateNode=null;this.updateNode=null;this.deleteNode=null;this.truncateNode=null;this.performance={many:this.manyWithPerformance.bind(this),one:this.oneWithPerformance.bind(this),oneOrFail:this.oneOrFailWithPerformance.bind(this),first:this.firstWithPerformance.bind(this),firstOrFail:this.firstOrFailWithPerformance.bind(this),paginate:this.paginateWithPerformance.bind(this),paginateWithCursor:this.paginateWithCursorWithPerformance.bind(this),exists:this.existsWithPerformance.bind(this),truncate:this.truncateWithPerformance.bind(this),delete:this.deleteWithPerformance.bind(this),insert:this.insertWithPerformance.bind(this),insertMany:this.insertManyWithPerformance.bind(this),update:this.updateWithPerformance.bind(this),softDelete:this.softDeleteWithPerformance.bind(this),pluck:this.pluckWithPerformance.bind(this)};this.dbType=r.getDbType(),this.isNestedCondition=false,this.model=e,this.unionNodes=[],this.lockQueryNodes=[],this.withNodes=[],this.astParser=new N(this.model,this.dbType),this.interpreterUtils=new y(this.model);}async exists(){return !!await this.one()}async many(){let{sql:e,bindings:r}=this.unWrap();return U(e,r,this.sqlDataSource,"raw",{sqlLiteOptions:{typeofModel:this.model,mode:"fetch"}})}async pluck(e){return (await this.many()).map(o=>o[e])}async one(){let e=await this.limit(1).many();return !e||!e.length?null:e[0]}async first(){return this.one()}async oneOrFail(){let e=await this.one();if(!e)throw new f("SqlDataSource::query::oneOrFail","ROW_NOT_FOUND");return e}async firstOrFail(){return this.oneOrFail()}async stream(e={}){let{sql:r,bindings:o}=this.unWrap();return await zt(r,o,this.sqlDataSource,e,{onData:(s,a)=>{s.write(a);}})}async*chunk(e){let r=0;for(;;){let o=await this.limit(e).offset(r).many();if(!o.length)break;r+=o.length,yield o;}}async paginateWithCursor(e,r,o){let n=this.clone();this.orderByNodes.length||this.orderBy(r.discriminator,r.orderBy||"asc"),o&&this.where(o.key,r.operator||">",o.value),this.limit(e);let s=await this.many(),a=await n.getCount(),l=s[s.length-1],d=l?l[r.discriminator]:null;return [{paginationMetadata:_l(e,a),data:s},{key:r.discriminator,value:d}]}selectSubQuery(e,r){if(typeof e=="function"){let o=new i(this.model,this.sqlDataSource);return e(o),this.selectNodes.push(new V(o.extractQueryNodes(),r)),this}return this.selectNodes.push(new V(e.extractQueryNodes(),r)),this}lockForUpdate(e={}){return this.lockQueryNodes.push(new ze("for_update",e.skipLocked,e.noWait)),this}forShare(e={}){return this.lockQueryNodes.push(new ze("for_share",e.skipLocked,e.noWait)),this}union(e){if(typeof e=="string")return this.unionNodes.push(new xe(e)),this;let o=(e instanceof i?e:e(new i(this.model,this.sqlDataSource))).extractQueryNodes();return this.unionNodes.push(new xe(o)),this}unionAll(e){if(typeof e=="string")return this.unionNodes.push(new xe(e,true)),this;let o=(e instanceof i?e:e(new i(this.model,this.sqlDataSource))).extractQueryNodes();return this.unionNodes.push(new xe(o,true)),this}async increment(e,r=1){return this.update({[e]:this.sqlDataSource.rawStatement(`${e} + ${r}`)})}async decrement(e,r=1){return this.update({[e]:this.sqlDataSource.rawStatement(`${e} - ${r}`)})}async getCount(e="*"){this.clearForFunctions(),this.annotate("count",e,"total");let r=await this.one();return r?ke(r.total):0}async getMax(e){this.clearForFunctions(),this.annotate("max",e,"total");let r=await this.one();return r?ke(r.total):0}async getMin(e){this.clearForFunctions(),this.annotate("min",e,"total");let r=await this.one();return r?ke(r.total):0}async getAvg(e){this.clearForFunctions(),this.annotate("avg",e,"total");let r=await this.one();return r?ke(r.total):0}async getSum(e){this.clearForFunctions(),this.annotate("sum",e,"total");let r=await this.one();return r?ke(r.total):0}async paginate(e,r){(typeof e!="number"||typeof r!="number")&&b.warn(`${this.model.name}::paginate Non numeric values provided to \`paginate\``);let o=this.clone(),[n,s]=await Promise.all([this.limit(r).offset((e-1)*r).many(),o.getCount("*")]);return {paginationMetadata:Gt(e,r,s),data:n}}from(e,r){if(typeof e=="function"){if(!r)throw new f("QueryBuilder::from","MISSING_ALIAS_FOR_SUBQUERY");let o=new i(this.model,this.sqlDataSource);e(o);let n=o.extractQueryNodes();return this.fromNode=new v(n,r),this}return this.fromNode=new v(e,r),this}with(e,r){let o=new i(this.model,this.sqlDataSource);r(o);let n=o.extractQueryNodes();return this.withNodes.push(new Qe("normal",e,n)),this}withRecursive(e,r){let o=new i(this.model,this.sqlDataSource);r(o);let n=o.extractQueryNodes();return this.withNodes.push(new Qe("recursive",e,n)),this}withMaterialized(e,r){if(this.dbType!=="postgres"&&this.dbType!=="cockroachdb")throw new f("QueryBuilder::withMaterialized","MATERIALIZED_CTE_NOT_SUPPORTED",new Error("MATERIALIZED CTE is only supported by postgres"));let o=new i(this.model,this.sqlDataSource);r(o);let n=o.extractQueryNodes();return this.withNodes.push(new Qe("materialized",e,n)),this}async insert(e,r){let{columns:o,values:n}=await this.interpreterUtils.prepareColumns(Object.keys(e),Object.values(e),"insert"),s=Object.fromEntries(o.map((u,c)=>[u,n[c]]));this.insertNode=new Q(this.fromNode,[s],r);let{sql:a,bindings:l}=this.astParser.parse([this.insertNode]),d=await U(a,l,this.sqlDataSource,"raw",{sqlLiteOptions:{typeofModel:this.model,mode:"insertOne",models:[e]}});return Array.isArray(d)&&d.length?d[0]:d}async insertMany(e,r){if(!e.length)return [];let o=await Promise.all(e.map(async a=>{let{columns:l,values:d}=await this.interpreterUtils.prepareColumns(Object.keys(a),Object.values(a),"insert");return Object.fromEntries(l.map((u,c)=>[u,d[c]]))}));this.insertNode=new Q(this.fromNode,o,r);let{sql:n,bindings:s}=this.astParser.parse([this.insertNode]);return U(n,s,this.sqlDataSource,"raw",{sqlLiteOptions:{typeofModel:this.model,mode:"insertMany",models:o}})}async upsert(e,r,o={updateOnConflict:true}){let n=Object.keys(e),s=Object.keys(r),{columns:a,values:l}=await this.interpreterUtils.prepareColumns(Object.keys(e),Object.values(e),"insert"),d=Object.fromEntries(a.map((p,h)=>[p,l[h]])),{sql:u,bindings:c}=this.astParser.parse([new Q(new v(this.model.table),[d],void 0,true),new X(this.model.table,s,n,o.updateOnConflict??true?"update":"ignore",o.returning)]),m=await U(u,c,this.sqlDataSource,"raw",{sqlLiteOptions:{typeofModel:this.model,mode:"raw",models:[e]}});return Array.isArray(m)?m:[m]}async upsertMany(e,r,o,n={updateOnConflict:true}){let s=[];await Promise.all(o.map(async u=>{let{columns:c,values:m}=await this.interpreterUtils.prepareColumns(Object.keys(u),Object.values(u),"insert"),p=Object.fromEntries(c.map((h,g)=>[h,m[g]]));s.push(p);}));let{sql:a,bindings:l}=this.astParser.parse([new Q(new v(this.model.table),s,void 0,true),new X(this.model.table,e,r,n.updateOnConflict??true?"update":"ignore",n.returning)]),d=await U(a,l,this.sqlDataSource,"raw",{sqlLiteOptions:{typeofModel:this.model,mode:"raw",models:o}});return Array.isArray(d)?d:[d]}async update(e){let r=Object.keys(e),o=Object.values(e),{columns:n,values:s}=await this.interpreterUtils.prepareColumns(r,o,"update");this.updateNode=new H(this.fromNode,n,s);let{sql:a,bindings:l}=this.astParser.parse([this.updateNode,...this.whereNodes,...this.joinNodes]);return U(a,l,this.sqlDataSource,"affectedRows",{sqlLiteOptions:{typeofModel:this.model,mode:"affectedRows"}})}async truncate(){this.truncateNode=new me(this.fromNode);let{sql:e,bindings:r}=this.astParser.parse([this.truncateNode]);await U(e,r,this.sqlDataSource,"raw");}async delete(){this.deleteNode=new ue(this.fromNode);let{sql:e,bindings:r}=this.astParser.parse([this.deleteNode,...this.whereNodes,...this.joinNodes]);return U(e,r,this.sqlDataSource,"affectedRows",{sqlLiteOptions:{typeofModel:this.model,mode:"affectedRows"}})}async softDelete(e={}){let{column:r="deletedAt",value:o=ne()}=e||{},{columns:n,values:s}=await this.interpreterUtils.prepareColumns([r],[o],"update");this.updateNode=new H(this.fromNode,n,s);let{sql:a,bindings:l}=this.astParser.parse([this.updateNode,...this.whereNodes,...this.joinNodes]);return U(a,l,this.sqlDataSource,"affectedRows",{sqlLiteOptions:{typeofModel:this.model,mode:"affectedRows"}})}toQuery(){let{sql:e,bindings:r}=this.unWrap();return Ts(e,r)}unWrap(){this.selectNodes.length||(this.selectNodes=[new V("*")]);let{sql:e,bindings:r}=this.astParser.parse(this.extractQueryNodes()),o=Tt(this.sqlDataSource,e);return {sql:this.withQuery?`${this.withQuery} ${o}`:o,bindings:[...r||[]]}}clone(){let e=new i(this.model,this.sqlDataSource);return e.dbType=this.dbType,e.modelSelectedColumns=E(this.modelSelectedColumns),e.modelAnnotatedColumns=E(this.modelAnnotatedColumns),e.distinctNode=E(this.distinctNode),e.distinctOnNode=E(this.distinctOnNode),e.selectNodes=E(this.selectNodes),e.withQuery=E(this.withQuery),e.joinNodes=E(this.joinNodes),e.whereNodes=E(this.whereNodes),e.groupByNodes=E(this.groupByNodes),e.havingNodes=E(this.havingNodes),e.orderByNodes=E(this.orderByNodes),e.lockQueryNodes=E(this.lockQueryNodes),e.unionNodes=E(this.unionNodes),e.withNodes=E(this.withNodes),e.fromNode=E(this.fromNode),e.limitNode=E(this.limitNode),e.offsetNode=E(this.offsetNode),e.isNestedCondition=this.isNestedCondition,e.mustRemoveAnnotations=this.mustRemoveAnnotations,e}clear(){let e=new i(this.model,this.sqlDataSource);return this.fromNode.alias&&e.from(e.model.table,this.fromNode.alias),e}clearLockQuery(){return this.lockQueryNodes=[],this}clearUnionQuery(){return this.unionNodes=[],this}clearWithQuery(){return this.withNodes=[],this}extractQueryNodes(){return this.selectNodes.length||(this.selectNodes=[new V("*")]),this.insertNode?[this.insertNode,this.onDuplicateNode].filter(Boolean):this.updateNode?[this.updateNode,...this.whereNodes,...this.joinNodes,...this.orderByNodes,this.limitNode].filter(Boolean):this.deleteNode?[this.deleteNode,...this.whereNodes,...this.joinNodes,...this.orderByNodes,this.limitNode].filter(Boolean):this.truncateNode?[this.truncateNode]:[...this.withNodes,this.distinctNode,this.distinctOnNode,...this.selectNodes,this.fromNode,...this.joinNodes,...this.whereNodes,...this.groupByNodes,...this.havingNodes,...this.orderByNodes,this.limitNode,this.offsetNode,...this.lockQueryNodes,...this.unionNodes].filter(Boolean)}clearForFunctions(){return this.clearSelect(),this.clearGroupBy(),this.clearOrderBy(),this.clearLimit(),this.clearOffset(),this}async manyWithPerformance(e="millis"){let[r,o]=await I(this.many.bind(this),e)();return {data:o,time:Number(r)}}async oneWithPerformance(e="millis"){let[r,o]=await I(this.one.bind(this),e)();return {data:o,time:Number(r)}}async firstWithPerformance(e="millis"){return this.oneWithPerformance(e)}async firstOrFailWithPerformance(e="millis"){return this.oneOrFailWithPerformance(e)}async paginateWithPerformance(e,r,o="millis"){let[n,s]=await I(this.paginate.bind(this,e,r),o)();return {data:s,time:Number(n)}}async paginateWithCursorWithPerformance(e,r,o,n="millis"){let[s,a]=await I(this.paginateWithCursor.bind(this,e,r,o),n)();return {data:a,time:Number(s)}}async oneOrFailWithPerformance(e="millis"){let[r,o]=await I(this.oneOrFail.bind(this),e)();return {data:o,time:Number(r)}}async existsWithPerformance(e="millis"){let[r,o]=await I(this.exists.bind(this),e)();return {data:o,time:Number(r)}}async pluckWithPerformance(e,r="millis"){let[o,n]=await I(this.pluck.bind(this,e),r)();return {data:n,time:Number(o)}}async updateWithPerformance(e,r="millis"){let[o,n]=await I(this.update.bind(this,e),r)();return {data:n,time:Number(o)}}async insertWithPerformance(e,r="millis"){let[o,n]=await I(this.insert.bind(this,e),r)();return {data:n,time:Number(o)}}async insertManyWithPerformance(e,r="millis"){let[o,n]=await I(this.insertMany.bind(this,e),r)();return {data:n,time:Number(o)}}async softDeleteWithPerformance(e={},r="millis"){let[o,n]=await I(this.softDelete.bind(this,e),r)();return {data:n,time:Number(o)}}async deleteWithPerformance(e="millis"){let[r,o]=await I(this.delete.bind(this),e)();return {data:o,time:Number(r)}}async truncateWithPerformance(e="millis"){let[r,o]=await I(this.truncate.bind(this),e)();return {data:o,time:Number(r)}}};var Ue=class i extends _{constructor(e,r){super(e,r);this.performance={many:this.manyWithPerformance.bind(this),one:this.oneWithPerformance.bind(this),oneOrFail:this.oneOrFailWithPerformance.bind(this),first:this.firstWithPerformance.bind(this),firstOrFail:this.firstOrFailWithPerformance.bind(this),paginate:this.paginateWithPerformance.bind(this),exists:this.existsWithPerformance.bind(this),paginateWithCursor:this.paginateWithCursorWithPerformance.bind(this),truncate:this.truncateWithPerformance.bind(this),delete:this.deleteWithPerformance.bind(this),update:this.updateWithPerformance.bind(this),softDelete:this.softDeleteWithPerformance.bind(this),pluck:this.pluckWithPerformance.bind(this)};this.sqlModelManagerUtils=new Ze(e,this.dbType,r),this.relationQueryBuilders=[],this.modelSelectedColumns=[],this.modelColumnsMap=new Map,this.modelColumnsDatabaseNames=new Map,this.model.getColumns().forEach(n=>{this.modelColumnsMap.set(n.databaseName,n),this.modelColumnsDatabaseNames.set(n.databaseName,n.columnName);});}get isRelationQueryBuilder(){return !!this.relation}static from(e,r={}){return r.connection?new i(e,r.connection):r.trx?new i(e,r.trx.sql):new i(e,e.sqlInstance)}async one(e={}){let r=await this.limit(1).many(e);return !r||!r.length?null:r[0]}async first(e){return this.one(e)}async oneOrFail(e){let r=await this.one(e);if(!r)throw new f(this.model.name+"::oneOrFail","ROW_NOT_FOUND");return r}async firstOrFail(e){return this.oneOrFail(e)}async many(e={}){!e.ignoreHooks?.includes("beforeFetch")&&await this.model.beforeFetch?.(this);let o=(await super.many()).map(a=>this.addAdditionalColumnsToModel(a,this.model));if(!o.length)return [];let n=await se(o,this.model,this.modelSelectedColumns,this.modelAnnotatedColumns,this.mustRemoveAnnotations);if(!n)return [];let s=Array.isArray(n)?n:[n];return e.ignoreHooks?.includes("afterFetch")||await this.model.afterFetch?.(s),this.relationQueryBuilders.length&&await this.processRelationsRecursively(s),s}async*chunk(e,r={}){let o=0;for(;;){let n=await this.limit(e).offset(o).many(r);if(!n.length)break;yield n,o+=n.length;}}async stream(e={}){!e.ignoreHooks?.includes("beforeFetch")&&await this.model.beforeFetch?.(this);let{sql:r,bindings:o}=this.unWrap();return await zt(r,o,this.sqlDataSource,e,{onData:async(s,a)=>{let l=this.addAdditionalColumnsToModel(a,this.model),d=await se([l],this.model,this.modelSelectedColumns,this.modelAnnotatedColumns,this.mustRemoveAnnotations);d&&(e.ignoreHooks?.includes("afterFetch")||await this.model.afterFetch?.([d]),this.relationQueryBuilders.length&&await this.processRelationsRecursively([d]),s.write(d));}})}async paginateWithCursor(e,r,o){if(!r){if(!this.model.primaryKey)throw new f(this.model.name+"::paginateWithCursor","PRIMARY_KEY_NOT_FOUND");r={discriminator:this.model.primaryKey};}return super.paginateWithCursor(e,r,o)}async insert(...e){return this.model.insert(...e)}async insertMany(...e){return this.model.insertMany(...e)}async update(e,r={}){return r.ignoreBeforeUpdateHook||await this.model.beforeUpdate?.(this),super.update(e)}async softDelete(e={}){let{ignoreBeforeUpdateHook:r=false}=e||{};return !r&&await this.model.beforeUpdate?.(this),super.softDelete(e)}async delete(e={}){return e.ignoreBeforeDeleteHook||await this.model.beforeDelete?.(this),super.delete()}async getCount(e="*",r={ignoreHooks:false}){this.clearForFunctions(),this.annotate("count",e,"total");let o=r.ignoreHooks?["beforeFetch"]:[],n=await this.one({ignoreHooks:o});return n?+n.$annotations.total:0}async getMax(e,r={ignoreHooks:false}){this.clearForFunctions(),this.annotate("max",e,"total");let o=r.ignoreHooks?["beforeFetch","afterFetch"]:[],n=await this.one({ignoreHooks:o});return n?+n.$annotations.total:0}async getMin(e,r={ignoreHooks:false}){this.clearForFunctions(),this.annotate("min",e,"total");let o=r.ignoreHooks?["beforeFetch","afterFetch"]:[],n=await this.one({ignoreHooks:o});return n?+n.$annotations.total:0}async getAvg(e,r={ignoreHooks:false}){this.clearForFunctions(),this.annotate("avg",e,"total");let o=r.ignoreHooks?["beforeFetch","afterFetch"]:[],n=await this.one({ignoreHooks:o});return n?+n.$annotations.total:0}async getSum(e,r={ignoreHooks:false}){this.clearForFunctions(),this.annotate("sum",e,"total");let o=r.ignoreHooks?["beforeFetch","afterFetch"]:[],n=await this.one({ignoreHooks:o});return n?+n.$annotations.total:0}async paginate(e,r,o={ignoreHooks:false}){let n=this.clone(),[s,a]=await Promise.all([this.limit(r).offset((e-1)*r).many({ignoreHooks:o.ignoreHooks?["beforeFetch","afterFetch"]:[]}),n.getCount("*",{ignoreHooks:o.ignoreHooks})]);return {paginationMetadata:Gt(e,r,a),data:s}}select(...e){return this.modelSelectedColumns=[...this.modelSelectedColumns,...e],this.selectNodes=this.selectNodes.concat(e.map(r=>new V(r))),this}annotate(e,r,o){let n,s,a;return o?(n=e,s=r,a=o):(n=void 0,s=e,a=r),this.selectNodes=this.selectNodes.concat(new V(s,a,n)),this.modelAnnotatedColumns.push(a),this}removeAnnotations(){return this.mustRemoveAnnotations=true,this.modelAnnotatedColumns=[],this}load(e,r){let o=this.sqlModelManagerUtils.getRelationFromModel(e),n=new i(o.model,this.sqlDataSource);return n.relation=o,r?.(n),this.relationQueryBuilders.push(n),this}clearRelations(){return this.relationQueryBuilders=[],this}havingRelated(e,r,o){return this.andHavingRelated(e,r,o)}andHavingRelated(e,r,o){let n,s,a;typeof r=="function"?a=r:typeof r=="string"&&o!==void 0?(s=r,n=o):r!==void 0&&(n=r,s="=");let l=this.sqlModelManagerUtils.getRelationFromModel(e),d=new i(l.model,this.sqlDataSource);d.relation=l;let u=this.getRelatedModelsQueryForRelation(d,l,[]);return u.clearWhere(),u.clearSelect(),u.selectRaw("1"),a?.(u),this.applyHavingRelatedFilter(u,l,s,n),this.whereExists(u),this}orHavingRelated(e,r,o){let n,s,a;typeof r=="function"?a=r:typeof r=="string"&&o!==void 0?(s=r,n=o):r!==void 0&&(n=r,s="=");let l=this.sqlModelManagerUtils.getRelationFromModel(e),d=new i(l.model,this.sqlDataSource);d.relation=l;let u=this.getRelatedModelsQueryForRelation(d,l,[]);return u.clearWhere(),u.clearSelect(),u.selectRaw("1"),a?.(u),this.applyHavingRelatedFilter(u,l,s,n),this.orWhereExists(u),this}notHavingRelated(e,r,o){return this.andNotHavingRelated(e,r,o)}andNotHavingRelated(e,r,o){let n,s,a;typeof r=="function"?a=r:typeof r=="string"&&o!==void 0?(s=r,n=o):r!==void 0&&(n=r,s="=");let l=this.sqlModelManagerUtils.getRelationFromModel(e),d=new i(l.model,this.sqlDataSource);d.relation=l;let u=this.getRelatedModelsQueryForRelation(d,l,[]);return u.clearWhere(),u.clearSelect(),u.selectRaw("1"),a?.(u),this.applyHavingRelatedFilter(u,l,s,n),this.whereNotExists(u),this}orNotHavingRelated(e,r,o){let n,s,a;typeof r=="function"?a=r:typeof r=="string"&&o!==void 0?(s=r,n=o):r!==void 0&&(n=r,s="=");let l=this.sqlModelManagerUtils.getRelationFromModel(e),d=new i(l.model,this.sqlDataSource);d.relation=l;let u=this.getRelatedModelsQueryForRelation(d,l,[]);return u.clearWhere(),u.clearSelect(),u.selectRaw("1"),a?.(u),this.applyHavingRelatedFilter(u,l,s,n),this.orWhereNotExists(u),this}clone(){let e=super.clone();return e.relationQueryBuilders=E(this.relationQueryBuilders),e}async processRelationsRecursively(e){await Promise.all(this.relationQueryBuilders.filter(r=>r.isRelationQueryBuilder).map(async r=>{let o=await this.getRelatedModelsForRelation(r,r.relation,e);this.mapRelatedModelsToModels(r.relation,e,o);}));}mapRelatedModelsToModels(e,r,o){switch(e.type){case "hasOne":if(!this.model.primaryKey)throw new f(this.model.name+"::mapRelatedModelsToModels::hasOne","MODEL_HAS_NO_PRIMARY_KEY");let n=new Map;o.forEach(m=>{let p=m[e.foreignKey];p&&n.set(String(p),m);}),r.forEach(m=>{let p=m[this.model.primaryKey];if(!p){m[e.columnName]=null;return}let h=n.get(String(p));m[e.columnName]=h||null;});break;case "belongsTo":let s=new Map;o.forEach(m=>{if(!e.model.primaryKey)throw new f(this.model.name+"::mapRelatedModelsToModels::belongsTo",`RELATED_MODEL_DOES_NOT_HAVE_A_PRIMARY_KEY_${e.model.name}`);let p=m[e.model.primaryKey];p&&s.set(String(p),m);}),r.forEach(m=>{let p=m[e.foreignKey];if(!p){m[e.columnName]=null;return}let h=s.get(String(p));m[e.columnName]=h||null;});break;case "hasMany":if(!this.model.primaryKey)throw new f(this.model.name+"::mapRelatedModelsToModels::hasMany","MODEL_HAS_NO_PRIMARY_KEY");let a=new Map;o.forEach(m=>{let p=m[e.foreignKey];if(!p)return;let h=String(p);a.has(h)||a.set(h,[]),a.get(h).push(m);}),r.forEach(m=>{let p=m[this.model.primaryKey];if(!p){m[e.columnName]=[];return}let h=a.get(String(p))||[];m[e.columnName]=h;});break;case "manyToMany":if(!this.model.primaryKey||!e.model.primaryKey)throw new f(this.model.name+"::mapRelatedModelsToModels::manyToMany","MODEL_HAS_NO_PRIMARY_KEY");let l=e,d=new Map,u=l.leftForeignKey,c=this.modelColumnsMap.get(u)||this.modelColumnsDatabaseNames.get(u)||O(u,this.model.modelCaseConvention);o.forEach(m=>{let p=m.$annotations||{},h=p[c];if(h==null)return;let g=String(h);d.has(g)||d.set(g,[]),this.modelAnnotatedColumns.includes(c)||(delete p[c],Object.keys(p).length||delete m.$annotations),d.get(g).push(m);}),r.forEach(m=>{let p=m[this.model.primaryKey];if(!p){m[e.columnName]=[];return}let h=d.get(String(p))||[];m[e.columnName]=h;});break;default:throw new f(this.model.name+"::mapRelatedModelsToModels","UNSUPPORTED_RELATION_TYPE")}}async getRelatedModelsForRelation(e,r,o){return this.getRelatedModelsQueryForRelation(e,r,o).many()}getRelatedModelsQueryForRelation(e,r,o){let n=this.getFilterValuesFromModelsForRelation(r,o);switch(r.type){case "belongsTo":case "hasOne":return e.whereIn(e.relation.type==="belongsTo"?r.model.primaryKey:r.foreignKey,n);case "hasMany":let s=e.limitNode?.limit,a=e.offsetNode?.offset;if(!s&&!a)return e.whereIn(e.relation.type==="belongsTo"?r.model.primaryKey:r.foreignKey,n);let l=pe__default.default.randomBytes(6).toString("hex"),d=`${r.model.table}_cte_${l}`,u=e.orderByNodes.map(q=>q.isRawValue?q.column:`${this.interpreterUtils.formatStringColumn(this.dbType,q.column)} ${q.direction}`).join(", ")||["1"];e.clearLimit(),e.clearOffset();let c=e.with(d,q=>q.select(...e.modelSelectedColumns).selectRaw(`ROW_NUMBER() OVER (PARTITION BY ${this.interpreterUtils.formatStringColumn(this.dbType,r.foreignKey)} ORDER BY ${u}) as rn_${l}`).whereIn(r.foreignKey,n));s&&c.whereRaw(`rn_${l} <= ${s+(a||0)}`),a&&c.whereRaw(`rn_${l} > ${a}`);let m=e.modelSelectedColumns.map(q=>Mr(q,d,e.model.table));return c.select(...m).from(d);case "manyToMany":if(!this.model.primaryKey||!r.model.primaryKey)throw new f(this.model.name+"::getRelatedModelsForRelation","MODEL_HAS_NO_PRIMARY_KEY");let p=r;if(!o.length)return e;let h=e.limitNode?.limit,g=e.offsetNode?.offset,w=e.modelSelectedColumns.length?e.modelSelectedColumns.map(q=>q.includes(".")?q:`${r.model.table}.${q}`):[`${r.model.table}.*`];if(!h&&!g)return e.select(...w).annotate(`${p.throughModel}.${p.leftForeignKey}`,p.leftForeignKey).leftJoin(p.throughModel,`${p.relatedModel}.${p.model.primaryKey}`,`${p.throughModel}.${p.rightForeignKey}`).whereIn(`${p.throughModel}.${p.leftForeignKey}`,n);let C=pe__default.default.randomBytes(6).toString("hex"),P=`${r.model.table}_cte_${C}`,j=e.orderByNodes.map(q=>{if(q.isRawValue)return q.column;let Oe=q.column.includes(".")?q.column:`${r.model.table}.${q.column}`;return `${this.interpreterUtils.formatStringColumn(this.dbType,Oe)} ${q.direction}`}).join(", ")||["1"];e.clearLimit(),e.clearOffset(),e.clearOrderBy();let z=`${pe__default.default.randomBytes(6).toString("hex")}_left_foreign_key`,L=e.with(P,q=>q.select(...w).annotate(`${p.throughModel}.${p.leftForeignKey}`,z).selectRaw(`ROW_NUMBER() OVER (PARTITION BY ${p.throughModel}.${this.interpreterUtils.formatStringColumn(this.dbType,p.leftForeignKey)} ORDER BY ${j}) as rn_${C}`).leftJoin(p.throughModel,`${p.relatedModel}.${p.model.primaryKey}`,`${p.throughModel}.${p.rightForeignKey}`).whereIn(`${p.throughModel}.${p.leftForeignKey}`,n));h&&L.whereRaw(`rn_${C} <= ${h+(g||0)}`),g&&L.whereRaw(`rn_${C} > ${g}`);let re=w.map(q=>Mr(q,P,e.model.table));return L.select(...re).annotate(`${P}.${z}`,p.leftForeignKey).from(P);default:throw new f(this.model.name+"::getRelatedModelsForRelation","UNSUPPORTED_RELATION_TYPE")}}getFilterValuesFromModelsForRelation(e,r){switch(e.type){case "hasMany":case "hasOne":if(!this.model.primaryKey)throw new f(this.model.name+"::getFilterValuesFromModelsForRelation","MODEL_HAS_NO_PRIMARY_KEY");return r.map(o=>o[this.model.primaryKey]);case "belongsTo":return r.map(o=>o[e.foreignKey]);case "manyToMany":if(!this.model.primaryKey)throw new f(this.model.name+"::getFilterValuesFromModelsForRelation","MODEL_HAS_NO_PRIMARY_KEY");return r.map(o=>o[this.model.primaryKey]);default:throw new f(this.model.name+"::getFilterValuesFromModelsForRelation","UNSUPPORTED_RELATION_TYPE")}}applyHavingRelatedFilter(e,r,o,n){let s=new y(r.model),a=new y(this.model),l=this.dbType;switch(r.type){case "hasOne":case "hasMany":{if(!this.model.primaryKey||!r.foreignKey)throw new f(this.model.name+"::applyHavingRelatedFilter","MODEL_HAS_NO_PRIMARY_KEY");let d=s.formatStringColumn(l,`${r.model.table}.${r.foreignKey}`),u=a.formatStringColumn(l,`${this.model.table}.${this.model.primaryKey}`);e.whereRaw(`${d} = ${u}`),o&&typeof n=="number"&&e.groupByRaw(d).andHavingRaw(`count(*) ${o} ${n}`);return}case "belongsTo":{if(!r.model.primaryKey||!r.foreignKey)throw new f(this.model.name+"::applyHavingRelatedFilter",`RELATED_MODEL_DOES_NOT_HAVE_A_PRIMARY_KEY_${r.model.name}`);let d=s.formatStringColumn(l,`${r.model.table}.${r.model.primaryKey}`),u=a.formatStringColumn(l,`${this.model.table}.${r.foreignKey}`);e.whereRaw(`${d} = ${u}`),o&&typeof n=="number"&&e.groupByRaw(d).andHavingRaw(`count(*) ${o} ${n}`);return}case "manyToMany":{let d=r;if(!this.model.primaryKey||!r.model.primaryKey)throw new f(this.model.name+"::applyHavingRelatedFilter","MODEL_HAS_NO_PRIMARY_KEY");e.joinNodes?.some(p=>!p.isRawValue&&p.table===d.throughModel&&p.type==="left")||e.leftJoin(d.throughModel,`${d.relatedModel}.${r.model.primaryKey}`,`${d.throughModel}.${d.rightForeignKey}`);let c=a.formatStringColumn(l,`${d.throughModel}.${d.leftForeignKey}`),m=a.formatStringColumn(l,`${this.model.table}.${this.model.primaryKey}`);e.whereRaw(`${c} = ${m}`),o&&typeof n=="number"&&e.groupByRaw(c).andHavingRaw(`count(*) ${o} ${n}`);return}default:throw new f(this.model.name+"::applyHavingRelatedFilter","UNSUPPORTED_RELATION_TYPE")}}addAdditionalColumnsToModel(e,r){let o={},n={};return Object.entries(e).forEach(([s,a])=>{if(s==="$annotations"||this.modelColumnsDatabaseNames.get(s)){o[s]=a;return}n[O(s,r.modelCaseConvention)]=a;}),o.$annotations=n,o}async manyWithPerformance(e={},r="millis"){let[o,n]=await I(this.many.bind(this,e),r)();return {data:n,time:Number(o)}}async oneWithPerformance(e={},r="millis"){let[o,n]=await I(this.one.bind(this,e),r)();return {data:n,time:Number(o)}}async oneOrFailWithPerformance(e={},r="millis"){let[o,n]=await I(this.oneOrFail.bind(this,e),r)();return {data:n,time:Number(o)}}async firstOrFailWithPerformance(e={},r="millis"){return this.oneOrFailWithPerformance(e,r)}async firstWithPerformance(e={},r="millis"){return this.oneWithPerformance(e,r)}async paginateWithPerformance(e,r,o,n="millis"){let{ignoreHooks:s=false}=o||{},[a,l]=await I(this.paginate.bind(this,e,r,{ignoreHooks:s}),n)();return {data:{paginationMetadata:l.paginationMetadata,data:l.data},time:Number(a)}}async paginateWithCursorWithPerformance(e,r,o,n="millis"){let[s,a]=await I(this.paginateWithCursor.bind(this,e,r,o),n)();return {data:a,time:Number(s)}}async existsWithPerformance(e="millis"){let[r,o]=await I(this.exists.bind(this),e)();return {data:o,time:Number(r)}}async pluckWithPerformance(e,r="millis"){let[o,n]=await I(this.pluck.bind(this,e),r)();return {data:n,time:Number(o)}}async softDeleteWithPerformance(e={},r="millis"){let[o,n]=await I(this.softDelete.bind(this,e),r)();return {data:n,time:Number(o)}}async updateWithPerformance(e,r={},o="millis"){let[n,s]=await I(this.update.bind(this,e,r),o)();return {data:s,time:Number(n)}}async deleteWithPerformance(e="millis"){let[r,o]=await I(this.delete.bind(this),e)();return {data:o,time:Number(r)}}async truncateWithPerformance(e="millis"){let[r,o]=await I(this.truncate.bind(this),e)();return {data:o,time:Number(r)}}};var ar=class extends Ue{constructor(t,e){super(t,e);}many(){return this}insert(...t){let[e,r]=t,o=Object.fromEntries(Object.keys(e).map(n=>[n,e[n]]));return this.insertNode=new Q(this.fromNode,[o],r?.returning),this}insertMany(...t){let[e,r]=t;if(!e.length)return this;let o=e.map(n=>Object.fromEntries(Object.keys(n).map(s=>[s,n[s]])));return this.insertNode=new Q(this.fromNode,o,r?.returning),this}update(...t){let[e]=t;return this.updateNode=new H(this.fromNode,Object.keys(e),Object.values(e)),this}delete(...t){let[e]=t;return e?.ignoreBeforeDeleteHook||this.model.beforeDelete?.(this),this.deleteNode=new ue(this.fromNode),this}truncate(){return this.truncateNode=new me(this.fromNode),this}softDelete(...t){let[e]=t,{column:r="deletedAt",value:o=ne()}=e||{};return this.updateNode=new H(this.fromNode,[r],[o]),this}};var tt=class{constructor(t,e){this.model=t,this.modelInstance=Ps(),this.sqlDataSource=e,this.logs=this.sqlDataSource.logs,this.sqlType=this.sqlDataSource.getDbType(),this.astParser=new N(this.model,this.sqlType),this.interpreterUtils=new y(this.model);}async find(t){if(!t)return this.query().many();let e=this.query();return t.select&&e.select(...t.select),t.relations&&t.relations.forEach(r=>{e.load(r);}),t.where&&Object.entries(t.where).forEach(([r,o])=>{if(Array.isArray(o)){e.whereIn(r,o);return}e.where(r,o);}),t.orderBy&&Object.entries(t.orderBy).forEach(([r,o])=>{e.orderBy(r,o);}),t.limit&&e.limit(t.limit),t.offset&&e.offset(t.offset),t.groupBy&&e.groupBy(...t.groupBy),e.many({ignoreHooks:t.ignoreHooks||[]})}async findOne(t){let e=await this.find({groupBy:t.groupBy,orderBy:t.orderBy,relations:t.relations,select:t.select,where:t.where,ignoreHooks:t.ignoreHooks,offset:t.offset,limit:1});return e.length?e[0]:null}async findOneOrFail(t){let e=await this.findOne({groupBy:t.groupBy,orderBy:t.orderBy,relations:t.relations,select:t.select,where:t.where,ignoreHooks:t.ignoreHooks,offset:t.offset});if(e===null)throw t.customError?t.customError:new f(this.model.name+"::findOneOrFail","ROW_NOT_FOUND");return e}async findOneByPrimaryKey(t,e){if(!this.model.primaryKey)throw new f(this.model.name+"::findOneByPrimaryKey","MODEL_HAS_NO_PRIMARY_KEY");return this.query().select(...e||[]).where(this.model.primaryKey,t).one({ignoreHooks:["afterFetch","beforeFetch"]})}async insert(t,e={}){!e.ignoreHooks&&await this.model.beforeInsert?.(t);let{columns:r,values:o}=await this.interpreterUtils.prepareColumns(Object.keys(t),Object.values(t),"insert"),n={};r.forEach((c,m)=>{let p=o[m];n[c]=p,t[c]??(t[c]=p);});let{sql:s,bindings:a}=this.astParser.parse([new Q(new v(this.model.table),[n],e.returning)]),l=await U(s,a,this.sqlDataSource,"raw",{sqlLiteOptions:{typeofModel:this.model,mode:"insertOne",models:[t]}});if(this.sqlType==="mysql"||this.sqlType==="mariadb")return this.handleMysqlInsert(l,[t],"one",e.returning);let d=l[0];return d?(await this.model.afterFetch?.([d]),await se([d],this.model)):t}async insertMany(t,e={}){let r=[];await this.model.beforeInsertMany?.(t);for(let d of t){let{columns:u,values:c}=await this.interpreterUtils.prepareColumns(Object.keys(d),Object.values(d),"insert"),m={};u.forEach((p,h)=>{let g=c[h];m[p]=g,d[p]??(d[p]=g);}),r.push(m);}let{sql:o,bindings:n}=this.astParser.parse([new Q(new v(this.model.table),r,e.returning)]),s=await U(o,n,this.sqlDataSource,"raw",{sqlLiteOptions:{typeofModel:this.model,mode:"insertMany",models:t}});if(this.sqlType==="mysql"||this.sqlType==="mariadb")return await this.handleMysqlInsert(s,t,"many",e.returning)||[];let a=s;return a.length?(await this.model.afterFetch?.(a),await se(a,this.model)||[]):[]}async upsertMany(t,e,r,o={updateOnConflict:true}){let n=[];await this.model.beforeInsertMany?.(r),await Promise.all(r.map(async d=>{let{columns:u,values:c}=await this.interpreterUtils.prepareColumns(Object.keys(d),Object.values(d),"insert"),m=Object.fromEntries(u.map((p,h)=>[p,c[h]]));n.push(m);}));let{sql:s,bindings:a}=this.astParser.parse([new Q(new v(this.model.table),n,void 0,true),new X(this.model.table,t,e,o.updateOnConflict??true?"update":"ignore",o.returning)]);return await U(s,a,this.sqlDataSource,"raw",{sqlLiteOptions:{typeofModel:this.model,mode:"raw",models:r}})}async updateRecord(t,e){let{columns:r,values:o}=await this.interpreterUtils.prepareColumns(Object.keys(t),Object.values(t),"update"),{primaryKey:n}=this.model;if(!n)throw new f(this.model.name+"::updateRecord","MODEL_HAS_NO_PRIMARY_KEY");r=r.filter(d=>d!==n),o=o.filter(d=>d!==t[n]);let{sql:s,bindings:a}=this.astParser.parse([new H(new v(this.model.table),r,o),new R(n,"and",false,"=",t[n])]);await U(s,a,this.sqlDataSource,"raw");let l=await this.findOneByPrimaryKey(t[this.model.primaryKey],e?.returning??void 0);if(!l)throw new f(this.model.name+"::updateRecord","ROW_NOT_FOUND");return l}async deleteRecord(t){if(!this.model.primaryKey)throw new f(this.model.name+"::deleteRecord","MODEL_HAS_NO_PRIMARY_KEY");let e=new R(this.model.primaryKey,"and",false,"=",t[this.model.primaryKey]),{sql:r,bindings:o}=this.astParser.parse([new ue(new v(this.model.table)),e]);await U(r,o,this.sqlDataSource,"raw");}query(){return new Ue(this.model,this.sqlDataSource)}dryQuery(){return new ar(this.model,this.sqlDataSource)}async handleMysqlInsert(t,e,r,o){if(!this.model.primaryKey){if(r==="one"){let a=e.length?e[0]:null;return a?await se([a],this.model):null}return await se(e,this.model)}if(this.model.primaryKey&&e[0][this.model.primaryKey]){let a=e.map(u=>u[this.model.primaryKey]),l=a.map(u=>`'${u}'`).join(","),d=await this.query().select(...o??"*").whereIn(this.model.primaryKey,a).orderByRaw(`FIELD(${this.model.primaryKey}, ${l})`).many();return r==="one"?d.length?d[0]:null:d}let n=Array.from({length:t.affectedRows},(a,l)=>l+t.insertId),s=await this.query().select(...o||"*").whereIn(this.model.primaryKey,n).many();return r==="one"?s.length?s[0]:null:s}};var rt=class extends _{constructor(t,e){super(t,e);}many(){return this}insert(...t){let[e,r]=t,o=Object.fromEntries(Object.keys(e).map(n=>[n,e[n]]));return this.insertNode=new Q(this.fromNode,[o],r),this}insertMany(...t){let[e,r]=t;if(!e.length)return this;let o=e.map(n=>Object.fromEntries(Object.keys(n).map(s=>[s,n[s]])));return this.insertNode=new Q(this.fromNode,o,r),this}upsert(...t){let[e,r,o]=t,n=Object.keys(e),s=Object.keys(r);return this.insertNode=new Q(new v(this.model.table),[e],void 0,true),this.onDuplicateNode=new X(this.model.table,s,n,o?.updateOnConflict??true?"update":"ignore",o?.returning),this}upsertMany(...t){let[e,r,o,n]=t,s=o.map(a=>Object.fromEntries(Object.keys(a).map(l=>[l,a[l]])));return this.insertNode=new Q(new v(this.model.table),s,void 0,true),this.onDuplicateNode=new X(this.model.table,e,r,n?.updateOnConflict??true?"update":"ignore",n?.returning),this}update(t){return this.updateNode=new H(this.fromNode,Object.keys(t),Object.values(t)),this}delete(){return this.deleteNode=new ue(this.fromNode),this}truncate(){return this.truncateNode=new me(this.fromNode),this}softDelete(t={}){let{column:e="deletedAt",value:r=ne()}=t||{};return this.updateNode=new H(this.fromNode,[e],[r]),this}};var ot=(i,t)=>({table:i,modelCaseConvention:"preserve",databaseCaseConvention:t?.databaseCaseConvention??"preserve",softDeleteColumn:t?.softDeleteColumn??"deleted_at",softDeleteValue:t?.softDeleteValue??ne()});var nt=class i{constructor(t,e,r=false,o=0){this.connectionReleased=false;this.sql=t,this.isActive=false,this.transactionId=pe__default.default.randomBytes(16).toString("hex"),this.isolationLevel=e,this.isNested=r,this.nestingDepth=o;}async nestedTransaction(t){let e=new i(this.sql,this.isolationLevel,true,this.nestingDepth+1);if(await e.startTransaction(),t)try{await t(e),await e.commit();}catch(r){throw await e.rollback(),r}return e}async startTransaction(){let t=this.getIsolationLevelQuery();if(this.isNested){let e=this.getSavePointName();switch(this.sql.type){case "mysql":case "mariadb":case "postgres":case "cockroachdb":await this.sql.rawQuery(`SAVEPOINT ${e}`),this.isActive=true;return;case "sqlite":await this.sql.rawQuery(`SAVEPOINT ${e}`),this.isActive=true;return}}switch(this.sql.type){case "mysql":case "mariadb":t&&await this.sql.rawQuery(t),await this.sql.sqlConnection.beginTransaction(),this.isActive=true;break;case "postgres":case "cockroachdb":await this.sql.rawQuery("BEGIN TRANSACTION"),t&&await this.sql.rawQuery(t),this.isActive=true;break;case "sqlite":t&&await this.sql.rawQuery(t),await this.sql.rawQuery("BEGIN TRANSACTION"),this.isActive=true;break}}async commit(t){if(!this.isActive){if(t?.throwErrorOnInactiveTransaction)throw new f("TRANSACTION::commit","TRANSACTION_NOT_ACTIVE");b.warn("Transaction::commit - TRANSACTION_NOT_ACTIVE");return}try{if(this.isNested){let e=this.getSavePointName();switch(this.sql.type){case "mysql":case "mariadb":case "postgres":case "cockroachdb":case "sqlite":await this.sql.rawQuery(`RELEASE SAVEPOINT ${e}`);break}this.isActive=!1;return}switch(this.sql.type){case "mysql":case "mariadb":await this.sql.sqlConnection.commit();break;case "postgres":case "cockroachdb":await this.sql.rawQuery("COMMIT");break;case "sqlite":await this.sql.rawQuery("COMMIT");break}}catch(e){throw b.error(e),e}await this.releaseConnection(),this.isActive=false;}async rollback(t){if(!this.isActive){if(t?.throwErrorOnInactiveTransaction)throw new f("TRANSACTION::rollback","TRANSACTION_NOT_ACTIVE");b.warn("Transaction::rollback - TRANSACTION_NOT_ACTIVE");return}try{if(this.isNested){let e=this.getSavePointName();switch(this.sql.type){case "mysql":case "mariadb":case "postgres":case "cockroachdb":await this.sql.rawQuery(`ROLLBACK TO SAVEPOINT ${e}`);break;case "sqlite":await this.sql.rawQuery(`ROLLBACK TO ${e}`);break;default:throw new f("TRANSACTION::rollback",`UNSUPPORTED_DATABASE_TYPE_${this.sql.type}`)}this.isActive=!1;return}switch(this.sql.type){case "mysql":case "mariadb":await this.sql.sqlConnection.rollback();break;case "postgres":case "cockroachdb":await this.sql.rawQuery("ROLLBACK");break;case "sqlite":await this.sql.rawQuery("ROLLBACK");break;default:throw new f("TRANSACTION::rollback",`UNSUPPORTED_DATABASE_TYPE_${this.sql.type}`)}}catch(e){throw b.error(e),e}await this.releaseConnection(),this.isActive=false;}async releaseConnection(){if(!this.connectionReleased){try{switch(this.sql.type){case "mysql":case "mariadb":this.sql.sqlConnection.release();break;case "postgres":case "cockroachdb":this.sql.sqlConnection.release();break;case "sqlite":break;default:throw new f("TRANSACTION::releaseConnection",`UNSUPPORTED_DATABASE_TYPE_${this.sql.type}`)}}catch(t){b.error(t);}await this.sql.closeConnection(),this.sql.sqlConnection=null,this.connectionReleased=true;}}getIsolationLevelQuery(){if(!this.isolationLevel)return "";if(this.sql.type==="sqlite"&&this.isolationLevel!=="SERIALIZABLE")throw new f("TRANSACTION::getIsolationLevelQuery","SQLITE_ONLY_SUPPORTS_SERIALIZABLE_ISOLATION_LEVEL");if(this.sql.type==="mysql"||this.sql.type==="mariadb")return `SET TRANSACTION ISOLATION LEVEL ${this.isolationLevel}`;if(this.sql.type==="postgres"||this.sql.type==="cockroachdb")return `SET TRANSACTION ISOLATION LEVEL ${this.isolationLevel}`;if(this.sql.type==="sqlite")return "";throw new f("TRANSACTION::getIsolationLevelQuery",`UNSUPPORTED_DATABASE_TYPE_${this.sql.type}`)}getSavePointName(){let t=this.transactionId.slice(0,8).toUpperCase();return `sp_${this.nestingDepth}_${t}`}};var ee=class ee extends ht{constructor(e){super(e);this.globalTransaction=null;this.models={};this.ownsPool=false;this.sqlConnection=null;this.sqlType=this.type,this.inputDetails=e||{connectionPolicies:{retry:{maxRetries:0,delay:0}},queryFormatOptions:{language:gt(this.sqlType),keywordCase:"lower",dataTypeCase:"lower",functionCase:"lower"}},this.inputDetails.connectionPolicies=e?.connectionPolicies||{retry:{maxRetries:0,delay:0}},this.inputDetails.queryFormatOptions=e?.queryFormatOptions||{language:gt(this.sqlType),keywordCase:"lower",dataTypeCase:"lower",functionCase:"lower"};}static async connect(e,r){typeof e=="function"&&(r=e,e=void 0);let o=new ee(e);if(e?.models){let n=o.sanitizeModelKeys(e?.models||{});Object.assign(o,n);}return o.models=e?.models||{},o.sqlPool=await Ce(o.sqlType,{type:o.sqlType,host:o.host,port:o.port,username:o.username,password:o.password,database:o.database,connectionPolicies:o.inputDetails.connectionPolicies,queryFormatOptions:o.inputDetails.queryFormatOptions,driverOptions:o.inputDetails.driverOptions,logs:o.logs,models:o.models}),o.ownsPool=true,await o.testConnectionQuery("SELECT 1"),ee.instance=o,await r?.(o),o}static async connectToSecondarySource(e,r){typeof e=="function"&&(r=e,e=void 0);let o=new ee(e);if(e?.models){let n=o.sanitizeModelKeys(e.models);Object.assign(o,n);}return o.models=e?.models||{},o.sqlPool=await Ce(o.sqlType,{type:o.sqlType,host:o.host,port:o.port,username:o.username,password:o.password,database:o.database,connectionPolicies:o.inputDetails.connectionPolicies,queryFormatOptions:o.inputDetails.queryFormatOptions,driverOptions:o.inputDetails.driverOptions,logs:o.logs,models:o.models}),o.ownsPool=true,await o.testConnectionQuery("SELECT 1"),ee.instance=o,await r?.(o),o}static async useConnection(e,r){let o=new ee(e);if(e.models){let n=o.sanitizeModelKeys(e.models);Object.assign(o,n);}o.models=e.models||{},o.sqlPool=await Ce(o.sqlType,{type:o.sqlType,host:o.host,port:o.port,username:o.username,password:o.password,database:o.database,connectionPolicies:o.inputDetails.connectionPolicies,queryFormatOptions:o.inputDetails.queryFormatOptions,driverOptions:o.inputDetails.driverOptions,logs:o.logs,models:e.models}),o.ownsPool=true,await o.testConnectionQuery("SELECT 1");try{await r(o).then(async()=>{o.isConnected&&await o.closeConnection();});}catch(n){throw o.isConnected&&await o.closeConnection(),n}}static getInstance(){if(!ee.instance)throw new f("SqlDataSource::getInstance","CONNECTION_NOT_ESTABLISHED");return ee.instance}static query(e,r){let o=this.getInstance(),n=o.isInGlobalTransaction&&o.globalTransaction?.isActive?o.globalTransaction.sql:o,s=new _(ot(e,r),n);return r?.alias&&s.from(e,r.alias),s}static dryQuery(e,r){let o=this.getInstance(),n=o.isInGlobalTransaction&&o.globalTransaction?.isActive?o.globalTransaction.sql:o,s=new rt(ot(e,r),n);return r?.alias&&s.from(e,r.alias),s}static createTable(...e){return this.getInstance().createTable(...e)}static alterTable(...e){return this.getInstance().alterTable(...e)}static async startGlobalTransaction(e){return this.getInstance().startGlobalTransaction(e)}static async commitGlobalTransaction(){await this.getInstance().commitGlobalTransaction();}static async rollbackGlobalTransaction(){await this.getInstance().rollbackGlobalTransaction();}static async startTransaction(e,r){return this.getInstance().startTransaction(e,r)}static async transaction(e,r){let o=typeof e=="function"?r:e;return this.getInstance().startTransaction(e,o)}static async getTableSchema(e){return this.getInstance().getTableSchema(e)}static async closeConnection(){if(!this.instance){b.warn("Connection already closed");return}await this.instance.closeConnection(),this.instance=null;}static async disconnect(){return this.closeConnection()}static async rawQuery(e,r=[]){let o=this.getInstance();return (o.isInGlobalTransaction&&o.globalTransaction?.isActive?o.globalTransaction.sql:o).rawQuery(e,r)}static rawStatement(e){return this.getInstance().rawStatement(e)}get isConnected(){return !!this.sqlPool||!!this.sqlConnection}async clone(e){let r=new ee(this.inputDetails);if(r.sqlType==="sqlite"||!!e?.shouldRecreatePool){if(r.sqlPool=await Ce(r.sqlType,{type:r.sqlType,host:r.host,port:r.port,username:r.username,password:r.password,database:r.database,connectionPolicies:r.inputDetails.connectionPolicies,queryFormatOptions:r.inputDetails.queryFormatOptions,driverOptions:r.inputDetails.driverOptions,logs:r.logs,models:r.models}),r.ownsPool=true,Object.keys(this.models).length){let n=r.sanitizeModelKeys(this.models);Object.assign(r,n);}return r}if(r.sqlPool=this.sqlPool,r.ownsPool=false,Object.keys(this.models).length){let n=r.sanitizeModelKeys(this.models);Object.assign(r,n);}return r}getDbType(){return this.type}query(e,r){let o=this.isInGlobalTransaction&&this.globalTransaction?.isActive?this.globalTransaction.sql:this,n=new _(ot(e,r),o);return r?.alias&&n.from(e,r.alias),n}dryQuery(e,r){return new rt(ot(e,r),this)}alterTable(...e){let r=new he(this.getDbType());return r.alterTable(...e),r.queryStatements}createTable(...e){let r=new he(this.getDbType());return r.createTable(...e),r.queryStatements[0]||""}async startGlobalTransaction(e){let r=await this.clone();return r.sqlConnection=await r.getConnection(),this.globalTransaction=new nt(r,e?.isolationLevel),await this.globalTransaction.startTransaction(),this.globalTransaction}async commitGlobalTransaction(e){if(!this.globalTransaction)throw new f("SqlDataSource::commitGlobalTransaction","GLOBAL_TRANSACTION_NOT_STARTED");await this.globalTransaction.commit({throwErrorOnInactiveTransaction:e?.throwErrorOnInactiveTransaction}),this.globalTransaction=null;}async rollbackGlobalTransaction(e){if(!this.globalTransaction){b.warn("SqlDataSource::rollbackGlobalTransaction - GLOBAL_TRANSACTION_NOT_STARTED");return}await this.globalTransaction.rollback({throwErrorOnInactiveTransaction:e?.throwErrorOnInactiveTransaction}),this.globalTransaction=null;}async startTransaction(e,r){let o=typeof e=="function"?r:e;if(this.globalTransaction?.isActive){if(typeof e=="function")try{await this.globalTransaction.nestedTransaction(e);return}catch(l){throw l}return await this.globalTransaction.nestedTransaction()}let n=await this.clone();n.sqlConnection=await n.getConnection();let s=new nt(n,o?.isolationLevel);if(await s.startTransaction(),typeof e=="function")try{await e(s),await s.commit({throwErrorOnInactiveTransaction:!1});return}catch(a){throw await s.rollback({throwErrorOnInactiveTransaction:false}),a}return s}async transaction(e,r){return this.startTransaction(e,r)}getModelManager(e){if(!this.isConnected)throw new f("SqlDataSource::getModelManager","CONNECTION_NOT_ESTABLISHED");return this.globalTransaction?.isActive?new tt(e,this.globalTransaction.sql):new tt(e,this)}getPool(e=this.sqlType){if(!this.sqlPool)throw new f("SqlDataSource::getPool","CONNECTION_NOT_ESTABLISHED");return this.sqlPool}async getConnection(e=this.sqlType){if(this.sqlConnection)return this.sqlConnection;if(!this.sqlPool)throw new f("SqlDataSource::getConnection","CONNECTION_NOT_ESTABLISHED");switch(this.sqlType){case "mysql":case "mariadb":return await this.sqlPool.getConnection();case "postgres":case "cockroachdb":return await this.sqlPool.connect();case "sqlite":return this.sqlPool;default:throw new f("SqlDataSource::getConnection",`UNSUPPORTED_DATABASE_TYPE_${this.sqlType}`)}}async closeConnection(){if(!this.isConnected){Fe("Connection already closed or not established",this.logs);return}if(!this.ownsPool){this.sqlConnection=null;return}try{this.globalTransaction?.isActive&&await this.rollbackGlobalTransaction({throwErrorOnInactiveTransaction:!1});}catch{b.warn("SqlDataSource::closeConnection - Error while rolling back global transaction");}switch(Fe("Closing connection",this.logs),this.type){case "mysql":case "mariadb":await this.sqlPool.end();break;case "postgres":case "cockroachdb":await this.sqlPool.end();break;case "sqlite":await new Promise((e,r)=>{this.sqlPool.close(o=>{o&&r(o),e();});});break;default:throw new f("SqlDataSource::closeConnection",`UNSUPPORTED_DATABASE_TYPE_${this.type}`)}this.sqlPool=null,this.sqlConnection=null;}getConnectionDetails(){return {type:this.getDbType(),host:this.host,port:this.port,username:this.username,password:this.password,database:this.database,connectionPolicies:this.inputDetails.connectionPolicies,queryFormatOptions:this.inputDetails.queryFormatOptions}}async disconnect(){return this.closeConnection()}async syncSchema(e){if(e=e||{transactional:false},this.sqlType==="sqlite"){b.warn("Syncing schema with SQLite is not supported, skipping...");return}let o=(await Ke.makeDiff(this)).getSqlStatements();if(!o.length){b.info("No new changes detected between database schema and models metadata");return}if(b.info(`Generated ${o.length} SQL statements to sync schema`),!e?.transactional){for(let n of o)await this.rawQuery(n);b.info(`Synced schema with ${o.length} SQL statements`);return}await this.transaction(async n=>{for(let s of o)await n.sql.rawQuery(s);}),b.info(`Synced schema with ${o.length} SQL statements`);}async rawQuery(e,r=[]){if(!this.isConnected)throw new f("SqlDataSource::rawQuery","CONNECTION_NOT_ESTABLISHED");let o=Tt(this,e);return U(o,r,this,"raw")}rawStatement(e){return new ae(e)}async getTableSchema(e){let[r,o,n,s]=await Promise.all([this.getTableInfo(e),this.getIndexInfo(e),this.getForeignKeyInfo(e),this.getPrimaryKeyInfo(e)]);return {columns:r,indexes:o,foreignKeys:n,primaryKey:s}}getModelOpenApiSchema(){return fs(Object.values(this.models))}async getTableInfo(e){let o=new N({table:e,databaseCaseConvention:"preserve",modelCaseConvention:"preserve"},this.getDbType()).parse([new Ot(e)]).sql,n=[];try{n=await this.rawQuery(o);}catch(a){if(Ve(this.getDbType(),a))return [];throw a}let s=this.getDbType();return s==="sqlite"?n.map(a=>{let l=String(a.type||"").toLowerCase(),d=qe(s,l);return {name:a.name,dataType:d,isNullable:a.notnull===0,defaultValue:a.dflt_value??null,withTimezone:null}}):n.map(a=>{let l=String(a.column_name||a.COLUMN_NAME||a.name||""),d=String(a.data_type||a.DATA_TYPE||a.type||"").toLowerCase(),u=qe(s,d),c=a.is_nullable!==void 0?a.is_nullable:a.IS_NULLABLE!==void 0?a.IS_NULLABLE:void 0,m=typeof c=="string"?c.toLowerCase()!=="no":typeof c=="boolean"?c:a.notnull!==void 0?a.notnull===0:true,p=a.column_default??a.COLUMN_DEFAULT??a.defaultValue??a.dflt_value??null,h=a.char_length!=null?Number(a.char_length):null,g=a.numeric_precision!=null?Number(a.numeric_precision):null,w=a.numeric_scale!=null?Number(a.numeric_scale):null,C=a.timezone!=null?!!a.timezone:typeof a.datetime_precision=="number"?/with time zone/.test(String(a.column_type||a.udt_name||"").toLowerCase()):/with time zone/.test(String(a.column_type||a.udt_name||"").toLowerCase());return {name:l,dataType:u,isNullable:m,defaultValue:p,length:h,precision:g,scale:w,withTimezone:C}})}async getIndexInfo(e){let o=new N({table:e,databaseCaseConvention:"preserve",modelCaseConvention:"preserve"},this.getDbType()).parse([new Dt(e)]).sql,n=this.getDbType(),s=[];try{s=await this.rawQuery(o);}catch(l){if(Ve(this.getDbType(),l))return [];throw l}if(n==="mysql"||n==="mariadb"){let l=new Map;for(let d of s){let u=d.Key_name,c=d.Non_unique===0,m=l.get(u)||{name:u,columns:[],isUnique:c};m.columns.push(d.Column_name),l.set(u,m);}return Array.from(l.values())}if(n==="postgres"||n==="cockroachdb"){let l=new Map;for(let d of s){let u=d.index_name,c=!!d.is_unique,m=l.get(u)||{name:u,columns:[],isUnique:c};m.columns.push(d.column_name),l.set(u,m);}return Array.from(l.values())}let a=[];for(let l of s){let d=l.name,u=!!l.unique,m=(await this.rawQuery(`PRAGMA index_info(${d})`)).map(p=>p.name);a.push({name:d,columns:m,isUnique:u});}return a}async getForeignKeyInfo(e){let o=new N({table:e,databaseCaseConvention:"preserve",modelCaseConvention:"preserve"},this.getDbType()).parse([new At(e)]).sql,n=[];try{n=await this.rawQuery(o);}catch(l){if(Ve(this.getDbType(),l))return [];throw l}if(this.getDbType()==="sqlite"){let l=new Map;for(let d of n){let u=Number(d.id),c=l.get(u)||{name:void 0,columns:[],referencedTable:String(d.table),referencedColumns:[],onDelete:d.on_delete??null,onUpdate:d.on_update??null};c.columns.push(String(d.from)),c.referencedColumns.push(String(d.to)),l.set(u,c);}return Array.from(l.values())}let a=new Map;for(let l of n){let d=String(l.name||""),u=d||`${l.referenced_table}_${l.column_name}`,c=a.get(u)||{name:d||void 0,columns:[],referencedTable:String(l.referenced_table),referencedColumns:[],onDelete:l.on_delete??null,onUpdate:l.on_update??null};c.columns.push(String(l.column_name)),c.referencedColumns.push(String(l.referenced_column)),a.set(u,c);}return Array.from(a.values())}async getPrimaryKeyInfo(e){let o=new N({table:e,databaseCaseConvention:"preserve",modelCaseConvention:"preserve"},this.getDbType()).parse([new Pt(e)]).sql,n=[];try{n=await this.rawQuery(o);}catch(l){if(Ve(this.getDbType(),l))return;throw l}if(!n.length)return;let s=n.map(l=>String(l.column_name));return {name:n[0].name||void 0,columns:s}}async testConnectionQuery(e){await U(e,[],this,"raw",{shouldNotLog:true});}sanitizeModelKeys(e){let r=Object.getOwnPropertyNames(this),o=Object.getOwnPropertyNames(this.constructor),n=[...r,...o];if(Object.keys(e).some(s=>n.includes(s)))throw new f("SqlDataSource::sanitizeModelKeys","DUPLICATE_MODEL_KEYS_WHILE_INSTANTIATING_MODELS",new Error(`Duplicate model keys while instantiating models inside the connection: ${Object.keys(e).filter(s=>n.includes(s)).map(s=>`"${s}"`).join(", ")}`));return e}static get isInGlobalTransaction(){return !!this.instance?.globalTransaction}get isInGlobalTransaction(){return !!this.globalTransaction}get registeredModels(){return this.models}};ee.instance=null;var Ne=ee;var be=class{constructor(t){this.migrationTable="migrations";this.sql=t||Ne.getInstance();}async upMigrations(t){for(let e of t){b.info(`Running migration ${e.migrationName}`),await e.up();let r=e.schema.queryStatements;for(let o of r)o&&await this.sql.rawQuery(o);await this.addMigrationToMigrationTable(e),e.afterMigration&&await e.afterMigration(this.sql);}}async downMigrations(t){t=t.reverse();for(let e of t){b.info(`Rolling back migration ${e.migrationName}`),await e.down();let r=e.schema.queryStatements;for(let o of r)o&&await this.sql.rawQuery(o);await this.deleteMigrationFromMigrationTable(e),e.afterMigration&&await e.afterMigration(this.sql);}}async addMigrationToMigrationTable(t){let r=new Date().toISOString().replace("T"," ").replace(/\.\d{3}Z$/,"");await this.sql.query(this.migrationTable).insert({name:t.migrationName,timestamp:r});}async deleteMigrationFromMigrationTable(t){await this.sql.query(this.migrationTable).where("name",t.migrationName).delete();}};async function st(i,t,e,r,o){let n=i.getDbType(),s=null;b.info("Rolling back migrations for database type: "+n);try{let a=await yt(n,i.getPool()),l=await ft(n,e,r),d=a.map(m=>m.name),u=l.filter(m=>d.includes(m.migrationName));if(u.length===0){b.info("No pending migrations.");return}if(t){let m=u.findIndex(g=>g.migrationName===t);if(m===-1){b.error(`Rollback until migration not found: ${t}`);return}let p=u.slice(m);o&&(s=await i.startTransaction(),i=s.sql),await new be(i).downMigrations(p),o&&await s?.commit(),b.info("Migrations rolled back successfully");return}let c=new be(i);o&&(s=await i.startTransaction(),i=s.sql),await c.downMigrations(u),o&&await s?.commit();}catch(a){throw o&&await s?.rollback(),a}b.info("Migrations rolled back successfully");}var lr=class{static async generate(t){return `import { Migration } from "hysteria-orm";
|
|
184
184
|
|
|
185
185
|
export default class extends Migration {
|
|
186
186
|
async up() {
|